From 91e8ff98e048ab8ca9a03264eee71b7433189e9e Mon Sep 17 00:00:00 2001 From: "Sadie L. Bartholomew" Date: Wed, 8 May 2024 10:19:10 +0100 Subject: [PATCH 01/12] Add all docs files untarred as provided by 'ajheaps' --- docs/.nojekyll | 0 docs/source/Makefile | 153 + docs/source/Makefile.old | 153 + docs/source/_build/doctrees/axes.doctree | Bin 0 -> 9714 bytes docs/source/_build/doctrees/bfill.doctree | Bin 0 -> 8584 bytes .../_build/doctrees/cf_data_assign.doctree | Bin 0 -> 8251 bytes .../_build/doctrees/cf_var_name.doctree | Bin 0 -> 8106 bytes docs/source/_build/doctrees/cfview.doctree | Bin 0 -> 2400 bytes .../source/_build/doctrees/check_data.doctree | Bin 0 -> 6209 bytes .../_build/doctrees/colour_scales.doctree | Bin 0 -> 106672 bytes docs/source/_build/doctrees/con.doctree | Bin 0 -> 17023 bytes docs/source/_build/doctrees/cscale.doctree | Bin 0 -> 9759 bytes .../_build/doctrees/cscale_get_map.doctree | Bin 0 -> 6620 bytes .../_build/doctrees/cylindrical.doctree | Bin 0 -> 5859 bytes docs/source/_build/doctrees/data.doctree | Bin 0 -> 19633 bytes docs/source/_build/doctrees/download.doctree | Bin 0 -> 7741 bytes .../source/_build/doctrees/environment.pickle | Bin 0 -> 130238 bytes .../_build/doctrees/find_pos_in_array.doctree | Bin 0 -> 7540 bytes docs/source/_build/doctrees/gallery.doctree | Bin 0 -> 14973 bytes docs/source/_build/doctrees/gclose.doctree | Bin 0 -> 6545 bytes docs/source/_build/doctrees/gopen.doctree | Bin 0 -> 7871 bytes docs/source/_build/doctrees/gpos.doctree | Bin 0 -> 6731 bytes docs/source/_build/doctrees/gset.doctree | Bin 0 -> 8878 bytes docs/source/_build/doctrees/gvals.doctree | Bin 0 -> 7065 bytes docs/source/_build/doctrees/hovmuller.doctree | Bin 0 -> 6207 bytes docs/source/_build/doctrees/index.doctree | Bin 0 -> 6126 bytes .../_build/doctrees/internal_routines.doctree | Bin 0 -> 4082 bytes docs/source/_build/doctrees/irregular.doctree | Bin 0 -> 10907 bytes docs/source/_build/doctrees/issues.doctree | Bin 0 -> 5030 bytes docs/source/_build/doctrees/levs.doctree | Bin 0 -> 9066 bytes docs/source/_build/doctrees/license.doctree | Bin 0 -> 5558 bytes docs/source/_build/doctrees/mapaxis.doctree | Bin 0 -> 7872 bytes docs/source/_build/doctrees/mapset.doctree | Bin 0 -> 13851 bytes .../_build/doctrees/multiple_plots.doctree | Bin 0 -> 4242 bytes docs/source/_build/doctrees/ndecs.doctree | Bin 0 -> 6885 bytes docs/source/_build/doctrees/pcon.doctree | Bin 0 -> 9889 bytes docs/source/_build/doctrees/polar.doctree | Bin 0 -> 4908 bytes .../doctrees/polar_regular_grid.doctree | Bin 0 -> 7331 bytes docs/source/_build/doctrees/pressure.doctree | Bin 0 -> 6808 bytes .../doctrees/process_color_scales.doctree | Bin 0 -> 7509 bytes docs/source/_build/doctrees/regrid.doctree | Bin 0 -> 8081 bytes docs/source/_build/doctrees/reset.doctree | Bin 0 -> 6467 bytes docs/source/_build/doctrees/rgaxes.doctree | Bin 0 -> 10230 bytes docs/source/_build/doctrees/rgrot.doctree | Bin 0 -> 8073 bytes docs/source/_build/doctrees/rgunrot.doctree | Bin 0 -> 8162 bytes docs/source/_build/doctrees/roadmap.doctree | Bin 0 -> 8987 bytes .../_build/doctrees/rotated_pole.doctree | Bin 0 -> 8172 bytes docs/source/_build/doctrees/routines.doctree | Bin 0 -> 3568 bytes docs/source/_build/doctrees/set_map.doctree | Bin 0 -> 6832 bytes docs/source/_build/doctrees/setvars.doctree | Bin 0 -> 10467 bytes docs/source/_build/doctrees/stipple.doctree | Bin 0 -> 9219 bytes .../_build/doctrees/stipple_plots.doctree | Bin 0 -> 5623 bytes .../_build/doctrees/stipple_points.doctree | Bin 0 -> 8793 bytes docs/source/_build/doctrees/stuff.doctree | Bin 0 -> 2832 bytes docs/source/_build/doctrees/supscr.doctree | Bin 0 -> 6847 bytes .../_build/doctrees/user_defined.doctree | Bin 0 -> 4763 bytes docs/source/_build/doctrees/vect.doctree | Bin 0 -> 11422 bytes docs/source/_build/doctrees/vectors.doctree | Bin 0 -> 5166 bytes .../_build/doctrees/version_0.0.0.doctree | Bin 0 -> 5280 bytes .../_build/doctrees/version_0.1.doctree | Bin 0 -> 3203 bytes .../_build/doctrees/version_0.2.doctree | Bin 0 -> 3661 bytes .../_build/doctrees/version_0.3.doctree | Bin 0 -> 4057 bytes .../_build/doctrees/version_0.4.doctree | Bin 0 -> 3573 bytes .../_build/doctrees/version_0.5.doctree | Bin 0 -> 6305 bytes .../_build/doctrees/version_0.6.doctree | Bin 0 -> 18629 bytes .../_build/doctrees/version_0.7.doctree | Bin 0 -> 4156 bytes .../_build/doctrees/version_0.8.doctree | Bin 0 -> 10994 bytes .../_build/doctrees/version_0.9.doctree | Bin 0 -> 9531 bytes .../_build/doctrees/version_1.0.doctree | Bin 0 -> 7309 bytes .../_build/doctrees/version_1.3.doctree | Bin 0 -> 21517 bytes .../_build/doctrees/version_1.5.doctree | Bin 0 -> 20554 bytes .../_build/doctrees/version_1.6.doctree | Bin 0 -> 3297 bytes .../_build/doctrees/version_1.7.doctree | Bin 0 -> 5550 bytes .../_build/doctrees/version_2.0.doctree | Bin 0 -> 3151 bytes .../_build/doctrees/version_3.2.doctree | Bin 0 -> 26940 bytes docs/source/_build/doctrees/versions.doctree | Bin 0 -> 8286 bytes .../_build/doctrees/versions_0.1.doctree | Bin 0 -> 4432 bytes docs/source/_build/doctrees/videos.doctree | Bin 0 -> 7789 bytes docs/source/_build/doctrees/vloc.doctree | Bin 0 -> 7780 bytes docs/source/_build/html/.buildinfo | 4 + docs/source/_build/html/_images/cfview.png | Bin 0 -> 65100 bytes docs/source/_build/html/_modules/cfplot.html | 4021 ++++++ docs/source/_build/html/_modules/index.html | 79 + .../_build/html/_sources/cfview.rst.txt | 4 + docs/source/_build/html/_sources/cfview.txt | 4 + .../_build/html/_sources/download.rst.txt | 74 + docs/source/_build/html/_sources/download.txt | 48 + .../source/_build/html/_sources/index.rst.txt | 35 + docs/source/_build/html/_sources/index.txt | 16 + .../_build/html/_sources/issues.rst.txt | 27 + docs/source/_build/html/_sources/issues.txt | 27 + .../_build/html/_sources/license.rst.txt | 18 + docs/source/_build/html/_sources/license.txt | 18 + .../_build/html/_sources/roadmap.rst.txt | 57 + .../_build/html/_sources/routines.rst.txt | 20 + docs/source/_build/html/_sources/routines.txt | 22 + .../html/_sources/version_0.0.0.rst.txt | 52 + .../_build/html/_sources/version_0.0.0.txt | 52 + .../_build/html/_sources/version_0.1.rst.txt | 21 + .../_build/html/_sources/version_0.1.txt | 21 + .../_build/html/_sources/version_0.2.rst.txt | 24 + .../_build/html/_sources/version_0.2.txt | 24 + .../_build/html/_sources/version_0.3.rst.txt | 28 + .../_build/html/_sources/version_0.3.txt | 28 + .../_build/html/_sources/version_0.4.rst.txt | 22 + .../_build/html/_sources/version_0.4.txt | 22 + .../_build/html/_sources/version_0.5.rst.txt | 51 + .../_build/html/_sources/version_0.5.txt | 51 + .../_build/html/_sources/version_0.6.rst.txt | 157 + .../_build/html/_sources/version_0.6.txt | 157 + .../_build/html/_sources/version_0.7.rst.txt | 28 + .../_build/html/_sources/version_0.7.txt | 28 + .../_build/html/_sources/version_0.8.rst.txt | 145 + .../_build/html/_sources/version_0.8.txt | 145 + .../_build/html/_sources/version_0.9.rst.txt | 100 + .../_build/html/_sources/version_0.9.txt | 100 + .../_build/html/_sources/version_1.0.rst.txt | 78 + .../_build/html/_sources/version_1.0.txt | 78 + .../_build/html/_sources/version_2.0.rst.txt | 26 + .../_build/html/_sources/version_3.2.rst.txt | 326 + .../_build/html/_sources/versions.rst.txt | 39 + docs/source/_build/html/_sources/versions.txt | 49 + .../_build/html/_sources/videos.rst.txt | 33 + .../_sphinx_javascript_frameworks_compat.js | 134 + .../_build/html/_static/ajax-loader.gif | Bin 0 -> 673 bytes docs/source/_build/html/_static/basic.css | 925 ++ docs/source/_build/html/_static/classic.css | 286 + .../_build/html/_static/comment-bright.png | Bin 0 -> 756 bytes .../_build/html/_static/comment-close.png | Bin 0 -> 829 bytes docs/source/_build/html/_static/comment.png | Bin 0 -> 641 bytes docs/source/_build/html/_static/default.css | 1 + docs/source/_build/html/_static/doctools.js | 156 + .../html/_static/documentation_options.js | 13 + .../_build/html/_static/down-pressed.png | Bin 0 -> 222 bytes docs/source/_build/html/_static/down.png | Bin 0 -> 202 bytes docs/source/_build/html/_static/file.png | Bin 0 -> 286 bytes docs/source/_build/html/_static/graphviz.css | 19 + .../_build/html/_static/jquery-1.11.1.js | 10308 +++++++++++++++ .../_build/html/_static/jquery-3.1.0.js | 10074 ++++++++++++++ .../_build/html/_static/jquery-3.5.1.js | 10872 +++++++++++++++ .../_build/html/_static/jquery-3.6.0.js | 10881 ++++++++++++++++ docs/source/_build/html/_static/jquery.js | 2 + .../_build/html/_static/language_data.js | 199 + docs/source/_build/html/_static/minus.png | Bin 0 -> 90 bytes docs/source/_build/html/_static/plus.png | Bin 0 -> 90 bytes docs/source/_build/html/_static/pygments.css | 75 + .../source/_build/html/_static/searchtools.js | 574 + docs/source/_build/html/_static/sidebar.js | 70 + .../_build/html/_static/sphinx_highlight.js | 154 + .../_build/html/_static/underscore-1.13.1.js | 2042 +++ .../_build/html/_static/underscore-1.3.1.js | 999 ++ docs/source/_build/html/_static/underscore.js | 6 + .../source/_build/html/_static/up-pressed.png | Bin 0 -> 214 bytes docs/source/_build/html/_static/up.png | Bin 0 -> 203 bytes docs/source/_build/html/_static/websupport.js | 808 ++ docs/source/_build/html/cfview.html | 75 + docs/source/_build/html/download.html | 117 + docs/source/_build/html/genindex.html | 77 + docs/source/_build/html/index.html | 94 + docs/source/_build/html/issues.html | 99 + docs/source/_build/html/license.html | 88 + docs/source/_build/html/objects.inv | 5 + docs/source/_build/html/roadmap.html | 125 + docs/source/_build/html/routines.html | 92 + docs/source/_build/html/search.html | 106 + docs/source/_build/html/searchindex.js | 1 + docs/source/_build/html/version_0.0.0.html | 115 + docs/source/_build/html/version_0.1.html | 86 + docs/source/_build/html/version_0.2.html | 90 + docs/source/_build/html/version_0.3.html | 97 + docs/source/_build/html/version_0.4.html | 92 + docs/source/_build/html/version_0.5.html | 110 + docs/source/_build/html/version_0.6.html | 186 + docs/source/_build/html/version_0.7.html | 93 + docs/source/_build/html/version_0.8.html | 156 + docs/source/_build/html/version_0.9.html | 147 + docs/source/_build/html/version_1.0.html | 121 + docs/source/_build/html/version_2.0.html | 82 + docs/source/_build/html/version_3.2.html | 282 + docs/source/_build/html/versions.html | 105 + docs/source/_build/html/videos.html | 98 + docs/source/_templates/my_con.html | 4 + docs/source/_templates/sidebar.html | 10 + docs/source/_templates/sidebar_orig.html | 10 + docs/source/cfplot.png | Bin 0 -> 232879 bytes docs/source/cfview.rst | 4 + docs/source/conf.py | 262 + docs/source/conf.py~ | 262 + docs/source/download.rst | 74 + docs/source/download.rst~ | 62 + docs/source/images/cfview.png | Bin 0 -> 65100 bytes docs/source/index.rst | 35 + docs/source/issues.rst | 27 + docs/source/license.rst | 18 + docs/source/roadmap.rst | 57 + docs/source/routines.rst | 20 + docs/source/version_2.0.rst | 26 + docs/source/version_3.2.rst | 326 + docs/source/versions.rst | 39 + docs/source/videos.rst | 33 + 200 files changed, 59271 insertions(+) create mode 100644 docs/.nojekyll create mode 100644 docs/source/Makefile create mode 100644 docs/source/Makefile.old create mode 100644 docs/source/_build/doctrees/axes.doctree create mode 100644 docs/source/_build/doctrees/bfill.doctree create mode 100644 docs/source/_build/doctrees/cf_data_assign.doctree create mode 100644 docs/source/_build/doctrees/cf_var_name.doctree create mode 100644 docs/source/_build/doctrees/cfview.doctree create mode 100644 docs/source/_build/doctrees/check_data.doctree create mode 100644 docs/source/_build/doctrees/colour_scales.doctree create mode 100644 docs/source/_build/doctrees/con.doctree create mode 100644 docs/source/_build/doctrees/cscale.doctree create mode 100644 docs/source/_build/doctrees/cscale_get_map.doctree create mode 100644 docs/source/_build/doctrees/cylindrical.doctree create mode 100644 docs/source/_build/doctrees/data.doctree create mode 100644 docs/source/_build/doctrees/download.doctree create mode 100644 docs/source/_build/doctrees/environment.pickle create mode 100644 docs/source/_build/doctrees/find_pos_in_array.doctree create mode 100644 docs/source/_build/doctrees/gallery.doctree create mode 100644 docs/source/_build/doctrees/gclose.doctree create mode 100644 docs/source/_build/doctrees/gopen.doctree create mode 100644 docs/source/_build/doctrees/gpos.doctree create mode 100644 docs/source/_build/doctrees/gset.doctree create mode 100644 docs/source/_build/doctrees/gvals.doctree create mode 100644 docs/source/_build/doctrees/hovmuller.doctree create mode 100644 docs/source/_build/doctrees/index.doctree create mode 100644 docs/source/_build/doctrees/internal_routines.doctree create mode 100644 docs/source/_build/doctrees/irregular.doctree create mode 100644 docs/source/_build/doctrees/issues.doctree create mode 100644 docs/source/_build/doctrees/levs.doctree create mode 100644 docs/source/_build/doctrees/license.doctree create mode 100644 docs/source/_build/doctrees/mapaxis.doctree create mode 100644 docs/source/_build/doctrees/mapset.doctree create mode 100644 docs/source/_build/doctrees/multiple_plots.doctree create mode 100644 docs/source/_build/doctrees/ndecs.doctree create mode 100644 docs/source/_build/doctrees/pcon.doctree create mode 100644 docs/source/_build/doctrees/polar.doctree create mode 100644 docs/source/_build/doctrees/polar_regular_grid.doctree create mode 100644 docs/source/_build/doctrees/pressure.doctree create mode 100644 docs/source/_build/doctrees/process_color_scales.doctree create mode 100644 docs/source/_build/doctrees/regrid.doctree create mode 100644 docs/source/_build/doctrees/reset.doctree create mode 100644 docs/source/_build/doctrees/rgaxes.doctree create mode 100644 docs/source/_build/doctrees/rgrot.doctree create mode 100644 docs/source/_build/doctrees/rgunrot.doctree create mode 100644 docs/source/_build/doctrees/roadmap.doctree create mode 100644 docs/source/_build/doctrees/rotated_pole.doctree create mode 100644 docs/source/_build/doctrees/routines.doctree create mode 100644 docs/source/_build/doctrees/set_map.doctree create mode 100644 docs/source/_build/doctrees/setvars.doctree create mode 100644 docs/source/_build/doctrees/stipple.doctree create mode 100644 docs/source/_build/doctrees/stipple_plots.doctree create mode 100644 docs/source/_build/doctrees/stipple_points.doctree create mode 100644 docs/source/_build/doctrees/stuff.doctree create mode 100644 docs/source/_build/doctrees/supscr.doctree create mode 100644 docs/source/_build/doctrees/user_defined.doctree create mode 100644 docs/source/_build/doctrees/vect.doctree create mode 100644 docs/source/_build/doctrees/vectors.doctree create mode 100644 docs/source/_build/doctrees/version_0.0.0.doctree create mode 100644 docs/source/_build/doctrees/version_0.1.doctree create mode 100644 docs/source/_build/doctrees/version_0.2.doctree create mode 100644 docs/source/_build/doctrees/version_0.3.doctree create mode 100644 docs/source/_build/doctrees/version_0.4.doctree create mode 100644 docs/source/_build/doctrees/version_0.5.doctree create mode 100644 docs/source/_build/doctrees/version_0.6.doctree create mode 100644 docs/source/_build/doctrees/version_0.7.doctree create mode 100644 docs/source/_build/doctrees/version_0.8.doctree create mode 100644 docs/source/_build/doctrees/version_0.9.doctree create mode 100644 docs/source/_build/doctrees/version_1.0.doctree create mode 100644 docs/source/_build/doctrees/version_1.3.doctree create mode 100644 docs/source/_build/doctrees/version_1.5.doctree create mode 100644 docs/source/_build/doctrees/version_1.6.doctree create mode 100644 docs/source/_build/doctrees/version_1.7.doctree create mode 100644 docs/source/_build/doctrees/version_2.0.doctree create mode 100644 docs/source/_build/doctrees/version_3.2.doctree create mode 100644 docs/source/_build/doctrees/versions.doctree create mode 100644 docs/source/_build/doctrees/versions_0.1.doctree create mode 100644 docs/source/_build/doctrees/videos.doctree create mode 100644 docs/source/_build/doctrees/vloc.doctree create mode 100644 docs/source/_build/html/.buildinfo create mode 100644 docs/source/_build/html/_images/cfview.png create mode 100644 docs/source/_build/html/_modules/cfplot.html create mode 100644 docs/source/_build/html/_modules/index.html create mode 100644 docs/source/_build/html/_sources/cfview.rst.txt create mode 100644 docs/source/_build/html/_sources/cfview.txt create mode 100644 docs/source/_build/html/_sources/download.rst.txt create mode 100644 docs/source/_build/html/_sources/download.txt create mode 100644 docs/source/_build/html/_sources/index.rst.txt create mode 100644 docs/source/_build/html/_sources/index.txt create mode 100644 docs/source/_build/html/_sources/issues.rst.txt create mode 100644 docs/source/_build/html/_sources/issues.txt create mode 100644 docs/source/_build/html/_sources/license.rst.txt create mode 100644 docs/source/_build/html/_sources/license.txt create mode 100644 docs/source/_build/html/_sources/roadmap.rst.txt create mode 100644 docs/source/_build/html/_sources/routines.rst.txt create mode 100644 docs/source/_build/html/_sources/routines.txt create mode 100644 docs/source/_build/html/_sources/version_0.0.0.rst.txt create mode 100644 docs/source/_build/html/_sources/version_0.0.0.txt create mode 100644 docs/source/_build/html/_sources/version_0.1.rst.txt create mode 100644 docs/source/_build/html/_sources/version_0.1.txt create mode 100644 docs/source/_build/html/_sources/version_0.2.rst.txt create mode 100644 docs/source/_build/html/_sources/version_0.2.txt create mode 100644 docs/source/_build/html/_sources/version_0.3.rst.txt create mode 100644 docs/source/_build/html/_sources/version_0.3.txt create mode 100644 docs/source/_build/html/_sources/version_0.4.rst.txt create mode 100644 docs/source/_build/html/_sources/version_0.4.txt create mode 100644 docs/source/_build/html/_sources/version_0.5.rst.txt create mode 100644 docs/source/_build/html/_sources/version_0.5.txt create mode 100644 docs/source/_build/html/_sources/version_0.6.rst.txt create mode 100644 docs/source/_build/html/_sources/version_0.6.txt create mode 100644 docs/source/_build/html/_sources/version_0.7.rst.txt create mode 100644 docs/source/_build/html/_sources/version_0.7.txt create mode 100644 docs/source/_build/html/_sources/version_0.8.rst.txt create mode 100644 docs/source/_build/html/_sources/version_0.8.txt create mode 100644 docs/source/_build/html/_sources/version_0.9.rst.txt create mode 100644 docs/source/_build/html/_sources/version_0.9.txt create mode 100644 docs/source/_build/html/_sources/version_1.0.rst.txt create mode 100644 docs/source/_build/html/_sources/version_1.0.txt create mode 100644 docs/source/_build/html/_sources/version_2.0.rst.txt create mode 100644 docs/source/_build/html/_sources/version_3.2.rst.txt create mode 100644 docs/source/_build/html/_sources/versions.rst.txt create mode 100644 docs/source/_build/html/_sources/versions.txt create mode 100644 docs/source/_build/html/_sources/videos.rst.txt create mode 100644 docs/source/_build/html/_static/_sphinx_javascript_frameworks_compat.js create mode 100644 docs/source/_build/html/_static/ajax-loader.gif create mode 100644 docs/source/_build/html/_static/basic.css create mode 100644 docs/source/_build/html/_static/classic.css create mode 100644 docs/source/_build/html/_static/comment-bright.png create mode 100644 docs/source/_build/html/_static/comment-close.png create mode 100644 docs/source/_build/html/_static/comment.png create mode 100644 docs/source/_build/html/_static/default.css create mode 100644 docs/source/_build/html/_static/doctools.js create mode 100644 docs/source/_build/html/_static/documentation_options.js create mode 100644 docs/source/_build/html/_static/down-pressed.png create mode 100644 docs/source/_build/html/_static/down.png create mode 100644 docs/source/_build/html/_static/file.png create mode 100644 docs/source/_build/html/_static/graphviz.css create mode 100644 docs/source/_build/html/_static/jquery-1.11.1.js create mode 100644 docs/source/_build/html/_static/jquery-3.1.0.js create mode 100644 docs/source/_build/html/_static/jquery-3.5.1.js create mode 100644 docs/source/_build/html/_static/jquery-3.6.0.js create mode 100644 docs/source/_build/html/_static/jquery.js create mode 100644 docs/source/_build/html/_static/language_data.js create mode 100644 docs/source/_build/html/_static/minus.png create mode 100644 docs/source/_build/html/_static/plus.png create mode 100644 docs/source/_build/html/_static/pygments.css create mode 100644 docs/source/_build/html/_static/searchtools.js create mode 100644 docs/source/_build/html/_static/sidebar.js create mode 100644 docs/source/_build/html/_static/sphinx_highlight.js create mode 100644 docs/source/_build/html/_static/underscore-1.13.1.js create mode 100644 docs/source/_build/html/_static/underscore-1.3.1.js create mode 100644 docs/source/_build/html/_static/underscore.js create mode 100644 docs/source/_build/html/_static/up-pressed.png create mode 100644 docs/source/_build/html/_static/up.png create mode 100644 docs/source/_build/html/_static/websupport.js create mode 100644 docs/source/_build/html/cfview.html create mode 100644 docs/source/_build/html/download.html create mode 100644 docs/source/_build/html/genindex.html create mode 100644 docs/source/_build/html/index.html create mode 100644 docs/source/_build/html/issues.html create mode 100644 docs/source/_build/html/license.html create mode 100644 docs/source/_build/html/objects.inv create mode 100644 docs/source/_build/html/roadmap.html create mode 100644 docs/source/_build/html/routines.html create mode 100644 docs/source/_build/html/search.html create mode 100644 docs/source/_build/html/searchindex.js create mode 100644 docs/source/_build/html/version_0.0.0.html create mode 100644 docs/source/_build/html/version_0.1.html create mode 100644 docs/source/_build/html/version_0.2.html create mode 100644 docs/source/_build/html/version_0.3.html create mode 100644 docs/source/_build/html/version_0.4.html create mode 100644 docs/source/_build/html/version_0.5.html create mode 100644 docs/source/_build/html/version_0.6.html create mode 100644 docs/source/_build/html/version_0.7.html create mode 100644 docs/source/_build/html/version_0.8.html create mode 100644 docs/source/_build/html/version_0.9.html create mode 100644 docs/source/_build/html/version_1.0.html create mode 100644 docs/source/_build/html/version_2.0.html create mode 100644 docs/source/_build/html/version_3.2.html create mode 100644 docs/source/_build/html/versions.html create mode 100644 docs/source/_build/html/videos.html create mode 100644 docs/source/_templates/my_con.html create mode 100644 docs/source/_templates/sidebar.html create mode 100644 docs/source/_templates/sidebar_orig.html create mode 100644 docs/source/cfplot.png create mode 100644 docs/source/cfview.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/conf.py~ create mode 100644 docs/source/download.rst create mode 100644 docs/source/download.rst~ create mode 100644 docs/source/images/cfview.png create mode 100644 docs/source/index.rst create mode 100644 docs/source/issues.rst create mode 100644 docs/source/license.rst create mode 100644 docs/source/roadmap.rst create mode 100644 docs/source/routines.rst create mode 100644 docs/source/version_2.0.rst create mode 100644 docs/source/version_3.2.rst create mode 100644 docs/source/versions.rst create mode 100644 docs/source/videos.rst diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/source/Makefile b/docs/source/Makefile new file mode 100644 index 0000000..b9e44f2 --- /dev/null +++ b/docs/source/Makefile @@ -0,0 +1,153 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# 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 " 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 " 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/cfplot.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/cfplot.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/cfplot" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/cfplot" + @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." + +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." diff --git a/docs/source/Makefile.old b/docs/source/Makefile.old new file mode 100644 index 0000000..1ba6bd2 --- /dev/null +++ b/docs/source/Makefile.old @@ -0,0 +1,153 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# 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 " 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 " 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/cfview.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/cfview.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/cfview" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/cfview" + @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." + +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." diff --git a/docs/source/_build/doctrees/axes.doctree b/docs/source/_build/doctrees/axes.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4b523385e3b2b0c90db2f7dca7ff634f1b0b823c GIT binary patch literal 9714 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/bfill.doctree b/docs/source/_build/doctrees/bfill.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e3477c51d0183e88164597cda0362208beb9b4b5 GIT binary patch literal 8584 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/cf_data_assign.doctree b/docs/source/_build/doctrees/cf_data_assign.doctree new file mode 100644 index 0000000000000000000000000000000000000000..25943a85345a4333b83caee2895931c3a0868d26 GIT binary patch literal 8251 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/cf_var_name.doctree b/docs/source/_build/doctrees/cf_var_name.doctree new file mode 100644 index 0000000000000000000000000000000000000000..575c135fbe9d5ade9f968ca695d451ac11968f8f GIT binary patch literal 8106 zcmbtZ2Y4J;wU%wwwVIVU7&|5#62~iINe(tn;xs}@2nqs{Oe{#2VRq-PW~AAfy=P`D z334HZ1S~=iy%TCkXaPd#z4zWb@6maW-phaP%xst8gHNAkcFsNb{HNV>+qE0Zc2JHZ z*9)ipz!qVSKdZuza&p7u5xG&xO$B4fx2hsqt%*?fD%n?o@WKH+K@ ziE74_lf%$zM9EQTMb>f{#8eh?%;+)tAq{%V@p4#mTz_TSvhCC)5thwz;78i5Ef6rF zP#&zd2ZQsqN+EOxYkVUz*pU!(-cPX#Osg9ol4%NWDG>sf_D5# z#z3l(%o{l?ipVX+5nOt*l6Nf_gLYhFzEGZ0GzQ9^6^8hIYS9=hS>+|-fb1$7n_N4T zrxoRHV{^GOg`iGp*#*n!OFB;$<=vbCD>iyP*BA2i*^Q8#ri)D8coGQxc zj!+^6JeWQMm+e*Z47jW#UGDCTJKLP?&Q9kfqfhh8eGZJ+UvN$-I;R$$T}9`#qBB{H z9l$#PbpUmbc2{2^R*=94I>es|*PW&0*?@K!YHwV!;!;P#xV|k`a`GS)Jx9rNv)Dqh zIo3-z%kx;T^9!sFluERlgnN->>@`_Tk`=!A>1}m}W>Eyk#BLxl_eR=@MdDM))ipwMFA#2T+ zKXe_-xt?GU<>Xbc`)VbNZ1+H2p=nq*i_~S4hP6p)2l+5I$n28AS(N3&odeC1qy^hb zN|v+CySjUxYLrAL8#)OkE9l`IYSLt=&LbCC4d+;DxKN|LfGx88anv)>_BPC-1&gVGK>q*Gc4|hr* zcYLlN%doqZU#`IHRV5#h=^nxCdal+X-NAGI##qk-AXEw2UQ z5hWj!Azq^q9U#Ev9b+-@z15t2ETFGb^7^a~Jj@lUms{oISb@hEj9#%)BcqpR7J0O- zGBoG?S_eo?_%;fdxq>MoC!YYY8j>R}W+Guq&2%YLibk`a#6#?ntGl zV9MqeE>*^+FtX)S6LpNuphHVcfNr$bsHMyvS+pRc`7t=wObS7m&W}bPnqAvD6eHiS z<2XL8eI9Uqo~d&3=}`SfC7)4O{h4W8@k+a|6qLP8zGLlBvBY zpNm*MPs!(Je!nrvj{XEsz99J=ZuXyiA&5Gb&V;V$O@$&|o5&Y rK)GWF>|zNBMP zWdqHU7nGNB@})5ICM92%sWstjpT7u>Yg%TctG1BJsTb4NbZzw@ViscV@)zns*?&P^!5P}4b`ReS9*ReK$R`rkmm z9y#y^CEo}WoLc~WvyQLBF}O|1H)S!%G}6v`b2p7fGiSY};ILnASMsgwmlNO@tP$7? zmB90YWgQu^1<5;{TW3dsd0Vr&Z|f$!zD9aG%sqz0cfgu=D)}z9<_<`{J+X%MdAE}9 zVSW0bk6*^RP`mvl!kLHl|#RWBnn20MQ*| z^M~C;4`!D94=h}uE^LW6p*R> zZcz8`-lN}V?9Pj*JS~6LP0^osQ*2TbGO_7ld3&_HsedhRdL4NaEu)-f zw7k9lTHYD!$UCks5B^IQ*}P^QZ9PMzyQ4e1ZeJ?K=<~#3;o&?{dRz@r;*XX%f2uZ}w- zoI7Wu5xKJqnSLo&^m)Ca&tv};=9k^b3E~I~;F4$gOL<;_Pt!qkKysafm!fmE=%k7; zvL1PhoV3ZDfyADOz^=~B?uxvh=hp+ z8%1<~w9Ib6aU2R9PEctU--<59v*7gOZ@?+UY}W%oakg1JwHTWtviz_T5NaaLp<&J# zsf)#~Hlzn?DG$Qa7zBZZhxA}gyo`zC;cB%McxKisq{~4r(iPmerA19G&(N(`a_jMJ zT}{n!NHfec!w`1i+Uk%VqNxwXlcQ@4XMW-wq^m%lGbZY`WQX)2U9Gzn@nr35SjEH6 zhiUdf*G?U0;v0?|X;wC*hwH8ucOA*}NHi>grl`y<;|Mbra^=WOjt4@rbvMC{gQ18b z?3F^Q;InB~#5R)e0PNhAmKWoygBH*pkb|cpmwAne%%3KojKj*MkQUJbJ&yxkfYrGz zcv~<0G7foZ32k%6FjdOvfV+&CJn}#@b~sT~J2*2F1p%&BToF~K16r8T$NN-ejv@H1 zEc5}qkMEP&)GL;oQQ}AWWtm{pCKim4z@TRem(+h#yA@gqN4+R56+-R zGP%zdrFem^VM)fgsFnn0%&I3sM~H|N=xfGKRK!{wttbCcEU2GVD@XKb{utp45GG?ARxOY0cOq{KIsE z7M2)Z3q@?h%Bn|C)Z}rL(g1nvVxW+3c_BSX(}&NCX!sgImq-3W*gF7rf?BK&*bkh z({@9vgaD*Ye3tGzghEq;7VZi?o7s58StWDXwIhd~1Ip~6G1{7>^ju~fy>RaGOU(Iw z)BC5+IQzg^^gJdGWK+ZQ`D=gEiQ2z?aYrxUu46dOjBq{0BO0NJ=!KvjHHH=hDyqfN zeh~n@q ZTfkbR+ws)r=e&}5D?Sw6foEKr{wM5gO(*~W literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/cfview.doctree b/docs/source/_build/doctrees/cfview.doctree new file mode 100644 index 0000000000000000000000000000000000000000..04faf23ddabe96610fb6d1dd46c01e66d6f14515 GIT binary patch literal 2400 zcmZ8jO>Y}F5KZjJvTRAV^HCH?+#)EFG)OEJK@UZ*JsS0)XnP9?YRMG|bIC0~Z21tN zJp`x$-opOhKJKp8mJAr)c^u9RXWq>C@4eY-grVZmR#eHUqP;u?k zm-P0Z^eKHGN0weY6Kug#d;pC?NX0DI>0^r1tnQ_9v+n-T@xn`^`|DyL_QddG5~Dcq z(kp)NB<>aEmE_l{Q+V_{UuDNV{yDWF?9~(weG(^eMEVHDZrtkvyNHjJ)I42;1&s&P zdn*^g<3afWyOOya?66SOIe_>cXj-*j`z+LV!h#l;mX}#4#G$9le3ZnIcrM1`h1eCR z@!edQiqENLH}j%ALpTn9^E*hJ&Q6+Hhlsy9-$6{`TLdCr!twgaRD6e|yxKtC0C@|? z;+;5v!`;@Qc)x9AeN}W9`ZS35@u{~|J4JI5NNvs1a@VF|;Eks$oj-^NYaPxYhV1WQ zoEE|6B$Ga+<2BNzHtsv_z0^z4yW_9CB%bH3|2v!cvFyElza-u14L+VQhZz*v3Yb+6Wj^T zt();UKLA8?0{KyRP>K^p^)k>UN4gp09Sn*1#PY&eMi{R_6S$G!$OZbq=n`*4IwS*8 zc_~*(?8PY!-jF*e?nrQJ!a`M(o`1+{14vNMYO1oqqXuc1oojyw)s6>d$g0YGI_9g| zI8N^0Y$#HAawVN?`FTW`babKeL%Jx3>%KsbjqwoHXgeh?dggLxfBY& zAnzk(GVjN(qUf@}0-D+(QBNAV6^Swh?NWPM2#R=6__o=QB%aSR~g#2V%{m237n}GoS}bj5Q5;`!^yJ(T9<@ZR4Rh? znWt$>$)Vp=q4~`A^u!ozH a9ZFrOz%oUaxmpJ-&$ez1%$ZP literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/check_data.doctree b/docs/source/_build/doctrees/check_data.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9afc8be508f62c573fa05414bb7adc7aa207efa4 GIT binary patch literal 6209 zcmbtY2Y4LC6_#b`B%LMM5*Tc3Ea@_Q+x$$aLbe)o6hZT1`@t_e@ZO5A(Z@6tt1tG1w zbsw#dX+u%;gyu9GM~91^6eDdESu+fkQ;b5mE*H}gdC_Y{Rptxm$b#r8xn>aH`>2BG zEt;i0iXDG+K`dt4R;-vZ#5J# zbz$Q1@YZNdV|n|~*6@$pYwXqbT6?{HxaijGw8aM46Y}D%C;lVaKq#Wrgijf!SeEG6z7Gc7AgXveeUY?e+2%pEbE0&dZf z;F@GudYX1JtW)!h2AC3Xo8d)7TRAc)&}n%@-0`MeNvBV3T#)7YkzC&Kauwf-T$xLP zI$~!;M@VOwuxv6ltPM77xKftR1hlhaI=cm07thi;jO^Sz^4m|Ko;NQtmR~U)kItX! z1d{69BG`WMM&7P;!Bj68%8{otn=V9HAyZFXWM9~XjV{hFavZZ7frH!&BZWX;0+LGqPHBmuHGisv?j`K(XDp_O<@mrmmS_- z*UmRvf87DB=On_8%F^|){f3wdYH8G1{bgEg9&s_SR-e zWWuy!Or=^9+|WLowUz{v1xzxgGFI5Tn~?O?d1#tp*h|510Hfv5z7a_F#N^hH$R&{A zK!krnsaz+(9<2b97n5IGT64~@hO~g0s*DZi&Z3i`?jm)7sMO_TDS*N-rU(kP8I43_ z>3bJTUt@cGn$4tUH~485X3xd+xEl5lX4f;du96-f6>ZjfQ%o^yj9-dC6%7=(o-RQe@yc=>9^FSBbbXe zy6?GjS$Z0bx-F)s*VZ6*d_Z>bEIotOKQk}7s}+pY(i@0THK0YmUAES2IuWF({S?p+zrD z(1;bF10*h4C!BAb*b}V~$gne`yC&-IhFCoX{yD>{I z2J$;%dPyDmOVgmx%fvtp_$YYy(96xH3vP{lJIj3q0>x+Y^-1|qpjRSPuZro_HMif9 zq+KS_N3ThS{mt&9*Mb-o+l5l^vy$(Hx`KNhu-+Nd>ua)c5I3DwDI2|kWBbO%sa3zY z=uNH8U{@GL*DvkK(wm{=u9)6ZQ*x)hcItds*i`hSrDC8;slU@dW7WBx2yTEo)|<}x z<@EAwt|{M&6wEf%(c2j8+uMMhSXQea-m$1sNh0@70KGe=cLC_sb^vS?T)EMl9^|4x zs+{9hqcF$bK@FPY+A-$@7^5&Pg=2J&Kx`~71K&Ntg~VNODp1-ZjO;y2B6}}_|0p!S z52^D0m_7gl?0ca3Zk+};+jVbDA7s0Bz^+|3;NqX@!4w?Lp6TY4kMi4-pjkYH+L>*& za>cn^XiIJP7~N;LvFJnXEUMRPABIJbO6Nyl(??_a7~6CoY`V8$)5l}_1lt6YI@%%o zWIJTb>&2G#%l$EZie(H#M&qnUy!C({Xeam6?c{dVvg`lb7RLYkG5ugE89!_%qj#Zcg<< zrYb9aYg^fCOgBOwMrASYs}=Z-RX_8J;hM(`e$d0dJ%Jj)3~(LHyFZr zKe{!t%9ctrKuVB3tYr`K)m=48euY~`fjUT22ST4U)*v3t0=xMoJ*QUl_ke49(-E3J zSZGOg2-7;Hrw-+hK3upGZJkP0t-+Y_>lhiX+$&wR7BsXc`e7-WN_d*0W1|k!j9J@s z!<20uvvrGs6kpN{QR|t{-ZClHBjUa?V2ZDc(qw4kc69N%0c>Iw8xUZj4gD^hp$=zq zwPQ|8a9_uZD#k4D zBy|*M2f;TxnL+F`9QZhpp_mI`~E? zD=-D=z8RCE7jvVVwrsOho`*wn)j&mnXlqmD{r|Qb)tS6MQU+8{g;U2ySEH~=CHONP}(eU@hytvb`)Fu2e zh|ScTHxnSvi*?DlAzi7@HN+*fjkKexE(HsAVH!}qy8?9?hy`(o-fE7AXN2x{OOHcu zsY%T4$J5lDLAoTQ%R%A`M!T|pDO|y_qoP>ddgMs Silcd~uEii$*WouRj{O%cc{kYr literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/colour_scales.doctree b/docs/source/_build/doctrees/colour_scales.doctree new file mode 100644 index 0000000000000000000000000000000000000000..419d2115f45561449139a55f3184c556272eb8fc GIT binary patch literal 106672 zcmdqK1(+N~^!AG<1b2r4x*>riWFvzHg3CaVu&_u7lif*Xi_Pv%?QR5U+}+*X-QC^Y z-Q8X8`=09Rt*zcpn(zDHd%t_1Cz~jXGtJc6Sk{Hcwn>x9 ztxbiNa_hvd^2ADEP@&RVEw?sSnhKq5g=(dxy)dP@vkJ$Swk};5-_qRL)LQB2sLe6D zVID+@$2%I!Er{M{biPR9BWr; z>zLBq(c#9Z%{{tdaj4pLrT3}MGrFsOfsU^69i7dc*h6itVV>S3hriS$9;% zO~OiI)jMkQkF70GKW}4~*4TC9I-#lT8ryW4>e@o1>lZ9{b+%1tYwK)n z>#U6H=q&5b+QOxo>-%sAH#c?E7Kv($_OH%SzYh2Apm^^NvU_)s-M51}+Xivp4&uIr z8~5#??tQyhwNL##@o2oli&y*BFUkEnD4wiU#r7qtbJo}Oo>ca!xa&b&{6Qmz#Nv+H zlGT3o^J8}olHEBd4z^TvuKJ<92a{cCbNkVjuFhRQuycyS6d#>wH2b;ig>Q+@|1Z01@$x4&w(9{U0MsP zv((QKkFVs1(Uo@H)!N*MCvd;o%JKwRt=cxJvKpS6(^hNm!k%dySM8kCvRdPW_LepP z(q3(Dow}OYMdM7hgLOw|t^dLM*9JtjRmRu%=`2qq6}46C`^06|2G;j0cXsOL@m-x@ zZctPk+`qnWQ&&6vI%=zpt?$#=Qts%$_K>mleaDv@_s}G^ZfyOmglp*7+OX>4<@(u; z|M0Q35!F8BuKL+iAfgDFR zG{={C;n%5#)fK8MRR>g8t)E>KwUJfSyKevLYGbQI##ZabR)>zQ4jAC3ymt&J^RO*rMq{n>-1s<&HvYTlT&yH*0_Yl`1Whu^X}bCRW-cjk}cuR99p5-m$#<#RJ?$NI{0n?Zm)vBBZ-;Cl#b#O~%a!3D3&8;H`tubUE z-g-_Q$+n}j(mt|o$bf!ykxIJ{L(ZJ$>5-t;%(*GN6_`4yWv!0(GTzGVQQsHuGVu0k za;4Vd&M1Bjo8Lk<36TA-*Hml8?re){?U-8qOsH^Tue+14*LE>#SPUK2I;_IJ?Dp$+ zs^L9iRO{;P$+3{FdvfZ9p89^ZDF{C`s!iisW2y0m2!~X@A=Ju}^O?7EZ{hAPiq?_Kj-$G0a9NY5TT9BR=x*XjH8fTDvBV$EO#( z+M0J)9eiOZ$HzLn0X9ysbrks8%lDPKV{mQ%ZXC>O!U4S%vZ!6I1F@U`$8sNpoqljs zI|LJ|vW|Vtv767hB@d}cNFd}<9Wv~qn%)(tgJyzb}b2=mlLW1g7EdsKUSf-P%T z{#dO1|9;-uaai-?quL3WhCI=ZGHcFf(}_{-Bs&~Go2v2*I=MF_mbZnS(q8~SHL9J) zwc(Q`2K+?#Npkx1g2YdfGosp=(~EIdZ!uO#JxR`vYUeP_^EsX*!NzF}z+S{62JNazlb4zw}!9Iz6iSu;gd*x<4^E&7}p{u1Z0k7#3nky|$9fc|K z&U;#0SD{))%I>$xc(acK3*Nn%H_8P+J}Z!Sf;=(}uAS?!Bk$tQ>ups6yL-+DH~;@! zhzo%7g;DJy?CL5Pl-29;Ll_)6e4t@q)oTu zt#vQ%Is7oDH?u=@8G0f>Gg`dUvq1Jg)w^sPMxr%pe{7i>83(bvq zw}-dx66L*%P`CXx$&x9>CI9Ik`K# zpXComwTHMzGT$T&@8wzUtdG1&czC)`a*0rT#D9`M$|w0Fy+6qxi)xRvsOg2dy!%FsO+CI35fdIxPU?y@z-r>xsXX z-P=!MZ~xz3R_!V5v8SWjGgt&U7(8b77*91m8`Yk(!}ee>kZ+-%??Gwph3XPze8Q-` zSnXTpsj~I#3|{JA@!>+w!@brcP5c=q3H~~kX9f}9 zz}()9YHuNVmC;`|bK_g{x1-uStZ5U}G^Vo+XJ+uijrZL+9iS(UkDs9CP5FdoJY(e? zTU%?T+giXmor1i`<74Syywtzz)Gtrw_j;>;lwF+nQUCv7_75=E52M;goGUAN+su`3 zgg=gIpKz|rW3EF-j3^8#6beK7aV!4cPew3`zB37Vf%-Iy(~ayzKEp(Eg|2;$8o!8Y zU!oXc?c?tK@l{m&nl)BYoPB2{`j<$-KqGfp&BAj!*Uw4!Iq8 ztA?|49R=sSww^M6aOc!coR#BoTvy6X+^bzYDA&GmCM$dF+ururW_F_AVWR(!*7rTu z>xZcJBljt5{i=JP{uI@I=6V&dUhbQd^vqZ0p~pV2WS9PuwM)0OGyN4a%@euy8!G%g zs{LX2=uc81KmYOo@@G{0%UXIIK>qHr&b5E4%gO=d-|9Sa0NEz4L(eqxOf$(bM9++^ zNY5huK)w;%CgU41Ju93r9hJtrr9YPHT}SIz~|uobssd5?kf=kWwI&O zm(Z-|6qkO+rQt^GqxB2;M#X+Ynb5}5lRWDj^DN&MPT{%!rnV`qEp26<)|b=H{5Uas z!}Yf-Y#4usx~2UNbxLJC-dc24@HF5-RX&l>d-IL9jK8*YgY(@8PcWOKoaB?YIymKw zPgC(HC->RaF<8%q`kjU3GeplVb4oAdwsx1zL(!=J&(3*Xl#hKpADT$dFOvhi4@5U&M|mmJYt%Jo8GaMnsMjFIXxWL+=9&AA2ldb@UuiU2Q}dNFK8dU5Fo^0jgA z5DY48#jlOW_+K0AB^W+btk8WPEGZG4lHym@q=cm?81=uBacL;Aa?7BJ^s{iWla3dZu(&xWT(M`@NWl*0n?g`*xoKR-O(+AEFy^eV6- z{;FsqJ&>;QdWZOfq~pc!3*nUJrp{_n`8&MzNFhH_IsJrto({4hx}+)Xk-AH((BUEuJU@)Nk?S?j5>-f-URCPu@UJF z#64)34TtH`IMu2*q&-xO96xvD(6^EJ`C*Ht2FBc&&ZD|xY=S@A$7I*;A|1clZU%RyUB$qS75#3meq4s0skj?=r`_&_GCGkS zFOnG8M(L#UGZpnsY>8F{8kN7ZQ!rq!?13iIEfOM7aRwIR?G-z}N#fsX{0(Jo((&_$%FeGH_9{;K>zZh_ z(Kgh9GUv>l{c=sNwumnr!5dR&{`{!V18xTcm~Z7)LX3Pu-N`E4qg_*^yD)~&`HD94 zQ9o3iAQrB=Y897V;K|lar7}QTQYOPO(o^u5kTz91>6NggOrzbd8duX%_}RfX*%{HrRnMfRuyKMEYO} z5vVu=3&|km5b;0M_#09Vla8N1RCa!c!!D#8A=)F2_CJskmuyKniUD$w;t2K8timJZ z7>tn=+AJxYU@lUQg=3_T!(&3q@zP1JgeBz!+AS$3ivA>5e{zPNskk#wVM|g@#YUu0 z6ZfEDE<9f*HCB1KAFuGyr_(J|OyF{IhPeCH6-&D^^qF)Xl?rthhC#{MXd-=%1PD|d zpG9O)a<2HFXZ#H%=S#=W9x6Mx3t$&YE)?xWM%%Djj^l|lcgx7dlp98ZtfPr1)0eOU zkC00-MnY(_gm7}X2)PW7k-i*{2_aWVC%p=mkSl4ogj^;1t6lvy8G5GTZoHN)3Aqj% zk-lEsgNA-s1DvF496C-8Bsb72RE+Nea-(?r#T83q8TlqUkMbkkj8X7$3z|sZD*8ah z;aNfkAGeAB?Z)5maffvL6kSRNRM;u_Yak zV`9a`1KV_yD|9FbT+RvJ%c?10~mQ0O{AZb z5P^y_u#gN!o)`ZYjK5*zMd|qYLuKdp670gr%c6b7Xmh>N^eEY4@+t$&;FTsN)UUA$ zkCfLjMp9_Aq;P_{NO=Q}k$w}82`O($C%qDul(%WOq`V{gcU}E^8G5GT&U~LON%;U9 zk^WHJV^VabvAKQdxVjM} zL(1&Z@$-ku&TkIbg_J&`?Q69EjTDw_Ntu%Y@{(eOx*x0XNSO;`B!xCh3MZJ0l)2#; z>3Q&&kTS1y(ko#}nU8i$%KV~Vz|}99p=T=Y%!SyJl!dVo=|#ldC1u#Sx*|zgl#Zcd z3YV0{MBvv~ER`92aXP!C*kDV*fMd#%Xd=Coga}lefrVs{vb6XwWBd&%%Sy-3A1XV) z9ES>a9 zSW^1aZb=y+`c+*0su_Bw;?5k%mZS{AMx+OeyGzRO_ERM0P;mwpl0nJ{@h=*GL(1yX@$-ku&TkFag_Jc#yOz=Z2U6ma zEh%d=KrT`op_$3|O2=x# zIEbmB!C7I65U4l-%g7*RqWD*hzagesI)3_4+1V-Bg_u1=+hVj0LomC1#F*JzRwhwz zSP7@kO1Dn8vIdWmHjI%H+AJlUUM@=7;TY)}9urEmbkgf!De0iyQqn2}M}L(f#) zlT+A|lBw8;^fYk~8W!lL#2jLV^1aKRbPg5MxTx$UBEQCBslo(%(|J@zzz9b0vJV=Z z8;pG77_%(#e&htRng_nawd$7?qjL6SR_c~Z;4q*@j4X^3# z^{l=*P{+qe^TCK(gf#3`i6>GTyRbjjbCE1G=cF?rt_%Y%RWoLO7?8432qCLlG8;1W^ZsI-9FN4ly z41*0X5}h$NmYVZei$~4*7$Y^bS!y`VT-00u$4Fm@$Ap@Tq?29`OU=c!TWT&5{iUw{ zvJ5>_aj#y^megE<)Y$FI7a#|JSJ4!EuHlIEfx3BZmGCe^!K^?`!n=R z#l80cTT<~LHX{9yxSRJX9XObj@pZDCkb9VZp<)J?j7P-ZFRxgtGWMf%Ht$t>#Ci7a32l}VPH(!D@LGr29?hC{_-^I z(y{5^21UQaG@)XpF;l!MTfZxjozmh<$dXdtqrm)q>HlKp_YnaEet-sNp(S6S;&M1W zAy6%cGk%!wN8og41^>4#gr z*KkA4EPs%2Kf2+5l8(PfNk#f+*zE-qzli)-SN>auoSC>dzte6Hg@2$E=|4phFV0`m zNvCHj>i=fTL*YNzi1feW?p(Ds)2y(Eijmzz;LI5AakX)bYdd4kLXC6P)~x6QyxGu1 zdUjC;Dh|xF8Hc_(#J`X6H;2By(#f99oUqGm`iXWfqjj#dnwt)xVrX|d^N6D#w^)+t z%u8qYa;^C=fceaiCejOtG*EG5CidooBUXH23@?`15v1U%!v+J)f)ZmP6T{4LVd?m_ zbOW;p?UtBDMZcJThW`dHxrO{7Cn1}YBBwB8Ea*{me~D;s~a zn*F8Yrwx^z%>dZt#c~zVu4=Rm{d2sPVx{&)av*i)MRJ*}w^7z#4`NRDc!dkC24jpb zj3LfUhSF}=ZJ6kXyZR9sdZywYE3zd8t79Y5 zYlyo!S;%?f4h3BmbH5P$L4jVA-l1Y1mx;ARmVM!T;tSA1XjK3jded+i`gv!oz1K5R-4Mn?=(dIf?n6BIMvN59=UNTP>_O8~O zupW<|O)*A#XtVTis=4Ud433fB9FGY-TSzCpCYGKO?UtS`MZcA+ADy9RD(>5@*^-`Z zuo3BP#oc@ru@sI2$cuF_PuhTe{jp<)UboG~Ks>noNz8GL&>n=d7L2CIhw%ZohJyUUKR@su2 zW^6=SiMu)NV<)_|+>Qva>_Oj9F^daJi)j23i={5cpG0SK+9wsS6*lnFh9=VO5+zV^ z5|)#}OHKT>@i)A5NXIV$7b;_%RdllD1;Aa{i1cJ}4|1LM@vFATOkoUzOy+5y-n4ou zYw@U=hA~n@o27=+%tg(faE$a`cuc6-TRQ3Wu+&7fTWa`A4IoMF@X!r!Q$>$S1e6t=tJmiF79+g9g1PFau}LOA1(m` z6~|{08LS*3{zn>r!^%<8@w4MnWsI|cquG*`W3UnFW5qqlb#bRtu*Kv!$_*x&7k7Fx zeLO4h2sr^`B!o6g2q%||kQ3n;>67r75OT6~(yL$zIfZsh$f=?~&DEctp=T$M z;1O~q#z+WlmJm)Z7a>={G16D#F(Kp{>7-Y|5^^o=mXPa2f4!@}Aw$npT*VvNl8~FQ z5$T)7J&@0m8` z3@Yvt|GSO9q2eCt_<3<vher?dGIA&K(>#=ygiXd?ZR zr~?%TXZj2tUKamXjKAUGRq6PtaUn9snf*1k<)Y#pIN~HK9uq3wlTLd6mWuajw^V!}`VU?GM;Usi;`)8e zmQ;L#jYxkg?m8=n^UhccJ)PT>Z+5r9Bz;3p$VL5#~z_fr+os;MAvx z0~N<+@(d=v5&v(EzhUA#>G+v($uY*6{Cl=!;sh%>vO0_J^ zL*WcwF%p5Emsvd$=EE3Cpv{uN3FRVTemLShEglmR7L-nU=9YwoXtyLREc!)U{h}Fq zrsB#i#+D>3j*Un!A?|_PB6ZWvwi`2M`*G#gHry_MnqHEgp<)gfiKRs07g#Lq&FD+h zc~o!FmVpIqEQTmKo-1G>S&0!0Br9hfFw#oBGVAbY>5nneLYt+9Q_Mxn060c^6+9-itSX)KT3A{J z(r#%PB>KUwezgoeQ*kYauq7>Z*ogE{agS-?C)KTR1K-xpa$Qjmqi3j?!=+`oDEtD8 zrHIi-&^e~1XS5tH|I`!{4u!Rl8&Kb3Ky2GMBvv~EbYVKqv>qU zo%Rg2H4I>78#FjyD2tZXO#V~oFHWqaxP`EeyN##ur=Te7kPHgKL++=E=_ zPJ5JWQQ_SqVpKBEou-6(CsyH+vNOg=3T>7YPB0fKyTCEhyW%k+Wvq14D`835jdn}Q zIMMI!>dP5=rs7JDXG>BVu@UJead%0vf4^R#W2l(IC1rvL{Q8QeeHnZron2CFuqq57 zr5O#**Gh;$#Ti&g1}S@pe~a-qq)d{IpC8u_W1Jltbc zU=AuXAjJ`C%_=-nIxt33XtShng1JcPgd^^}fX9TC$EnIYc^sc3d`$aTahWTT*fuHgIlM-1D6c^Zu%xj2uC^VI;_Uo8rmz zkr9EC9wLYpOolgmZO(Qu6PF?dV}IaWI9Rj`B{N4q8Dc+sEW>QBtjGZk0yB(@~v zWNbwG6md6y4Bx6-#&tC7Jt`ggRC_ng$%(K}Sk<5F_HsQe;}r30AZ20ELo0eXpe zBdnn1CNwxxD{%r9r(sDMwA>>8w;F##%Wcx}i@?>v7-t=~vn4HeU;}4t#ob&Gn4cEA z5|)~~7{ySNc{MP}eS&v80Js2ZBv{`yM)m-%43&%*`hsT7T`=yg!6HCtnv|D-} z6#YZ4{^1NgQ*linVM}@*#YUtb6Zh1OHXf%}s2Ja+<_Yokiz}86WaKC5oVwA*Qy2v; zPou%vT+s(A4$l%YXn9urpELf3mglA8C&v}T7-#+$*pikPv4Qis;-2r=!h0c@TZ~vr zUZ#2m$CjQd{R;DYbi9f&(m|W0gHy{z$7^tm^y_#`=y*dq={2x)yh*#I<1Nv@?dspj z&@&a+@Ljf~<2`Id`h9Va|A4i}jW#}@W2l(I1>{2!`1KV_2Qm0ZbdLXkwMVdzVE`ka zpuxFa2@$9`0}IJu^|!3TBjr1ckrdi2DV$&~Qoe^{q<_F;LduWQNw0(@)3_Slm$^ME=ENAOpv_XjY2~7#9~>h+7akKT=9W%+{+5b)Xtz|%EBg6d{rnkv zrsCdPfGw$55F3$RNZf;lIq>$ZT{pImtJ4e9BUFs-GO>tw`h^ushcN1*bROkKSqvi} zVsSJ$<15-g#i5xxgNP-?e<|Z{h*(-We&SHs87%|55V5Rimor-bhdz2eFK=dSc_>h6 zcvvp$-DrL-infgo?3U8U~A}Us$npD5I`MXNQKNdI&~9Lme8N(G_i= z;?PW;LBlZdA8z~&4I`xECk~aJQ4w~bVRg~2VYK;akni94!m%cmd1x@-*saC99t~?_ zj5N?@Y2cJ{(Xb92BRvw22@UH?Cp~vd!+Nw^8b*nJeOJFhhMuXo-!^1R8aBd4q&F6K zhlXK#6MBS-v0WNA6;HpgV(BnO-Hgr-4a4;27y%7ipurhi(FQ6G&D0q*Y$^U*8Gl2= zXzBQgLuF^QHS9veHlp3uX!Fw`zvx36wxco+4WiIvnAf9WdyJ6=+AIy6QZ5?m;TY*1 z@R-oBqjb`9w>0pZ)`W(gM8C7E-z7uORNQa7vLy{;u@ULr#J!hW7>uJ|sF=ZJVt4WP z%PW=+XY4Yad%1D-i+}Ctw*FWK_g|g7G(GOq7nFK2&ygRoI1$X3;96 z&Gl!2@gG>r{p{>(#~#!hKEmwR4&L6(xrIRsL_Q^xFh)vfvy^apxhQFcW2D>gm{8I# zo%A|bN@}#*V}=%ehpX?*&@&bHWEWdfG8r4Vy{))s-NIlhokPVmE-KSR9 z(mCrE27AE>UiLY0bkZwg$vJ{{OU{v^Kg!h~ zouOwc?$~44lAL3)f!p1Rd&Vscj;C*^n8gL>1kv~<7E4Dm{)u$XxP`$2yj&;#*BgJs%MH@;^M}gL??%{#mzzX;v(e@||KXNwVY!6?3@q8_KYXFSl~s78 z+=eldLYpOp6U;@*?Qo3r9e7Mgxl=mnm9V7TMY|>CZqeW4>hI0aGZlB{eQZg}{n)_m zaK+stMeg|cARR-+6fP+biNLR~SUQ@)AEvWMiUfNE29WY78l1b85P^y_u#gN=9vA;7 zjK3k}N$L3cLuKdp6zoFE)1rOGX#X22_AZcoi~B4CeJkBjtIFkrdi2DV$&~ zQeJ>#q+i5iLdr|hNw0(@noOyVeoh8?2=-Gy$b_Kc@GWF<4TA?#Ti&g1}Pti|A)rk zkn)jq{QRM^^ZOWfA>|X%ermM;ffVO1kR;_Z2FOK3Xha8Fh){nv!rl>xk&jE zj*FknXgZ%~rNckNN&f`jmK*bqYNCqi?ivM56-;naRbo~6Gvh(`~ zb|K|o(awa^f>_)CK#Fr0NRl!$1LPvb5$ai>@=2K$Vw~t%^Rxq<58l2^oIDv}Ou%rxT78d_SjK5)KQR((dPP# zaPuzJy^*GU+p;917;rMb1MXd|mtsBMab{_ZksjJCJ)CMTdX|ABer*ho2|de6C%q&$|fX?RcYHXMd zF$5YmLW6U^A`Vm>o5?e1*hKs{HU5T%&7|XJ4waqL=CBJ5TZpz~w7LGSCN9?UuqCC2 zheFnAH%FqkVrGws(HJ8Uv{@oJsa!;C4aZ1tgU5u3ZKac*y(MBh+AR@dM8CbOug}mk z6?feZY)Qn9*uZUV#ofD!-%j)i6{EXI>@2>1X~oisjJpe+y_@*$iZL)T77fk-i#kwo zaHh{-Vx0KzZu|`sW$E~-LuF?*9(G}(QM64)o9laB_lA6Y(@~+;K#}>quB*`#nA@Xb zBF0DsZI%j7D;E`2I7Ye|j|mk@I_ddaD)yk=Qqdy%Nv^&%L(f#)du?n_sTxEj4Lb9+?mhcQw?o27!&%04HYL!$4?z9JFAmm z7b;E`?I}k4U#LjF&jwxr=sY~a?j;@->cU+<=0sF=ZJ;vVt$%PW>nW$b(D+{^7> z@54CAxE~G9%u0kn#R*tO1{n{E|3k*#knyl|{Pdx+vwH+~A>&ceK4!GJzUTFC2(#XB`a1mtYw##}5@V!}ye0l`8-K&cJJRuUhsw_DUD$<>_eA@?(KZaiyk>L- zdopi(@c4jY1IG$kaP$!A51HK~<0Fib4B9LioLDY0K87Q1MT^ITj8CPLUI9zSXS7=~ zJ{SELuKvpmJyUT9e#Mq#e2ooUa4YWSoM=Z^Ye%)YwPJo7@>@EFiYZ(=z7v68U$JyL zgMUwFb568pupeLmAwQzQc~}V%s5k=)$spus@&Cp68$y1Sj-NkNc7DIXE`_bHNO1=0<~avJxmzaUK?xLCw74KcDe8)XXm(zlu=Vxh?>^P_v+D z7c$z0)pHzIdRYt0&cY01*x~K%d%dVNL#`KLMc%PyQH+rw+AKkwY%YQpgJYx@$74d! z64FVpiX~`C+ATp#iGFEUzf6XnsknQWWy@pDa@dG;LEO#X#&lM2^C9zV*2~i?RE+O} zvx0d0#T83uGV+RaHh&xAL<%qpUP3fD3oH6S#o<{(1}`g%e}Cg|co`raKY6I^%vOP2 zcv)4n1C2Jcjv;W2bR8ZOI)+Lo zy#|(!VYFL1hKqiLt1o8gnTq>xb+)8q4Q${FUU3f^=EE~ZW^0ZuYw$Nw)}m{un8Zb7 zZISpD7E5O_{5o_V)oZwsFoBbG(cm1d1PN4}gT-WUGD`f{H~xl`4W#2&5Gp&z4Ph5f zHWKZ|M%yqf$8p750}IP03}Im5eV%(grt~7!o3av*n9VRoVra9(aFV%**&L3M-U5#a zF(v7wSHlvsCGD1&twcZC)o-1lXDaT}ZP=2SZLxu?e8t_|Ys8r{ff+;3P%(!K%=V)2 z3oMq-X7qYGn|qCT(RP3ZyzGbuXK*D(pyCuPC4-lp#D8bwZ+O{7I(`A6vNPNjcHw2L zXm>N(Tz97FS+m7u93vQ9R?dNo{rQ~TA@gY|V~n)WW@+IRbI~#$j*)J}V?s-lbkb{K zX{pd|X_+AUiLSnyp=T=Y&t|ryMPVb-dx(4d>eJTV7XM623%x?c_%11v#M>{fSUQK1 zTj?CX`gBKX!zd_eM}srEq7PIYo+V^ZqQ$?%_!~+(rQ;_Lm7Q4^>_W+8(M~bie6K!9 zy_S%vRL|(ur-w>UV}9>gvM0t!2W^%PPAwN5d%-c%d*d;oBa%*f4J;k|&~EA2SM>Y2 z`u#KXOvQb809(>=AT}a>khq((YEve*R_aFRgXs|}#&*d#L_Gb%iluWI^-wySvubga z!!QCW4o8DCx}ptK9Ga;!s5nymk23y-ile3DCk~aJ(J` zP;mhooY571pyKc>A%lvG#Q$RBZ>YFLI)3s{*_mAmyHIhNXfHR~T*r#;dMz1OP(6cV zMNgH!lKDM4uEH4Upv}_3sZEy-{t`*@D@rQ$>q%EbAL(oGXrS?aJ?UC8ILoB3W5T87 z*ORX2=3MgYNf+B+Pr5+_{Pm<8v4xYo(huY#Vb*ULwUqV5N};i>rL9XBCY9Se3jNm| zF(e-77@%)vo=~yWm>>E1q+2AkQ(OFdG)XPDQZVX&EA?#%0pM;&gA02lVW8rAI6(o< z{(jP(;&qqt0%o>k_xF?T7Hg{LAf!+Ro(!CPzz9b&b%-$~@my4dipTrXQ^m%}O z_6Lt1L3L_;&lIh(qjCO$yx&iHM8ZAlhI?%K;nwaoT>SewoEN2&PR~@-zr>bD zy_c~O=~u+v`Te9W5 zo!#G0`UC@*&!=c`X{|^D6-Q=bZ$8ue{iM$&#up}rnd6tz@oVV@<}2DQF<*=R8(05r zhMuXocfOul%rxA^~K{LPyFD;+;` zsO+3(!VhZ7E9A`B!2J#Ih?kID*Ehw*+Ly;!DK#&Tg{%)-jzrJK%0QUo6m*Xr7M|aK{}6` zPSAzm09qDC6X``HRG{KaEG&bTMa6$H<8NqLTsnRo_|-Lxvy>&+@~${bVgtWEChkGQ znwam5zJcm>JuEv*Gmv3ta27k60rWDg$|Gr6jFBYTEJ>VjE|QjmBhJ|3F(GMr>7-Z2 zlC%QtmZTL$AGrE3L(f!P*_GImq?NG|>HgwwzS(v;(gWy+TL`dm09r--{ql;Xs~CG# zI-75{d&C-uad0yT4SvQ;}`6H3;SPI?_IC2P}eDOpGK zBVGNv8G5GTo?MSDDH(;0NUtyM<}aAt`R>rnW6cJ1#{C7@IH+tWBEQCB>1rm}h|cCO zn9~6_h7r7Mf+o_NN|->!Sy)g8FPn+~=EmRfvW0Z~8bW2~S%O`7*;2Gy8Evk=U`~~7 zp&88}2Aa&jVD43{w`MgSIon{2P5eU ztKTt0&s5y84QxryPS}X_&f;#qZ`h!v`&EkE>_S)EeSnR_&8{NxD=e0-Vfe9hHs3e+ z;dX-w)Qm$D>D?trpyC`XCWD%?_>VXKhMGp{_!Wf8&anx0p{63*2}Yai`v$LQ%gjWE zFwFGNd|m3fe3a@cbUrc77$Y&XSz}(>~g^hhgyRXqU^w0Co1+%q4>_?peBJnRT9Dp%WK%1q2)5%4_fpEmxT0ABc94wvmye$QX&~7O>RP=|r`olByOvOER z1Y1&YBsL;_l(?JEJp7?8{MMsBnl8AD02>E{W5m_3tXR5^VUMM=`OIU(9ETyWa6Fnw zpCIBu#j%+@gM|~t|0LsYSU6cae&$fwIh_K#uyCqqPczzFpLyb9Ee@wsYH%oIA0K3y zgorbk*?T296JsQTHcJF2m5Ye8;D|G}cua^mM>^@*TO!V--4b!0=+Afc7i8#}io5PY zwj|;rY()BEaqs?xJ`k~~E>F{!&<*zrVB=76skr;q6-(DM^ksDJ{)Ijp>T(Q&j4RMY z`br59s5m~0$ROh?@xR*m8#1nuj-NeLc5c_gE@WIM+Ut!r_b>Ft1zS39pxn?A%zzFq znGkX#EAR-p31cLLHcJR6my3{_;TY*#@R$&Ct8~(SQ4SyX(i^u5VB>&tpQ!vIi=`Ww;eI-szbEY_ z;sdaPmj}_{gsH>{RGfw-W$^N__&;L&4KI&M$1fsOcBYTPF1$Q0+9!-Q*WZ(->$ccD z$tVV!%)ck?U9F#DJsv$zV~q6BX6fNnbJ6n*9C5n^JSOx!C!O?~SbCnP-O}@d=wEd8 zFJhn zjb_haZ^8g(-a-@Uw!U^Ugx%#g&^i0K_`3+l=@+~$Z{hhd*Z?QLM*|CcEsNd5Aw+vw8Ao7EF`h^usH!Z3{Tvy3rs96?lyuUww?r&WyCq^7 z(J$-jm&?#I6?a{MEs0nj84cP_e3X{M@0k^BM@dP%%ifgN-)V-+?6M zS}s~gcOX4PdI+<7WYl4dWYA{G;KXu~F%*uG9)`z+jN#HruYe_E1nriLqUcw5 z^=oA4nTk7bO|~RsEo?-3ZE-iR98HzZa&wDbhaR{M02>F3k>cqWRxI7hsO!?%ymG`* z*24&x7=;FBYegHVI5bmdFtLI7Z)p4t6B|j#PaG;cqm5w~CN>f6rbe6VmBZ9(f!K`7 z8N70IEA-~f>(Q_U#z+HgmIh8K7Y!viMtVy;CNyj%o%Gx-4WntdG;A&UZCw4f8G5GT ze%p>MX&8fzNN+Fh=9Qx|wNqCnm32K`a0dW34h}nrt6y2MbQ{C&NN4lPVZ-oG$H2o* zXmAcz#DR)qGkFFNyNLg;#^3NTRyuy>P}w={2D|VuPPDrlZLU|2xL6BBnbH}&aySw_ zo|!!&8Zky9XtP9cQn`p|f+OyffX9T03DQZ=-V!m9c1uK6^v$kbW$2lTyKWD*B%%cy zk)9;(<}(OCsmmu=Im^*XN8AH|jl)Ho2>kkrrP~?2ozCVnNY7w37(jG=6WW#=~qcA;acXr~!%uFoJnO16yb$pD6t%+DYxq27yCc%{sY@S9H{2C~jl;=d;_g>hEZxD-htt`d4Rb>sfniW`BpRHLl>mW?8+!Dw@x4RZ>%jGRchVI=cxm?zUGu>y~flQBj@ zXtRWHa=8dO1&)zE6^{uar%5Nh3YL)5X}5%&A^J02{aG1$rs8fqn=J`B2OE(-SKQ70 zv8t7p=BfHTI^g~QY#cVu7e~LYV(Cr>y@1Z<$}AJ)LJWY4i_qYltVjbDM`q#-DlQTK zOO3yw;xg&@c|&FAb2;on#TBBx(r6n7;M~KEt^tu!Ee}^wXn4rHKUN~pSHs&U;TnvQ z1llYKoKP+ju7zWyuftl!mQ)jSnulV0* z{0$5DOUF+fDm$YGU>6o16zxMso9kVtsnx>pFqH;|%<~o93jGN4ddG!FF-96_vovr@ zxoCI{j<{n29upd#kWPB;mWC&3w=_H@`lns}GZ}iO;(mLUEopcT8u3X_KPc)?qTGw>1_T6!-@0_MnT25XmI9K^nr@QvxE#Pz8C)=jK87cN9p*< zLuF_76YN68&!YXsXmkAyMt8lIj9;lXWMuxea8H%~jrlz~e#aQ;pv}_3spX>M4>(5p zPdp}c{3V_A8dy61rrpxIHE%spChpKeyW$1-J;%DQ~v8;Ie#T85U zG4gVB?m-756)*}qmPdoLs-h269G)d)(6OTU2gcvf5lY8T9x6Mtm0%Y-Ru*l4qx~;* zpk7PI0IKuR5v%kn%ZkSUOgt-O@2c^mVR& zXojAtxDSW1B^|@D5$O@)ZmukjkCZLA?M;U+(hq;U&&J_nb@BJhE0*qO>^10Yt}N~m zYfX%UkhRd@?5acvRGffiWDv5B_>VOHhLClo2$LR*$Nwx9xd+XJVt9{%ebb>gmPC)r{0=w_=|lu4kX)%yI)_XY*FcC1cS=T zS(j#{mAZ>{c(hE$7-^x+(!wd`qGbvkBRv(52`$s4lU@r;%bv7bTJ{qC-mX5%&@&bH z=RRyn%f8r%^nT)Q{!(G<#!9($%kmzTEz7MG5zHKn2IpiYOrYW{EGUDSL&g6v<8PQbTsnRYp|bNl0(N2MNYNf;w7LFL zAyu};=4b{n*sPL;O|N2o43s`O$6}1+&}PZuM01gI92_HkJRTErPLNJ|MJzcd(r(E) zN%SYX`cpFWOvN30DqE6s8a5(*y11Kf<8-;Xbv$@EgD&_he>M&;XNs#|S+Vpm!=6QF z^KG0Bb2f%R$vJ3nURK0`ieoc*1|{c-|M|w>P;!BE{LG=UbGi_Aq2wabUTn0vzKx5E zwQO8MsbM4YIu1voFJ)%$SaKQ0NCa(`2u>;&5tqX;(pTUyA>vBuq-Sr5xQcd5#MPp| z#?@b&p=T=Yy6f1Ii0iQt=^Mn|Tu&NLb=4`nrgYVbyzux&dgG7w**I|ABr3niV(AfP zxS7u8deUAZ-U2H)xfKo0+De>2#c5bl1}C?R{~gBPaB`<~{31eSXL=Xx!pYsDy~k*C zT~C^>+ahx>qZni|uP5zYt?y$!9zFMCjP%fE>ETp!(enTtBmE#A6M7z!PI^r&JrC1v z>3Kx-kGlHDGW1Nvefv0D((?p1BK@Seo9}Xa%vwK1$51ha3(nIb@arp<9%b-n=xn~r z?HTM@7{JVPXmD;}ti&MG`o-oO}1q0N%Q3Fac@O*rD733yCMd0RT^m9V6|L%SvAUD3bi z>fg`MGZlB{2W&~ohuDbpN8)ZiDccFl5$0q1g^C$mP(BfVzr14UF~+}z-!K36yjFA%BEG3*?E=qoaW2Aq^V?xO<(n+s_rQ}!IEhWE+{&!dZM~0rM zxF`Q)OG^I2Mx_51ck@ZPbG#lmboh`#!|+#>|IjT|OyENDuekfw6-$pZ^h|TX*?dxV zL(Pm~Fft1oocqNi=BncOEFy!E*~EW#<8K(5Lppx;P}#Zlfn6BsE801YHrFR*r(lan zKgtavnV*zBnVyRkc!bQ2F%m+XC4`g9MaVpGjP$&CObD4zI_Xuggv?L7C1e57FX-wQ z%Fr_vcjLlrNysADi1ec39^a`EgmiQ^RVI%kC3-P>hKe~{NER1`UtqEH1fwrO=lD*I zJ)XHtij3%98reQF;q<9!cr#!zrJGWNd_NEXY>A~ zXRu)~fR*8Ba86i41S-zJLNZt>ivQ}y->|ZVbo~6Gvh!OLc41{L(XMT@x!#}jDA}U2 z4g<{K{YgrwN3sf!lyxyiQfRZJaDur=Sr3kp9)-t*l=Y>PUI|Oe2DDpJHWd9vu72YT zJyUUKZo-zNY>JIYZzk^MlQAZ|{^W^udULvjiosn*wh&jpvSR5ehAq+Ad@{CSw!{$V z*a{8K1&cUPacm~fpkr(C-^TbGI<}RLpE*=^PTRpQbc_-0_C}lQlW|* zY)QoK*obsl+!G?kbT-xL@pK6lgS$jDimP8)vGg>^fO?HD5wv{@oJ zsa!7-|GiRh%=64534$*z7%hMuXo>!z|L5!0{{={?0gA!3KJuG4$b zB~%RV60x_q`jr(+&oFF6=Y$9evk!(q#J*^7epkeSieoc*1`+#<{{hC|5OJV%{LG=U zb2v@s9%8h4iD0poh(jrzF%edx4`XJJh{G{PB51Qja8kL5I0BB5J`#@!5l2ZU zJ$p;U(X?A4juHK_uKu_TJyUVl9nY3ToPdo;pD6C;Iq)wkik5DnT3&hFd=@(Wk zJKsmMPUi<68zz)Ptr~2I-1^gr1>d z4wsfkMd24%EIrTYkI~uC;zfHL7SQqp8l16}7=emYu#^m1o)Z73jlZGg8R_^1gv!qF zS=fb^=S2Iw(dMG1XU&$D7Z_m%w4{~#Mb_cb@)E{K3vHGbPB9lPFT)XcwZ&sX%d65! zuZ5-MHQFsLuZ#W-SN~>)o~gJ$-(pKz-o{3x-w}6n9omjnbB8VbP5!&|3KiqKq`W8I zesRUp3yl0eoy~P8b0 z7ws2Do9jBX?s_dDUs7!d$-IWOr%Hdt{2m=&V~ljrX6fM6a?$Y(93%ZL9uqpglTLaK zEFIs|Zt3_z^gp`#pEC4J#eMiQThj3hHX{A2xSQX1~Kose|cuc66Q#$GS zTPpg|ZmF0{^mDuVc{21&#l1H#TT(F}HX=R0xSPMxm%p;)El>0UbP5&2yI3qJ&VFsh z(n}1y5S`86=ywNN7=z$q5i~e2EAl|a(OEzS7mJDi;>O=_v4nK|+@Z4bS`v2QVkyxs zZM3=mMn5Ung0T$628_(V(eEMB%QCx1#&Q@V8MIk4II&!06yO-?Sk69lw%L**On`U8or@+7U+E zuy&45HW_PT87eZAVQ2`V_4>Q5%{)U^9bo}I@vNPKfcHw3#(T+CS zobOL;y%v?Nsh;8c6IZ3TVSbN}Z81hVXtQ*1YPsmx4vvu?gU5u9?WL1m14~Ce?Us%m zM8Bh}Z^+Oy75CvzY)Qw?*ogEl;vO_CY>zkQFS)z#TemCyL&Z!kCu2qDmsu>m${f4V zc~o}Haj=7!-O=D|u0#q{oQP#*5Hnu<8;!pqrb#+}8KJVXt-vnCOc3ovqit9t?~%q^ z4a-iIaSS{BS>o)&OfP!f%$huk6vjvqZI&WVHy1^Fz%kM-cuXjoB%SoSSc+O{w-mLB zzTMT=GW1NvJ*?T1q7H0Cx>MZEC*~ci<}5*cex-|^p<)h~pUI-|3oMpiWArI>HlLWi zXj5SUIn&VKtgplfRGfmPWRSC$`0s7}4LOl?`~pH{XSfgSLe9RT-Op%qePZrevt?#~ zMlj4|o?l5T^#QEIqvb%1krvu4Eu3O5S`LC^qz}epLdzl2Nw0;amQ&pkaPF=D4)rv(Yj14HdJvyc{bUzrXU^ zdZyxDy@)NTxfmOfzC_&3cRW+3wr||J`F8qJx`c|sU05y?SHH4i=?#XxoX+Mu9vkKg z41tj=(coOMhyxYJX7UV1t``4mjK5*zTIu+iLuKc59qhu$^`gDOXd70|!AM-JMdL@5+u({72lL-cpL`nxjp zOvPPyH(L^M4>lrwueh7-)M!@5|ktlw?ixV2htZLBmEI@=2PKDfOwrMa_ef5&k={x-M? ze;wSRzhk;kvEmpS`T550C4*C9{PT@TNk339>VKkw9}x-2{e%XW{7T+H#bt52f}H&o z$6v(jSK|fHY~}8+IQ}NqRPD*HIQ|a1{T0VQB;KD%Jp78|U(#_Y>G>;;EP+p*zv*Xx z#ql3>BK@yOCI+^o|NH@w$y@vk_} zCgEmx!_6Tbf02@kbRXF5Z}RmO`JAr2Uxu8SxHxmsZjW_yqZ8?QL=w+tUg@OMGZppo zvE{LDer!Z~0daSJ#c@H}L&eDMv2G#p^TQTPA2H^_basBlaS`+Z-lAwCy_hHi6$fV8 zjAPy6;=hFPH^;gqrQ@d!m7UE}u*+->u2vUCU)L%Y*iP8|KX@pKAwc7Mfj zc?@7aE1-$=iXshE9GQu|`AqLu90Q3Fniyt|D@n(%r5l))X}84m7ySTNzeZyb7v^m@$h9>ef!j-xQfS4`UMD<&s~#hUT2 zIj#>!oTJ5K^1f+9>7-Y{lCcr(b_F*U{U)w{(+oXRaR+Y3mSk*>jYw}H?&cfH_O_1J z%EWO)b%{Q>wE!Cjj4j32FRfVmlySGBv-yTHi8C5w;9_euk={nsfr^7OeFhiXivM=T z-*7QTI)3U<*;#E5yKqr2+8vCxVPKB;Pqtc%#g5b(EHb~LbTztxxjia&!WgNb%~HW> z<)UI|IO5za9uq2dl}>v8mWr{oTPk)F{Ww>@dxoB=xcACzNyT_PM2vxoDw;?)i#kwoaHh|oLW%z##@|rUA{{?_s-SKS9nlxJ3}EBXv5#o{ z5{sqJ8Gm0on=^N*c>BQyO7=$+=>sH6pyDJfCxem$#s47VZzwrfI(`YEva>t{cA?}@ z(H>^Bxz61ARoi38;f!Hu$vkt{n^qseT0Clw#2Bfe%~Hc@=Az~(IO3cu9usPgkxqI& zEH%f{ZmBs=^vApU6EgHn#l3nWTT*ipHX?npxOe}y4XMHR*g)nKI^zBTY#d}x6@g!0 zvGfIlpGN2I-?r%vb~+5;}swaWbuGZlB{RcuMh)!2yiHR5i*N0P6pw<=Gpw04&3iuzi5;uZpI z98|6ogL1F`GZpve!)!^*BiM-aqvGEEn|w0sy5agUy5Y_NY#dY` z7k9t9V(BY}euB>3zsYAqJ&9p(@)Vj#KP>?Q6~|{08Js*L{?8hJ!^v~f@w11@&h2^F zg_9RV`=Zh2`kQ1P8sdU2Brj2JAj$ljWKX7FW(6K0uV9RX&}IqYLUz;kdM(s`V$Eds5m~0$ROlX@&C;D8$v#pj-NeLc5Yw5 zE`)q3+OLc@A0gcZTSC63d`5)yl<99+fk()<7$YIHSwc9uT!efF$4GyV$Apj{q?29+ zOURG3TS9&k{m-ucmkd2qaX0?TmW2FJjg+5IJ9w`cd4l6Xre@o;v38R@utvgg@-mO#RnrJp^! zzZ^P|E{HTf9l5-8yg1!w_xtd4Jktvd-r4;XB;1N_xM2F>R_!%he0D#Sa4WgtR+f&x zNJ&MyKkW8g?EsOl;>uUekTVk(XCUqNm^28TNDmfCyf~{#C!L7cfDOGAP4_S&_pf2Qm2i19NO zuU(NXX$a5>WlxnmG&D#j73qL$yEJsE(m%0G^Uqwhn_`EC1}Px|8hX%#vX^>OL3L@S zj-f$RUp9I}Lq!LEVmwS2apvx2OB!aO6UuCr*Fi&rrC|=8NoY`q%w=AWhP@FZ4V<$y zu%tvZ>;ob8O>vB92z5|fyQN`2&RZJxSN{R7|G*eOQ}Nmz#FjK1j7}*3P`N`xqZ~p- zI^fza4Tq}IKe0^nFI@F7iX9pnWga4+VLqBr4p(m~s4mUaF*F>Z`Xi0r&~TIv{KR-t zF5=96G+WYe3_774tMWQ%XtXpOM`scm)FH<+uSdfPh>-@)SsGYUA{tJF5c{DxMl_tP zgWB3H4X1G4(r~K!PjmgJ$M~6w*X|6qq~T0-Liwl49U7YCEGp6g*LG<*Tb2HaWtxBG zs^?Jb(9k63A_5xDLlesR>P-dJrI|X0h6_}Gq0t)}F4BRY7|+2)oVhP%OByagCzMN7 zUIz_LmWIpdOhSV?0S&jI z3FUV6rh@9yOdUhR9jd?6=nV~b>A+8n2j3#j+;_7j4fmiE%DpPDgN8|#hWqGDLW4Tw ze&+RPcmOfdz&T3;OG-q;gAig*6UT^#hjma}yQSd~&RZHDRsUnI|M3_(THgVx)m{mIjuT zh=#Wy#Qr6Y5e@I?ptg2P!@HcfG`y$&_g()7F@C1vwfm4QY4`}8P(D_) zwOtxMRi%GondU#Z>Sq)?G)$Jy5djTfpb6zm^`?UA(o7vg!&j>R+UN}p-{`03ex~BJ`;#qcSYQ})FNh;@@6-?biuzwqQ=|_2YY7B7G474gJuBvWR+9L3L@Sj-jEy>IWFTp<$p7{KR-RZMC97m{%GG zt9OX;CjT$YDVBzzbS9xe9Wso0JsO51MjAM0X<$i-Xcz%uC?j!+%*##ElvSX=saF{B~ zAOakgMS~qiHK&5=+RPn;!}6+M!RQSRE9$_{jHl2d&fF=syg8)N31uaf*Ku>0YH|1* zok?&|hpf!J9uBJ@MjSY2abQV_a99<>P*%e+!eMnC)YfisScCHxhjHp3@A@ai_?e2= zZX#Ra(11=TjVd=^%`#gn6Qqffbil=39ww>OKeJ4BLFFMswfSzAU1u^v0AdQ7P^PLo z6;u~z_81`6RQ*~;Z-7`^2YzZiX%=x7wGLYXu`W8Htf%r+qVHx^Pu3E#KCOm`<#50J zuU`*#EV2PJdq`}E7?I$dMS?{oLSiEbu`7yWgv2H~sIA^2u_@;*5}T=ibJxE`jGw7^ z^|oY7B%09)Wh<4tNKBM0CFy{RyGTq^sefjfY#&8pYpPu&CdxJl0f}wVVCz%esi3+z zv&SH@o$9wYdV@qx2YzZiSQc>>wF6rsu_HRz09AQCNJM`H#~f<+}lVmAmwnT}(G#O^w%t==M$=e$K?5B0aW{uwcTrsCCWWlJR5&MWR892my%z4fa3PoeHXpGkXjYovQCLdV@r_4*b-3 zvMk~(s>GH^^q_-XP?gt%M6@+2v?fBr>`j)L*+Zg&7?I$dMS?{oLZTPKP-fv6Au(GA zwbffB=5XF3F<1S2yZ(J*{7l8Gw=Y{F5uy{yekym7Xq5daNe5iqMdARJ`e&BOF04o# zNVSVZqa1_~kT@6(HbK>$3aX1UdkhkXsQyr+H%J_&13xt$EsHpdn#Yz%%tr@Xp(?Kj ziD-ZF2wD>%VKyj_WM&VEqYxt!oU=%OaBt zpBUq3Dqg*l*b<48(Fx@gmAgnZ$*Gj211|0&ahgi~Gs|TADiWtt?IO`6XCMS5&P0Qq zP<5w*>f+2EgTz^?KilXH66ff^PmPDmBF>`DWlJQ^LkIhzDz68LXp`~+S`#5*b}27p zW)F#r5F-+tvq-S0L`Yl=VJMg27$I?~4r;5nNL5{awP z3FR7FO)tw5ei!*x+5;v*- zW}`Pq+@b?NHJ&VsIE%WKEs?kl9c+rKydET?oyt3CO@xHms=Sk#JtXczj7V_KBEg~( zA#pc^q1=OGgv7l%sIA^2aUbU`68EeB0oVUvjGw7^^&VnNBpya5lt)zVB9W0tDM<%h z+(qIsmHKCv$u6QuJWjQXL`I%K2uM7M2799FP6gG)nLP%Hr&a%q(HkV5)q$Tn9oV9t z!@MH#yn0_S-a7t^BigQfk=8^=nElF^nAt<(WyFXC=PVK|DiIQ|Kp4uaI7Udkri0q* zEfTMD-Xiga`rmZ@Z^ihTib%Z8mPovVPAKoH+(lxtyhlko;NmV4@2k{5vrM+XBJly$ zE)tXFLxh0DM`*Ays_s-!U7XotkoZLPpBlYE;xirisqvgx#97qmYi^O8 z{}khADqg*x*%FCg&4mu2VC4m;&+w$XO_thP$d4K+C^fD{D}~dSO5<( z!tN-JC^D!n&g?Nr^ilmnMsJWMasOId72|rvBlse?*L*sd)89vLzCW zq7%wuDtD2XDx)aDpI@?Z{vK^{mHKCv$qrN`mY~{2VyY~O5Rh034Yo+toeHXpGkXjY zqg6k~=nWEMb>OGQqhS$eQOmI9U1C{uuurP;dhQa@=H>FVCPKpOUar8*9ug}eMkF|A zkzi4YkVruoN*c!qiIsFvTfIf%Z=APCtgQZ3T>q*uex~BpTa7J|SREaFtzP905)Bh% z93}YDIU5Iw@hbJtER!9iNKByGK?3VcLG@Qab}M}qDl3WjNTxT(Se^D zPk}|8MNMW)B&MK)ol=$8fkeXuyL-7Ntx1qD7Fmm#JtWpfj7V_KBEg~(A+ZjGp{$Ez zgv5F}sIA^2u|DT55*w(0L)X7ijGw7^^)_ZpBsM`OlucFcA~8`mqXgeKXX7BTxk~*r z%VY;D5?fI1A~8|6LG@Qab}M}BCGmoMsJYVS_gh=Jku3%7PSpqBC#zx z*eO+cJxD~mm)p^r2nn-$xji#`NaPSB5}dP0u&6{x>;PdXJK`82!N>jmw?~#+BzES! zMPe8A@9O$@i}5oRuikXFL}GVzLdmP#MWR9WpafqwXX7BzqEi2L$z+Ep5;LfFk!X-s zgn&dF8f=rQI~7zHXZ9E*+EqW(=nWDbI`C8D@vVrns3Kb;5uk&eQkB<(M6`R^Noyh` z%QC5G&_4mg3nTl6$7F!}Q z8=X+*sN6-OQRY&DZ%1I5L+T~Fgn;NRe3!~M7x)V(3%JdvwL|cGkZuJh8U6HoJE2~ zB|>5zgrUsGF+$>S9n@BDkvM|$7KtO(f0XM#I>ygbyn4s5B@)M?6UuQacadn4<0-+H z$JsbYoS;(w%reC8;=wPQ* z<@F#D?OxtQYa%4f?&ZzQ>>+UrVnl*-76}%W2#H%E4COW)BP4FuL2dOGi90xNk+@U+ zce(z%WBg3Tt9K7uB5^M|q1>l(7m1AAPYJ#b&c;FF0hRh^mdTD#Bp#&NMIs{)Ap|5I zMuTlqb*F;r;>;d{#G|Tz%;*ggkL$osjfblu&Z3@ROC+8|2Ro%IuLp@}_ws346Cq)C zFP~v%4~b_HBNCjmNU*3xNIVB&D9_^1 ziPz8x<#m<2NKBSDD8cu?**HkNsZ#&UGTD)e#9LImNKBTu5dsqLpusk&x>G@Qab}M} z;yu;BZ}bL<4|L$C#xqtCXHg%rB@!Q@gPl^9*Mmf~d-(~iiI6b6m!C4Ths0-y5ed#& zBv@1;BtC~QlrM0MkoZyuwbffBzT&(^;%oJPP`jK#hE<@iQiQJyU`mY{?LJ+ zIvv=e{=~c@vA_uCS`bHE(B!+94bkppA6gS3VRkPUg5F1BVZ?|8=PVK|DiIQWVG5-m zju8@z=%BWGi$s6UTO#2MMgR8bUx~ zbu`!}Rd*_=F3#*RNQ_hcc%wH+OwfU!Ivv=eCSqQZXi#sX@g_&2G1|RsqBRK;#v+rL z*+U|O7?I$dMS?{oLSiz6_=Y`>5fW2%P+Pr4VolClB-T>@+OB_{7(Y`HiFMf$iS^J4 zWqp;qNKBLsC`kug+(lwTmHKCv$u6!)Y(%w-#6;N`At12{8f=rQI~7zHXZ9E*HdFoP zMsJYVLI-~8bYP3x67z~gvwF8O-a3$ob}zHECPKpOUQT0X4~eZ2BNCjmNU*3xNNfXP zDBI!~A@O$|)K+hi*pBlSiS5;&bNxHS_?e1G?8uf#?1WAzJFDD9qCs|{Bpq;Z7l~a} z>YrIAyM!XK8`Uln4Kf`eAhA0dY?G=x6;u~z_827gP<@Nh8zg4vz)zhHY*DS4S0vih zTQJ@_kcf6K+i6XNgxS5E$;=)S9f%PL&RHZ_R3apb5QY-q7$LEz4r;5nNOW@EBGIM( zZr5Lm@iP^X=wVAF_ChBVQMrpmqm(I02VC4mqM}m&%re;}6^UM|T_hT17D7N`HX3Y` zsyh`_7iabuB<8AqZ=*Lz?4tuebvm#`?TdLuB2@2w##;vx(eCB`v?fBr>|P$g%pMX4 zB1R-QXOUo0iI6x5!cY#zF+$=WI;gGQB5?@kEfR;S|1j4-FUHSQL}ET$B5^o6p&X%d z7l|f0l9F`5#a$$hQmKDtne0-E#L-l{NHobY2my&>(O{cY-Kn6uIJ3tfalGnJFnWW; zi8}C8rvqEmNtjn8PFC+J##;vx(eCA`v?fBr>|UP6%pMY_BSs`RXOUo0iI6x0!cfk{ zF+$>>I;gGQB5@YyEfQy|{~XtUZj7I)h{SnpiNyKngmQt(T_h&Sg_NWNF76_6kxKnD z%Vd{UBrc}fMPia%f)J3n6b-gX)tw5ei!*x+5|^v~3ZpkjT&V*;bvm#`U4?l?;%fC? zW4v`B5$#@HOKTz|%P`jK#hE<@iThRmfYBQy9@K%KIvv=e9>TmL@vwRyG2S|mh;}a@r8N-}X7}7cfHi^S8Mw@5sr{%2kPb1{CVA`;KDB@!>7 z6UvJ!cafMZFHw>XxVVeN%PRHHER!9hNW4O|i^ODk6(Jz;8X9bqsyh`_7iabuB;HW{ zn?`StcuNO<>U3a>dK>eK#5?MJ*LdqdBHF!tkJdy;nBB|wnb||)1H^~~=PVK|DiIPN zLKwEfSw_-Xig-`ag61pU3!_ib#CHmPmYw4t|qKg{j5J1t_LA<#Hg22hd?xVVeNK$ZGumdP%o zNDQLdMPjN9MhHj@L4$2lb*F;r;>;d{#4yzlH+qA_2p#yT(}68&B<2-~Mb*2Q@z#Mv zw0k*<)QqMPfAPEfQnYKi2gx z6XRzpBC#x6-X)epCzRz??%XAsCddkuqysMQBC(=M{WHsCmsKQER69suoisu~VkI=# zCRKMTs4mXzF-WYe`c;hHAhD_r{M7h;D#TgTYHazxy;esDJEbbG7?I$dMS?{oLSiC>cmgSo5fY6$sIA^2(ZqR+#3c1+T>s=4KU4AQO<_wU zrlJ$dnksjZm?&#ek`B1Ii^SS0_0KGmT~3i$hiVsziLx$2Kw>>K*d|qXDyS~b>@i4e zp!yAs-XO7&4*b;Vz!tSJ<`s!e)VrziCcjHGMZ1@q(V7SevwOKYGkZvEff$kCoJE2~ zB|>6L2t#ScF+yT19n@BDk;ro1A~8+kV*E@+B(`NsB>s+0DBG#rMWR8rrz9P4 zaTkf4O8qm-WS3VYcA(ltqCs{<2uSRN2HT|SP6gG)nLP%HT~xoT(HkUo(}ABl9oV9# zV_uQiUA=kZtpkZ@_i_(f6Cq)CFI$+|Lt+MEM1pe`2^N(IiBqM(D?>MauO zoVQ5KRDXx-FUI(pibw=(iNv1h;MeX|?jq4BU6iB)F76`Hty2HYGT9Xri4xT=5{=S> z5Rljl4YopDW4kV)8%ek~BLc;7` z?#;{|68j)VBsgc0U{Q&X*cZZ3LL4I`_R~Ra^%jZ!Id73TK>Y{0{)1xtOhqIPW=kag zfewDsUga(lO>!tD>41y7NF1h8|I9Mk6%~njRJ%wt$$W%>#NlYLO{(rxP+gqaV~{vf z^+y@KLE>l~_^H!@E$SG|D-y@5_c-IN0|~Pgc|4cF^W9INKM@zkcOrcr7bhV`E;who zU}gW4i}(lo7jUsU@SN-1po+9~m)lFyRS-ED3r@=oX)l#3-K9z)FNOB9oPuB|r{b9F zk3e@z7aq%hng&m2aCmuc*NjqU-nz8+IPj9KrWI(rsp7xSz}aJCB0 zpj0mb%Mwu13$pk-sC58{FC}f}bVI<5zTBITuW8A!8ZisubWw}JHm(n`Ko`*TZ%Mc6Ya?T9Lj}{lD z&|1l3rJ03FS*}pqm7MHfE>tST?wMt|3d5CK+e)pym11XkT)ULID~0a1fjhL|$56@x zo9}!Ton0A(w1*4^k9ubcWV)aUXQtHxxv!j znxD~9F64WqQ*J;kH@c%z=~;99_)4jS%*8^beOyUqj_;^+b&i)CsThFk)>>d1`4`6X zazlFxJ*>2VE8L2;Z_>4gmMc>1$+woex^Uska?tp*cqrco4#6*JbeQ*w$;$}m z`u0}Z*O(%&us^W66yH6snw5&(?u#t1Q8qv=Ym{-hUgvmNzO7hpnSt}FUc@)lI{ z9-KvSj=V`3-)b#0^0SL=l@56ek>>unq5lb~yiMWI4W@0kMSiEoaZPJXoSK;;?=ZMX z-khAg%TZ>0N2#kY9x%@x-_wg9PjAiZTe`Kqr?Z4txTmAoJ!gDtsT0>GuMavaj}uVy z9?ipWr>Yd@RQP7bi&K&J5uKMCfFF7*NDE)@4-lA^8>(#n^-6rG(ZS^|+%@xi_2M(4 zEFU2@KR1{NMmL_15z8%Gz46SRJ$qcw+)78OTW>sVg<0bvE{~T_sKUnweq3%&zN0v^ zqZ9vBc~pt(=6O}=DjDBe#lI$t3; zKR4RkItrZyy{F-&sdVI9t2dIbA;BB5`kLw+tSsLkI6b$xzT1l3<%00z3HJcL`fc(p zX6NMwNz3dg^c_O{aM4Q{eIR_#wR>meM)@Cs<`e1PG%b)@sMuDPAJ7lwM;uq~SgPZx zj%7N2?N~Z^u@628m+V-fV~OBn{$l%R^BXy1gAus-c8m$G#13C?ZY16?xPw;kv4gWT zpWQ#{dOzccA5xgie?j?0*T%mO>A!T~rls$vj#WA)Oy}?F Rjr02*gHZm!v3JI}{{zCs*sA~l literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/con.doctree b/docs/source/_build/doctrees/con.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f5d3a475a7c90e356ad25df6c2443d5e207046c9 GIT binary patch literal 17023 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

j_llO933P9)`;5VwNr5U>RS=l7keDmz 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 P!yoVx(;sn-O5^_r8#`Za literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/cscale_get_map.doctree b/docs/source/_build/doctrees/cscale_get_map.doctree new file mode 100644 index 0000000000000000000000000000000000000000..3f2f018b1ac5ecbe8d415e389ecf438dfe9eb02b GIT binary patch literal 6620 zcmb_hcX%Ad6_;hzvn0y`fpNhH#&E(>69LO*2Lyz<5EFW7)f%yIE^*_ulNTC53DP zAtY9MNF|U)5<(gwy^=;6=^=%LRMLAVz5U+ot#p#k`aZto51)76zIpR|edg(==A!Kv zqtJ1KA+*nUjQ&TZ0TCOn5A~Y*j zmD)zf`k7j)x_&q`?_>MH$XF3Xg&=f7Z038WElL4(#MEi@R4o+H@Uxn0f$BSrdUDsiL6eMw8J7VE|9P#h@x3Z*s`8?V4U9D4Ipz3$<=5 zAfPX%!*UX(yxeN%d@A3t5Lyqilz)J?r>sBGtpysu0e-X5Yn1kZ>F^|9bGWmL#xa# zqIE`l4HRXKj1`8;DMTTRdQ42m=8O(Isxn_d>+?o?(Y1mA&&TDBj)GMjSL~7vd1I+# z2XuU%PB40sT?gUgLH2RZGFp@M19>`8wpo$U;yRw7jU&wvUW*($2?ppWO2@U~3mVMR zP;R~%5C<*{Fbu#B75aZxk|2;>x@>tgf>g4vLz?i=jCyExgjr)&&z>) zB!NI;Uy0pLoxj;WF^O>A+GvMuu;KQYb^w6n-8Mx9D=I7q9>=rAWQKME?rAZdp86Ts zMj4v^OlL5(GjogxxDtQ^urmTqIU>l@SvkaoEwBu;nt_Ax3nK-OUIY`3#B?!xw6}qZ zbP257FIO3zr(03zBWBJdwqeg)L3Al=bQv3yE|=|=(UzEn_R7^`Z7f&U8M*@g+ZU5j zs5d!X$tyZak?ZQLxT=xo$Bb5;0CY9VMr+C8jJjsJUfXLAp)HpbBvFR0gRc3Qu4i4_ zXD|&x!4U*4Yt^N-sx2Usb-JNJ?53V2OKz=~LX3BK@Q`E}&SEh314e@qKMpi*OqCQ(X%RH2!`w53a-9Il=K+= zh>T^R11P$I6Hd<-6J`%Bg@Qb`91&+GSrOElh0%)7jxEO`cs}G>c=P;P=y+VPGxQXo zza^%p&Y-`wW^j6%(Vc=H1n)RK-Kwjzz4Atudk_)ARpZ*E&*fP<+`*73uotWVdox|FFkYI+Vk?YWD@0zGd*Z(#+^g6kK@GxU6@d0R{` zNMZHKRbzXAyRPTfPAq{c)~s0jZ>T!86K)GoyuEVPFV!mY{G-hap=D-vOL`F_esKfD zBTLc-^^%5=GxSn`y*;Lv0qoeBTun^TXG^}yMuEtpZ?MUj z%;&FQD4V4_*!nh~hVC4}8AslRq6D;ZBO`qIq6l9B_x>Lcyb?k2s+e94h2$MTaJzQ6 zWT)H}(`!la>tQ(8dx$U8^+fa0!tJG`OMb~8tbH^L5&Z<9AcpZH*LJn%eE{ zP~?Bx^c_&_oiV+O6}u0L-JAH5-SO_2-osi!sisEI-rERT%j{`}WxOw@_b(>n1C3;) zVG$KjKjv4uk|SK(Oxn)}vBUi_eF!`7abKbgaAU~K^3aDlD?ZX-mzn1L(S|!@=wlH6 zKujM`h2NjV7auBsfIh*3KiNR=NL%WiPc0}239zK4e;V>1jOjCM9zJI5)m0#1v7cQi zwpTvD1^RPvcpWo+9`5@>OkYevJ_z^CT0kF@zH}%X7JM7c^~-?qP)uK87|Q@-whCn! z%2y8wAD(MU#SZc_a+re7^4CXU+JcsbVEJW8UyE#z)ia^-_|6I)VR-YEK zx`j+Qp+ptVS|D29c$QoH5d94?^!J$lkqGXUkLmQ0k0hali*lrR?qJrg{r?;_GPWrC z%Hjb5{cF_d{ zJIHy}!5>%50jTA5>aQ98dicDhre;{C8M>IE6X#T|Y@oU|wFkc(1x8nD8@8lc4l=AU zqf0u|2~@9MwgSJ5zUnLVMAfI+I~+SPnK}&buv&LL*gzewm-h40?i5FY@CeXibtHf3 z#bL-%7}=P~0Xk4C^|GV*V@DuDbl!5HR^hd-9G8?H8QGaDEjPk=Os&RuU#-D!tkyEG z(U;oOb(sIKZ+eysUYIN7|B?Blm$b541sIdkf_mv4% ze0|YMUL{ULE*^)#X7sWG0TxQ^@4^^rn8~fSC`4toi6t4mqEZkXF;lJxq!6Jx8T4sm zE%Le=g@=-V3JYpuXvI)%=9g|Brg>4toaD4qTR?+Tm)lXLYR*J(piTuH$%xB>+SD|Nc2_7`2>8aD+ln68OAgu;{+VR8mO z9yHcM)yhmYm<=P$9NDmEf@#`VD!c>gEG;Ziyc&qehL#mqovq2exTpGvnVKk0 zqTPuk$E$a;x{%pA^^!phs?;8SUvAn?U=`qinh`J3YdcYBszBjPsu5=6jI#>ngky(N zT@1=dhtV@PNYy3G*t2W&iaqAo=AkWvC-2z0U5zraz19xYrTn(7?#}sm=Dg}MUcDSw z{t%ZLPHK23RF{K#(C91+6jh5Iz88d1%+WYFXI*iHrgjAtG#ry6G@n5218v&CUA#J5 zfDF)#b+rOCF)@MLFZ!UT3y>`i41+lsR#!3?+K3lglcsda(#5|}UB%=U*Z0b5j33v` zb%8lIkFN&Hew|-ET*l2=n_t6=n;lzS%MU$BsQTEs4#a6=by7QoD|BsxZ$fF-M%gM4 z7Gz@0sXD^~bv=lA;|QH@j)yCh{sV;Y*!{LL@%13aE!G6;LPEL$ByKX=lrxRNV%br_ z=%3#Tbu(85Ueu(A=c71W#1+9JyZc8f>zZLa8;g!+mzqdh%6&b;phuJjz+ zFSKQN33nnd45+_4Q^Z?7XSdouFN_yTg}SXgr?86rKy_xkOMU|KD@zt;y+{=5e&`%* zc)m}A)tP-=8~0$N?MGaCL9-AEUTE3vg73AwNEPhBEjVEig|RI7{1EpQ<*G5;sN%Yc zya?`xf#vdsqI^Q@*ht%!id!wNl--2SLp2&^BTg(OaIqA$IGjeREbnqBl(unueU)vp z<0x!|VHAWBw^U@yh&D{GVFMaH&sDTBp-n~6&qli(EOkM*Sq!jKQs7GCB?DV&71=Ff zkX16-iB+UZ8nV(NWLrg!O=g?+lrp$VfU5+!N*%aLfUA_kRZ8I+joF|hJl_QbbgLTO zdU@KYPWbb58)VI~2_1*5k@jo~);89|`hhC&qwS)X^{4B{FIOXZTgHLsAQkg;!ptNB zToGZ5S76h8r5)FO&#^?*@+(fG?T3g)TX?}-r35ZO%~06K{c zq(;)oEN@4V^y+bh@a{A z*Fr_e)7|04bVB#gUYrUq%H@K2Gc{G{Jg7>;YmS%OK{H<{6s8o4B%dnmo!F6Ibc6Mo zJ#Htwq zA&=|JJ@7r$NZYqeRmjtQ;K}(3U7$T_m?PVvj0#R;H~wpe6>O!S@{I#dqb#}Y7I#*{ zc2sFf8`N`DMnu?QS0Yf$_a#V_hH&FENOi z2IE2$kGYmVWp>d;Y_Ki4;_?uunQjEqm=9&?bzj8%mh*w`hm5&@LJt6Rh7#wmm@&F0 zWMJ0-_QeTV*^V@yS$l2zsI{|#xx1jGGoEamXZr(wMkQuWH&B0Wm z52a2G)m39Yp$BOXR<9Zpt5l85a#JoIeDrc*bkLy?B>9Fs>^?=AbD7mlwrFVkNe3&r;$Fgy(-`EIkwfepo^e2VjQ!mvsWH`F&+V zkI0rYj|`_Dxl*#7lzDTwXef6ip-1T`X!@pwHXYy~fr>(hgK3lr1jlrByb(&~%zM$sHVV3iHYh67Q|1!C#bhuCo*l=n@+Ub*%mj&rJR-BKj9_MYS-Vvna->PSIbFupyl(3-taQJ0Yd_ z?Cfm0Js*iMF!Xl$p$a5bh5oKa!B^9!R_vP zHliz@wSb{qgJst1xw2P3j3C3i0xs8L@d!Jv!&vTfQ#Js1B&>8=C69p!sF6mM`>%na6V?*WtG)He+lxikr_?T<^DtGh*a&_t4dRqU4a-FpOWJFT^_%Ibt?r&aq1m qJhFKq#$On9VaUaDS@l+OJw$7A1AbY*&P7+rjrb#xoA4Xg%l`s$vjm#} literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/data.doctree b/docs/source/_build/doctrees/data.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9b0c2b06d571e7c140bdfe08048aa431cd0c826a GIT binary patch literal 19633 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/download.doctree b/docs/source/_build/doctrees/download.doctree new file mode 100644 index 0000000000000000000000000000000000000000..aa2353247eaf42e36341255c89b9b96bcb49de83 GIT binary patch literal 7741 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 Aa{vGU literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/environment.pickle b/docs/source/_build/doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..351d6ed7679483661808b47ca325de582377605c GIT binary patch literal 130238 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

  • W;~0++M1^PPN|~~k{2<8B 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 PCGNsUtnS7$Dvkaddt${| literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/gallery.doctree b/docs/source/_build/doctrees/gallery.doctree new file mode 100644 index 0000000000000000000000000000000000000000..7884be1525cb90189e3b5db5878728918f3f0c6d GIT binary patch literal 14973 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/gclose.doctree b/docs/source/_build/doctrees/gclose.doctree new file mode 100644 index 0000000000000000000000000000000000000000..6a96e111fbe06e77f01bad6dc5897c360d495b2c GIT binary patch literal 6545 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 rS+|vIKNFx8j@#X6DVzwcS-KsK$}&g%f^Y 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/gvals.doctree b/docs/source/_build/doctrees/gvals.doctree new file mode 100644 index 0000000000000000000000000000000000000000..35b77e8800a99480316f0b4f358ce65c7235f264 GIT binary patch literal 7065 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 di#6F@-(uNtgt?6D&2^AMb3?`#&uP+3WxS literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/internal_routines.doctree b/docs/source/_build/doctrees/internal_routines.doctree new file mode 100644 index 0000000000000000000000000000000000000000..cc4d8301c7900aa363360468ac00eeff39b863e3 GIT binary patch literal 4082 zcmbtXXLuaN85XkD&Xz10H?WNh;D`k2AUI&03aLh9L%`!)2+Oi%?q;LC-Th`}Rg!GL zNjR+Z-h1!8_digZ$?+1yW=`d2$aT0J< zF&~>e))hMCoa5A=)4EAE61z>V7gMfieNF?liN3zRFxFhgZnRe>I3DAxK})d-m3c~s z8h=V+C*XBOLpcqzvDB4{J58>X+koweO%*ogXHw!SM05CE$J{U2~c?T5PkM z>7fM`;PJjV(z>Yv5d2($0ZNw z?lXOCG>rWy3%Ce_06Bb*C9%D$@|H7)?#U{JgH;koi*&Cgw!RT19^HG%I2dkj`}+X$ z1L-V7gSN z6wdUUv|o=J>zT2pA{{SE{MiaU80j;cQ`AYHPEl1(8d1|^P~5Asc61UnxkV|P^A$<~ zPdQ1z*YH@hJ;cbgJvC!0WVW5Gcp7fdYu%7}!eC`N&2_Lu4~+R<7^jsiON@n_7T3af zNH2`jyD=V`)5F%n$a`Vz?8bO_PS>x6aYHYRUELVRb9%&D7?13QvAY}NQ90eX7DlTV z#u?ohH|2C~>8@oQl`p%=!!Zj2}9^rW>gp4ZlW5f8hJu{!4(=*t(T5NhrrsuH{Kh%ZTQS^M9USJ5ajU82F%9CCQ5wy(k zq<(slO)oaI(nLar(Mv2g90sL8dMO0b=t?e%US`wF*=XmoHi1{<^h!34S`Q_ZkOOUn zcCF}DHock+qdP*>H59#OMc1gy1XCVk^q3oEkc#x$gkG1^>nGXfjw>7^IzW6@(HlVH zR6r*(fDlY^j>o>4J#VzwMp^e^3PqU7h~C6@3a!(_)v8Vs2+@%1`g9^2)j~GWo7o6F z;Bx~_Z#e-i$y4(L49XZCp5AJ)F@>>~qSZHzbXD{=#1X@F1)I0C0Wqx|rt7=d2&Nu~#B8SYZo{zftrPJ%9?^TCjW*&H7!h$>oW2)YRk)EZ4c<31 zz(z|Fr38DwC8`$N#ihjf0n;RaL!I_V0dW{1ZXaOd=2Z$u1TKv5O8Ouh2)LIu=tCA8 z=giU7smCZH2XNr#^zla8^XZiZj(M?v8~4MX4aXYIhr@YS9AI#8^#w?XPC=?8uu+gYjB8-_O7DnODHGf6RatP zVk%$!(q2bQrG;5q*=5 z6qZxaRP-&j$q7Q`dT?dwmv38a1O=Sp!f=7UgT6GPUC)^h1Biw1&R~J+&LjFB8@t51 z>WEXjVEW+H`4?Y!h`!H;I*Zf~*x~>NjLtQ^+OT<24o@O&Dv5%`?pJM zXS-H;#EXUjM{D79mZ#sLBFexN`L5{qHvNHZD{?=K6_>?!%VQJ4fc|)bZNTD)dTf9G zlj*;Of0n!GpRLSeTUXD4_CEU;Nd00x`)f{r6XRlwLW-{3qT7?_?>YTL7+C-r_RnIx m723YDm}1SsN`+;LjdXgkqJP=+Z#HOh3ftd*a{6!PP5%#G)W(_s literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/irregular.doctree b/docs/source/_build/doctrees/irregular.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bc4069b0ded60ebce645913dc56c9e6f2c284f20 GIT binary patch literal 10907 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 TnUUpoV#;$(N}$WTn2!GqlTk>A literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/levs.doctree b/docs/source/_build/doctrees/levs.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f46f3cde409fbbdd0ff70e531d9ae0e250205906 GIT binary patch literal 9066 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 AFaQ7m literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/license.doctree b/docs/source/_build/doctrees/license.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4f1e80e12e8f623f24b6ef1b9de5aedaa203a9cb GIT binary patch literal 5558 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 Cye@43 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/mapset.doctree b/docs/source/_build/doctrees/mapset.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bb5740525f320d09cfb1334cb2be5018094f995c GIT binary patch literal 13851 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/multiple_plots.doctree b/docs/source/_build/doctrees/multiple_plots.doctree new file mode 100644 index 0000000000000000000000000000000000000000..15ae6ad43359cb4d9d861403f08af13486694114 GIT binary patch literal 4242 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/pcon.doctree b/docs/source/_build/doctrees/pcon.doctree new file mode 100644 index 0000000000000000000000000000000000000000..15c4d6f1cc8be26437a147f453ef43720273dd54 GIT binary patch literal 9889 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/polar_regular_grid.doctree b/docs/source/_build/doctrees/polar_regular_grid.doctree new file mode 100644 index 0000000000000000000000000000000000000000..799ed821f6984b25704788789f463002ed333678 GIT binary patch literal 7331 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 Qxt6#UAF;X(&!{x~U(es1#sB~S literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/pressure.doctree b/docs/source/_build/doctrees/pressure.doctree new file mode 100644 index 0000000000000000000000000000000000000000..66ab91fdfcc0d10f98a6594fa2cd864d6d3f5cc2 GIT binary patch literal 6808 zcmc&(2Xq|O6_sVHt<@}Bw!t=9Ft%2I#hk+l=h%B@|Gc^X)w}bru5C9= z*9d&e_A-uZaxXz&%iQr3ux{)Kw1==h#d;jQ%>CsG_h3T^9jS%gZEbCQNiSDyo}5Xh zleX?#eqeICbW6#K(Yl!^Xpg_Wz#Y} z7z$x?N_4W3DDd=5I?hxY)0nOWzD0Dg9SyglnCk|^qMPlAQKsrBHH59AhwY3FW)b~3 zh;1Ul_Qn>|$3vu5veGJ9+XL2Z2+KAx0dP_tPF~qW9ycfp3D|)>v@?WV*h5lZj8b(9 zYh#_5Q_LQWh<4T)ttVH)NM4bFV;R_(2{?7(02VbX+%nJVj=7wz1O?kNG~t)+tWm7k zF4m$VEN3Yjhno$W5 z*?BOQXI+M^dmdiz%d_r+ZXA--7yI*UJ(X}g4{0&1vyQ5LCJ$NBr3Y+-Z8;n!=Gzf0 z8Ynm*+65--jMU07vE^(G@J!6rWC&-a#3^cOE{cb0m8qE$BVwmWirr!l>rfalEii(a zlo-p4eR;7zFUIpClMe(sBBJeQSMGi(U&3LZJE1Ml#$4VjgoEg!pzSAvf*uqERr#C{ z?v2Z=t?rfBOYYpK$sIUXY}L^xxUcBe$+6DZvHPV2W#GIJ&W|&2enc^=5yJg(uXCyy z5GwQwn)Zr9ukG*vQH}C{!Cr__J}`uNijuZCPer*hZ&n$}AORPl&kqVAM?UYz2F+xW z>dxF;vU=fVi&kkWQ*la(WHLGD8M@8ql9Q8r5_Ruchk6DcObL5PighTf`Ej;Bkk-Ng z!m9gqD7ctPiv?DdW(fl)!ZLO0;fIEB30t>MT)(W<397@2Y z7zqpEGK%Do+OpzGKWP-l@js1MQupX8Q9NiAGm`6OYBcLs{A@|;ICq8@Pa*oDXGp_K44#8Oq!)=AJxf!Dp0<480TVZUeVep`U{}gk1A^3=NJaYw25O7#* zSIo625{kLD$EjbcGS_klSCdEd?h#YW3B7wf3hUrC(%7S$Hjdi5wq1yAeV6xm4EE(U zAzX_N3fgbE%G|_WM?!ck`Mo-OO|QaUvD1pS9=A4aDGa!-X55-AG1;YukFoOs?Hd4kj z)&hwr}MN3IuLh z$q;WOhPb6QL);p|o5-`P(KD-j_q?v0Fhh(dm+_Q#@BqEN#BnO7c=KvZF%_5pEm)X) z)@OJt*86QCydBf0+W1yg@Axf)OKejO{%+Bu8vI}!;d`nL zetQV-r2-`z8hq7r`};7Fw>5V6`~7DsSS^IrHE|=B%lS z>B-62N%iX&2dH}bldJXg1#!hch2^-1oP|$gg+CL*XE9-_neU978T(nMHMY^0y5kjH zS>_Txmt%c3VMd+jKOe#uST|l)&+%Uj;Y)1LTP_z|TZ=6{_;Mb;!ZtO@I_l}K=HY8> z%L;Q%-THbSzQKA7%U80H2j9%Yw-MyE}9jE?puhd;A+ z6s!KidekY|N9_{+N*=1*YBoR2ZTK7NHN6-Gihxd4#``;}dP2AT$lxFI9jq^MB9evv znG@4F)YhbQrG}omCMHy?eie8sx3O;jVuR$OhmQ!{(8eg?->k#rg`fog$+1CRE^w;r zvdulgxi8z+wY42%yWGI91pX?pavd6>c!oJKeA!N4`bgGtg0i+moi5ko8kT3k49XR) z)?S|6fa{n#RHiJa=tjmJRpb6eT{;v3;&Qz#JC*G)6{Bd`s*;+|QTau&L3ZIyJdN{8 zde6k9DZA_0bm$%Wd&nVHG-f!V1Uxr-LNA~9Q@ zLf;PDWvx|?&~pPwFg}WkG^bb>UnX(&DC;S42jwOz^{Kdk)2!OEUWC)sYOhyDpW1#XGQ@T8WtGS@ShFAVBslPXDf|?4&KeEnv;sgyQc07stdIIMYSE}dv!3|p!;>>;nwPWq U$vUZhO;66@mr$OKpFtt>U+?Mq`~Uy| literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/process_color_scales.doctree b/docs/source/_build/doctrees/process_color_scales.doctree new file mode 100644 index 0000000000000000000000000000000000000000..79b712db462b9951bfdd6c3b0939d2777f2fe308 GIT binary patch literal 7509 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 S>J||nAL@9Cm4|0k9{wMwK6&2& literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/rgaxes.doctree b/docs/source/_build/doctrees/rgaxes.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ecf79de9f7f4a098d9c473b6d4deb055541a614f GIT binary patch literal 10230 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/rgrot.doctree b/docs/source/_build/doctrees/rgrot.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1aa499a002ffcc67ece73f8d370408958e7273eb GIT binary patch literal 8073 zcmbtZ2Y4h`k=E`i&MK|!HOmI?7<FJ{!u93bbYV7;Q~xTge#lt%izLn<}LKga%3rqkVmS z)mqaFq8YAp5YgcAg#omsA4Bu8u_KHtVdO?&9r&iLY9S3LG-8Z5Ee@60P+@4*!LLxJ z?WOe?!qqTRjhv`Jqd+p2&^VB=wHyX9R~1bdea0ZT0V_>b!=~fIgDXVXw&)vN}7 zq^Gh245kt~rQ~3g)0?_Lr-Eu{LZ{_a>ogOps!XOp4*=b+gdUjDIa`gv4AbuQGhx-_ z*mtW?ZGrYI%s@x8PS8-ZmT#}lHsgxtR!t{rc(bWG&2%2KT9GpxMzr_NW3(@!(<{bM zWYxtGwBH!Yuu#z`SW(1oC61uXGZK1G$r!fdrqG3SX4x33dR7?X{j9PvT(PQ4ET%Y6 zHnzETNN1Pn!Nx#pwUT8Fq{F7m^blvrij98H^%b2nw-r1yx1e(|-QlX^dNwpq2g@|G z!F({ghw08jP3I+aKGf9V91nFSon6juXP>j*7|@h-fdk+dmYg%o&RJ#WK-oFF>`a$q z2Z9}lb0Fkl>lJ>7iom>R|kEDC(kwE`~Tqgq#;wthlnlFX>LP6 znioX6n=TVXmzM+x;H0>wp-eavyDBWx6(!i*_3NIZD;IX>o?n_SmR!Hs2<+HX#nhtH z&Y;m3(Nz}aGoMW-t~fgt9$I8SR$Y}IArh}H8AE=MLU`nwF=z)3%k}9|3tJ(fxw-*P zP+62!N!Kh4gP<1s+Ck}Bm+Ztd->T1tw^1}2qI4I`W*9Y{u6G*lND&WT{SfYA=qivY2dke7piNA_AU zS^(m#qyWX98)DrxfW}WK$cN^7nc7H9O@T!xg2kH{q$RXKAp}MV#So}{J$FapeRL!5 zNynF{v5fi3%E+l{1yf#4=&3pG2vctPW=kAB4Qo>*-j-03OU&I~BtCspiOFGI;ay+56T*@8YQtnFVxw(|p zE-BC3RLb)+DQ$Xs0i?Vzp%>*+?rKSa>uiWCf$yyr=*3Xu-3h%U9|KR3INLA1^irAV z%SuMST4}P;FL{t&zAnmjuH08_5Ykk>jWBGkAgvYXl@NAMLa$1Nf%mHsP|+ii&=@}I zs%1&U^crIjjfhMgi{Z5>Eu>8XuCXnQYiaw^$w7 zaniX*_`WssxLeW^q)cyvmENAvJ93TRoBH@*Dv#coevWo(j^2gFxFRWOO6R4HAeYrp z^lq`$dp5dDE2+_YHxvRgL9^lo)ujTx57WFaq4(#orkvdiS3+?e^ zk<9RmnBf=NGyGaYe=O+s0-eNU{0q9=bZu~7?*;BpdV%ZD!Tl+~os{pN0o$J^^cRBd z>%jK4Hnwjh^p}F|bkUrS%K8a>=`Wz#s?G|<`!{=``>S5)26A+N4RrT|^WOm9-zM~T zg72Ha_l-8bZzc5iIleRt=qK={za99#-3#A8^ujloJ&zkCAR3|B=vt zo`}bfdhsZ3 zus`c5p+Nrw=08v9e{<$PNn@PU-atVACyf8U2jjWz8GQQ1hH#t$ODo@Bg8#1)`n9M> zs_`2X_9=cSY=5(n?WFT_$%?;)cXbeR-{^fgsyZ@-W1Ub{;|JdRX)3CvNHNSl)=Xd%h{Ki{LSCT02*Zhhn z=Xb^?{3g2jJxKFA^W^-_+JxU^H@^d#-`OYU_ux(V?daxL()^}R&hH_c@SAG!gTJID ztJHzx-6w~94u*@XoSU&R20V3Cc{o?nCp-DM9efH0PdMPw2VOYt>eoAlp(9t_Fn`_r zwR{l6u@9Nc11`^?VKG~Xvv^PVJS{=OE5x0zKh}HEq%$U~=%MJuDms90aXsqeqOOmN z*vEv$WjAtyI6@U!@hpF-C{^tYUw{EvOc&xO;fHC~I*c!hWF5X1W%;J-21liQNK-z% zO(_9i*3DwBkBf94jtB3TKE_ggEaqw$&6LjMiEum1urJ0oOQ@zPW!6%xy zOnwh79EK*Ykz9fKhSBDlxTF~S*ofg2R@rz>3+oxa99*EDEAW%>m3U^MeNhmtQ;#yn zt1-)wv6*g{_$m<18wFcc1J-paKSH-m$>CKk2qHg-lo?{D7xC5TncIRRI%El)p7JB{ zo$#aZEIEVt8*)mq%#8a$mjOKb0ALN_RJa0_3=8_-HhivF!H{&Vjn*rmDh>vLUVb{(Sw}5XbZmbh* z$WPQmpCm)aavUkbThNy9tPn##F9PQ%=P(%O&hP(F2^PKwiK$ZY^Y!to$mDeA!0dyfMnP zDhA*NBW8~k+KfF;6g3ae&PG9iOB7c{wV8nHv-(hkX_w676l?Phqx#V2jm=jm6zmw43VN9<1PgQZJf_Z+g9as zLtaK~>|5cyjVAl}7W~>qrVfJ~pbgP(6f?zL4Gw^@PvfR0EI5`IWn?5|1IAc}FTGG; z7CPsGd1Egu9F4Ug_AL<8WklT zv+AkPQ7Yo2XkRn-AtE;8XfyuH!e~&SRU=-Jk1@F%@#BWMBFm0f(FUVV*m0w2wmdlG zr=lH;5oNRM*Mf}rX({pevc(86b)aEoHTX77yHm_ob3JW*6E{?t3fw(Gr!kDag9pyL z(B`Mh=MJ^vBF12G#bKt!X9(*7V-N=_HMh>UYnIyPaPFgS=tcqaG2Obe>IK%4sc;zO znK)%;+?K&jo{7%m#y(87(TWCbH^SACDE1Bztr^>tf0Uo4nWYnNhAOr(%ZA5y>gGv= z(g1#pvkS$(<%Rrg-99DS!{wd6n#r{C9L;lk8Zxn`@R#_wCLWjN(Ba5yx^-fm#rQ5X z8v}7vJ9rU4SKbR5D_KO(OF6lIr;+*jLN=m@9K_`Wzd*hxOxq2u3Jj1b@r8Qq2m(zL zDBKl(k&wxXvnuAYYex>h7%g+d#(1}r^4&r>e%1Vq*O?0!%v^Zz{EH7=#4nM?p*%Ib zRK8|9&Zq9jbsfJ<22J2pFv10utYsJ_;+LcKxG_>!h^3a;`4woG$DN4yWZMF-)UBgo z1KGx;7?~&Jd(gIK;JB{YjytbHo3THOJIl+hW_MLMCAMtXrjDj~i1-h1!8_x8`*-P4_PvPr&t`n0$E-n^NA%A0xR%C%+FFGr!{ z2IHP@T0u@eYnB)0XwB$;S{u{4g4X95H7i`GTLE>()K!=s?C9tySL&`Gj&n8g*bk}u zz;q8Ah#?+?`)(s9Uy=Dc0Q3cOjk=7TM;|Lal(5hub zIqCkjyFGUm}aVq6_oX|?}bX84PY=5(_sZ0 zqwMz7IXWCv8)G^mqgrO2z$%L}Il2$%HpO(`l+IqOb*Gp%FV}>vI!B&UhIwj{mjxPy+;dQvo$ z*K$S}vQvsenDc%y-M^sqno(Wo0y?^=^^{#B2=IPPQR^)k+qL)~B%|jjwPaT<=2V37Bd} zOeerpEg|wCd)VG&Z??DDM`>M(mUh|ze`3Ktx@aF$w6_=SV~h4^F|r}rhCmx)9=zPV z7h3ZO)?F>E9|Cio6w}ENX^WU0QOSr(D+0vvOlv+zy8-Z&m`=@n2~bmlNp;g{g6Z^v zKmnix*(gkkpkl`gigZQ+zIVK;Ytciew=T_r!f3wWc=?)dMy{1ld^>7)YaJn-X+Wo` zRHdk7Z?y1GLOU@B%XF5=d{{y2@%#kD!xyz~)2|thM~|3Z3mNr=6@dKGjLcCwd%70{ zmB>?}O6S07;HkPEX`j<1nD!J_m_$hRz(I(G5yN@s!ZwpJohQ!Q*`(XN>!y0 zQz%E5!U~tgRLnv+&3({p5&<#uP!Iiuf!fh4;RdyoYU1^2Z!BmiduU z(>zpOi0Sbe?hqCOy5;JPL5)${v^yEz96-uI= zNw_Mer-+1{plnPdk#Y5^GM)+uS^z=;1LW`7VtSaT1sgxyp zdKRQSJErGkQm$!8LFlZ=F23h3y)@dVN9bwC3xqbxK{N z8rocJx{_MkOgtBdR_%CAxG~MYoH$?pPTxjp9bH zTd^z<1@)5amuGWyC)B(vrq^e%M(oYgXTfky3#2qd23$_9nEs5{7k0y60jjW9&HI(K z!ZsG9Z$L=pmSoWz1?rpHK%HEZtu5Z%7Hf{)0+e^h^j4sp-UD=Lw#<*^LpHp?H9{+2 zN2Lyfe1-j5-pFG`j7BqGWyj2ie%|%HDi*?~H34GvqPplF4IVIM`TDj=EK2RWP)-2c zK2E^C{h(mq0T=&&!MqbO@~)WP4K?k10OoGxe_OPFPfYI>?V)^!-3IFW+Ck0MYzQFX z@&1@TAUw8#hh$&;!-5UV;H?bX_+CICY$xJF?L@50T=!vEhk0lx3X^gY4%P2l_b629-p^aH^M z^Rfv6SZA5)J)MQq%9-NNKEX|Ik)Kj{XSd ze~RhP8S~#H$xhbfKtO*H#(!NYK_|eH74hG}{~s~^Q_Lf05$9Xj!+3$P z{ntvi!}gz~QvMs!)kMr4YdSiv-p_0B6Z2X;GqnFeJS~|*B=S0RuV&AZZ!YAx6BMKS zxl3{DPPk2v%QVho_n%+L%7*VXB|_P$&mYVTRP7)vR;i?01kF|`A^#*TL!;eUYXHl-It}GGwKB{9S z^no-8d6ObQMdSM_PMZ@>P1$8eL^M@$-l9lW=b7Xf-m3U*J2bx|SK&9KNTm*mvZFx66i%^lR;13)aC+9MHXS{C&pdx> z&(t|QhT+)COlH}c$I&p8PSXjz$Gk&HkX#ILC#a9*Q8a81$fSA@Ix(rXV?LjU1$JI7 zu=Cgo1^GEAwEZZ=vb5wH-fUhL#pApa12CCR#81o*R;*RdpApF_*UiXmPUa0xUwN0J ze8>`|R0o+iGnqY3QhhjYyjS)ZNbE6_nV~;5KA#LWnHhE~p{F#2!VIUTQd*A)hi3$z zSmHGK-8H=%mN;7q3-k@b)h%&KKJu`W!@(}r>o})X%kgnO9b90ZGw>7hL-9=Oz>FYT zW*$o$EJrM-(0a1p;xj=srR7Yk?6X?b@>!~7M9#n}z8`viXz2mAiXlG?J(Fv2)`yaU z<5+$;zGHp_o&~!be?4{~61~nwi@nK^%B-zd8;^?5s6u=WI;OON23u@01Ae69vIkGC z7Y)KZ;B!^uq%;l(3$>E(>e;A(&qH&OA0?d|T3{-EQ>ypT(tG%_p}Hb?j3Rif5cFYF zoGj(}eARjZp5k4tKeLm>AYX{)DQ%>oOLp2Hu%?Dxgr}gd`;22I-mA!a9WyoDG`?ZD zfo8A)U#x~+B0~o<90|fp(H8S%(lZPY}NINGyZ5t#}X04!MqdkeXcU1nj8RfzTI;8N?Z3*d<5W3p^|D1IQHB2-h(T~N ze8~+3v(VW)r?jo`xX(IN@zrro@@ZpnGLw}cmZv2>W~@L z>UtxB1AaW(F&VMOcD#z85dO+)|TF9n`c=|>(OyP1xqH@Ux zH>uYCpoV&*Q-s3qdlYCf1cpCA9VQl9OKo5=_C=n`&wW{8BU)wIkF#bG!hlLN28(PyBB3 z%g}oOhq}gGqv_>nlIo&N*{BGw5Z+Nq+qk?2Cbj&PGN?mctMaSx9`md5lsZ0%dzej; zHqvq@o>b-6D8kp`iIczMWuw0oqvYw2zzO2dwdy8{p72fOY&R%ABeOU+jLI=y(A>LkR)(*jnA}l91#>o;^CISg)YPxHtdbV$= zs@@AqB=`{tqXLA|c>{zHiNtS&5buBxNW1|;yaQiV_jJ$BUhwSj2VqOI?yfp@>U^h8 zojP?+|7iM?<*Q@npIQ_?Dn$_40XjxrNOJ4@GuS+et?X?}B?pi!1 zUPzKmlY(;U3Ek5&947cE%f+fC1VYG+t*E+FO3fx!tq^uoO$B~Lv(2j+0 zqy{zVdjbH|j2jRk(1_>hh=lpmtd}O$ON+SMoVGPhs%9kV=&p<{v5RbhU1F2$vbwp> z;*hSB$lG5BB8VgKzXs;yDqb(}*<3*6D~~7A7EsoKfpj=YSierJCyZKd$~8P|hjIaR zTE4J8;548_&<~7~Zm?B#;TX!SP!c3u&n4VsSD*(BscqOzyLsn03d%kY^{^MQ2v_mD zhTnDkUIKLXGFxMp*-c14)q`$O%(v1YpwbC^VC$Jp|FYM0kK;=k_I0bfP5YMhDDtIG z0;_;#rNWOo*1P+X0rQ3>p^10*zbWrnyS~?<(h~bZvoTg;=LU+IzHZ)EM`Bs2?CpM) zk!Mm!4GQ@h?CeD12Ozqi^VV9_>+!G$L9I9KSFA^2!s8ukwbRIKA`VBX!PCY3Xt{q;$bFcwlKhv$OJ0ZMKO0H%YfbyMbw3VUP`PKhaU|i|EjTWC zn&aX8x`6YHqbrQR86M*tF#c*JjOUv69qS1vU4v-<=oR{70qJPs3c;U-M=%cre;5hD zD^2@V>#aRWu`V*UJR%8v0Fn9_2yh%}Cwcz?yg@tWAu;Ezfm6A}zZCFJ!KuRj*Ws}* z0Q;Xu!hW@Bf7yCdBi2?4hnP?fFPM;s2Es}cDC3a#`)7gnnZ{Q5{xv+lMd16#NcdiE z+OJtpsE~RQNe5nCNQ+oIg!>dY<2IHxNu^oz0e9G)7#|xepbo{RgxsCd98A!XhXf}d zS-k_l!7g^kFmfc|*PHfNaNy$r^TYDMH*nDunIK@7BT5(q{kaPCGqb1wUpy6H1b5vF zqXNFSfe2@d8c_Mktx>v&wDqPIX_CZTT4Bub&PZh4wmcuPw~qHfr#JneDsEM(_%AT8 zl+-+xl9r()dsHQz-$3BA6-(@D?DjaIM*@FX0Y7Fy1?JJIz^nkwTcd(mLv(FD*@egM zTgY!4NA{iEi;L7{77^Arw(j2>T;1niv(@@&=-&Z#~?4^rl(Gxw!#2s&SAY?_NFBT!H!d zslc2An4g{s%<&gHRm<;hnHpa+x4e7BEl*!+%mvrn^5*nq+Gz!`yWMw-EARH~%HYlK z#JkWH0Qsy`fw@$UshS^o`bz&8=S=r^=zyv*!?|tJZE<7b^fSD_#e>O@urL% zMfbPbs>;lav8)Ses~S^gl-7DFC(=uGlwD;uiu7kc^u=T{kDUx#ox_yXOt|83>w zs#PZAyC=$_4bsxgFB)W6t5tROC{0$f3~HdV+@6{C+hi|5zt(3NaGswYa-KI%<4|8O z^^$w&k(|SGW``E#Kb~mMb@p6mN95u4!TtYk8YlY2A_^EhEWdOh5ST5FL6KDvK!00b z;bZXV$Ekb#{AC4--Bjl!Cy@wDiq1hUtHY_tD^SxCcisT8uA1x7P)~=xy3jJN8btxf zDXUovy_USHrDg?{I){X+-AY-7Yjb3Dku}Uz?L878{3y>%Rf|)Jyi&HwmNr$rLnF!w z^4A$&bV^M~5+-<=&nHARC)&pAT=AOn0B?&jb{$<0)4iB@8sR$M&(xWA9Lp${xFD3B zkH^)bE(S(v=!;Hm%qD;4`7C6;u z6DOcM6zZE$bBqM#>$F;-d%kplMy8@iG_9sR+Dbc^uCYsa1g(LBQxc-34)wcK%bop1 zHB9c!L9`KjpvqJ|mF>0H)`XAeO9wk0%6ZHkWNy5Ga%fzO>Pplsb4~YgnKoQ9b$Os? zfJJwDa%@aBa=w)ez0sErb_@(w%Nhf0O)#hkSz^>{7XuP?QqrN&xQF)%lx@{nPTiP$ zjz<$%3a0U4CY!2;Vn7=(p%LGMt4;o%U?Amf~H>V?1kE-mg!y+3+nWbG*;qDXU7+QZlX($=L^ybG>}5dncmjG zHd_D~olwnF;jo&5%xU{UUeaCFPnbj?nT-4z)<$#lu;lZoZ#C8^#3@5j4Q4^Nv=BZ!dUL23n3RdQyS|QQVJD`9X~(>?o~iSi(g*-b2L((l z5AvL97VT@-Zrz4H8@%lfu-7dW`!Dv`>%5>g*=@>gWQ^Np4mf~yCc^-e)g@_R7kQFp zk7w0o*ktIG+p`3Ky0o^Cr)pX3N0RJ0%O3i>kxw9n|q{P{+A3Q=`;T>tsI{_{8dNmX4_$o&K&qX2Jco|^urDSJ`3=mBiO zP@7{dRg3+rYNlCqeb|PU6I16cdh_<^ayrUz3Pj9g($iBj-BwR` zzpC!t8Iw+MI3f`sft*f&TpS5E2}yvE8$xb!-}ilx`z9B^SKU23vl=OcB>xb;Z+E`# zI$pi|{rc65cR20PNn+2})gWw3UEq%i4BqTVY_?mNW3ZpshT|_N_>T zk4Pu>FwwIkny#O}Yn00JRw{g$)lp&3aynKLI3Z5+>>#$7Jk8Y4Uq7^81mLo>08+5W91F*KVbuWTcY7 zb6~j=J@Nc0$i3u-J-K8D?ZHx%w0zHLx^d56ayqQFrjA@M=r83)X|nCAO2_o1mpw*D zQ@XAtrenLy=B8s}T4yZM^`d0QvGQ6;40YU)l2sNn?IhxLnr>`}X~(y<#`8@LG1Ic0 z3yPI_b3^R(+L~@@(5+%VKeNJTRx*FN%@$J`jpGd}ySwc~?1EcJS~$A{2jreex4U?A zT+eSqlXORe7Ry@|0W11YK?SO-rnCgr86SPbHlx*;T~@!F1T=Uwu=)_Y(4Ot>?1@@Ug?xm(C3{g-33NmKCzm#?4)H(dpe~v zg=up}-0PWx)iDm}ZgE{6NR`@|%4OQ4du%XCYwoPgoK6*-KDq3&7Vb^yDXaw!g$MF@ zyh1442mVfH8gY#(o;t=zu8QFS_q!)Q8LCf%1|CT1>8t@h;a;PGt!ngoh_Dhp0~|jy zr3abgMQ~iLT4rW-)yf|9QpfAo&QznITe2)`RU>c6RqNEst))%w#gy4ZpT*idTNYDh z)!CC`XQI6G2SC@%kIu&Yx4X~MnF8v$f|J%(8GJ96 z%J!QrKXfjX=yM>;vr~Ew%W}?~8HFlFs#?UqNnN()r&4Fl=~R`p+vVd+VH7WQm5u0h zbP=nZ&6ZR*ss_&Sg@>0LC2XoXVNmWYjL5ui?09;JWq&TRP`~G|>c~bGIwxi#CAC!R zlEkRIxn=hjuJb%t_Wz1wdOrN&d`d5XT1=LE_C$Z+=r0ucxlrW8DZQ}Rk^879Z7!k) zi~D(#{PkcVRr9iB!TU?}`5=a&l{es;d%d)<6<~h zlF~ZZcKPUVqI01V+a}0Lv;l+lQyQ?GAAy|bTwoX_*S#>&R<2YlK}EA-%s|4;`e(%< zR>aD7Vl$a%<_rfpVW`?(z!{`kda%O_w6uT#tN@tBUbj8pZUGu$JTSXEq3?$qUeFz$ zs@-ryTlnFFdiDjgxMUJXqIqF21i6;2J*P-0KtMfYE?uQZH}x)Nhw{>k*onVjk_oOY zjGw{;pH7I#)3p9qp(G_X)jf~fT0uO^%c);g#w zRa+^0Q0lKsXRT93G3%9&x4mBN_(DE2*fO&`oar-|TdUoT)Kq`Qn;7uCDy3H!!-cmPkn?4eviGUNQ@*@xFvx3CdM#%U zB(`li26@#ej`@nK5y^4PSElq;SEKROlW5$TGh#pt2r8RBf(rKt9ybW)>)dIBV9pe3`1%aNye_5Jvk2Ub7$TTYtr_tK zMD3wbAoC4lg5*GE$iO!uV*eLT{U$ibH>dP15W-~+UY9utqn0@WQIaoP+l;&{+$`9(HKD%4=I458u(e3E(G3F9i&_ zV$%k>Ge*P1G=Z$pfF5&H)iSV(8%Jw3tK-{U%hRQZI|Xe9Hw>*1+}zCp3GjhNOn_5E z3rHNDp_n_%n*f+bOk&{DJO2x~WN6U4w!)=%GhBMtWVrO6 zl)jxg`xrR8B3%09uu=b!sB7Cz$6mf`rP&$)!Ee}6B-_;}%09mzHQ<91DFIg z_jS34?wj8P%D^umSxc(5S`M9nfQFE27?VTvG}xTWBXl@5{MPTU^#Lf>28&i_?a@Um z%7TfpM3I#YmiUe8_+Px*)IqSTg7 zs7z6y57ouIoy1`$3}bw<%BGHO71M{$ZWq(ss^xy}kEHYwbZgz)+-di5cgFSIS@)iV zW%yC|h|Q`Nd+>c6=uW75Qqhmq#l9gu(;5Eplzu|Y;4$m|{$xr&B@XC8uNC^uVx^{^ zZqP@?!7*;k?w@JU&x%7^mN(7R&o$`h#VoX!l{or^2K^#iL+mZYX3fzrLCPVAMH64s zFE{8{m@WS70^h${7c*Wv*TAnq1N%mK(e&#L`VFzKI4on}H&gm8ae(WWf?=9aURUB~ zp^7HA)WP@#O@9bB zt^sMZ8E|8PuPn5z91s1)Vq4QtUvl{;$L=3b%w0^&<+emnIk-O#Bg@ZSAMCNY|i9Fwq3tgglAMKRlz0j?m}+)u;+v}oLM(-2QG zqkA<_l>-Bhu2m&@xvTKXw+?P z#^5D!G)oE6mnJX4EV0|nZy?nzSc2Hg?P(%Qt6MSHP`5G3BPQ0o0QVv0+E)f_{jJ#Nn+4$W%&oJ8#-%E2Y8gu#s)k>&n|-&f O)e2rxbppRhtNIC7*ZIZ( literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/routines.doctree b/docs/source/_build/doctrees/routines.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1f3c8a93515d99cb32683950b2563c3ca897a4ab GIT binary patch literal 3568 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≫Dt@KN`b|0;8y}a#Z4(yxZd4P!=Kt|SRMQM&#>{Z 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 J@f($<{vUW(q%i;h literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/stipple_plots.doctree b/docs/source/_build/doctrees/stipple_plots.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f57d36d44bc72d17fd4c409a415491d391c5f01f GIT binary patch literal 5623 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/stipple_points.doctree b/docs/source/_build/doctrees/stipple_points.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1a47ac1fc586d907bc8e04a8fdacce0def41eb7e GIT binary patch literal 8793 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/stuff.doctree b/docs/source/_build/doctrees/stuff.doctree new file mode 100644 index 0000000000000000000000000000000000000000..402f05d5756347a17df65ba4a024e4c3e0bd5ae2 GIT binary patch literal 2832 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/user_defined.doctree b/docs/source/_build/doctrees/user_defined.doctree new file mode 100644 index 0000000000000000000000000000000000000000..82fb85dbe5799cbdc46ea66088d2d3b99c10d564 GIT binary patch literal 4763 zcmeHL`FGq_6?U9@o5YTtHlb}AqLQW_r=FR(bsEQzLV!|&VG1O#ga#or(wljzHIlC0 zlRYj78Xyp}@B32rec!jT@B7Z5!}s23?6I5naQFod2cOuPk*?nR?su2>T|F@9`LUO& zAe7Z8_PH$SuWcTw6786|NP{`;EVHr5ZF9Aja7kC?G*mu6H83!cNuF9hZw3+fEw_Vv z!}arraf5fGn@HSL za;MFubX!=qWYaD-;bmzGSdNUd)Z?_f&PqP_;?&ho(|Dcjbu$$=<5)$p;*L~qs%Ta+m`!O+l>&LiAfFN=?8X9jWp1HjEH+SA;%3)uZ^lMF5rjUF(A73w zvzn*1`NJnh8Q}cPV zP19n^WkX&2vQ0B$*v;5gh%~38OM_UfNG7^P3XO>(h^ zCD$==o!Bp~7YD^5He{ZnIRVVKmc?OP++>R*wz%0AWjhntS`-`Jwtc^Iyo1!9e}qkr zgRk3jIsq6$Z&=M5Zq^VwnhQCd#AP_-%YKE!8@oJN%>T7SRb9%P+<`TRK+DV)$%WKZ!SC^FKO8u!++=#Mv zvZk*^NvV0tYgSY4`sL|boTyqWby0qv>=h%RxwX4^EL9pODAd#beVJ6cr&c3xdgj6j zyM&diUL2L1Row#<*W(vX+B1DDjc>tA&(Ul>7tN&84i}9*on@m*%26gOoX+(VRAj_> zFYg#K;=jg4x(7M;yqwO1cvDJuUoq#AOoZcYuvQ)n{o?Y3CmUc8)q9p>3bX)ll7U4&^Xe0y7& zG!?GJM7KxjMX0%@XwXSox|1{?)=7l!6(XlVLz~#~AL$i3eaj{h<*6vCqB^1$FCU*d zI(JO}+|vDTwws&%CMRZ&-l`4spIP0NyFVS1&!?t4&^3Xa#)HL$`@0uruH2z!Epzam znnv$crbedwnwBtK>b|l#E3VX#4)zjx8HxOV9wB?S@JJyFqn%TPG&7x1n8M&$1OHro zjqOs1yF~A5^OWK`8{bg7MwcZy5gWzFt{zKsl5A40wHtBh^eiPQn;^ZnXl3*CicPER znr-Hexz(|0jg5JMGFn^G{WiT=2b1mYiE^X(UIGoifpAm4=Qh1m!_o&VaKEh1Mgzal z=MO-ikN0DdbkU}lv+>?$T>!7h>6L6Uz_Fh~U^|fZEv_V8vguW9RC1-z$0fbGPh2)r z^mHEirF+~k!&F0;V_MJYHD$K9M}?yWEr2gedM#jFjiuw%hkQ=(9FM#J`r>tUwmWTl zFvUQUr6IkZ9S}+-i?y1HW6VqeSIugiwrWO=(;L_r81T4Wn%;OBqYO{93pkV_59__D z&L$uWg2d5h5fp)>HzSTJ)?4(@yoC+nPP#^KW#b_VJwxMyz0c`wY!HLT+u4{=KMG?O zy+b23+&Up&;UT>fx_dXgz+@G5XQOvvR1$8e3WIkq4YBb8L?Q3rQx|h}b^}k-ICX$D z_CcuA{VH(gg^1gG*`$Uj@rb~NA-tsbu_2!~vKGC+&L(-g!F62MLM{d8iaxN;4#t^E zGWAGneh?!N*zgoR2uKJmWR}y>2~HnENcQ+pUCu^IN%}Cj!blNB&A2f82+Sr{-89mG zu@-mR^wB!or+IG%p$VF!IOb94Mfw;t6Hh8fj?Me@aW=&}0Y)cebtVgLJ^^lqAqSvj z>61mQkZ>!33{;%br?9dY#_qDi+inm#u8&F33`n28%nrhn_C}#?MjgYM=IS%+Y$uOa z=(F|0uSD|9hac^bKBwvHBr%dKK-#8}8%p{-%1Ltqg=o5N;qe#N*{<%~=;-97F9N1c z(Y`GE61LbzJbjrBWvW?Ops%n}@wm?Cuj1(->JJfpjg1-0iUbK?XL}q!kZuE17QB3; z&c;x{5TDJUL*GPS8dGk=Sq*$8=vzypY+`F3(YM*e>H66-&iUJ_^Od=iw=d9l*hp`V z|1LZJ?~S(KV|&m96vjDSOQ2ZMLzmfDi$~D;I#}O_YbJpk*RN=uhd{EYxHB?R3qhf91*lch+joN!O$B+Q~Z?O zu$9eiMf5ZAAe+$r&e>$}=WHDM;fZ<0QUFc+A&Dm>Dm^XWI2*)F_@Kp}R&|5i6%!_G$g{9Qe3uzlMPfbM&g z-!BbxXZ}Cr^vAN8!X&;|EM!Q~{#Q8NbLUSv{aGBs`2a=x7o%v+^wxXZfdL-FI>vN1 a*6YNQ{%X_T*s#thyjS>pPXEXn)qet51E#S6 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/vect.doctree b/docs/source/_build/doctrees/vect.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a830a88de5fe9143ece6024cd0a7783ac2d91c16 GIT binary patch literal 11422 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/version_0.1.doctree b/docs/source/_build/doctrees/version_0.1.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ff82b710faa3f462ee97c8fa4a910446328e652e GIT binary patch literal 3203 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/version_0.3.doctree b/docs/source/_build/doctrees/version_0.3.doctree new file mode 100644 index 0000000000000000000000000000000000000000..b14c5494b138458b96a286f9c641c93e1c4ff984 GIT binary patch literal 4057 zcmds4S$iBu6;W_T{G2DPj}z0 zYH0*CiGhH`zVBPu_kG{@J?z`h;Z!f98GUv>9(dwGpQgKOx#!$_Zk>8y(s4s4(VnlG zLFfuqHIID}=qg=y@&Zk!w5QHy1Kt;UGZKm}Pid-te*eV8#B#H?E*u@kwa5>(qUrYe z1-xDtvGT&8w%j~bb0iOXm^9Nqe;l7~Y}TAG&|wm*+J>iPF<;d%T!#@=+6gOnVHHPuzKg)a5}>kr}7xT8qs%K359Aud`UC!=1I*B;tCD?J=C4u;|fp zfwQT6{0$b>XO^s^xy@0 zLP}3WD6%CN+wx>PTkEK7Bpse~q)FK6ly1fVHn9_vJZ^${(pWHbMjqmbh@LE`xe05k z4C^U%X)xcC(o+rQLP_UFm2@lCKAq#08PKPVtz7^eu6Ua~b4m`J~bcexn>lmI} zGCaHaLDlhI%p+N)XCT6}DLvCfcs1(oHrIu8T>+V9YA==Bq&s(FWwXN-=vju6yDk>? zOi9EF!hYnnpA7)dNvUlB+&Ko|>_q|io)$6p?T#NhYgKwKK-`_u^9+cG0pgA@5Y_7H zID%T&gHCEn_{cy_OHoTqlZr4l(6uhQn|U{A@PVgl5T1ENx5BⅈUaM#x<*}_@42# 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 KozZ{NZtK721PGk~ literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/version_0.5.doctree b/docs/source/_build/doctrees/version_0.5.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0f732e7704ee73baea9676c0a9696c28718bd6d3 GIT binary patch literal 6305 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/version_0.6.doctree b/docs/source/_build/doctrees/version_0.6.doctree new file mode 100644 index 0000000000000000000000000000000000000000..073727f0b38539c4635366de5bb8a0d2a2915f77 GIT binary patch literal 18629 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 D&TBI2 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/version_0.9.doctree b/docs/source/_build/doctrees/version_0.9.doctree new file mode 100644 index 0000000000000000000000000000000000000000..562e23cbb40873a28bef2f6d61b58a37abf42edf GIT binary patch literal 9531 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/version_1.0.doctree b/docs/source/_build/doctrees/version_1.0.doctree new file mode 100644 index 0000000000000000000000000000000000000000..7406d0ca5b70e48229e6dae489f60eadbb2335f5 GIT binary patch literal 7309 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/version_1.3.doctree b/docs/source/_build/doctrees/version_1.3.doctree new file mode 100644 index 0000000000000000000000000000000000000000..7d5e085144938051172b60080128f3832094ddfb GIT binary patch literal 21517 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 VSD(hC2Hw)=@FSql<8P~!{a?8+0qFn$ literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/version_1.5.doctree b/docs/source/_build/doctrees/version_1.5.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f23dc50358d9bcd308745b3cc1700c84a4335cd9 GIT binary patch literal 20554 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 X&iJd(8b7> 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/version_3.2.doctree b/docs/source/_build/doctrees/version_3.2.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a2e9ade7a19097c67ab9dc0cb4de505c828759b1 GIT binary patch literal 26940 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 QmKOPRsry4b>rK}F4|@~~82|tP literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/versions.doctree b/docs/source/_build/doctrees/versions.doctree new file mode 100644 index 0000000000000000000000000000000000000000..efed82801aad0f5257a9bc3cd8e48302d0827093 GIT binary patch literal 8286 zcmeHM-ESR76?YteU4Pq2Tq-AFt0*K@;3A^ ztnG^$2_A|X7=%!_j|d?l#2>%|5<)y6B%V>l6XG2q-VqWKzcagc_hw^Tv2S0HsO0AE z%$YOicjlZk=bZWO=*M3*hV*}GPDG9y?A4iV2cgYHswV8vN_-y3^rQ6U@1>8^%c>T$ zT@fa+#Zxr|3d?alJLW<9ZmMR9T)Lj9=j+D>x1<{e#d2rV8FR+pO)on&H7Z@{@xCcF z|G;BGz-=Su9%lj)5G_bY9`ZesVIPVQ(oC+gh(QXOIt!|17GgUm)mSd=rW*0wfTx>D zlc`B2W$ZQ+i9HC_N!J#HVBGSUppEf+G+=)AYr;;V@}tSD?U=WSCQ;*(wP`AK=A30` z+Bxf-bk3=jRVVcMDhurHs?}P7I0FCfxO~^lbiBI5V*$m8dMqIG`HkVE37j>6VC|Si zPQO}=hYmNaBqn@DzR+-m@qVtR_qCcXJ4@$Z3>WZs5r3EP_cE|MuQ)5tIp+$bAL(J&D5jc;=W%IzF0l0sr~l+@G-JAw z`+d`Dy-~kv+zVXkGOuR=Mk3sxZ9M2oCk%`=LqZb|x?hnuj9u4mb7_dKAU4`g>Y0gR zr!VX8rGZ$MDtoJ6W$d{WG6scw35Iqk@tYvJlkp}k(s|tNK~SrW`ZeR8AI0GgH(E)c z{fK$4>>6&M_24u7a0AKX7K1ldRKRi-9GOpv+d4Y#aX>N$!aWOXG~R-v8j%;uJOY#_ zyO+bNl9f__=jc*TK;eys;-a&P9fX%_Kt%V3Mu@5BCuT$vbZ%8nnXLXZp(3 za7xGdB!_nlP9^rg93A^Ku>W}=>=zpK&l|53VzNpE#E8d;f)NY2CyXS5GM;l>fZQ1&4mxYeQi8*;tlot`>nwMMuyP>amm2ji;KIiR=K95jui;`S&`H2g{D1`|n0v

    kMnp=;|>QR3?M@)JC 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/doctrees/vloc.doctree b/docs/source/_build/doctrees/vloc.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f2e0fb3f05c3616f59eb79f724542f96df76292d GIT binary patch literal 7780 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 CvI0K< literal 0 HcmV?d00001 diff --git a/docs/source/_build/html/.buildinfo b/docs/source/_build/html/.buildinfo new file mode 100644 index 0000000..4932dff --- /dev/null +++ b/docs/source/_build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 18862850faefa04761953d23b804616f +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/source/_build/html/_images/cfview.png b/docs/source/_build/html/_images/cfview.png new file mode 100644 index 0000000000000000000000000000000000000000..96f41144cfcdd9b43a1d06fbf153144ba24714fb GIT binary patch literal 65100 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

    ?1B5;-n$dlxxqFU-EUV&MZVNiEU^AXSsLw=+ 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 literal 0 HcmV?d00001 diff --git a/docs/source/_build/html/_modules/cfplot.html b/docs/source/_build/html/_modules/cfplot.html new file mode 100644 index 0000000..e947468 --- /dev/null +++ b/docs/source/_build/html/_modules/cfplot.html @@ -0,0 +1,4021 @@ + + + + + + + + cfplot — cf-view 0.6.10 documentation + + + + + + + + + + + + +

    + +
    +
    +
    +
    + +

    Source code for cfplot

    +"""
    +Routines for making climate contour/vector plots using cf-python, matplotlib and basemap.
    +Andy Heaps NCAS-CMS February 2014.
    +"""
    +
    +class pvars(object):
    +   def __init__(self, **kwargs):
    +      '''Initialize a new Pvars instance'''
    +      for attr, value in kwargs.iteritems():
    +         setattr(self, attr, value)
    +
    +   def __str__(self):
    +      '''x.__str__() <==> str(x)'''
    +      out = ['%s = %s' % (a, repr(v))]
    +      for a, v in self.__dict__.iteritems():
    +         return '\n'.join(out)
    +
    +import os
    +import sys
    +import cf
    +import numpy as np
    +from subprocess import call
    +from scipy import interpolate
    +import time
    +from subprocess import call
    +import matplotlib
    +import matplotlib.tri as triang
    +
    +
    +#Check for a display and use the Agg backing store if none is present
    +#This is for batch mode processing
    +try:
    +   disp=os.environ["DISPLAY"]
    +except:
    +   matplotlib.use('Agg')
    +import matplotlib.pyplot as plot
    +from mpl_toolkits.basemap import Basemap, shiftgrid, addcyclic
    +
    +
    +
    +
    +#####################################
    +#plotvars - global plotting variables
    +#####################################
    +
    +#Default colour scales
    +#cscale1 is a differential data scale - blue to red
    +cscale1=['#0a3278', '#0f4ba5', '#1e6ec8', '#3ca0f0', '#50b4fa', '#82d2ff', '#a0f0ff', \
    +         '#c8faff', '#e6ffff', '#fffadc', '#ffe878', '#ffc03c', '#ffa000', '#ff6000', \
    +         '#ff3200', '#e11400', '#c00000', '#a50000']
    +
    +#cosam is a continuous data scale - purple, blue, green, yellow, red
    +cosam=['#780088', '#5a00b8', '#4600f5', '#00aae1', '#00c8c8', '#00c87d', '#c3ff00', \
    +         '#ffff00', '#ff9b00', '#ff0000']
    +
    +
    +
    +plotvars=pvars(lonmin=-180, lonmax=180, latmin=-90, latmax=90, proj='cyl', \
    +               resolution='c', plot_type=1, boundinglat=0, lon_0=0, \
    +               levels=None, levels_min=None, levels_max=None, levels_step=None, \
    +               levels_extend='both', xmin=None, xmax=None, ymin=None, ymax=None, \
    +               xlog=None, ylog=None,\
    +               rows=1, columns=1, file=None, orientation='landscape',\
    +               user_mapset=0, user_gset=0, user_cscale=0, user_levs=0, user_plot=0,\
    +               master_plot=None, plot=None, text_fontsize=None, cs=cscale1, \
    +               mymap=None, \
    +               xticks=None, yticks=None, xticklabels=None, yticklabels=None, \
    +               xstep=None, ystep=None,xlabel=None, ylabel=None, title=None, \
    +               title_fontsize=None, axis_label_fontsize=None, \
    +               text_fontweight='normal', axis_label_fontweight='normal', \
    +               title_fontweight='normal', \
    +               continent_thickness=None, continent_color=None)
    +
    +
    +
    [docs]def con(f=None, x=None, y=None, fill=True, lines=True, line_labels=True, title=None, \ + colorbar_title=None, colorbar=1, colorbar_label_skip=None, ptype=0, \ + negative_linestyle=None, blockfill=None, zero_thick=None, colorbar_shrink=None, \ + colorbar_orientation=None, xlog=None, ylog=None, verbose=None): + """ + | con is the interface to contouring in cfplot. The minimum use is con(f) + | where f is a 2 dimensional array. If a cf field is passed then an + | appropriate plot will be produced i.e. a longitude-latitude or + | latitude-height plot for example. If a 2d numeric array is passed then + | the optional arrays x and y can be used to describe the x and y data + | point locations. + | + | f - array to contour + | x - x locations of data in f (optional) + | y - y locations of data in f (optional) + | fill=True - colour fill contours + | lines=True - draw contour lines and labels + | line_labels=True - label contour lines + | title=title - title for the plot + | ptype=0 - plot type - not needed for cf fields. + | 0 = no specific plot type, + | 1 = longitude-latitude, + | 2 = latitude - height, + | 3 = longitude - height, + | 4 = latitude - time, + | 5 = longitude - time + | 6 = rotated pole + | negative_linestyle=None - set to 1 to get dashed negative contours + | zero_thick=None - add a thick zero contour line. Set to 3 for example. + | blockfill=None - set to 1 for a blockfill plot + | colbar_title=colbar_title - title for the colour bar + | colorbar=1 - add a colour bar if a filled contour plot + | colorbar_label_skip=None - skip colour bar labels. Set to 2 to skip every + | other label. + | colorbar_orientation=None - options are 'horizontal' and 'vertical' + | The default for most plots is horizontal but + | for polar stereographic plots this is vertical. + | colorbar_shrink=None - value to shrink the colorbar by. If the colorbar + | exceeds the plot area then values of 1.0, 0.55 or 0.5 + | may help it better fit the plot area. + | xlog=None - logarithmic x axis + | ylog=None - logarithmic y axis + | verbose=None - change to 1 to get a verbose listing of what con is doing + | + :Returns: + None + + """ + + #Extract required data for contouring + #If a cf-python field + if isinstance(f[0], cf.Field): + #Check if this is a cf.Fieldlist and reject if it is + if len(f) > 1: + errstr='\n cf_data_assign error - passed field is a cf.Fieldlist\n' + errstr=errstr+'Please pass one field for contouring\n' + errstr=errstr+'i.e. f[0]\n' + raise Warning(errstr) + + #Extract data + if verbose: print 'con - calling cf_data_assign' + f=f[0] + field, x, y, ptype, colorbar_title, xlabel, ylabel, time_opts, xpole, ypole=\ + cf_data_assign(f, colorbar_title, verbose=verbose) + + else: + if verbose: print 'con - using user assigned data' + field=f #field data passed in as f + check_data(field, x, y) + xlabel='' + ylabel='' + + + + + + #Set contour line styles + if negative_linestyle is None: matplotlib.rcParams['contour.negative_linestyle'] = 'solid' + else: matplotlib.rcParams['contour.negative_linestyle'] = negative_linestyle + + + #Set contour lines off on block plots + if blockfill: + fill=False + if lines is True: lines=False + field_orig=field + x_orig=x + y_orig=y + + if (plotvars.proj == 'npstere' or plotvars.proj == 'spstere'): + errstr='\n\n con error - blockfill not supported for polar stereograpic plots\n\n' + raise Warning(errstr) + + #Turn off colorbar if fill is turned off + if fill == 0 and blockfill is None: colorbar=0 + + #Revert to default colour scale if user_cscale flag is set + if plotvars.user_cscale == 0: plotvars.cs=cscale1 + + + #Set the orientation of the colorbar + if plotvars.plot_type == 1: + if plotvars.proj == 'npstere' or plotvars.proj == 'spstere': + if colorbar_orientation is None: colorbar_orientation='vertical' + if colorbar_orientation is None: colorbar_orientation='horizontal' + + + + #Set size of color bar if not specified + if colorbar_shrink is None: + colorbar_shrink=1.0 + if plotvars.plot_type == 1: + scale=(plotvars.lonmax-plotvars.lonmin)/(plotvars.latmax-plotvars.latmin) + if scale <= 1: colorbar_shrink=0.55 + if plotvars.orientation == 'landscape': + if (plotvars.proj == 'cyl' and colorbar_orientation == 'vertical'): colorbar_shrink=0.5 + if (plotvars.proj == 'cyl' and colorbar_orientation == 'horizontal'): colorbar_shrink=1.0 + if plotvars.orientation == 'portrait': + if (plotvars.proj == 'cyl' and colorbar_orientation == 'vertical'): colorbar_shrink=0.25 + if (plotvars.proj == 'cyl' and colorbar_orientation == 'horizontal'): colorbar_shrink=1.0 + + if plotvars.proj == 'npstere' or plotvars.proj == 'spstere': + if plotvars.orientation == 'landscape': + if colorbar_orientation == 'horizontal': colorbar_shrink=1.0 + if colorbar_orientation == 'vertical': colorbar_shrink=1.0 + if plotvars.orientation == 'portrait': + if colorbar_orientation == 'horizontal': colorbar_shrink=1.0 + if colorbar_orientation == 'vertical': colorbar_shrink=1.0 + + + + + #Set plot type if user specified + if (ptype != None): plotvars.plot_type=ptype + + + #Get contour levels + includes_zero=0 + if plotvars.user_levs == 1: + #User defined + if verbose: print 'con - using user defined contour levels' + clevs=plotvars.levels + mult=0 + fmult=1 + if plotvars.user_cscale == 0: + includes_zero=0 + col_zero=0 + for cval in clevs: + if includes_zero == 0: col_zero=col_zero+1 + if cval == 0: includes_zero=1 + + if includes_zero == 1: + cscale('scale1', below=col_zero, above=np.size(clevs)-col_zero+1) + else: + cscale('cosam', ncols=np.size(clevs)+1) + + plotvars.user_cscale=0 #Revert to standard colour scale after plot + + else: + #Automatic levels + if verbose: print 'con - generating automatic contour levels' + clevs, mult = gvals(dmin=np.nanmin(field), dmax=np.nanmax(field), tight=0) + fmult=10**-mult + + #Adjust colour table + if plotvars.user_cscale == 0: + col_zero=0 + for cval in clevs: + if includes_zero == 0: col_zero=col_zero+1 + if cval == 0: includes_zero=1 + + if includes_zero == 1: + cscale('scale1', below=col_zero, above=np.size(clevs)-col_zero+1) + else: + cscale('cosam', ncols=np.size(clevs)+1) + + #Revert to standard colour scale after plot + plotvars.user_cscale=0 + + + #Set colorbar labels + #Set a sensible label spacing if the user hasn't already done so + if colorbar_label_skip is None: + if colorbar_orientation == 'horizontal': + nchars=0 + for lev in clevs: nchars=nchars+len(str(lev)) + colorbar_label_skip=nchars/80+1 + if plotvars.columns > 1: colorbar_label_skip=nchars*(plotvars.columns)/80 + else: + colorbar_label_skip=1 + + if colorbar_label_skip > 1: + if includes_zero: + #include zero in the colorbar labels + zero_pos=[i for i,mylev in enumerate(clevs) if mylev == 0][0] + colorbar_labels=clevs[zero_pos] + i=zero_pos+colorbar_label_skip + while i <= len(clevs)-1: + colorbar_labels=np.append(colorbar_labels, clevs[i]) + i=i+colorbar_label_skip + i=zero_pos-colorbar_label_skip + if i >=0: + while i >= 0: + colorbar_labels=np.append(clevs[i], colorbar_labels) + i=i-colorbar_label_skip + else: + colorbar_labels=clevs[0] + i=colorbar_label_skip + while i <= len(clevs)-1: + colorbar_labels=np.append(colorbar_labels, clevs[i]) + i=i+colorbar_label_skip + else: + colorbar_labels=clevs + + + #Add mult to colorbar_title if used + if (colorbar_title == None): + colorbar_title='' + else: + if (mult != 0): colorbar_title=colorbar_title+' *10$^{'+str(mult)+'}$' + + + #Catch null titles + if title is None: title='' + if plotvars.title is not None: title=plotvars.title + + #Set plot variables + title_fontsize=plotvars.title_fontsize + text_fontsize=plotvars.text_fontsize + axis_label_fontsize=plotvars.axis_label_fontsize + continent_thickness=plotvars.continent_thickness + continent_color=plotvars.continent_color + if title_fontsize is None: title_fontsize=15 + if text_fontsize is None: text_fontsize=11 + if axis_label_fontsize is None: axis_label_fontsize=11 + text_fontweight=plotvars.text_fontweight + title_fontweight=plotvars.title_fontweight + axis_label_fontweight=plotvars.axis_label_fontweight + if continent_thickness is None: continent_thickness=1.5 + if continent_color is None: continent_color='k' + + + #Select contour triangulation based on input grid dimensions + if (np.ndim(field) == 1 and np.ndim(x) == 1 and np.ndim(y) == 1): + tri=1 + if (np.ndim(field) == 2 and np.ndim(x) == 2 and np.ndim(y) == 2): + tri=0 + if (np.ndim(field) == 2 and np.ndim(x) == 1 and np.ndim(y) == 1): + tri=0 + + + + + + ########## + # Map plot + ########## + if ptype == 1: + if verbose: print 'con - making a map plot' + #Open a new plot is necessary + if plotvars.user_plot == 0: gopen(user_plot=0) + + #Set up mapping + lonrange=np.nanmax(x)-np.nanmin(x) + #Reset mapping + if plotvars.user_mapset == 0: + plotvars.lonmin=-180 + plotvars.lonmax=180 + plotvars.latmin=-90 + plotvars.latmax=90 + + if lonrange > 350 or plotvars.user_mapset == 1: + set_map() + else: + mapset(lonmin=np.nanmin(x), lonmax=np.nanmax(x), latmin=np.nanmin(y), \ + latmax=np.nanmax(y), user_mapset=0) + set_map() + + + mymap=plotvars.mymap + user_mapset=plotvars.user_mapset + + lonrange=np.nanmax(x)-np.nanmin(x) + if lonrange >350 and np.ndim(y) == 1: + + #Add cyclic information if missing. + if lonrange < 360: + field, x = addcyclic(field, x) + lonrange=np.nanmax(x)-np.nanmin(x) + + #Shift grid if needed + if plotvars.lonmin < np.nanmin(x): x=x-360 + if plotvars.lonmin > np.nanmax(x): x=x+360 + field, x=shiftgrid(plotvars.lonmin, field, x) + + #Add cyclic information if missing. + lonrange=np.nanmax(x)-plotvars.lonmin + if lonrange < 360: + field, x = addcyclic(field, x) + lonrange=np.nanmax(x)-np.nanmin(x) + + + #Flip latitudes and field if latitudes are in descending order + if np.ndim(y) == 1: + if y[0] > y[-1]: + y=y[::-1] + field=np.flipud(field) + + #Plotting a sub-area of the grid produces stray contour labels in polar plots + #Subsample the grid to remove this problem + if plotvars.proj == 'npstere': + myypos=find_pos_in_array(vals=y, val=plotvars.boundinglat) + y=y[myypos:] + field=field[myypos:, :] + + if plotvars.proj == 'spstere': + myypos=find_pos_in_array(vals=y, val=plotvars.boundinglat, above=1) + y=y[0:myypos+1] + field=field[0:myypos+1, :] + + #Create the meshgrid if required + if (np.ndim(field) == 1 and np.ndim(x) == 1 and np.ndim(y) == 1): + lons=x + lats=y + if (np.ndim(field) == 2 and np.ndim(x) == 2 and np.ndim(y) == 2): + lons=x + lats=y + if (np.ndim(field) == 2 and np.ndim(x) == 1 and np.ndim(y) == 1): + lons, lats=mymap(*np.meshgrid(x, y)) + + + + #Set the plot limits + if lonrange > 350: + gset(xmin=plotvars.lonmin, xmax=plotvars.lonmax, ymin=plotvars.latmin, ymax=plotvars.latmax, user_gset=0) + else: + if user_mapset == 1: + gset(xmin=plotvars.lonmin, xmax=plotvars.lonmax, ymin=plotvars.latmin, ymax=plotvars.latmax, user_gset=0) + else: + gset(xmin=np.nanmin(lons), xmax=np.nanmax(lons), ymin=np.nanmin(lats), ymax=np.nanmax(lats), user_gset=0) + + + + + #Filled contours + if fill == True or blockfill == 1: + if verbose: print 'con - adding filled contours' + #Get colour scale for use in contouring + #If colour bar extensions are enabled then the colour map goes + #from 1 to ncols-2. The colours for the colour bar extensions are then + #changed on the colourbar and plot after the plot is made + cscale_ncols=np.size(plotvars.cs) + colmap=cscale_get_map() + + #filled colour contours + cfill = mymap.contourf(lons,lats,field*fmult,clevs,extend=plotvars.levels_extend,\ + colors=colmap, tri=tri) + + + #add colour scale extensions if required + if (plotvars.levels_extend == 'both' or plotvars.levels_extend == 'min'): + cfill.cmap.set_under(plotvars.cs[0]) + if (plotvars.levels_extend == 'both' or plotvars.levels_extend == 'max'): + cfill.cmap.set_over(plotvars.cs[cscale_ncols-1]) + + + + #Block fill + if blockfill == 1: + if verbose: print 'con - adding blockfill' + if isinstance(f[0], cf.Field): + if getattr(f[0].coord('lon'), 'hasbounds', False): + xpts=np.squeeze(f.coord('lon').bounds.array[:,0]) + xpts=np.append(xpts, f.coord('lon').bounds.array[-1,1]) # Add last longitude point + ypts=np.squeeze(f.coord('lat').bounds.array[:,0]) + ypts=np.append(ypts, f.coord('lat').bounds.array[-1,1]) # Add last latitude point + bfill(f=field_orig*fmult, x=xpts, y=ypts, clevs=clevs, lonlat=1, bound=1) + else: + bfill(f=field_orig*fmult, x=x_orig, y=y_orig, clevs=clevs, lonlat=1, bound=0) + + else: + bfill(f=field_orig*fmult, x=x_orig, y=y_orig, clevs=clevs, lonlat=1, bound=0) + + + + #Contour lines and labels + if lines == True: + if verbose: print 'con - adding contour lines and labels' + cs = mymap.contour(lons,lats,field*fmult,clevs,colors='k', tri=tri) + if line_labels == True: + nd=ndecs(clevs) + fmt='%d' + if nd != 0: fmt='%1.'+str(nd)+'f' + plotvars.plot.clabel(cs, fmt=fmt, colors = 'k', fontsize=text_fontsize, fontweight=text_fontweight) + + #Thick zero contour line + if zero_thick is not None: + cs = mymap.contour(lons,lats,field*fmult,[1e-32, 0], colors='k', linewidths=zero_thick, tri=tri) + + + + #axes + if plotvars.proj == 'cyl': + if verbose: print 'con - adding cylindrical axes' + lonticks,lonlabels=mapaxis(min=plotvars.lonmin, max=plotvars.lonmax, type=1) + latticks,latlabels=mapaxis(min=plotvars.latmin, max=plotvars.latmax, type=2) + axes_plot(xticks=lonticks, xticklabels=lonlabels) + axes_plot(yticks=latticks, yticklabels=latlabels) + + if plotvars.proj == 'npstere' or plotvars.proj == 'spstere': + if verbose: print 'con - adding stereograpic axes' + latstep=30 + if 90-abs(plotvars.boundinglat) <= 50: latstep=10 + mymap.drawparallels(np.arange(-90,120,latstep)) + mymap.drawmeridians(np.arange(0,360,60),labels=[1,1,1,1,1,1]) + + + #Color bar + if colorbar == 1: + if verbose: print 'con - adding colour bar' + pad=0.10 + if plotvars.rows >= 3: pad=0.15 + if plotvars.rows >= 5: pad=0.20 + #cbar=plotvars.master_plot.colorbar(cfill, orientation=colorbar_orientation, aspect=75, \ + # pad=pad, ticks=colorbar_labels, drawedges=True, \ + # shrink=colorbar_shrink) + cbar=plotvars.master_plot.colorbar(cfill, ticks=colorbar_labels,\ + orientation=colorbar_orientation, aspect=75, pad=pad,\ + shrink=colorbar_shrink) + cbar.set_label(colorbar_title, fontsize=text_fontsize, fontweight=title_fontweight) + #Bug in Matplotlib colorbar labelling + #With clevs=[-1, 1, 10000, 20000, 30000, 40000, 50000, 60000] + #Labels are [0, 2, 10001, 20001, 30001, 40001, 50001, 60001] + #With a +1 near to the colorbar label + cbar.set_ticklabels([str(i) for i in colorbar_labels]) + + for t in cbar.ax.get_xticklabels(): + t.set_fontsize(text_fontsize) + t.set_fontweight(text_fontweight) + + + #Coastlines and title + mymap.drawcoastlines(linewidth=continent_thickness, color=continent_color) + plotvars.plot.set_title(title, y=1.03, fontsize=title_fontsize, fontweight=title_fontweight) + + + + ######################## + # Latitude-pressure plot + ######################## + if ptype == 2: + if verbose: print 'con - making a latitude-pressure plot' + + + if plotvars.user_plot == 0: gopen(user_plot=0) + + #Set plot limits + #if [plotvars.xmin, plotvars.xmax, plotvars.ymin, plotvars.ymax].count(None) == 4: + user_gset=plotvars.user_gset + if user_gset == 0: + #Program selected data plot limits + xmin=np.nanmin(x) + if xmin < -80 and xmin >= -90: xmin=-90 + xmax=np.nanmax(x) + if xmax > 80 and xmax <= 90: xmax=90 + ymin=np.nanmin(y) + if ymin <= 10: ymin=0 + ymax=np.nanmax(y) + else: + #User specified plot limits + xmin=plotvars.xmin + xmax=plotvars.xmax + if plotvars.ymin < plotvars.ymax: + ymin=plotvars.ymin + ymax=plotvars.ymax + else: + ymin=plotvars.ymax + ymax=plotvars.ymin + + + xstep=None + if (xmin == -90 and xmax == 90): xstep=30 + ystep=None + if (ymax == 1000): ystep=100 + if (ymax == 100000): ystep=10000 + + ytype=0 #pressure or similar y axis + if 'theta' in ylabel.split(' '): ytype=1 + if 'height' in ylabel.split(' '): + ytype=1 + ystep=100 + if (ymax - ymin) > 5000: ystep=500.0 + if (ymax - ymin) > 10000: ystep=1000.0 + if (ymax - ymin) > 50000: ystep=10000.0 + + #Set plot limits and draw axes + if ylog != 1: + if ytype == 1: + gset(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, user_gset=user_gset) + latticks,latlabels=mapaxis(min=xmin, max=xmax, type=2) + axes_plot(xticks=latticks, xticklabels=latlabels,\ + yticks=gvals(dmin=ymin, dmax=ymax, tight=1, mystep=ystep, mod=0)[0],\ + xlabel=xlabel, ylabel=ylabel) + else: + gset(xmin=xmin, xmax=xmax, ymin=ymax, ymax=ymin, user_gset=user_gset) + latticks,latlabels=mapaxis(min=xmin, max=xmax, type=2) + axes_plot(xticks=latticks, xticklabels=latlabels,\ + yticks=gvals(dmin=ymin, dmax=ymax, tight=1, mystep=ystep, mod=0)[0],\ + xlabel=xlabel, ylabel=ylabel) + + #Log y axis + if ylog == 1: + if ymin == 0: ymin=1 + gset(xmin=xmin, xmax=xmax, ymin=ymax, ymax=ymin, ylog=1, user_gset=user_gset) + latticks,latlabels=mapaxis(min=xmin, max=xmax, type=2) + axes_plot(xticks=latticks, xticklabels=latlabels,\ + xlabel=xlabel, ylabel=ylabel) + + + #Get colour scale for use in contouring + #If colour bar extensions are enabled then the colour map goes + #from 1 to ncols-2. The colours for the colour bar extensions are then + #changed on the colourbar and plot after the plot is made + cscale_ncols=np.size(plotvars.cs) + colmap=cscale_get_map() + + + #Filled contours + if fill == True or blockfill == 1: + cfill=plotvars.plot.contourf(x,y,field*fmult,clevs, \ + extend=plotvars.levels_extend, colors=colmap, tri=tri) + + #add colour scale extensions if required + if (plotvars.levels_extend == 'both' or plotvars.levels_extend == 'min'): + cfill.cmap.set_under(plotvars.cs[0]) + if (plotvars.levels_extend == 'both' or plotvars.levels_extend == 'max'): + cfill.cmap.set_over(plotvars.cs[cscale_ncols-1]) + + #Block fill + if blockfill == 1: + if isinstance(f[0], cf.Field): + if getattr(f[0].coord('lat'), 'hasbounds', False): + xpts=np.squeeze(f.coord('lat').bounds.array)[:,0] + ypts=np.squeeze(f.coord('pressure').bounds.array)[:,0] + bfill(f=field_orig*fmult, x=xpts, y=ypts, clevs=clevs, lonlat=0, bound=1) + else: + bfill(f=field_orig*fmult, x=x_orig, y=y_orig, clevs=clevs, lonlat=0, bound=0) + + else: + bfill(f=field_orig*fmult, x=x_orig, y=y_orig, clevs=clevs, lonlat=0, bound=0) + + + + #Contour lines and labels + if lines == True: + cs=plotvars.plot.contour(x,y,field*fmult,clevs,colors='k', tri=tri) + if line_labels == True: + nd=ndecs(clevs) + fmt='%d' + if nd != 0: fmt='%1.'+str(nd)+'f' + plotvars.plot.clabel(cs, fmt=fmt, colors = 'k', fontsize=text_fontsize, fontweight=text_fontweight) + + #Thick zero contour line + if zero_thick is not None: + cs = plotvars.plot.contour(x,y,field*fmult,[1e-32, 0],colors='k', linewidths=zero_thick, tri=tri) + + + + #Colorbar + if colorbar == 1: + + pad=0.15 + if plotvars.rows >= 3: pad=0.25 + if plotvars.rows >= 5: pad=0.3 + cbar=plotvars.master_plot.colorbar(cfill, orientation=colorbar_orientation, aspect=75, \ + pad=pad, ticks=colorbar_labels, \ + shrink=colorbar_shrink) + cbar.set_label(colorbar_title, fontsize=text_fontsize, fontweight=title_fontweight) + cbar.set_ticklabels([str(i) for i in colorbar_labels]) #Bug in Matplotlib colorbar labelling + for t in cbar.ax.get_xticklabels(): + t.set_fontsize(text_fontsize) + t.set_fontweight(text_fontweight) + + #Title + plotvars.plot.set_title(title, y=1.03, fontsize=title_fontsize, fontweight=title_fontweight) + + + + ######################## + # Longitude-pressure plot + ######################## + if ptype == 3: + if verbose: print 'con - making a longitude-pressure plot' + if plotvars.user_plot == 0: gopen(user_plot=0) + user_gset=plotvars.user_gset + + #Set plot limits + if user_gset == 0: + #Program selected data plot limits + xmin=np.nanmin(x) + if xmin < -170 and xmin >= -180: xmin=-180 + xmax=np.nanmax(x) + if xmax > 170 and xmax <= 180: xmax=180 + ymin=np.nanmin(y) + if ymin <= 10: ymin=0 + ymax=np.nanmax(y) + else: + #User specified plot limits + xmin=plotvars.xmin + xmax=plotvars.xmax + if plotvars.ymin < plotvars.ymax: + ymin=plotvars.ymin + ymax=plotvars.ymax + else: + ymin=plotvars.ymax + ymax=plotvars.ymin + + xstep=None + if (xmin == -180 and xmax == 180): xstep=60 + ystep=None + if (ymax == 1000): ystep=100 + if (ymax == 100000): ystep=10000 + + ytype=0 #pressure or similar y axis + if 'theta' in ylabel.split(' '): ytype=1 + if 'height' in ylabel.split(' '): + ytype=1 + ystep=100 + if (ymax - ymin) > 5000: ystep=500.0 + if (ymax - ymin) > 10000: ystep=1000.0 + if (ymax - ymin) > 50000: ystep=10000.0 + + #Set plot limits and draw axes + lonticks,lonlabels=mapaxis(min=xmin, max=xmax, type=1) + if ylog != 1: + if ytype == 1: + gset(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, user_gset=user_gset) + axes_plot(xticks=lonticks, xticklabels=lonlabels,\ + yticks=gvals(dmin=ymin, dmax=ymax, tight=1, mystep=ystep, mod=0)[0],\ + xlabel=xlabel, ylabel=ylabel) + else: + gset(xmin=xmin, xmax=xmax, ymin=ymax, ymax=ymin, user_gset=user_gset) + axes_plot(xticks=lonticks, xticklabels=lonlabels,\ + yticks=gvals(dmin=ymin, dmax=ymax, tight=1, mystep=ystep, mod=0)[0],\ + xlabel=xlabel, ylabel=ylabel) + + #Log y axis + if ylog == 1: + if ymin == 0: ymin=1 + gset(xmin=xmin, xmax=xmax, ymin=ymax, ymax=ymin, ylog=1, user_gset=user_gset) + axes_plot(xticks=lonticks, xticklabels=lonlabels, xlabel=xlabel, ylabel=ylabel) + + #Get colour scale for use in contouring + #If colour bar extensions are enabled then the colour map goes + #from 1 to ncols-2. The colours for the colour bar extensions are then + #changed on the colourbar and plot after the plot is made + cscale_ncols=np.size(plotvars.cs) + colmap=cscale_get_map() + + + #Filled contours + if fill == True or blockfill == 1: + cfill=plotvars.plot.contourf(x,y,field*fmult,clevs, \ + extend=plotvars.levels_extend, colors=colmap, tri=tri) + + #add colour scale extensions if required + if (plotvars.levels_extend == 'both' or plotvars.levels_extend == 'min'): + cfill.cmap.set_under(plotvars.cs[0]) + if (plotvars.levels_extend == 'both' or plotvars.levels_extend == 'max'): + cfill.cmap.set_over(plotvars.cs[cscale_ncols-1]) + + #Block fill + if blockfill == 1: + if isinstance(f[0], cf.Field): + if getattr(f[0].coord('lat'), 'hasbounds', False): + xpts=np.squeeze(f.coord('lat').bounds.array)[:,0] + ypts=np.squeeze(f.coord('pressure').bounds.array)[:,0] + bfill(f=field_orig*fmult, x=xpts, y=ypts, clevs=clevs, lonlat=0, bound=1) + else: + bfill(f=field_orig*fmult, x=x_orig, y=y_orig, clevs=clevs, lonlat=0, bound=0) + + else: + bfill(f=field_orig*fmult, x=x_orig, y=y_orig, clevs=clevs, lonlat=0, bound=0) + + + + #Contour lines and labels + if lines == True: + cs=plotvars.plot.contour(x,y,field*fmult,clevs,colors='k', tri=tri) + if line_labels == True: + nd=ndecs(clevs) + fmt='%d' + if nd != 0: fmt='%1.'+str(nd)+'f' + plotvars.plot.clabel(cs, fmt=fmt, colors = 'k', fontsize=text_fontsize, fontweight=text_fontweight) + + #Thick zero contour line + if zero_thick is not None: + cs = plotvars.plot.contour(x,y,field*fmult,[1e-32, 0],colors='k', linewidths=zero_thick, tri=tri) + + + + #Colorbar + if colorbar == 1: + + pad=0.15 + if plotvars.rows >= 3: pad=0.25 + if plotvars.rows >= 5: pad=0.3 + cbar=plotvars.master_plot.colorbar(cfill, orientation=colorbar_orientation, aspect=75, \ + pad=pad, ticks=colorbar_labels, \ + shrink=colorbar_shrink) + cbar.set_label(colorbar_title, fontsize=text_fontsize, fontweight=title_fontweight) + cbar.set_ticklabels([str(i) for i in colorbar_labels]) #Bug in Matplotlib colorbar labelling + for t in cbar.ax.get_xticklabels(): + t.set_fontsize(text_fontsize) + t.set_fontweight(text_fontweight) + + #Title + plotvars.plot.set_title(title, y=1.03, fontsize=title_fontsize, fontweight=title_fontweight) + + + + + ################# + # Hovmuller plots + ################# + if (ptype == 4 or ptype == 5): + if verbose: print 'con - making a Hovmuller plot' + ylabel='Time' + if ptype == 4: xlabel='Longitude' + if ptype == 5: xlabel='Latitude' + user_gset=plotvars.user_gset + + ref_time=time_opts[0] + ref_calendar=time_opts[1] + ref_time_origin=time_opts[2] + + + #Time strings set to None initially + tmin=None + tmax=None + #Set plot limits + if [plotvars.xmin,plotvars.xmax,plotvars.ymin,plotvars.ymax].count(None) == 0: + + #Store time strings for later use + tmin=plotvars.ymin + tmax=plotvars.ymax + + #Change from date string in ymin and ymax to date as a float + time_units = cf.Units(ref_time, ref_calendar) + t = cf.Data(cf.dt(plotvars.ymin), units=time_units) + ymin=t.array + t = cf.Data(cf.dt(plotvars.ymax), units=time_units) + ymax=t.array + xmin=plotvars.xmin + xmax=plotvars.xmax + else: + xmin=np.nanmin(x) + xmax=np.nanmax(x) + ymin=np.nanmin(y) + ymax=np.nanmax(y) + + + + #Set plot limits + if plotvars.user_plot == 0: gopen(user_plot=0) + gset(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, user_gset=user_gset) + + #Revert to time strings if set + if [tmin, tmax].count(None) == 0: + plotvars.ymin=tmin + plotvars.ymax=tmax + + time_units = cf.Units(ref_time, ref_calendar) + #t = cf.Data(cf.dt(ref_time_origin), units=time_units) + t = cf.Data(cf.dt('1980-1-1'), units=time_units) + + times=gvals(dmin=ymin, dmax=ymax, tight=1, mod=0)[0] + T = cf.Data(times, units=t.Units) + time_ticks=T.array + time_tick_labels=T.year.array + + if ptype == 4: xticks, xticklabels=mapaxis(min=xmin, max=xmax, type=1) + if ptype == 5: xticks, xticklabels=mapaxis(min=xmin, max=xmax, type=2) + + #Draw axes + axes_plot(xticks=xticks, xticklabels=xticklabels,\ + yticks=time_ticks, yticklabels=time_tick_labels,\ + xlabel=xlabel, ylabel=ylabel) + + + #Get colour scale for use in contouring + #If colour bar extensions are enabled then the colour map goes + #from 1 to ncols-2. The colours for the colour bar extensions are then + #changed on the colourbar and plot after the plot is made + cscale_ncols=np.size(plotvars.cs) + colmap=cscale_get_map() + + + #Filled contours + if fill == True or blockfill == 1: + cfill=plotvars.plot.contourf(x,y,field*fmult,clevs, \ + extend=plotvars.levels_extend, colors=colmap, tri=tri) + + #add colour scale extensions if required + if (plotvars.levels_extend == 'both' or plotvars.levels_extend == 'min'): + cfill.cmap.set_under(plotvars.cs[0]) + if (plotvars.levels_extend == 'both' or plotvars.levels_extend == 'max'): + cfill.cmap.set_over(plotvars.cs[cscale_ncols-1]) + + #Block fill + if blockfill == 1: + if isinstance(f[0], cf.Field): + if f[0].coord('lon').hasbounds: + xpts=np.squeeze(f.coord('lat').bounds.array)[:,0] + ypts=np.squeeze(f.coord('time').bounds.array)[:,0] + bfill(f=field_orig*fmult, x=xpts, y=ypts, clevs=clevs, lonlat=0, bound=1) + else: + bfill(f=field_orig*fmult, x=x_orig, y=y_orig, clevs=clevs, lonlat=0, bound=0) + + else: + bfill(f=field_orig*fmult, x=x_orig, y=y_orig, clevs=clevs, lonlat=0, bound=0) + + + + #Contour lines and labels + if lines == True: + cs=plotvars.plot.contour(x,y,field*fmult,clevs,colors='k', tri=tri) + if line_labels == True: + nd=ndecs(clevs) + fmt='%d' + if nd != 0: fmt='%1.'+str(nd)+'f' + plotvars.plot.clabel(cs, fmt=fmt, colors = 'k', fontsize=text_fontsize, fontweight=text_fontweight) + + #Thick zero contour line + if zero_thick is not None: + cs = plotvars.plot.contour(x,y,field*fmult,[1e-32, 0],colors='k', linewidths=zero_thick, tri=tri) + + + + #Colorbar + if colorbar == 1: + + pad=0.15 + if plotvars.rows >= 3: pad=0.25 + if plotvars.rows >= 5: pad=0.3 + cbar=plotvars.master_plot.colorbar(cfill, orientation=colorbar_orientation, aspect=75, \ + pad=pad, ticks=colorbar_labels, \ + shrink=colorbar_shrink) + cbar.set_label(colorbar_title, fontsize=text_fontsize, fontweight=title_fontweight) + cbar.set_ticklabels([str(i) for i in colorbar_labels]) #Bug in Matplotlib colorbar labelling + for t in cbar.ax.get_xticklabels(): + t.set_fontsize(text_fontsize) + t.set_fontweight(text_fontweight) + + #Title + plotvars.plot.set_title(title, y=1.03, fontsize=title_fontsize, fontweight=title_fontweight) + + + + + ############# + #Rotated pole + ############# + if ptype == 6: + #Rotated pole plots use a regularly spaced grid + #The x and y points from the data are used to make the rotated axes + xpts=np.arange(np.size(x)) + ypts=np.arange(np.size(y)) + + if verbose: print 'con - making a rotated pole plot' + user_gset=plotvars.user_gset + if plotvars.user_plot == 0: gopen(user_plot=0) + + #Set plot limits + gset(xmin=0, xmax=np.size(x)-1, ymin=0, ymax=np.size(y)-1, user_gset=user_gset) + + + #Get colour scale for use in contouring + #If colour bar extensions are enabled then the colour map goes + #from 1 to ncols-2. The colours for the colour bar extensions are then + #changed on the colourbar and plot after the plot is made + cscale_ncols=np.size(plotvars.cs) + colmap=cscale_get_map() + + + #Filled contours + if fill == True or blockfill == 1: + cfill=plotvars.plot.contourf(xpts,ypts,field*fmult,clevs,extend=plotvars.levels_extend,\ + colors=colmap, tri=tri) + + #add colour scale extensions if required + if (plotvars.levels_extend == 'both' or plotvars.levels_extend == 'min'): + cfill.cmap.set_under(plotvars.cs[0]) + if (plotvars.levels_extend == 'both' or plotvars.levels_extend == 'max'): + cfill.cmap.set_over(plotvars.cs[cscale_ncols-1]) + + + #Block fill + if blockfill == 1: + bfill(f=field_orig*fmult, x=xpts, y=ypts, clevs=clevs, lonlat=0, bound=0) + + + #Contour lines and labels + if lines == True: + cs=plotvars.plot.contour(xpts,ypts,field*fmult,clevs,colors='k', tri=tri) + if line_labels == True: + nd=ndecs(clevs) + fmt='%d' + if nd != 0: fmt='%1.'+str(nd)+'f' + plotvars.plot.clabel(cs, fmt=fmt, colors = 'k', fontsize=text_fontsize, fontweight=text_fontweight) + + #Thick zero contour line + if zero_thick is not None: + cs = plotvars.plot.contour(xpts,ypts,field*fmult,[1e-32, 0],colors='k', linewidths=zero_thick, tri=tri) + + + #Colorbar + if colorbar == 1: + + pad=0.15 + if plotvars.rows >= 3: pad=0.25 + if plotvars.rows >= 5: pad=0.3 + cbar=plotvars.master_plot.colorbar(cfill, orientation=colorbar_orientation, aspect=75, \ + pad=pad, ticks=colorbar_labels, \ + shrink=colorbar_shrink) + cbar.set_label(colorbar_title, fontsize=text_fontsize, fontweight=title_fontweight) + cbar.set_ticklabels([str(i) for i in colorbar_labels]) #Bug in Matplotlib colorbar labelling + for t in cbar.ax.get_xticklabels(): + t.set_fontsize(text_fontsize) + t.set_fontweight(text_fontweight) + + #Rotated grid axes + rgaxes(xpole=xpole, ypole=ypole, xvec=x, yvec=y) + + + #Title + plotvars.plot.set_title(title, y=1.03, fontsize=title_fontsize, fontweight=title_fontweight) + + + + + + ############ + #Other plots + ############ + if ptype == 0: + if verbose: print 'con - making an other plot' + if plotvars.user_plot == 0: gopen(user_plot=0) + user_gset=plotvars.user_gset + + #Work out axes if none are supplied + if [plotvars.xmin, plotvars.xmax, plotvars.ymin, plotvars.ymax].count(None) > 0: + xmin=np.nanmin(x) + xmax=np.nanmax(x) + ymin=np.nanmin(y) + ymax=np.nanmax(y) + else: + xmin=plotvars.xmin + xmax=plotvars.xmax + ymin=plotvars.ymin + ymax=plotvars.ymax + + xstep=(xmax-xmin)/10.0 + ystep=(ymax-ymin)/10.0 + + #Set plot limits and draw axes + gset(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, user_gset=user_gset) + + + xticks=gvals(dmin=xmin, dmax=xmax, mystep=(xmax-xmin)/10.0, tight=1, mod=0)[0] + if ymin < ymax: yticks=gvals(dmin=ymin, dmax=ymax, mystep=(ymax-ymin)/10.0, tight=1, mod=0)[0] + if ymax < ymin: yticks=gvals(dmin=ymax, dmax=ymin, mystep=(ymin-ymax)/10.0, tight=1, mod=0)[0] + axes_plot(xticks=xticks, yticks=yticks, xlabel=xlabel, ylabel=ylabel) + + + #Get colour scale for use in contouring + #If colour bar extensions are enabled then the colour map goes + #from 1 to ncols-2. The colours for the colour bar extensions are then + #changed on the colourbar and plot after the plot is made + cscale_ncols=np.size(plotvars.cs) + colmap=cscale_get_map() + + + #Filled contours + if fill == True or blockfill == 1: + cfill=plotvars.plot.contourf(x,y,field*fmult,clevs,extend=plotvars.levels_extend,\ + colors=colmap, tri=tri) + + #add colour scale extensions if required + if (plotvars.levels_extend == 'both' or plotvars.levels_extend == 'min'): + cfill.cmap.set_under(plotvars.cs[0]) + if (plotvars.levels_extend == 'both' or plotvars.levels_extend == 'max'): + cfill.cmap.set_over(plotvars.cs[cscale_ncols-1]) + + + #Block fill + if blockfill == 1: + bfill(f=field_orig*fmult, x=x_orig, y=y_orig, clevs=clevs, lonlat=0, bound=0) + + + #Contour lines and labels + if lines == True: + cs=plotvars.plot.contour(x,y,field*fmult,clevs,colors='k', tri=tri) + if line_labels == True: + nd=ndecs(clevs) + fmt='%d' + if nd != 0: fmt='%1.'+str(nd)+'f' + plotvars.plot.clabel(cs, fmt=fmt, colors = 'k', fontsize=text_fontsize, fontweight=text_fontweight) + + #Thick zero contour line + if zero_thick is not None: + cs = plotvars.plot.contour(x,y,field*fmult,[1e-32, 0],colors='k', linewidths=zero_thick, tri=tri) + + + #Colorbar + if colorbar == 1: + + pad=0.15 + if plotvars.rows >= 3: pad=0.25 + if plotvars.rows >= 5: pad=0.3 + cbar=plotvars.master_plot.colorbar(cfill, orientation=colorbar_orientation, aspect=75, \ + pad=pad, ticks=colorbar_labels, \ + shrink=colorbar_shrink) + cbar.set_label(colorbar_title, fontsize=text_fontsize, fontweight=title_fontweight) + cbar.set_ticklabels([str(i) for i in colorbar_labels]) #Bug in Matplotlib colorbar labelling + for t in cbar.ax.get_xticklabels(): + t.set_fontsize(text_fontsize) + t.set_fontweight(text_fontweight) + + #Title + plotvars.plot.set_title(title, y=1.03, fontsize=title_fontsize, fontweight=title_fontweight) + + + + + ################## + #Save or view plot + ################## + + if plotvars.user_plot == 0: + if verbose: print 'con - saving or viewing plot' + #gset(user_gset=0) + gclose() + + + + +
    +
    [docs]def mapset(lonmin=None, lonmax=None, latmin=None, latmax=None, proj='cyl', boundinglat=0, + lon_0=0, resolution='c', user_mapset=1): + """ + | mapset sets the mapping parameters. + | + | lonmin=lonmin - minimum longitude + | lonmax=lonmax - maximum longitude + | latmin=latmin - minimum latitude + | latmax=latmax - maximum latitude + | proj=proj - 'cyl' for cylindrical projection. 'npstere' or 'spstere' for northern + | hemisphere or southern hemisphere polar stereographic projection + | 'moll' for the mollweide projection + | boundinglat=boundinglat - edge of the viewable latitudes in a stereographic plot + | lon_0=lon_0 - centre of desired map domain in stereographic or plots + | resolution=resolution - the map resolution - can be one of 'c' (crude), 'l' (low), + | 'i' (intermediate), 'h' (high), 'f' (full) or 'None' + | user_mapset=user_mapset - variable to indicate whether a user call to mapset has been + | made. + | + | The default map plotting projection is the cyclindrical equidistant projection from + | -180 to 180 in longitude and -90 to 90 in latitude. To change the map view in this + | projection to over the United Kingdom, for example, you would use + | mapset(lonmin=-6, lonmax=3, latmin=50, latmax=60) or mapset(-6, 3, 50, 60). + | + | The limits are -360 to 720 in longitude so to look at the equatorial Pacific you + | could use + | mapset(lonmin=90, lonmax=300, latmin=-30, latmax=30) + | or + | mapset(lonmin=-270, lonmax=-60, latmin=-30, latmax=30) + | + | The proj parameter for the present accepts just two values - 'npstere' and 'spstere' + | for northern hemisphere or southern hemisphere polar stereographic projections. In + | addition to these the boundinglat parameter sets the edge of the viewable latitudes + | and lat_0 sets the centre of desired map domain. + | + | Map settings are persistent until a new call to mapset is made. To reset to the default + | map settings use mapset(). + + :Returns: + None + """ + + + if [lonmin,lonmax,latmin,latmax].count(None) == 4 and proj == 'cyl': + plotvars.lonmin=-180 + plotvars.lonmax=180 + plotvars.latmin=-90 + plotvars.latmax=90 + plotvars.proj='cyl' + plotvars.user_mapset=0 + return + + + if lonmin is None: lonmin=-180 + if lonmax is None: lonmax=180 + if latmin is None: latmin=-90 + if latmax is None: latmax=90 + + if proj == 'moll': + lonmin=lon_0-180 + lonmax=lon_0+180 + + + plotvars.lonmin=lonmin + plotvars.lonmax=lonmax + plotvars.latmin=latmin + plotvars.latmax=latmax + plotvars.proj=proj + plotvars.boundinglat=boundinglat + plotvars.lon_0=lon_0 + plotvars.resolution=resolution + plotvars.user_mapset=user_mapset + set_map() + + + + +
    +
    [docs]def levs(min=None, max=None, step=None, manual=None, extend='both'): + """ + | The levs command manually sets the contour levels. + + | min=min - minimum level + | max=max - maximum level + | step=step - step between levels + | manual= manual - set levels manually + | extend='neither', 'both', 'min', or 'max' - colour bar limit extensions. + + | Use the levs command when a predefined set of levels is required. The min, max + | and step parameters are all needed to define a set of levels. These can take + | integer or floating point numbers. If colour filled contours are plotted then + | the default is to extend the minimum and maximum contours coloured for out of + | range values - extend='both'. + + | Once a user call is made to levs the levels are persistent. i.e. the next plot + | will use the same set of levels. + | Use levs() to reset to undefined levels. + + :Returns: + None + + """ + + if [min,max,step,manual].count(None) == 4: + plotvars.levels=None + plotvars.levels_min=None + plotvars.levels_max=None + plotvars.levels_step=None + plotvars.extend='both' + plotvars.user_levs=0 + return + + if manual is not None: + plotvars.levels=manual + plotvars.levels_min=None + plotvars.levels_max=None + plotvars.levels_step=None + plotvars.user_levs=1 + else: + if [min,max,step].count(None) > 0: + errstr='\n\ + levs error\n\ + min, max and step or manual need to be passed to levs to generate \n\ + a set of contour levels\ + \n' + + raise Warning(errstr) + else: + plotvars.levels_min=min + plotvars.levels_max=max + plotvars.levels_step=step + plotvars.levels=np.arange(min, max+step, step) + plotvars.user_levs=1 + + plotvars.levels_extend=extend + + +
    +
    [docs]def mapaxis(min=min, max=max, type=type): + """ + | mapaxis is used to work out a sensible set of longitude and latitude + | tick marks and labels. This is an internal routine and is not used + | by the user. + + | min=min - minimum axis value + | max=max - maximum axis value + | type=type - 1 = longitude, 2 = latitude + + :Returns: + longtitude/latitude ticks and longitude/latitude tick labels + | + | + | + | + | + | + | + """ + + import numpy as np + if type == 1: + lonmin=min + lonmax=max + lonrange=lonmax-lonmin + lonstep=60 + if lonrange <= 180: lonstep=30 + if lonrange <= 90: lonstep=10 + if lonrange <= 30: lonstep=5 + if lonrange <= 10: lonstep=2 + if lonrange <= 5: lonstep=1 + #if plotvars.xstep is not None: lonstep=plotvars.xstep + + lons=np.arange(-720, 720+lonstep, lonstep) + lonticks=[] + for lon in lons: + if lon >= lonmin and lon <= lonmax: lonticks.append(lon) + + lonlabels=[] + for lon in lonticks: + lon2=np.mod(lon + 180, 360) - 180 + if lon2 < 0 and lon2 > -180: lonlabels.append(str(abs(lon2))+'W') + if lon2 > 0 and lon2 < 180: lonlabels.append(str(lon2)+'E') + if lon2 == 0: lonlabels.append('0') + if np.abs(lon2) == 180: lonlabels.append('180') + + return(lonticks, lonlabels) + + if type == 2: + latmin=min + latmax=max + latrange=latmax-latmin + latstep=30 + if latrange <= 90: latstep=10 + if latrange <= 30: latstep=5 + if latrange <= 10: latstep=2 + if latrange <= 5: latstep=1 + #if plotvars.ystep is not None: latstep=plotvars.ystep + + lats=np.arange(-90, 90+latstep, latstep) + latticks=[] + for lat in lats: + if lat >= latmin and lat <= latmax: latticks.append(lat) + + + latlabels=[] + for lat in latticks: + if lat < 0: latlabels.append(str(abs(lat))+'S') + if lat > 0: latlabels.append(str(lat)+'N') + if lat == 0: latlabels.append('0') + + return(latticks, latlabels) + + + +
    +
    [docs]def ndecs(data=None): + """ + | ndecs finds the number of decimal places in an array. Needed to make the + | colour bar match the contour line labelling. + + | data=data - imput array of values + + :Returns: + | maximum number of necimal places + | + | + | + | + | + | + | + | + """ + + maxdecs=0 + for i in range(len(data)): + number=data[i] + a=str(number).split('.') + if np.size(a) == 2: + number_decs=len(a[1]) + if number_decs > maxdecs: maxdecs=number_decs + + return maxdecs + +
    +
    [docs]def axes(xticks=None, xticklabels=None, yticks=None, yticklabels=None,\ + xstep=None, ystep=None, xlabel=None, ylabel=None, title=None): + """ + | axes is a function to set axes plotting parameters. The xstep and ystep + | parameters are used to label the axes starting at the left hand side and + | bottom of the plot respectively. For tighter control over labelling use + | xticks, yticks to specify the tick positions and xticklabels, yticklabels + | to specify the associated labels. + + | xstep=xstep - x axis step + | ystep=ystep - y axis step + | xlabel=xlabel - label for the x-axis + | ylabel=ylabel - label for the y-axis + | xticks=xticks - values for x ticks + | xticklabels=xticklabels - labels for x tick marks + | yticks=yticks - values for y ticks + | yticklabels=yticklabels - labels for y tick marks + | title=None - set title + | + | Use axes() to reset all the axes plotting attributes to the default. + + :Returns: + None + """ + + if [xticks,yticks,xticklabels,yticklabels,xstep,ystep,xlabel,ylabel,title].count(None) == 9: + plotvars.xticks=None + plotvars.yticks=None + plotvars.xticklabels=None + plotvars.yticklabels=None + plotvars.xstep=None + plotvars.ystep=None + plotvars.xlabel=None + plotvars.ylabel=None + plotvars.title=None + return + + plotvars.xticks=xticks + plotvars.yticks=yticks + plotvars.xticklabels=xticklabels + plotvars.yticklabels=yticklabels + plotvars.xstep=xstep + plotvars.ystep=ystep + plotvars.xlabel=xlabel + plotvars.ylabel=ylabel + plotvars.title=title + + +
    +def axes_plot(xticks=None, xticklabels=None, yticks=None, yticklabels=None,\ + xstep=None, ystep=None, xlabel=None, ylabel=None, title=None): + """ + | axes_plot is a system function to specify axes plotting parameters. The xstep and ystep + | parameters are used to label the axes starting at the left hand side and + | bottom of the plot respectively. For tighter control over labelling use + | xticks, yticks to specify the tick positions and xticklabels, yticklabels + | to specify the associated labels. + + | xstep=xstep - x axis step + | ystep=ystep - y axis step + | xlabel=xlabel - label for the x-axis + | ylabel=ylabel - label for the y-axis + | xticks=xticks - values for x ticks + | xticklabels=xticklabels - labels for x tick marks + | yticks=yticks - values for y ticks + | yticklabels=yticklabels - labels for y tick marks + | title=None - set title + | + + :Returns: + None + """ + + if plotvars.plot_type == 1: + xmin=plotvars.lonmin + xmax=plotvars.lonmax + ymin=plotvars.latmin + ymax=plotvars.latmax + else: + xmin=plotvars.xmin + xmax=plotvars.xmax + ymin=plotvars.ymin + ymax=plotvars.ymax + + #Retrieve any user set axes parameters + if plotvars.xticks is not None: + xticks=plotvars.xticks + if plotvars.xticklabels is None: xticklabels=None + if plotvars.yticks is not None: + yticks=plotvars.yticks + if plotvars.yticklabels is None: yticklabels=None + if plotvars.xticklabels is not None: xticklabels=plotvars.xticklabels + if plotvars.yticklabels is not None: yticklabels=plotvars.yticklabels + if plotvars.xstep is not None: + xstep=plotvars.xstep + xticks=None + xticklabels=None + if plotvars.ystep is not None: + ystep=plotvars.ystep + yticks=None + yticklabels=None + + if plotvars.xlabel is not None: xlabel=plotvars.xlabel + if plotvars.ylabel is not None: ylabel=plotvars.ylabel + if plotvars.title is not None: title=plotvars.title + title_fontsize=plotvars.title_fontsize + text_fontsize=plotvars.text_fontsize + axis_label_fontsize=plotvars.axis_label_fontsize + if title_fontsize is None: title_fontsize=15 + if text_fontsize is None: text_fontsize=11 + if axis_label_fontsize is None: axis_label_fontsize=11 + axis_label_fontweight=plotvars.axis_label_fontweight + title_fontweight=plotvars.title_fontweight + text_fontweight=plotvars.text_fontweight + + if xlabel is not None: plotvars.plot.set_xlabel(xlabel, fontsize=axis_label_fontsize, \ + fontweight=axis_label_fontweight) + if ylabel is not None: plotvars.plot.set_ylabel(ylabel, fontsize=axis_label_fontsize, \ + fontweight=axis_label_fontweight) + + if xstep is not None: + ticks, mult=gvals(plotvars.xmin, plotvars.xmax, tight=1, mystep=xstep) + plotvars.plot.set_xticks(ticks*10**mult) + if ystep is not None: + ticks, mult=gvals(plotvars.ymin, plotvars.ymax, tight=1, mystep=ystep) + plotvars.plot.set_yticks(ticks*10**mult) + + + if xticks is not None: + plotvars.plot.set_xticks(xticks) + if xticklabels is not None: plotvars.plot.set_xticklabels(xticklabels) + + if yticks is not None: + plotvars.plot.set_yticks(yticks) + if yticklabels is not None: plotvars.plot.set_yticklabels(yticklabels) + + + #Set font size and weight + for label in plotvars.plot.xaxis.get_ticklabels(): + label.set_fontsize(axis_label_fontsize) + label.set_fontweight(axis_label_fontweight) + for label in plotvars.plot.yaxis.get_ticklabels(): + label.set_fontsize(axis_label_fontsize) + label.set_fontweight(axis_label_fontweight) + + #Title + if title is not None: + plotvars.plot.set_title(title, y=1.03, fontsize=title_fontsize, fontweight=title_fontweight) + + +
    [docs]def gset(xmin=None, xmax=None, ymin=None, ymax=None, xlog=None, ylog=None, user_gset=1): + """ + | Set plot limits for all non longitude-latitide plots. + | xmin, xmax, ymin, ymax are all needed to set the plot limits. + | Set xlog/ylog to 1 to get a log axis. + + | xmin=None - x minimum + | xmax=None - x maximum + | ymin=None - y minimum + | ymax=None - y maximum + | xlog=None - log x + | ylog=None - log y + + | Once a user call is made to gset the plot limits are persistent. i.e. the next plot + | will use the same set of plot limits. + | Use gset() to reset to undefined plot limits i.e. the full range of the data. + + :Returns: + None + + | + | + | + | + + """ + + #plotvars.xlog=xlog + #plotvars.ylog=ylog + plotvars.user_gset=user_gset + + if [xmin,xmax,ymin,ymax].count(None) == 4: + plotvars.xmin=None + plotvars.xmax=None + plotvars.ymin=None + plotvars.ymax=None + plotvars.xlog=None + plotvars.ylog=None + plotvars.user_gset=0 + return + + if [xmin,xmax,ymin,ymax].count(None) > 0: + errstr='gset error\n\ + xmin, xmax, ymin, ymax all need to be passed to gset to set the plot limits\n' + raise Warning(errstr) + + + plotvars.xmin=xmin + plotvars.xmax=xmax + plotvars.ymin=ymin + plotvars.ymax=ymax + plotvars.xlog=xlog + plotvars.ylog=ylog + + #Set plot limits + if plotvars.plot is not None: + plotvars.plot.axis([plotvars.xmin, plotvars.xmax, plotvars.ymin, plotvars.ymax]) + if plotvars.xlog == 1: plotvars.plot.set_yscale('log') + if plotvars.ylog == 1: plotvars.plot.set_yscale('log') + + + +
    +
    [docs]def gopen(rows=1, columns=1, user_plot=1, file='python', \ + orientation='landscape', fontsize=None): + """ + | gopen is used to open a graphic file. + + | rows=1 - number of plot rows on the page + | columns=1 - number of plot columns on the page + | user_plot=1 - internal plot variable - do not use. + | file='python' - default file name + | orientation='landscape' - orientation - also takes 'portrait' + | fontsize=None - font size - default is 11 for a single plot + + :Returns: + None + + | + | + | + | + | + + """ + + #Set values in globals + plotvars.rows=rows + plotvars.columns=columns + if file != 'python': plotvars.file=file + plotvars.orientation=orientation + plotvars.user_plot=user_plot + + if orientation != 'landscape': + if orientation != 'portrait': + errstr='gopen error\n\ + orientation incorrectly set\n\ + Input value was '\ + +orientation+'\nValid options are portrait or landscape\n' + raise Warning(errstr) + + #Set master plot size + if orientation == 'landscape': plotvars.master_plot=plot.figure(figsize=(11.7, 8.3)) + else: plotvars.master_plot=plot.figure(figsize=(8.3, 11.7)) + + #Set margins + plotvars.master_plot.subplots_adjust(left=0.12, right=0.92, top=0.92, bottom=0.08) + + #Set fontsize + if fontsize is None: + if rows*columns == 1: plotvars.text_fontsize=11 + else: plotvars.text_fontsize=8 + else: plotvars.text_fontsize=fontsize + + #Set initial subplot + gpos(pos=1) + + #Change tick length for plots > 2x2 + if (columns > 2 or rows > 2): + matplotlib.rcParams['xtick.major.size'] = 2 + matplotlib.rcParams['ytick.major.size'] = 2 + + +
    +
    [docs]def gclose(view=True): + """ + | gclose saves a graphics file. The default is to view the file as well + | - use view=0 to turn this off. + + | view=True - view graphics file + + :Returns: + None + + | + | + | + | + | + | + | + | + | + + """ + + #Reset the user_plot variable to off + plotvars.user_plot=0 + + file=plotvars.file + if file is not None: + type=1 + if file[-3:] == '.ps': type=1 + if file[-4:] == '.eps': type=1 + if file[-4:] == '.png': type=1 + if file[-4:] == '.pdf': type=1 + if type is None: file=file+'.png' + plotvars.master_plot.savefig(file, papertype='a4',\ + orientation=plotvars.orientation) + else: + plot.show() + + + #Reset plotting + plotvars.plot=None + +
    +def showplot(*args): + for data in args: + plot=data + plot.show() + #dir(plot) + #plot=args[0] + + + +
    [docs]def gpos(pos=1): + """ + | Set plot position. Plots start at top left and increase by one each plot + | to the right. When the end of the row has been reached then the next plot + | will bed the leftmost plot on the next row down. + + | pos=pos - plot position + + :Returns: + None + + | + | + | + | + | + | + | + | + + """ + + #Check inputs are okay + if pos < 1 or pos > plotvars.rows*plotvars.columns: + errstr='pos error - pos out of range:\n range = 1 - ' + errstr=errstr+str(plotvars.rows*plotvars.columns) + errstr=errstr+'\n input pos was '+ str(pos) + errstr=errstr+'\n' + raise Warning(errstr) + + plotvars.plot=plotvars.master_plot.add_subplot(plotvars.rows, plotvars.columns, pos) + plotvars.plot.tick_params(which='both', direction='out') + + #if plotvars.user_plot == 0: + # if plotvars.user_gset == 1: gset(user_gset=plotvars.user_gset) + # gset(user_gset=plotvars.user_gset) + + + +####################################### +#pcon - convert mb to km and vice-versa +####################################### +
    +
    [docs]def pcon(mb=None, km=None, h=7.0, p0=1000): + """ + | pcon is a function for converting pressure to height in kilometers and + | vice-versa. This function uses the equation P=P0exp(-z/H) to translate + | between pressure and height. In pcon the surface pressure P0 is set to + | 1000.0mb and the scale height H is set to 7.0. The value of H can vary + | from 6.0 in the polar regions to 8.5 in the tropics as well as seasonally. + | The value of P0 could also be said to be 1013.25mb rather than 1000.0mb. + + | As this relationship is approximate: + | (i) Only use this for making the axis labels on y axis pressure plots + | (ii) Put the converted axis on the right hand side to indicate that this + | isn't the primary unit of measure + + | print pcon(mb=[1000, 300, 100, 30, 10, 3, 1, 0.3]) + | [0., 8.42780963 16.11809565 24.54590528 32.2361913, 40.66400093 48.35428695, 56.78209658] + + | mb=None - input pressure + | km=None - input height + | h=7.0 - default value for h + | p0=1000 - default value for p0 + + :Returns: + | pressure(mb) if height(km) input, + | height(km) if pressure(mb) input + """ + + if [mb, km].count(None) == 2: + errstr='pcon error - pcon must have mb or km input\n' + raise Warning(errstr) + + if mb is not None: return h*(np.log(p0)-np.log(mb)) + if km is not None: return np.exp(-1.0*(np.array(km)/h-np.log(p0))) + + + + +
    +
    [docs]def supscr(text=None): + """ + | supscr - add superscript text formatting for ** and ^ + | This is an internal routine used in titles and colour bars + | and not used by the user. + | text=None - input text + + :Returns: + Formatted text + | + | + | + | + | + | + | + """ + + if [text].count(None) == 1: + errstr='\n supscr error - supscr must have text input\n' + raise Warning(errstr) + + + tform='' + + sup=0 + for i in text: + if (i == '^'): sup=2 + if (i == '*'): sup=sup+1 + + if (sup == 0): tform=tform+i + if (sup == 1): + if (i not in '*'): tform=tform+'*'+i; sup=0 + if (sup == 3): + if i in '-0123456789': tform=tform+i + else: tform=tform+'}$'+i; sup=0 + if (sup == 2): tform=tform+'$^{' ; sup=3 + + if (sup == 3): tform=tform+'}$' + + + tform=tform.replace('m2', 'm$^{2}$') + tform=tform.replace('m3', 'm$^{3}$') + tform=tform.replace('m-2', 'm$^{-2}$') + tform=tform.replace('m-3', 'm$^{-3}$') + tform=tform.replace('s-1', 's$^{-1}$') + tform=tform.replace('s-2', 's$^{-2}$') + + + return tform + + + +
    +
    [docs]def gvals(dmin=None, dmax=None, tight=0, mystep=None, mod=1): + """ + | gvals - work out a sensible set of values between two limits + | This is an internal routine used for contour levels and axis + | labelling and is not used by the user. + + | dmin=None - minimum + | dmax=None - maximum + | tight=0 - return values tight to input min and max + | mystep=None - use this step + | mod=1 - modify data to make use of a multipler + | + | + | + | + | + | + """ + + if [dmin, dmax].count(None) > 0: + errstr='\n gvals error - gvals must have dmin and dmax input\n' + raise Warning(errstr) + + + #Return some values if dmin = dmax + if dmin == dmax: + vals=[dmin-0.001, dmin, dmin+0.001] + mult=0 + return vals, mult + + + + mult=0 #field multiplyer + + #Generate reasonable step + step=(dmax-dmin)/16.0 + if mod == 1: + if (mystep != None): step=mystep + + if step < 1: + while dmax < 1: + step=step*10.0 + dmin=dmin*10.0 + dmax=dmax*10.0 + mult=mult-1 + + if step > 100: + while step >= 1 or dmax >10: + step=step/10.0 + dmin=dmin/10.0 + dmax=dmax/10.0 + mult=mult+1 + + + #Change step to be a sensible one + step=int(dmax-dmin)/16 + + + if (step == 8 or step == 9): step=10 + if (step == 7 or step == 6 or step == 4): step=5 + if step == 3: step=2 + if (step >= 10): step=int(step/10)*10 + if (step == 0): step=1 + if (mystep != None): step=mystep + + + #Make integer step + if tight ==0: + vals=(int(dmin)/step)*step + else: + vals=dmin + while (np.nanmax(vals)+step) <= dmax: + vals=np.append(vals, np.nanmax(vals)+step) + + + #Remove upper and lower limits if tight=0 - i.e. a contour plot + if tight == 0 and np.size(vals) > 1: + if np.nanmax(vals) >= dmax: vals=vals[0:-1] + if np.nanmin(vals) <= dmin: vals=vals[1:] + + + if mystep is not None: + if int(mystep) == mystep: + return vals, mult + + + #Floating point step + if (mult == 0 and np.size(vals) > 5): + return vals, mult + else: + step=float("%.1f" %((dmax-dmin)/16)) + if step == 0: step=float("%.2f" %((dmax-dmin)/16)) + + if step == .9: step=1.0 + if step == .8: step=1.0 + if step == .7: step=.5 + if step == .6: step=.5 + if step == .3: step=.2 + if step == .09: step=0.1 + if step == .08: step=0.1 + if step == .07: step=.05 + if step == .06: step=.05 + if step == .03: step=.02 + + + if (dmax-dmin == step): step=step/10. + vals=float("%.2f" %(int(dmin/step)*step)) + while (np.nanmax(vals)+step) <= dmax: + vals=np.append(vals, float("%.2f" %(np.nanmax(vals)+step))) + + if tight == 0: + if np.nanmax(vals) >= dmax: vals=vals[0:-1] + if np.nanmin(vals) <= dmin: vals=vals[1:] + + return vals, mult + + +
    +
    [docs]def cf_data_assign(f=None, colorbar_title=None, verbose=None): + """ + | Check cf input data is okay and return data for contour plot. + | This is an internal routine not used by the user. + | f=None - input cf field + | colorbar_title=None - input colour bar title + | verbose=None - set to 1 to get a verbose idea of what the cf_data_assign is doing + + :Returns: + | f - data for contouring + | x - x coordinates of data (optional) + | y - y coordinates of data (optional) + | ptype - plot type + | colorbar_title - colour bar title + | xlabel - x label for plot + | ylabel - y label for plot + | + | + | + | + | + """ + + + #Check input data has the correct number of dimensions + #Take into account rotated pole fields having extra dimensions + ndim=len(f.axes(size=cf.gt(1))) + if f.ref('rotated_latitude_longitude') is None: + if (ndim > 2 or ndim < 2): + print '' + if (ndim > 2): errstr='cf_data_assign error - data has too many dimensions' + if (ndim < 2): errstr='cf_data_assign error - data has too few dimensions' + errstr=errstr+'\n cfplot requires two dimensional data \n' + for mydim in f.items(): + sn=getattr(f.item(mydim), 'standard_name', False) + ln=getattr(f.item(mydim), 'long_name', False) + if sn: + errstr=errstr+str(mydim)+','+str(sn)+','+str(f.item(mydim).size)+'\n' + else: + if ln: errstr=errstr+str(mydim)+','+str(ln)+','+str(f.item(mydim).size)+'\n' + raise Warning(errstr) + + + + #Set up data arrays and variables + lons=None + lats=None + height=None + time=None + xlabel='' + ylabel='' + ref_time=None + ref_calendar=None + ref_time_origin=None + time_opts=None + has_lons=None + has_lats=None + has_height=None + has_time=None + #has_rotated_pole=None + xpole=None + ypole=None + ptype=None + + + #Extract coordinate data if a matching CF standard_name or axis is found + for mydim in f.items(): + sn=getattr(f.item(mydim), 'standard_name', 'NoName') + an=getattr(f.item(mydim), 'axis', 'NoName') + + standard_name_x=['longitude'] + if (sn in standard_name_x or an == 'X'): + if verbose: print 'cf_data_assign standard_name, axis - assigned lons -', sn, an + lons=np.squeeze(f.item(mydim).array) + + standard_name_y=['latitude'] + if (sn in standard_name_y or an == 'Y'): + if verbose: print 'cf_data_assign standard_name, axis - assigned lats -', sn, an + lats=np.squeeze(f.item(mydim).array) + + standard_name_z=['pressure', 'air_pressure', 'height', 'depth'] + if (sn in standard_name_z or an == 'Z'): + if verbose: print 'cf_data_assign standard_name, axis - assigned height -', sn, an + height=np.squeeze(f.item(mydim).array) + + standard_name_t=['time'] + if (sn in standard_name_t or an == 'T'): + if verbose: print 'cf_data_assign standard_name, axis - assigned time -', sn, an + time=np.squeeze(f.item(mydim).array) + + + + + #CF defined units + lon_units=['degrees_east', 'degree_east', 'degree_E', 'degrees_E', 'degreeE', 'degreesE'] + lat_units=['degrees_north', 'degree_north', 'degree_N', 'degrees_N', 'degreeN', 'degreesN'] + height_units=['millibar', 'decibar', 'atmosphere', 'atm', 'pascal','Pa', 'hPa',\ + 'meter', 'metre', 'm', 'kilometer', 'kilometre', 'km'] + time_units=['day', 'days', 'd', 'hour', 'hours', 'hr', 'h', 'minute', 'minutes', 'min', 'mins',\ + 'second', 'seconds', 'sec', 'secs', 's'] + + + + #Extract coordinate data if a matching CF set of units is found + for mydim in f.items(): + units=getattr(f.item(mydim), 'units', False) + if units in lon_units: + if lons is None: + if verbose: print 'cf_data_assign units - assigned lons -', units + lons=np.squeeze(f.item(mydim).array) + if units in lat_units: + if lats is None: + if verbose: print 'cf_data_assign units - assigned lats -', units + lats=np.squeeze(f.item(mydim).array) + if units in height_units: + if height is None: + if verbose: print 'cf_data_assign units - assigned height -', units + height=np.squeeze(f.item(mydim).array) + if units in time_units: + if time is None: + if verbose: print 'cf_data_assign units - assigned time -', units + time=np.squeeze(f.item(mydim).array) + + + #Extract coordinate data from variable name if not already assigned + for mydim in f.items(): + if mydim[:3] == 'dim': + name=cf_var_name(field=f, dim=mydim) + if name[0:3] == 'lon': + if lons is None: + if verbose: print 'cf_data_assign dimension name - assigned lons -', name + lons=np.squeeze(f.item(mydim).array) + + if name[0:3] == 'lat': + if lats is None: + if verbose: print 'cf_data_assign dimension name - assigned lats -', name + lats=np.squeeze(f.item(mydim).array) + + if (name[0:5] == 'theta' or name[0:1] == 'p' or name == 'air_pressure'): + if height is None: + if verbose: print 'cf_data_assign dimension name - assigned height -', name + height=np.squeeze(f.item(mydim).array) + + if name[0:1] == 't': + if time is None: + if verbose: print 'cf_data_assign dimension name - assigned time -', name + time=np.squeeze(f.item(mydim).array) + + + if np.size(lons) > 1: has_lons=1 + if np.size(lats) > 1: has_lats=1 + if np.size(height) > 1: has_height=1 + if np.size(time) > 1: has_time=1 + + + + + #assign field data + field=np.squeeze(f.array) + + #Check what plot type is required. + #0=simple contour plot, 1=map plot, 2=latitude-height plot, + #3=longitude-time plot, 4=latitude-time plot. + if (np.size(lons) > 1 and np.size(lats) > 1): + ptype=1 + x=lons + y=lats + + if (np.size(lats) > 1 and np.size(height) > 1): + ptype=2 + x=lats + y=height + for mydim in f.items(): + name=cf_var_name(field=f, dim=mydim) + if name[0:3] == 'lat': + xunits=str(getattr(f.item(mydim), 'Units', '')) + if (xunits in lat_units): xunits='degrees' + xlabel=name + ' (' + xunits + ')' + if name[0:1] == 'p' or name[0:5] == 'theta' or name[0:6] == 'height': + yunits=str(getattr(f.item(mydim), 'Units', '')) + ylabel=name + ' (' + yunits + ')' + + + if (np.size(lons) > 1 and np.size(height) > 1): + ptype=3 + x=lons + y=height + for mydim in f.items(): + name=cf_var_name(field=f, dim=mydim) + if name[0:3] == 'lon': + xunits=str(getattr(f.item(mydim), 'Units', '')) + if (xunits in lon_units): xunits='degrees' + xlabel=name + ' (' + xunits + ')' + if name[0:1] == 'p' or name[0:5] == 'theta' or name[0:6] == 'height': + yunits=str(getattr(f.item(mydim), 'Units', '')) + ylabel=name + ' (' + yunits + ')' + + + + if (np.size(lons) > 1 and np.size(time) > 1): + ptype=4 + x=lons + y=time + ref_time=f.item('time').units + ref_calendar=f.item('time').calendar + ref_time_origin=str(f.item('time').Units.reftime) + time_opts=[ref_time,ref_calendar,ref_time_origin] + + if np.size(lats) > 1 and np.size(time) > 1: + ptype=5 + x=lats + y=time + ref_time=f.item('time').units + ref_calendar=f.item('time').calendar + ref_time_origin=str(f.item('time').Units.reftime) + time_opts=[ref_time,ref_calendar,ref_time_origin] + + + + #Rotated pole + if f.ref('rotated_latitude_longitude') is not None: + ptype=6 + rotated_pole=f.ref('rotated_latitude_longitude') + xpole=rotated_pole['grid_north_pole_longitude'] + ypole=rotated_pole['grid_north_pole_latitude'] + + for mydim in f.items(): + if mydim[:3] == 'dim': + if np.size(np.squeeze(f.item(mydim).array)) == np.shape(np.squeeze(f.array))[1]: + x=np.squeeze(f.item(mydim).array) + xunits=str(getattr(f.item(mydim), 'units', '')) + xlabel=cf_var_name(field=f, dim=mydim) + + if np.size(np.squeeze(f.item(mydim).array)) == np.shape(np.squeeze(f.array))[0]: + y=np.squeeze(f.item(mydim).array) + #Flip y and data if reversed + if y[0] > y[-1]: + y=y[::-1] + field=np.flipud(field) + yunits=str(getattr(f.item(mydim), 'Units', '')) + ylabel=cf_var_name(field=f, dim=mydim)+yunits + + + + + + #rotated_pole.coords + #gives set(['dim2', 'dim3', 'aux3', 'aux4']) + #select out the data using these + #Possible to make a plot using aux3 and aux4 via a keyword? + + #None of the above + if [has_lons, has_lats, has_height, has_time].count(None) > 2 and ptype is not 6: + ptype=0 + + for mydim in f.items(): + if np.size(np.squeeze(f.item(mydim).array)) == np.shape(np.squeeze(f.array))[1]: + x=np.squeeze(f.item(mydim).array) + xunits=str(getattr(f.item(mydim), 'units', '')) + xlabel=cf_var_name(field=f, dim=mydim) + + if np.size(np.squeeze(f.item(mydim).array)) == np.shape(np.squeeze(f.array))[0]: + y=np.squeeze(f.item(mydim).array) + yunits=str(getattr(f.item(mydim), 'Units', '')) + ylabel=cf_var_name(field=f, dim=mydim)+yunits + + + + + + + #Assign colorbar_title + if (colorbar_title == None): + colorbar_title='' + if hasattr(f, 'ncvar'): colorbar_title=f.ncvar + if hasattr(f, 'short_name'): colorbar_title=f.short_name + if hasattr(f, 'long_name'): colorbar_title=f.long_name + if hasattr(f, 'standard_name'): colorbar_title=f.standard_name + if hasattr(f, 'Units'): + if str(f.Units) == '': colorbar_title=colorbar_title+'' + else: colorbar_title=colorbar_title+'('+supscr(str(f.Units))+')' + + + #Return data + return(field, x, y, ptype, colorbar_title, xlabel, ylabel, time_opts, xpole, ypole) + + +
    +
    [docs]def check_data(field=None, x=None, y=None): + """ + | check_data - check user input contour data is correct. + | This is an internal routine and is not used by the user. + | + | field=None - field + | x=None - x points for field + | y=None - y points for field + | + | + | + | + | + | + """ + + #Input error trapping + args = True + errstr='\n' + if np.size(field) == 1: + if field == None: + errstr=errstr+'con error - a field for contouring must be passed with the f= flag\n' + args = False + if np.size(x) == 1: + if x == None: + errstr=errstr+'con error - x coordinates must be passed with the x= flag\n' + args = False + if np.size(y) == 1: + if y == None: + errstr=errstr+'con error - y coordinates must be passed with the y= flag\n' + args = False + if args == False: + raise Warning(errstr) + + + #Check input dimensions look okay. + #All inputs 2D + if np.ndim(field) == 2 and np.ndim(x) == 2 and np.ndim(y) == 2: + xpts=np.shape(field)[1] + ypts=np.shape(field)[0] + if xpts != np.shape(x)[1] or xpts != np.shape(y)[1]: args = False + if ypts != np.shape(x)[0] or ypts != np.shape(y)[0]: args = False + if args is True: return + + #Field x and y all 1D + if np.ndim(field) == 1 and np.ndim(x) == 1 and np.ndim(y) == 1: + if np.size(x) != np.size(field): args = False + if np.size(y) != np.size(field): args = False + if args is True: return + + #Field 2D, x and y 1D + if np.ndim(field) != 2: args = False + if np.ndim(x) != 1: args = False + if np.ndim(y) != 1: args = False + if np.ndim(field) == 2: + if np.size(x) != np.shape(field)[1]: args = False + if np.size(y) != np.shape(field)[0]: args = False + + + if args is False: + errstr=errstr+'Input arguments incorrectly shaped:\n' + errstr=errstr+'x has shape:'+str(np.shape(x))+'\n' + errstr=errstr+'y has shape:'+str(np.shape(y))+'\n' + errstr=errstr+'field has shape'+str(np.shape(field))+'\n\n' + errstr=errstr+'Expected x=xpts, y=ypts, field=(ypts,xpts)\n' + errstr=errstr+'x=npts, y=npts, field=npts\n' + errstr=errstr+'or x=[ypts, xpts], y=[ypts, xpts], field=[ypts, xpts]\n' + raise Warning(errstr) + + +
    +
    [docs]def cscale(cmap=None, ncols=None, white=None, below=None, above=None): + """ + | cscale - choose and manipulate colour maps. Around 200 colour scales are + | available - see the gallery section for more details. + | + | cmap=cmap - name of colour map + | ncols=ncols - number of colours for colour map + | white=white - change these colours to be white + | below=below - change the number of colours below the mid point of + | the colour scale to be this + | above=above - change the number of colours above the mid point of + | the colour scale to be this + | + | + | Personal colour maps are available by saving the map as red green blue + | to a file with a set of values on each line. + | + | + | Use cscale() To reset to the scale1 colour scale + | + :Returns: + None + + | + | + | + | + """ + + + #If no map requested reset to default + if cmap == None: + cmap='scale1' + plotvars.user_cscale=0 + else: + plotvars.user_cscale=1 + + if cmap == 'scale1' or cmap == 'cosam': + if cmap == 'scale1': myscale=cscale1 + if cmap == 'cosam': myscale=cosam + #convert cscale1 or cosam from hex to rgb + r=[] + g=[] + b=[] + for myhex in myscale: + myhex=myhex.lstrip('#') + mylen=len(myhex) + rgb=tuple(int(myhex[i:i+mylen/3], 16) for i in range(0, mylen, mylen/3)) + r.append(rgb[0]) + g.append(rgb[1]) + b.append(rgb[2]) + + + else: + import distutils.sysconfig as sysconfig + file = sysconfig.get_python_lib()+'/cfplot/colourmaps/'+cmap+'.rgb' + if os.path.isfile(file) is False: + if os.path.isfile(cmap) is False: + errstr='\ncscale error - colour scale not found:\n' + errstr=errstr+'File '+file+ ' not found\n' + errstr=errstr+'File '+cmap+' not found\n' + raise Warning(errstr) + else: + file=cmap + + #Read in rgb values and convert to hex + f = open(file, 'r') + lines = f.read() + lines = lines.splitlines() + r=[] + g=[] + b=[] + hex=[] + for line in lines: + vals = line.split() + r.append(int(vals[0])) + g.append(int(vals[1])) + b.append(int(vals[2])) + + + + #Interpolate to a new number of colours if requested + if ncols != None: + x=np.arange(np.size(r)) + xnew=((np.size(r)-1)/float(ncols-1))* np.arange(ncols) + f_red=interpolate.interp1d(x, r) + f_green=interpolate.interp1d(x, g) + f_blue=interpolate.interp1d(x, b) + r=f_red(xnew) + g=f_green(xnew) + b=f_blue(xnew) + + + + #Change the number of colours below and above the mid-point if requested + if below != None or above != None: + + #Mid-point of colour scale + npoints=np.size(r)/2 + + + #Below mid point x locations + x_below=[] + lower=0 + if below == 1: x_below=0 + if below != None: lower=below + if below == None: lower=npoints + if (lower > 1): x_below=((npoints-1)/float(lower-1))*np.arange(lower) + + + #Above mid point x locations + x_above=[] + upper=0 + if above == 1: x_above=npoints*2-1 + if above != None: upper=above + if above == None: upper=npoints + if (upper > 1): x_above=((npoints-1)/float(upper-1))*np.arange(upper)+npoints + + + #Append new colour positions + xnew=np.append(x_below, x_above) + + + #Interpolate to new colour scale + xpts=np.arange(np.size(r)) + f_red=interpolate.interp1d(xpts, r ) + f_green=interpolate.interp1d(xpts, g) + f_blue=interpolate.interp1d(xpts, b) + r=f_red(xnew) + g=f_green(xnew) + b=f_blue(xnew) + + + + + + + #Convert to hex + hex=[] + for col in np.arange(np.size(r)): + hex.append('#%02x%02x%02x' % (r[col],g[col],b[col])) + + + #White requested colour positions + if white != None: + ccols=white + if np.size(white) == 1: + hex[white]='#ffffff' + else: + for col in white: + hex[col]='#ffffff' + + + #Set colour scale + plotvars.cs=hex + +
    +
    [docs]def cscale_get_map(): + """ + | cscale_get_map - return colour map for use in contour plots. + | This depends on the colour bar extensions + | This is an internal routine and is not used by the user. + | + | + :Returns: + colour map + + | + | + | + | + """ + cscale_ncols=np.size(plotvars.cs) + if (plotvars.levels_extend == 'both'): colmap=plotvars.cs[1:cscale_ncols-1] + if (plotvars.levels_extend == 'min'): colmap=plotvars.cs[1:] + if (plotvars.levels_extend == 'max'): colmap=plotvars.cs[:cscale_ncols-1] + if (plotvars.levels_extend == 'neither'): colmap=plotvars.cs + return (colmap) + + +
    +
    [docs]def bfill(f=None, x=None, y=None, clevs=False, lonlat=False, bound=False): + """ + | bfill - block fill a field with colour rectangles + | This is an internal routine and is not used by the user. + | + | f=None - field + | x=None - x points for field + | y=None - y points for field + | clevs=None - levels for filling + | lonlat=False - lonlat data + | bound=False - x and y are cf data boundaries + | + | + | + :Returns: + None + | + | + | + | + """ + + + #Assign f to field as this may be modified in lat-lon plots + field=f + + #Add in extra levels for colour bar extensions if present. + levs=clevs.astype(float) + if (plotvars.levels_extend == 'min' or plotvars.levels_extend == 'both'): + levs=np.insert(levs,0, -1e30) + if (plotvars.levels_extend == 'max' or plotvars.levels_extend == 'both'): + levs=np.append(levs, 1e30) + + + + if bound == 1: + xpts=x + ypts=y + + + #print 'xpts are ', xpts + #print '' + #print 'ypts are ', ypts + #print '' + #print 'shape of data is ', np.shape(f) + #print 'shape of x , y are ', np.shape(x), np.shape(y) + + if bound == 0: + #Find x box boundaries + xpts=x[0]-(x[1]-x[0])/2.0 + for ix in np.arange(np.size(x)-1): + xpts=np.append(xpts, x[ix]+(x[ix+1]-x[ix])/2.0) + xpts=np.append(xpts, x[ix+1]+(x[ix+1]-x[ix])/2.0) + + + #Find y box boundaries + ypts=y[0]-(y[1]-y[0])/2.0 + for iy in np.arange(np.size(y)-1): + ypts=np.append(ypts, y[iy]+(y[iy+1]-y[iy])/2.0) + ypts=np.append(ypts, y[iy+1]+(y[iy+1]-y[iy])/2.0) + + + + #Shift lon grid if needed + if lonlat == 1: + + #Extract upper bound and original rhs of box longitude bounding points + upper_bound=ypts[-1] + xpts_orig=xpts + ypts_orig=ypts + + #Reduce xpts and ypts by 1 or shiftgrid fails + #The last points are the right / upper bounds for the last data box + xpts=xpts[0:-1] + ypts=ypts[0:-1] + + + if plotvars.lonmin < np.nanmin(xpts): xpts=xpts-360 + if plotvars.lonmin > np.nanmax(xpts): xpts=xpts+360 + + #Add cyclic information if missing. + lonrange=np.nanmax(xpts)-np.nanmin(xpts) + if lonrange < 360: + field, xpts = addcyclic(field, xpts) + + #shiftgrid on lons and data + field, xpts=shiftgrid(plotvars.lonmin, field, xpts) + + right_bound=xpts[-1]+(xpts[-1]-xpts[-2]) + + #Add end x and y end points + xpts=np.append(xpts, right_bound) + ypts=np.append(ypts, upper_bound) + + + #Make plot + #Set colour map + cmin=0 + cmax=np.size(plotvars.cs) + if (plotvars.levels_extend == 'min' or plotvars.levels_extend == 'both'): cmin=1 + if (plotvars.levels_extend == 'max' or plotvars.levels_extend == 'both'): cmax=np.size(plotvars.cs)-1 + + cmap = matplotlib.colors.ListedColormap(plotvars.cs[cmin:cmax]) + if (plotvars.levels_extend == 'min' or plotvars.levels_extend == 'both'): + cmap.set_under(plotvars.cs[0]) + if (plotvars.levels_extend == 'max' or plotvars.levels_extend == 'both'): + cmap.set_over(plotvars.cs[-1]) + + norm = matplotlib.colors.BoundaryNorm(clevs, ncolors=cmap.N, clip=False) + im = plotvars.plot.pcolormesh(xpts, ypts, field, cmap=cmap, norm=norm) + + + + + + + +
    +
    [docs]def regrid(f=None, x=None, y=None, xnew=None, ynew=None, lonlat=None): + + """ + | regrid - bilinear interpolation of a grid to new grid locations + | + | + | f=None - original field + | x=None - original field x values + | y=None - original field y values + | xnew=None - new x points + | ynew=None - new y points + | + :Returns: + field values at requested locations + | + | + """ + + #reassign input arrays + regrid_f=f + regrid_x=x + regrid_y=y + + import numpy as np + + fieldout=[] + + #Reverse xpts and field if necessary + if regrid_x[0] > regrid_x[-1]: + regrid_x=regrid_x[::-1] + field=np.fliplr(regrid_f) + + #Reverse ypts and field if necessary + if regrid_y[0] > regrid_y[-1]: + regrid_y=regrid_y[::-1] + regrid_f=np.flipud(regrid_f) + + #Iterate over the new grid to get the new grid values. + for i in np.arange(np.size(xnew)): + + xval=xnew[i] + yval=ynew[i] + + #Find position of new grid point in the x and y arrays + myxpos=find_pos_in_array(vals=regrid_x, val=xval) + myypos=find_pos_in_array(vals=regrid_y, val=yval) + + + myxpos2=myxpos+1 + myypos2=myypos+1 + + + if (myxpos2 != myxpos): + alpha=(xnew[i]-regrid_x[myxpos])/(regrid_x[myxpos2]-regrid_x[myxpos]) + else: + alpha=(xnew[i]-regrid_x[myxpos])/1E-30 + + newval1=regrid_f[myypos,myxpos]-(regrid_f[myypos,myxpos]-regrid_f[myypos,myxpos2])*alpha + newval2=regrid_f[myypos2,myxpos]-(regrid_f[myypos2,myxpos]-regrid_f[myypos2,myxpos2])*alpha + + if (myypos2 != myypos): alpha2=(ynew[i]-regrid_y[myypos])/(regrid_y[myypos2]-regrid_y[myypos]) + else: alpha2=(ynew[i]-regrid_y[myypos])/1E-30 + + + newval3=newval1-(newval1-newval2)*alpha2 + + fieldout=np.append(fieldout, newval3) + + + + return fieldout + +
    +
    [docs]def stipple(f=None, x=None, y=None, min=None, max=None, size=80, color='k', pts=50, marker='.'): + + """ + | stipple - put dots on the plot to indicate value of interest + | + | f=None - cf field or field + | x=None - x points for field + | y=None - y points for field + | min=None - minimum threshold for stipple + | max=None - maximum threshold for stipple + | size=80 - default size for stipples + | color='k' - default colour for stipples + | pts=50 - number of points in the x direction + | marker='.' - default marker for stipples + | + | + :Returns: + None + | + | + """ + + + #Extract required data for contouring + #If a cf-python field + if isinstance(f[0], cf.Field): + colorbar_title='' + f=f[0] + field, xpts, ypts, ptype, colorbar_title, xlabel, ylabel, time_opts, xpole, ypole=\ + cf_data_assign(f, colorbar_title) + else: + field=f #field data passed in as f + check_data(field, x, y) + xpts=x + ypts=y + + + + if plotvars.plot_type == 1: + #Cylindrical projection + #Add cyclic information if missing. + lonrange=np.nanmax(xpts)-np.nanmin(xpts) + if lonrange < 360: + field, xpts = addcyclic(field, xpts) + + #Shift grid if needed + if plotvars.lonmin < np.nanmin(xpts): xpts=xpts-360 + if plotvars.lonmin > np.nanmax(xpts): xpts=xpts+360 + + field, xpts=shiftgrid(plotvars.lonmin, field, xpts) + + if plotvars.proj == 'cyl': + #Calculate interpolation points + xnew, ynew=stipple_points(xmin=np.nanmin(xpts), xmax=np.nanmax(xpts),\ + ymin=np.nanmin(ypts), ymax=np.nanmax(ypts), pts=pts, stype=2) + + #Calculate points in map space + xnew_map,ynew_map=plotvars.mymap(xnew,ynew) + + + + if plotvars.proj == 'npstere' or plotvars.proj == 'spstere': + #Calculate interpolation points + xnew, ynew, xnew_map, ynew_map=polar_regular_grid() + + + + + if plotvars.plot_type == 2: + #Calculate interpolation points + + xnew, ynew=stipple_points(xmin=np.nanmin(xpts), xmax=np.nanmax(xpts),\ + ymin=np.nanmin(ypts), ymax=np.nanmax(ypts), pts=pts, stype=2) + + + + #Get values at the new points + vals=regrid(f=field, x=xpts, y=ypts, xnew=xnew, ynew=ynew) + + #Work out which of the points are valid + valid_points=np.array([], dtype='int32') + for i in np.arange(np.size(vals)): + if vals[i] >=min and vals[i] <=max: + valid_points=np.append(valid_points, i) + + + + + if plotvars.plot_type == 1: + plotvars.plot.scatter(xnew_map[valid_points], ynew_map[valid_points], s=size, c=color, marker=marker) + + + if plotvars.plot_type == 2: + plotvars.plot.scatter(xnew[valid_points], ynew[valid_points], s=size, c=color, marker=marker) + + + + +
    +
    [docs]def stipple_points(xmin=None, xmax=None, ymin=None, ymax=None, pts=None, stype=None): + + """ + | stipple_points - calculate interpolation points + | + | xmin=None - plot x minimum + | ymax=None - plot x maximum + | ymin=None - plot y minimum + | ymax=None - plot x maximum + | pts=None - number of points in the x and y directions + | one number gives the same in both directions + | + | stype=None - type of grid. 1=regular, 2=offset + | + | + | + :Returns: + stipple locations in x and y + | + | + """ + + #Work out number of points in x and y directions + if np.size(pts) == 1: + pts_x=pts + pts_y=pts + if np.size(pts) == 2: + pts_x=pts[0] + pts_y=pts[1] + + #Create regularly spaced points + xstep=(xmax-xmin)/float(pts_x) + x1=[xmin+xstep/4] + while (np.nanmax(x1)+xstep) < xmax-xstep/10: + x1=np.append(x1, np.nanmax(x1)+xstep) + nxpts=np.size(x1) + + x2=[xmin+xstep*3/4] + while (np.nanmax(x2)+xstep) < xmax-xstep/10: + x2=np.append(x2, np.nanmax(x2)+xstep) + + ystep=(ymax-ymin)/float(pts_y) + y1=[ymin+ystep/2] + while (np.nanmax(y1)+ystep) < ymax-ystep/10: + y1=np.append(y1, np.nanmax(y1)+ystep) + + + + #Create interpolation points + xnew=[] + ynew=[] + iy=0 + + for y in y1: + iy=iy+1 + if stype == 1: + xnew=np.append(xnew, x1) + y2=np.zeros(np.size(x1)) + y2.fill(y) + ynew=np.append(ynew, y2) + + if stype == 2: + if iy%2 == 0: + xnew=np.append(xnew, x1) + y2=np.zeros(np.size(x1)) + y2.fill(y) + ynew=np.append(ynew, y2) + if iy%2 == 1: + xnew=np.append(xnew, x2) + y2=np.zeros(np.size(x2)) + y2.fill(y) + ynew=np.append(ynew, y2) + + + + return xnew, ynew + + + +
    +
    [docs]def find_pos_in_array(vals=None, val=None, above=False): + + """ + | find_pos_in_array - find the position of a point in an array + | + | vals - array values + | val - value to find position of + | + | + | + | + | + | + :Returns: + position in array + | + | + | + """ + + + pos=-1 + if above is False: + for myval in vals: + if val > myval: pos=pos+1 + + if above is 1: + for myval in vals: + if val >= myval: pos=pos+1 + + if np.size(vals)-1 > pos: pos=pos+1 + + return pos + + +
    +
    [docs]def vect(u=None, v=None, x=None, y=None, scale=None, stride=None, pts=None,\ + key_length=None, key_label=None, ptype=None): + + """ + | vect - plot vectors + | + | u=None - u wind + | v=None - v wind + | x=None - x locations of u and v + | y=None - y locations of u and v + | scale=None - data units per arrow length unit + | stride=None - plot vector every stride points. Can take two values + | one for x and one for y + | pts=None - use bilinear interpolation to interpolate vectors + | onto a new grid. + | key_length=None - length of the key + | key_label=None - label for the key + | ptype=0 - plot type - not needed for cf fields. + | 0 = no specific plot type, + | 1 = longitude-latitude, + | 2 = latitude - height, + | 3 = longitude - height, + | 4 = latitude - time, + | 5 = longitude - time + | 6 = rotated pole + | + | + :Returns: + None + | + | + | + """ + + colorbar_title='' + text_fontsize=plotvars.text_fontsize + continent_thickness=plotvars.continent_thickness + continent_color=plotvars.continent_color + if text_fontsize is None: text_fontsize=11 + if continent_thickness is None: continent_thickness=1.5 + if continent_color is None: continent_color='k' + ylog=plotvars.ylog + + #Extract required data for contouring + #If a cf-python field + if isinstance(u[0], cf.Field): + u=u[0] + u_data, u_x, u_y, ptype, colorbar_title, xlabel, ylabel,time_opts, xpole, ypole=\ + cf_data_assign(u, colorbar_title) + else: + #field=f #field data passed in as f + check_data(u, x, y) + u_data=u + u_x=x + u_y=y + xlabel='' + ylabel='' + + + if isinstance(v[0], cf.Field): + v=v[0] + v_data, v_x, v_y, ptype, colorbar_title, xlabel, ylabel, time_opts, xpole, ypole=\ + cf_data_assign(v, colorbar_title) + else: + #field=f #field data passed in as f + check_data(v, x, y) + v_data=v + v_x=x + v_y=y + xlabel='' + ylabel='' + + + if scale is None: scale=np.nanmax(u_data)/4.0 + if key_length is None: key_length=scale + if key_label is None: key_label=str(key_length) + if isinstance(u[0], cf.Field): key_label=key_label+u.units + key_label=supscr(key_label) + + #Open a new plot if necessary + if plotvars.user_plot == 0: + gopen(user_plot=0) + + #Set plot type if user specified + if (ptype != None): plotvars.plot_type=ptype + + + if plotvars.plot_type == 1: + #Set up mapping + set_map() + mymap=plotvars.mymap + + #add cyclic and shift grid + u_data, u_x = addcyclic(u_data, u_x) + v_data, v_x = addcyclic(v_data, v_x) + if plotvars.lonmin < np.nanmin(u_x): u_x=u_x-360.0 + if plotvars.lonmin < np.nanmin(v_x): v_x=v_x-360.0 + u_data, u_x = shiftgrid(plotvars.lonmin, u_data, u_x) + v_data, v_x = shiftgrid(plotvars.lonmin, v_data, v_x) + + + #stride data points to reduce vector density + if stride is not None: + if np.size(stride) == 1: + xstride=stride + ystride=stride + if np.size(stride) == 2: + xstride=stride[0] + ystride=stride[1] + + + iskip=1 + for ix in np.arange(np.size(u_x)): + if iskip != xstride: u_x[ix]=float('nan') + iskip=iskip+1 + if iskip > xstride: iskip=1 + iskip=1 + for iy in np.arange(np.size(u_y)): + if iskip != ystride: u_y[iy]=float('nan') + iskip=iskip+1 + if iskip > ystride: iskip=1 + + + #Use bilinear interpolation to plot vectors + if pts is not None: + + if plotvars.proj != 'npstere' and plotvars.proj != 'spstere': + #Calculate interpolation points and values + xnew, ynew=stipple_points(xmin=plotvars.lonmin, xmax=plotvars.lonmax,\ + ymin=plotvars.latmin, ymax=plotvars.latmax, pts=pts, stype=1) + + u_vals=regrid(f=u_data, x=u_x, y=u_y, xnew=xnew, ynew=ynew) + v_vals=regrid(f=v_data, x=u_x, y=u_y, xnew=xnew, ynew=ynew) + + #Plot vectors + quiv=plotvars.mymap.quiver(xnew,ynew,u_vals,v_vals, pivot='middle',units='inches', scale=scale) + else: + #Calculate interpolation points and values + xnew, ynew, xnew_map, ynew_map=polar_regular_grid() + + u_vals=regrid(f=u_data, x=u_x, y=u_y, xnew=xnew, ynew=ynew) + v_vals=regrid(f=v_data, x=u_x, y=u_y, xnew=xnew, ynew=ynew) + + + + #Plot vectors + quiv=plotvars.mymap.quiver(xnew_map,ynew_map,u_vals,v_vals, pivot='middle',\ + units='inches', scale=scale) + + + quiv_key=plotvars.plot.quiverkey(quiv, 0.9, -0.06, key_length, key_label, labelpos='W') + + if plotvars.plot_type == 1: + if pts is None: + #convert lons, lats into map coordinates + x,y=plotvars.mymap(*np.meshgrid(u_x, u_y)) + + #plot vectors and key + quiv=plotvars.mymap.quiver(u_x,u_y,u_data,v_data, pivot='middle',units='inches', scale=scale) + quiv_key=plotvars.plot.quiverkey(quiv, 0.9, -0.06, key_length, key_label, labelpos='W') + + + + #axes + if plotvars.proj == 'cyl': + lonticks,lonlabels=mapaxis(min=plotvars.lonmin, max=plotvars.lonmax, type=1) + latticks,latlabels=mapaxis(min=plotvars.latmin, max=plotvars.latmax, type=2) + axes_plot(xticks=lonticks, xticklabels=lonlabels) + axes_plot(yticks=latticks, yticklabels=latlabels) + + if plotvars.proj == 'npstere' or plotvars.proj == 'spstere': + latstep=30 + if 90-abs(plotvars.boundinglat) <= 50: latstep=10 + mymap.drawparallels(np.arange(-90,120,latstep)) + mymap.drawmeridians(np.arange(0,420,60),labels=[1,1,1,1,1,1]) + + + #Coastlines and title + mymap.drawcoastlines(linewidth=continent_thickness, color=continent_color) + #plotvars.plot.set_title(title, y=1.03, fontsize=plotvars.fontsize) + + + + + #Zonal plot + if plotvars.plot_type == 2: + #and plotvars.user_plot == 0: + user_gset=plotvars.user_gset + if user_gset == 0: + #Program selected data plot limits + xmin=np.nanmin(u_x) + if xmin < -80 and xmin >= -90: xmin=-90 + xmax=np.nanmax(u_x) + if xmax > 80 and xmax <= 90: xmax=90 + ymin=np.nanmin(u_y) + if ymin <= 10: ymin=0 + ymax=np.nanmax(u_y) + else: + #User specified plot limits + xmin=plotvars.xmin + xmax=plotvars.xmax + if plotvars.ymin < plotvars.ymax: + ymin=plotvars.ymin + ymax=plotvars.ymax + else: + ymin=plotvars.ymax + ymax=plotvars.ymin + + + xstep=None + if (xmin == -90 and xmax == 90): xstep=30 + ystep=None + if (ymax == 1000): ystep=100 + if (ymax == 100000): ystep=10000 + + ytype=0 #pressure or similar y axis + if 'theta' in ylabel.split(' '): ytype=1 + if 'height' in ylabel.split(' '): + ytype=1 + ystep=100 + if (ymax - ymin) > 5000: ystep=500.0 + if (ymax - ymin) > 10000: ystep=1000.0 + if (ymax - ymin) > 50000: ystep=10000.0 + + #Set plot limits and draw axes + if ylog != 1: + if ytype == 1: + gset(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, user_gset=user_gset) + latticks,latlabels=mapaxis(min=xmin, max=xmax, type=2) + axes_plot(xticks=latticks, xticklabels=latlabels,\ + yticks=gvals(dmin=ymin, dmax=ymax, tight=1, mystep=ystep, mod=0)[0],\ + xlabel=xlabel, ylabel=ylabel) + else: + gset(xmin=xmin, xmax=xmax, ymin=ymax, ymax=ymin, user_gset=user_gset) + latticks,latlabels=mapaxis(min=xmin, max=xmax, type=2) + axes_plot(xticks=latticks, xticklabels=latlabels,\ + yticks=gvals(dmin=ymin, dmax=ymax, tight=1, mystep=ystep, mod=0)[0],\ + xlabel=xlabel, ylabel=ylabel) + + #Log y axis + if ylog == 1: + if ymin == 0: ymin=1 + gset(xmin=xmin, xmax=xmax, ymin=ymax, ymax=ymin, ylog=1, user_gset=user_gset) + latticks,latlabels=mapaxis(min=xmin, max=xmax, type=2) + axes_plot(xticks=latticks, xticklabels=latlabels,\ + xlabel=xlabel, ylabel=ylabel) + + + #plot vectors and key + quiv=plotvars.plot.quiver(u_x,u_y,u_data,v_data, pivot='middle',units='inches', scale=scale) + quiv_key=plotvars.plot.quiverkey(quiv, 0.9, -0.06, key_length, key_label, labelpos='W') + + + + ########## + #Save plot + ########## + if plotvars.user_plot == 0: + gset() + cscale() + gclose() + +
    +
    [docs]def set_map(): + """ + | set_map - set map and write into plotvars.mymap + | + | No inputs + | This is an internal routine and not used by the user + | + | + | + | + | + :Returns: + None + | + | + | + """ + + #Set up mapping + if plotvars.proj == 'cyl': + lon_mid=plotvars.lonmin+(plotvars.lonmax-plotvars.lonmin)/2.0 + lat_mid=plotvars.latmin+(plotvars.latmax-plotvars.latmin)/2.0 + mymap = Basemap(projection='cyl',llcrnrlon=plotvars.lonmin, urcrnrlon=plotvars.lonmax, \ + llcrnrlat=plotvars.latmin, urcrnrlat=plotvars.latmax, \ + lon_0=lon_mid, lat_0=lat_mid, resolution=plotvars.resolution) + + if plotvars.proj == 'npstere': + mymap = Basemap(projection='npstere', boundinglat=plotvars.boundinglat, round='True',\ + lon_0=plotvars.lon_0, lat_0=90, resolution=plotvars.resolution) + + if plotvars.proj == 'spstere': + mymap = Basemap(projection='spstere', boundinglat=plotvars.boundinglat, round='True',\ + lon_0=plotvars.lon_0, lat_0=-90, resolution=plotvars.resolution) + + if plotvars.proj == 'moll': + mymap = Basemap(projection='moll', lon_0=plotvars.lon_0, resolution=plotvars.resolution) + + #Store map + plotvars.mymap=mymap + + +
    +
    [docs]def polar_regular_grid(pts=50): + """ + | polar_regular_grid - return a regular grid over a polar stereographic area + | + | pts=50 - number of grid points in the x and y directions + | + | + | + | + | + | + :Returns: + lons, lats of grid in degrees + x, y locations of lons and lats + | + | + | + """ + + + mymap=plotvars.mymap + + boundinglat=plotvars.boundinglat + lon_0=plotvars.lon_0 + + if plotvars.proj == 'npstere': + x, ymin=mymap(lon_0, boundinglat) + x, ymax=mymap(lon_0+180, boundinglat) + if plotvars.proj == 'spstere': + x, ymin=mymap(lon_0+180, boundinglat) + x, ymax=mymap(lon_0, boundinglat) + xmin, y=mymap(lon_0-90, boundinglat) + xmax, y=mymap(lon_0+90, boundinglat) + + + + + xnew, ynew = stipple_points(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, pts=pts, stype=2) + lons, lats=mymap(xnew, ynew, inverse=True) + + #Work out which of the points are valid + valid_points=np.array([], dtype='int32') + if plotvars.proj == 'npstere': + for i in np.arange(np.size(lats)): + if lats[i] >= boundinglat : + valid_points=np.append(valid_points, i) + if plotvars.proj == 'spstere': + for i in np.arange(np.size(lats)): + if lats[i] <= boundinglat : + valid_points=np.append(valid_points, i) + + + return lons[valid_points], lats[valid_points], xnew[valid_points], ynew[valid_points] + + +
    +
    [docs]def cf_var_name(field=None, dim=None): + """ + | cf_var_name - return the name from a supplied dimension + | in the following order + | ncvar + | short_name + | long_name + | standard_name + | + | field=None - field + | dim=None - dimension required - 'dim0', 'dim1' etc. + | + | + | + | + | + :Returns: + name + | + | + | + """ + + + ncvar=getattr(field.item(dim), 'ncvar', False) + short_name=getattr(field.item(dim), 'short_name', False) + long_name=getattr(field.item(dim), 'long_name', False) + standard_name=getattr(field.item(dim), 'standard_name', False) + + if ncvar: name=ncvar + if short_name: name=short_name + if long_name: name=long_name + if standard_name: name=standard_name + + return name + + +
    +
    [docs]def process_color_scales(): + """ + | Process colour scales to generate images of them for the web + | documentation and the rst code for inclusion in the + | colour_scale.rst file. + | + | + | No inputs + | This is an internal routine and not used by the user + | + | + | + | + | + :Returns: + None + | + | + | + """ + + #Define scale categories + ncl_large=['amwg256', 'BkBlAqGrYeOrReViWh200', 'BlAqGrYeOrRe', 'BlAqGrYeOrReVi200',\ + 'BlGrYeOrReVi200', 'BlRe', 'BlueRed', 'BlueRedGray', 'BlueWhiteOrangeRed',\ + 'BlueYellowRed', 'BlWhRe', 'cmp_b2r',\ + 'cmp_haxby', 'detail', 'extrema', 'GrayWhiteGray','GreenYellow',\ + 'helix', 'helix1', 'hotres', 'matlab_hot', 'matlab_hsv', 'matlab_jet',\ + 'matlab_lines', 'ncl_default', 'ncview_default', 'OceanLakeLandSnow',\ + 'rainbow', 'rainbow+white+gray', 'rainbow+white','rainbow+gray',\ + 'tbr_240-300', 'tbr_stdev_0-30', 'tbr_var_0-500', 'tbrAvg1',\ + 'tbrStd1', 'tbrVar1', 'thelix', 'ViBlGrWhYeOrRe',\ + 'wh-bl-gr-ye-re', 'WhBlGrYeRe', 'WhBlReWh', 'WhiteBlue',\ + 'WhiteBlueGreenYellowRed', 'WhiteGreen', 'WhiteYellowOrangeRed',\ + 'WhViBlGrYeOrRe', 'WhViBlGrYeOrReWh', 'wxpEnIR', '3gauss', '3saw'] + + ncl_meteoswiss=['hotcold_18lev', 'hotcolr_19lev', 'mch_default', 'perc2_9lev', 'percent_11lev',\ + 'precip2_15lev', 'precip2_17lev', 'precip3_16lev', 'precip4_11lev', \ + 'precip4_diff_19lev', 'precip_11lev', 'precip_diff_12lev', 'precip_diff_1lev',\ + 'rh_19lev', 'spread_15lev'] + + ncl_color_blindness=['StepSeq25', 'posneg_2', 'posneg_1', 'BlueDarkOrange18', 'BlueDarkRed18',\ + 'GreenMagenta16', 'BlueGreen14', 'BrownBlue12', 'Cat12'] + + ncl_small=['amwg', 'amwg_blueyellowred','BlueDarkRed18', 'BlueDarkOrange18','BlueGreen14',\ + 'BrownBlue12', 'Cat12', 'cmp_flux', 'cosam12', 'cosam',\ + 'GHRSST_anomaly', 'GreenMagenta16',\ + 'hotcold_18lev', 'hotcolr_19lev', 'mch_default', 'nrl_sirkes', \ + 'nrl_sirkes_nowhite', 'perc2_9lev', 'percent_11lev', 'posneg_2', 'prcp_1', 'prcp_2',\ + 'prcp_3', 'precip_11lev', 'precip_diff_12lev', 'precip_diff_1lev', 'precip2_15lev',\ + 'precip2_17lev', 'precip3_16lev', 'precip4_11lev', 'precip4_diff_19lev', 'radar',\ + 'radar_1', 'rh_19lev', 'seaice_1', 'seaice_2', 'so4_21', 'spread_15lev', 'StepSeq25',\ + 'sunshine_9lev', 'sunshine_diff_12lev', 'temp_19lev', 'temp_diff_18lev', 'temp_diff_1lev',\ + 'topo_15lev', 'wgne15', 'wind_17lev'] + + + idl_guide=[] + for i in np.arange(1,45): + idl_guide.append('scale'+str(i)) + + for category in 'ncl_meteoswiss', 'ncl_small', 'ncl_large', 'ncl_color_blindness', 'idl_guide': + if category == 'ncl_meteoswiss': + scales=ncl_meteoswiss + div='================== =====' + chars=19 + print 'NCAR Command Language - MeteoSwiss colour maps' + print '----------------------------------------------' + print '' + print div + print 'Name Scale' + print div + if category == 'ncl_small': + scales=ncl_small + div='=================== =====' + chars=20 + print 'NCAR Command Language - small color maps (<50 colours)' + print '------------------------------------------------------' + print '' + print div + print 'Name Scale' + print div + if category == 'ncl_large': + scales=ncl_large + div='======================= =====' + chars=24 + print 'NCAR Command Language - large colour maps (>50 colours)' + print '-------------------------------------------------------' + print '' + print div + print 'Name Scale' + print div + if category == 'ncl_color_blindness': + scales=ncl_color_blindness + div='================ =====' + chars=17 + print 'NCAR Command Language - Enhanced to help with colour blindness' + print '--------------------------------------------------------------' + print '' + print div + print 'Name Scale' + print div + chars=17 + if category == 'idl_guide': + scales=idl_guide + div='======= =====' + chars=8 + print 'IDL guide scales' + print '----------------' + print '' + print div + print 'Name Scale' + print div + chars=8 + + + for scale in scales: + #Make image of scale + fig = plot.figure(figsize=(8,0.5)) + ax1 = fig.add_axes([0.05, 0.1, 0.9, 0.2]) + cscale(scale) + ncols=np.size(plotvars.cs) + cmap = matplotlib.colors.ListedColormap(plotvars.cs) + cb1 = matplotlib.colorbar.ColorbarBase(ax1, cmap=cmap, orientation='horizontal', ticks=None) + cb1.set_ticks([0.0,1.0]) + cb1.set_ticklabels(['','']) + file='/home/andy/public_html/cfplot_sphinx/images/colour_scales/'+scale+'.png' + plot.savefig(file) + plot.close() + + #Use covert to trim the png file to remove white space + call(["convert", "-trim", file, file]) + + name_pad=scale + while len(name_pad) < chars: name_pad=name_pad+' ' + print name_pad+'.. image:: images/colour_scales/'+scale+'.png' + + print div + print '' + print '' + + +
    +
    [docs]def reset(): + """ + | reset all plotting variables + | + | + | + | + | + | + | + :Returns: + name + | + | + | + """ + axes() + cscale() + levs() + gset() + mapset() + setvars() + + +
    +
    [docs]def setvars(file=None, title_fontsize=None, text_fontsize=None, axis_label_fontsize=None, \ + title_fontweight='normal', text_fontweight='normal', axis_label_fontweight='normal', \ + fontweight='normal', continent_thickness=None, continent_color=None): + """ + | setvars - set plotting variables + | + | file=None - output file name + | text_fontsize=None - text fontsize, default=11 + | title_fontsize=None - title fontsize, default=15 + | axis_label_fontsize=None - default=11 + | text_fontweight='normal' - text fontweight + | title_fontweight='normal' - title fontweight + | axis_label_fontweight='normal' - axis fontweight + | fontweight='normal' - all above fontweights + | continent_thickness=None - default=1.5 + | continent_color=None - default='k' (black) + | + | Use setvars() to reset to the defaults + | + | + | + :Returns: + name + | + | + | + """ + + if (file, title_fontsize, text_fontsize, axis_label_fontsize, continent_thickness, \ + title_fontweight, text_fontweight, axis_label_fontweight, fontweight, \ + continent_color).count(None) == 10: + plotvars.file=None + title_fontsize=None + text_fontsize=None + axis_label_fontsize=None + title_fontweight='normal' + text_fontweight='normal' + axis_label_fontweight='normal', + fontweight='normal' + continent_thickness=None + continent_color=None + + plotvars.file=file + plotvars.title_fontsize=title_fontsize + plotvars.axis_label_fontsize=axis_label_fontsize + plotvars.continent_thickness=continent_thickness + plotvars.continent_color=continent_color + plotvars.text_fontsize=text_fontsize + plotvars.text_fontweight=text_fontweight + plotvars.axis_label_fontweight=axis_label_fontweight + plotvars.title_fontweight=title_fontweight + if fontweight != 'normal': + plotvars.text_fontweight=fontweight + plotvars.axis_label_fontweight=fontweight + plotvars.title_fontweight=fontweight + + + +
    +
    [docs]def rgrot(xin=None, yin=None, xpole=None, ypole=None): + """ + | rgrot - rotate longitude and latitude points onto a rotated grid + | + | xin=xin - longitude locations + | yin=yin - latitude locations + | xpole=xpole - xpole in degrees + | ypole=ypole - ypole in degrees + | + | + | + | + :Returns: + x and y points on rotated grid + | + | + | + | + | + | + """ + + + + + #Check input parameters + if [xin, yin, xpole, ypole].count(None) > 0: + errstr='\n\ + rgrot error\n\ + xin, yin, xpole, ypole all need to be passed to rgrot to generate \n\ + rotated output points\ + \n' + raise Warning(errstr) + + + #Define output arrays. + xout=np.zeros(np.size(xin)) + yout=np.zeros(np.size(yin)) + + #Tolerance limit. + tol=1.0E-6 + + + #Scale xpole to range -180 to 180. + xpole_orig=xpole + if (xpole > 180.0): xpole=xpole-360.0 + + #Latitude of zero meridian. + x_zero=xpole+180.0 + + + #Sine and cosine of latitude of eq pole + if (ypole >= 0.0): + sin_ypole=np.sin(ypole*np.pi/180.0) + cos_ypole=np.cos(ypole*np.pi/180.0) + else: + sin_ypole=-np.sin(ypole*np.pi/180.0) + cos_ypole=-np.cos(ypole*np.pi/180.0) + + + + #Transform to rotated grid. + for ix in np.arange(np.size(xin)): + + #Scale longitude to range -180 to +180 degs + xpt=xin[ix]-x_zero + if (xpt > 180.0): xpt=xpt-360.0 + if (xpt <= -180.0): xpt=xpt+360.0 + + #Convert latitude & longitude to radians + xpt=xpt*np.pi/180.0 + ypt=yin[ix]*np.pi/180.0 + + #Calculate latitude. + arg=-cos_ypole*np.cos(xpt)*np.cos(ypt)+np.sin(ypt)*sin_ypole + arg=min([arg,1.0]) + arg=max([arg,-1.0]) + ypt2=np.arcsin(arg) + yout[ix]=ypt2*180.0/np.pi + + #Calculate longitude. + t1=(np.cos(ypt)*np.cos(xpt)*sin_ypole+np.sin(ypt)*cos_ypole) + t2=np.cos(ypt2) + if (t2 < tol): + xpt2=0.0 + else: + arg=t1/t2 + arg=min([arg,1.0]) + arg=max([arg,-1.0]) + xpt2=np.arccos(arg)*180.0/np.pi + if (xpt >= 0): + xpt2=abs(xpt2) + else: + xpt2=-1.0*abs(xpt2) + + + #Scale longitude to range 0 to 360 degs + #if (xpt2 >= 360.0): xpt2=xpt2-360.0 + #if (xpt2 < 0.0): xpt2=xpt2+360.0 + xout[ix]=xpt2 + + + + #Reset xpole + xpole=xpole_orig + + + return (xout, yout) + + + +
    +
    [docs]def rgunrot(xin=None, yin=None, xpole=None, ypole=None): + """ + | rgunrot - translate points from a rotated grid to longitude/latitude grid + | + | xin=xin - longitude locations + | yin=yin - latitude locations + | xpole=xpole - xpole in degrees + | ypole=ypole - ypole in degrees + | + | + | + | + :Returns: + x and y points on longitude and latitude grid + | + | + | + | + | + | + """ + + #Check input parameters + if [xin, yin, xpole, ypole].count(None) > 0: + errstr='\n\ + rgrot error\n\ + xin, yin, xpole, ypole all need to be passed to rgrot to generate \n\ + rotated output points\ + \n' + raise Warning(errstr) + + #Define output arrays. + xout=np.zeros(np.size(xin)) + yout=np.zeros(np.size(yin)) + + #Tolerance limit. + tol=1.0E-6 + + + #Form x and y arrays to hold grid coordinates. + nx=np.size(xin) + ny=np.size(yin) + x=np.zeros([ny, nx]) + y=np.zeros([ny, nx]) + for iy in np.arange(ny): + x[iy,:]=xin + for ix in np.arange(nx): + y[:,ix]=yin + + xpole_orig=xpole + if (xpole > 180.0): xpole=xpole-360.0 + + #Sine and cosine of latitude of eq pole + if (ypole >= 0.0): + sin_ypole=np.sin(ypole*np.pi/180.0) + cos_ypole=np.cos(ypole*np.pi/180.0) + else: + sin_ypole=-np.sin(ypole*np.pi/180.0) + cos_ypole=-np.cos(ypole*np.pi/180.0) + + #Scale to -180 to 180 + xx=x + yy=y + pts=np.where(xx > 180) + xx[pts]=xx[pts]-360.0 + pts=np.where(xx < 180) + xx[pts]=xx[pts]+360.0 + xx=np.pi*xx/180.0 + yy=np.pi*yy/180.0 + + + arg=cosypole*np.cos(xx)*np.cos(yy)+np.sin(yy)*sinypole + pts=WHERE(arg > 1.0) + arg[pts]=1.0 + pts=np.where(arg <= -1.0) + arg[pts]=-1.0 + ay=np.asin(arg) + y=180.0*ay/np.pi + + + t1=np.cos(YY)*np.cos(XX)*sinypole-np.sin(YY)*cosypole + t2=np.cos(ay) + + + ax=np.zeros([ny,nx]) + + pts=np.where(t2 < tol) + ax[pts]=0.0 + + pts=np.where(t2 >= tol) + + if (np.size(pts) > 0): + arg=t1/T2 + pts2=np.where(arg > 1.0) + arg[pts2]=1.0 + pts2=np.where(arg < -1.0) + arg[pts2]=-1.0 + arg=180.0*np.acos(arg)/np.pi + ax[pts]=arg + pts3=np.where(xx >= 0.0) + ax[pts3]=np.abs(ax[pts3]) + pts3=np.where(xx < 0.0) + ax[pts3]=-1.0*np.abs(ax[pts3]) + ax=ax+x0 + + + x=ax + + #Reset xpole + xpole=xpole_orig + + return(x,y) + +
    +
    [docs]def vloc(xvec=None, yvec=None, lons=None, lats=None): + """ + | vloc is used to locate the positions of a set of points in a vector + | + | + | + | xvec=None - data longitudes + | yvec=None - data latitudes + | lons=None - required longitude positions + | lats=None - required latitude positions + + :Returns: + locations of user points in the longitude and latitude points + | + | + | + | + | + | + | + """ + + import numpy as np + + #Check input parameters + if [xvec, yvec, lons, lats].count(None) > 0: + errstr='\n\ + vloc error\n\ + xvec, yvec, lons, lats all need to be passed to vloc to generate \n\ + a set of location points\ + \n' + raise Warning(errstr) + + + xarr=np.zeros(np.size(lons)) + yarr=np.zeros(np.size(lats)) + + + #Convert longitudes to -180 to 180. + for i in np.arange(np.size(xvec)): + xvec[i]=((xvec[i] + 180) % 360)-180 + for i in np.arange(np.size(lons)): + lons[i]=((lons[i] + 180) % 360)-180 + + #Centre around 180 degrees longitude if needed. + if (max(xvec) > 150): + for i in np.arange(np.size(xvec)): + xvec[i]=(xvec[i]+360.0) % 360.0 + pts=np.where(xvec < 0.0) + xvec[pts]=xvec[pts]+360.0 + for i in np.arange(np.size(lons)): + lons[i]=(lons[i]+360.0) % 360.0 + pts=np.where(lons < 0.0) + lons[pts]=lons[pts]+360.0 + + + #Find position in array + for i in np.arange(np.size(lons)): + + if ((lons[i] < min(xvec)) or (lons[i] > max(xvec))): + xpt=-1 + else: + xpts=np.where(lons[i] >= xvec) + xpt=np.nanmax(xpts) + + if ((lats[i] < min(yvec)) or (lats[i] > max(yvec))): + ypt=-1 + else: + ypts=np.where(lats[i] >= yvec) + ypt=np.nanmax(ypts) + + + if (xpt >= 0): + xarr[i]=xpt+(lons[i]-xvec[xpt])/(xvec[xpt+1]-xvec[xpt]) + else: + xarr[i]=None + + + if (ypt >= 0) and ypt <= np.size(yvec)-2: + yarr[i]=ypt+(lats[i]-yvec[ypt])/(yvec[ypt+1]-yvec[ypt]) + else: + yarr[i]=None + + return (xarr, yarr) + + + + +
    +
    [docs]def rgaxes(xpole=None, ypole=None, xvec=None, yvec=None, spacing=10.0, degspacing=0.75, \ + continents=True, grid=True, labels=True): + """ + | rgaxes - label rotated grid plots + | + | xpole=None - location of xpole in degrees + | ypole=None - location of ypole in degrees + | xvec=None - location of x grid points + | yvec=None - location of y grid points + | spacing=10.0 - spacing of the grid for longitude and latitude (degrees) + | degspacing=0.75 - spacing of the points along the grid (degrees) + | continents=True - draw continents + | grid=True - draw grid + | labels=True - draw axis labels + | + | + | + :Returns: + name + | + | + | + | + | + | + """ + + #Invert y array if going from north to south + #Otherwise this gives nans for all output + yvec_orig=yvec + if (yvec[0] > yvec[np.size(yvec)-1]): yvec=yvec[::-1] + + + #Extract map continents + m=Basemap(projection='cyl', resolution=plotvars.resolution) + + clines=m.drawcoastlines(linewidth=0.0) + paths=clines.get_paths() + npaths=len(paths) + + gset(xmin=0, xmax=np.size(xvec)-1, ymin=0, ymax=np.size(yvec)-1, user_gset=0) + + #Set continent thickness and color if not already set + if plotvars.continent_thickness is None: continent_thickness=1.5 + if plotvars.continent_color is None: continent_color='k' + + #Draw continents + if continents is True: + for i in np.arange(npaths): + p=paths[i] + pvert=p.vertices + lons=pvert[:,0] + lats=pvert[:,1] + + xout, yout=rgrot(xin=pvert[:,0], yin=pvert[:,1], xpole=xpole, ypole=ypole) + xpts, ypts = vloc(lons=xout, lats=yout, xvec=xvec, yvec=yvec) + plotvars.plot.plot(xpts,ypts,linewidth=continent_thickness, \ + color=continent_color) + + + + #Draw grid lines + if grid is True: + lons=-180+np.arange(360/spacing+1)*spacing + lats=-90+np.arange(180/spacing+1)*spacing + #latmin=np.nanmin(xpts) + #lonmin=np.nanmin(ypts) + + #Longitudes + for lon in lons: + ipts=179./degspacing + lona=np.zeros(ipts)+lon + lata=-90+np.arange(ipts-1)*degspacing + xout, yout=rgrot(xin=lona, yin=lata, xpole=xpole, ypole=ypole) + xpts, ypts=vloc(lons=xout, lats=yout, xvec=xvec, yvec=yvec) + plotvars.plot.plot(xpts,ypts, ':', linewidth=2, color='k') + + #if labels is True: + #Label code here + + #Latitudes + for lat in lats: + ipts=359.0/degspacing + lata=np.zeros(ipts)+lat + lona=-180.0+np.arange(ipts-1)*degspacing + xout, yout=rgrot(xin=lona, yin=lata, xpole=xpole, ypole=ypole) + xpts, ypts=vloc(lons=xout, lats=yout, xvec=xvec, yvec=yvec) + plotvars.plot.plot(xpts,ypts, ':', linewidth=2, color='k') + + #if labels is True: + #Label code here + + #;Plot lower axis labels if required. + #IF ((ylab EQ 1) or (ylab EQ 3)) THEN BEGIN + # pts=WHERE(xyloc(*,1) GE 0.0, count) + # IF (count GE 1) THEN BEGIN + # ipt=MIN(pts) + # IF (xyloc(ipt,0) GE 0) THEN BEGIN + # y0=ymin-200 + # x0=xmin+xyloc(ipt,0)/(xpts-1)*(xmax-xmin) + # GPLOT, X=[x0, x0], Y=[ymin, ymin-150], /DEVICE + # GPLOT, X=x0, Y=y0-50 , TEXT=SCROP(((lons(ix) + 180) MOD 360)-180), ALIGN=0.5, VALIGN=1.0, /DEVICE + # ENDIF + # ENDIF + #ENDIF + + + yvec=yvec_orig + +
    + +
    +
    +
    + +
    + + + + + \ No newline at end of file diff --git a/docs/source/_build/html/_modules/index.html b/docs/source/_build/html/_modules/index.html new file mode 100644 index 0000000..d7828b9 --- /dev/null +++ b/docs/source/_build/html/_modules/index.html @@ -0,0 +1,79 @@ + + + + + + + + Overview: module code — cf-view 0.6.10 documentation + + + + + + + + + + + + + +
    +
    +
    +
    + +

    All modules for which code is available

    + + +
    +
    +
    + +
    +
    + + + + \ No newline at end of file diff --git a/docs/source/_build/html/_sources/cfview.rst.txt b/docs/source/_build/html/_sources/cfview.rst.txt new file mode 100644 index 0000000..3ba8ede --- /dev/null +++ b/docs/source/_build/html/_sources/cfview.rst.txt @@ -0,0 +1,4 @@ +cfview +****** + +.. autofunction:: cfview diff --git a/docs/source/_build/html/_sources/cfview.txt b/docs/source/_build/html/_sources/cfview.txt new file mode 100644 index 0000000..3ba8ede --- /dev/null +++ b/docs/source/_build/html/_sources/cfview.txt @@ -0,0 +1,4 @@ +cfview +****** + +.. autofunction:: cfview diff --git a/docs/source/_build/html/_sources/download.rst.txt b/docs/source/_build/html/_sources/download.rst.txt new file mode 100644 index 0000000..efbb399 --- /dev/null +++ b/docs/source/_build/html/_sources/download.rst.txt @@ -0,0 +1,74 @@ +Download/Install +**************** + + +cf-view is available for our supported platforms of Linux and Mac OSX. If you are using Windows then installing the Microsoft Windows Subsystem for Linux will provide Linux access on that platform. + + +cf-view is already installed on the following computers +======================================================= + +JASMIN: source /home/users/ajh/cfview_install/bin/cfview_setup.sh + +ARCHER2: source /home/n02/n02/ajh/cfview_install/bin/cfview_setup.sh + +Reading RACC: source /share/apps/NCAS/cfview_install/bin/cfview_setup.sh + + + + +To install cf-view +================== + +Simplified install process, download is 400MB, unpacked Python distribution is 1.5GB: + +:: + + Linux: wget http://gws-access.jasmin.ac.uk/public/ncas_climate/ajh/cfview_install/cfview_install.sh + Mac: curl -O -L http://gws-access.jasmin.ac.uk/public/ncas_climate/ajh/cfview_install/cfview_install.sh + + bash cfview_install.sh + + + + +Or - make your own installation: + +Download and install the latest Miniconda Python if this is not already installed. + +:: + + conda update -n base -c defaults conda + conda install -c conda-forge pip udunits2 cartopy + pip install cf-python cf-plot cf-view + + +A conda-forge package for cf-view is in preparation which will simplify the install process. + + + + + + +To run cf-view +============== + +:: + + cfview + + +When starting cfview for the first time it might take twenty or so seconds to start while the Matplotlib plotting library does some initialisation. + + + +| +| +| +| +| +| +| +| + + diff --git a/docs/source/_build/html/_sources/download.txt b/docs/source/_build/html/_sources/download.txt new file mode 100644 index 0000000..a6d80b4 --- /dev/null +++ b/docs/source/_build/html/_sources/download.txt @@ -0,0 +1,48 @@ +Download/Install +**************** + +To install cf-view +================== + +Download and install Anaconda Python 2.7 for Linux if this is not already installed. The following will work on a more recent version of Linux i.e. Mint 17: + +:: + + conda install -c ncas -c scitools cf-python cf-plot cf-view + conda install -c jochym pygobject2 pygtk pango + conda install -c trung libiconv + conda install -c conda-forge pcre + + + +cf-view is also available as an install using pip: + +:: + + pip install cf-python + pip install cf-plot + pip install cf-view + + +cfview dependencies are pygtk, Numpy, Matplotlib, Netcdf4 and Basemap and these will also need to be installed before using cfview. + + +To run cf-view +============== + +:: + + cfview + + + +| +| +| +| +| +| +| +| + + diff --git a/docs/source/_build/html/_sources/index.rst.txt b/docs/source/_build/html/_sources/index.rst.txt new file mode 100644 index 0000000..ea7289a --- /dev/null +++ b/docs/source/_build/html/_sources/index.rst.txt @@ -0,0 +1,35 @@ + + +cf-view homepage +================ + +cf-view is a quick look data exploration tool for netCDF and Met Office PP data. + +.. image:: images/cfview.png + :scale: 40% + +Features include: + +- Easy installation +- Outputs cf-python / cf-plot code +- Map plots, zonal means, vector, line plots and Kevin Hodges' trajectory data plots +- Change map, colour scale, contour levels, vector properties +- Change interface colour scheme, fonts and font sizes +- Spherical regridding from field to field and field to specified regular grid +- View the data and colour the cells by a minimum or maximum value +- Field properties editing, deletion and creation + +Future releases will add support for: + +- 2D dimensions +- Rotated pole data +- UGRID data + + + + + + + + + diff --git a/docs/source/_build/html/_sources/index.txt b/docs/source/_build/html/_sources/index.txt new file mode 100644 index 0000000..dbd3355 --- /dev/null +++ b/docs/source/_build/html/_sources/index.txt @@ -0,0 +1,16 @@ + + +cf-view homepage +================ + +cf-view is a graphical user interface that is used for plotting `Climate and Forecast convention `_, CF , data. + + +.. image:: images/cfview.png + :scale: 60% + + + + + + diff --git a/docs/source/_build/html/_sources/issues.rst.txt b/docs/source/_build/html/_sources/issues.rst.txt new file mode 100644 index 0000000..284bef8 --- /dev/null +++ b/docs/source/_build/html/_sources/issues.rst.txt @@ -0,0 +1,27 @@ +cf-view issues +************** + +If you find a problem with cf-view please email sadie.bartholomew@ncas.ac.uk with the following: + +| (i) A short description of how the error occurs +| (ii) The data needed to make the plot. +| Please make the data as small as possible for this. +| i.e. if you have a problem plotting a field then send just this +| one field and not the whole set of fields. +| +| +| +| +| +| +| +| +| +| +| +| +| +| + + + diff --git a/docs/source/_build/html/_sources/issues.txt b/docs/source/_build/html/_sources/issues.txt new file mode 100644 index 0000000..c024d7a --- /dev/null +++ b/docs/source/_build/html/_sources/issues.txt @@ -0,0 +1,27 @@ +cf-view issues +************** + +If you find a problem with cf-view please email me Andy Heaps (andy.heaps@ncas.ac.uk) with the following: + +| (i) A short description of how the error occurs +| (ii) The data needed to make the plot. +| Please make the data as small as possible for this. +| i.e. if you have a problem plotting a field then send just this +| one field and not the whole set of fields. + + +| +| +| +| +| +| +| +| +| +| +| +| + + + diff --git a/docs/source/_build/html/_sources/license.rst.txt b/docs/source/_build/html/_sources/license.rst.txt new file mode 100644 index 0000000..66db8b3 --- /dev/null +++ b/docs/source/_build/html/_sources/license.rst.txt @@ -0,0 +1,18 @@ +License +******* + +**Copyright (c) Sadie Bartholomew (NCAS-CMS) 2024** + + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +| +| +| +| +| +| +| +| diff --git a/docs/source/_build/html/_sources/license.txt b/docs/source/_build/html/_sources/license.txt new file mode 100644 index 0000000..8d889e6 --- /dev/null +++ b/docs/source/_build/html/_sources/license.txt @@ -0,0 +1,18 @@ +License +******* + +**Copyright (c) Bryan Lawrence, Andy Heaps (NCAS) 2016** + + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +| +| +| +| +| +| +| +| diff --git a/docs/source/_build/html/_sources/roadmap.rst.txt b/docs/source/_build/html/_sources/roadmap.rst.txt new file mode 100644 index 0000000..b5fa6b5 --- /dev/null +++ b/docs/source/_build/html/_sources/roadmap.rst.txt @@ -0,0 +1,57 @@ +cf-view roadmap +*************** + +The current version is |release| + +- 2.0 Initial release using Python 3 the PyQt5 widget system +- 2.1 Improve functionality in the main interface +- 2.2 Line plots +- 2.3 Vector plots +- 2.4 Combined contour and vector plots +- 2.5 Trajectory plots +- 2.6 Extend to data that is lacking CF information +- 2.7 Data and property panels update +- 2.8 Testing against a variety of input data +- 2.9 Interim release of internal rewrite +- 3.0 Rewrite internal code to support more than 4 dimensional data +- 3.1 Rotated pole data +- 3.2 Two dimensional X and Y data such as ORCA +- 3.3 Move from PyQt5 to PyQt6 +- 3.4 UGRID data + + +| +| +| +| +| +| +| +| + + + +Requests +******** + +Further functionality may be added on request - please email with the details. + + + + +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| diff --git a/docs/source/_build/html/_sources/routines.rst.txt b/docs/source/_build/html/_sources/routines.rst.txt new file mode 100644 index 0000000..f4a715f --- /dev/null +++ b/docs/source/_build/html/_sources/routines.rst.txt @@ -0,0 +1,20 @@ +Routines +******** + +Contents: + +.. toctree:: + :maxdepth: 2 + + cfview.rst + + +| +| +| +| +| +| +| +| +| diff --git a/docs/source/_build/html/_sources/routines.txt b/docs/source/_build/html/_sources/routines.txt new file mode 100644 index 0000000..4038091 --- /dev/null +++ b/docs/source/_build/html/_sources/routines.txt @@ -0,0 +1,22 @@ +Routines +******** + +Contents: + +.. toctree:: + :maxdepth: 2 + + cfview.rst + guiWidgets.rst + plotConfigWidgets.rst + + +| +| +| +| +| +| +| +| +| diff --git a/docs/source/_build/html/_sources/version_0.0.0.rst.txt b/docs/source/_build/html/_sources/version_0.0.0.rst.txt new file mode 100644 index 0000000..93f9043 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.0.0.rst.txt @@ -0,0 +1,52 @@ +version 0.0.0 changes +********************* + +0. Add code to reset plotting in between plots +============================================== +Resetting the plotting between plots to make plots reflect current settings + +:: + + Done + + +1. Corrrect typo in calling map projections +=========================================== + +:: + + Done + + +2. Update to use cf-python 1.0 +============================== + + +:: + + plotConfigWidgets.py + + Change + for axis in axes: sizes[axis]=f.domain.dimension_sizes[axis] + to + for axis in axes: sizes[axis]=f.domain.axes_sizes(key=True)[axis] + + cfview.py + + sfield=cf.collapse(sfield,grid[d][2],axes=d) + to + sfield=sfield.collapse(grid[d][2],axes=d) + + +3. Move cfgui.py to cfview.py +============================= + +:: + + Moved cfgui.py to cfview.py as it is a more intuitive name. + + + + + + diff --git a/docs/source/_build/html/_sources/version_0.0.0.txt b/docs/source/_build/html/_sources/version_0.0.0.txt new file mode 100644 index 0000000..93f9043 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.0.0.txt @@ -0,0 +1,52 @@ +version 0.0.0 changes +********************* + +0. Add code to reset plotting in between plots +============================================== +Resetting the plotting between plots to make plots reflect current settings + +:: + + Done + + +1. Corrrect typo in calling map projections +=========================================== + +:: + + Done + + +2. Update to use cf-python 1.0 +============================== + + +:: + + plotConfigWidgets.py + + Change + for axis in axes: sizes[axis]=f.domain.dimension_sizes[axis] + to + for axis in axes: sizes[axis]=f.domain.axes_sizes(key=True)[axis] + + cfview.py + + sfield=cf.collapse(sfield,grid[d][2],axes=d) + to + sfield=sfield.collapse(grid[d][2],axes=d) + + +3. Move cfgui.py to cfview.py +============================= + +:: + + Moved cfgui.py to cfview.py as it is a more intuitive name. + + + + + + diff --git a/docs/source/_build/html/_sources/version_0.1.rst.txt b/docs/source/_build/html/_sources/version_0.1.rst.txt new file mode 100644 index 0000000..e48be73 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.1.rst.txt @@ -0,0 +1,21 @@ +version 0.1 changes +******************* + +0. Add code to plot line graphs +=============================== + +Code was added so that a line graph can be plotted + +:: + + Done + + + + + + + + + + diff --git a/docs/source/_build/html/_sources/version_0.1.txt b/docs/source/_build/html/_sources/version_0.1.txt new file mode 100644 index 0000000..e48be73 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.1.txt @@ -0,0 +1,21 @@ +version 0.1 changes +******************* + +0. Add code to plot line graphs +=============================== + +Code was added so that a line graph can be plotted + +:: + + Done + + + + + + + + + + diff --git a/docs/source/_build/html/_sources/version_0.2.rst.txt b/docs/source/_build/html/_sources/version_0.2.rst.txt new file mode 100644 index 0000000..4f879e4 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.2.rst.txt @@ -0,0 +1,24 @@ +version 0.2 changes +******************* + +0. Multiple plots +================= + +Original multiple plot code was modified to work with different plot types. + +:: + + Done + + To make multiple plots select the required number of plots with the n-up button and + for each plot required click on Plot (Configured). When the required number of + plots is reached the plots will be displayed in a graphics window. + + + + + + + + + diff --git a/docs/source/_build/html/_sources/version_0.2.txt b/docs/source/_build/html/_sources/version_0.2.txt new file mode 100644 index 0000000..4f879e4 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.2.txt @@ -0,0 +1,24 @@ +version 0.2 changes +******************* + +0. Multiple plots +================= + +Original multiple plot code was modified to work with different plot types. + +:: + + Done + + To make multiple plots select the required number of plots with the n-up button and + for each plot required click on Plot (Configured). When the required number of + plots is reached the plots will be displayed in a graphics window. + + + + + + + + + diff --git a/docs/source/_build/html/_sources/version_0.3.rst.txt b/docs/source/_build/html/_sources/version_0.3.rst.txt new file mode 100644 index 0000000..231b8e2 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.3.rst.txt @@ -0,0 +1,28 @@ +version 0.3 changes +******************* + +0. Vector plots +=============== + +Add code to plot vectors. + +:: + + Done + + To plot vectors first select the u conponent for the x-axis and then the v conponent for the y-axis. + The code works for longitude-latitude (cylindrical projection) and latitude-pressure vector plots. + + + +1. Contours with vectors on top +=============================== + +:: + + Done + + Add code so that a user can plot contours with a vector plot on top. + + + diff --git a/docs/source/_build/html/_sources/version_0.3.txt b/docs/source/_build/html/_sources/version_0.3.txt new file mode 100644 index 0000000..231b8e2 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.3.txt @@ -0,0 +1,28 @@ +version 0.3 changes +******************* + +0. Vector plots +=============== + +Add code to plot vectors. + +:: + + Done + + To plot vectors first select the u conponent for the x-axis and then the v conponent for the y-axis. + The code works for longitude-latitude (cylindrical projection) and latitude-pressure vector plots. + + + +1. Contours with vectors on top +=============================== + +:: + + Done + + Add code so that a user can plot contours with a vector plot on top. + + + diff --git a/docs/source/_build/html/_sources/version_0.4.rst.txt b/docs/source/_build/html/_sources/version_0.4.rst.txt new file mode 100644 index 0000000..cf86550 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.4.rst.txt @@ -0,0 +1,22 @@ +version 0.4 changes +******************* + +0. View code button +=================== + +Add view and save code buttons. The code to make a plot is stored in plotvars.code. + +:: + + Done + + + +1. View data +============ + + +:: + + Done + diff --git a/docs/source/_build/html/_sources/version_0.4.txt b/docs/source/_build/html/_sources/version_0.4.txt new file mode 100644 index 0000000..cf86550 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.4.txt @@ -0,0 +1,22 @@ +version 0.4 changes +******************* + +0. View code button +=================== + +Add view and save code buttons. The code to make a plot is stored in plotvars.code. + +:: + + Done + + + +1. View data +============ + + +:: + + Done + diff --git a/docs/source/_build/html/_sources/version_0.5.rst.txt b/docs/source/_build/html/_sources/version_0.5.rst.txt new file mode 100644 index 0000000..65306b3 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.5.rst.txt @@ -0,0 +1,51 @@ +version 0.5 changes +******************* + +0. Initial data selection should be X:, Y:, Z:0, T:0 +==================================================== + +Set the initial data selection to be a longitude latitude cross section if available. + +:: + + Done + + + +1. Display data axes in the order X, Y, Z, T +============================================ + +The original code selected the data axes in the internal cf-python dimension order. +This has been changed to be in the normal axis order of X, Y, Z, T + +:: + + Done + + + + +2. Merge all code into main cfview program +========================================== + +The merge will make it easier to distribute cf-view. It will also make finding routines more difficult +and some thought needs to be given to this to make teh code flow in a more logical way. + +:: + + Done + + +3. Add .gitignore file +====================== + +Added .gitignore file to tidy up some inadvertently added ~ files. + +:: + + Done + + +Interface changes have been put on hold at this point as it is more important to get cf-view working better with a range of CF data. + + diff --git a/docs/source/_build/html/_sources/version_0.5.txt b/docs/source/_build/html/_sources/version_0.5.txt new file mode 100644 index 0000000..65306b3 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.5.txt @@ -0,0 +1,51 @@ +version 0.5 changes +******************* + +0. Initial data selection should be X:, Y:, Z:0, T:0 +==================================================== + +Set the initial data selection to be a longitude latitude cross section if available. + +:: + + Done + + + +1. Display data axes in the order X, Y, Z, T +============================================ + +The original code selected the data axes in the internal cf-python dimension order. +This has been changed to be in the normal axis order of X, Y, Z, T + +:: + + Done + + + + +2. Merge all code into main cfview program +========================================== + +The merge will make it easier to distribute cf-view. It will also make finding routines more difficult +and some thought needs to be given to this to make teh code flow in a more logical way. + +:: + + Done + + +3. Add .gitignore file +====================== + +Added .gitignore file to tidy up some inadvertently added ~ files. + +:: + + Done + + +Interface changes have been put on hold at this point as it is more important to get cf-view working better with a range of CF data. + + diff --git a/docs/source/_build/html/_sources/version_0.6.rst.txt b/docs/source/_build/html/_sources/version_0.6.rst.txt new file mode 100644 index 0000000..5bc1d89 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.6.rst.txt @@ -0,0 +1,157 @@ +version 0.6 changes +******************* + + +Testing against lots of files to find the bugs in cf-view and cf-plot. + + +0. String formatting issues +=========================== + +In cf-view the description of the needs to be correct to allow data subspacing in cf-python but rounding and interpretation errors when translating from floats to strings meant that in some cases this to not be the case. For example a time axis value of 1496205.0 was set to 1.4962e+06. In another case the Gaussian latitude of 3.92521453 was truncated to 3.925. In both of the above cases cf-view would crash with an error saying it wasn't possible to subspace the data. + +The code was modified to pass the float of the data rather than just the data. + +:: + + Done + + + +1. Masked iterator issue when doing np.nanmin +============================================= + +This isn't a cf-view issue as such but one in numpy. When cf-plot does a numpy.nanmin of a masked array version numpy 1.7 produces a masked iterator object and numpy 1.8.1 produces a single number. The error is produced in cf-plot in the automatic levels selection call to the gval routine. + +A line has been put in the cf-view code to check that the numpy version is > 1.8.1 and abort if otherwise. + +:: + + Fixed + + +2. Data with only X, Y, T causes a crash in the creation of the cf-view widget +============================================================================== + +:: + + Fixed + + +3. Data with no standard_name or long_name causes cf-view to crash +================================================================== + +:: + + Fixed + + +4. Axes in the Field Selector don't always have the proper dimensions in the X Y Z T fields +=========================================================================================== + +This was because in cf-python if there are two valid Z axes, for example, then None is returned +for the Z dimension as it is ambiguous. Use + +for k, v in field.items('Z').iteritems(): + if v.isdimension is True: nz=len(field.item(k).array) + +as the construct to get the number of values in the 'Z' dimension. + +Can also use v.isauxillary to get auxillary coordinates. + +:: + + Fixed + +5. In the grid selector the dimension 1 parts of a variable aren't always listed +================================================================================ + +:: + + Fixed + + +6. Error in subspace of data that has almost matching vertical coordinates +========================================================================== + +In a field we have: +atmosphere_hybrid_sigma_pressure_coordinate +and +atmosphere_hybrid_sigma_pressure_coordinate_ak + +Need to use f.subspace('exact', atmosphere_hybrid_sigma_pressure_coordinate=0.0291614404296875) +to pick up the atmosphere_hybrid_sigma_pressure_coordinate coordinate. + +:: + + Fixed + + +7. Ranges after number 2 in the grid selector are set to the maximum +==================================================================== + +After the first two ranges set additional ranges to be the first value of the field. +If the axis is a pressure or height coordinate set it to be the maximim value of +the field i.e. that nearest the ground. + +:: + + Fixed + + +8. Non-valid combobox value +=========================== + +This was quite a complex problem relating to the translation of floats to strings and back again and +needed further work after the initial fix in issle 0. + +There are floats, numpy.float32 and numpy.float64 beging passed in as axis values. When these are +extracted and turned back into floats a loss of precision occurs with the higher numbers of decimal +places in the numpy.float64 values causing the numbers to not match any more. + +Use repr to pass in the value as a string for display in the interface. When extracting use a float +for the value up to seven decimal places and then a numpy.float64. + +:: + + Fixed + + +9. When opening a new file an warniing is displayed +=================================================== + +The fields list is empty at this stage so put a check in to only do something if the length of the fields variable is > 0. + +:: + + Fixed + + +10. Markup issue in Field metatdata - ampersand characters cause a warning +========================================================================== + +Translate any '&' characters in the metadata string to 'and' + + +:: + + Fixed + + +11. No change +============= + +Version updated with no code change. + + + +12. Change graph plotting code to use new cf-plot lineplot code +=============================================================== + +:: + + Done + + + + diff --git a/docs/source/_build/html/_sources/version_0.6.txt b/docs/source/_build/html/_sources/version_0.6.txt new file mode 100644 index 0000000..5bc1d89 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.6.txt @@ -0,0 +1,157 @@ +version 0.6 changes +******************* + + +Testing against lots of files to find the bugs in cf-view and cf-plot. + + +0. String formatting issues +=========================== + +In cf-view the description of the needs to be correct to allow data subspacing in cf-python but rounding and interpretation errors when translating from floats to strings meant that in some cases this to not be the case. For example a time axis value of 1496205.0 was set to 1.4962e+06. In another case the Gaussian latitude of 3.92521453 was truncated to 3.925. In both of the above cases cf-view would crash with an error saying it wasn't possible to subspace the data. + +The code was modified to pass the float of the data rather than just the data. + +:: + + Done + + + +1. Masked iterator issue when doing np.nanmin +============================================= + +This isn't a cf-view issue as such but one in numpy. When cf-plot does a numpy.nanmin of a masked array version numpy 1.7 produces a masked iterator object and numpy 1.8.1 produces a single number. The error is produced in cf-plot in the automatic levels selection call to the gval routine. + +A line has been put in the cf-view code to check that the numpy version is > 1.8.1 and abort if otherwise. + +:: + + Fixed + + +2. Data with only X, Y, T causes a crash in the creation of the cf-view widget +============================================================================== + +:: + + Fixed + + +3. Data with no standard_name or long_name causes cf-view to crash +================================================================== + +:: + + Fixed + + +4. Axes in the Field Selector don't always have the proper dimensions in the X Y Z T fields +=========================================================================================== + +This was because in cf-python if there are two valid Z axes, for example, then None is returned +for the Z dimension as it is ambiguous. Use + +for k, v in field.items('Z').iteritems(): + if v.isdimension is True: nz=len(field.item(k).array) + +as the construct to get the number of values in the 'Z' dimension. + +Can also use v.isauxillary to get auxillary coordinates. + +:: + + Fixed + +5. In the grid selector the dimension 1 parts of a variable aren't always listed +================================================================================ + +:: + + Fixed + + +6. Error in subspace of data that has almost matching vertical coordinates +========================================================================== + +In a field we have: +atmosphere_hybrid_sigma_pressure_coordinate +and +atmosphere_hybrid_sigma_pressure_coordinate_ak + +Need to use f.subspace('exact', atmosphere_hybrid_sigma_pressure_coordinate=0.0291614404296875) +to pick up the atmosphere_hybrid_sigma_pressure_coordinate coordinate. + +:: + + Fixed + + +7. Ranges after number 2 in the grid selector are set to the maximum +==================================================================== + +After the first two ranges set additional ranges to be the first value of the field. +If the axis is a pressure or height coordinate set it to be the maximim value of +the field i.e. that nearest the ground. + +:: + + Fixed + + +8. Non-valid combobox value +=========================== + +This was quite a complex problem relating to the translation of floats to strings and back again and +needed further work after the initial fix in issle 0. + +There are floats, numpy.float32 and numpy.float64 beging passed in as axis values. When these are +extracted and turned back into floats a loss of precision occurs with the higher numbers of decimal +places in the numpy.float64 values causing the numbers to not match any more. + +Use repr to pass in the value as a string for display in the interface. When extracting use a float +for the value up to seven decimal places and then a numpy.float64. + +:: + + Fixed + + +9. When opening a new file an warniing is displayed +=================================================== + +The fields list is empty at this stage so put a check in to only do something if the length of the fields variable is > 0. + +:: + + Fixed + + +10. Markup issue in Field metatdata - ampersand characters cause a warning +========================================================================== + +Translate any '&' characters in the metadata string to 'and' + + +:: + + Fixed + + +11. No change +============= + +Version updated with no code change. + + + +12. Change graph plotting code to use new cf-plot lineplot code +=============================================================== + +:: + + Done + + + + diff --git a/docs/source/_build/html/_sources/version_0.7.rst.txt b/docs/source/_build/html/_sources/version_0.7.rst.txt new file mode 100644 index 0000000..ac7d1c0 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.7.rst.txt @@ -0,0 +1,28 @@ +version 0.7 changes +******************* + +1. Change web doumentation +========================== + +Web documentation location changed to http://ajheaps.github.io/cf-view + +:: + + Done + + +2. Specifying subset of time axis in time / date notation +========================================================= + +This will require some work in cf-plot as well + +:: + + To do + + + + + + + diff --git a/docs/source/_build/html/_sources/version_0.7.txt b/docs/source/_build/html/_sources/version_0.7.txt new file mode 100644 index 0000000..ac7d1c0 --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.7.txt @@ -0,0 +1,28 @@ +version 0.7 changes +******************* + +1. Change web doumentation +========================== + +Web documentation location changed to http://ajheaps.github.io/cf-view + +:: + + Done + + +2. Specifying subset of time axis in time / date notation +========================================================= + +This will require some work in cf-plot as well + +:: + + To do + + + + + + + diff --git a/docs/source/_build/html/_sources/version_0.8.rst.txt b/docs/source/_build/html/_sources/version_0.8.rst.txt new file mode 100644 index 0000000..659992e --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.8.rst.txt @@ -0,0 +1,145 @@ +version 0.8 - interface changes +******************************* + +1. Advanced configuration - contour levels +========================================== + +Add levels selection inteface to Configure drop down. Even and uneven levels and colorbar extensions. + +:: + + Done + + + +2. Advanced configuration - map specification +============================================= + + +:: + + Done + + + +3. Advanced configuration - vector specification +================================================ + + +:: + + Done + + + +4. Advanced configuration - add help pop-up windows +=================================================== + + +:: + + Done + + + +5. Advanced configuration - colour maps +======================================= + + +:: + + Done + + + +6. Advanced configuration - adjust spacing of text input boxes +============================================================== + +Spacing of text input boxes in advanced configuration sections needs fine tuning. + +:: + + Done + + + + +7. Main interface - remove Select, Inspect and Gallery row +========================================================== + +The Select, Inspect and Gallery row in main interface isn't needed any more. + + +:: + + Done + + + + +8. Generate and Configure Plots panel - remove Help button +========================================================== + +This button has it has been superseeded by the main help drop down. + + +:: + + Done + + + + +9. Generate and Configure Plots panel - remove Projection button +================================================================ + +Remove button and associated code as this is now done in the Configure Map drop down. + +:: + + Done + + + +10. Configure and Generate Plots panel - add lines dropdown +=========================================================== + + +:: + + Done + + + + +11. Configure and Generate Plots panel - remove On-- from labels dropdown +========================================================================= + + + +:: + + Done + + + + +12. Configure and Generate Plots panel - rearrange contour options +================================================================== + + + +:: + + Done + + + + + + + + + + + diff --git a/docs/source/_build/html/_sources/version_0.8.txt b/docs/source/_build/html/_sources/version_0.8.txt new file mode 100644 index 0000000..659992e --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.8.txt @@ -0,0 +1,145 @@ +version 0.8 - interface changes +******************************* + +1. Advanced configuration - contour levels +========================================== + +Add levels selection inteface to Configure drop down. Even and uneven levels and colorbar extensions. + +:: + + Done + + + +2. Advanced configuration - map specification +============================================= + + +:: + + Done + + + +3. Advanced configuration - vector specification +================================================ + + +:: + + Done + + + +4. Advanced configuration - add help pop-up windows +=================================================== + + +:: + + Done + + + +5. Advanced configuration - colour maps +======================================= + + +:: + + Done + + + +6. Advanced configuration - adjust spacing of text input boxes +============================================================== + +Spacing of text input boxes in advanced configuration sections needs fine tuning. + +:: + + Done + + + + +7. Main interface - remove Select, Inspect and Gallery row +========================================================== + +The Select, Inspect and Gallery row in main interface isn't needed any more. + + +:: + + Done + + + + +8. Generate and Configure Plots panel - remove Help button +========================================================== + +This button has it has been superseeded by the main help drop down. + + +:: + + Done + + + + +9. Generate and Configure Plots panel - remove Projection button +================================================================ + +Remove button and associated code as this is now done in the Configure Map drop down. + +:: + + Done + + + +10. Configure and Generate Plots panel - add lines dropdown +=========================================================== + + +:: + + Done + + + + +11. Configure and Generate Plots panel - remove On-- from labels dropdown +========================================================================= + + + +:: + + Done + + + + +12. Configure and Generate Plots panel - rearrange contour options +================================================================== + + + +:: + + Done + + + + + + + + + + + diff --git a/docs/source/_build/html/_sources/version_0.9.rst.txt b/docs/source/_build/html/_sources/version_0.9.rst.txt new file mode 100644 index 0000000..bd73a4d --- /dev/null +++ b/docs/source/_build/html/_sources/version_0.9.rst.txt @@ -0,0 +1,100 @@ +version 0.9 - pre-release work +****************************** + +1. Remove unused code +===================== + +Remove unused code and print statements + +:: + + Done + + +2. Consolidate textview code in one class +========================================= + +:: + + Done + + +3. Review all Help sections to make clear +========================================= + +:: + + Done + + +4. Move save code button to view code panel +=========================================== + +Move save code button to view code panel and add a help button. + +:: + + Done + + + +5. Consolidate library imports +============================== + +Remove and consolidate library imports. + +:: + + Done + + +6. Make a working conda install +=============================== + +Need a working conda install for pygtk dependencies and a conda package for cfview. + +:: + + Done + + +7. Consolidate integer and float input checking +=============================================== + +:: + + Done + + +8. Check code for use of exec +============================= + +exec is used to build and run the cf-plot commands i.e. +A user changes the contour levels to have min, max and step. +These are checked to make sure they are numbers and that min reset all needs to reset everything +=================================================== + + +:: + + Done + + + +3. Combined colour bar +====================== + +Need a method of making a combined colour bar. This is selected in the configure -> contour levels window and must be done before making the first plot in a multi-plot picture. + + +:: + + Done. + + + +4. Use actual times in the time grid selector +============================================= + + +:: + + Done + + + +5. Field selector needs modifying +================================= + +The field selector only works properly when the Field Name is in alphabetical order. +The Field Name is the standard_name if this exists and need to be able to select field based +on long_name and short_name. + +:: + + To do + + +6. Multiple vector plots fail to produce any plots +================================================== + +:: + + To do + + + + + + + + + + + + + diff --git a/docs/source/_build/html/_sources/version_1.0.txt b/docs/source/_build/html/_sources/version_1.0.txt new file mode 100644 index 0000000..43b0fcc --- /dev/null +++ b/docs/source/_build/html/_sources/version_1.0.txt @@ -0,0 +1,78 @@ +version 1.0 - small feature enhancements and bug fixes +****************************************************** + +1. Look at plot blocking +======================== + +Once a plot is made and is displayed this blocks any further interaction with cfview until the plot is destroyed. + + +:: + + cf-plot was changed to use the display command from ImageMagick if this is available. + This allows the subprocesss module to be used and the plots will display in a non-blocking manner. + + +2. Configure -> reset all needs to reset everything +=================================================== + + +:: + + Done + + + +3. Combined colour bar +====================== + +Need a method of making a combined colour bar. This is selected in the configure -> contour levels window and must be done before making the first plot in a multi-plot picture. + + +:: + + Done. + + + +4. Use actual times in the time grid selector +============================================= + + +:: + + Done + + + +5. Field selector needs modifying +================================= + +The field selector only works properly when the Field Name is in alphabetical order. +The Field Name is the standard_name if this exists and need to be able to select field based +on long_name and short_name. + +:: + + To do + + +6. Multiple vector plots fail to produce any plots +================================================== + +:: + + To do + + + + + + + + + + + + + diff --git a/docs/source/_build/html/_sources/version_2.0.rst.txt b/docs/source/_build/html/_sources/version_2.0.rst.txt new file mode 100644 index 0000000..67a480a --- /dev/null +++ b/docs/source/_build/html/_sources/version_2.0.rst.txt @@ -0,0 +1,26 @@ +version 2.0 - initial release +***************************** + +0. Initial release +================== + +The initial release of cfview written in Python 3 and the pyqt5 widget system. + + +:: + + Released + + + + + + + + + + + + + + diff --git a/docs/source/_build/html/_sources/version_3.2.rst.txt b/docs/source/_build/html/_sources/version_3.2.rst.txt new file mode 100644 index 0000000..4ba0bfe --- /dev/null +++ b/docs/source/_build/html/_sources/version_3.2.rst.txt @@ -0,0 +1,326 @@ +.. _version_3.2: +version 3.2 changes +******************* + + + +0. Map popup changes +===================== + + +- clean up code for npstere and spstere sensitivity +- rotated option doesn't make it into the plotting code +- rotated option to be insensitive when data is not in rotated coordinates +- map resolution drop added to map options + + +:: + + Changed + + + +1. Colour bar extensions don't work +=================================== + +No code for colour bar extensions - levs_extend_min and levs_extend_max were missing. + + +:: + + Code added + + + +2. Code to remove auxiliary coordinates removed +=============================================== + +Change code to remove extra auxiliary coodinates as this is no longer needed - remove_aux=False + + +:: + + Done + + +3. Colour scale code changes +============================ + +The colour scale code was changed: + +- change to viridis - colour scale doesn't change +- output code is cscale='inferno' rather than scale='inferno' + +:: + + Done + + + +4. contour levels - bug with nlevs definition as a boolean +========================================================== + +There was a bug in the contour levels code with nlevs definition as a boolean + +:: + + Fixed + + + +5. Maps - user configuration and saving +======================================== + +Maps - user configuration and saving options added to map popup. + + +:: + + Done + + + +6. Contour levels - user configuration and saving +================================================== + +Contour levels - user configuration and saving options added to map popup. + +:: + + Done + + + +7. Colour scale - user configuration and saving +=============================================== + +Colour scale - user configuration and saving options added to map popup. + +:: + + Done + + + +8. New sections for user settings to be scrollable +================================================== + +New sections for user settings to be scrollable. + +:: + + Done + + + +9. New sections for user settings to be visible after clicking a checkbox +========================================================================= + +New sections for user settings to be visible after clicking a checkbox. + +:: + + Done + + + +10. Defaults file code rewrite +============================== + +Defaults file code rewrite to use dictionaries for user defined map, contour level and colour scale options. + +:: + + Done + + + +11. Issues with cf-python 3.14.0 investigated +============================================= + +Issues with cf-python 3.14.0 were investigated. These mostly seemed related to the version of netCDF4 with 1.6.1 causing issues. With a fresh install a few weeks later the issues had gone away so it is assumed that this was fixed somewhere in conda. + + +:: + + Investigated + + + +12. Check all menus look okay and adjust spacing if necessary +============================================================= + +Check all menus and adjust with hbox.addStretch(1) as required + +:: + + Done + + + +13. New property popup window to properties popup needs recoding +================================================================ + +The new property popup window to properties popup needed recoding. + +:: + + Done + + + +14. Doc strings for all routines +================================ + +Doc strings were added for all routines. + +:: + + Done + + + +15. Make a plot code - rework map settings +========================================== + +Rework code for making a plot: map settings +Use dictionaries for working out settings and code generation. + + +:: + + Done + + + +16. Make a plot code - rework colour settings +============================================= + +Rework code for making a plot: map settings +Use dictionaries for working out settings and code generation. + + +:: + + Done + + + + +17. Make a plot code - rework contour level settings +==================================================== + +Rework code for making a plot: map settings +Use dictionaries for working out settings and code generation. + +:: + + Done + + + +18. netCDF file with no fields but doesn't produce a sensible error +=================================================================== + +A netCDF file with no fields but doesn't produce a sensible error. + +:: + + Corrected + + + +19. Update cfview interpolation code +==================================== + +Update interpolation to use a sequence of Coordinate instances. This changed in cf-python at version 3.14.1. + +- g = f.regrids({'longitude': lons, 'latitude': lats}, method=method) +- becomes +- g = f.regrids([lats, lons], method=method) + + +:: + + Done + + + +20. Changes to cope better with dodgy data +========================================== + +Changes to various parts of cfview were made to cope better with some dodgy data found in cn134a.pl1m_195006-195006.nc + +- cannot read - cf-python issue with a dodgy 7th field - no data +- cf-view now has an issue with this data +- find_dim_names - have five domain axes and four coordinates +- change loop to check for coordinate type to go over coords rather than daxes +- field 5 fails as the data is dodgy - subspace fails in plot routine - add an exception test + + +:: + + Done + + + +21. Remove references to plotvars.stored collapses and plotvars.stored dimensions +================================================================================= + +Remove references to plotvars.stored collapses and plotvars.stored dimensions. +These are now plotvars.stored['f0']['collapses'] and plotvars.stored['f0']['axes'] + +:: + + Done + + + +22. Field search code update +============================ + +Field search code update. A new field gets lost internally and doesn't display as expected. + +:: + + Done + + + +23. Stray print removal +======================= + +A stray print statement was removed. + +:: + + Done + + +24. Stray print removal - and again +=================================== + +A stray print statement was removed. + +:: + + Done + + +25. Support for 2D lon-lat data added +===================================== + +Support for 2D lon-lat data contouring and blockfill was added. + + +:: + + Done + + + + + + + + diff --git a/docs/source/_build/html/_sources/versions.rst.txt b/docs/source/_build/html/_sources/versions.rst.txt new file mode 100644 index 0000000..1457a11 --- /dev/null +++ b/docs/source/_build/html/_sources/versions.rst.txt @@ -0,0 +1,39 @@ +Planned releases +**************** + +The current version is |release| + +- 2.0 Initial release using Python 3 the PyQt5 widget system +- 2.1 Improve functionality in the main interface +- 2.2 Line plots +- 2.3 Vector plots +- 2.4 Combined contour and vector plots +- 2.5 Trajectory plots +- 2.6 Extend to data that is lacking CF information +- 2.7 Data and property panels update +- 2.8 Testing against a variety of input data +- 2.9 Interim release of internal rewrite +- 3.0 Rewrite internal code to support more than 4 dimensional data +- 3.1 Rotated pole data +- 3.2 :ref:`Minor changes and bugfix release `_ +- 3.3 Two dimensional X and Y data such as ORCA +- 3.4 Move from PyQt5 to PyQt6 +- 3.5 UGRID data + + + +Further functionality may be added on request - please email with details. + + + + +| +| +| +| +| +| +| +| + + diff --git a/docs/source/_build/html/_sources/versions.txt b/docs/source/_build/html/_sources/versions.txt new file mode 100644 index 0000000..0a2d8fe --- /dev/null +++ b/docs/source/_build/html/_sources/versions.txt @@ -0,0 +1,49 @@ +Planned releases +**************** + +The current version is |release| + + +- 0.0 `first version on github `_ +- 0.1 `Graph plotting `_ +- 0.2 `Multiple plots `_ +- 0.3 `Vector plots `_ +- 0.4 `View code to make current plot `_ +- 0.5 `Interface changes `_ +- 0.6 `Testing against CF files `_ +- 0.7 `Time axis work `_ +- 0.8 `Interface work `_ +- 0.9 `Pre-release work `_ +- 1.0 `Small enhancements / bugfixes `_ + +| +| +| +| + + + +Requests +******** + +Further functionality may be added on request - please email with the details. + + + + +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| diff --git a/docs/source/_build/html/_sources/videos.rst.txt b/docs/source/_build/html/_sources/videos.rst.txt new file mode 100644 index 0000000..93450ca --- /dev/null +++ b/docs/source/_build/html/_sources/videos.rst.txt @@ -0,0 +1,33 @@ + + +cf-view training videos +================ + +A series of videos showing various features of cf-view + +- `Introduction `_ - Make map, vertical cross section, vector and line plots +- `Data transform `_ - Dimension collapses such as zonal or time mean, interpolation to another grid +- `View data `_ - View and inspect data as a table of values +- `Properties `_- View, modify, delete and add properties to data and dimensions +- `Saving data `_ - modify and save data to a netCDF file + + + + +| +| +| +| +| +| +| +| +| +| +| +| +| + + + + diff --git a/docs/source/_build/html/_static/_sphinx_javascript_frameworks_compat.js b/docs/source/_build/html/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000..8549469 --- /dev/null +++ b/docs/source/_build/html/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,134 @@ +/* + * _sphinx_javascript_frameworks_compat.js + * ~~~~~~~~~~ + * + * Compatability shim for jQuery and underscores.js. + * + * WILL BE REMOVED IN Sphinx 6.0 + * xref RemovedInSphinx60Warning + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/docs/source/_build/html/_static/ajax-loader.gif b/docs/source/_build/html/_static/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..61faf8cab23993bd3e1560bff0668bd628642330 GIT binary patch literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN literal 0 HcmV?d00001 diff --git a/docs/source/_build/html/_static/basic.css b/docs/source/_build/html/_static/basic.css new file mode 100644 index 0000000..43fb704 --- /dev/null +++ b/docs/source/_build/html/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 150px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/source/_build/html/_static/classic.css b/docs/source/_build/html/_static/classic.css new file mode 100644 index 0000000..20d230d --- /dev/null +++ b/docs/source/_build/html/_static/classic.css @@ -0,0 +1,286 @@ +/* + * classic.css_t + * ~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- classic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +html { + /* CSS hack for macOS's scrollbar (see #1125) */ + background-color: #FFFFFF; +} + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + display: flex; + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 150px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + line-height: 30px; + color: #ffffff; +} + +div.related a { + color: #ffffff; +} + +div.sphinxsidebar { + top: 30px; + bottom: 0; + margin: 0; + position: fixed; + overflow: auto; + height: auto; +} +/* this is nice, but it it leads to hidden headings when jumping + to an anchor */ +/* +div.related { + position: fixed; +} + +div.documentwrapper { + margin-top: 30px; +} +*/ + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #ffffff; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + + + +/* -- hyperlink styles ------------------------------------------------------ */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:visited { + color: #551a8b; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + + + +/* -- body styles ----------------------------------------------------------- */ + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +nav.contents, +aside.topic, +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: unset; + color: unset; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +code { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th, dl.field-list > dt { + background-color: #ede; +} + +.warning code { + background: #efc2c2; +} + +.note code { + background: #d6d6d6; +} + +.viewcode-back { + font-family: sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +div.code-block-caption { + color: #efefef; + background-color: #1c4e63; +} \ No newline at end of file diff --git a/docs/source/_build/html/_static/comment-bright.png b/docs/source/_build/html/_static/comment-bright.png new file mode 100644 index 0000000000000000000000000000000000000000..15e27edb12ac25701ac0ac21b97b52bb4e45415e GIT binary patch literal 756 zcmVgfIX78 z$8Pzv({A~p%??+>KickCb#0FM1rYN=mBmQ&Nwp<#JXUhU;{|)}%&s>suq6lXw*~s{ zvHx}3C%<;wE5CH!BR{p5@ml9ws}y)=QN-kL2?#`S5d*6j zk`h<}j1>tD$b?4D^N9w}-k)bxXxFg>+#kme^xx#qg6FI-%iv2U{0h(Y)cs%5a|m%Pn_K3X_bDJ>EH#(Fb73Z zfUt2Q3B>N+ot3qb*DqbTZpFIn4a!#_R-}{?-~Hs=xSS6p&$sZ-k1zDdtqU`Y@`#qL z&zv-~)Q#JCU(dI)Hf;$CEnK=6CK50}q7~wdbI->?E07bJ0R;!GSQTs5Am`#;*WHjvHRvY?&$Lm-vq1a_BzocI^ULXV!lbMd%|^B#fY;XX)n<&R^L z=84u1e_3ziq;Hz-*k5~zwY3*oDKt0;bM@M@@89;@m*4RFgvvM_4;5LB!@OB@^WbVT zjl{t;a8_>od-~P4 m{5|DvB&z#xT;*OnJqG}gk~_7HcNkCr0000W zanA~u9RIXo;n7c96&U)YLgs-FGlx~*_c{Jgvesu1E5(8YEf&5wF=YFPcRe@1=MJmi zag(L*xc2r0(slpcN!vC5CUju;vHJkHc*&70_n2OZsK%O~A=!+YIw z7zLLl7~Z+~RgWOQ=MI6$#0pvpu$Q43 zP@36QAmu6!_9NPM?o<1_!+stoVRRZbW9#SPe!n;#A_6m8f}|xN1;H{`0RoXQ2LM47 zt(g;iZ6|pCb@h2xk&(}S3=EVBUO0e90m2Lp5CB<(SPIaB;n4))3JB87Or#XPOPcum z?<^(g+m9}VNn4Y&B`g8h{t_$+RB1%HKRY6fjtd-<7&EsU;vs0GM(Lmbhi%Gwcfs0FTF}T zL{_M6Go&E0Eg8FuB*(Yn+Z*RVTBE@10eIOb3El^MhO`GabDll(V0&FlJi2k^;q8af zkENdk2}x2)_KVp`5OAwXZM;dG0?M-S)xE1IKDi6BY@5%Or?#aZ9$gcX)dPZ&wA1a< z$rFXHPn|TBf`e?>Are8sKtKrKcjF$i^lp!zkL?C|y^vlHr1HXeVJd;1I~g&Ob-q)& z(fn7s-KI}G{wnKzg_U5G(V%bX6uk zIa+<@>rdmZYd!9Y=C0cuchrbIjuRB_Wq{-RXlic?flu1*_ux}x%(HDH&nT`k^xCeC ziHi1!ChH*sQ6|UqJpTTzX$aw8e(UfcS^f;6yBWd+(1-70zU(rtxtqR%j z-lsH|CKQJXqD{+F7V0OTv8@{~(wp(`oIP^ZykMWgR>&|RsklFMCnOo&Bd{le} zV5F6424Qzl;o2G%oVvmHgRDP9!=rK8fy^!yV8y*4p=??uIRrrr0?>O!(z*g5AvL2!4z0{sq%vhG*Po}`a<6%kTK5TNhtC8}rXNu&h^QH4A&Sk~Autm*s~45(H7+0bi^MraaRVzr05hQ3iK?j` zR#U@^i0WhkIHTg29u~|ypU?sXCQEQgXfObPW;+0YAF;|5XyaMAEM0sQ@4-xCZe=0e z7r$ofiAxn@O5#RodD8rh5D@nKQ;?lcf@tg4o+Wp44aMl~c47azN_(im0N)7OqdPBC zGw;353_o$DqGRDhuhU$Eaj!@m000000NkvXXu0mjfjZ7Z_ literal 0 HcmV?d00001 diff --git a/docs/source/_build/html/_static/default.css b/docs/source/_build/html/_static/default.css new file mode 100644 index 0000000..81b9363 --- /dev/null +++ b/docs/source/_build/html/_static/default.css @@ -0,0 +1 @@ +@import url("classic.css"); diff --git a/docs/source/_build/html/_static/doctools.js b/docs/source/_build/html/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/docs/source/_build/html/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/source/_build/html/_static/documentation_options.js b/docs/source/_build/html/_static/documentation_options.js new file mode 100644 index 0000000..a477e6a --- /dev/null +++ b/docs/source/_build/html/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.2.25', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/source/_build/html/_static/down-pressed.png b/docs/source/_build/html/_static/down-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..5756c8cad8854722893dc70b9eb4bb0400343a39 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFdm2Ln;`PZ^+1>KjR?B@S0W7 z%OS_REiHONoJ6{+Ks@6k3590|7k9F+ddB6!zw3#&!aw#S`x}3V3&=A(a#84O-&F7T z^k3tZB;&iR9siw0|F|E|DAL<8r-F4!1H-;1{e*~yAKZN5f0|Ei6yUmR#Is)EM(Po_ zi`qJR6|P<~+)N+kSDgL7AjdIC_!O7Q?eGb+L+qOjm{~LLinM4NHn7U%HcK%uoMYO5 VJ~8zD2B3o(JYD@<);T3K0RV0%P>BEl literal 0 HcmV?d00001 diff --git a/docs/source/_build/html/_static/down.png b/docs/source/_build/html/_static/down.png new file mode 100644 index 0000000000000000000000000000000000000000..1b3bdad2ceffae91cee61b32f3295f9bbe646e48 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6CVIL!hEy=F?b*7pIY7kW{q%Rg zx!yQ<9v8bmJwa`TQk7YSw}WVQ()mRdQ;TC;* literal 0 HcmV?d00001 diff --git a/docs/source/_build/html/_static/file.png b/docs/source/_build/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/docs/source/_build/html/_static/graphviz.css b/docs/source/_build/html/_static/graphviz.css new file mode 100644 index 0000000..8d81c02 --- /dev/null +++ b/docs/source/_build/html/_static/graphviz.css @@ -0,0 +1,19 @@ +/* + * graphviz.css + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- graphviz extension. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/docs/source/_build/html/_static/jquery-1.11.1.js b/docs/source/_build/html/_static/jquery-1.11.1.js new file mode 100644 index 0000000..d4b67f7 --- /dev/null +++ b/docs/source/_build/html/_static/jquery-1.11.1.js @@ -0,0 +1,10308 @@ +/*! + * jQuery JavaScript Library v1.11.1 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-05-01T17:42Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper window is present, + // execute the factory and get jQuery + // For environments that do not inherently posses a window with a document + // (such as Node.js), expose a jQuery-making factory as module.exports + // This accentuates the need for the creation of a real window + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Can't do this because several apps including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// Support: Firefox 18+ +// + +var deletedIds = []; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.11.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( support.ownLast ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call(obj) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + var length = obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v1.10.19 + * http://sizzlejs.com/ + * + * Copyright 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-04-18 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + -(new Date()), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf if we can't use a native one + indexOf = arr.indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { + return []; + } + + if ( documentIsHTML && !seed ) { + + // Shortcuts + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType === 9 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== strundefined && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, + doc = node ? node.ownerDocument || node : preferredDoc, + parent = doc.defaultView; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + + // Support tests + documentIsHTML = !isXML( doc ); + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", function() { + setDocument(); + }, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", function() { + setDocument(); + }); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Check if getElementsByClassName can be trusted + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) { + div.innerHTML = "
    "; + + // Support: Safari<4 + // Catch class over-caching + div.firstChild.className = "i"; + // Support: Opera<10 + // Catch gEBCN failure to find non-leading classes + return div.getElementsByClassName("i").length === 2; + }); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowclip^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + outerCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context !== document && context; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is no seed and only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome<14 +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; + }); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +}); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof rootjQuery.ready !== "undefined" ? + rootjQuery.ready( selector ) : + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.extend({ + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +jQuery.fn.extend({ + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.unique( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.unique( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +}); +var rnotwhite = (/\S+/g); + + + +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // First callback to fire (used internally by add and fireWith) + firingStart, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !(--remaining) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend({ + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +}); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + + +var strundefined = typeof undefined; + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownLast = i !== "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery(function() { + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== strundefined ) { + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +}); + + + + +(function() { + var div = document.createElement( "div" ); + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +/** + * Determines whether an object can have data + */ +jQuery.acceptData = function( elem ) { + var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute("classid") === noData; +}; + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } else { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } +} + +jQuery.extend({ + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var i, name, data, + elem = this[0], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + return arguments.length > 1 ? + + // Sets one value + this.each(function() { + jQuery.data( this, key, value ); + }) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + + +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; +}; +var rcheckableType = (/^(?:checkbox|radio)$/i); + + + +(function() { + // Minified: var a,b,c + var input = document.createElement( "input" ), + div = document.createElement( "div" ), + fragment = document.createDocumentFragment(); + + // Setup + div.innerHTML = "
    a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + div.innerHTML = ""; + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + support.noCloneEvent = true; + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } +})(); + + +(function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) + for ( i in { submit: true, change: true, focusin: true }) { + eventName = "on" + i; + + if ( !(support[ i + "Bubbles" ] = eventName in window) ) { + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, ret, handleObj, matched, j, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Chrome 23+, Safari? + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === strundefined ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + if ( !e ) { + return; + } + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var type, origFn; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
    ", "
    " ], + area: [ 1, "", "" ], + param: [ 1, "", "" ], + thead: [ 1, "", "
    " ], + tr: [ 2, "", "
    " ], + col: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
    ", "
    " ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; (elem = elems[i]) != null; i++ ) { + jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + } +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!support.noCloneEvent || !support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; (node = srcElements[i]) != null; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + fixCloneNodeIssues( node, destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; (node = srcElements[i]) != null; i++ ) { + cloneCopyEvent( node, destElements[i] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[1] === "
    " && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + deletedIds.push( id ); + } + } + } + } + } +}); + +jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[i], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return this; + } +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone(true); + jQuery( insert[i] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + + +var iframe, + elemdisplay = {}; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optmization) until something better comes along, + // since it was removed from specification and supported only in FF + style.display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "