././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1708400265.944029 pytweening-1.2.0/0000777000000000000000000000000000000000000010576 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1537833311.0 pytweening-1.2.0/.gitignore0000666000000000000000000000016500000000000012570 0ustar00venv/ .tox/ *.pyc __pycache__/ instance/ .pytest_cache/ .coverage htmlcov/ dist/ build/ *.egg-info/././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1682459248.0 pytweening-1.2.0/AUTHORS.txt0000666000000000000000000000071700000000000012471 0ustar00Here is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS -- people who have submitted patches, reported bugs, added translations, helped answer newbie questions, and generally made PyTweening that much better: Al Sweigart (al@inventwithpython.com) Denilson Figueiredo de Sá https://github.com/denilsonsa Julien Schueller https://github.com/jschueller Marek Madejski https://github.com/TrangOul Stefanie Molin https://github.com/stefmolin ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1446076042.0 pytweening-1.2.0/CHANGES.txt0000666000000000000000000000037000000000000012407 0ustar00v1.0.3, 2015/10/28 -- Refactoring setup.py v1.0.2, 2015/09/09 -- Improved unit tests, some refactoring. Thanks Denilson! v1.0.1, 2014/08/30 -- Renamed getPointOnLine(), added documentation and comments. v1.0.0, 2014/08/04 -- Initial Pip release.././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1405639978.0 pytweening-1.2.0/LICENSE.txt0000666000000000000000000000275200000000000012427 0ustar00Copyright (c) 2014, Al Sweigart All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the {organization} nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1631640714.0 pytweening-1.2.0/MANIFEST.in0000666000000000000000000000033600000000000012336 0ustar00include *.md include LICENSE.txt recursive-include docs *.bat recursive-include docs *.py recursive-include docs *.rst recursive-include docs Makefile recursive-include pytweening *.py recursive-include tests *.py ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1708400265.944029 pytweening-1.2.0/PKG-INFO0000666000000000000000000002223200000000000011674 0ustar00Metadata-Version: 2.1 Name: pytweening Version: 1.2.0 Summary: A collection of tweening (aka easing) functions. Home-page: https://github.com/asweigart/pytweening Author: Al Sweigart Author-email: al@inventwithpython.com License: MIT Keywords: 2D animation tween tweening easing Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Win32 (MS Windows) Classifier: Environment :: X11 Applications Classifier: Environment :: MacOS X Classifier: Intended Audience :: Developers Classifier: Operating System :: OS Independent Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Description-Content-Type: text/markdown License-File: LICENSE.txt License-File: AUTHORS.txt PyTweening ========== A collection of tweening (aka easing) functions implemented in Python. You can learn more about it in this blog post: https://inventwithpython.com/blog/2024/02/20/make-lively-movement-animation-with-pytweenings-tweening-functions/ and in the Nordic Game Jam talk by Martin Jonasson and Petri Purho at https://youtu.be/Fy0aCDmgnxg?si=8pgITaxjJSKFyBuB&t=159 Example Usage ============= All tweening functions are passed an argument of a float from 0.0 (the beginning of the path) to 1.0 (the end of the path) of the tween: >>> pytweening.linear(0.5) 0.5 >>> pytweening.linear(0.75) 0.75 >>> pytweening.linear(1.0) 1.0 >>> pytweening.easeInQuad(0.5) 0.25 >>> pytweening.easeInQuad(0.75) 0.5625 >>> pytweening.easeInQuad(1.0) 1.0 >>> pytweening.easeInOutSine(0.75) 0.8535533905932737 >>> pytweening.easeInOutSine(1.0) 1.0 The getLine() function also provides a Bresenham line algorithm implementation: >>> pytweening.getLine(0, 0, 5, 10) [(0, 0), (0, 1), (1, 2), (1, 3), (2, 4), (2, 5), (3, 6), (3, 7), (4, 8), (4, 9), (5, 10)] The getLinePoint() function finds (interpolates) a point on the given line (even if it extends before or past the start or end points): >>> getLinePoint(0, 0, 5, 10, 0.0) (0.0, 0.0) >>> getLinePoint(0, 0, 5, 10, 0.25) (1.25, 2.5) >>> getLinePoint(0, 0, 5, 10, 0.5) (2.5, 5.0) >>> getLinePoint(0, 0, 5, 10, 0.75) (3.75, 7.5) >>> getLinePoint(0, 0, 5, 10, 1.0) (5.0, 10.0) PyTweening also provides iterators to get the XY coordinates in a for loop between two points (though some floating-point rounding errors naturally occur): >>> import pytweening >>> for x, y in pytweening.iterLinear(0, 0, 100, 150, 0.1): print(x, y) ... 0.0 0.0 10.0 15.0 20.0 30.0 30.000000000000004 45.00000000000001 40.0 60.0 50.0 75.0 60.0 90.0 70.0 105.0 80.0 119.99999999999999 89.99999999999999 135.0 100.0 150.0 >>> for x, y in pytweening.iterEaseOutQuad(0, 0, 100, 150, 0.1): print(x, y) ... 0.0 0.0 19.0 28.5 36.00000000000001 54.00000000000001 51.0 76.5 64.00000000000001 96.00000000000001 75.0 112.5 84.0 126.0 90.99999999999999 136.5 96.00000000000001 144.0 99.0 148.5 100.0 150.0 Tweens ====== pytweening.linear() ![pytweening.linear()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphLinear.png) pytweening.easeInQuad() ![pytweening.easeInQuad()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinquad.png) pytweening.easeOutQuad() ![pytweening.easeOutQuad()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutquad.png) pytweening.easeInOutQuad() ![pytweening.easeInOutQuad()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutquad.png) pytweening.easeInCubic() ![pytweening.easeInCubic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseincubic.png) pytweening.easeOutCubic() ![pytweening.easeOutCubic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutcubic.png) pytweening.easeInOutCubic() ![pytweening.easeInOutCubic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutcubic.png) pytweening.easeInQuart() ![pytweening.easeInQuart()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinquart.png) pytweening.easeOutQuart() ![pytweening.easeOutQuart()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutquart.png) pytweening.easeInOutQuart() ![pytweening.easeInOutQuart()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutquart.png) pytweening.easeInQuint() ![pytweening.easeInQuint()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinquint.png) pytweening.easeOutQuint() ![pytweening.easeOutQuint()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutquint.png) pytweening.easeInOutQuint() ![pytweening.easeInOutQuint()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutquint.png) pytweening.easeInSine() ![pytweening.easeInSine()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinsine.png) pytweening.easeOutSine() ![pytweening.easeOutSine()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutsine.png) pytweening.easeInOutSine() ![pytweening.easeInOutSine()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutsine.png) pytweening.easeInExpo() ![pytweening.easeInExpo()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinexpo.png) pytweening.easeOutExpo() ![pytweening.easeOutExpo()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutexpo.png) pytweening.easeInOutExpo() ![pytweening.easeInOutExpo()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutexpo.png) pytweening.easeInCirc() ![pytweening.easeInCirc()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseincirc.png) pytweening.easeOutCirc() ![pytweening.easeOutCirc()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutcirc.png) pytweening.easeInOutCirc() ![pytweening.easeInOutCirc()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutcirc.png) pytweening.easeInElastic() ![pytweening.easeInElastic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinelastic.png) pytweening.easeOutElastic() ![pytweening.easeOutElastic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutelastic.png) pytweening.easeInOutElastic() ![pytweening.easeInOutElastic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutelastic.png) pytweening.easeInBack() ![pytweening.easeInBack()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinback.png) pytweening.easeOutBack() ![pytweening.easeOutBack()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutback.png) pytweening.easeInOutBack() ![pytweening.easeInOutBack()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutback.png) pytweening.easeInBounce() ![pytweening.easeInBounce()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinbounce.png) pytweening.easeOutBounce() ![pytweening.easeOutBounce()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutbounce.png) pytweening.easeInOutBounce() ![pytweening.easeInOutBounce()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutbounce.png) pytweening.easeInPoly() (default degree of 2) ![pytweening.easeInPoly()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinpoly.png) pytweening.easeOutPoly() (default degree of 2) ![pytweening.easeOutPoly()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutpoly.png) pytweening.easeInOutPoly() (default degree of 2) ![pytweening.easeInOutPoly()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutpoly.png) Support ------- If you find this project helpful and would like to support its development, [consider donating to its creator on Patreon](https://www.patreon.com/AlSweigart). ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1708400180.0 pytweening-1.2.0/README.md0000666000000000000000000001745100000000000012065 0ustar00PyTweening ========== A collection of tweening (aka easing) functions implemented in Python. You can learn more about it in this blog post: https://inventwithpython.com/blog/2024/02/20/make-lively-movement-animation-with-pytweenings-tweening-functions/ and in the Nordic Game Jam talk by Martin Jonasson and Petri Purho at https://youtu.be/Fy0aCDmgnxg?si=8pgITaxjJSKFyBuB&t=159 Example Usage ============= All tweening functions are passed an argument of a float from 0.0 (the beginning of the path) to 1.0 (the end of the path) of the tween: >>> pytweening.linear(0.5) 0.5 >>> pytweening.linear(0.75) 0.75 >>> pytweening.linear(1.0) 1.0 >>> pytweening.easeInQuad(0.5) 0.25 >>> pytweening.easeInQuad(0.75) 0.5625 >>> pytweening.easeInQuad(1.0) 1.0 >>> pytweening.easeInOutSine(0.75) 0.8535533905932737 >>> pytweening.easeInOutSine(1.0) 1.0 The getLine() function also provides a Bresenham line algorithm implementation: >>> pytweening.getLine(0, 0, 5, 10) [(0, 0), (0, 1), (1, 2), (1, 3), (2, 4), (2, 5), (3, 6), (3, 7), (4, 8), (4, 9), (5, 10)] The getLinePoint() function finds (interpolates) a point on the given line (even if it extends before or past the start or end points): >>> getLinePoint(0, 0, 5, 10, 0.0) (0.0, 0.0) >>> getLinePoint(0, 0, 5, 10, 0.25) (1.25, 2.5) >>> getLinePoint(0, 0, 5, 10, 0.5) (2.5, 5.0) >>> getLinePoint(0, 0, 5, 10, 0.75) (3.75, 7.5) >>> getLinePoint(0, 0, 5, 10, 1.0) (5.0, 10.0) PyTweening also provides iterators to get the XY coordinates in a for loop between two points (though some floating-point rounding errors naturally occur): >>> import pytweening >>> for x, y in pytweening.iterLinear(0, 0, 100, 150, 0.1): print(x, y) ... 0.0 0.0 10.0 15.0 20.0 30.0 30.000000000000004 45.00000000000001 40.0 60.0 50.0 75.0 60.0 90.0 70.0 105.0 80.0 119.99999999999999 89.99999999999999 135.0 100.0 150.0 >>> for x, y in pytweening.iterEaseOutQuad(0, 0, 100, 150, 0.1): print(x, y) ... 0.0 0.0 19.0 28.5 36.00000000000001 54.00000000000001 51.0 76.5 64.00000000000001 96.00000000000001 75.0 112.5 84.0 126.0 90.99999999999999 136.5 96.00000000000001 144.0 99.0 148.5 100.0 150.0 Tweens ====== pytweening.linear() ![pytweening.linear()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphLinear.png) pytweening.easeInQuad() ![pytweening.easeInQuad()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinquad.png) pytweening.easeOutQuad() ![pytweening.easeOutQuad()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutquad.png) pytweening.easeInOutQuad() ![pytweening.easeInOutQuad()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutquad.png) pytweening.easeInCubic() ![pytweening.easeInCubic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseincubic.png) pytweening.easeOutCubic() ![pytweening.easeOutCubic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutcubic.png) pytweening.easeInOutCubic() ![pytweening.easeInOutCubic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutcubic.png) pytweening.easeInQuart() ![pytweening.easeInQuart()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinquart.png) pytweening.easeOutQuart() ![pytweening.easeOutQuart()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutquart.png) pytweening.easeInOutQuart() ![pytweening.easeInOutQuart()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutquart.png) pytweening.easeInQuint() ![pytweening.easeInQuint()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinquint.png) pytweening.easeOutQuint() ![pytweening.easeOutQuint()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutquint.png) pytweening.easeInOutQuint() ![pytweening.easeInOutQuint()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutquint.png) pytweening.easeInSine() ![pytweening.easeInSine()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinsine.png) pytweening.easeOutSine() ![pytweening.easeOutSine()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutsine.png) pytweening.easeInOutSine() ![pytweening.easeInOutSine()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutsine.png) pytweening.easeInExpo() ![pytweening.easeInExpo()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinexpo.png) pytweening.easeOutExpo() ![pytweening.easeOutExpo()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutexpo.png) pytweening.easeInOutExpo() ![pytweening.easeInOutExpo()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutexpo.png) pytweening.easeInCirc() ![pytweening.easeInCirc()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseincirc.png) pytweening.easeOutCirc() ![pytweening.easeOutCirc()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutcirc.png) pytweening.easeInOutCirc() ![pytweening.easeInOutCirc()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutcirc.png) pytweening.easeInElastic() ![pytweening.easeInElastic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinelastic.png) pytweening.easeOutElastic() ![pytweening.easeOutElastic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutelastic.png) pytweening.easeInOutElastic() ![pytweening.easeInOutElastic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutelastic.png) pytweening.easeInBack() ![pytweening.easeInBack()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinback.png) pytweening.easeOutBack() ![pytweening.easeOutBack()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutback.png) pytweening.easeInOutBack() ![pytweening.easeInOutBack()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutback.png) pytweening.easeInBounce() ![pytweening.easeInBounce()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinbounce.png) pytweening.easeOutBounce() ![pytweening.easeOutBounce()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutbounce.png) pytweening.easeInOutBounce() ![pytweening.easeInOutBounce()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutbounce.png) pytweening.easeInPoly() (default degree of 2) ![pytweening.easeInPoly()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinpoly.png) pytweening.easeOutPoly() (default degree of 2) ![pytweening.easeOutPoly()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutpoly.png) pytweening.easeInOutPoly() (default degree of 2) ![pytweening.easeInOutPoly()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutpoly.png) Support ------- If you find this project helpful and would like to support its development, [consider donating to its creator on Patreon](https://www.patreon.com/AlSweigart). ././@PaxHeader0000000000000000000000000000003200000000000010210 xustar0026 mtime=1708400265.86403 pytweening-1.2.0/docs/0000777000000000000000000000000000000000000011526 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1407141742.0 pytweening-1.2.0/docs/Makefile0000666000000000000000000001517200000000000013174 0ustar00# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/PyTweening.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/PyTweening.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/PyTweening" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/PyTweening" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1407141742.0 pytweening-1.2.0/docs/conf.py0000666000000000000000000002037300000000000013032 0ustar00#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # PyTweening documentation build configuration file, created by # sphinx-quickstart on Mon Aug 4 01:42:22 2014. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys import os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = 'PyTweening' copyright = '2014, Al Sweigart' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '1.0.0' # The full version, including alpha/beta/rc tags. release = '1.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all # documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. #html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'PyTweeningdoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'PyTweening.tex', 'PyTweening Documentation', 'Al Sweigart', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'pytweening', 'PyTweening Documentation', ['Al Sweigart'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'PyTweening', 'PyTweening Documentation', 'Al Sweigart', 'PyTweening', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1407141742.0 pytweening-1.2.0/docs/index.rst0000666000000000000000000000071100000000000013366 0ustar00.. PyTweening documentation master file, created by sphinx-quickstart on Mon Aug 4 01:42:22 2014. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to PyTweening's documentation! ====================================== Contents: .. toctree:: :maxdepth: 2 Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1407141742.0 pytweening-1.2.0/docs/make.bat0000777000000000000000000001506500000000000013145 0ustar00@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . set I18NSPHINXOPTS=%SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. xml to make Docutils-native XML files echo. pseudoxml to make pseudoxml-XML files for display purposes echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) %SPHINXBUILD% 2> nul if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\PyTweening.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\PyTweening.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdf" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf cd %BUILDDIR%/.. echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdfja" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf-ja cd %BUILDDIR%/.. echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) if "%1" == "xml" ( %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml if errorlevel 1 exit /b 1 echo. echo.Build finished. The XML files are in %BUILDDIR%/xml. goto end ) if "%1" == "pseudoxml" ( %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml if errorlevel 1 exit /b 1 echo. echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. goto end ) :end ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1708400265.8680315 pytweening-1.2.0/pytweening/0000777000000000000000000000000000000000000012767 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1708375561.0 pytweening-1.2.0/pytweening/__init__.py0000666000000000000000000010422300000000000015102 0ustar00from __future__ import division import math try: from typing import List, Tuple, Union except ImportError: pass # This is fine; it happens on Python 2.6 and before, but type hints aren't supported there anyway. __version__ = '1.2.0' # from http://www.roguebasin.com/index.php?title=Bresenham%27s_Line_Algorithm#Python def getLine(x1, y1, x2, y2): # type: (int, int, int, int) -> List[Tuple[int, int]] """Returns a list of (x, y) tuples of every point on a line between (x1, y1) and (x2, y2). The x and y values inside the tuple are integers. Line generated with the Bresenham algorithm. Args: x1 (int, float): The x coordinate of the line's start point. y1 (int, float): The y coordinate of the line's start point. x2 (int, float): The x coordinate of the line's end point. y2 (int, float): The y coordiante of the line's end point. Returns: [(x1, y1), (x2, y2), (x3, y3), ...] Example: >>> getLine(0, 0, 6, 6) [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)] >>> getLine(0, 0, 3, 6) [(0, 0), (0, 1), (1, 2), (1, 3), (2, 4), (2, 5), (3, 6)] >>> getLine(3, 3, -3, -3) [(3, 3), (2, 2), (1, 1), (0, 0), (-1, -1), (-2, -2), (-3, -3)] """ x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2) points = [] issteep = abs(y2 - y1) > abs(x2 - x1) if issteep: x1, y1 = y1, x1 x2, y2 = y2, x2 rev = False if x1 > x2: x1, x2 = x2, x1 y1, y2 = y2, y1 rev = True deltax = x2 - x1 deltay = abs(y2 - y1) error = int(deltax / 2) y = y1 ystep = None if y1 < y2: ystep = 1 else: ystep = -1 for x in range(x1, x2 + 1): if issteep: points.append((y, x)) else: points.append((x, y)) error -= deltay if error < 0: y += ystep error += deltax # Reverse the list if the coordinates were reversed if rev: points.reverse() return points def getPointOnLine( startX, startY, endX, endY, n ): # type: (Union[int, float], Union[int, float], Union[int, float], Union[int, float], Union[int, float]) -> Tuple[Union[int, float], Union[int, float]] """Returns the (x, y) tuple of the point that has progressed a proportion n along the line defined by the two x, y coordinates. Args: startX (int, float): The x coordinate of the line's start point. startY (int, float): The y coordinate of the line's start point. endX (int, float): The x coordinate of the line's end point. endY (int, float): The y coordinate of the line's end point. n (int, float): Progress along the line. 0.0 is the start point, 1.0 is the end point. 0.5 is the midpoint. This value can be less than 0.0 or greater than 1.0. Returns: Tuple of floats for the x, y coordinate of the point. Example: >>> getPointOnLine(0, 0, 6, 6, 0) (0, 0) >>> getPointOnLine(0, 0, 6, 6, 1) (6, 6) >>> getPointOnLine(0, 0, 6, 6, 0.5) (3.0, 3.0) >>> getPointOnLine(0, 0, 6, 6, 0.75) (4.5, 4.5) >>> getPointOnLine(3, 3, -3, -3, 0.5) (0.0, 0.0) >>> getPointOnLine(3, 3, -3, -3, 0.25) (1.5, 1.5) >>> getPointOnLine(3, 3, -3, -3, 0.75) (-1.5, -1.5) """ return (((endX - startX) * n) + startX, ((endY - startY) * n) + startY) def _iterTween(startX, startY, endX, endY, intervalSize, tweeningFunc, *args): ti = tweeningFunc(0.0, *args) yield (((endX - startX) * ti) + startX, ((endY - startY) * ti) + startY) n = intervalSize # The weird number is to prevent 0.999999 from being used in addition to 1.0 at the end of the function (i.e. rounding error prevention): while n + 1.1102230246251565e-16 < 1.0: ti = tweeningFunc(n, *args) yield (((endX - startX) * ti) + startX, ((endY - startY) * ti) + startY) n += intervalSize ti = tweeningFunc(1.0, *args) yield (((endX - startX) * ti) + startX, ((endY - startY) * ti) + startY) def linear(n): # type: (Union[int, float]) -> Union[int, float] """Constant speed tween function. Example: >>> linear(0.0) 0.0 >>> linear(0.2) 0.2 >>> linear(0.4) 0.4 >>> linear(0.6) 0.6 >>> linear(0.8) 0.8 >>> linear(1.0) 1.0 """ return n def iterLinear(startX, startY, endX, endY, intervalSize): """Returns an iterator of a linear tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, linear)) def easeInQuad(n): # type: (Union[int, float]) -> Union[int, float] """Start slow and accelerate (Quadratic function). Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ return n**2 def iterEaseInQuad(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInQuad tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInQuad)) def easeOutQuad(n): # type: (Union[int, float]) -> Union[int, float] """Starts fast and decelerates to stop. (Quadratic function.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ return -n * (n - 2) def iterEaseOutQuad(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeOutQuad tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeOutQuad)) def easeInOutQuad(n): # type: (Union[int, float]) -> Union[int, float] """Accelerates, reaches the midpoint, and then decelerates. (Quadratic function.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ if n < 0.5: return 2 * n**2 else: n = n * 2 - 1 return -0.5 * (n * (n - 2) - 1) def iterEaseInOutQuad(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInOutQuad tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInOutQuad)) def easeInCubic(n): # type: (Union[int, float]) -> Union[int, float] """Starts fast and decelerates. (Cubic function.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ return n**3 def iterEaseInCubic(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInCubic tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInCubic)) def easeOutCubic(n): # type: (Union[int, float]) -> Union[int, float] """Starts fast and decelerates to stop. (Cubic function.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ n -= 1 return n**3 + 1 def iterEaseOutCubic(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeOutCubic tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeOutCubic)) def easeInOutCubic(n): # type: (Union[int, float]) -> Union[int, float] """Accelerates, reaches the midpoint, and then decelerates. (Cubic function.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ n *= 2 if n < 1: return 0.5 * n**3 else: n -= 2 return 0.5 * (n**3 + 2) def iterEaseInOutCubic(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInOutCubic tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInOutCubic)) def easeInQuart(n): # type: (Union[int, float]) -> Union[int, float] """Starts fast and decelerates. (Quartic function.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ return n**4 def iterEaseInQuart(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInQuart tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInQuart)) def easeOutQuart(n): # type: (Union[int, float]) -> Union[int, float] """Starts fast and decelerates to stop. (Quartic function.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ n -= 1 return -(n**4 - 1) def iterEaseOutQuart(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeOutQuart tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeOutQuart)) def easeInOutQuart(n): # type: (Union[int, float]) -> Union[int, float] """Accelerates, reaches the midpoint, and then decelerates. (Quartic function.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ n *= 2 if n < 1: return 0.5 * n**4 else: n -= 2 return -0.5 * (n**4 - 2) def iterEaseInOutQuart(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInOutQuart tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInOutQuart)) def easeInQuint(n): # type: (Union[int, float]) -> Union[int, float] """Starts fast and decelerates. (Quintic function.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ return n**5 def iterEaseInQuint(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInQuint tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInQuint)) def easeOutQuint(n): # type: (Union[int, float]) -> Union[int, float] """Starts fast and decelerates to stop. (Quintic function.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ n -= 1 return n**5 + 1 def iterEaseOutQuint(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeOutQuint tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeOutQuint)) def easeInOutQuint(n): # type: (Union[int, float]) -> Union[int, float] """Accelerates, reaches the midpoint, and then decelerates. (Quintic function.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ n *= 2 if n < 1: return 0.5 * n**5 else: n -= 2 return 0.5 * (n**5 + 2) def iterEaseInOutQuint(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInOutQuint tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInOutQuint)) def easeInPoly(n, degree=2): # type: (Union[int, float], Union[int, float]) -> Union[int, float] """Starts fast and decelerates. (Polynomial function with custom degree.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. degree (int, float): The degree of the polynomial function. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ if not isinstance(degree, (int, float)) or degree < 0: raise ValueError('degree argument must be a positive number.') return n**degree def iterEaseInPoly(startX, startY, endX, endY, intervalSize, degree=2): """Returns an iterator of a easeInPoly tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInPoly, degree)) def easeOutPoly(n, degree=2): # type: (Union[int, float], Union[int, float]) -> Union[int, float] """Starts fast and decelerates to stop. (Polynomial function with custom degree.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. degree (int, float): The degree of the polynomial function. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ if not isinstance(degree, (int, float)) or degree < 0: raise ValueError('degree argument must be a positive number.') return 1 - abs((n - 1) ** degree) def iterEaseOutPoly(startX, startY, endX, endY, intervalSize, degree=2): """Returns an iterator of a easeOutPoly tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeOutPoly, degree)) def easeInOutPoly(n, degree=2): # type: (Union[int, float], Union[int, float]) -> Union[int, float] """Starts fast and decelerates to stop. (Polynomial function with custom degree.) Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. degree (int, float): The degree of the polynomial function. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ if not isinstance(degree, (int, float)) or degree < 0: raise ValueError('degree argument must be a positive number.') n *= 2 if n < 1: return 0.5 * n**degree else: n -= 2 return 1 - 0.5 * abs(n**degree) def iterEaseInOutPoly(startX, startY, endX, endY, intervalSize, degree=2): """Returns an iterator of a easeInOutPoly tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInOutPoly, degree)) def easeInSine(n): # type: (Union[int, float]) -> Union[int, float] """A sinusoidal tween function that begins slow and then accelerates. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ return -1 * math.cos(n * math.pi / 2) + 1 def iterEaseInSine(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInSine tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInSine)) def easeOutSine(n): # type: (Union[int, float]) -> Union[int, float] """A sinusoidal tween function that begins fast and then decelerates. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ return math.sin(n * math.pi / 2) def iterEaseOutSine(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeOutSine tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeOutSine)) def easeInOutSine(n): # type: (Union[int, float]) -> Union[int, float] """A sinusoidal tween function that accelerates, reaches the midpoint, and then decelerates. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ return -0.5 * (math.cos(math.pi * n) - 1) def iterEaseInOutSine(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInOutSine tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInOutSine)) def easeInExpo(n): # type: (Union[int, float]) -> Union[int, float] """An exponential tween function that begins slow and then accelerates. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ if n == 0: return 0 else: return 2 ** (10 * (n - 1)) def iterEaseInExpo(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInExpo tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInExpo)) def easeOutExpo(n): # type: (Union[int, float]) -> Union[int, float] """An exponential tween function that begins fast and then decelerates. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ if n == 1: return 1 else: return -(2 ** (-10 * n)) + 1 def iterEaseOutExpo(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeOutExpo tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeOutExpo)) def easeInOutExpo(n): # type: (Union[int, float]) -> Union[int, float] """An exponential tween function that accelerates, reaches the midpoint, and then decelerates. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ if n == 0: return 0 elif n == 1: return 1 else: n *= 2 if n < 1: return 0.5 * 2 ** (10 * (n - 1)) else: n -= 1 # 0.5 * (-() + 2) return 0.5 * (-1 * (2 ** (-10 * n)) + 2) def iterEaseInOutExpo(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInOutExpo tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInOutExpo)) def easeInCirc(n): # type: (Union[int, float]) -> Union[int, float] """A circular tween function that begins slow and then accelerates. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ return -1 * (math.sqrt(1 - n * n) - 1) def iterEaseInCirc(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInCirc tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInCirc)) def easeOutCirc(n): # type: (Union[int, float]) -> Union[int, float] """A circular tween function that begins fast and then decelerates. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ n -= 1 return math.sqrt(1 - (n * n)) def iterEaseOutCirc(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeOutCirc tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeOutCirc)) def easeInOutCirc(n): # type: (Union[int, float]) -> Union[int, float] """A circular tween function that accelerates, reaches the midpoint, and then decelerates. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ n *= 2 if n < 1: return -0.5 * (math.sqrt(1 - n**2) - 1) else: n -= 2 return 0.5 * (math.sqrt(1 - n**2) + 1) def iterEaseInOutCirc(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInOutCirc tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInOutCirc)) def easeInElastic( n, amplitude=1, period=0.3 ): # type: (Union[int, float], Union[int, float], Union[int, float]) -> Union[int, float] """An elastic tween function that begins with an increasing wobble and then snaps into the destination. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ return 1 - easeOutElastic(1 - n, amplitude=amplitude, period=period) def iterEaseInElastic(startX, startY, endX, endY, intervalSize, amplitude=1, period=0.3): """Returns an iterator of a easeInElastic tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInElastic, amplitude, period)) def easeOutElastic( n, amplitude=1, period=0.3 ): # type: (Union[int, float], Union[int, float], Union[int, float]) -> Union[int, float] """An elastic tween function that overshoots the destination and then "rubber bands" into the destination. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ if amplitude < 1: amplitude = 1 s = period / 4 else: s = period / (2 * math.pi) * math.asin(1 / amplitude) return amplitude * 2 ** (-10 * n) * math.sin((n - s) * (2 * math.pi / period)) + 1 def iterEaseOutElastic(startX, startY, endX, endY, intervalSize, amplitude=1, period=0.3): """Returns an iterator of a easeOutElastic tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeOutElastic, amplitude, period)) def easeInOutElastic( n, amplitude=1, period=0.5 ): # type: (Union[int, float], Union[int, float], Union[int, float]) -> Union[int, float] """An elastic tween function wobbles towards the midpoint. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ n *= 2 if n < 1: return easeInElastic(n, amplitude=amplitude, period=period) / 2 else: return easeOutElastic(n - 1, amplitude=amplitude, period=period) / 2 + 0.5 def iterEaseInOutElastic(startX, startY, endX, endY, intervalSize, amplitude=1, period=0.5): """Returns an iterator of a easeInOutElastic tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInOutElastic, amplitude, period)) def easeInBack(n, s=1.70158): # type: (Union[int, float], Union[int, float]) -> Union[int, float] """A tween function that backs up first at the start and then goes to the destination. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ return n * n * ((s + 1) * n - s) def iterEaseInBack(startX, startY, endX, endY, intervalSize, s=1.70158): """Returns an iterator of a easeInBack tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInBack, s)) def easeOutBack(n, s=1.70158): # type: (Union[int, float], Union[int, float]) -> Union[int, float] """A tween function that overshoots the destination a little and then backs into the destination. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ n -= 1 return n * n * ((s + 1) * n + s) + 1 def iterEaseOutBack(startX, startY, endX, endY, intervalSize, s=1.70158): """Returns an iterator of a easeOutBack tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeOutBack, s)) def easeInOutBack(n, s=1.70158): # type: (Union[int, float], Union[int, float]) -> Union[int, float] """A "back-in" tween function that overshoots both the start and destination. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ n *= 2 if n < 1: s *= 1.525 return 0.5 * (n * n * ((s + 1) * n - s)) else: n -= 2 s *= 1.525 return 0.5 * (n * n * ((s + 1) * n + s) + 2) def iterEaseInOutBack(startX, startY, endX, endY, intervalSize, s=1.70158): """Returns an iterator of a easeInOutBack tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInOutBack, s)) def easeInBounce(n): # type: (Union[int, float]) -> Union[int, float] """A bouncing tween function that begins bouncing and then jumps to the destination. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ return 1 - easeOutBounce(1 - n) def iterEaseInBounce(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInBounce tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInBounce)) def easeOutBounce(n): # type: (Union[int, float]) -> Union[int, float] """A bouncing tween function that hits the destination and then bounces to rest. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ if n < (1 / 2.75): return 7.5625 * n * n elif n < (2 / 2.75): n -= 1.5 / 2.75 return 7.5625 * n * n + 0.75 elif n < (2.5 / 2.75): n -= 2.25 / 2.75 return 7.5625 * n * n + 0.9375 else: n -= 2.65 / 2.75 return 7.5625 * n * n + 0.984375 def iterEaseOutBounce(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeOutBounce tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeOutBounce)) def easeInOutBounce(n): # type: (Union[int, float]) -> Union[int, float] """A bouncing tween function that bounces at the start and end. Args: n (int, float): The time progress, starting at 0.0 and ending at 1.0. Returns: (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine(). """ if n < 0.5: return easeInBounce(n * 2) * 0.5 else: return easeOutBounce(n * 2 - 1) * 0.5 + 0.5 def iterEaseInOutBounce(startX, startY, endX, endY, intervalSize): """Returns an iterator of a easeInOutBounce tween between the start and end points, incrementing the interpolation factor by intervalSize each time. Guaranteed to return the point for 0.0 first and 1.0 last no matter the intervalSize.""" return iter(_iterTween(startX, startY, endX, endY, intervalSize, easeInOutBounce)) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1708400265.9000363 pytweening-1.2.0/pytweening.egg-info/0000777000000000000000000000000000000000000014461 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1708400265.0 pytweening-1.2.0/pytweening.egg-info/PKG-INFO0000666000000000000000000002223200000000000015557 0ustar00Metadata-Version: 2.1 Name: pytweening Version: 1.2.0 Summary: A collection of tweening (aka easing) functions. Home-page: https://github.com/asweigart/pytweening Author: Al Sweigart Author-email: al@inventwithpython.com License: MIT Keywords: 2D animation tween tweening easing Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Win32 (MS Windows) Classifier: Environment :: X11 Applications Classifier: Environment :: MacOS X Classifier: Intended Audience :: Developers Classifier: Operating System :: OS Independent Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Description-Content-Type: text/markdown License-File: LICENSE.txt License-File: AUTHORS.txt PyTweening ========== A collection of tweening (aka easing) functions implemented in Python. You can learn more about it in this blog post: https://inventwithpython.com/blog/2024/02/20/make-lively-movement-animation-with-pytweenings-tweening-functions/ and in the Nordic Game Jam talk by Martin Jonasson and Petri Purho at https://youtu.be/Fy0aCDmgnxg?si=8pgITaxjJSKFyBuB&t=159 Example Usage ============= All tweening functions are passed an argument of a float from 0.0 (the beginning of the path) to 1.0 (the end of the path) of the tween: >>> pytweening.linear(0.5) 0.5 >>> pytweening.linear(0.75) 0.75 >>> pytweening.linear(1.0) 1.0 >>> pytweening.easeInQuad(0.5) 0.25 >>> pytweening.easeInQuad(0.75) 0.5625 >>> pytweening.easeInQuad(1.0) 1.0 >>> pytweening.easeInOutSine(0.75) 0.8535533905932737 >>> pytweening.easeInOutSine(1.0) 1.0 The getLine() function also provides a Bresenham line algorithm implementation: >>> pytweening.getLine(0, 0, 5, 10) [(0, 0), (0, 1), (1, 2), (1, 3), (2, 4), (2, 5), (3, 6), (3, 7), (4, 8), (4, 9), (5, 10)] The getLinePoint() function finds (interpolates) a point on the given line (even if it extends before or past the start or end points): >>> getLinePoint(0, 0, 5, 10, 0.0) (0.0, 0.0) >>> getLinePoint(0, 0, 5, 10, 0.25) (1.25, 2.5) >>> getLinePoint(0, 0, 5, 10, 0.5) (2.5, 5.0) >>> getLinePoint(0, 0, 5, 10, 0.75) (3.75, 7.5) >>> getLinePoint(0, 0, 5, 10, 1.0) (5.0, 10.0) PyTweening also provides iterators to get the XY coordinates in a for loop between two points (though some floating-point rounding errors naturally occur): >>> import pytweening >>> for x, y in pytweening.iterLinear(0, 0, 100, 150, 0.1): print(x, y) ... 0.0 0.0 10.0 15.0 20.0 30.0 30.000000000000004 45.00000000000001 40.0 60.0 50.0 75.0 60.0 90.0 70.0 105.0 80.0 119.99999999999999 89.99999999999999 135.0 100.0 150.0 >>> for x, y in pytweening.iterEaseOutQuad(0, 0, 100, 150, 0.1): print(x, y) ... 0.0 0.0 19.0 28.5 36.00000000000001 54.00000000000001 51.0 76.5 64.00000000000001 96.00000000000001 75.0 112.5 84.0 126.0 90.99999999999999 136.5 96.00000000000001 144.0 99.0 148.5 100.0 150.0 Tweens ====== pytweening.linear() ![pytweening.linear()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphLinear.png) pytweening.easeInQuad() ![pytweening.easeInQuad()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinquad.png) pytweening.easeOutQuad() ![pytweening.easeOutQuad()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutquad.png) pytweening.easeInOutQuad() ![pytweening.easeInOutQuad()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutquad.png) pytweening.easeInCubic() ![pytweening.easeInCubic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseincubic.png) pytweening.easeOutCubic() ![pytweening.easeOutCubic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutcubic.png) pytweening.easeInOutCubic() ![pytweening.easeInOutCubic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutcubic.png) pytweening.easeInQuart() ![pytweening.easeInQuart()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinquart.png) pytweening.easeOutQuart() ![pytweening.easeOutQuart()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutquart.png) pytweening.easeInOutQuart() ![pytweening.easeInOutQuart()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutquart.png) pytweening.easeInQuint() ![pytweening.easeInQuint()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinquint.png) pytweening.easeOutQuint() ![pytweening.easeOutQuint()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutquint.png) pytweening.easeInOutQuint() ![pytweening.easeInOutQuint()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutquint.png) pytweening.easeInSine() ![pytweening.easeInSine()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinsine.png) pytweening.easeOutSine() ![pytweening.easeOutSine()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutsine.png) pytweening.easeInOutSine() ![pytweening.easeInOutSine()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutsine.png) pytweening.easeInExpo() ![pytweening.easeInExpo()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinexpo.png) pytweening.easeOutExpo() ![pytweening.easeOutExpo()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutexpo.png) pytweening.easeInOutExpo() ![pytweening.easeInOutExpo()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutexpo.png) pytweening.easeInCirc() ![pytweening.easeInCirc()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseincirc.png) pytweening.easeOutCirc() ![pytweening.easeOutCirc()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutcirc.png) pytweening.easeInOutCirc() ![pytweening.easeInOutCirc()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutcirc.png) pytweening.easeInElastic() ![pytweening.easeInElastic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinelastic.png) pytweening.easeOutElastic() ![pytweening.easeOutElastic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutelastic.png) pytweening.easeInOutElastic() ![pytweening.easeInOutElastic()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutelastic.png) pytweening.easeInBack() ![pytweening.easeInBack()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinback.png) pytweening.easeOutBack() ![pytweening.easeOutBack()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutback.png) pytweening.easeInOutBack() ![pytweening.easeInOutBack()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutback.png) pytweening.easeInBounce() ![pytweening.easeInBounce()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinbounce.png) pytweening.easeOutBounce() ![pytweening.easeOutBounce()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutbounce.png) pytweening.easeInOutBounce() ![pytweening.easeInOutBounce()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutbounce.png) pytweening.easeInPoly() (default degree of 2) ![pytweening.easeInPoly()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinpoly.png) pytweening.easeOutPoly() (default degree of 2) ![pytweening.easeOutPoly()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseoutpoly.png) pytweening.easeInOutPoly() (default degree of 2) ![pytweening.easeInOutPoly()](https://raw.githubusercontent.com/asweigart/pytweening/master/docs/tweenGraphEaseinoutpoly.png) Support ------- If you find this project helpful and would like to support its development, [consider donating to its creator on Patreon](https://www.patreon.com/AlSweigart). ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1708400265.0 pytweening-1.2.0/pytweening.egg-info/SOURCES.txt0000666000000000000000000000061500000000000016347 0ustar00.gitignore AUTHORS.txt CHANGES.txt LICENSE.txt MANIFEST.in README.md setup.py docs/Makefile docs/conf.py docs/index.rst docs/make.bat pytweening/__init__.py pytweening.egg-info/PKG-INFO pytweening.egg-info/SOURCES.txt pytweening.egg-info/dependency_links.txt pytweening.egg-info/top_level.txt tests/basicTests.py tests/generateExcelGraphs.py tests/graphs.ipynb tests/graphs.xlsx tests/seeGraphs.py././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1708400265.0 pytweening-1.2.0/pytweening.egg-info/dependency_links.txt0000666000000000000000000000000100000000000020527 0ustar00 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1708400265.0 pytweening-1.2.0/pytweening.egg-info/top_level.txt0000666000000000000000000000001300000000000017205 0ustar00pytweening ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1708400265.9480305 pytweening-1.2.0/setup.cfg0000666000000000000000000000005200000000000012414 0ustar00[egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1708376673.0 pytweening-1.2.0/setup.py0000666000000000000000000000401000000000000012303 0ustar00import io import os import re from setuptools import setup, find_packages scriptFolder = os.path.dirname(os.path.realpath(__file__)) os.chdir(scriptFolder) # Find version info from module (without importing the module): with open("pytweening/__init__.py", "r") as fileObj: version = re.search( r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', fileObj.read(), re.MULTILINE ).group(1) # Use the README.md content for the long description: with io.open("README.md", encoding="utf-8") as fileObj: long_description = fileObj.read() setup( name="pytweening", version=version, url="https://github.com/asweigart/pytweening", author="Al Sweigart", author_email="al@inventwithpython.com", description=("""A collection of tweening (aka easing) functions."""), long_description=long_description, long_description_content_type="text/markdown", license="MIT", packages=['pytweening'], test_suite="tests", install_requires=[], keywords="2D animation tween tweening easing", classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Win32 (MS Windows)', 'Environment :: X11 Applications', 'Environment :: MacOS X', 'Intended Audience :: Developers', 'Operating System :: OS Independent', "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", ], ) ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1708400265.944029 pytweening-1.2.0/tests/0000777000000000000000000000000000000000000011740 5ustar00././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1708372140.0 pytweening-1.2.0/tests/basicTests.py0000666000000000000000000001634400000000000014426 0ustar00from __future__ import division, print_function import doctest import os import sys import unittest sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) import pytweening TWEENS = [ 'linear', 'easeInQuad', 'easeOutQuad', 'easeInOutQuad', 'easeInCubic', 'easeOutCubic', 'easeInOutCubic', 'easeInQuart', 'easeOutQuart', 'easeInOutQuart', 'easeInQuint', 'easeOutQuint', 'easeInOutQuint', 'easeInSine', 'easeOutSine', 'easeInOutSine', 'easeInExpo', 'easeOutExpo', 'easeInOutExpo', 'easeInCirc', 'easeOutCirc', 'easeInOutCirc', 'easeInElastic', 'easeOutElastic', 'easeInOutElastic', 'easeInBack', 'easeOutBack', 'easeInOutBack', 'easeInBounce', 'easeOutBounce', 'easeInOutBounce', 'easeInPoly', 'easeOutPoly', 'easeInOutPoly', ] # https://stackoverflow.com/q/6655724/ class CustomAssertions(object): def assertFuncValue(self, func, param, expected, funcname='function', extra_msg='', **kwargs): """Asserts that func(param) == expected. Optionally receives the function name, used in the error message """ value = func(param) if extra_msg: extra_msg = ' ' + extra_msg self.assertAlmostEqual( value, expected, msg='{0}({1}) should be {2}, but was {3}.'.format(funcname, param, expected, value, extra_msg), **kwargs) class LineTests(unittest.TestCase): def test_startAndEndCoordinates(self): points = [(79, 16), (-67, -44), (-95, -56), (98, 47), (72, -6), (97, -63), (-38, -39), (91, -31), (-35, 96), (-72, 64), (-42, 11), (-11, 8), (-8, -35), (4, -27), (-51, -46), (33, -95), (94, -96), (-94, -77), (6, 28), (-82, -48)] for startPoint in points: for endPoint in points: linePoints = pytweening.getLine(startPoint[0], startPoint[1], endPoint[0], endPoint[1]) self.assertEqual(startPoint, linePoints[0], 'Start point returned from getLine() is not the same as the original start point.') self.assertEqual(endPoint, linePoints[-1], 'End point returned from getLine() is not the same as the original end point.') x, y = pytweening.getPointOnLine(startPoint[0], startPoint[1], endPoint[0], endPoint[1], 0.0) self.assertEqual((int(x), int(y)), (linePoints[0][0], linePoints[0][1]), 'Start point of getPointOnLine() is not the same as the line\'s start point.') x, y = pytweening.getPointOnLine(startPoint[0], startPoint[1], endPoint[0], endPoint[1], 1.0) self.assertEqual((int(x), int(y)), (linePoints[-1][0], linePoints[-1][1]), 'End point of getPointOnLine() is not the same as the line\'s end point.') class TestAll(unittest.TestCase, CustomAssertions): def test_zero(self): delta = 2 ** -15 # i.e. VERY small for name in TWEENS: func = getattr(pytweening, name) if name in ['easeInElastic', 'easeInOutElastic']: delta = 2 ** -11 # around 0.0005 elif name in ['easeInBounce', 'easeInOutBounce']: delta = 2 ** -7 # around 0.0078 self.assertFuncValue(func, 0, 0, name, delta=delta) self.assertFuncValue(func, 0.0, 0, name, delta=delta) def test_one(self): delta = 2 ** -15 # i.e. VERY small for name in TWEENS: func = getattr(pytweening, name) if name in ['easeOutElastic', 'easeInOutElastic']: delta = 2 ** -11 # around 0.0005 elif name in ['easeOutBounce', 'easeInOutBounce']: delta = 2 ** -7 # around 0.0078 self.assertFuncValue(func, 1, 1, name, delta=delta) self.assertFuncValue(func, 1.0, 1, name, delta=delta) def test_halfway(self): # Check that all the easeInOut* functions are halfway when passed 0.5. delta = 2 ** -15 # i.e. VERY small for name in TWEENS: func = getattr(pytweening, name) if name.startswith('easeInOut'): self.assertFuncValue(func, 0.5, 0.5, name, delta=delta) def test_wrong_input(self): # We've removed the 0.0 to 1.0 range check. """ for name in TWEENS: func = getattr(pytweening, name) for input in [-1, -0.5, 1.5, 2]: kwargs = {} if sys.version_info.major >= 3 and sys.version_info.minor >= 3: # msg parameter was added in Python 3.3: # https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertRaises kwargs['msg'] = '{0}({1}) should raise ValueError'.format(name, input) with self.assertRaises(ValueError, **kwargs): func(input) """ def test_iterators(self): # Basic test that just calls the iterators and gets all their values in a list: list(pytweening.iterLinear(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInQuad(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseOutQuad(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInOutQuad(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInCubic(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseOutCubic(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInOutCubic(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInQuart(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseOutQuart(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInOutQuart(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInQuint(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseOutQuint(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInOutQuint(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInPoly(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseOutPoly(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInOutPoly(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInSine(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseOutSine(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInOutSine(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInExpo(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseOutExpo(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInOutExpo(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInCirc(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseOutCirc(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInOutCirc(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInElastic(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseOutElastic(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInOutElastic(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInBack(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseOutBack(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInOutBack(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInBounce(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseOutBounce(0, 0, 100, 100, 0.01)) list(pytweening.iterEaseInOutBounce(0, 0, 100, 100, 0.01)) if __name__ == '__main__': unittest.main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441823407.0 pytweening-1.2.0/tests/generateExcelGraphs.py0000666000000000000000000000623500000000000016240 0ustar00import openpyxl import os import sys sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) import pytweening MAKE_CHARTS = False # seems to be a bug in openpyxl, it produces corrupt spreadsheet files. wb = openpyxl.Workbook() wb.remove_sheet(wb.get_sheet_by_name('Sheet')) graphs = (('Quad', pytweening.easeInQuad, pytweening.easeOutQuad, pytweening.easeInOutQuad), ('Cubic', pytweening.easeInCubic, pytweening.easeOutCubic, pytweening.easeInOutCubic), ('Quart', pytweening.easeInQuart, pytweening.easeOutQuart, pytweening.easeInOutQuart), ('Quint', pytweening.easeInQuint, pytweening.easeOutQuint, pytweening.easeInOutQuint), ('Sine', pytweening.easeInSine, pytweening.easeOutSine, pytweening.easeInOutSine), ('Expo', pytweening.easeInExpo, pytweening.easeOutExpo, pytweening.easeInOutExpo), ('Circ', pytweening.easeInCirc, pytweening.easeOutCirc, pytweening.easeInOutCirc), ('Elastic', pytweening.easeInElastic, pytweening.easeOutElastic, pytweening.easeInOutElastic), ('Back', pytweening.easeInBack, pytweening.easeOutBack, pytweening.easeInOutBack), ('Bounce', pytweening.easeInBounce, pytweening.easeOutBounce, pytweening.easeInOutBounce), ) # Linear function has only a single function, not three. wb.create_sheet(title='Linear') sheet = wb.get_sheet_by_name('Linear') for i in range(1, 101): n = i / 100.0 sheet['A' + str(i)] = pytweening.linear(n) if MAKE_CHARTS: refObj = openpyxl.charts.Reference(sheet, (1, 1), (100, 1)) seriesObj = openpyxl.charts.Series(refObj, title='Linear') chartObj = openpyxl.charts.LineChart() chartObj.append(seriesObj) chartObj.drawing.top = 50 chartObj.drawing.left = 300 chartObj.drawing.width = 300 chartObj.drawing.height = 200 sheet.add_chart(chartObj) for graph in graphs: name, easeInFunc, easeOutFunc, easeInOutFunc = graph wb.create_sheet(title=name) sheet = wb.get_sheet_by_name(name) for i in range(1, 101): n = i / 100.0 sheet['A' + str(i)] = easeInFunc(n) sheet['B' + str(i)] = easeOutFunc(n) sheet['C' + str(i)] = easeInOutFunc(n) if MAKE_CHARTS: inRefObj = openpyxl.charts.Reference(sheet, (1, 1), (100, 1)) inSeriesObj = openpyxl.charts.Series(inRefObj, title=name + ' In') outRefObj = openpyxl.charts.Reference(sheet, (1, 2), (100, 2)) outSeriesObj = openpyxl.charts.Series(outRefObj, title=name + ' Out') intOutRefObj = openpyxl.charts.Reference(sheet, (1, 3), (100, 3)) inOutSeriesObj = openpyxl.charts.Series(intOutRefObj, title=name + ' InOut') chartObj = openpyxl.charts.LineChart() chartObj.append(inSeriesObj) chartObj.append(outSeriesObj) chartObj.append(inOutSeriesObj) chartObj.drawing.top = 50 chartObj.drawing.left = 300 chartObj.drawing.width = 300 chartObj.drawing.height = 200 sheet.add_chart(chartObj) wb.save('graphs.xlsx') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441823407.0 pytweening-1.2.0/tests/graphs.ipynb0000666000000000000000000224101000000000000014267 0ustar00{ "metadata": { "name": "", "signature": "sha256:05f2d9403f4cf6dc661cb42bc1ed2a3cbc03b7646fed6a107bff5047c73d40e3" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "##########\n", "# Optional:\n", "import os\n", "import sys\n", "sys.path.insert(0, os.path.abspath('..'))\n", "##########\n", "\n", "import re\n", "import pytweening\n", "\n", "\n", "def find_tweens_from_module(pytweening):\n", " return (\n", " name for name in dir(pytweening)\n", " if name == 'linear' or name.startswith('ease')\n", " )\n", "\n", "\n", "def organize_names(names):\n", " unique = []\n", " ease = {}\n", " regex = re.compile(r'^ease(InOut|In|Out)(.+)$')\n", " for fullname in names:\n", " match = regex.match(fullname)\n", " if match:\n", " direction = match.group(1)\n", " kind = match.group(2)\n", " item = ease.get(kind, {'In': None, 'Out': None, 'InOut': None})\n", " item[direction] = fullname\n", " ease[kind] = item\n", " else:\n", " unique.append(fullname)\n", " unique.sort()\n", "\n", " table = []\n", " table.append(unique)\n", " table.extend(\n", " [item['In'], item['Out'], item['InOut']]\n", " for kind,item in sorted(ease.items())\n", " )\n", " return table" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "%config InlineBackend.figure_format = 'svg'\n", "from numpy import linspace\n", "from matplotlib import pyplot\n", "\n", "table = organize_names(find_tweens_from_module(pytweening))\n", "rows = len(table)\n", "cols = max(len(row) for row in table)\n", "\n", "fig, ax = pyplot.subplots(rows, cols, sharex=True, sharey=True, figsize=(3 * cols, 3 * rows), dpi=96)\n", "fig.tight_layout(h_pad=0, w_pad=0)\n", "fig.subplots_adjust(hspace=0, wspace=0)\n", "ax[0,0].set_xticks(linspace(0, 1, 11))\n", "ax[0,0].set_xticklabels([])\n", "\n", "X = linspace(0, 1, 256)\n", "\n", "for i, row in enumerate(table):\n", " for j, col in enumerate(row):\n", " if col:\n", " func = getattr(pytweening, col)\n", " Y = [func(x) for x in X]\n", " pyplot.text(x=0.5, y=0.9, s=col, horizontalalignment='center', transform=ax[i,j].transAxes)\n", " ax[i,j].axhline(y=0, color='silver')\n", " ax[i,j].axhline(y=1, color='silver')\n", " ax[i,j].plot(X, Y)\n", " for j in range(len(row), cols):\n", " ax[i,j].set_visible(False)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "svg": [ "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text": [ "" ] } ], "prompt_number": 2 } ], "metadata": {} } ] }././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1441823490.0 pytweening-1.2.0/tests/graphs.xlsx0000666000000000000000000034775200000000000014166 0ustar00PK!)r[Content_Types].xml (̘Mn0z¢iRXimXql HdNnTƴ-r0='czo1=ɘCd@s2f093s|p9>${N N u,ġWQ,\VK1PjOæDa!жqӹ X 2 /PK!U0#L _rels/.rels (N0 HCnHLH!T$$@Jc?[iTb/Nú(A3b{jxVb"giaWl_xb#b4O r0Qahѓeܔ=P-<4Mox/}bN@;vCf ۨBI"c&\O8q"KH<ߊs@.h<⧄MdaT_PK!͉4xl/_rels/workbook.xml.rels (j0EyZ3ٔB%a?Ė uH,6'{>6zG)8E.FT ^k`@ n-7%]7l jcGBt^cu,{vƎ"=ϏB&ɒeF0z,&'u(̅ !Q׈ƆrUa0-i2cK 2 fh {v{N~"~d\0+.aV.18I]^n0`O!78,,fqYvp@-M\84s&0]PK!>wxl/workbook.xmlO c?RRUj9f`o1COxǼ7x{I3M(!9?>(qkѐp~ݶ5l̅v-7I*L O c+p%T&ERqMacGɛ XPcm!<^_y}_%;҃KƌF*<]O'&7K0IKNS"Gߊ9cNIB^ź\OR ":e՜am8:Iˌ2LggtX$5a%:"5pBDc)H" } lH#fgG4>.fR0Njc1 -e.Ǻp(jw&u痨ALyl1}30$\S% i?oPK!ʊZFxl/worksheets/sheet4.xml\]o}_`dJ3; ,>kl%1ƶfra"ܰ@It\>],֩/|~x~{<||{s|?=<|xwrxy8<^o<ӿۇooo_ ,}z{z|>M |:?.xxX~Nγ{><& ?bǗK2r>>.=_ݟ_aǧ˟ۛ|y9>)l/X~?N/%{w>}xxDߜ?UߋyaުDz: oǧ}3>ߖuLJWĀ;sKo|]=i!zß? 3+*>O#w';oj zV!2wEOɯyj'εwrJxa͐H;[4Z8C}y$vōݭN5q+t?LW/tdlBXs6.!A(]|ܞ,5ơfhvf(0LH0F/L8$Aе9&e0rƓCr҈8_8+[Gˮo躼zFEkDR%Npb rlpؠG3_j&^ tnBWvv1MSt tݐc~|]M@$mg>$ct@xIh'f(v!3^bDe͚emt8g(jgE ;‰#ptfdl3A Y@ږp =O+k|EyDD9ycЬVLTŵNk_1MyDD5y- `,S& Fu̮[b+'r1"i(:or-0HԴÆDm X[ ;<"k"E)|׵=GffdI{.c6u`|#&IYŲD]QJ,YzQTہ1"o">,be8w/]~n~fшV,HH$&5+٬\Ifl0J:Ub#;3Y&G $hu"xJ<3tţ#bJ q?@$R4IBU,WLTM/ȵ+Ŧ1Wmwl9tD$I/ Ik+94F1@6򮊃I4%bR.pddUH6dUzmyyDdf+$tkϋ[FK&uhm\Y G^dSW 6'C۽?X2m@aZwR,GTmWM6S*Tpbɤ.vV3Vs rJH;*S} 狼ŒIirlkqA4m#n5٤A\` A7Fd (cP)\ɵPF WB9R&Ո)I뜷PPv v) 7ܤ<䀢c)ꬠ<5nHܳ{E2F T`ʶ1)E"ED_!da\Aqa+70"h* DeXMϔGh*/ųMf IKxDT+LPњD y)ر_%B;k J$&l +fF8A+)QSϫ8& 4Q ˖"p%;+@jAff8 nJLΣsƎ+H1mƲaij\Y"%& @?^& h+y%=!s+[a0Ok&($ #J*ᱷCY%H",^!A@e FN'UkG1(]xx&`D'\C,[Q: m(ֹ%)]#{pzt nDt/q#nw +ǘIA!fD.>^SoF1Iyq/ gѣۮfFC'K\&viOx3ZGhZG\Y Wdߏs)?*G¢Qtzcy )mPA^T9*H'L8,eHU$b@Q)%.紖T9R t,vbn V,.bT*G 5dٻĦC˙8Cz=#RpLHRĊYc+@-Y53;-e@^ƻ~Dtu9avK+;qc $GʓZ7*8@%eֿ,Z}O{|P )⊃ZyR+ZFq ׂP!>k#,BzBZyR+L0 ]nyKR/Oj1c㕀gܿvFuG GiKY.^Lx׉Cp_,b v}6pk<^lt2 /]^~yR+1jU6W ia.aFd ,RS `Qwj ,?ˆlFDo?ևl Da[X y_t\/w {)!-þXax yWvk+H>i)l c)zwDɍict,+H>{Ntb|=@@rqUa㢻\~5z:Ņb)yZ#bH/˱Kn.b¿l18e{:" .tU6jvaDNtCCv]7{sɥFfAC)sdPu*/PK!<+#xl/worksheets/_rels/sheet1.xml.rels 0nz^D*dmoo.mgf?Q)R oi4'tGHL z4bOE8ЧvJiB>˗ SS;Rبɀ)NVC<D3v0t6K?,2cGIRȠJ}U_PK!Kw`xl/drawings/drawing11.xmlSMO0 !jZ`4RTN)'Miw.l8Y()k^\I#l̡//*Μhltc7wX WӱSeN R4-jtC!HZYיPB)~giP3wro,.PV/c{! --F{jኅ|EbP*2zn5ڢ70pY^_ѵaGВih1LJx<>#S]K ~7zV,5Hxsd7Զpګ%rL,X(R{EuZ0 /g+%w^ UK㗥G959ΰ.:}7.fT ZoGk[mPK!\ PGxl/charts/chart11.xml\ےܶ}OUa3WqI -K.iRc%!oD3 W|}HX^8l\O_p|.>v8<_UEa==_38aC|?y?}ZwC/t~LJwbxv8.7#.UY6S#h`mAxp{]}Q]7Bitc_R_|vWuFxqxUv~7L뫇0<p}CA,8CM;~vCb ?zSp䎷fxPRW>m?u^~U]e??vW''6z@M]<0^q {/0R·⺱)}|c`A߈,UQnmBXO:SMBFeUezQH+r6#dPUͩYڢbGՒؑ3+t$ EYSTubO2) /˜ƫUՄSy Q)$Zy0 UP.!1T)lZY]P:&; J.BisYVA&WFSYsRhdT@6h|~s)BvaQN\gʍ+ *ErNp"0.n$]§DWU y ЅQ}*oB _7/h u@DYTU]Y)hWbˈ2 1eKe%(@'D@Ī$u"e9[Q&,T:=y6 w8tudZZ0 r:Q@tG@5Χ!(mфd$[zȴ42Dj`7msp$tzc8`Ì68 3~&%Xsf|zn|1j2~<"@)Ґ+[gECƯd̆_iǫJN6J!W*Gr7.-l  4E˻)LO̦&*Du p@B\qMC[ԆAչ:aP#]ah^9* ! IJD^CPmMN+-@,4PY1iy9-e6 obk -/2(@$\! H(QY͕Z2%y-O=bd@KVo~!՛RQޢPc#cA xtH,Y:+HY1X-=$%#ŒխЏŒt6d~N3!XQ/ޕi(OLhudGw5rxYULL%7Mvcq*Zu׍ԑ}i JJ1ccYz(HɅmJO Μi? =#>B>eJxdLr”L)~Li[8DEktE8bRXo D).D k ^yFad! Ax,*2.Zì7t) j 6"'sF2̲) _2&>2&h9ȴe5&f*@2u0UL,o-et@!O-iI"fBGҷI!fHy׿KaiQum3"kThɂnveȠuJ6X4%2q/JY]ˢO՛'Uq~M˽Ec8Qw:ӉNЈ[~(yTZf5ْʬ,CږS;&n#A&%Skq:>r101be( `YLG,tHeaM&К.QT D2[l]D54}B8,CAq%_4!5Z~ggk*qQ!S"xc.Qo>$1A=> _,9CWl[(8t%Cz\aDrdb]Fz-$#Eb nkB;6bܧOf!wZs,ѳiZw^F2dR^o I$n񚜴 ꚓ"#A[!Co]Nrt,<*Ѥ 00O5J` ܵtFɬ!8pt#AkHO)F7NbIL2-Uq1hP,M)1 ZJHIee\r͝؂XE0Y Ox *逑 [x=ѐUƧ)'DLfyl]o209QW& sitb(^:Dܳ<ha9Qq- _r2T98=\΂e(75p,|&⋓N+Dw  G 'ARv!W\&sfwN7]̶Ο-__tvmkJzǛ]v&6罩_f+1?k$n|=4sZw -1)1j=|}Zen w~c$n wq,@X>~%X_b{na(q(_`Eyw{;qnw=OO*8 ?; s2 Ķì'{ƃp^PK!t]jFxl/worksheets/sheet3.xml[oG ݣ!+<e D-ɿ3쮮q%TxT:SS]__Ƽ߶õӇwpܼ>lwl/_v_">\>?o_6a}'noK/78u~-1vOvl_)~9ہK_^S뫗?z7qݿ+ا_8 M2xo W0j}pzVx}sw{_՜/??|}ϗ~u_妄}a=5k ^Ӈ}#>5Alf]9nn/W C~~~pEݡ;w{>+WI9 яc,/|7uR6&^t2JK[%B_]Re|g˥Uoΰ>Wrvzdd8)ZI櫠wa76'n0_rcb ['4XW4b|]+xUpdJJ5jJΒݤmp8bUîluPBMhDGTn<U"BR®qFKʒ$C }[7gKo°c- [X8dUn7k2|vp(#,AOՀXZ[J0R^ϖ$}dIPc`imp09|lv嘀!-^Uj=S$o[3Hɖr VTWpˮ-pN%,itN#f),tSrB/rLt*dD.YaJh2!cusvfP/E).;WM$N%< xАNoLȋJ.}rA/h9㹺 T 1JrC6,:Vpr1}hYlt*}]Zh*,dbhG_.<r&'VLwS~4~5Tg~otʝ -dT9&J{7ZlRN3*KmX6u!8'wcL=8t0UFr ~֩Q&cb$JC]=ѰMۙjj[Ce ZD"}u95"3&0`M X5/d[e8G)^5C* u{6GkknrފAI8*ꢇk1 P5/kXύ):njVO*˺kϽTk9KQV6:LpHj6C5P5CF 3+Kac^z6dBDbym {@y_5j`f0͢y2]8=3C4g8Ka8I[jE /i< L'H!֭"93L>a*A?pt$Z-DV Tf.a"k]N'69ك(b6>a*Lr̂{vmv: [Xre\I #mR>aN}r+j= Lv^3<s;09&vT4r/1^YÄ:(r ;vRIP UY &bA( Λ ЙDBq6jS攸U°n[dH[=:߇M N{&.[td) Y$} @ЇM mj^o_/ BU. Nu ͺ{8g^Jv. E T. F,P%]]l#j6Tvm G8GAmZvk.." ؄mW*(@c,m*3:иX!VJ.wb 1I}Pa%L#rvI%(%\Q>9Uu=L8uIFF+JKv0"Iy6~AN.. Al #EKB&/7:.eeP6PնPX%%mX!18b] =(sDy5 W" R،u\IP𼠒3$WEֲ*٥Ai{njV]"v?]O$ E0bP>)%ap|SEzPm\^_ $sbڂ%Wve Tڈ -#`6EQ.vۃ/Oċm,ܒ0SJNLP"bnd䈵|y— (5}sUXG\.E ޗ<0}3YJ-1oR76{qR8.#WJfy"$0bP ֶ.1:1G0 % /3Ī| SYMHΦVEb b-wK&O1alυIHќw-'Stv}a^= )"SEX0䜥nP"!*S_!Y 8bɧ0Ë!vS)MAn1|j=$ g$Z%!RY0hm7l]|AZ "aJ>\̺DDkN9b| ƬvIx&8ύ{qJ)LwAѪ]åH\8%򔵢Ixi !] C,E’GO4*BحfRD 038bmK %[n"ß5mkWnj^*@EεcU[=1\Z 1(/Nn"'X+>~8Nqw<^No?[H?;K/Θ'|75PK!rC Dxl/worksheets/sheet2.xml\]o#7|?CrH^xIJ%,z.bw{~m?lw/VWW˧տw~uu8_Oͧ?nfs/Oy}vyGuY?zy}Y7=>n7?}޼ci}$G{H__=Rۧs_^v'),?oQHty:\Sۇ-]Iu3_]ݞvP|uniOb6Oӥ_[Gangy^z<}:λl_)Tg+_7/_4j:C2Ըyឦt:3q}\w߮hFF_ŻEW۝w7"}4ЅЗB#rJ 1Z74L|XH݅%uLS$gžt/"v Mt8QF|ܡ2SDk`"F )?L؞ -C-G:7f="m5gZKwJ(qu:/ktM,Ey#j*q(tHQIjmKp iZ%xdjTq*ef@7RGt#:*qHuc5*Z8|XQ;}=lЧ%544TTMfĦ3,[DNSq ^Aڵ:0 Bj~p4,^( Pl4Sx;U2|bcCϞ(=4ɻ8LTE-ΤؚsySbD(QvN#Q@ZaHjE-椢UclOC0ՂpNalPX/dI* U/[]I+黠s )Bk rDmJnB#þW,[IE_+e>%^Gh}!e:re5O|C&p_Lze.+9#e>\lN J]\Vܨrs 2S!ArPuЍlBhuZ-XuAW9ŤELos-5DJ;3 |1GZ-4D#vJ0/ۑ$ Cȣqh#c`!]+vcw}=$ڂIE!QPwƑ|,[gAu -f1^tT;9$# ӎ9LٓLKjsIG잲=ºşDbKG ZFG t "3(RD}_qI#U[̆Q2׭ncŧ%e u[< @kqELf@t%x@;l99G4.ŚnhvEVWLqjHth`͖qXA-&y #@ZɁY HŢt=BWI\^+% e]bP]Gz'9屑V A9j1!B-詋g88puoJłSĜ]ܴ/ uE5J-ne[9RAtz),f -xN3d` 0IhܕD-eOrRc{.H7/Ot[\ͰY6eEg`8 c偡m12Gg(Nydq$G.4ObMNƾ.Q t .vS+:u@?C,ܕJ:-N5998U%ڔ"UD;OÜlA-N5-0 "Z@gJ`7l9F{4et+,rD2~S.xȖcȚ 9ep@dV-DJ͈w漢2Ӷ7'ͧ\Q ݘ,YTMz VarDW>^ "pR8t, MsUӘ3k-Ǿei"N?byL3iPYA@-ظµbaPpeczrp0酺[|NRZb\se`w"3 }"֖y,,c]HŞ YHicPRjHBI Gr6`.敁`N.}4t[ɱՁgb`;XEl$;]\<DN3θ@ eC]4 T f\!p, ܣ/&Mԝe|gYxXD20hUgsKBPlC}aX=t}8K7Y"@]N,%->g\ʥ 1s`|L3z&B #P=Q1X|(Rg+[XLHGᠮt Pjo1'u7 "Z#n0Zɳ9S2-%]Zn:<:B-e-˕q]BꚜsD5bUk+#xO3  T~LGT,CP*&@ FZ*Sy^_ٔ! #@Og璺-N؀hCPgSQ:U*ppTN<~}@떂p&oDBQ8 fIl`uϩJJ`XSF| 5JEJ1=˗ SS;Rبɀ)NVC<D3v0t6K?,2cGI93R_PK!fw,$xl/worksheets/_rels/sheet11.xml.rels 0nz^D*dmoo.mgf?Q)R oi4'tGHL z4bOE8ЧvJiB>˗ SS;Rبɀ)NVC<D3v0t6K?,2cGI93R_PK!܌%#xl/drawings/_rels/drawing8.xml.rels 0nR=H^DU,$dط7ЋӰ;7;=Eg5eq`; ApD,i\n7ōFHI)6=Myi]01tʣy`GeGPj4كg].<'G2=:\6H.ӳBʕPK!x %#xl/drawings/_rels/drawing9.xml.rels 0DnzЫ, IFѿ7EA4fj$zrw .j 'HÓzN4aG<"SkS {،4#KeqƔ8uQlTd@m!] 9?5t6K?"1 8P {o,R_PK!FJ&$xl/drawings/_rels/drawing10.xml.rels 0nzЫXIFooӰ;7;E'r k\;^í 8mqr4,PMq c:a,Ų!FR@3tlr:fi hؓgAO_LQB ŧlu3l̀!& ) g2} ,W PK!ao&$xl/drawings/_rels/drawing11.xml.rels 0nzЫXIFooӰ;7;E'r k\;^í 8mqr4,PMq c:a,Ų!FR@3tlr:fi hؓgAO_LQB ŧlu3l̀!& ) 2} ,W PK!^o%#xl/drawings/_rels/drawing7.xml.rels 0DnzPЫ, IFѿ7EA4fj$zrw .j'HÓzN4aG<"SkS {،4#KeqƔ8uQlTd@m!] 9?5t6K?"1 8P {o,R_PK!ys%#xl/drawings/_rels/drawing6.xml.rels 0nR=H^D*tmQEA4NYQ<),@\V758zGfbzU^iĔLqO)bӄ,} Sc;vvEW).xi 9l߶\l1e Ǝ) /YPT_PK!Q%#xl/drawings/_rels/drawing5.xml.rels 0Dn H^DUt$d xv}S5ywlP9; q ]wI M\T'0#m`)5)RlF8ccT@sŁԺ(*~2bۮq~:xsɥʌSb(ild~T]r PK!D߼%#xl/drawings/_rels/drawing1.xml.rels 0nzЫXIFooӰ;7;E'r k\;^í 8mqr4,PMq c:a,Ų!FR@3tlr:fi hؓgAO_LQB ŧlu3l̀!& ) ,P_7PK!&ꇻ%#xl/drawings/_rels/drawing2.xml.rels 0n "MzWXIFѷ7EA4Nь)8XØR+vY@.; qSڣmZñpZA_mSdxdvM9n SgCiДџ G֕}lIC9`~_zgk[tM=9A~^S-vǶ+Ws|okv;̠ A?"(VM#O`f>|[P[ vqmղk<0O_jY泹Y74p^wE+r 'c+Iٕ8WrݕԹ뮌pegW6_~e?)1>ܺIr7h~}ЂpU\w<;<i*P)fcb0,ar,` -.ځ3Q1L#eT%TXl,(]& 2RFȔx)/d,2eLŦƔ2B)̦VL Ŧ2)BȤXlJ !`(ڢ0e0/."&ʤ `)DL(Ŧ1vL( %RBPlJ( `)DL(Ŧ1y2"WFfL ٔ%LI!fR,6%Iؔb&bBRb&2B̤XlJ 1`))L Ŧ0)l"$L E0)B¤XlJ `))$L Ŗ\L+#I/ڊ3$.$xRhrudr%s%dSFKL(e2,6%ؔR&#bSvzdXlKnM[S&ԅ*()S`MyEIMI!cR<ٔ͘LI!cR,6%Iؔ2&bSRe~ MI!cR,6%Iش¤2%I̦3)lh9`))L Ŧ3)BΤXlJ 9`))L Ŧ3)BΤXl~cR] BxM1).BI`R,))L ŦP0)BXlJ `))L ŦP0)BXl<ң;]Hpʝvv{ >+xghOv|sEX\mwt>u/X PK!@=Gxl/charts/chart10.xmlms_}+o9 fRJTŽ[.GԞaJJM#ot߽?WisؿVM{}5ׇ_~^_Ϋj{O?O߿f}:=ٟ֯?wi:5iՙO/<|vr'[mI޿߬oݴ?UN6ϧlqukr?_L <^G<IƩ!U$50W$uV8&)J6C\&IfhG6iH$e'$exUߥ-T VC}|ƃj=3Qi2 iM0WW"icuGH5 Ce&bz3E$/2B{s}TIU,j3 Q%B-âG4&*7c?Cv㶶.chR97?.dh4:i{2Jƨ}ȌiDZ(|YdQ2z8;Q.dlk (Q5pu%ilP٭(i5/D(1tk{Je؆ j%ѭvhj(`+a3JlQ2h:e3JtFkq>"JT :5=j(efTVJuFk %ETg9Jj3J'נ&f f(ip,4*E }ƈ3c׺\;EY/0b%I'/0bZb6**ȾȠ]g9[:F#3-c *ɮS/0rTל]-Ce!c6.Uh #[ UQb8 Ԯ*QQnSj5 %>M5Y+5s%Ɍ!b%Cdyj2JfmkUP2dh "s*UQBFHVj3JHB ck0f@ct1@ԂP½Y}&ޛN88j;~qcu != #9(SC7##I81 b$ϘA6!#͜Ad)5l -0T|h+Lǵv͊wUPLOB2O2c瘤ܬkHf$QLDېnh$dd:&8[ &gIUQ\[2LQII@@nʉH2v;m4<ep ?3AYp}wvTXhR HXc@i<'2 zZqgeCOa<,`F%\AtS! ~C285I )nnoŨ]-8?(e-t+ VZfQdA{O#;[PZ;pw/#/mA80=-(bLhȠf3=OUL-߷?9 =;JOnp(zYkp9Qx"p mq҈1P1 x,.=@!pxN6ma#ǂڶ OmLu<2BF 9*QȘF3hJ9íC:jb~XE,5, H`tpk1JĘ!cY TS'F- ;ި|Jɪ^AD& ?^q# -?cB0u\dpr@;K6pǥAdhn+\O׶HԲ̂p֓,0T(I3o6l1 xFeBh:cCjlKy[`gtB2kQՙmx$_ZaZdNO6M&5@\[&j! t BT/0ҋ-ӯe&;$,131`k'Nw 2y9@q< G_P"Z2 Ɍ DTnf`љ֔WF (OqͬS8Ddp/-qәie4!i&mX 9<"&udj?:sxGFG'f%rgˤ)#!p"2aE2,-%~tхE] ώW,Q/rA-Ko i1Rq8bucɈh( LFRQmdsVVYERErmHyuz(;/Nj,%NP;T (R8VыW[:q.v6* %2f[l-EuXC-EZ)%Vm&euyc*e煙[h鈸LcS803޲A)l g{, }G.s8~K?hLH.E,RdT> l wcHJmIu?IT?3YfON(-,ӏ^$wqQlf!چ~zڕG/bbcZ}{"C'/09|j'B{De6GEߠt7GI x Z7E@^JG,䕚VR!Jʑm|tjB]T'tKI͒`|oD֊ 7QCuTV<]P+ӌ$EZMfN>@Iʁ3F+!,7T!?٥Ze==t&\*,YGCNA1U5b[4ֺg2xgh7 5dR38lnV\H#-Ujt$j  jLf$L}4vPeN[KA8R%2-XKB/]Zf&qh|mzYIֶp,g.2"#}XC( p H6q?U+5z.+Q,HT"_I~tSDZv ґ#RQ 3yiiLgJ+gH/NeG:`"YLd(FtBSйyԷ$9gH-)p,Df8*_e3JПOĕ1aR恼9D8@TKiX.-_dx+ %m#2d #(-fPR3tgzՔYNdMZ]5sɉ/ROOK”(a)rU(s$?V/9.,s#DYW$r+ c$VoiܔV0]MDO/f,x>mן-~- Ӈ/OO?Ecf_W~]| AwOqߴ0Ea;o(6 7ӿwP{酱DKco,(_S^|_<^!2"k[ |_pէ?( w>ڬI!mo320?o?}:t7 ^%ym/xO>llw1t| 8N?h|#n:0xwOpϫ yOWeʿ1WpfsC?k~b砶/&ͯyPK!R5WS!Hxl/charts/chart9.xmlmƑ_}V.3`,dN]"'/Ņ$ɕk=Vh`&էaX/ݢz_:f^\xna?y\+n=ܭ^\8no=[~nX~37nǛ\naު߽{^ VO8b?lG4p~<\dsr>-7/[pܾ>7}3}=m׻5ήXݽ[m<χHSǧǛŽ]o/rY ~a>2z?^\\PE_aww֐ۦ֟f];liCq -7Gr"\"5_|:~Z77f83=7 7/dvx- cG5 NO&y.ÒH?_ԞOB\B Q"coSaU `1R]iU*BB"I4945-*@fM+ J()G*ɶg,׷AcSĥ>lAH WQ2 L𚜪k,aIנbhm"((W0Z`;9n9J6dtS]H"Y\U_B|@^b#ʀN1jo\ ;9>J݂t1Qf;G8 gSU)g!EB]dEVjN̬Ԑd,Q ̵%E(KF9r Ef>G!1c/ҔQD CORIx=nh$ qA$/H-VRG (8c~:2P(H*1Q>de$ӓ p85 `˨Ց!`cj,}JESUQ.2%iKte *2!(Ʉ&sϜ'fiZ Z9p?l4 )FcbwfѼya=E&!ԉ&v)`|2 ,WDFB;8cO3=ɓIO؜Xa;9@ zpE{Hock86q٩e`f-H1j.z^D/\ܶ5mRMyn-ۏ")[ѦvzIduSD}~7M&5Rf#SVy8| 4:UG-R6Af?t.䥈#f!D8`m(QhH)GO@ԫ&{(iKh!Wӏ2t$:K!{T1X3j'Ž\;{?jim#,[k*lx-S0#DW!+GH&.P/vMQQFq(AcHbSi ˌ7Z33&JfW۟@Z֌\-3?yO*+4צF):h@VO64E80B3<˯XcyWb,_ c9c!鐀kM9q1H'2`ti̗Enke|C'\0gթS@ЧSTGk h%+l u ]m} 7iӱ BU30! j6_W1iҹe6LSM6FBj18r ?)2&Q4T` գE3UdZY[% FQA_UM ql2:W-i'ɬ<ΖE*Hb x1|b*&RP3lGT4.aJw_}" A"$%G_iT" U:]!CfԀ (GE69TQzz }R?nE S.3PR}UJ!# `4[_)h Is*+) L_0$`fzUaIU&vmښT |7F •`FsDgFOLX_E%(d:QHӛqYjxaeص)B#Ddj#GBKK @vؖ2 *pȄ/ ٜe +p0T46j/*!XC˰3#c *IC(:SXg%8IR 2NJ(C&N((QsY +##e0^1i搿ЧYfL:P0"a* 0LC>ܢ3]L2`ݷ\Ch`$(dQU"2/SZf8cW"_wbȈHYsƮ2L6j Dses4ݡPC`Tx\Sk"BMoag7D(QfjoFT)'8`<ޘ"Z3.c)2+(jnP< 2Q!b3m!X! sE3}^eXmp2 O{o$(FlƷe΋c= c #|+DHXB :´ _~ñA1e@1>6|/nUd{XI~aTTHdڤPr p ߠ!d3V$u|dSU P{09=m~aY9.NWi=¶ :KQdw.Vq> aЭڝ, jQd~3EvI|f5q\qaӱ0E(2?@+D(rq7r9`U"}Bb.YVM6ĶB|x˘"j$*`f֚oaBz>د,Z(hQLG= E¬E$áTYSfd@2sfCMV L-,Slo7߇/Q'[\zyNo~%}0맷o7ÛoŦ&5i~4^e"/FlLod 7&WEosX-x/k1#cZzhauk>brn[^^ } pZi?IJwͫ긟nΧ?{wyais\iòfF)E~%=ofz~}/v?`Fyċ&x ~~yΠja8Y)?)]0dpfWB/"vD^tIE׼ c$h|4?rk'f8q14};f܇hoyߕfxQ0kl-wSÞ'={@PK!CAH xl/styles.xmlM0#MId RH *Շnv=k4=zg4rHXU#r]puL},0 X[fcCl]+ĘCP6'!6?1IDWLJHle-$H +DRZWAeE?p]۱0Rv7y<7MGtYU$K4.rVjhU*KGTgIZhTuE%#6T>wGsRNu M\QU#: xcD mfL64εW V:jG+sP4.8=jE3!v~wDtEM}.&$2=x-gw㑿A@ tp\Y4~RvDJZ |r9F}g:D?5B{jiy}ʢ`zgv-(yhxf ahdwW_o&GA6\% bTPK!Kw`xl/drawings/drawing1.xmlSMO0 !jZ`4RTN)'Miw.l8Y()k^\I#l̡//*Μhltc7wX WӱSeN R4-jtC!HZYיPB)~giP3wro,.PV/c{! --F{jኅ|EbP*2zn5ڢ70pY^_ѵaGВih1LJx<>#S]K ~7zV,5Hxsd7Զpګ%rL,X(R{EuZ0 /g+%w^ UK㗥G959ΰ.:}7.fT ZoGk[mPK!J xl/charts/chart1.xmlo66[FqXMڇmkDS{P [;?ߣZc%'BνsUn}~JIkx]pjN^u\bAv/1b6kx;Uant ݬ+̟Ye}㯶2oT~Dm\ZHn@/ֻ3Ko PX+]Ɓ}/V]C .RO*WUmJYS.${|J-ڥ AQVښ)D9 g5ld^, 9I6nr'f`|1y`cix#0pTf89Zm@a9GWp=s}Z+F@B[ϲ8VSz4bp(80(j8|0ccևڧ=OVϯgvܙ9ΰ;$kUJ G1k6և@n{l87Ygѳ C&l )m"&B{d:$?_H0pJN&l 332i!{ЫԂ՘OYBAcHg$~Ij>I>H''kG> G> G> G~: zOrq# P#@9z9# P#@9RH9# Y? ?@BCCC9!"""""p2G$G$G$G$G @ ({G9xhT'J>bE((FbRŊIb+&ŊQX1I-Fubzw(GLxL8ZxxxxxxOH OH '<%<%<%<%<%<%<%<9!"p&C QM;Pˍ\]r]tݶeVҔl8~Jvg2z]׷PЗz4}1_ujuS|Wh^l`QӨ5؝s[Dz{Y\l*hyC'q6ꗲPޤgTms ]vWَ7th?@h83З>g<cun/Нp 80n'hM%ۃ&:_sp-@lŽ\bba{-K/PK!"xl/drawings/drawing2.xmlSN0#4$EM*Ԫ pX9Nc)ic;N)HK({hV)%\1XP Z~pCWrl< 'L$1B\lQuG% I>.1rhLǹL5 B:tfz^N1wO@psYEzy(Qb}8c>_i.AuŏR3_ѹa"HN$0֨I%Þ/HDS[JcUtZ$6tFtxgEg7mXQWHP6lFLc knxV(.X) if+;-={nK:>67'69}zbzᴽAmֿPK!FExl/charts/chart2.xml\M*au9$g]+ux>Ƒ83J"q#>MPwkXSîB~o>m7aݵ׋"MVz/tms߼^^-}vW/ =\-}<,m}Ⱥ]w~[r?RͥXb luϱnm~bl"px\ԹU7EŇzsM>7oǛ]5nREf7ڞZ}VŲȹf>KRݷ?O}s^, AvwϨ1 Z.̈́uW;Tfݣ ^b# y0#ÇޭMmif%⸼mfCM{G8ms;p@8XHjC|m:jۯ3 1=|u0)ZJcPW\l?5ç|Wj'Ͽnkʔccvw ]*ok:U4vn_P|xYl?\p7)26efd0cT&oJD=;i#7c&2sڽ8cTMF6%?c'*ڨ1 Qr^5c'#E8ĀPqĂ"v\*Y/(azcuDl& _ 0_fTR`U>%Ŀ̹MB#Os6 26Vb˼N~%6T>%k)UߟdYP_j3 9 (~$jQb.de?hNE,)C k)t>B,ʄ4PlfIMY+&!N6P%3 *vݣ.XTc}*T+ ɍa,Co 9lC\Co\ e d38n37Uks5DAN9(k5ƺ<w.)go؆..cR1֥}f.:ƺc]zHW1e x8V |X1PvxktCU -XM18D>TVA/p; |ͅx$X6 |zIܥd | zI}KE8'oJݨ]? ᑾ$s?TNwXJAxEsN:Ѿ#&eqDu+b9!q=z1/-$0\XevNg+b_R<,sRKR1]Ɩj(NwB0鷓Q>'6X (x*BuY*x*i24U3zW$4YI+>D$3 ObN Wс7 0*׌% uz=`Lm\Sq>Ԓ I=3GG(\ 4&?nuB !vjp/wZCJ;-"Ծ qtQ'veq™hnqAxXUz1*!BT# G0Ps>cC `!*roJpk*D!*K5)J/ BS ^`l+=- 'c{TS5 M1#y9Rp\}bM1z-#4g΅^vx˱ rThqfy'4hu8T } F{tx+44 pbt*b4!TXgG#FP<Fj/D4g+:[M`Ԓ.X iLs<%W@BSx^3BSQm 6) r⨠N0RSz54XK ^a gt1l,]5;x;h)sA,EgEsQ0 :1N4JTwgPM43h=H0M8XP0H';-LqaF:+`˔kB+B4Vg:\P Ӹx+$LKr֒7trc*HR =%R݆eHR\ ղ$9Qm8 YYn 5:rsBRL}cP`L`X.LWiP0iX y,LSQ(P9&̪P 1|H(Uw`VCJ ђ~ P02g,>'4*:1}Ga1C 1=G0B ; '9qJ _qyQȖ>:IxU!'/ 2@J tpYqY!tJwՈ+tB->OR )uFȔP#A{)S%%[yUh)SI f (h>2%M2`laG}# /ۢA<)S:l&H8c&HeI*n7wkXHjAoaH-2xqvxNNJAD4^9n&=Ի1zà-QUM >b_ۦ)ݎCcSӋ ^ӡfmW?4-pqG/\ _\лG|\C-ޮPK!bmxl/theme/theme1.xmlYOo6w tom'uرMniXS@I}úa0l+t&[HJKՇD"|#uڃC"$q۫]z>8h{wK cxLޜH]ś*$A>J%aACMʈJ&M;4Be tY>c~4$ &^ L1bma]ut(gZ[Wvr2u{`M,EF,2nQ%[NJeD >֗f}{7vtd%|JYw2Oڡ~J=L8-o|(<4 ժX}.@'d}.Fbo\C\ҼMT0 zSώt--g.—~?~xY'y92h!ы/ɋ>%mGEFD[t3q%'#qSgv 9feqwW@(^wdbh a8g.J pC*Xx8rbV`|XƻcǵYU3 Jݐ8b3+(QuK>QELKM2#'vi~ vlwu8+zHHJ:) ~L\E\O*t@G1lm~C*uG.R(:-ys^Di7QR8,b?SQ*q7C;+}ݧ;4pDZ_^'܉M01UJS#]flmʒgD^< dB[_WE)*k;ZxO(c5g4 h܇A:I~KBxԙ \ YWQB@^4@.hKik<ʞ6b+jΎ9#U`δuM֯DAaVB[͈f-WY؜j0[:X ~;Qㅋt >z/fʒ"Z x Zp;+e{/eP;,.&'Qk5q&pT(KLb} Sd›L17 jpaS! 35'+ZzQ TIIvt]K&⫢ #v5-|#4b3q:TA1pa*~9mm34銗bg1KB[Y&[)H V*Q Ua?SE'p>vX`3qBU( 8W0 Aw 9Kä5$ PeD)jeI2b!aC]zoPnIZ diͩdks|l2Rn6 Mf\ļ=XvYEEĢͪgY [A+M[XK52`%p7!?ڊ&aQ}6HH;8`ҤiI[-۬/0,>eE;ck;ٓ) C cc?f}p|61%M0*<ҭPK!3%zHbFxl/worksheets/sheet11.xml\Mo#7/}nvx&~[1b[^Il>d}%msuYdw}~}?<^>]ھ_|?~௯itp?nv{çǛ^/?osnOt3|y|N>ccxaw嘌O#>{&~y|zOq~=1`iwuݷl|=,; t#1as|]aD u|/ۻ~3? 7.2ri5rs狹sÏFBހ+8KӼ$c+!H''un}?Më Og06MꖤhF+:,x{3*I&]NN:zVABô(ib#C>fE)FUGl54v]UFࢴQHq2"~g{y`Zt WۅAT^[kpg''`蜬nEz+湜KH0vS4_;9GbQ1yXLCpg> a\lΓdFI҄ k2"A{-B9QG17ܢw& VdJ87PPԄH6Q =QE X@qy9AAٍXQ0 c<ѽ)C#yi:Ydc3T.hPuEn!VJ3P(w T,ٽ<[mH4!8bP -CsU%M HP ]{α w6ݙ"2GBDE醤Jc7{-Jg"mƐTnѹ!=c,gțuZ\7)]֜ZlcpF|3&3?}xG$j ؐ4. 1٭WA “E5#N61Q:WVJV IsLTMg aPS L9(U7nlAXNLVwssgE'[*<(Id\#ja(g((WM(D9맟A宦ܢe#Ƣ0wwr*T'gu`dCԳIX[d eH,hU] NFO&q$AK} WD8,#Ҧ݂ lEp NfB4I02zk0 8/pti-R7up9Os  \Y%,XJrRj-27&I‚wDZ[arjGaўgmeUEn\I_ #:*.k,i\آk[ Twj"`}vZKQ $AmQ6[j@ORx߭c1]-G U̶ٻWn9ЭkhѡTF{El*t;b7b..°4aR 5.5n٢hX˾t Џkh4EMEl'Ts7S,@oNmzfӫ5h1Kcҁ=ÕGWYn E.c9Ru ЅQ8C Yi߳Eb݉Y-@W *,B\.&}`٢CUk8ȒX1eIѩEpjvTn\rRZ࢜3"U&,Eյ6!? ME0qǂnbF *,DVSlJR~[M=1Q3ǣ-3U1:.wЛ+*{[;E}ƛ5*PqƦbIit=mQ'zeE@eLX0yAtw[h*alb(UךXTUm(Llp5z XQ\1t[di*"b'r^d*iK'ߚHwtn#eΝоsN ,̮ 8+A,W8qDJ? O:hY˚{Yx4ٚ᠄٪)"!CA8 j'n18b ؜DtNՄsȢUSJ@t(pI ޜiog$)WTu %/WI8pAQus<bZ,. vq[yn4,$TA" FrPɚEf47C+zgآ:.T2*ԚnE19s, 5Y@d t[4m.Zw`(\2is^D(q8.MKj" Vڜfp2qI@ME\Y3ALXFR,0LhJt0Zݞ#n̲SNLgEЧ5Y 8&˹Ț+k36ɛ-@lT8I5ME\Yr!g֊  Ţ箦ۢjxr%ڄ'f:Wt=?A=6jPd5rE&~Ygb8TqDd|rdh-ģ[jE`zYd"MKg\^rթ8|5zt лJ[ LWkʇDkMGW0OP˴ %߷(XXagdx5 ,3r pjW>AْA72:/m@JW 23]!Ym@ 6.+QMUfA1ME Du5k6y8 S`)A5[z<'Ÿ v3鶈S ] SqC'V DcV?ME xs}Y UrWx<ǜ#ҫh%khʐT9Rx~PwU?sWh'Hfx}pWZB}rd_~p9eM~[-WM럫ʿs{iY ~?Od1Cƻ?޽r LC}$P̙m8Hd_c܊"j'g|PaYB'K^ev*?TzY@8h ͡th*l5<TStsSsIҕbtR~Di ·]BAПJlg/x tAG)$#a ^S?"#D˼opIK[Ui[tAX+}جgC'XkAc$bMvJ)V(Z߃A-4L05dPbЕBjQ3FmW)dŒ@Qzu,,>N"W)I唪4NLGeW!B8kvtY:e" 3\MU)}!m.i?͑z#4cJ'뒿8G(Jb;*CRlXC./vA-(s-]ө.tAh`'^f,w]u&&`>#,DާeS|/+ ׶=JUJ01Q^y. r\I kbhQ )34:=W~<8oJLUW=l uvp^/:fμ&oQ{+y.?GtUhCMF",8 M]0j>'S9R„]PH1]ڌ!z>(H;J5֛ M], *dvo24B`Z-!'-]{¸t.s*?k6Y=BF0N^DY|P>29eԤ>VzNiz!uͷ0:Q,= 19B+S9 ɧD96FxFF-TjKmN<" qɋ[NJEUDU9"pMituiApI6iև.#L4Tu@e͉ Rd]p;bS1]-[kf)tuaE\\ eX ɟA/r,Aᬥuj J** pf31fmX&p)%)<c!3•P>1VlIb[eN joZkXO )E6ٵ%-:d˻p~:n+PGjbRND6AbRA*:ےͲփXx᪅b2OV6 i1Cd"')S&,uj'­.:C`>nsL%Ya!c̦Yg.Ls~!,ٔrwCF p])[Vw+0Z1j͟34X鹴쀶.r3#=&\(.;nf%~W͊lvÎm"ǐdX؍p087+>&Ʊ}3c>nnm4]ws"C;"f4LF8 ᄕ{ 4d䂞U l=;ZEY LdJ2T!mcһ{Gx"6lMcf'&IcYf[Ve)1XA0+'RX.(wh::l拫K@GG1][Nz7 έH=stcC19ʟSP(PG'@P6ś\t\4!){8ф.*NTe:Cs>0B` 4e5rADvm2L DT!:B8*l/2O"ZVmϙ$ٚzx#<+(!}i傮P;d`G8FIéM*[n=ɱRO'^7gRbFpUc6bq?Wg07v9ZZev~1ja_+4GeR$1M7RIPDgtpsd#wq2șď'װRՁ HO"pK9C-f1CitPmoC/מJ@79 z?BPCd,u2&@n\*k_06BD%3Uش .oE!Eup|0Rd5h)IiG!:)W$tx?0G)TB)Bt`VIUy]$!BlJT߀8tB%#$/ h8HFWQq-MfI9C- H)06Qm((jym 2 #dp|r*.HA@(*T:uQ-G a^G%E0/6V9(sV\q.`S֧Qrգ* l{/桮W9VE^!*,\@W[AR+`XNyY #lpKd:A|k'lU,n0BWE>E Y9؊p^>&Y#l+[QIi5AJo%&Zmri>X9+_ x϶f,Ik\PF{M8V_5) %nŞHX Ij,/BD7yI\;:FYD%`…YEW*_dzc0ULliwhJyoI|Eb1|+EpU]i*;5dx)!R͗ݿ<zx}_/|I____ˋk zr|ox~wϷ< ٯߋ[17wr*K|#8ѯNkWݖ?Mqy{x3|@ h띹7yӧg 3Dk2؝ww×+쨀jn#{'>Xx{㞠Cŗ?5rˋ?ՏBFހlf,;ˉ/>=&!`G^NH3zQl1XP@̄oEDtbfX#s"AHI܂2 82-Qp$N@+{N$er 鼇e;c Sa9 +' C42|1zN:!!Z"#(M$_f3^8w)9isREk{$Oi9SQfѳъʥ'p^FGDR)0RąY"Yr@N Tj,uW(HBh(u/XJ ci"9 gfjd#~Ǭ;PhF&8X'bG(^5bPY(E&]Pf}y)pH6irI7JkW017?Z3zѭZКrpH4sFtrI8T̹2 (/h5a[Z +$ʪGIa1BR&8eV U[YG9#_ eC{T)`BTbSIԠ0ܯa,,pQaZFf;&zL1r=TJ(~Pil +ËߓwMjA@6VĺZ8R&buą#((;etwЁr z &#PˆȬt7Bb+~+aףz*)FmcCpW!!2vnjKkbXPג[ꩤPv($1ҦL4PUMErcqȥ`%oGU8J4(wA :bU.n̓11yMGTUuN 5{!(Zna e FTiCbEX±Σ( p&[m GxO 8' ^&ܣv:8 ]Lɇ  {/Fvه3PxA!)I5 hN&p(`J<f 3PBFp?W{N'K`SKyz1\v:0̮Pҡ]їpsb +7 򓅹 Z#e0%| R)Մ{dN'¨JЮRQ"24<0$emZ5a`,[Q:L5CUuICx]I2-#BخB҄AH. +45v#miM>F_g`k+7(\ 9Tz`E7)8J;H&'3`a|wpXpדNX&+Nai{t,߮KUb61vk^k_X/||crxxbt{oi_>|~x~z O//~{urux2+}ryswCWzYe+_{)=r7ϿKzpqˋ|y:ݳ1˿;5ϗW>-__=~rrfV~?U2>_%vn?{s~p+п*v'5ic|p*:~]fuA0zN݂ԓA2V%9]  플5}4O?nzAIY5:-q!ֳٌƪ?la-ԬM5tv 쭛Ü[[[xAI4S~gۚa L8rAUk/^~!N%Qv ͔؏t5aHLs{AϦ_| -ސ\Ё}%'fmqwe93a= ĉA)pxR)V;7P18hMrf+o@;~apMX~Jdy AyD"QdXaF;pQ3;[\Tu2H5CHO\foSLQPF U qElA:`,8?'"'Dcg> B6YoQ9CD , 2.kI9q 6zGO/2&L .]]n_XM+i.5 ^Mx&7Nܝ`&\ d 6"B* %{#1u `̂4|fE!q Xm,\V'] ir=HTf6 $ʾE*$9^H]ql{GkEĩ!\7,\DϐI$}X.@hY!k H.'ѿ(!ZY14r(@yh'S:Jפ;wz&Q7tڔ]n#(Yp?$&LR麳E3*rʥzEPrq\,A!\=RmI.;CxDt0z@, aų} V" 0:";DR9$դ%Gf&,2GpzTzn,d+/'% H27t] u W?M1#8U\ؠJPpmLa#mOџ.H,f8̈l MNJRF_-׆AէYwHN4fifDgxWf[p (JCmz4S 'Π:"l*d,جH\W#7( eK6-+j Ɉ'ؐGqw{#fqsStO,mcl$Tȶ-8y֒ޝ #f94bT:@zMa13hͮ5uBάF8stG$4a'Uqr)q cqhD̼ 5tzW3S^hD̶箓2М-@bu@ҜsAaDL՞H+NJ< g- 69?jθvDF?r36+@bbW.ڂB IWUș-*PctF"@T JhMfð&SnY*,. z#zfiKL3,aBHO#[k$kg@_v%qƺ#zfN19#yvr[/m[RȜҴ7Ů3D# ic5@OwD\*(ݠS !bd` 88^yA8wuE"@.\COwD\*^JRXWA^/ڶ)$r;5WD^7BHvٺHwThВy%X[ql-aKd=QsEԘ8i !C#8DyA2;5ٲ$Ijf숤Tda!Dbq?l]-@yZG~R M?A dЂ WV GNPCOwD|4L$1@E[$ gvuAw]7aJ]g;"i()]eȸo %6׭@0#%.~ˆta/!dq]2My׮E;FL.N^ aDgvqRrU )N*8[(=ޟ2Cu&M) W_W ?N4։%3ݲ"'@Nt{뎈Z(@Q .K+@(;46PV$sJ&Aذ|;"j|rfGy|)LLڠ!4hnU,gaDg7Bvڠ 9zமH/OѼ{~wGD- ;O+N%;x-Oynf[dմxfIF4-6!y&n!& ev()@x,DJen;iH.xkEذJ]|Ѵ d7d3ȶ0 a̰l,:qDgiH/m;o||C∤^rh3S)k34TbN Z3L[wDb IXxD. '/ZxG"yۀT|T(9ns툢Ţ?RxC`nJ%CIkFyudV ◌.x0UtG-t$Gx[tC? ELIݑK{,*bOwDb_>˚eȋqt'\F9E}A*3X.zDēU+rVdVDx=UKUxF<|Ry^7 L ΦI)C$ RM\G$-UϋȄwg=)<_anJHI3*@ROWx[ܑ imE9 ɇ1tG$-U5)%#*Omp+ɇ܎8Br 4|Ӫ祈YjCEsU>/gG[[6.wm="MGfΐTČ&&Oia1\]<@ސJF6iZ۵F~)P~TgZg5q@i+Ⱥ{s&W|/O/ǯ#o/y^doo#zx<+FG扟>^o|{k;%or|ͧPK!&"`ŗ '8'/zzp|x-|wx;}v|x|>|zO_~{z8]ooܼ}=<ݾog>||y}/_n^nx#<><_޿ϟ?~:} ۯ^?^Uߋqa>*:/Gx=<_ͼ̧˒_o|+1 c\/_T7DoA}Ϸ>Eӿ OĠ(?o~~>Se] aA;Y[3`-o:xe+p8(\z7YA~1y`젵 cƍi {U+G)}8&KzsgGerP d=z|.pu lr r8a~h&;?Qh6@ލfۻk2\h]PDnn` c]5VKk;@ 2'L{ 5dɱ֣vWB#CҲ#P/ׁe$a5d ZO:/.K竬(/T7ߏ/ᒑ8es9>s8hibB2FwˊvJ7t .Rp03+Y4JB JxV[V ab"8ƍe a$FMŠlHSJ{eF-޶Ӕ %F)ej=|%\^>0I5iWyO8y5 {8K$P6.K%sN.eԪHp>VZҚ 8׫ | vC[".9$;bt#487٩ȳ B9j=%HFIy0+eTcsNZ# Ɖ#.D+ f&ݧif^XCd2ѓ&.#ZH\ dcA-󚂍3RQZI d˙&C.LF ^o2#!r}am=T&혁vJesyL`*%BcK5QE&& &u.'dnt ̒+P hBB0PLciO8ʼsI6Fpy̆VRbKMvk=T&49& y]!( QFۖyMIR:%>*v0)FNUPI{hQC^edHy'cAԧM/*8Rٚ1QdW=Lq8*>8l ._V3vj8PSrk qDO Qjq&aeS!|YCo:ћ%%t#)Ә?<5Y.|X\ GN֤ISKr/ ZP-dpd8e5}&L(<t",Ri@6!da5DaK5"4mL ma6X-mUPeFZfŐ&'֣JB[!k:q4MUUϼfZ6k$p1l ԇtb?8IQ]ƾ\ %#ȼ#e1NLhyLjtT;0Vy^ .T3=q¡(3 ͙MELF-'PPup{RU!0Xr8f) ch1ܜx{$RH/rиp>udf`dxO@/KPfr2I\sW.(%=Ge\96s $p5H\I. x2j94T+CG.OV/rk=\h)^(qV36Y5OT:7JXIdVs Q^g<<Jv9bƑc6ؠ_Ǭ*LM9tt,H߱q&lȾby=e)]!^Zfg3y"jT :a%+0F8SO]J;?zJm5C BT׮˦@ gma`6M+F ]6Q(5: ӴٸpD73c(U9 ˦0W/), jnM5 n指 3!pU*Q;ҍZTpD7?'(3 3!$ _0S<ckDE$Ȧ1 (JO,Wb)1Ԁ{X)vq#,VMB͆%v- RKn5ʲ=jO(v!愲bJ[ k{ |Et;Q? HJ-+gY+3Zh lЅ݄~jj`=fO=L =`gFG_VfS.W:V\f5*XP\y\4J$n*RY0$͕w!pIAL(q[fA^-W8R0"D+$-+nW5u|BE$W$Zn(vaT{Ű.k=JJKVIiu6#cQABbYp{8 AF'/DhBYhtf}S,WWp!p Q~vP,WU,wT 7 vaw WN(U'[\\=q:^z m+:[mB[0:)r&zCw!ظ@jp0j= 5mn6nԦց&(IϜvp+p{he>K5b-̆9Ux7Pop+p{hiG`(ڸ:C ⽒6 +nnmB[h'SD'/15乛 K%.6({j%͹vd VeЮ/4'HPhPf8m!5 zOˊ۱R!._A1 Ǥ=1؆nqB\T4o;v͆Ԏ]#*4Q?5x n!.q9kf@18\/z+(J+8TNIx2ڦSCuF^]pCJtL!_2gmcu6]TW5B.Tt%OtT̆wxǦa!C1!}@nwBI= 5)5y wiٻ'u~1XP *fNr,D&͆E%d޽8--+r^_aPȆn{b΍8CU/ǠC_ tmZ560…D'k'閍W(dߕ*Kkb7w#wˊDE/K#5 Bל0xU$j"5:;oTR7~Gk͉ZxqHlOR}W|v_/___#Vv}v6}=ǯǷۯ|=ˁoM[_Jrr/zyr/~|/_PK!CFxl/worksheets/sheet8.xml]o7 ޥgt'"m!ZRɿbUa* ,Po|_xp|x|wxۻp}v|x|>|zOO~=ޮX׷77w_O+7zrr:ޏ{t|Vx5??~:tx~KoW{nO><>9.z}t/.~z<&/rgN׫ܔe>}Kmܗ>]>?>W|@uYw_㷿|}UY xO;2)}tvŎ*VC7OWu}+pm};eUw!O8m.nF tHWCTa`.je+ fYPy, 2[ 5#[9,tt.+l5 s)ZpA)aMbe\ڑn`q{ 61nBB75݄SƷw30]7Un;6\bœ/$$E !{XY74qk`+Vt}]? xQk7 n~xе_nq`ZM8yezg_Y *Ca;b&p5E`Ot~p.:lH\M8_NU h #]ӱ28H5݄.NL#b݄ A0 Ftc8%츠 k/p5݄;X>``s x7כj**Ҏ6/I'P G4ob[|?-Psy3skMʖwVл60yfq`;%ʱōӋVXJKDETRګ0u ^(:M8!94.:n|- A;&(# W,xm䴦z(;Gh1%#Jo8bT1r9F,[ 8% 9SY3w}YaRJo7C+iMݙbHpqةvXL']$r68˝ڑ9[h ;W B/ZO%}8< ,ya5u "g"9 )JE~KbBXY8Y=t`̀=ZO%RpsV׳3MH@D*g[h[ eo  n)'$ppp9-X8ƒX9Y<o?b3?Ay ;OPI"a]YSN@2CRXr\IܸhNFU&zA6ۙ3Qyʀ@#ڄA8ؒˌ[O'TO"KHaÍ'5Dnlo}e-ҧLYp ƀ{.ezKHDcz5cɅy2lafEٴH`qeb~OE$t&&+O"lkt$x雀[#?~'3-8Qdѭ0w @as\Dw˖og Iz I <¶H`ы@j0ERN5yuL(/Lj5W$5AIB7D-3LĝEL8JՕ  318 \DM&"i69 Tm؄̲@y˥7t3Z@OﰬXm4[0LY|ZtZrVϵ/+zVŅt[^$Bi 0cvn{LxZKP59E{Z $u7QJtb4 hWj~-eRgkYg sRKFFྫྷ3yqk/S$ %k"kkM_(P-rDfɵ˝Ez TL[J>wK7J,a4[&zyE"ty)<5r"֦T|f+@>PZNt Ȕ˒œIgX3㘼0 *MuP aMal[4eEAKq<m7{h]ʞswS* im}2kF)шKAߵh I#g%wD73 ֖;Oc|j` Gu_nF,=d,tL (Ot3+}(Wl_V$_$ F IfٶH+:|] & ) !_i7l^A:=L0Pm( rڸH`yozeE:tlyK}O7iޮndDt%\pgh呻dz1ܣOq+H,wf6Tt}dNZ[ ͱ ^}]o1. ZB"s^gt rFF^/@kȱW"b>KyFODc^{bqDZ:rxIftv"" <ݙCͶE|*\̘*Rm:.uI?sl Xʲ#Lv#gQœ:ϯHQ@zBk~-6dAHH8^QcCCEN5eA"$IKhТ_aA|2d.8{d i. WN/+FY8ejoRR>+Oԛd)[L+AZjQ5l[kU(6l3$e/E./+R3樎o&@XmѰ!+ -z& ^ /d $CxoˉnB6ʭz6 4Q8 ]-Ot3En0%SȮ5H$'WmѰ!k;GU@8&0dLw"Rͺؗ);EyŊnh1餑). &pm \9~$a,qObfۢa!k\hˆcH!D'u 3P&HL`.$5 YH=Uy 27}|?eP "i!KZ&ԐD7ITB !*,R`(+FcR=VͶEBV* @/^vMbWYH|$S ƅDZcCt[$-db,!x07Z0$2Q9eINr%%́ۢi!K!R=#\X6ڮ&I7!(j~-"0"70le -$:Ib,g+MZ!u8'"b!k 9ܡ=fqV Jd5p_4@y(qm,Mds'CvYEDs2 [+x ͽ 4DC,ZIwX͐ɮ~h1yĜU[4 Ėc$qx(3HAMȻoOcˁKMEb0R:XUzZ0e$\<&ۢ`1 K oެX P:^<q)'9(-w 8n,a쫌I}"mVbr $])qX:Dw }4>;WMEb0Z1y?q{M7% tf:/3"zB,8nWy wy2eM CŃ3y6g,8$ɘe 3m~†čK8LH2%9d[,faBA#rUj> Le_Ie|_mQF:Hʜf+@Xb%7(9Wmb7Y' [i'Z%O<}HH/=}yx~z<|?6D>e>Zˢ2~jȯǷW>5V[ rg\?(_|ͷ4-PK!~'0Gxl/worksheets/sheet9.xmlQo ]&l &>7yJc[XI;Ү>_5B)sOuNtxxpiv߮e?ן;}߿]/oo_]_?߽_/|p|{ׯ_=?]ۮ_. ?ӧOߞ/oy _N=rw_zux<>=1.zy|//O?]z'a޹3{1~xvΆLoz׫<ƽdӸ  _lmy-wv|G?'\3bۀffgO.yӥ>-&[v;>bo]Xv~7> }>t-Wv᚝Cp}\\<͖joc. v6;oIP6BK0~Dv)ٻmv}19ql_97ķwɜ|,p~y0['-;x{ S`ױ܎}:XiXf+26MdQfd[eG8ݐ8eCǺfWuyA1u)Tnjnw\Y;Y˱BgMLa 5.ZVĸ\k?^(.q->Xl`K썙)|1C0 UV5QX1~ cqtCo"Y,ɦf3?ĔY;S.%Evq¿a&S@N>_cz d͞uKp%y1#j7Ԑ[xLDF[K!*'Kב|h5 f -K/Ԉ[d1IF#.Wȓ)@P3$ݍrɌ "zVk֐[da9|R)n9y6@F#Z; /xPrr LOArL-y8PBo Ξ#gظ:5b3IbÀ:\JӸ($hL$ XIP$6п܌2c+l8ެd5KCAkF߉33!4:kv(*bggȆ ]t?;GWWŅm8Zh82mQ8oCw(sLVma;G80.|] RP-l׳$DR; ܫڱ-lg3H$K&OĂ"c(/d ۹Pf$")Pîz,b Ylj G0UCgRzYAnn;QfvP{Z-EC AjعbP#,IBx6ؕyʶ@IOT''0g[0ؗ d []ɹ8r"C@e5'˶Nb2V_C6D ԣw|sVII0pdj)+-`) &"R:=k#FtG NUR"8$OC2al.*:%Ga;[*ё=G$_Qz9 ֛'FDN1w\:u0֮_K?*3f#cR?J;nVUla:73'Π|"AJSLmAŭ=z4s^ҏsv]@VyBuN.&9!=%u7vvh <@%Lj-d禂 ViJFC64  J?"'F·p ٹLvb"@NPXbO1gS0ÆxT.IaGh2*qT\&:53U6сapx Q! [e ;29rF9Ч;pE.}qCnՐ֚DP!K<sGuPU1zL\%4>ص5"GM8R"9\Q; `24Yd RF\Wd":69D![hEp)+ɔt;8Xt\8]uS_h_Ku8w0ת0?:e"C"VeٲFBtT BtzqP) )+nuIvIx䪌|*[xL@CIùZ^!Ol&:O<"4W\gP)H:HeD^na~b9h4idJXJ56!SlesGŠGWr ( c %u\#< dÊ@拲TC9sxN[(F"@l T9e(G'JDGaUKNG's&_Cޥ^;!$ԔmIKdG3mڑDNѨKҞ@["i(dd)3 "mXFb#9}8+_` zhWIoQ϶S[pCʅ^R3qSNLdعj-+%t+J{ n5{>bp`lU пM=)W-XfԱ֠:9G-Em8N?vgݷP#,ꬥkm"P[`Q-^NKNj@aJ +c y-ܸZxMcQ]O5:{ Z/TAs|*-<1Ɓ~nH颌x"PϭⲱFBf^"y T5ur\<r% xyt*-\L_-Bl b2=ٖIehL̆b,G[^lX|2ֵ8Ej+j0&PږCUSEGCB+r>k-l3B^G7j*8)xxA{KUV[ ͼ!ND4]HpVܱPЙW:ckY.:O `vɈHu x&>n9řZ ءT~dk7j;FU ~*΢d8Z c9lT@z)rګj.3x[mPv㺬4 -'j+z$MZ Ab-3[mȔ3VZNLBj)pa7$,9L K9h9fC a,t+39p~҂DiYX߼&x6Y㷅چBkf;T"],]w0PȆ$JWGӋX̤#pWeLO~4n.)p"~(cp[-f;.- \)zW.pvE n >#M0KKq LxeunfCOy0!BL޼dn,gib)8{V8na)i~*5{.Z,ͅutJEBk VPDlX732:YEdF 7 vT̵5Kˠ/zyǗ׋KH;KJdpu_oo_=_7ŧm ߼p7\= +ǟ|n>GPK!"xl/drawings/drawing3.xmlSN0#4$EM*Ԫ pX9Nc)ic;N)HK({hV)%\1XP Z~pCWrl< 'L$1B\lQuG% I>.1rhLǹL5 B:tfz^N1wO@psYEzy(Qb}8c>_i.AuŏR3_ѹa"HN$0֨I%Þ/HDS[JcUtZ$6tFtxgEg7mXQWHP6lFLc knxV(.X) if+;-={nK:>67'69}zbzᴽAmֿPK!حUGxl/charts/chart3.xml\M*a`>,䵝JŎ]CnXZ1džR~}ސʍb 13ݯ{z4?|ܬ>j}ym.v~E: v٭wpWŻn?y^=.^^ۛ]⻷f~7뛦%t 6j[޾]-vMNnVWܲzj{[ou}8/ts{.nz[ny4_,vGt~^ Ew;VzalQ>~jvo o9iX#6ěl iݟd&fl؅o[ϺG,\Yh{v?uU~Iz\>w}ݧp2je#uwݲH.<^tp!d|x'^/|~0$?VY(>2Psj*&ZjB3#d15n"Y%7vϸSYl-wL8˸J3B,&NzggYljz0'm}B*0UhK9)ITQ}z[MqN`nNVuq\* 0f5@W% 6>saP|S36"`K 6jo'E)0Uc<ΥKlMKJ6t S9@o ^<*Ȁ@D*xh* DL]AL,`#]碳*<4U iڂj9ͷmRxW[V9X-x`17 [yxm@Uw BW|l Yeh8(y\RsK!hDvu\@#`*6lF9-Ј3CŜlF̎`#Um9l̶UQWF8#tD-lڂ Ș%Gt,堡SPFM\Aj~Kŀ+}MhqY&@A) SpV@饮b{ Y_!GgY^+Y>9cz;bvm ˫hqbY4xA)$UFpдRdߴզ^ppF @g @MYC:3/8h1f}<&2@1օd m 8hc /]ɣގ6&b|de3GAowX,1 q֨#ƷHZJ T1.cڷ(w4zb|L%%jߢ"_A(a4b{oihM@`p@`|\Mhl@r&O0e!UI`@ RUIPkvFћ`('ꌓfAA6VA4/ YIPFjugoJLV8U<1n7#_ <9ij_f1~h@ P? F4':6(Um hIUh!5jj!p0ңu@SH2Z\7}?#1vViHz'/v<]Fp^0%b(Q쐵C˔.#8aءrJ6fK1 yAc&IOu)|'6N5w;q(s)ҕ%U\81Cj&?Egb6 3"|!vLɂa!z#3AkL~Dgd!`zJzќ S<= y 2"7X ]]<_77љ0ZCt> rtgBfPN/D;Y^uܪEDCA57xp↚2eh-Nk',uqK,/be,&XLebCT#*<ʺ )g  qMBXenCP|Qϡ 4Zا+&982ՁmnUH?7.*T9MWJ $4`9dbc| iFNTŗ9GRh;ߖq}dvR=D #XӹV*̅ζ†"\YHunR4;fwOg5l /Of9 6`nu lUu@g1'u!E Dj0VjOT]قmcvGXwm$7]yMXrfD{Z,yMZpqHm*8PA'zoF]GPjOPߒ!ӡ#cBz@$ݨX!*ԣƈ)WuMI\ǣGuL\X!*4Q;QH%)'-6|on9$52k~qϕ8uj~}<\< |i(pYpn}]9`q;@߷??NDYe8!՟tTka{olw=շ {_Hkex* WSL /G4lj_zǯn+݌_}?>?rOir3O#xiS;|~W#g-W/q3Ǔr 8|WaO yܯÛ~npp7(CG=v=a=\| PcW4*\_ᬘC$jaImOyPK!Kw`xl/drawings/drawing4.xmlSMO0 !jZ`4RTN)'Miw.l8Y()k^\I#l̡//*Μhltc7wX WӱSeN R4-jtC!HZYיPB)~giP3wro,.PV/c{! --F{jኅ|EbP*2zn5ڢ70pY^_ѵaGВih1LJx<>#S]K ~7zV,5Hxsd7Զpګ%rL,X(R{EuZ0 /g+%w^ UK㗥G959ΰ.:}7.fT ZoGk[mPK!.Q9Gxl/charts/chart7.xmlrG7b߁Ø[5렰4!㉑g.[ @Yڧ/Tw,.$:䟧՟>=,>bzumjXw݋x}Vwz5\VՋ;|Y?͊m,| z^·va|n~LwfWi࿿ڊ|ޮxs؅ ym7kr8,ȴVV{3wv6Yxx|t^7C̞vͰv]fɃjx+ #: ;lz>QS6"t2zs7lN>M~~]c0ߔw6ն_ȧΰc{y^yHSܽk谸+{>Ɔ}Jm/:yG'/Dz5! ]kB2"dG!ZÙ>F&hs8ӻTɍB]4cM.1ϊP? ؚdR\V(G:GE(Bmmr}ga8 Ek'h3Tm(ģ6d ئM?εƛj2 {mG[ӏPk]X팳:Tmىص:TƂmy"қfd0&%m}EE&kLѷvbOjR1.Dv?ڮ&5aIaS *lƃkLKmclQSr2-?d[ǚTƃk<8mblDj̀:DS{bf@LJUu$[Vd3 ÁF "NO` &sձ2!9qpz}Cߐ1Ŗ,,5g8 '^۷N»>Voh T[ V vȟ 0Ihm>vU4Hu,,ٵ8dl_tU\Il)JW0#y`3DL u/AH@x}G*q N51Lׁ6ح؇* E$pƂU&*gYh@;V'c}B7'9U&#)̭)uÄR2s߁vէ6C IM0}{GUO``]lڶ "c ʐqL0$KUqAgS >Vri…> i =AF(u= 0T 8#ico+ V߶ B5Gt g(0*tv-FX)&< +؞i5,Q{3>u A;{4 A:24 0 !}p@O<ӄHE7 QǙp lK*c Md=}y,?YN!a}(S:Ҭl9Зzd"Suka[wg[%/hJ1$Id=i$-$aiԄyX98aBuL'΁|P>j'"ߤ:]NT&&1ĹKN#MH ֫nbB;APy$A]ȧ"CBҚ(ڀTǙ/J RNQg`jH5A-%?I̞SǙtNfiKiH^̤`,FhoeuIxED^oۤnȝΘ!)"M: T;9)q&c*GҴk ºC\q/gһ J$XΨn' 쉽/`RH27BK9;zI5,E{1B\unRg; $AĂ}&y7$)aNTE&)0b:ФNȏ2 XzrWMN UsԨEiz)MAiBg2x=Pɉ cqԠ'd:2\2"Y:ΤxIj1bfLZe7)j~Cc',tܤzj~_>OH8leB< ?Ρ:B})W!fn+Tb5z@]#`R!!.LT)TO>q>CGFSd,&OjGKkyOABWwd=EM@dP>N{-N8F%%1{TgB~̑u 9KR\'{ ᐵBYUHuˉd xYh*uGSd8kSiN"TqHY0|Rs*@, BhSRhdžiJ N 52 >SXrvM GI@%a!%jT:LaiN cLD+4_t) 5D^Q2$$*R)O|)Є=L|JMX B+,VPXq e%*8MiŀNGN|*y=K诮>C URpTl2qњN\&2P~dߐ1Xڜ AjJm ́6Ipr nW,/.P!B[~lDfV[i96 :4c~?I\T? sa{@Ty,i誘Ab&c%͕=.HLd0j+HLdD%5ЕDU&<48Rl0iC 1/&}$4]?nl',$l*SR|RPR2mf=Pn8Yg3MI}eAb?-H̷BbNb MxxnN߾Pm>G=)MtVc+Bi!Q2tfE(?6Ľ͡E]It}F|f?{3y}F˽#yXoxVxVɎſt6_l γ>GW z|Vs>inlbo7Z_pq7ե2&66~k:պ5> k;N52Qv3tRch娳@/>,8K 8Qg hP8>9;U΂MGx$nZQPgqFUњnSPgd:tqt ?/>*ӳV%Ks^Ho) SRÔ陊?zIٜ9.K-J3a9/$OX B"弐>a9@Ze\LNrPE$jK !An^HTNⅤce/% K22tu?z}t7Wfntb/TqAPf2'80ҕ '&݀hpș[)eşj} g~X<|7ߏy.O2{8P|n:lr7~][ES;}?ٔk>Ep$ʅ\(P"0|8}xv>C^Yo,eqa^O48Y_"n3|zb6px-V/wȠ}AP|ؾ9o [28 ῆQL~:~ulΧ?ί$XxZ\2bt1b^;NTÃvWJWkdf_~"xﮭwmz2 G ~ǭ'i\poOVtƚ bwT)cq<>rܣkLy戲au|8?jl jn0̸;̇^q_W\Aw}%74`qFmg xo^PK!Kw`xl/drawings/drawing8.xmlSMO0 !jZ`4RTN)'Miw.l8Y()k^\I#l̡//*Μhltc7wX WӱSeN R4-jtC!HZYיPB)~giP3wro,.PV/c{! --F{jኅ|EbP*2zn5ڢ70pY^_ѵaGВih1LJx<>#S]K ~7zV,5Hxsd7Զpګ%rL,X(R{EuZ0 /g+%w^ UK㗥G959ΰ.:}7.fT ZoGk[mPK!UZGxl/charts/chart8.xml]sDZOUʭ;,K)Sq*rrq@pE!] fR6EI$ޙ~7Om__wM{}5l~U:ۇz^_׿jy=-n?O77a84a{wȯǛg.YmoƋ\..YY~޿_-ovͰ=N >oX8tW^l^nE7۷rhun-MmO_W/t ׾cWy͊Rfdž+LZ֐ˆxӟb;{{8~Yӂޜb_,?n?Ziu\ 8wǷa!\/잏9VN@(?b'5 N?L&ۭwa^$W/F+b鳇/#R#>o:޿[헿uO~u#N[)F= o0zXy?q M{:^\״mm3߾rrOO."BI!@Z+ '!۸c\}u݌9 EF2};Ϸlɞ}lS׺.}hsgvS߻\? k(s1#izde5 œmZ{c]St(BJ'!i}1P!G Kws2&Bk# ʵs2(bc{H."5F`sFĹ ]11` u-5Xt=pEޥѥ20:\2{lƺTFFx&gb'ÜTFľsM>!Y |o^ +Qcr}t.!n"QHTFxׄ#o<5 =mN*c4.o053шWbX qHWA2x )w^f: ַAieq3c EDqiN&c#V h0M7 !3Gdl&ier.͎~{;~;; ߄/Ni뢟Cցf5dk5%l_v&c#4_a`Vi~]m6. x6lFlB (vE]LlH١24934چP%v :mk"S`9 ӪͰ@(-Oİjd3(D'6.:. 2$a)#n Q'BdBcL%u dI8U 4 ")bD1rUd,$Mɵ881)za*(ٔAZU(q'>9R2W r7ns *GU(yXWH*kq: Re|=ƻq| ~ruB.RPГ6D`˚V/0 0R$Sc/(`whYIMY⎊_PHCQ/ {ĖM3-N`fAS0/%a >%Bq0 g%`@M(0&b(nP09$R&@>d2MTrw- 4*( olQ82lll =?; ɪQ*t@A,zP)0NqbdρTDwƉQDK^1"H[,0 %ٟ%~5|Ă)5%ݔ-![s+8 ؒeaױ$콄xSp?TA`2-K!:8PM_DfS`@݉w?JaM-?Ȗq9Leh <:v2EZ5O*0 "*=懝 T`#9 9%;KQS`#c*OߪLS;)Y1T̎ȅH%+&V힊 S@k5g "扶~N'*NLKµ̊p=RpZW Wd)%hHT)YyGK U}8;*4#Djpҋ/UkR7~qQ`DO1l.h7'# kA;a̟'RKHGL^u0I{5ƝUdX %# sfVaΫZ>Ӫ90J36hB B8{l*UAs&T:b{BUUP0E|rT^uLf͘A_r8<9䱞Ik9ӨmI,f'a [PeJ" ?0R8@ZP^0%x;Oo@V'PII1h!Uq+KJ=9: APUWuqmRV`6L83c6X8nVBriÜRD h!:HUmbS̔2 5S8i}-̇ U:"tMRE @l%ۑ2%iF"8 d5J] @ҙmjp X]YPdؚHq.j?[lΙ>q<.Ǐ[|R℡edS"@0]X u_х/%"ϧ!WaCa=#3HIOGbpLev*JshFŀFXfR'j{a\ ؐ$PPu9B{GiL*0i|8.QVtCP JU $8YUH@$$2tldc+0R!kpΰHE+0r39tgʊ=qn9\&;* !r$s Mo>i܍2~Q$R'r*T2 i9 H92MI`on9 9ЭIZ!MA: p$w@8*TNupTjѼ^hW4*ޓS.gz\0 -">LpvrA5VxI8gTǩN2h˶TT@j}WOiې܇P2<ilSgBexs" )$##oJN=asr-䔅QA u.=EcBsMU)"e(z=xOu&O3z`!IٍX`,}T?ً dYT:i+l'VZD$Vr*"U [r< K+LFHZEhE{8Ќ*ŪT@O`0GH4NF= tj VI8R I:ƿRyłJuIwA"EYб]vy[W~ NXPYPZE6IG`r ,-PG79P}BP.tԨ#F<2zZwH(P3 =]8Lpd2@Zeab]~ eKzA ~ARX-aP"m::4a͵9St2@;&[3EgrFKHF7ѓ6'A#*e;,k:3csEK۳Cm}C z8.ʰQu{B$=*Gư0gZR[>3Qj8RvR%0#.F.QV24,} KȖߙt)̌((fN(G Gwt'VgȐB03%ks?s&WP>if/<$bEFZ3gdgM xi%ݞSFFIeX׬2rȈ kb/p4?>#=0;30&s(32R#lE|Š+I}z*Ru y_Py"Umi:TqPQ9 "h(ϭN'r9*SSp@K Du>pdN)8yG[ J֔=OTP *MIګꊒYnśꝯQ =$`aa9{-nWVFuD653N,ylϜ_k.ւlL$6ZE8Pbvwªbgjɡ3-TV<`:NœJBgNVS'I!ȥIVz{8cPA+JLTnz¶M2 a_E92"\XZuF4i}9ſî݄ 6R5/0 |r\IS]F/Um5O * qr.͙1'UMJo6iShy)yp"=.ִ)9&fr; B[%SzB( Č{:L8LK+ L"SNIZf 5TI.̘Ɣql1tM^U|>ȝß/UgO7˧?/6T ZX_vgXO3,Z~ L Vۗ",o`OIPDqx{z¨r ! I,x,vq;<OJ~x^WZ3jh`/5]W)1a|mWSOO,g0jqx-5~}kXk|0,t?"SE'U=F?ǟ-riIJ_~ܮO9auxG|<=q4OB7#g./}~X~=G#S]K ~7zV,5Hxsd7Զpګ%rL,X(R{EuZ0 /g+%w^ UK㗥G959ΰ.:}7.fT ZoGk[mPK!Kw`xl/drawings/drawing10.xmlSMO0 !jZ`4RTN)'Miw.l8Y()k^\I#l̡//*Μhltc7wX WӱSeN R4-jtC!HZYיPB)~giP3wro,.PV/c{! --F{jኅ|EbP*2zn5ڢ70pY^_ѵaGВih1LJx<>#S]K ~7zV,5Hxsd7Զpګ%rL,X(R{EuZ0 /g+%w^ UK㗥G959ΰ.:}7.fT ZoGk[mPK!Kw`xl/drawings/drawing7.xmlSMO0 !jZ`4RTN)'Miw.l8Y()k^\I#l̡//*Μhltc7wX WӱSeN R4-jtC!HZYיPB)~giP3wro,.PV/c{! --F{jኅ|EbP*2zn5ڢ70pY^_ѵaGВih1LJx<>#S]K ~7zV,5Hxsd7Զpګ%rL,X(R{EuZ0 /g+%w^ UK㗥G959ΰ.:}7.fT ZoGk[mPK!Kw`xl/drawings/drawing6.xmlSMO0 !jZ`4RTN)'Miw.l8Y()k^\I#l̡//*Μhltc7wX WӱSeN R4-jtC!HZYיPB)~giP3wro,.PV/c{! --F{jኅ|EbP*2zn5ڢ70pY^_ѵaGВih1LJx<>#S]K ~7zV,5Hxsd7Զpګ%rL,X(R{EuZ0 /g+%w^ UK㗥G959ΰ.:}7.fT ZoGk[mPK!@EGxl/charts/chart4.xml\msܶޙU&vQNNI>uGWߋzG9v}\e4myv<\/>is?4U}yWf~//NC_wþ~?]~|uz7ݪCwp}uuZwݩ:{|pu~=]xn{e뺽r9?6{?>fuX=0o8ܟ._`pnMŇnnAa7nV/CQ7q]w|pluݣsf4vijo0=lxr~+vp:* 4 S<ګ؅[Ͼ7[lj?= 6öC~\]ocݧ07;pbMe a{8]rxgd${OvL&1:eu7m틿?g:?Owt1Fnş{0ێ~نy@ScFX7մa4ylt_3 0RL{h_]LjblH%[QO S& l殩ɿhPDe`w1"j'ZA۶nux,Ӡ؝z?^w+gB_2Bv%5YF?/㴩 zj#us2lMMa[ E< ZecT1њ<'a`yng4Z 69>vX1ap5 M 2S}]B_ID kqTe Fz;̃T,N݆y AJa i?T 󌍽RA]q][PWS|OuP>as6ի,'l)XQŸlb(O0> ?ߙѪ߄ \}>b6"<F3sp# ăGXܺo|dݕO_x;W⽩,*:8Bʈѕ%T#PIp\7/<\5"!TMlJr<@5"bXLMe=41ڵjTNo2fzhca/VGpP[.ץ- ]nӭ (-qb[Ćb!:6WP">z<eb4j6Dߥ2"w;KmsTW:s#]"تm[;+b'+~&^)UCYI*r kYt1Aߠz c"Gw6qŢU=QօȋKjE!x .[T!gb(Щ[TsNhW:9J h+@ %}u֌6l2SlA]*t"L_Fh(8lnCS{y0y^hsiGu)E;Xz1>ZK:O^e"4@a`aX-<cVoyټŌW|N y[_恾4ҏ&tkz'JEјjC$CQ~I6Pމ?gud/rb\櫱ԦK3zg>?(vkRhTr t Q_Bz0;UB.9~#N$zgmLrۺ\41_ /IL0f<n-G}㷅:z' Joj(HLM~:_:>HlAx[MMQ&EPȀH*RmKU=)DU M_u6 ( cQe@f?qq3(,* U3x沊+eQsYCKۙ Ok9LĚOLg*r8XD~f EFD`&;(u,ÉKu >'.>W=Ou׹jhHz;OJ3`,Ri/=L*gPv$UQ{_nO߯7?u醿u_??ԋ|o6[6 O`2&:ؐ57p~wώy8YL܃wtz +a>r>4e8!}ȧ1?V37oo/wpO}?>`a;l^آ[buq/e~#?o|ܬ3(z7\L_G2,z߯q^x$VW_}?s;{ ώOgjI*!hЍ8NV>?vevzs秼?9vOI+P-9t9!oa@]᠎QGrٟ.nqFUE> 8fw/&)/Yh~rۣ3u7/#PK!Kw`xl/drawings/drawing5.xmlSMO0 !jZ`4RTN)'Miw.l8Y()k^\I#l̡//*Μhltc7wX WӱSeN R4-jtC!HZYיPB)~giP3wro,.PV/c{! --F{jኅ|EbP*2zn5ڢ70pY^_ѵaGВih1LJx<>#S]K ~7zV,5Hxsd7Զpګ%rL,X(R{EuZ0 /g+%w^ UK㗥G959ΰ.:}7.fT ZoGk[mPK!T}(Hxl/charts/chart6.xml]sGvSVn-R㭕w/r# 0(Kyn9S7ZI$qO=??/> jy}ib,w˿ë|y?,6wv32/bwxX~~{Xrwu[W$v0l]V7nqLŧey%\/6o W}wnn jl>~> nv:Wiaj}xdse.7/=vI7xX-wWG-L!MWʞ?|Yi[a^.E7͇?a=|7pqy|p}:cn{`bf>fVjF@R#rVM+2DYt@!U 1Tb9ŹG:U %}"ljꕆ p I>8ղCnp}gMXO8p@rct#q8 ГPq@ FqUA8p9+.vfkYahgL* .)0R~Ճ N!`&U RAb9xXaCi 718fbEd0t=bצW+ f ا"Z23JcEA I򆸈pq*bT%e* '5GݿNJcρEcԽH$[GuxPY3 *TQ N_€BtW'UDCE5BvZB0 DA$j R9Q&Ua0 RcO0dzYSVa@( W>L8 J8PrEArRT@}A P$ͪT$I°LLET&Ru* 2Go:W6 qQNTh 䔤/L0;d=ZB0p9h\#tS*ȦiD¡)N I᨟XY)u*:Hz}1RVkRqP$7r,@^p2]AzT( '#Je* H mh#)?l ʏNLK̆p=}?@( >h2I0LE#0""Q/?c%S +JT*V ]b@N.D(mx^uYE mHTe9EYFoUeK(mBuo AJLTDTtâdi$`ѣώj+ `hdrpnKӛ0.)U€4 lt9*Sqp %ZP9@gioU%; Qש8 #əFKy" Nâ!'ߨE= &U[&I20 pknXT5TW3y*a;z*HxQ{Sg BF"ܞ0r2EfaQ! ~ n ! h"A*@D # J'V=Hâ ceaQ%g!7dUQ 9jiШ.&:rb:J60|OM?$tШ$(EꠡQA% E::55 A| ^UzRWG≌Uo'鋺N F8CjU 4ҭQ3@Q"3DPãҁqň8ɥ JtW*Q2 Zi1K4If4 =XbqrL5f?0hi@@_-z 2=,,*uOx Zܪ /6rpLO=8LΙ2a(C`b|͐jq)npK46L83@ E6$#S5z QJ qC'3#3>Qf&a C3Bv#3f *Z.dzqS>d: i^H<2C -5)H3uj; ,#ptg:e\|O=m P$S).5a]pGdt(q; ڤ{LNK(Ɯ2&\NH`i脛4+5#uFH;cBXSg4z·9 kgT{9Ī >ª| 1@OVYs *L:P2㩬z٪a'L CWx2Sb9 ȐG_`20dO )u&4 IA bT v2m uUO@E-k[kT:T=)"UV8!s[bO]gu5Ƹ7 "$`NM]Gi*܋y m^WPU* K'2Mi]ENFdTj(,T90`rG0x+Zrn,Rè !ED Nn(5QI T:r$2LCFKG8C-WT+')¦C<` 4;mUR,%O…cPK_a@[BKzh7*Bd P4EC \0Ē i4$hv4s&`ѓPe* HlLQN[Cbب?eG]€K\Cf,Ue @9}$% XySVq(HmU1Z HuJ R"Dm(UwdP(yJU$E]AC)RƇj 08DA[ŁZ2 oU+"J6+#NŁ +qx Ry%ѝԩR z~n&"m-Ud*!%ki&SX X`}NLQ~;A~[Jf2_}8R?a|a@onoûPӯd3X[>M t`:2=>KϢ_.lw+2'㸯gY6_̋ޞލq{?_Vˏ?rgyg˟M/[X^ lJ'Uᴉawz}~rj-{B>q<yKPwp8`q0,x s/ny兼Kf0(._K.[r,{z< ~PK!'6UWc Hxl/charts/chart5.xml\r}OU򫆃;hٕ;쇼 wF{av RYWlg(rwzt5_~axB4-7W/W˷ax}- ]ma pw:tͥl[{9>dv~v/nfq7 ߮gXܪzZ}<]M'?><v~u?f;{C|X Mb^_d,VqO Sln廨|k> >VF7Я*=.7⍛a̱;'Vw 'aǒ ݴ^#Qa4([cv,†m4t`f!a#4+{ $C%Z`,^ IѪ.^ 5B/^IfY)E2/`[^e*D ^ Q9^9+BnVFx!洡F E ZQ2  9<@ c6t(ؘC"l…sc68J!nK6DZQEpEƬaC4Vaesc6T?C†lZrR ?j3ٱ 9j_Ǭ "fb:U d A5nsS!8Fxαbn)P4` V.RӘ)rΥ F [nVPXX$*՝1 8|RH6|5~~^atCX)!ٱm#`/E`?91LvV+JlcRVL$gEʦO Hŏ?V$)BXN2͕B AzdB D2K5`Q_@/A eR$YdK J J)P~_ Pn!AK]@=!۫ mA2 dK0ENa 3X#q. c1XL8)0^8\q b%DAf&-DA5vc(*(0Py26Am B6Y`6E,td׃i-OdVk8[n62L L?B t$xcwbZ/ϗ (M \͆ L ަqX<'%vTJ@vz LbnӺ̬IUx\Xcc7T}M Ls+mPZlPpf5ٹeUp6D69"/S}GĮf. 8yQ}tA#}"֞xsʕJNYU}QlpTZTvM"6 lSaHdc*>Ub=85lSp]įQ ;ɱNE*DU\! щeQ|J ݑT8'G@^bp:@zqL\l^5r0z?+LEkU,H1H9&W\oعU 6<au8,?C_O/f?Y/}7(L wF0?o'ΆQ%rO"~קIwJ?$׉77盻r8LOǧoY{ W7Wlh;+*NT^EGxp1|%X"Yt?ֻw }[nZW/ᗾOSΓAF?8ތeqCx %rjI*ǧ>~ۤ[V yB]w?/x4|M'u? 1@;ptp][7xHE| Mx@_L/S?0GG<PK!hTdocProps/app.xml (n0 @Vzذ I3+ӱ[$Hc$;ɟWFgqH4һ,~~G@PY|Dߋ(Xh]2e EuPJ3e$>6&gB]`qc/M #{>=,Wkk%WJ:MI l,@A:EGp6NFBy0%9B?5(h١$"+xq@Sۆ֓ lPB MG)"9f%1~Sm;g9`OSX5͊)f(b_hjA p s{kcM}Mp~rPQ[ie;hxv>H7Mq]_].$9.#<[-I%$Nq2Y%Y]i̷Ytp?lţ@CjtAa5x7PK-!)r[Content_Types].xmlPK-!U0#L >_rels/.relsPK-!͉4dxl/_rels/workbook.xml.relsPK-!>w xl/workbook.xmlPK-!ʊZF xl/worksheets/sheet4.xmlPK-!mTԽ+#xl/worksheets/_rels/sheet4.xml.relsPK-!J1U+#xl/worksheets/_rels/sheet5.xml.relsPK-!b +#xl/worksheets/_rels/sheet6.xml.relsPK-!E+#xl/worksheets/_rels/sheet7.xml.relsPK-!o+# xl/worksheets/_rels/sheet8.xml.relsPK-!c+#!xl/worksheets/_rels/sheet3.xml.relsPK-!=d+#"xl/worksheets/_rels/sheet2.xml.relsPK-!<+##xl/worksheets/_rels/sheet1.xml.relsPK-!Kw`$xl/drawings/drawing11.xmlPK-!\ PGx&xl/charts/chart11.xmlPK-!t]jF6xl/worksheets/sheet3.xmlPK-!rC D3Fxl/worksheets/sheet2.xmlPK-!+#Txl/worksheets/_rels/sheet9.xml.relsPK-!Ȃ,$Uxl/worksheets/_rels/sheet10.xml.relsPK-!fw,$Vxl/worksheets/_rels/sheet11.xml.relsPK-!܌%#Wxl/drawings/_rels/drawing8.xml.relsPK-!x %# Xxl/drawings/_rels/drawing9.xml.relsPK-!FJ&$ Yxl/drawings/_rels/drawing10.xml.relsPK-!ao&$Zxl/drawings/_rels/drawing11.xml.relsPK-!^o%#[xl/drawings/_rels/drawing7.xml.relsPK-!ys%#\xl/drawings/_rels/drawing6.xml.relsPK-!Q%#\xl/drawings/_rels/drawing5.xml.relsPK-!D߼%#]xl/drawings/_rels/drawing1.xml.relsPK-!&ꇻ%#^xl/drawings/_rels/drawing2.xml.relsPK-!%#_xl/drawings/_rels/drawing3.xml.relsPK-!v7%#`xl/drawings/_rels/drawing4.xml.relsPK-!,0B!axl/worksheets/sheet1.xmlPK-!@=GAgxl/charts/chart10.xmlPK-!R5WS!Hzxl/charts/chart9.xmlPK-!CAH xl/styles.xmlPK-!Kw` xl/drawings/drawing1.xmlPK-!J ݓxl/charts/chart1.xmlPK-!"*xl/drawings/drawing2.xmlPK-!FExl/charts/chart2.xmlPK-!bmqxl/theme/theme1.xmlPK-!3%zHbF6xl/worksheets/sheet11.xmlPK-!G7Fxl/worksheets/sheet10.xmlPK-!_Gxl/worksheets/sheet5.xmlPK-!6qkG:Gxl/worksheets/sheet6.xmlPK-!