From 37fccd7d8c3345641d2a5a044e869d7a61cd7191 Mon Sep 17 00:00:00 2001 From: gwen Date: Fri, 24 Aug 2018 14:09:11 +0200 Subject: [PATCH] algo et data science --- algo/algofundoc/MachineLearning.txt | 56 + algo/algofundoc/Makefile | 20 + algo/algofundoc/Readme.txt | 18 + .../_build/doctrees/MachineLearning.doctree | Bin 0 -> 5954 bytes .../_build/doctrees/environment.pickle | Bin 0 -> 15023 bytes .../_build/doctrees/fil_conducteur.doctree | Bin 0 -> 7145 bytes algo/algofundoc/_build/doctrees/index.doctree | Bin 0 -> 7299 bytes algo/algofundoc/_build/doctrees/liens.doctree | Bin 0 -> 5893 bytes .../_build/doctrees/notebooks/Pandas.doctree | Bin 0 -> 13076 bytes .../algofundoc/_build/doctrees/pandas.doctree | Bin 0 -> 3650 bytes .../_build/doctrees/programmation.doctree | Bin 0 -> 10271 bytes algo/algofundoc/_build/html/.buildinfo | 4 + .../_build/html/MachineLearning.html | 125 + .../html/_images/participation_globale.png | Bin 0 -> 28286 bytes .../_build/html/_images/scores_1er_tour.png | Bin 0 -> 22928 bytes .../_build/html/_sources/MachineLearning.txt | 56 + .../_build/html/_sources/fil_conducteur.txt | 34 + .../algofundoc/_build/html/_sources/index.txt | 36 + .../algofundoc/_build/html/_sources/liens.txt | 16 + .../html/_sources/notebooks/Pandas.ipynb.txt | 229 + .../_build/html/_sources/pandas.txt | 14 + .../_build/html/_sources/programmation.txt | 61 + .../_build/html/_static/ajax-loader.gif | Bin 0 -> 673 bytes .../_build/html/_static/background_b01.png | Bin 0 -> 78 bytes algo/algofundoc/_build/html/_static/basic.css | 648 + .../_build/html/_static/bizstyle.css | 490 + .../_build/html/_static/bizstyle.js | 41 + .../_build/html/_static/comment-bright.png | Bin 0 -> 756 bytes .../_build/html/_static/comment-close.png | Bin 0 -> 829 bytes .../_build/html/_static/comment.png | Bin 0 -> 641 bytes .../_build/html/_static/css3-mediaqueries.js | 1 + .../_build/html/_static/doctools.js | 311 + .../_build/html/_static/down-pressed.png | Bin 0 -> 222 bytes algo/algofundoc/_build/html/_static/down.png | Bin 0 -> 202 bytes algo/algofundoc/_build/html/_static/file.png | Bin 0 -> 286 bytes algo/algofundoc/_build/html/_static/jquery.js | 10253 ++++++++++++++++ algo/algofundoc/_build/html/_static/minus.png | Bin 0 -> 90 bytes algo/algofundoc/_build/html/_static/plus.png | Bin 0 -> 90 bytes .../_build/html/_static/pygments.css | 39 + .../_build/html/_static/python-logo-large.png | Bin 0 -> 13093 bytes .../_build/html/_static/searchtools.js | 761 ++ .../_build/html/_static/underscore.js | 1548 +++ .../_build/html/_static/up-pressed.png | Bin 0 -> 214 bytes algo/algofundoc/_build/html/_static/up.png | Bin 0 -> 203 bytes .../_build/html/_static/websupport.js | 808 ++ .../_build/html/fil_conducteur.html | 113 + algo/algofundoc/_build/html/genindex.html | 72 + algo/algofundoc/_build/html/index.html | 100 + algo/algofundoc/_build/html/liens.html | 90 + .../_build/html/notebooks/Pandas.html | 409 + algo/algofundoc/_build/html/objects.inv | Bin 0 -> 746 bytes algo/algofundoc/_build/html/pandas.html | 95 + .../algofundoc/_build/html/programmation.html | 124 + algo/algofundoc/_build/html/search.html | 95 + algo/algofundoc/_build/html/searchindex.js | 1 + algo/algofundoc/_static/python-logo-large.png | Bin 0 -> 13093 bytes algo/algofundoc/conf.py | 200 + algo/algofundoc/ext/__init__.py | 1 + algo/algofundoc/ext/question.py | 209 + algo/algofundoc/fil_conducteur.txt | 34 + .../images/participation_globale.png | Bin 0 -> 28286 bytes algo/algofundoc/images/scores_1er_tour.png | Bin 0 -> 22928 bytes algo/algofundoc/index.txt | 36 + algo/algofundoc/liens.txt | 16 + algo/algofundoc/notebooks/Pandas.ipynb | 229 + algo/algofundoc/pandas.txt | 14 + algo/algofundoc/programmation.txt | 61 + algo/algofundoc/src/__init__.py | 1 + algo/algofundoc/src/assignment.py | 10 + algo/algofundoc/src/data/ball.gif | Bin 0 -> 5015 bytes algo/algofundoc/src/data/iris.data | 151 + algo/algofundoc/src/dicttype.py | 52 + algo/algofundoc/src/duration.py | 18 + algo/algofundoc/src/hellopygame.py | 25 + algo/algofundoc/src/json_reader.py | 35 + algo/algofundoc/src/jsonprint.py | 16 + algo/algofundoc/src/machinelearning.py | 42 + algo/algofundoc/src/namedtuple.py | 20 + algo/algofundoc/src/pygame.py | 65 + algo/algofundoc/src/reference.py | 22 + algo/algofundoc/src/script.py | 12 + algo/algofundoc/src/server.py | 19 + algo/algofundoc/src/simpledispatch.py | 34 + algo/algofundoc/src/testflag.py | 17 + algo/algofundoc/src/typetype.py | 5 + algo/algofundoc/src/valswap.py | 16 + 86 files changed, 18028 insertions(+) create mode 100644 algo/algofundoc/MachineLearning.txt create mode 100644 algo/algofundoc/Makefile create mode 100644 algo/algofundoc/Readme.txt create mode 100644 algo/algofundoc/_build/doctrees/MachineLearning.doctree create mode 100644 algo/algofundoc/_build/doctrees/environment.pickle create mode 100644 algo/algofundoc/_build/doctrees/fil_conducteur.doctree create mode 100644 algo/algofundoc/_build/doctrees/index.doctree create mode 100644 algo/algofundoc/_build/doctrees/liens.doctree create mode 100644 algo/algofundoc/_build/doctrees/notebooks/Pandas.doctree create mode 100644 algo/algofundoc/_build/doctrees/pandas.doctree create mode 100644 algo/algofundoc/_build/doctrees/programmation.doctree create mode 100644 algo/algofundoc/_build/html/.buildinfo create mode 100644 algo/algofundoc/_build/html/MachineLearning.html create mode 100644 algo/algofundoc/_build/html/_images/participation_globale.png create mode 100644 algo/algofundoc/_build/html/_images/scores_1er_tour.png create mode 100644 algo/algofundoc/_build/html/_sources/MachineLearning.txt create mode 100644 algo/algofundoc/_build/html/_sources/fil_conducteur.txt create mode 100644 algo/algofundoc/_build/html/_sources/index.txt create mode 100644 algo/algofundoc/_build/html/_sources/liens.txt create mode 100644 algo/algofundoc/_build/html/_sources/notebooks/Pandas.ipynb.txt create mode 100644 algo/algofundoc/_build/html/_sources/pandas.txt create mode 100644 algo/algofundoc/_build/html/_sources/programmation.txt create mode 100644 algo/algofundoc/_build/html/_static/ajax-loader.gif create mode 100644 algo/algofundoc/_build/html/_static/background_b01.png create mode 100644 algo/algofundoc/_build/html/_static/basic.css create mode 100644 algo/algofundoc/_build/html/_static/bizstyle.css create mode 100644 algo/algofundoc/_build/html/_static/bizstyle.js create mode 100644 algo/algofundoc/_build/html/_static/comment-bright.png create mode 100644 algo/algofundoc/_build/html/_static/comment-close.png create mode 100644 algo/algofundoc/_build/html/_static/comment.png create mode 100644 algo/algofundoc/_build/html/_static/css3-mediaqueries.js create mode 100644 algo/algofundoc/_build/html/_static/doctools.js create mode 100644 algo/algofundoc/_build/html/_static/down-pressed.png create mode 100644 algo/algofundoc/_build/html/_static/down.png create mode 100644 algo/algofundoc/_build/html/_static/file.png create mode 100644 algo/algofundoc/_build/html/_static/jquery.js create mode 100644 algo/algofundoc/_build/html/_static/minus.png create mode 100644 algo/algofundoc/_build/html/_static/plus.png create mode 100644 algo/algofundoc/_build/html/_static/pygments.css create mode 100644 algo/algofundoc/_build/html/_static/python-logo-large.png create mode 100644 algo/algofundoc/_build/html/_static/searchtools.js create mode 100644 algo/algofundoc/_build/html/_static/underscore.js create mode 100644 algo/algofundoc/_build/html/_static/up-pressed.png create mode 100644 algo/algofundoc/_build/html/_static/up.png create mode 100644 algo/algofundoc/_build/html/_static/websupport.js create mode 100644 algo/algofundoc/_build/html/fil_conducteur.html create mode 100644 algo/algofundoc/_build/html/genindex.html create mode 100644 algo/algofundoc/_build/html/index.html create mode 100644 algo/algofundoc/_build/html/liens.html create mode 100644 algo/algofundoc/_build/html/notebooks/Pandas.html create mode 100644 algo/algofundoc/_build/html/objects.inv create mode 100644 algo/algofundoc/_build/html/pandas.html create mode 100644 algo/algofundoc/_build/html/programmation.html create mode 100644 algo/algofundoc/_build/html/search.html create mode 100644 algo/algofundoc/_build/html/searchindex.js create mode 100644 algo/algofundoc/_static/python-logo-large.png create mode 100644 algo/algofundoc/conf.py create mode 100644 algo/algofundoc/ext/__init__.py create mode 100644 algo/algofundoc/ext/question.py create mode 100644 algo/algofundoc/fil_conducteur.txt create mode 100644 algo/algofundoc/images/participation_globale.png create mode 100644 algo/algofundoc/images/scores_1er_tour.png create mode 100644 algo/algofundoc/index.txt create mode 100644 algo/algofundoc/liens.txt create mode 100644 algo/algofundoc/notebooks/Pandas.ipynb create mode 100644 algo/algofundoc/pandas.txt create mode 100644 algo/algofundoc/programmation.txt create mode 100644 algo/algofundoc/src/__init__.py create mode 100644 algo/algofundoc/src/assignment.py create mode 100644 algo/algofundoc/src/data/ball.gif create mode 100644 algo/algofundoc/src/data/iris.data create mode 100644 algo/algofundoc/src/dicttype.py create mode 100644 algo/algofundoc/src/duration.py create mode 100644 algo/algofundoc/src/hellopygame.py create mode 100644 algo/algofundoc/src/json_reader.py create mode 100644 algo/algofundoc/src/jsonprint.py create mode 100644 algo/algofundoc/src/machinelearning.py create mode 100644 algo/algofundoc/src/namedtuple.py create mode 100644 algo/algofundoc/src/pygame.py create mode 100644 algo/algofundoc/src/reference.py create mode 100644 algo/algofundoc/src/script.py create mode 100755 algo/algofundoc/src/server.py create mode 100644 algo/algofundoc/src/simpledispatch.py create mode 100644 algo/algofundoc/src/testflag.py create mode 100644 algo/algofundoc/src/typetype.py create mode 100644 algo/algofundoc/src/valswap.py diff --git a/algo/algofundoc/MachineLearning.txt b/algo/algofundoc/MachineLearning.txt new file mode 100644 index 0000000..d6b6e30 --- /dev/null +++ b/algo/algofundoc/MachineLearning.txt @@ -0,0 +1,56 @@ +Machine learning +================= + +Data science (not big data yet) + + +some links +------------ + +numpy, scipy, matplotlib... and scikit + +https://www.scipy.org/install.html +https://matplotlib.org/ +http://scikit-learn.org/stable/ + + + + +installation +-------------- + +.. code-block:: python + + Python 3.6.5 (default, Apr 1 2018, 05:46:30) + [GCC 7.3.0] on linux + Type "help", "copyright", "credits" or "license" for more information. + >>> import sys + >>> print('Python: {}'.format(sys.version)) + Python: 3.6.5 (default, Apr 1 2018, 05:46:30) + [GCC 7.3.0] + >>> import scipy + >>> print('scipy: {}'.format(scipy.__version__)) + scipy: 0.19.1 + >>> import numpy + >>> print('numpy: {}'.format(numpy.__version__)) + numpy: 1.13.3 + >>> import matplotlib + >>> print('matplotlib: {}'.format(matplotlib.__version__)) + matplotlib: 2.1.1 + >>> # pandas + ... + >>> import pandas + >>> print('pandas: {}'.format(pandas.__version__)) + pandas: 0.22.0 + >>> # scikit-learn + ... import sklearn + + >>> print('sklearn: {}'.format(sklearn.__version__)) + sklearn + + + +usage +------- + +https://machinelearningmastery.com/machine-learning-in-python-step-by-step/ diff --git a/algo/algofundoc/Makefile b/algo/algofundoc/Makefile new file mode 100644 index 0000000..1fdc1ca --- /dev/null +++ b/algo/algofundoc/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXPROJ = pyfun +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/algo/algofundoc/Readme.txt b/algo/algofundoc/Readme.txt new file mode 100644 index 0000000..e6eccff --- /dev/null +++ b/algo/algofundoc/Readme.txt @@ -0,0 +1,18 @@ +Algo Fun Doc +============== + + +- install sphinx + +- install the nbsphinx extension + + +nbsphinx is a Sphinx extension that provides a source parser for *.ipynb files. Custom Sphinx directives are used to show Jupyter Notebook code cells (and of course their results) in both HTML and LaTeX output. +Un-evaluated notebooks – i.e. notebooks without stored output cells – will be automatically executed during the Sphinx build process. + +Quick Start:: + + Install nbsphinx + Edit your conf.py and add 'nbsphinx' to extensions. + Edit your index.rst and add the names of your *.ipynb files to the toctree. + Run Sphinx! diff --git a/algo/algofundoc/_build/doctrees/MachineLearning.doctree b/algo/algofundoc/_build/doctrees/MachineLearning.doctree new file mode 100644 index 0000000000000000000000000000000000000000..afedf51d7c013d726ea495364891086e696b3756 GIT binary patch literal 5954 zcmeHL-D@1z6_;hNq+LsE*@+T}Z9G*-ExF#=UCCcjz_g^a4^EdnxTU1H)4MZw_l`9? zGo863X(^%UL#Yk-t<%>+ptST4DE%V}fk2@2wNOI;isX0hd~a)6fj;yh0!eevJ@=e* z&pqECUHIMo*O&B<>NBdtMuN-^?TX%N8%bOSzL!^#SJ{&H}Lx=e&53H zO=wN*if@Ul;ufU5P-qR(b~0ym5!}y@zKR!M-wa8`=P5Z7NOXhi|kTb7SpwzBHI2w+V*?oH2@$_LF z9ecd5Z%E$ShT(H~7aYBCe$i6f1=$yKE_8Gj)Ji`qxaiMLGbObGfs)8g#h9$>r@;RJ zO4(B9I%!FU7PL`Uw6Mxoe!Y->K`DjEFWfH~Aey})|t=- zm*O>L{mt2AeO{B5pUIuqaRcp7$+$X@d2cWCURFedhEKD4Y-oc>9!X25JS8@)=N8U% zj>&zo39N4aXVCsr-4IR>QxqTmP>T<*!nl^yhUZEiG0z%%fqhu>gdhKHd1>kWxfFqK z?3?$@yT*>gCoJ*gZR0y(WEewZZ!mmt+ZfzExO4Adf3Vy6$@kxV*SK%)n}a6?PC-e@ zN$2rAM8>w~+T4%%wlTqK7DU{jToJ*Lk#5b- z!-o$IcNPYbG~#)zmto}ka_43yhJri6su{VtnDT2ivB#S!F97=DKKSl;=@XA07dc8!5W-$*aE8@nuoxz&3f>p{)E~-8;T_(ZmRWbvo6fF7GwTj%(}`4l)3+UYBp@2 z%)Em*WYpWNg%OW=bVQ#X^QQ@$;&Ua`5g*+HqBr-0IDM|V0s-5jplz{eN=*jk(!b-REc_J9=j#&i8Yt3RufO?;l;;D5@a(gPXA zzfU!avh4i4D3Shk8a^Qv#rp#g*IH}5ef}2JqnChFUKr|QZi2qgMkUfXBehPAdL%86A8{{zw5&RUdF8UDF7p!?x{^#Lae>rQEr*YjDcE(7v#AF# zBF<)jv}J_oLzhaQsjlmXiL}sy1rE(dR6CKA-h*E3;`>^2)8bJSM3z7u;_(Q2CQ)sf zs!Ks4n^anwN~*3e>@1LYIykqqq`Dd1N`}@CAAhg+0Q{R93y0Mv-64je1XSedh`LdP zQE1#jEM3OXNWBtqJBS<$LlD>p*kIxTJ*?P)KfyJj5!bO0iYM+#DppjNB{HxokXm+O zR2vSOcdIl!C{_bd{_@CY9ud5xA<(WL)ALuLFy@I9Scv?<+TVYm#N1AY%sBWZTLp z0xEUcS(Ma0y2Fq9z>NE;+M*Lgkxp2W&!A{XTZ21LOE;R>3v38dvAI^TkwJi= zpUdS$v!VF`ShO(_fD1TMq>t9rbr{slDt)UI-^vo^bM=~*1|1rYs3(Ell8zi0@)Gq1vf zQTVZN_%I16CnNOeX=Co~&tW5hO&wF^{#Pg<#L2jcx5;N??!Y7GU?n)0ptfau0Xww# zjJcl09E>~l;P9C`&;27Zh$)v614{}es2*hcEE%h{EH=OyVOOs2xUh6-Nt6g2u?9oO z%is+=k(jtbTWB7sbWm3s&}Pbsu4%xg%Pv=kWO%qT9)30sywZv^>Z=RD61&}?*evY|*yL#zG(lL($dSscALPkX65Z zi#d)_VlG4{(rn3NmTTCS8{B{-`>cXO5QyV-B`kTvfHDp1CgyiI((BnJyA{qT*Xc&z zzGbk*qFrKv=zG>@t_NxX6Md#`E%^EZy1ST#u?7+FbpT?7%JWsb2yk``8F@psp!MPAU2oYWSr!%pag0=xH!MYn8ZJb0 zf<%~ixxJWIG9aA>FN(D6_c*JPiVDVaA*v$^-qSs!*brtf2vG+~QjNow3c4fBsq5@n z2-Fqfo05`T%Aj(*Nxdnw7sXNP=FF_+3lNZ{OCD;=YJCOb5UFx05An%a%H`f)(`zK% z=fG~SenGY%mYQuq4zjm}_Du~s zt=2rPXq&d?FiP6HJ2N|FghLwzRXP1UaYe^Gc$E@bZTd~cDz%g<1-_paqtDxZ%QdQF*_TJ zm7v;j=5iOurYGZYR^inwPj4_gaxpi3VHd!5%#*qEBag;vtGKK;L<^)Br(@McQ0+KJ z$0lYc+HF@F%py0uh6tv|rbnh?d6i)8SSLp&FHXhE6)Q>iO%E@SCuEuOLR}oQ@?V@d z+TSTO-pR>-D`_mL8M#EYQ4LP8;qhTw zl30Frm1)vloNMBNU-ZqAR$zD)0i=j`3(MLm74P7iZOfp@b?O{&C^7~X@GadyqF^%3 zg|}r*Qe(sE>s9?G(>;@sn@?YV%pjj8nJ?W|%&*)&oxW}{1dK+W(-^s4U<-zIyPf>X z%I)jSD#i4lPOsdCP!&-d-rPy21793g4iu5hR~{5$o}Y!cBo{jj---w>pS76~1m2zE zR<{adsj6=Ix*2$I`2BcBAXq?XQdoNAn*o3NM!=uZ=k^oOQQ)MkiGpX8B>yabnm@xo zE3_vqrXln&4M|ARF=|9lv&-a*DZUOPi@9vLMJ#yTVz%!}+K0lhT|=mWK_L+EGyJ$X zRQKdpWPk7yqR#_$&z)D^J-=v_kO_zbk7BldL7WIw3y_m}moS?HFw=k^5Fhm%qna<(E{rN@Rv0#+NV4i2^#zeYoW5JLaxxp79`X19j zNJCagWGQ&N*((U3I=Tj-=mkfwRzur8d|5AI2f?0TKq)122-A|v_KP0#u}!FFb*Y-d zaYyv&rm3hw(fs*OO}_m%|GWROKYfsIsK?3Qex7ft$ElSJUsaFOXMc^asmIHG-{)KE z@k#y&UssP;zA^5L0qiNTY#}CWAOdj^8HNdEK)}=r{a(p{tX`rN44Vp=9EJ|S_|UZx zJQeT_62eJ?f{UAVi^%`n{0Nd%5BcnHjnuD&gRorqMgs{ZX>h@`3%bc9$Q@Vog=t|4 zLKTA!bf=f{y1A$?lbA(cm3ewe_w<1O68~k<9Wq56Kqy#s8~AMEvx?6eK3n*#ufWr! zq+Q8n!k?Gs=X(aM)`G?{l^!{a$%LD>en($aYdR47Ko<%#v2-lB7XB5{eGLXg!Z;GD zQbPi*bh#18T_1lnW=uexz~Ke_Ykol&X{6XlrF}9nTD=F161gtXTQqgKM)BN3Ij8LH zEBUo%gHkfsHjVhA*V7kdZpvTr3w(orRZW7w%J1^u0>iI~pPn^LWO`Of8JKoSgKjj^ z4Y@h(jaTaWhMRli6&Fdf-`c{OWW*;!Wl?3x@4Ca9+X!UAj5|DOtwypi3@J91EFN=A;a@^|P%&1TVG{-d)Ftnb-`(+WhShSb{cbS=>?b9@#bzOmSo!E z;1H3@C{hs-{Co%G5fMC-05k^}uzXd5?nN>K2)`Z@0+moSWz*UZQeWu6RU+vO4z-Yr z$Y-Sk`iOjju9_hyW|y?Kn5kCAAS&du z>c(Vy7~CmqY-ZM*q8GU<-GtC7zzl4koM6MF%42HUcS?+v zEO@Vs(ARnT8p9W^3#$4OHc{Be&+SM4uFF#cpz5aW4K|%AZj_Ky<7qHN*y!l9aCVM; zPAQn%C(XH>5QjH zlNiE0>ZuMyBJ1MG1fZc$Q4-r-xS>y3jaz7Y$je$cMNO~rkC5nEhZ)36baiL1^7#%3 zBhvd^0?<%;%Lzb3>8&M`UUG+A-}f~I_g@g)s~tFs7u?#;g8OO*gb~60h6GJE&t!4u z4AOU;-r)RDw+xqQx)w>s+6FNBKavb!3zWj$6Lx|T$1euYo}~kyG7iufF7Uzwjs8Yo z6S3R_zMWv&Zvm$A7{2B!Q}o^B;5Cue%D8mX2t9lW{%dr`gp(@WS=JV@C)PZ_M&}|J zyUB1W)llOHf3-n(=VhEk?P7MQDe8=#X^196Q;|(KqvL<3Ih71eC8MT7V{$4Hr}YO3 z#29Y=-b?@*F1t4pfQG?C+2qcGAznkQFDJx`bapG5k$-^2+jb{rR0HUHO3)`FiUjZ@-a>UE;q97NSf1hp_ii>wD$CuJ7n+cVwCOL+`(uKtJI! zSNch`%s;18xtG=2b?r(d6QLHk{lgC2CbH54Ltc$;W$N3R?{q*KG0|_Ud2K%yz6U0{ zE#O2#%@4~CD__Til+XVN#QRPHNrc9rByqot;pj}gxBIzUl6g}#08vwDX4suVV+e1Tz7J?DIezF7ph+aRD05r_%m56pf7j=F zd=w4i4OGXdgF?EbR9z^kj&vOf4^8WZwdyi+6NjL&N0xl+Mxb(ZzK$mu%6)M}o^zsT z1BElPc${uT<@+e_;G1{k!DskL$DiRN9fF3Bl=jo()*XqH9@p>qVvr6(fmc?-%TkV` z^>fdbUKGotPziN2DDePkvA-z)^x6d~zM?sy`evUm4isxOIdafJsZZWrt`=+*G1Y7H z6&81xphW7b8g1O;zCJI~s>Gpepe%d7S(beT_p?`4c;Rr6E@gQ^TiUAWDQ zUN|~=V>(ag5lFwkS!b-PA_ZUh6<9hH)f?7`HyH1#Efe42c;!_I7S74RWpi^Z>~y`7 znkZEf+45kSDAWn`7Y(X-rcxb{8?3je@JaThPyonG$&=_q;io*+4JzLPU4FMwkZ;;W z6yczNJ%7zX*`>Nz#I^s@GLB*@zXxEH*DZ&YQ|J;sIBrF~+9v8kDsN)A@*R9_pk3Ia zDjll$l4a=!Ys;BNi{Gt$n_%e$F>qN{&ui_7{v?7Z<)W;n$b-tCp|j=fgIDEF4Kj3 zsMfCz2XyQ&Y%pol$ME|ihwLVQD9+QaL6E?2^oj>k+1A%99TR4)};6ZJFc#)D)f{xuZV z0e4E_zOfVTdvhYm*Tm!Z22&J|hC^Kh7eDS+zQ2+{~5L$ml-OpFPhd*fjt!zoKchtb& zse!*&t$$Fhe^RY~R;_=b)<)%DRf~QAM9vA={+%8-EB~Pe{#&->!1vX_|EPiYsI^*o zU$wfRL0a;7zndP{Dn0mvR-bIifwUSps0I#EYpZftwT{V_1Uo^G>y-!8z=vf^4xCg2 zA5jAjtJcR<>y&B@sn(CG){n`SFY_1_8Ow~ICFw=Q=LSB=QTZx9Yxp25rF;}gZ&>bL zTHn2!;QmTL$t1A4NAGt=<;LhT1o|3VrE#ui4Ri%tG?lb&LlzeX75kInX#qnmq zsd}5Bj>i=(Zw5YwE5Cr5RDKp;cM3@TOoTRYRJn!@5c*(*L{3Ik-c)@~qlfeO(MHWE-pnJBrytCrz!|wdej7)%-t-^~e~;$tKT)jz V;E-N^u>NC330!Z;df>wF{{bDRZeRca literal 0 HcmV?d00001 diff --git a/algo/algofundoc/_build/doctrees/fil_conducteur.doctree b/algo/algofundoc/_build/doctrees/fil_conducteur.doctree new file mode 100644 index 0000000000000000000000000000000000000000..206f4e42f24861aca07397230ce986bc2461d2c4 GIT binary patch literal 7145 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 literal 0 HcmV?d00001 diff --git a/algo/algofundoc/_build/doctrees/index.doctree b/algo/algofundoc/_build/doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..871aca43880b0fc4b6d12c168a04ec26e5cac46a GIT binary patch literal 7299 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 QL5Ct{9$csinDpBJ1^VZmr~m)} literal 0 HcmV?d00001 diff --git a/algo/algofundoc/_build/doctrees/liens.doctree b/algo/algofundoc/_build/doctrees/liens.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8bbeb114faf0d3d70c4e39a5eb80f27a1b330cf1 GIT binary patch literal 5893 zcmb_gTWci86_!?-(Tpy$+TF+x-d(H^OymtcBWZ7n?Tx|U5TaPdu(2VqbZWY5rh3#j zcUSL7hK1z8L<{wn&RgE{6oSD&A-^F6gMUK)Lh|5zr}{dboskwIm{QlNQ*};#=bWlj z=Xa}r`u7`4`cL)jz)Ga!#(h7qd7P>a5j^h8^pEK~zfWJJd#W3;X&fYx#Z$Ee4of($ z9dSQ>mWm~{7IRBFfnV~AmS~H$XXzdWThfs(uMMfqUpd^5cS$D15g*uApYk&j*ckmP z)e2z2o2nf$h?J?=7RzEqwR43|)T-`0(K2{r&sm|8Rt zJ2HqI9uJs14n~O&6AWB}sV@PGxO03h83Lt^VdA=6nywR9)~Tc2r4iGS+^ZwL6)~*n znY%WVtc1J^JlQy6p{VhS2ZiCfz=8vC*u3xq(Nb&qQkmU$R6FaZm7&_e>j`Wj?!o}# zEm-%5`27gKxAFTi46v$!EvMpxkCMnq)z5^KVf^l35OL;)=TZcI-wM1z_Gx6I1|OJa z{3JM>9!xGnC%3ael~T(mc0-UpMBISfsLUy6e)jtIXHreLv|;rF&N<8Uz``zLUWi>MbOY)5 z!y8sJ>dH?WK-) z!(%wLeQxf$oJBrhY`WmzvdFJ|uv1Jaf_*I~G+_K@kzyr`#azI6I0r_V&?(5=c#tz2 zg|34#w!h9`Lr8b4om5d>BLcFouNv5EVE*f(ZCr})n;ttQ-`r)px$>2I+C8gS|7R0u z;Hu{qIJdKY1Lp4*=~uv9Oa;ov1TWNqSXIKGiPGnhhScy7@D3jS|P z_;0;xrdhKtva-Civ`E3iCfQtAq+eL1alci5Pg0Cr;R^KcOVB&TZYot&MFV2rUlrainE$g# z`&Yv||DIIsEICQlvZ15(C$&pcCr~U zA~aZ$kklx7Y9c-s|H8f}1}ux~eghcgsh_x~*2{z_%PJ;)aFrMK5p9CZS8d^nR-V-| zbCycSqF-t_xkYYQDY;o!a`GMq=}w+i?t=_reF0oSzvihh$fBS`vb+Z>HEX0&Q}Oqj znp;;;^Al1tzpCe|`8s#)EVSiKUQ@eB3|Nt!!Ug_ZQ@fV^i+gj>{UxcLC8w8ZeQ63i zt8tNCR|;2@3g(lVzSpk+^QRhSorliV_cb%ZhT3_?SyQ{DRBE5q)ZTuj+SOsBHuY=B z$RCZ>!Wq4IOqN!}(t=L7l`0RXC)E5*wR}#Bdo*`h^{gbK=cZXcGdBxL_S{sRm`h4W z@npVHzM)4^;7jh?scL`5+yw8;^6}I=QQa~3dBl+Ar0C$Z;IU+0h|WeP1}{7R6y5c_ zn?x>pTQaardY;lK#I@)-d7i49qacueAbD-@cv)@Hd)!Yv^K2AE9$rAI7vohNns`gm zyFSK}w=)WNxu%#?M+&oeBtv38A%8WWs7-pMMtFJh=iE(?uc>vx+_KwJH}G}dX66^(!@0#*p!*7ZX!p+9sy@k)sm^Y9wc&hm6l#5Rd*XBjU^_3!J(;o*}9butzSR=xp4&fvjdIE zYMb^D11JHAToc{NSkip%=yC+DW!g^6@Fv7YaxK@2fWVEoiOs|a0j8@z@S2>>9O=>y zp8CCzhh}+ik}jJ>88V0_-&W;)Kb=nd+0ot)qA}_u&j;X)2dUbj8MGqJFj3k7$`Yt{ zKsVmre*jo|(a36uAxb6YPLWo~AV8(d;c}$K2H(Uok75U{04k2~rv9Lh7x*ecaG z9BmBzoZ3mt%%`DH;6}KCZ4L?DeOK90tV|#(qYlfQD;XuY}qoT7{ z7Ku+t-1s2 zjc!>E&Sx?KAkHXs$P|2;sp^!B4`B>9_J)C5#)M}5L4#OwcV|}Y7E<-3n=|X`F@{uLg!4X)p^-!|J$$|21jMFt+usrEz$QvbDyXCq~hi`sPQBIHy`~L+@5_Ew8 literal 0 HcmV?d00001 diff --git a/algo/algofundoc/_build/doctrees/notebooks/Pandas.doctree b/algo/algofundoc/_build/doctrees/notebooks/Pandas.doctree new file mode 100644 index 0000000000000000000000000000000000000000..56aefb8e1c0864814b221f1a62aaaf3313b144cd GIT binary patch literal 13076 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 literal 0 HcmV?d00001 diff --git a/algo/algofundoc/_build/doctrees/pandas.doctree b/algo/algofundoc/_build/doctrees/pandas.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a91adff54c5796d1d3da2217c4c32900ad02d6a8 GIT binary patch literal 3650 zcmai1UvC@75tnW8pDfa{9QVPt5EeyRM+r$Owqr*hAP6de=tCN`55ZyYZjZaw@%DVT zD^d>yTA&RqVBdNT@{muE4-p`rCLg2y&E6lL2*(jXfj2uhGy9vF-wgk;``?$N9rtHP zp$d$aaXw8{$n(PXNwDOJF8)(|_|M|+#Zx=T*eX{h3wU97pb-cehZ#?buM4qbdpQrZ zR7s;RI-)CjUl&ht*wIqQyme%|DN90@7o-7&-7oo?Ts8847tSe+9Fh!fbRiDJEpf+o zt03lfH6t> z;`GI{lV>Mv7N{u7_zZDpJXLxYy8kirU!G275~c906bPKGODEe13<|2l)H}*ohCtDU>D%7$)j) zHYQp!QY)dIizi4R-4H3@$TP~TE;-S${rWa_XuV3XF^e*LB))i8WOmnO)Hd(hE}WT6 z7WRSAIz5}sDyvhKEoSZ}pHqmopYdG9mpm-aZ@FvjwNP!av2E%0)%ZIB`$#+%$H?+7 zUUS9fu;^-*E%>JQ0K|AY9eY)jXXCd;?OLf$&gQPH&Qn`drA+)q{FTxcAp%0NDtB>g z_nK@}SO2(V0YvhiM12XBjM2g4vR2Q|>hwH#%i$(f_N~WoY}&=}?h>mJ>(}u*#D=j% z&9m6^V-;MqE9j^Ktx4SYPmX$~h&1u*xPL{fNwq7sZ{AsKgY_~#%Tq=?*-ueGJiFws zrv3$(_v)}I@h$jpVsng!eQz4V}l!al%%RQ|EFiN{eO5Idf!(Kun%0m+s4)2tFAj)f%;OO z6>OVvzHQ?Pd`HILbX;@uO%v3EhqY;I03&zG5_H`N&i&;gYz7eWhYQ@YqrhY|puA=< z?bniWK-qrIwU)^OgY|whX(Ldv=19Bke#K$~v>VBfWY3q0;sk0y)pGz4HC4KzB1yAEais<4NVQkoLpIy}E+hcva3A8#G0YzdOHBa8@{ zdZNf$W2f2Pz9aG#rWpZm3`9wi~Dvxe$$mmpuJ1!wimMHg)(P;Oc$x5?A6_XVX}|QX2W~pqbAK`;gusi}Z%4Io2X{4RJ6}Cm)!vs8yAgC zFahZ1C|bfOL>1q~F5Nt$>kjg(M6lo4W+#Ur23t~WfpX)m$jJU_c%NHgEEz^eYxVLI`5H%#UiEeuTkk}wM{!P6D4*Cw! zj#qFcIM$MD`!I+VyYTpu$=Jhm!jz*W`;EQBlS?WHY%dxsJ@E)8p)TGSpOz^i26Q6o zN+zL1rE9NTb=-n}AHGp18oxw<7G@Cb^7inCv|QUEhP9}9Xf`_xtS?yZ_B;9o0KFb5 zmEWI=pTv*iwMdK|kW^o#2%6T}pXTEA8zbJQ?>}My?*iOG-Wb_CSJ{zKWY_ajNfa2^;Of4U2=?t9$A2hJDazrir&7ZriF(c5ENy(5Q{@ jI|4n0-$6Ner!?4bzzy-;M(h%{7ZNR19ZaLr_|yLb%U^~~ literal 0 HcmV?d00001 diff --git a/algo/algofundoc/_build/doctrees/programmation.doctree b/algo/algofundoc/_build/doctrees/programmation.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1c229b9594dd55d2454370c67a3c20817aa8fb86 GIT binary patch literal 10271 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 literal 0 HcmV?d00001 diff --git a/algo/algofundoc/_build/html/.buildinfo b/algo/algofundoc/_build/html/.buildinfo new file mode 100644 index 0000000..a46b8d2 --- /dev/null +++ b/algo/algofundoc/_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: ce4136e2523a6d07c59857a39ef0e4cf +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/algo/algofundoc/_build/html/MachineLearning.html b/algo/algofundoc/_build/html/MachineLearning.html new file mode 100644 index 0000000..7848392 --- /dev/null +++ b/algo/algofundoc/_build/html/MachineLearning.html @@ -0,0 +1,125 @@ + + + + + + + + Machine learning — algofun documentation + + + + + + + + + + + + + + + + + +
+
+
+ +
+

Machine learning

+

Data science (not big data yet)

+ +
+

installation

+
Python 3.6.5 (default, Apr  1 2018, 05:46:30)
+[GCC 7.3.0] on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import sys
+>>> print('Python: {}'.format(sys.version))
+Python: 3.6.5 (default, Apr  1 2018, 05:46:30)
+[GCC 7.3.0]
+>>> import scipy
+>>> print('scipy: {}'.format(scipy.__version__))
+scipy: 0.19.1
+>>> import numpy
+>>> print('numpy: {}'.format(numpy.__version__))
+numpy: 1.13.3
+>>> import matplotlib
+>>> print('matplotlib: {}'.format(matplotlib.__version__))
+matplotlib: 2.1.1
+>>> # pandas
+...
+>>> import pandas
+>>> print('pandas: {}'.format(pandas.__version__))
+pandas: 0.22.0
+>>> # scikit-learn
+... import sklearn
+
+>>> print('sklearn: {}'.format(sklearn.__version__))
+sklearn
+
+
+
+ +
+ + +
+
+
+
+ + + + \ No newline at end of file diff --git a/algo/algofundoc/_build/html/_images/participation_globale.png b/algo/algofundoc/_build/html/_images/participation_globale.png new file mode 100644 index 0000000000000000000000000000000000000000..a84385af8bb43fca769843ae2dccbe7ed6e6a640 GIT binary patch literal 28286 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 Ae*gdg literal 0 HcmV?d00001 diff --git a/algo/algofundoc/_build/html/_images/scores_1er_tour.png b/algo/algofundoc/_build/html/_images/scores_1er_tour.png new file mode 100644 index 0000000000000000000000000000000000000000..d2450b4bbfdc21eccfc341ed959349d79e47a1c3 GIT binary patch literal 22928 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 literal 0 HcmV?d00001 diff --git a/algo/algofundoc/_build/html/_sources/MachineLearning.txt b/algo/algofundoc/_build/html/_sources/MachineLearning.txt new file mode 100644 index 0000000..d6b6e30 --- /dev/null +++ b/algo/algofundoc/_build/html/_sources/MachineLearning.txt @@ -0,0 +1,56 @@ +Machine learning +================= + +Data science (not big data yet) + + +some links +------------ + +numpy, scipy, matplotlib... and scikit + +https://www.scipy.org/install.html +https://matplotlib.org/ +http://scikit-learn.org/stable/ + + + + +installation +-------------- + +.. code-block:: python + + Python 3.6.5 (default, Apr 1 2018, 05:46:30) + [GCC 7.3.0] on linux + Type "help", "copyright", "credits" or "license" for more information. + >>> import sys + >>> print('Python: {}'.format(sys.version)) + Python: 3.6.5 (default, Apr 1 2018, 05:46:30) + [GCC 7.3.0] + >>> import scipy + >>> print('scipy: {}'.format(scipy.__version__)) + scipy: 0.19.1 + >>> import numpy + >>> print('numpy: {}'.format(numpy.__version__)) + numpy: 1.13.3 + >>> import matplotlib + >>> print('matplotlib: {}'.format(matplotlib.__version__)) + matplotlib: 2.1.1 + >>> # pandas + ... + >>> import pandas + >>> print('pandas: {}'.format(pandas.__version__)) + pandas: 0.22.0 + >>> # scikit-learn + ... import sklearn + + >>> print('sklearn: {}'.format(sklearn.__version__)) + sklearn + + + +usage +------- + +https://machinelearningmastery.com/machine-learning-in-python-step-by-step/ diff --git a/algo/algofundoc/_build/html/_sources/fil_conducteur.txt b/algo/algofundoc/_build/html/_sources/fil_conducteur.txt new file mode 100644 index 0000000..9716092 --- /dev/null +++ b/algo/algofundoc/_build/html/_sources/fil_conducteur.txt @@ -0,0 +1,34 @@ +Fil conducteur : 1er tour des élections présidentielles 2017 +============================================================= + +Le fil conducteur sera l’exploitation de données issues du 1er tour des élections présidentielles qui ont eu lieu en France le 23 avril 2017. + +Les données dont on dispose sont les résultats par canton (plus de 2000 cantons). Pour chaque canton sont donnés + +- le nombre d’inscrits +- le nombre de votants +- le nombre de bulletins nuls +- le nombre de bulletins blancs +- le nombre de voix obtenus par chacun des candidats. + +L’objectif est d’établir + +- les résultats au niveau national +- la participation + +.. figure:: images/participation_globale.png + :width: 650 + :alt: Participation globale + +- le scores des candidats + +.. figure:: images/scores_1er_tour.png + :width: 650 + :alt: Score des candidats + + +Ce sera l'occasion de découvrir : + +* les structures itérables, en particulier les tuples et dictionnaires +* la lecture et l'écriture de données dans des fichiers +* des algorithmes de tris et de recherche. diff --git a/algo/algofundoc/_build/html/_sources/index.txt b/algo/algofundoc/_build/html/_sources/index.txt new file mode 100644 index 0000000..092c14e --- /dev/null +++ b/algo/algofundoc/_build/html/_sources/index.txt @@ -0,0 +1,36 @@ +.. default-role:: literal + +.. meta:: + + :description: algo tutorial + :keywords: algorithm, python, tutorial + +.. title:: algofundoc + +Algo Fun +========== + +.. toctree:: + :maxdepth: 1 + + programmation + liens + MachineLearning + pandas + +Indices and tables +================== + +* `All modules for which code is available <_modules/index.html>`_ +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +.. note:: The pyfun code is licensed under the `LGPL licence`_ + and this documentation is licensed under the `Creative Commons + Attribution-ShareAlike 3.0 Unported License`_\ . + + +.. _`Creative Commons Attribution-ShareAlike 3.0 Unported License`: http://creativecommons.org/licenses/by-sa/3.0/deed.en_US + +.. _`LGPL licence`: http://www.gnu.org/licenses/lgpl.html diff --git a/algo/algofundoc/_build/html/_sources/liens.txt b/algo/algofundoc/_build/html/_sources/liens.txt new file mode 100644 index 0000000..1000a92 --- /dev/null +++ b/algo/algofundoc/_build/html/_sources/liens.txt @@ -0,0 +1,16 @@ +Liens utiles +============= + +- random_ datas +- pandas_ +- ploting_ +- machine_ learning +- making_ a machine learning +- data_ science + +.. _making: https://machinelearningmastery.com/machine-learning-in-python-step-by-step/ +.. _data: https://realpython.com/tutorials/data-science/ +.. _machine: https://realpython.com/tutorials/machine-learning/ +.. _ploting: https://realpython.com/python-histograms/?__s=o2w1az6ypdj7ogdsnqwf +.. _random: https://realpython.com/python-random/?__s=o2w1az6ypdj7ogdsnqwf +.. _pandas: https://realpython.com/fast-flexible-pandas/?__s=o2w1az6ypdj7ogdsnqwf diff --git a/algo/algofundoc/_build/html/_sources/notebooks/Pandas.ipynb.txt b/algo/algofundoc/_build/html/_sources/notebooks/Pandas.ipynb.txt new file mode 100644 index 0000000..78467d2 --- /dev/null +++ b/algo/algofundoc/_build/html/_sources/notebooks/Pandas.ipynb.txt @@ -0,0 +1,229 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The **import** keyword is used to import a library" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6.123233995736766e-17\n" + ] + } + ], + "source": [ + "import math\n", + "print(math.cos(math.pi / 2))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pandas\n", + "=======" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col1col2col3col4
line1-0.8821252.1764520.163955-0.618232
line2-0.7215380.0355780.1800721.015987
line3-1.1623550.384632-0.6740920.162693
line4-1.399455-0.6985120.0394200.898408
line51.755342-0.073242-1.502503-0.586194
\n", + "
" + ], + "text/plain": [ + " col1 col2 col3 col4\n", + "line1 -0.882125 2.176452 0.163955 -0.618232\n", + "line2 -0.721538 0.035578 0.180072 1.015987\n", + "line3 -1.162355 0.384632 -0.674092 0.162693\n", + "line4 -1.399455 -0.698512 0.039420 0.898408\n", + "line5 1.755342 -0.073242 -1.502503 -0.586194" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy\n", + "import pandas\n", + "rows = ['line1', 'line2', 'line3', 'line4', 'line5']\n", + "cols = ['col1', 'col2', 'col3', 'col4']\n", + "from IPython.display import display\n", + "dataframe = pandas.DataFrame(numpy.random.randn(5,4), index=rows, columns=cols)\n", + "display(dataframe)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "reorganise a **dataframe** from datas as a dictionary with tuples as keys\n", + "-----------------------------------------------------------------------------------------------------" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Column 1Column 2Column 3
0CeriseLanister14
1PaulDurand13
2PierreDupont16
3johnSnow12
\n", + "
" + ], + "text/plain": [ + " Column 1 Column 2 Column 3\n", + "0 Cerise Lanister 14\n", + "1 Paul Durand 13\n", + "2 Pierre Dupont 16\n", + "3 john Snow 12" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dico = {('john', 'Snow') : 12, ('Paul', 'Durand') : 13, (\"Pierre\", \"Dupont\") : 16, (\"Cerise\", \"Lanister\") : 14}\n", + "import pandas\n", + "df = pandas.Series(dico).reset_index()\n", + "df.columns = ['Column 1', 'Column 2', 'Column 3']\n", + "from IPython.display import display\n", + "display(df)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/algo/algofundoc/_build/html/_sources/pandas.txt b/algo/algofundoc/_build/html/_sources/pandas.txt new file mode 100644 index 0000000..f875406 --- /dev/null +++ b/algo/algofundoc/_build/html/_sources/pandas.txt @@ -0,0 +1,14 @@ +pandas +========== + +**examples** in the jupyter_ notebooks + +.. _jupyter: http://jupyter.org/ + +ipython and pandas:: + + jupyter notebook Pandas.ipynb + +.. toctree:: + + notebooks/Pandas.ipynb diff --git a/algo/algofundoc/_build/html/_sources/programmation.txt b/algo/algofundoc/_build/html/_sources/programmation.txt new file mode 100644 index 0000000..be466c4 --- /dev/null +++ b/algo/algofundoc/_build/html/_sources/programmation.txt @@ -0,0 +1,61 @@ +============================== +Algorithmes et Programmation +============================== + +----- +Cours +----- + +.. toctree:: + :maxdepth: 1 + + fil_conducteur + + +- Structures de données séquentielles +- Ensembles et dictionnaires +- Algorithmes de recherche +- Les fichiers +- Algorithmes de tri + + + +---- +TP +---- + +.. toctree:: + :maxdepth: 1 + + + + +- Tester avec doctest +- Listes +- Gestion d’une promotion d’étudiants +- Anagrammes +- Analyse d’un fichier texte +- Évaluation empirique des tris + + + + + +----------------- +Documents annexes +----------------- + +.. toctree:: + :maxdepth: 1 + + +Bibliographie +------------- + +* Apprendre à programmer avec Python 3, Gérard Swinnen, editions Eyrolles (Chapitres 1 à 7, et chapitre 10 en partie). `Version électronique téléchargeable `_. + +* `Site officiel du langage Python `_. + +* `Documentation officielle de la version 3.5 de Python `_. + +* `Site officiel de Thonny `_. diff --git a/algo/algofundoc/_build/html/_static/ajax-loader.gif b/algo/algofundoc/_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/algo/algofundoc/_build/html/_static/background_b01.png b/algo/algofundoc/_build/html/_static/background_b01.png new file mode 100644 index 0000000000000000000000000000000000000000..353f26dde0803aa172c23e21ef6ac068e1253bc8 GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^%plAGBp8aFUnK)6QBN1gkP61+AN9}d56}GnU-I97 adu9eB2afnIr`wM~3O!x@T-G@yGywpsd=;et literal 0 HcmV?d00001 diff --git a/algo/algofundoc/_build/html/_static/basic.css b/algo/algofundoc/_build/html/_static/basic.css new file mode 100644 index 0000000..607b5f5 --- /dev/null +++ b/algo/algofundoc/_build/html/_static/basic.css @@ -0,0 +1,648 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- 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: 230px; + 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 input[type="text"] { + width: 170px; +} + +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 div.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 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; +} + +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, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 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; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.align-center { + 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; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption 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; +} + +/* -- 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; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.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; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +div.code-block-caption { + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; +} + +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 { + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +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: relative; + left: 0px; + 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/algo/algofundoc/_build/html/_static/bizstyle.css b/algo/algofundoc/_build/html/_static/bizstyle.css new file mode 100644 index 0000000..0464a74 --- /dev/null +++ b/algo/algofundoc/_build/html/_static/bizstyle.css @@ -0,0 +1,490 @@ +/* + * bizstyle.css_t + * ~~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- business style theme. + * + * :copyright: Copyright 2011-2014 by Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; + font-size: 14px; + letter-spacing: -0.01em; + line-height: 150%; + text-align: center; + background-color: white; + background-image: url(background_b01.png); + color: black; + padding: 0; + border-right: 1px solid #336699; + border-left: 1px solid #336699; + + margin: 0px 40px 0px 40px; +} + +div.document { + background-color: white; + text-align: left; + background-repeat: repeat-x; + + -moz-box-shadow: 2px 2px 5px #000; + -webkit-box-shadow: 2px 2px 5px #000; +} + +div.bodywrapper { + margin: 0 0 0 240px; + border-left: 1px solid #ccc; +} + +div.body { + margin: 0; + padding: 0.5em 20px 20px 20px; +} + +div.related { + font-size: 1em; + + -moz-box-shadow: 2px 2px 5px #000; + -webkit-box-shadow: 2px 2px 5px #000; +} + +div.related ul { + background-color: #336699; + height: 100%; + overflow: hidden; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; +} + +div.related ul li { + color: white; + margin: 0; + padding: 0; + height: 2em; + float: left; +} + +div.related ul li.right { + float: right; + margin-right: 5px; +} + +div.related ul li a { + margin: 0; + padding: 0 5px 0 5px; + line-height: 1.75em; + color: #fff; +} + +div.related ul li a:hover { + color: #fff; + text-decoration: underline; +} + +div.sphinxsidebarwrapper { + padding: 0; +} + +div.sphinxsidebar { + margin: 0; + padding: 0.5em 12px 12px 12px; + width: 210px; + font-size: 1em; + text-align: left; +} + +div.sphinxsidebar h3, div.sphinxsidebar h4 { + margin: 1em 0 0.5em 0; + font-size: 1em; + padding: 0.1em 0 0.1em 0.5em; + color: white; + border: 1px solid #336699; + background-color: #336699; +} + +div.sphinxsidebar h3 a { + color: white; +} + +div.sphinxsidebar ul { + padding-left: 1.5em; + margin-top: 7px; + padding: 0; + line-height: 130%; +} + +div.sphinxsidebar ul ul { + margin-left: 20px; +} + +div.sphinxsidebar input { + border: 1px solid #336699; +} + +div.footer { + background-color: white; + color: #336699; + padding: 3px 8px 3px 0; + clear: both; + font-size: 0.8em; + text-align: right; + border-bottom: 1px solid #336699; + + -moz-box-shadow: 2px 2px 5px #000; + -webkit-box-shadow: 2px 2px 5px #000; +} + +div.footer a { + color: #336699; + text-decoration: underline; +} + +/* -- body styles ----------------------------------------------------------- */ + +p { + margin: 0.8em 0 0.5em 0; +} + +a { + color: #336699; + text-decoration: none; +} + +a:hover { + color: #336699; + text-decoration: underline; +} + +div.body a { + text-decoration: underline; +} + +h1, h2, h3 { + color: #336699; +} + +h1 { + margin: 0; + padding: 0.7em 0 0.3em 0; + font-size: 1.5em; +} + +h2 { + margin: 1.3em 0 0.2em 0; + font-size: 1.35em; + padding-bottom: .5em; + border-bottom: 1px solid #336699; +} + +h3 { + margin: 1em 0 -0.3em 0; + font-size: 1.2em; + padding-bottom: .3em; + border-bottom: 1px solid #CCCCCC; +} + +div.body h1 a, div.body h2 a, div.body h3 a, +div.body h4 a, div.body h5 a, div.body h6 a { + color: black!important; +} + +h1 a.anchor, h2 a.anchor, h3 a.anchor, +h4 a.anchor, h5 a.anchor, h6 a.anchor { + display: none; + margin: 0 0 0 0.3em; + padding: 0 0.2em 0 0.2em; + color: #aaa!important; +} + +h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, +h5:hover a.anchor, h6:hover a.anchor { + display: inline; +} + +h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover, +h5 a.anchor:hover, h6 a.anchor:hover { + color: #777; + background-color: #eee; +} + +a.headerlink { + color: #c60f0f!important; + font-size: 1em; + margin-left: 6px; + padding: 0 4px 0 4px; + text-decoration: none!important; +} + +a.headerlink:hover { + background-color: #ccc; + color: white!important; +} + +cite, code, tt { + font-family: 'Consolas', 'Deja Vu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; + font-size: 0.95em; + letter-spacing: 0.01em; +} + +code { + background-color: #F2F2F2; + border-bottom: 1px solid #ddd; + color: #333; +} + +code.descname, code.descclassname, code.xref { + border: 0; +} + +hr { + border: 1px solid #abc; + margin: 2em; +} + +a code { + border: 0; + color: #CA7900; +} + +a code:hover { + color: #2491CF; +} + +pre { + background-color: transparent !important; + font-family: 'Consolas', 'Deja Vu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; + font-size: 0.95em; + letter-spacing: 0.015em; + line-height: 120%; + padding: 0.5em; + border-right: 5px solid #ccc; + border-left: 5px solid #ccc; +} + +pre a { + color: inherit; + text-decoration: underline; +} + +td.linenos pre { + padding: 0.5em 0; +} + +div.quotebar { + background-color: #f8f8f8; + max-width: 250px; + float: right; + padding: 2px 7px; + border: 1px solid #ccc; +} + +div.topic { + background-color: #f8f8f8; +} + +table { + border-collapse: collapse; + margin: 0 -0.5em 0 -0.5em; +} + +table td, table th { + padding: 0.2em 0.5em 0.2em 0.5em; +} + +div.admonition { + font-size: 0.9em; + margin: 1em 0 1em 0; + border: 3px solid #cccccc; + background-color: #f7f7f7; + padding: 0; +} + +div.admonition p { + margin: 0.5em 1em 0.5em 1em; + padding: 0; +} + +div.admonition li p { + margin-left: 0; +} + +div.admonition pre, div.warning pre { + margin: 0; +} + +div.highlight { + margin: 0.4em 1em; +} + +div.admonition p.admonition-title { + margin: 0; + padding: 0.1em 0 0.1em 0.5em; + color: white; + border-bottom: 3px solid #cccccc; + font-weight: bold; + background-color: #165e83; +} + +div.danger { border: 3px solid #f0908d; background-color: #f0cfa0; } +div.error { border: 3px solid #f0908d; background-color: #ede4cd; } +div.warning { border: 3px solid #f8b862; background-color: #f0cfa0; } +div.caution { border: 3px solid #f8b862; background-color: #ede4cd; } +div.attention { border: 3px solid #f8b862; background-color: #f3f3f3; } +div.important { border: 3px solid #f0cfa0; background-color: #ede4cd; } +div.note { border: 3px solid #f0cfa0; background-color: #f3f3f3; } +div.hint { border: 3px solid #bed2c3; background-color: #f3f3f3; } +div.tip { border: 3px solid #bed2c3; background-color: #f3f3f3; } + +div.danger p.admonition-title, div.error p.admonition-title { + background-color: #b7282e; + border-bottom: 3px solid #f0908d; +} + +div.caution p.admonition-title, +div.warning p.admonition-title, +div.attention p.admonition-title { + background-color: #f19072; + border-bottom: 3px solid #f8b862; +} + +div.note p.admonition-title, div.important p.admonition-title { + background-color: #f8b862; + border-bottom: 3px solid #f0cfa0; +} + +div.hint p.admonition-title, div.tip p.admonition-title { + background-color: #7ebea5; + border-bottom: 3px solid #bed2c3; +} + +div.admonition ul, div.admonition ol, +div.warning ul, div.warning ol { + margin: 0.1em 0.5em 0.5em 3em; + padding: 0; +} + +div.versioninfo { + margin: 1em 0 0 0; + border: 1px solid #ccc; + background-color: #DDEAF0; + padding: 8px; + line-height: 1.3em; + font-size: 0.9em; +} + +.viewcode-back { + font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +p.versionchanged span.versionmodified { + font-size: 0.9em; + margin-right: 0.2em; + padding: 0.1em; + background-color: #DCE6A0; +} + +/* -- table styles ---------------------------------------------------------- */ + +table.docutils { + margin: 1em 0; + padding: 0; + border: 1px solid white; + background-color: #f7f7f7; +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 1px solid white; + border-bottom: 1px solid white; +} + +table.docutils td p { + margin-top: 0; + margin-bottom: 0.3em; +} + +table.field-list td, table.field-list th { + border: 0 !important; + word-break: break-word; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + color: white; + text-align: left; + padding-right: 5px; + background-color: #82A0BE; +} + +div.literal-block-wrapper div.code-block-caption { + background-color: #EEE; + border-style: solid; + border-color: #CCC; + border-width: 1px 5px; +} + +/* WIDE DESKTOP STYLE */ +@media only screen and (min-width: 1176px) { +body { + margin: 0 40px 0 40px; +} +} + +/* TABLET STYLE */ +@media only screen and (min-width: 768px) and (max-width: 991px) { +body { + margin: 0 40px 0 40px; +} +} + +/* MOBILE LAYOUT (PORTRAIT/320px) */ +@media only screen and (max-width: 767px) { +body { + margin: 0; +} +div.bodywrapper { + margin: 0; + width: 100%; + border: none; +} +div.sphinxsidebar { + display: none; +} +} + +/* MOBILE LAYOUT (LANDSCAPE/480px) */ +@media only screen and (min-width: 480px) and (max-width: 767px) { +body { + margin: 0 20px 0 20px; +} +} + +/* RETINA OVERRIDES */ +@media +only screen and (-webkit-min-device-pixel-ratio: 2), +only screen and (min-device-pixel-ratio: 2) { +} + +/* -- end ------------------------------------------------------------------- */ \ No newline at end of file diff --git a/algo/algofundoc/_build/html/_static/bizstyle.js b/algo/algofundoc/_build/html/_static/bizstyle.js new file mode 100644 index 0000000..b764560 --- /dev/null +++ b/algo/algofundoc/_build/html/_static/bizstyle.js @@ -0,0 +1,41 @@ +// +// bizstyle.js +// ~~~~~~~~~~~ +// +// Sphinx javascript -- for bizstyle theme. +// +// This theme was created by referring to 'sphinxdoc' +// +// :copyright: Copyright 2012-2014 by Sphinx team, see AUTHORS. +// :license: BSD, see LICENSE for details. +// +$(document).ready(function(){ + if (navigator.userAgent.indexOf('iPhone') > 0 || + navigator.userAgent.indexOf('Android') > 0) { + $("li.nav-item-0 a").text("Top"); + } + + $("div.related:first ul li:not(.right) a").slice(1).each(function(i, item){ + if (item.text.length > 20) { + var tmpstr = item.text + $(item).attr("title", tmpstr); + $(item).text(tmpstr.substr(0, 17) + "..."); + } + }); + $("div.related:last ul li:not(.right) a").slice(1).each(function(i, item){ + if (item.text.length > 20) { + var tmpstr = item.text + $(item).attr("title", tmpstr); + $(item).text(tmpstr.substr(0, 17) + "..."); + } + }); +}); + +$(window).resize(function(){ + if ($(window).width() <= 776) { + $("li.nav-item-0 a").text("Top"); + } + else { + $("li.nav-item-0 a").text("algofun documentation"); + } +}); \ No newline at end of file diff --git a/algo/algofundoc/_build/html/_static/comment-bright.png b/algo/algofundoc/_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/algo/algofundoc/_build/html/_static/css3-mediaqueries.js b/algo/algofundoc/_build/html/_static/css3-mediaqueries.js new file mode 100644 index 0000000..59735f5 --- /dev/null +++ b/algo/algofundoc/_build/html/_static/css3-mediaqueries.js @@ -0,0 +1 @@ +if(typeof Object.create!=="function"){Object.create=function(e){function t(){}t.prototype=e;return new t}}var ua={toString:function(){return navigator.userAgent},test:function(e){return this.toString().toLowerCase().indexOf(e.toLowerCase())>-1}};ua.version=(ua.toString().toLowerCase().match(/[\s\S]+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1];ua.webkit=ua.test("webkit");ua.gecko=ua.test("gecko")&&!ua.webkit;ua.opera=ua.test("opera");ua.ie=ua.test("msie")&&!ua.opera;ua.ie6=ua.ie&&document.compatMode&&typeof document.documentElement.style.maxHeight==="undefined";ua.ie7=ua.ie&&document.documentElement&&typeof document.documentElement.style.maxHeight!=="undefined"&&typeof XDomainRequest==="undefined";ua.ie8=ua.ie&&typeof XDomainRequest!=="undefined";var domReady=function(){var e=[];var t=function(){if(!arguments.callee.done){arguments.callee.done=true;for(var t=0;t=200&&r.status<300||r.status===304||navigator.userAgent.indexOf("Safari")>-1&&typeof r.status==="undefined"){t(r.responseText)}else{n()}document.documentElement.style.cursor="";r=null}};r.send("")};var l=function(t){t=t.replace(e.REDUNDANT_COMPONENTS,"");t=t.replace(e.REDUNDANT_WHITESPACE,"$1");t=t.replace(e.WHITESPACE_IN_PARENTHESES,"($1)");t=t.replace(e.MORE_WHITESPACE," ");t=t.replace(e.FINAL_SEMICOLONS,"}");return t};var c={stylesheet:function(t){var n={};var r=[],i=[],s=[],o=[];var u=t.cssHelperText;var a=t.getAttribute("media");if(a){var f=a.toLowerCase().split(",")}else{var f=["all"]}for(var l=0;l-1&&a.href&&a.href.length!==0&&!a.disabled){r[r.length]=a}}if(r.length>0){var c=0;var d=function(){c++;if(c===r.length){i()}};var v=function(t){var n=t.href;f(n,function(r){r=l(r).replace(e.RELATIVE_URLS,"url("+n.substring(0,n.lastIndexOf("/"))+"/$1)");t.cssHelperText=r;d()},d)};for(u=0;u0){r.setAttribute("media",t.join(","))}document.getElementsByTagName("head")[0].appendChild(r);if(r.styleSheet){r.styleSheet.cssText=e}else{r.appendChild(document.createTextNode(e))}r.addedWithCssHelper=true;if(typeof n==="undefined"||n===true){cssHelper.parsed(function(t){var n=p(r,e);for(var i in n){if(n.hasOwnProperty(i)){g(i,n[i])}}a("newStyleParsed",r)})}else{r.parsingDisallowed=true}return r},removeStyle:function(e){return e.parentNode.removeChild(e)},parsed:function(e){if(n){s(e)}else{if(typeof t!=="undefined"){if(typeof e==="function"){e(t)}}else{s(e);d()}}},stylesheets:function(e){cssHelper.parsed(function(t){e(m.stylesheets||y("stylesheets"))})},mediaQueryLists:function(e){cssHelper.parsed(function(t){e(m.mediaQueryLists||y("mediaQueryLists"))})},rules:function(e){cssHelper.parsed(function(t){e(m.rules||y("rules"))})},selectors:function(e){cssHelper.parsed(function(t){e(m.selectors||y("selectors"))})},declarations:function(e){cssHelper.parsed(function(t){e(m.declarations||y("declarations"))})},properties:function(e){cssHelper.parsed(function(t){e(m.properties||y("properties"))})},broadcast:a,addListener:function(e,t){if(typeof t==="function"){if(!u[e]){u[e]={listeners:[]}}u[e].listeners[u[e].listeners.length]=t}},removeListener:function(e,t){if(typeof t==="function"&&u[e]){var n=u[e].listeners;for(var r=0;r=a||s&&l0}}else if("device-height"===e.substring(r-13,r)){c=screen.height;if(t!==null){if(u==="length"){return i&&c>=a||s&&c0}}else if("width"===e.substring(r-5,r)){l=document.documentElement.clientWidth||document.body.clientWidth;if(t!==null){if(u==="length"){return i&&l>=a||s&&l0}}else if("height"===e.substring(r-6,r)){c=document.documentElement.clientHeight||document.body.clientHeight;if(t!==null){if(u==="length"){return i&&c>=a||s&&c0}}else if("device-aspect-ratio"===e.substring(r-19,r)){return u==="aspect-ratio"&&screen.width*a[1]===screen.height*a[0]}else if("color-index"===e.substring(r-11,r)){var h=Math.pow(2,screen.colorDepth);if(t!==null){if(u==="absolute"){return i&&h>=a||s&&h0}}else if("color"===e.substring(r-5,r)){var p=screen.colorDepth;if(t!==null){if(u==="absolute"){return i&&p>=a||s&&p0}}else if("resolution"===e.substring(r-10,r)){var d;if(f==="dpcm"){d=o("1cm")}else{d=o("1in")}if(t!==null){if(u==="resolution"){return i&&d>=a||s&&d0}}else{return false}};var a=function(e){var t=e.getValid();var n=e.getExpressions();var r=n.length;if(r>0){for(var i=0;i0){u=false;for(var f=0;f0){l[c++]=","}l[c++]=h}}if(l.length>0){r[r.length]=cssHelper.addStyle("@media "+l.join("")+"{"+e.getCssText()+"}",t,false)}};var l=function(e,t){for(var n=0;n0}}var o=[],u=[];for(var f in i){if(i.hasOwnProperty(f)){o[o.length]=f;if(i[f]){u[u.length]=f}if(f==="all"){n=true}}}if(u.length>0){r[r.length]=cssHelper.addStyle(e.getCssText(),u,false)}var c=e.getMediaQueryLists();if(n){l(c)}else{l(c,o)}};var h=function(e){for(var t=0;td||Math.abs(s-t)>d){e=n;t=s;clearTimeout(r);r=setTimeout(function(){if(!i()){p()}else{cssHelper.broadcast("cssMediaQueriesTested")}},500)}};window.onresize=function(){var e=window.onresize||function(){};return function(){e();s()}}()};var m=document.documentElement;m.style.marginLeft="-32767px";setTimeout(function(){m.style.marginLeft=""},5e3);return function(){if(!i()){cssHelper.addListener("newStyleParsed",function(e){c(e.cssHelperParsed.stylesheet)});cssHelper.addListener("cssMediaQueriesTested",function(){if(ua.ie){m.style.width="1px"}setTimeout(function(){m.style.width="";m.style.marginLeft=""},0);cssHelper.removeListener("cssMediaQueriesTested",arguments.callee)});s();p()}else{m.style.marginLeft=""}v()}}());try{document.execCommand("BackgroundImageCache",false,true)}catch(e){} diff --git a/algo/algofundoc/_build/html/_static/doctools.js b/algo/algofundoc/_build/html/_static/doctools.js new file mode 100644 index 0000000..0c15c00 --- /dev/null +++ b/algo/algofundoc/_build/html/_static/doctools.js @@ -0,0 +1,311 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(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)) { + 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 bbox = span.getBBox(); + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + 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); + var parentOfText = node.parentNode.parentNode; + 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; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return 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 : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keyup(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box or textarea + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); \ No newline at end of file diff --git a/algo/algofundoc/_build/html/_static/down-pressed.png b/algo/algofundoc/_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/algo/algofundoc/_build/html/_static/down.png b/algo/algofundoc/_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/algo/algofundoc/_build/html/_static/file.png b/algo/algofundoc/_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/algo/algofundoc/_build/html/_static/jquery.js b/algo/algofundoc/_build/html/_static/jquery.js new file mode 100644 index 0000000..ba171ca --- /dev/null +++ b/algo/algofundoc/_build/html/_static/jquery.js @@ -0,0 +1,10253 @@ +/*! + * jQuery JavaScript Library v3.2.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2017-09-03T00:14Z + */ +( function( global, factory ) { + + "use strict"; + + 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 have a `window` with a `document` + // (such as Node.js), expose a 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 ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. + + +var arr = []; + +var document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + + + + function DOMEval( code, doc ) { + doc = doc || document; + + var script = doc.createElement( "script" ); + + script.text = code; + doc.head.appendChild( script ).parentNode.removeChild( script ); + } +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.2.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.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g, + + // 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, + + // 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 all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // 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; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + 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(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, 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 = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.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() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); + }, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE <=9 - 11, Edge 12 - 13 + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + 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 ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + 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 length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + 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 tmp, args, proxy; + + 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: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(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" + 1 * 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; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[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 + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // 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 + rwhitespace = new RegExp( whitespace + "+", "g" ), + 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( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "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 = /[+~]/, + + // 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 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// 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 m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + 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 element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = 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 = arr.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 && + a.sourceIndex - b.sourceIndex; + + // 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 :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * 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 !== "undefined" && 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, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + 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 !== "undefined" && 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 https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // 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 + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).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 + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // 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 ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.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 ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[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 self-exclusive + // 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 === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( 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 === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( 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 document; +}; + +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 && + !compilerCache[ expr + " " ] && + ( !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.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +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 !== "undefined" && 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.replace( rwhitespace, " " ) + " " ).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, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + 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 + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && 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 ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // 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 ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ 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( 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 ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + 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": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( 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, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "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 ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator 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 ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + 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 + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +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( 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( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + 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 || outermost; + } + + // Add elements passing elementMatchers directly to results + // 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; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, 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 ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + 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 only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + 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, + !context || 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-35+ +// 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( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.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( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.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( el ) { + return el.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; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +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 ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Simple selector that can be filtered directly, removing non-Elements + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + // Complex selector, compare the two sets, removing non-Elements + qualifier = jQuery.filter( qualifier, elements ); + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + 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; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : 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, + + // 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 <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ 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; + + // Option to run 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 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).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[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + 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.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.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.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + 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 indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + 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 ) { + while ( ( cur = cur[ dir ] ) && 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 dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], 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" ? + 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, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + 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.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + 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; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( jQuery.isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).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 = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + 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( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + 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, + + // 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; + } + + // 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 ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + 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 < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ jQuery.camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ jQuery.camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( jQuery.camelCase ); + } else { + key = jQuery.camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // 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 ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( 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 public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", 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 = dataPriv.get( 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 rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + 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 || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.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 ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // 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 ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + 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 elem; + } + + 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 elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * 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 handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( 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; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, 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 !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + 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 if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( 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; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + 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 data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( 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; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + 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.rnamespace || event.rnamespace.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 i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: jQuery.isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + 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 ) { + this.focus(); + return false; + } + }, + 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 ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return 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; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, 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: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // 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 +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +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 mouseenter/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; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, 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 ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( ">tbody", elem )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "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; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + 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 collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + 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 ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ 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 || "" ) && + !dataPriv.access( 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 { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], 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, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + 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 ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, 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 domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + 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 && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + 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 ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rmargin = ( /^margin/ ); + +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + div.style.cssText = + "box-sizing:border-box;" + + "position:relative;display:block;" + + "margin:auto;border:1px;padding:1px;" + + "top:1%;width:50%"; + div.innerHTML = ""; + documentElement.appendChild( container ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = divStyle.marginLeft === "2px"; + boxSizingReliableVal = divStyle.width === "4px"; + + // Support: Android 4.0 - 4.3 only + // Some styles come back with percentage values, even though they shouldn't + div.style.marginRight = "50%"; + pixelMarginRightVal = divStyle.marginRight === "4px"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + + "padding:0;margin-top:1px;position:absolute"; + container.appendChild( div ); + + jQuery.extend( support, { + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelMarginRight: function() { + computeStyleTests(); + return pixelMarginRightVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i, + val = 0; + + // If we already have the right measurement, avoid augmentation + if ( extra === ( isBorderBox ? "border" : "content" ) ) { + i = 4; + + // Otherwise initialize for horizontal or vertical properties + } else { + i = name === "width" ? 1 : 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // At this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + + // At this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // At this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with computed style + var valueIsBorderBox, + styles = getStyles( elem ), + val = curCSS( elem, name, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test( val ) ) { + return val; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && + ( support.boxSizingReliable() || val === elem.style[ name ] ); + + // Fall back to offsetWidth/Height when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + if ( val === "auto" ) { + val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; + } + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + + // Use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + "float": "cssFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + } ) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = extra && getStyles( elem ), + subtract = extra && augmentWidthOrHeight( + elem, + name, + extra, + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ); + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ name ] = value; + value = jQuery.css( elem, name ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = jQuery.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 13 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( jQuery.isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + jQuery.proxy( result.stop, result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( type === "string" ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = value.match( rnothtmlwhite ) || []; + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, isFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + 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( "." ) > -1 ) { + + // 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.rnamespace = 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 = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && 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 ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( 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; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + 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 ); + } + } +} ); + + +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + +support.focusin = "onfocusin" in window; + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + 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 ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = jQuery.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = jQuery.isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( jQuery.isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 13 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available, append data to url + if ( s.data ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( jQuery.isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + + + + + + + + +
+
+
+ +
+

Fil conducteur : 1er tour des élections présidentielles 2017

+

Le fil conducteur sera l’exploitation de données issues du 1er tour des élections présidentielles qui ont eu lieu en France le 23 avril 2017.

+

Les données dont on dispose sont les résultats par canton (plus de 2000 cantons). Pour chaque canton sont donnés

+
    +
  • le nombre d’inscrits
  • +
  • le nombre de votants
  • +
  • le nombre de bulletins nuls
  • +
  • le nombre de bulletins blancs
  • +
  • le nombre de voix obtenus par chacun des candidats.
  • +
+

L’objectif est d’établir

+
    +
  • les résultats au niveau national
  • +
  • la participation
  • +
+
+Participation globale +
+
    +
  • le scores des candidats
  • +
+
+Score des candidats +
+

Ce sera l’occasion de découvrir :

+
    +
  • les structures itérables, en particulier les tuples et dictionnaires
  • +
  • la lecture et l’écriture de données dans des fichiers
  • +
  • des algorithmes de tris et de recherche.
  • +
+
+ + +
+
+
+
+ + + + \ No newline at end of file diff --git a/algo/algofundoc/_build/html/genindex.html b/algo/algofundoc/_build/html/genindex.html new file mode 100644 index 0000000..433927d --- /dev/null +++ b/algo/algofundoc/_build/html/genindex.html @@ -0,0 +1,72 @@ + + + + + + + + + Index — algofun documentation + + + + + + + + + + + + + + + +
+
+
+ + +

Index

+ +
+ +
+ + +
+
+
+
+ + + + \ No newline at end of file diff --git a/algo/algofundoc/_build/html/index.html b/algo/algofundoc/_build/html/index.html new file mode 100644 index 0000000..1293829 --- /dev/null +++ b/algo/algofundoc/_build/html/index.html @@ -0,0 +1,100 @@ + + + + + + + + + + algofundoc — algofun documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Indices and tables

+ +
+

Note

+

The pyfun code is licensed under the LGPL licence +and this documentation is licensed under the Creative Commons +Attribution-ShareAlike 3.0 Unported License.

+
+
+ + +
+
+
+
+ + + + \ No newline at end of file diff --git a/algo/algofundoc/_build/html/liens.html b/algo/algofundoc/_build/html/liens.html new file mode 100644 index 0000000..1e5dfc3 --- /dev/null +++ b/algo/algofundoc/_build/html/liens.html @@ -0,0 +1,90 @@ + + + + + + + + Liens utiles — algofun documentation + + + + + + + + + + + + + + + + + +
+
+
+ +
+

Liens utiles

+ +
+ + +
+
+
+
+ + + + \ No newline at end of file diff --git a/algo/algofundoc/_build/html/notebooks/Pandas.html b/algo/algofundoc/_build/html/notebooks/Pandas.html new file mode 100644 index 0000000..9ec3dc7 --- /dev/null +++ b/algo/algofundoc/_build/html/notebooks/Pandas.html @@ -0,0 +1,409 @@ + + + + + + + + Pandas — algofun documentation + + + + + + + + + + + + + + + + +
+
+
+ + + +

The import keyword is used to import a library

+
+
+In [2]:
+
+
+
+import math
+print(math.cos(math.pi / 2))
+
+
+
+
+
+
+
+
+
+6.123233995736766e-17
+
+
+
+

Pandas

+
+
+In [1]:
+
+
+
+import numpy
+import pandas
+rows = ['line1', 'line2', 'line3', 'line4', 'line5']
+cols = ['col1', 'col2', 'col3', 'col4']
+from IPython.display import display
+dataframe = pandas.DataFrame(numpy.random.randn(5,4), index=rows, columns=cols)
+display(dataframe)
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
col1col2col3col4
line1-0.8821252.1764520.163955-0.618232
line2-0.7215380.0355780.1800721.015987
line3-1.1623550.384632-0.6740920.162693
line4-1.399455-0.6985120.0394200.898408
line51.755342-0.073242-1.502503-0.586194
+
+
+
+

reorganise a dataframe from datas as a dictionary with tuples as keys

+
+
+In [2]:
+
+
+
+dico = {('john', 'Snow') : 12, ('Paul', 'Durand') : 13, ("Pierre", "Dupont") : 16, ("Cerise", "Lanister") : 14}
+import pandas
+df = pandas.Series(dico).reset_index()
+df.columns = ['Column 1', 'Column 2', 'Column 3']
+from IPython.display import display
+display(df)
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Column 1Column 2Column 3
0CeriseLanister14
1PaulDurand13
2PierreDupont16
3johnSnow12
+
+
+
+
+ + +
+
+
+
+ + + + \ No newline at end of file diff --git a/algo/algofundoc/_build/html/objects.inv b/algo/algofundoc/_build/html/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..c1bdb56284972473424f71d3579207bc1c52d519 GIT binary patch literal 746 zcmVNERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkmY-ev~ zb#4kHAXa5^b7^mGIv^klBOp|0Wgv28ZDDC{WMy(7Z)PBLXlZjGW@&6?AZc?TV{dJ6 za%FRKWn>_Ab7^j8AbM>@kCYUV*&ev~Qz%)sg=MY2vu6v&miL0@OaR%z zjsIwC0S{cjfWbZNmS^Yl;y?9cM6s1!W3GU9G1V&u@uxuAiNibjhU zxB)6lVrlM*nbS#79|HskL4dNY;7pq7E&}X#@#IWsEg$nY-XZ~?3m%ikN;NHxT;e5B zExD|wHT(>Or=H-e=|Jeik~+9~W2q3-UEs3lm>w_E>K#UUa7Bhm$hv(PRbvd7C$l0) zOhyyDnbvI$t=J05!1Ld1E0txrQYW)*@E1hQ9d9l&AFB+Uec<>@3-+ACCM;G6ZGyd| zrkHof(YYyl;vCFD*J|@wi0u-() z;8gq)AFOens|q+32rAC!RI>gECeNseE~4oUZr~;lKMLvn*GR1@EU)&@Bav+6zIH*4 z1=mW>GY-zPoQq zq*O&)<6v@aUa~V=7Mw=>=n?3UR3h6fDkJ6hKD%inJ_>WL@8{zwAIJZPzbh4!eq@d} z*P|iDqcgLC)>V_5^M2aJq`5I#t1^+dxscw`9gZqn!MX}=TTquoPdpAw~0UI~uwM|T08vp + + + + + pandas — algofun documentation + + + + + + + + + + + + + + + + + +
+
+
+ +
+

pandas

+

examples in the jupyter notebooks

+

ipython and pandas:

+
jupyter notebook Pandas.ipynb
+
+
+ +
+ + +
+
+
+
+ + + + \ No newline at end of file diff --git a/algo/algofundoc/_build/html/programmation.html b/algo/algofundoc/_build/html/programmation.html new file mode 100644 index 0000000..d85795b --- /dev/null +++ b/algo/algofundoc/_build/html/programmation.html @@ -0,0 +1,124 @@ + + + + + + + + Algorithmes et Programmation — algofun documentation + + + + + + + + + + + + + + + + + +
+
+
+ +
+

Algorithmes et Programmation

+
+

Cours

+ +
    +
  • Structures de données séquentielles
  • +
  • Ensembles et dictionnaires
  • +
  • Algorithmes de recherche
  • +
  • Les fichiers
  • +
  • Algorithmes de tri
  • +
+
+
+

TP

+
+
+
    +
  • Tester avec doctest
  • +
  • Listes
  • +
  • Gestion d’une promotion d’étudiants
  • +
  • Anagrammes
  • +
  • Analyse d’un fichier texte
  • +
  • Évaluation empirique des tris
  • +
+
+
+

Documents annexes

+
+
+
+

Bibliographie

+ +
+
+
+ + +
+
+
+
+ + + + \ No newline at end of file diff --git a/algo/algofundoc/_build/html/search.html b/algo/algofundoc/_build/html/search.html new file mode 100644 index 0000000..abefd81 --- /dev/null +++ b/algo/algofundoc/_build/html/search.html @@ -0,0 +1,95 @@ + + + + + + + + Search — algofun documentation + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Search

+
+ +

+ Please activate JavaScript to enable the search + functionality. +

+
+

+ From here you can search these documents. Enter your search + words into the box below and click "search". Note that the search + function will automatically search for all of the words. Pages + containing fewer words won't appear in the result list. +

+
+ + + +
+ +
+ +
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/algo/algofundoc/_build/html/searchindex.js b/algo/algofundoc/_build/html/searchindex.js new file mode 100644 index 0000000..8f8aac4 --- /dev/null +++ b/algo/algofundoc/_build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["MachineLearning","fil_conducteur","index","liens","notebooks/Pandas","pandas","programmation"],envversion:53,filenames:["MachineLearning.txt","fil_conducteur.txt","index.txt","liens.txt","notebooks/Pandas.ipynb","pandas.txt","programmation.txt"],objects:{},objnames:{},objtypes:{},terms:{"123233995736766e":4,"1er":6,"\u00e9critur":1,"\u00e9lection":6,"\u00e9tablir":1,"\u00e9tudiant":6,"\u00e9valuat":6,"d\u00e9couvrir":1,"default":0,"donn\u00e9":[1,6],"import":[0,4],"it\u00e9rabl":1,"pr\u00e9sidentiel":6,"r\u00e9sultat":1,"s\u00e9quentiel":6,Les:[1,6],The:[2,4],__version__:0,algorithm:[1,2],all:2,anagramm:6,analys:6,apprendr:6,apr:0,attribut:2,avail:2,avec:6,avril:1,big:0,blanc:1,bulletin:1,candidat:1,canton:1,ceris:4,chacun:1,chapitr:6,chaqu:1,chargeabl:6,code:2,col1:4,col2:4,col3:4,col4:4,col:4,column:4,com:0,common:2,conducteur:6,copyright:0,cos:4,creativ:2,credit:0,dan:1,data:[0,3,5],datafram:5,des:6,dico:4,dictionari:5,dictionnair:[1,6],displai:4,dispos:1,doctest:6,document:2,dont:1,dupont:4,durand:4,edit:6,empiriqu:6,ensembl:6,est:1,exampl:5,exploit:1,eyrol:6,fichier:[1,6],fil:6,format:0,franc:1,from:5,gcc:0,gestion:6,help:0,html:0,http:0,index:[2,4],inform:0,inscrit:1,ipynb:5,ipython:[4,5],issu:1,john:4,jupyt:5,kei:5,keyword:4,langag:6,lanist:4,learn:[2,3],lectroniqu:6,lectur:1,les:1,lgpl:2,librari:4,licenc:2,licens:[0,2],lien:2,lieu:1,line1:4,line2:4,line3:4,line4:4,line5:4,linux:0,list:6,machin:[2,3],machinelearningmasteri:0,make:3,math:4,matplotlib:0,modul:2,more:0,nation:1,niveau:1,nombr:1,notebook:5,nul:1,numpi:[0,4],objectif:1,obtenu:1,occas:1,officiel:6,ont:1,org:0,page:2,panda:[0,2,3],par:1,parti:6,particip:1,particuli:1,paul:4,pierr:4,plote:3,plu:1,pour:1,print:[0,4],programm:2,promot:6,pyfun:2,python:[0,2,6],qui:1,randn:4,random:[3,4],rard:6,recherch:[1,6],reorganis:5,reset_index:4,row:4,scienc:[0,3],scikit:0,scipi:0,score:1,search:2,sera:1,seri:4,sharealik:2,site:6,sklearn:0,snow:4,sont:1,stabl:0,step:0,structur:[1,6],swinnen:6,sys:0,tester:6,text:6,thi:2,thonni:6,tour:6,tri:[1,6],tupl:[1,5],tutori:2,type:0,under:2,une:6,unport:2,used:4,util:2,version:[0,6],voix:1,votant:1,which:2,www:0,yet:0},titles:["Machine learning","Fil conducteur : 1er tour des \u00e9lections pr\u00e9sidentielles 2017","algofundoc","Liens utiles","Pandas","pandas","Algorithmes et Programmation"],titleterms:{"1er":1,"\u00e9lection":1,"pr\u00e9sidentiel":1,algo:2,algorithm:6,annex:6,bibliographi:6,conducteur:1,cour:6,data:4,datafram:4,des:1,dictionari:4,document:6,fil:1,from:4,fun:2,indic:2,instal:0,kei:4,learn:0,lien:3,link:0,machin:0,panda:[4,5],programm:6,reorganis:4,some:0,tabl:2,tour:1,tupl:4,usag:0,util:3}}) \ No newline at end of file diff --git a/algo/algofundoc/_static/python-logo-large.png b/algo/algofundoc/_static/python-logo-large.png new file mode 100644 index 0000000000000000000000000000000000000000..e3df4dedd88d07c0d2667532b05a932d78c30507 GIT binary patch literal 13093 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 literal 0 HcmV?d00001 diff --git a/algo/algofundoc/conf.py b/algo/algofundoc/conf.py new file mode 100644 index 0000000..a9f96b9 --- /dev/null +++ b/algo/algofundoc/conf.py @@ -0,0 +1,200 @@ +# -*- coding: utf-8 -*- +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys + +# the code library +sys.path.insert(0, os.path.abspath('./src')) +# the *question* extension +sys.path.insert(0, os.path.abspath('./ext')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['nbsphinx', + 'sphinx.ext.extlinks', + 'sphinx.ext.todo', + 'sphinx.ext.ifconfig', + 'sphinx.ext.viewcode', + 'question'] + +# _______________________________________________________________________ +# extlinks config +# can add an +# :src:`my source ` +# in the txt goal files +extlinks = {'src': ('_modules/%s.html', + 'full source for: ')} + +# _______________________________________________________________________ +# ifconfig section +def setup(app): + app.add_config_value('answer', False, 'env') + +answer = True +# _______________________________________________________________________ + + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.txt' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'algofun' +copyright = u'2018, gwen' +author = u'gwen' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u' ' +# The full version, including alpha/beta/rc tags. +release = u' ' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = "en" + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['Readme.txt', 'bribes', '_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'bw' +#pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = True + +# -- Options for HTML output ---------------------------------------------- +# If true, links to the reST sources are added to the pages. +html_show_sourcelink = False + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +#html_theme = 'alabaster' +html_theme = 'bizstyle' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +#html_theme_options = { +# 'show_powered_by': False, +# 'page_width': 80 +# } + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +html_sidebars = { + '**': [ + #'relations.html', # needs 'show_related': True theme option to display + #'searchbox.html', + ] +} + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +html_show_sphinx = False + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +html_show_copyright = False + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'pyfundoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + 'papersize': 'a4paper', + + # The font size ('10pt', '11pt' or '12pt'). + # + 'pointsize': '12pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'pyfun.tex', u'pyfun Documentation', + u'gwen', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'pyfun', u'pyfun Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'pyfun', u'pyfun Documentation', + author, 'pyfun', 'One line description of project.', + 'Miscellaneous'), +] diff --git a/algo/algofundoc/ext/__init__.py b/algo/algofundoc/ext/__init__.py new file mode 100644 index 0000000..8add642 --- /dev/null +++ b/algo/algofundoc/ext/__init__.py @@ -0,0 +1 @@ +"sphinx extensions" diff --git a/algo/algofundoc/ext/question.py b/algo/algofundoc/ext/question.py new file mode 100644 index 0000000..ab4a410 --- /dev/null +++ b/algo/algofundoc/ext/question.py @@ -0,0 +1,209 @@ +# -*- coding: utf-8 -*- +""" + question + ~~~~~~~~ + + Allow questions to be inserted into your documentation. + The questionlist directive collects + all questions of your project and lists them along with a backlink to the + original location. + + :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +global questno, qno +questno = 1 +qno = 0 + +from docutils import nodes + +from sphinx.locale import _ +from sphinx.environment import NoUri +from sphinx.util.nodes import set_source_info +#from sphinx.util.compat import Directive #, make_admonition +from docutils.parsers.rst.directives.admonitions import Directive +#from docutils.parsers.rst.directives.admonitions import make_admonition + +class question_node(nodes.Admonition, nodes.Element): pass +class questionlist(nodes.General, nodes.Element): pass + +def make_admonition(node_class, name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + if not content: + error = state_machine.reporter.error( + 'The "%s" admonition is empty; content required.' % (name), + nodes.literal_block(block_text, block_text), line=lineno) + return [error] + text = '\n'.join(content) + admonition_node = node_class(text) + if arguments: + title_text = arguments[0] + textnodes, messages = state.inline_text(title_text, lineno) + admonition_node += nodes.title(title_text, '', *textnodes) + admonition_node += messages + if 'class' in options: + classes = options['class'] + else: + classes = ['admonition-' + nodes.make_id(title_text)] + admonition_node['classes'] += classes + state.nested_parse(content, content_offset, admonition_node) + return [admonition_node] + +class Question(Directive): + """ + A question entry, displayed in the form of an admonition. + """ + + has_content = True + required_arguments = 0 + optional_arguments = 1 + final_argument_whitespace = False + option_spec = {'number': int} + + def run(self): + global questno + questno = self.options.get('number', questno) + env = self.state.document.settings.env + targetid = 'index-%s' % env.new_serialno('index') + targetnode = nodes.target('', '', ids=[targetid]) + + self.options['class'] = [_('question')] + ad = make_admonition(question_node, self.name, + [_('Question %d'%questno)], self.options, + self.content, self.lineno, self.content_offset, + self.block_text, self.state, self.state_machine) + questno += 1 + set_source_info(self, ad[0]) + return [targetnode] + ad + + +def process_questions(app, doctree): + # collect all questions in the environment + # this is not done in the directive itself because it some transformations + # must have already been run, e.g. substitutions + env = app.builder.env + if not hasattr(env, 'question_all_questions'): + env.question_all_questions = [] + global qno + for node in doctree.traverse(question_node): + try: + targetnode = node.parent[node.parent.index(node) - 1] + if not isinstance(targetnode, nodes.target): + raise IndexError + except IndexError: + targetnode = None + qno += 1 + env.question_all_questions.append({ + 'docname': env.docname, + 'source': node.source or env.doc2path(env.docname), + 'lineno': node.line, + 'question': node.deepcopy(), + 'questno': qno, + 'target': targetnode, + }) + + +class QuestionList(Directive): + """ + A list of all question entries. + """ + + has_content = False + required_arguments = 0 + optional_arguments = 0 + final_argument_whitespace = False + option_spec = {} + + def run(self): + # Simply insert an empty questionlist node which will be replaced later + # when process_question_nodes is called + return [questionlist('')] + + +def process_question_nodes(app, doctree, fromdocname): +### if not app.config['question_include_questions']: + if False: + for node in doctree.traverse(question_node): + node.parent.remove(node) + + # Replace all questionlist nodes with a list of the collected questions. + # Augment each question with a backlink to the original location. + env = app.builder.env + + if not hasattr(env, 'question_all_questions'): + env.question_all_questions = [] + + for node in doctree.traverse(questionlist): +### if not app.config['question_include_questions']: +# if False: +# node.replace_self([]) +# continue + + content = [] + + for question_info in env.question_all_questions: + qno = question_info['questno'] + para = nodes.paragraph(classes=['question-source']) + description = _('<>') + desc1 = description[:description.find('<<')] + desc2 = description[description.find('>>')+2:] + para += nodes.Text(desc1, desc1) + + # Create a reference + newnode = nodes.reference('', '', internal=True) +### innernode = nodes.emphasis(_('original entry'), _('original entry')) + innernode = nodes.strong(_('Question %d'%qno), _('Question %d'%qno)) + try: + newnode['refuri'] = app.builder.get_relative_uri( + fromdocname, question_info['docname']) + newnode['refuri'] += '#' + question_info['target']['refid'] + except NoUri: + # ignore if no URI can be determined, e.g. for LaTeX output + pass + newnode.append(innernode) + para += newnode + para += nodes.Text(desc2, desc2) + + # (Recursively) resolve references in the question content + question_entry = question_info['question'] + env.resolve_references(question_entry, question_info['docname'], + app.builder) + + # Insert into the questionlist +### content.append(question_entry) + content.append(para) + + node.replace_self(content) + + +def purge_questions(app, env, docname): + if not hasattr(env, 'question_all_questions'): + return + env.question_all_questions = [question for question in env.question_all_questions + if question['docname'] != docname] + + +def visit_question_node(self, node): + self.visit_admonition(node) + +def depart_question_node(self, node): + self.depart_admonition(node) + +def setup(app): + app.add_config_value('question_include_questions', False, False) + + app.add_node(questionlist) + app.add_node(question_node, + html=(visit_question_node, depart_question_node), + latex=(visit_question_node, depart_question_node), + text=(visit_question_node, depart_question_node), + man=(visit_question_node, depart_question_node), + texinfo=(visit_question_node, depart_question_node)) + + app.add_directive('question', Question) + app.add_directive('questionlist', QuestionList) + app.connect('doctree-read', process_questions) + app.connect('doctree-resolved', process_question_nodes) + app.connect('env-purge-doc', purge_questions) + diff --git a/algo/algofundoc/fil_conducteur.txt b/algo/algofundoc/fil_conducteur.txt new file mode 100644 index 0000000..9716092 --- /dev/null +++ b/algo/algofundoc/fil_conducteur.txt @@ -0,0 +1,34 @@ +Fil conducteur : 1er tour des élections présidentielles 2017 +============================================================= + +Le fil conducteur sera l’exploitation de données issues du 1er tour des élections présidentielles qui ont eu lieu en France le 23 avril 2017. + +Les données dont on dispose sont les résultats par canton (plus de 2000 cantons). Pour chaque canton sont donnés + +- le nombre d’inscrits +- le nombre de votants +- le nombre de bulletins nuls +- le nombre de bulletins blancs +- le nombre de voix obtenus par chacun des candidats. + +L’objectif est d’établir + +- les résultats au niveau national +- la participation + +.. figure:: images/participation_globale.png + :width: 650 + :alt: Participation globale + +- le scores des candidats + +.. figure:: images/scores_1er_tour.png + :width: 650 + :alt: Score des candidats + + +Ce sera l'occasion de découvrir : + +* les structures itérables, en particulier les tuples et dictionnaires +* la lecture et l'écriture de données dans des fichiers +* des algorithmes de tris et de recherche. diff --git a/algo/algofundoc/images/participation_globale.png b/algo/algofundoc/images/participation_globale.png new file mode 100644 index 0000000000000000000000000000000000000000..a84385af8bb43fca769843ae2dccbe7ed6e6a640 GIT binary patch literal 28286 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 Ae*gdg literal 0 HcmV?d00001 diff --git a/algo/algofundoc/images/scores_1er_tour.png b/algo/algofundoc/images/scores_1er_tour.png new file mode 100644 index 0000000000000000000000000000000000000000..d2450b4bbfdc21eccfc341ed959349d79e47a1c3 GIT binary patch literal 22928 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 literal 0 HcmV?d00001 diff --git a/algo/algofundoc/index.txt b/algo/algofundoc/index.txt new file mode 100644 index 0000000..092c14e --- /dev/null +++ b/algo/algofundoc/index.txt @@ -0,0 +1,36 @@ +.. default-role:: literal + +.. meta:: + + :description: algo tutorial + :keywords: algorithm, python, tutorial + +.. title:: algofundoc + +Algo Fun +========== + +.. toctree:: + :maxdepth: 1 + + programmation + liens + MachineLearning + pandas + +Indices and tables +================== + +* `All modules for which code is available <_modules/index.html>`_ +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +.. note:: The pyfun code is licensed under the `LGPL licence`_ + and this documentation is licensed under the `Creative Commons + Attribution-ShareAlike 3.0 Unported License`_\ . + + +.. _`Creative Commons Attribution-ShareAlike 3.0 Unported License`: http://creativecommons.org/licenses/by-sa/3.0/deed.en_US + +.. _`LGPL licence`: http://www.gnu.org/licenses/lgpl.html diff --git a/algo/algofundoc/liens.txt b/algo/algofundoc/liens.txt new file mode 100644 index 0000000..1000a92 --- /dev/null +++ b/algo/algofundoc/liens.txt @@ -0,0 +1,16 @@ +Liens utiles +============= + +- random_ datas +- pandas_ +- ploting_ +- machine_ learning +- making_ a machine learning +- data_ science + +.. _making: https://machinelearningmastery.com/machine-learning-in-python-step-by-step/ +.. _data: https://realpython.com/tutorials/data-science/ +.. _machine: https://realpython.com/tutorials/machine-learning/ +.. _ploting: https://realpython.com/python-histograms/?__s=o2w1az6ypdj7ogdsnqwf +.. _random: https://realpython.com/python-random/?__s=o2w1az6ypdj7ogdsnqwf +.. _pandas: https://realpython.com/fast-flexible-pandas/?__s=o2w1az6ypdj7ogdsnqwf diff --git a/algo/algofundoc/notebooks/Pandas.ipynb b/algo/algofundoc/notebooks/Pandas.ipynb new file mode 100644 index 0000000..78467d2 --- /dev/null +++ b/algo/algofundoc/notebooks/Pandas.ipynb @@ -0,0 +1,229 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The **import** keyword is used to import a library" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6.123233995736766e-17\n" + ] + } + ], + "source": [ + "import math\n", + "print(math.cos(math.pi / 2))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pandas\n", + "=======" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col1col2col3col4
line1-0.8821252.1764520.163955-0.618232
line2-0.7215380.0355780.1800721.015987
line3-1.1623550.384632-0.6740920.162693
line4-1.399455-0.6985120.0394200.898408
line51.755342-0.073242-1.502503-0.586194
\n", + "
" + ], + "text/plain": [ + " col1 col2 col3 col4\n", + "line1 -0.882125 2.176452 0.163955 -0.618232\n", + "line2 -0.721538 0.035578 0.180072 1.015987\n", + "line3 -1.162355 0.384632 -0.674092 0.162693\n", + "line4 -1.399455 -0.698512 0.039420 0.898408\n", + "line5 1.755342 -0.073242 -1.502503 -0.586194" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy\n", + "import pandas\n", + "rows = ['line1', 'line2', 'line3', 'line4', 'line5']\n", + "cols = ['col1', 'col2', 'col3', 'col4']\n", + "from IPython.display import display\n", + "dataframe = pandas.DataFrame(numpy.random.randn(5,4), index=rows, columns=cols)\n", + "display(dataframe)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "reorganise a **dataframe** from datas as a dictionary with tuples as keys\n", + "-----------------------------------------------------------------------------------------------------" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Column 1Column 2Column 3
0CeriseLanister14
1PaulDurand13
2PierreDupont16
3johnSnow12
\n", + "
" + ], + "text/plain": [ + " Column 1 Column 2 Column 3\n", + "0 Cerise Lanister 14\n", + "1 Paul Durand 13\n", + "2 Pierre Dupont 16\n", + "3 john Snow 12" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dico = {('john', 'Snow') : 12, ('Paul', 'Durand') : 13, (\"Pierre\", \"Dupont\") : 16, (\"Cerise\", \"Lanister\") : 14}\n", + "import pandas\n", + "df = pandas.Series(dico).reset_index()\n", + "df.columns = ['Column 1', 'Column 2', 'Column 3']\n", + "from IPython.display import display\n", + "display(df)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/algo/algofundoc/pandas.txt b/algo/algofundoc/pandas.txt new file mode 100644 index 0000000..f875406 --- /dev/null +++ b/algo/algofundoc/pandas.txt @@ -0,0 +1,14 @@ +pandas +========== + +**examples** in the jupyter_ notebooks + +.. _jupyter: http://jupyter.org/ + +ipython and pandas:: + + jupyter notebook Pandas.ipynb + +.. toctree:: + + notebooks/Pandas.ipynb diff --git a/algo/algofundoc/programmation.txt b/algo/algofundoc/programmation.txt new file mode 100644 index 0000000..be466c4 --- /dev/null +++ b/algo/algofundoc/programmation.txt @@ -0,0 +1,61 @@ +============================== +Algorithmes et Programmation +============================== + +----- +Cours +----- + +.. toctree:: + :maxdepth: 1 + + fil_conducteur + + +- Structures de données séquentielles +- Ensembles et dictionnaires +- Algorithmes de recherche +- Les fichiers +- Algorithmes de tri + + + +---- +TP +---- + +.. toctree:: + :maxdepth: 1 + + + + +- Tester avec doctest +- Listes +- Gestion d’une promotion d’étudiants +- Anagrammes +- Analyse d’un fichier texte +- Évaluation empirique des tris + + + + + +----------------- +Documents annexes +----------------- + +.. toctree:: + :maxdepth: 1 + + +Bibliographie +------------- + +* Apprendre à programmer avec Python 3, Gérard Swinnen, editions Eyrolles (Chapitres 1 à 7, et chapitre 10 en partie). `Version électronique téléchargeable `_. + +* `Site officiel du langage Python `_. + +* `Documentation officielle de la version 3.5 de Python `_. + +* `Site officiel de Thonny `_. diff --git a/algo/algofundoc/src/__init__.py b/algo/algofundoc/src/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/algo/algofundoc/src/__init__.py @@ -0,0 +1 @@ + diff --git a/algo/algofundoc/src/assignment.py b/algo/algofundoc/src/assignment.py new file mode 100644 index 0000000..608de7a --- /dev/null +++ b/algo/algofundoc/src/assignment.py @@ -0,0 +1,10 @@ + """declare a variable add 5 to it and print its value""" + +x = 4 +# add 5 to this variable +x = x + 5 +print(x) +# 9 + + + diff --git a/algo/algofundoc/src/data/ball.gif b/algo/algofundoc/src/data/ball.gif new file mode 100644 index 0000000000000000000000000000000000000000..bbc4a95fe883abaa4ad009669fc2d0f8c367aaf9 GIT binary patch literal 5015 zcmeHK_g52Guud-^5b0GzkrrL)2w3P+TsKCkf(C*jMT#IT=%zseLtPBz>Y&c@6SR`gM#WJ~6BoGOBG69Fj<9YLBQmJ?oY?+cH61lNO zvQ3RhV9Jq3iWMTUR3MYH#hYB2B$6pN{iX7Cx!|WX>8Hs1ry%I32=`OQT$d78c(`=| zZbg)|!V6jvWvqyqN=}em#8$9_q+*VY?JX0~q&%XG86;)8Z6=m-k_0>so6Q!p31ViX zjExi1+&FBSi0CF@X9#FP99j}D!;Q^k(`Ynyk~b%5lM|UVB9X~v6O)((Hx4l}DI-4+H{o!D`wtb^_ah$;Ayp*% zr?2JMzkqVDShA99SAG8uFmbAp^sh}rwYA3%r^&BJ^L>t(JO9A02OxEvtd{o5Z$Y;h zIK@dM5)c^zf9rqmUA=W`!4NVPdm$s^xe%$pfwv~={lzp7XKbIQp1g8$`7b-^4n8P8vzA7f4Tm zUGm2*FAz!-B4APZ&qhPd4vjBS%!Q#ARS{h-R@K+izeo_8!nEb)lV4#{Jxa>r9FG{8 z@Uq4KFsh@qO)-Oq@4P1TMr>43^7sIVdf_n`r!hhs$@fAh)x$Z4?d59IZpuV0Cw+3~ z-66v_e~3yuysi%n9RpPaeCbf~j4a%fJF*_m;Hl#iShD(Ln=0n!Nn3-$TFy|Mcim#N z^gS|jqQCaafzN-YHXN{=<8HB8X88;tdQqVId$B68!G?=*AeCt|(XN{|Q3mm?SuO4< z{oA#hN5)|0oD|ir6rtbs*nHrk-=|wp%cA?I(XWKY+mSY{qq?eo>K5>`4!1P-)RXlI z%#VH#?T$umyP!v%z+c_y`Mg{vRn)$P*lL&f-p5xAz8&`IMu7}YF`7T?@BS^0f*g$1 zajwT4%j5GeeKtzi==xDwB9f@_?Pz1}JGZ(_`#2`~&l332{s!9OT|0313$fYrmDf?6 zp}gSPk5|SD=hnc5Wrv_zhm1@6#^bq1V1|h$z<%FUk9`lHVs7HI5QE2OhhsKY=iDS0 z^*YxeOP2?4Yx1w8Fj z*g0&`B)g58^!Uy1UkfEmy7r`G_;=sbl9|-OC$?b`??cWLhE7RESnkpHAb`0 zUoDB9dWJsIPIcxVxuh1@qI$*?SLxi?N^7RLU*X)k8c_mkZ*qo7Hz-(;gA%{9UG@W~?T%2EWXGm$|aD)m9mC zuhi1C=?9w^u!f|QdeY&0x%K1zRa68wxcPeVb88cKuefbmEiP=bN{c6SyRIg4jY&Ni zWW%qMW`bC7;tI((mXhnvTgY6ohz% z-lz|cyIRq3VBXs4US8-wb=B$_%V&+3)99`X!2S<@@6W+O;H}(+em~axOhF>ez<;V) z^!UAddHbW;;t<$D&zIPHvvZ#sUDb0XRN6-_e0^yBmSzvti{eQ!T*!uY%vV72#|@f)%RtY~-(`$JS_M``W@3`jHC zW5Muh#rSVMf|AJ{CvsIDOI_Ym%X;rF8h;x`|5^h)k&ULA(fZQdIPW(uA9S6Y9=KPw zOZ_Q3`a3w@yJuK^1B?cwpVgd;}R4FJ3@|GI@$1}&yERoxPk}Tlf39PPMq#dmU zXZ;u6ol^Ix8FqdGNQ| z+|fiOhLP3#4Mn$uc(tWbZJ7OciK1R<1OHvRAF9M@>b3QTO&y5ovb!$ZGK>F;grIjD zJuj-+gWz~9nc-KtL)!7O`>ySKpF5SfBukzg4ovYVdm_z0oYftD{jHC6>~qJym6}dr z7}fnjfkP&{4<{0_G6G9%?LdwfB0uD59-r^@U+dU@k>Ph}5PsOCTc`EwZx1zRNk}^&io~k?0_+v|Q`?1zalc)4Y zMosf%Yls)#uHeo;I`Aro`hixBU4v(fiaiKTPe>cEe21@gjjMZ8&E?nWH=8cb6aye$ zmY;J5ZHIAU5AF>2d~fLmRb0DfO>33phj6m&ZKzA$&?vmEH>Jl z44VknZi5%U*qwzmL`nr{kIji9Mxm4eE zztA4IcIZXF9Ma#X5wF{6XETF6u;2|fa6ycNR?ubZ`HzgFefAfQ0(VXAG=%3zk3kM& zPmMgLw}z6GRtO5C@bc}=7J#vNQ5a1IHhyHpkR78PoVJhcmB21m^N_lsXF94V!PWWH zzKg(rNs-vV>W4ZP9W+bt7qg}fn74Lp$6_aA&lb1RJCDKBNbvlHQ@=BEDF2m6!i&Ko zi<&M5EuCpz4xH%IPXpPp%`O}j6-4_UxJN5_VjVNLsT9T|$_oz#1P*y`4|dSs96HN2 zrLoV@UN|dNY>_zbJiVgmR4;ODv1srNjlnI0Z)Iu(>;}1+eU4#el6R=FKy157 zp9#puM(qnN=f@+Odp633$7p-;nCaNk=o{K-gUe+Mi<7JS5TD3YHl#*~tRICp_La2j zA&8$-4BRUEZi8lUCjV)gc;vE1>_K@gcCXIa#aA6K$b{cnJmFTAczPz8fvP~-SM)*- znv*Li>7euWy66slH6g$>&AtoaQj5T8*~AR!7gI^)4&!Beu=bDb0Sr@JqsygHEr7qw za=Ue%EcKwV;}H#h<;^u!w1^sB4tUS4;>?7~uo=K^l(T0-kr!dlBp7$LvQ{gLQoNp^ zSgyT%(|6lt;H7@kSLLN9o=nA5Wktu{V<;#G9rj0U$;GitcXR{4hl48~Z5uE!;o8?- z>etUU06pJ8*uLl2u>+y#(ckJT*^E2v0&IN}vNH9hDb&;aabTS|P|wAzlwV{QuM6F< z2(CfaG*81P$NjM#5Jrd5Iiz9F)}|{4x@|N2svkB)>N{1VanBQ?0y;`2vdSA0f?vO? zdiN1Dl~5@z;>M7He*rmK`fQ7%5FZPi^l|9-SIKs@&4!VTl&N2#W_7ScZfk_zUw- z<8bp8vplWKrj~jml~pxh6ErgCYSS;X^a+1N9t?5H&@JAuVIUnC1Js$CX*>S_pe@aY*=(JD;=mv;qe)9xD7NN(Cb!Rv_c1_)|@{EM$!=l-S8Um1ZV+R1fSE_DEYBeeK|FR`)LPShPc z7!;Flhxk3MF$J#GGeLVwHN@HqlfN1|uY#r%TLxd)y0W0(kNTc)uRhPdvD0UQPw2LG`+_kmWd*jch88*(|FwN6?W2zr9 z>&;p?U_B=|2ZiUe;CGggzZ}<=-J$iE>q7&D;yisT?Cy*!9;<#n7$qlmm7g#8oU z7-ASjMGxu;%*^FmBr>~jMQ0uzh{az^gTk{U38W9A<79B42eaxKAft$@>S@xRXTKAG zq$c?auEJ7AVZ?>wd7-^+Kw?i_Z}?V0yvNl9j4J{IZ1RMC|J1G48I{d~ztM>}IH#L4 zO0#z6njfiTerZ!**tTWDuI`)rA4mIaFpcNA$o|eMQ}4(_i~+}uBdie*-KnjX{Aup^ zpM%1Y!4qF$^=T0tT{8$7OehR10}QGFET(gLvo{(bP~@jNmjcYt&D*eSv`RYm#KV#y zu>I-mHN<{*t(KyOQKH8mM#$I&sKxF6Z+|0G@BxcEB*^9=f`5ASFz|IBAZ+Wk`C!-h z4|__@y*-16Jpj#3IpMDW{Jvw0O>#NPd>l#PwdW!P4I~|U$ z?9Biv9+-^Q7ppV>dX^;eeF-~4LOM!s`FuzD_JDC%XtFmZdkUb#s#dG(-(fr?r~b-G zL!RY&g(e4Nutv3-hr`k2IeX)_FFRfkq#Ifu91M(>%!Kf%NPnw4x@0hp1dhZ)gGrF> zEYNm45b^Gv{eKH%(a5uVA;;3(3zEms_Q=qMLx=E?02a)}4rI=PZoTGmc>%^|!IDq` zl(>M#YdR0&zyTykB@0%ShK&0#(Y9ru`v(pF3y3J+Bz*xg&P0OBk+mN*XvXk6dnc!& LCL@ed0FVCxQs}HF literal 0 HcmV?d00001 diff --git a/algo/algofundoc/src/data/iris.data b/algo/algofundoc/src/data/iris.data new file mode 100644 index 0000000..5c4316c --- /dev/null +++ b/algo/algofundoc/src/data/iris.data @@ -0,0 +1,151 @@ +5.1,3.5,1.4,0.2,Iris-setosa +4.9,3.0,1.4,0.2,Iris-setosa +4.7,3.2,1.3,0.2,Iris-setosa +4.6,3.1,1.5,0.2,Iris-setosa +5.0,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5.0,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +4.8,3.0,1.4,0.1,Iris-setosa +4.3,3.0,1.1,0.1,Iris-setosa +5.8,4.0,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +5.7,3.8,1.7,0.3,Iris-setosa +5.1,3.8,1.5,0.3,Iris-setosa +5.4,3.4,1.7,0.2,Iris-setosa +5.1,3.7,1.5,0.4,Iris-setosa +4.6,3.6,1.0,0.2,Iris-setosa +5.1,3.3,1.7,0.5,Iris-setosa +4.8,3.4,1.9,0.2,Iris-setosa +5.0,3.0,1.6,0.2,Iris-setosa +5.0,3.4,1.6,0.4,Iris-setosa +5.2,3.5,1.5,0.2,Iris-setosa +5.2,3.4,1.4,0.2,Iris-setosa +4.7,3.2,1.6,0.2,Iris-setosa +4.8,3.1,1.6,0.2,Iris-setosa +5.4,3.4,1.5,0.4,Iris-setosa +5.2,4.1,1.5,0.1,Iris-setosa +5.5,4.2,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.0,3.2,1.2,0.2,Iris-setosa +5.5,3.5,1.3,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +4.4,3.0,1.3,0.2,Iris-setosa +5.1,3.4,1.5,0.2,Iris-setosa +5.0,3.5,1.3,0.3,Iris-setosa +4.5,2.3,1.3,0.3,Iris-setosa +4.4,3.2,1.3,0.2,Iris-setosa +5.0,3.5,1.6,0.6,Iris-setosa +5.1,3.8,1.9,0.4,Iris-setosa +4.8,3.0,1.4,0.3,Iris-setosa +5.1,3.8,1.6,0.2,Iris-setosa +4.6,3.2,1.4,0.2,Iris-setosa +5.3,3.7,1.5,0.2,Iris-setosa +5.0,3.3,1.4,0.2,Iris-setosa +7.0,3.2,4.7,1.4,Iris-versicolor +6.4,3.2,4.5,1.5,Iris-versicolor +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4.0,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1.0,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +5.0,2.0,3.5,1.0,Iris-versicolor +5.9,3.0,4.2,1.5,Iris-versicolor +6.0,2.2,4.0,1.0,Iris-versicolor +6.1,2.9,4.7,1.4,Iris-versicolor +5.6,2.9,3.6,1.3,Iris-versicolor +6.7,3.1,4.4,1.4,Iris-versicolor +5.6,3.0,4.5,1.5,Iris-versicolor +5.8,2.7,4.1,1.0,Iris-versicolor +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4.0,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +6.6,3.0,4.4,1.4,Iris-versicolor +6.8,2.8,4.8,1.4,Iris-versicolor +6.7,3.0,5.0,1.7,Iris-versicolor +6.0,2.9,4.5,1.5,Iris-versicolor +5.7,2.6,3.5,1.0,Iris-versicolor +5.5,2.4,3.8,1.1,Iris-versicolor +5.5,2.4,3.7,1.0,Iris-versicolor +5.8,2.7,3.9,1.2,Iris-versicolor +6.0,2.7,5.1,1.6,Iris-versicolor +5.4,3.0,4.5,1.5,Iris-versicolor +6.0,3.4,4.5,1.6,Iris-versicolor +6.7,3.1,4.7,1.5,Iris-versicolor +6.3,2.3,4.4,1.3,Iris-versicolor +5.6,3.0,4.1,1.3,Iris-versicolor +5.5,2.5,4.0,1.3,Iris-versicolor +5.5,2.6,4.4,1.2,Iris-versicolor +6.1,3.0,4.6,1.4,Iris-versicolor +5.8,2.6,4.0,1.2,Iris-versicolor +5.0,2.3,3.3,1.0,Iris-versicolor +5.6,2.7,4.2,1.3,Iris-versicolor +5.7,3.0,4.2,1.2,Iris-versicolor +5.7,2.9,4.2,1.3,Iris-versicolor +6.2,2.9,4.3,1.3,Iris-versicolor +5.1,2.5,3.0,1.1,Iris-versicolor +5.7,2.8,4.1,1.3,Iris-versicolor +6.3,3.3,6.0,2.5,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +7.1,3.0,5.9,2.1,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +6.5,3.0,5.8,2.2,Iris-virginica +7.6,3.0,6.6,2.1,Iris-virginica +4.9,2.5,4.5,1.7,Iris-virginica +7.3,2.9,6.3,1.8,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +7.2,3.6,6.1,2.5,Iris-virginica +6.5,3.2,5.1,2.0,Iris-virginica +6.4,2.7,5.3,1.9,Iris-virginica +6.8,3.0,5.5,2.1,Iris-virginica +5.7,2.5,5.0,2.0,Iris-virginica +5.8,2.8,5.1,2.4,Iris-virginica +6.4,3.2,5.3,2.3,Iris-virginica +6.5,3.0,5.5,1.8,Iris-virginica +7.7,3.8,6.7,2.2,Iris-virginica +7.7,2.6,6.9,2.3,Iris-virginica +6.0,2.2,5.0,1.5,Iris-virginica +6.9,3.2,5.7,2.3,Iris-virginica +5.6,2.8,4.9,2.0,Iris-virginica +7.7,2.8,6.7,2.0,Iris-virginica +6.3,2.7,4.9,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +7.2,3.2,6.0,1.8,Iris-virginica +6.2,2.8,4.8,1.8,Iris-virginica +6.1,3.0,4.9,1.8,Iris-virginica +6.4,2.8,5.6,2.1,Iris-virginica +7.2,3.0,5.8,1.6,Iris-virginica +7.4,2.8,6.1,1.9,Iris-virginica +7.9,3.8,6.4,2.0,Iris-virginica +6.4,2.8,5.6,2.2,Iris-virginica +6.3,2.8,5.1,1.5,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3.0,6.1,2.3,Iris-virginica +6.3,3.4,5.6,2.4,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6.0,3.0,4.8,1.8,Iris-virginica +6.9,3.1,5.4,2.1,Iris-virginica +6.7,3.1,5.6,2.4,Iris-virginica +6.9,3.1,5.1,2.3,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +6.7,3.3,5.7,2.5,Iris-virginica +6.7,3.0,5.2,2.3,Iris-virginica +6.3,2.5,5.0,1.9,Iris-virginica +6.5,3.0,5.2,2.0,Iris-virginica +6.2,3.4,5.4,2.3,Iris-virginica +5.9,3.0,5.1,1.8,Iris-virginica + diff --git a/algo/algofundoc/src/dicttype.py b/algo/algofundoc/src/dicttype.py new file mode 100644 index 0000000..3c5cc24 --- /dev/null +++ b/algo/algofundoc/src/dicttype.py @@ -0,0 +1,52 @@ +# # The get() method on dicts +# # and its "default" argument +# +# name_for_userid = { +# 382: "Alice", +# 590: "Bob", +# 951: "Dilbert", +# } +# +# def greeting(userid): +# return "Hi %s!" % name_for_userid.get(userid, "there") +# +# greeting(382) +# # "Hi Alice!" +# +# greeting(333333) +# #"Hi there!" +# +# # ___________________________________________________________________ +# +# # How to sort a Python dict by value +# # (== get a representation sorted by value) +# +# xs = {'a': 4, 'b': 3, 'c': 2, 'd': 1} +# +# sorted(xs.items(), key=lambda x: x[1]) +# [('d', 1), ('c', 2), ('b', 3), ('a', 4)] +# +# # Or: +# +# import operator +# sorted(xs.items(), key=operator.itemgetter(1)) +# [('d', 1), ('c', 2), ('b', 3), ('a', 4)] +# +# # ___________________________________________________________________ +# +# # How to merge two dictionaries +# # in Python 3.5+ +# +# x = {'a': 1, 'b': 2} +# y = {'b': 3, 'c': 4} +# +# z = {**x, **y} +# +# z +# #{'c': 4, 'a': 1, 'b': 3} +# +# # In Python 2.x you could +# # use this: +# z = dict(x, **y) +# z +# #{'a': 1, 'c': 4, 'b': 3} diff --git a/algo/algofundoc/src/duration.py b/algo/algofundoc/src/duration.py new file mode 100644 index 0000000..4263664 --- /dev/null +++ b/algo/algofundoc/src/duration.py @@ -0,0 +1,18 @@ +"""The "timeit" module lets you measure the execution +time of small bits of Python code""" + +import timeit +timeit.timeit('"-".join(str(n) for n in range(100))', + number=10000) + +# 0.3412662749997253 + +timeit.timeit('"-".join([str(n) for n in range(100)])', + number=10000) + +# 0.2996307989997149 + +timeit.timeit('"-".join(map(str, range(100)))', + number=10000) + +# 0.24581470699922647 diff --git a/algo/algofundoc/src/hellopygame.py b/algo/algofundoc/src/hellopygame.py new file mode 100644 index 0000000..b0c59fc --- /dev/null +++ b/algo/algofundoc/src/hellopygame.py @@ -0,0 +1,25 @@ +import sys, pygame +pygame.init() + +size = width, height = 620, 840 +speed = [2, 2] +black = 0, 0, 0 + +screen = pygame.display.set_mode(size) + +ball = pygame.image.load("data/ball.gif") +ballrect = ball.get_rect() + +while 1: + for event in pygame.event.get(): + if event.type == pygame.QUIT: sys.exit() + + ballrect = ballrect.move(speed) + if ballrect.left < 0 or ballrect.right > width: + speed[0] = -speed[0] + if ballrect.top < 0 or ballrect.bottom > height: + speed[1] = -speed[1] + + screen.fill(black) + screen.blit(ball, ballrect) + pygame.display.flip() diff --git a/algo/algofundoc/src/json_reader.py b/algo/algofundoc/src/json_reader.py new file mode 100644 index 0000000..74086c1 --- /dev/null +++ b/algo/algofundoc/src/json_reader.py @@ -0,0 +1,35 @@ +"""Fetches json data and prints it nicely with pprint +""" + +from sys import exit +from pprint import pprint +from json import loads +from urllib.request import urlopen +from urllib.error import HTTPError + +json_url = "http://webservices-v2.crous-mobile.fr:8080/feed/dijon/externe/crous-dijon.min.jsonsdf" + +def retrieve_json(json_url): + """ + Retrieves and pretty prints indented json from a given url + + :param str json_url: full url of the json file + :return: None + :rtype: str + :raises IOError: if the json cannot be retrieved + """ + try: + with urlopen(json_url) as resp: + contents = resp.read().decode() + pprint(loads(contents)) + except HTTPError as e: + raise e + except: + raise IOError("The json {0} cannot be retrieved".format(json_url)) + +if __name__ == "__main__": + try: + retrieve_json(json_url) + except Exception as e: + print(e) + exit(1) diff --git a/algo/algofundoc/src/jsonprint.py b/algo/algofundoc/src/jsonprint.py new file mode 100644 index 0000000..a76181d --- /dev/null +++ b/algo/algofundoc/src/jsonprint.py @@ -0,0 +1,16 @@ +# The standard string repr for dicts is hard to read: +my_mapping = {'a': 23, 'b': 42, 'c': 0xc0ffee} + +# The "json" module can do a much better job: +import json +print(json.dumps(my_mapping, indent=4, sort_keys=True)) +{ + "a": 23, + "b": 42, + "c": 12648430 +} + +# Note this only works with dicts containing +# primitive types (check out the "pprint" module): +#json.dumps({all: 'yup'}) +#TypeError: keys must be a string diff --git a/algo/algofundoc/src/machinelearning.py b/algo/algofundoc/src/machinelearning.py new file mode 100644 index 0000000..a648277 --- /dev/null +++ b/algo/algofundoc/src/machinelearning.py @@ -0,0 +1,42 @@ +import pandas +from pandas.plotting import scatter_matrix +import matplotlib.pyplot as plt +from sklearn import model_selection +from sklearn.metrics import classification_report +from sklearn.metrics import confusion_matrix +from sklearn.metrics import accuracy_score +from sklearn.linear_model import LogisticRegression +from sklearn.tree import DecisionTreeClassifier +from sklearn.neighbors import KNeighborsClassifier +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis +from sklearn.naive_bayes import GaussianNB +from sklearn.svm import SVC + +# Load dataset +#url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data" +names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class'] +#dataset = pandas.read_csv(url, names=names) +dataset = pandas.read_csv("./data/iris.data", names=names) + +print("shape") +print(dataset.shape) + +print("head") +# head +print(dataset.head(20)) + +print("descriptions") +print(dataset.describe()) + +# class distribution +print(dataset.groupby('class').size()) + + +# box and whisker plots +dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False) +plt.show() + + +# scatter plot matrix +scatter_matrix(dataset) +plt.show() diff --git a/algo/algofundoc/src/namedtuple.py b/algo/algofundoc/src/namedtuple.py new file mode 100644 index 0000000..148603b --- /dev/null +++ b/algo/algofundoc/src/namedtuple.py @@ -0,0 +1,20 @@ +# Why Python is Great: Namedtuples +# Using namedtuple is way shorter than +# defining a class manually: +from collections import namedtuple +Car = namedtuple('Car', 'color mileage') + +# Our new "Car" class works as expected: +my_car = Car('red', 3812.4) +my_car.color +#'red' +my_car.mileage +#3812.4 + +# We get a nice string repr for free: +my_car +#Car(color='red' , mileage=3812.4) + +# Like tuples, namedtuples are immutable: +#my_car.color = 'blue' +#AttributeError: "can't set attribute" diff --git a/algo/algofundoc/src/pygame.py b/algo/algofundoc/src/pygame.py new file mode 100644 index 0000000..b4b3f71 --- /dev/null +++ b/algo/algofundoc/src/pygame.py @@ -0,0 +1,65 @@ +import pygame, sys +from pygame.locals import * + +# Set up pygame. +pygame.init() + +# Set up the window. +windowSurface = pygame.display.set_mode((500, 400), 0, 32) +pygame.display.set_caption('Hello world!') + +# Set up the colors. +BLACK = (0, 0, 0) +WHITE = (255, 255, 255) +RED = (255, 0, 0) +GREEN = (0, 255, 0) +BLUE = (0, 0, 255) + +# Set up the fonts. +basicFont = pygame.font.SysFont(None, 48) + +# Set up the text. +text = basicFont.render('Hello world!', True, WHITE, BLUE) +textRect = text.get_rect() +textRect.centerx = windowSurface.get_rect().centerx +textRect.centery = windowSurface.get_rect().centery + +# Draw the white background onto the surface. +windowSurface.fill(WHITE) + +# Draw a green polygon onto the surface. +pygame.draw.polygon(windowSurface, GREEN, ((146, 0), (291, 106), + (236, 277), (56, 277), (0, 106))) + +# Draw some blue lines onto the surface. +pygame.draw.line(windowSurface, BLUE, (60, 60), (120, 60), 4) +pygame.draw.line(windowSurface, BLUE, (120, 60), (60, 120)) +pygame.draw.line(windowSurface, BLUE, (60, 120), (120, 120), 4) + +# Draw a blue circle onto the surface. +pygame.draw.circle(windowSurface, BLUE, (300, 50), 20, 0) + +# Draw a red ellipse onto the surface. +pygame.draw.ellipse(windowSurface, RED, (300, 250, 40, 80), 1) + +# Draw the text's background rectangle onto the surface. +pygame.draw.rect(windowSurface, RED, (textRect.left - 20, + textRect.top - 20, textRect.width + 40, textRect.height + 40)) + +# Get a pixel array of the surface. +pixArray = pygame.PixelArray(windowSurface) +pixArray[480][380] = BLACK +del pixArray + +# Draw the text onto the surface. +windowSurface.blit(text, textRect) + +# Draw the window onto the screen. +pygame.display.update() + +# Run the game loop. +while True: + for event in pygame.event.get(): + if event.type == QUIT: + pygame.quit() + sys.exit() diff --git a/algo/algofundoc/src/reference.py b/algo/algofundoc/src/reference.py new file mode 100644 index 0000000..dbee722 --- /dev/null +++ b/algo/algofundoc/src/reference.py @@ -0,0 +1,22 @@ +# "is" vs "==" + +>>> a = [1, 2, 3] +>>> b = a + +>>> a is b +True +>>> a == b +True + +>>> c = list(a) + +>>> a == c +True +>>> a is c +False + +# • "is" expressions evaluate to True if two +# variables point to the same object + +# • "==" evaluates to True if the objects +# referred to by the variables are equal diff --git a/algo/algofundoc/src/script.py b/algo/algofundoc/src/script.py new file mode 100644 index 0000000..f3aa3cc --- /dev/null +++ b/algo/algofundoc/src/script.py @@ -0,0 +1,12 @@ +"""This is an example script.""" +import sys + +def greet(name): + """Return greeting.""" + return "Hello {}!".format(name) + +if __name__ == "__main__": + name = sys.argv[1] + print(greet(name)) + + diff --git a/algo/algofundoc/src/server.py b/algo/algofundoc/src/server.py new file mode 100755 index 0000000..fb5408f --- /dev/null +++ b/algo/algofundoc/src/server.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python +# coding: utf-8 + +from flask import Flask, request +import json + +app = Flask(__name__, static_url_path='') + +@app.route('/', methods=['GET']) +def index(): + return app.send_static_file('index.html') + +@app.route('/inscription', methods=['POST']) +def inscription(): + print request.data + sortie = json.dumps({"data":"OK"}) + return sortie + +app.run(host="0.0.0.0", debug=True, port=8080) diff --git a/algo/algofundoc/src/simpledispatch.py b/algo/algofundoc/src/simpledispatch.py new file mode 100644 index 0000000..f67cd53 --- /dev/null +++ b/algo/algofundoc/src/simpledispatch.py @@ -0,0 +1,34 @@ +# Because Python has first-class functions they can +# be used to emulate switch/case statements + +def dispatch_if(operator, x, y): + if operator == 'add': + return x + y + elif operator == 'sub': + return x - y + elif operator == 'mul': + return x * y + elif operator == 'div': + return x / y + else: + return None + +# with a dict factory + +def dispatch_dict(operator, x, y): + return { + 'add': lambda: x + y, + 'sub': lambda: x - y, + 'mul': lambda: x * y, + 'div': lambda: x / y, + }.get(operator, lambda: None)() + + +>>> dispatch_if('mul', 2, 8) +16 + +>>> dispatch_dict('mul', 2, 8) +16 + +>>> dispatch_if('unknown', 2, 8) +None diff --git a/algo/algofundoc/src/testflag.py b/algo/algofundoc/src/testflag.py new file mode 100644 index 0000000..e921c7f --- /dev/null +++ b/algo/algofundoc/src/testflag.py @@ -0,0 +1,17 @@ +# Different ways to test multiple +# flags at once in Python +x, y, z = 0, 1, 0 + +if x == 1 or y == 1 or z == 1: + print('passed') + +if 1 in (x, y, z): + print('passed') + +# These only test for truthiness: +if x or y or z: + print('passed') + +if any((x, y, z)): + print('passed') + diff --git a/algo/algofundoc/src/typetype.py b/algo/algofundoc/src/typetype.py new file mode 100644 index 0000000..b96f8a2 --- /dev/null +++ b/algo/algofundoc/src/typetype.py @@ -0,0 +1,5 @@ +# Python 3.5+ supports 'type annotations' that can be +# used with tools like Mypy to write statically typed Python: + +def my_add(a: int, b: int) -> int: + return a + b diff --git a/algo/algofundoc/src/valswap.py b/algo/algofundoc/src/valswap.py new file mode 100644 index 0000000..f01071c --- /dev/null +++ b/algo/algofundoc/src/valswap.py @@ -0,0 +1,16 @@ +# In-place value swapping + +# Let's say we want to swap +# the values of a and b... +a = 23 +b = 42 + +# The "classic" way to do it +# with a temporary variable: +tmp = a +a = b +b = tmp + +# Python also lets us +# use this short-hand: +a, b = b, a