From 9c4274284f392003782e32cab671071d0173818a Mon Sep 17 00:00:00 2001 From: DarkCat09 Date: Thu, 23 Jun 2022 15:13:56 +0400 Subject: [PATCH] PEP8, mkdocs, corrected logo --- .readthedocs.yaml | 15 - README.md | 2 +- docs/Makefile | 20 - docs/build/.buildinfo | 4 - docs/build/.doctrees/environment.pickle | Bin 88241 -> 0 bytes docs/build/.doctrees/index.doctree | Bin 4978 -> 0 bytes docs/build/.doctrees/modules.doctree | Bin 2736 -> 0 bytes docs/build/.doctrees/python_aternos.doctree | Bin 1020931 -> 0 bytes docs/build/.doctrees/setup.doctree | Bin 2376 -> 0 bytes docs/build/_sources/index.rst.txt | 20 - docs/build/_sources/modules.rst.txt | 8 - docs/build/_sources/python_aternos.rst.txt | 93 - docs/build/_sources/setup.rst.txt | 7 - .../_sphinx_javascript_frameworks_compat.js | 134 - docs/build/_static/alabaster.css | 701 - docs/build/_static/basic.css | 930 -- docs/build/_static/custom.css | 1 - docs/build/_static/doctools.js | 264 - docs/build/_static/documentation_options.js | 14 - docs/build/_static/file.png | Bin 286 -> 0 bytes docs/build/_static/jquery-3.6.0.js | 10881 ---------------- docs/build/_static/jquery.js | 2 - docs/build/_static/language_data.js | 199 - docs/build/_static/minus.png | Bin 90 -> 0 bytes docs/build/_static/plus.png | Bin 90 -> 0 bytes docs/build/_static/pygments.css | 82 - docs/build/_static/searchtools.js | 531 - docs/build/_static/underscore-1.13.1.js | 2042 --- docs/build/_static/underscore.js | 6 - docs/build/genindex.html | 1522 --- docs/build/html/.buildinfo | 4 - docs/build/html/.doctrees/environment.pickle | Bin 18046 -> 0 bytes docs/build/html/.doctrees/index.doctree | Bin 4978 -> 0 bytes docs/build/html/.doctrees/modules.doctree | Bin 2721 -> 0 bytes .../html/.doctrees/python_aternos.doctree | Bin 17539 -> 0 bytes docs/build/html/_sources/index.rst.txt | 20 - docs/build/html/_sources/modules.rst.txt | 7 - .../html/_sources/python_aternos.rst.txt | 93 - .../_sphinx_javascript_frameworks_compat.js | 134 - docs/build/html/_static/alabaster.css | 701 - docs/build/html/_static/basic.css | 930 -- docs/build/html/_static/custom.css | 1 - docs/build/html/_static/doctools.js | 264 - .../html/_static/documentation_options.js | 14 - docs/build/html/_static/file.png | Bin 286 -> 0 bytes docs/build/html/_static/jquery-3.6.0.js | 10881 ---------------- docs/build/html/_static/jquery.js | 2 - docs/build/html/_static/language_data.js | 199 - docs/build/html/_static/minus.png | Bin 90 -> 0 bytes docs/build/html/_static/plus.png | Bin 90 -> 0 bytes docs/build/html/_static/pygments.css | 82 - docs/build/html/_static/searchtools.js | 531 - docs/build/html/_static/underscore-1.13.1.js | 2042 --- docs/build/html/_static/underscore.js | 6 - docs/build/html/genindex.html | 101 - docs/build/html/index.html | 112 - docs/build/html/modules.html | 121 - docs/build/html/objects.inv | 7 - docs/build/html/python_aternos.html | 138 - docs/build/html/search.html | 120 - docs/build/html/searchindex.js | 1 - docs/build/index.html | 112 - docs/build/modules.html | 122 - docs/build/objects.inv | Bin 2560 -> 0 bytes docs/build/py-modindex.html | 166 - docs/build/python_aternos.html | 3426 ----- docs/build/search.html | 120 - docs/build/searchindex.js | 1 - docs/build/setup.html | 102 - docs/howto.md | 1 + docs/index.md | 4 + docs/make.bat | 35 - docs/reference.md | 39 + docs/source/conf.py | 53 - docs/source/index.rst | 20 - docs/source/modules.rst | 8 - docs/source/python_aternos.rst | 93 - docs/source/setup.rst | 7 - examples/console_example.py | 2 + examples/files_example.py | 6 +- examples/websocket_args_example.py | 3 + examples/websocket_example.py | 3 + logo/aternos.xcf | Bin 222306 -> 224975 bytes logo/aternos_400.png | Bin 22336 -> 22246 bytes logo/aternos_800.png | Bin 68410 -> 68362 bytes mkdocs.yml | 13 + python_aternos/__init__.py | 30 +- python_aternos/atclient.py | 322 +- python_aternos/atconf.py | 507 +- python_aternos/atconnect.py | 385 +- python_aternos/aterrors.py | 47 +- python_aternos/atfile.py | 222 +- python_aternos/atfm.py | 227 +- python_aternos/atjsparse.py | 67 +- python_aternos/atplayers.py | 149 +- python_aternos/atserver.py | 516 +- python_aternos/atwss.py | 339 +- setup.py | 74 +- tests/js2py_test.py | 135 +- 99 files changed, 1625 insertions(+), 39720 deletions(-) delete mode 100644 .readthedocs.yaml delete mode 100644 docs/Makefile delete mode 100644 docs/build/.buildinfo delete mode 100644 docs/build/.doctrees/environment.pickle delete mode 100644 docs/build/.doctrees/index.doctree delete mode 100644 docs/build/.doctrees/modules.doctree delete mode 100644 docs/build/.doctrees/python_aternos.doctree delete mode 100644 docs/build/.doctrees/setup.doctree delete mode 100644 docs/build/_sources/index.rst.txt delete mode 100644 docs/build/_sources/modules.rst.txt delete mode 100644 docs/build/_sources/python_aternos.rst.txt delete mode 100644 docs/build/_sources/setup.rst.txt delete mode 100644 docs/build/_static/_sphinx_javascript_frameworks_compat.js delete mode 100644 docs/build/_static/alabaster.css delete mode 100644 docs/build/_static/basic.css delete mode 100644 docs/build/_static/custom.css delete mode 100644 docs/build/_static/doctools.js delete mode 100644 docs/build/_static/documentation_options.js delete mode 100644 docs/build/_static/file.png delete mode 100644 docs/build/_static/jquery-3.6.0.js delete mode 100644 docs/build/_static/jquery.js delete mode 100644 docs/build/_static/language_data.js delete mode 100644 docs/build/_static/minus.png delete mode 100644 docs/build/_static/plus.png delete mode 100644 docs/build/_static/pygments.css delete mode 100644 docs/build/_static/searchtools.js delete mode 100644 docs/build/_static/underscore-1.13.1.js delete mode 100644 docs/build/_static/underscore.js delete mode 100644 docs/build/genindex.html delete mode 100644 docs/build/html/.buildinfo delete mode 100644 docs/build/html/.doctrees/environment.pickle delete mode 100644 docs/build/html/.doctrees/index.doctree delete mode 100644 docs/build/html/.doctrees/modules.doctree delete mode 100644 docs/build/html/.doctrees/python_aternos.doctree delete mode 100644 docs/build/html/_sources/index.rst.txt delete mode 100644 docs/build/html/_sources/modules.rst.txt delete mode 100644 docs/build/html/_sources/python_aternos.rst.txt delete mode 100644 docs/build/html/_static/_sphinx_javascript_frameworks_compat.js delete mode 100644 docs/build/html/_static/alabaster.css delete mode 100644 docs/build/html/_static/basic.css delete mode 100644 docs/build/html/_static/custom.css delete mode 100644 docs/build/html/_static/doctools.js delete mode 100644 docs/build/html/_static/documentation_options.js delete mode 100644 docs/build/html/_static/file.png delete mode 100644 docs/build/html/_static/jquery-3.6.0.js delete mode 100644 docs/build/html/_static/jquery.js delete mode 100644 docs/build/html/_static/language_data.js delete mode 100644 docs/build/html/_static/minus.png delete mode 100644 docs/build/html/_static/plus.png delete mode 100644 docs/build/html/_static/pygments.css delete mode 100644 docs/build/html/_static/searchtools.js delete mode 100644 docs/build/html/_static/underscore-1.13.1.js delete mode 100644 docs/build/html/_static/underscore.js delete mode 100644 docs/build/html/genindex.html delete mode 100644 docs/build/html/index.html delete mode 100644 docs/build/html/modules.html delete mode 100644 docs/build/html/objects.inv delete mode 100644 docs/build/html/python_aternos.html delete mode 100644 docs/build/html/search.html delete mode 100644 docs/build/html/searchindex.js delete mode 100644 docs/build/index.html delete mode 100644 docs/build/modules.html delete mode 100644 docs/build/objects.inv delete mode 100644 docs/build/py-modindex.html delete mode 100644 docs/build/python_aternos.html delete mode 100644 docs/build/search.html delete mode 100644 docs/build/searchindex.js delete mode 100644 docs/build/setup.html create mode 100644 docs/howto.md create mode 100644 docs/index.md delete mode 100644 docs/make.bat create mode 100644 docs/reference.md delete mode 100644 docs/source/conf.py delete mode 100644 docs/source/index.rst delete mode 100644 docs/source/modules.rst delete mode 100644 docs/source/python_aternos.rst delete mode 100644 docs/source/setup.rst create mode 100644 mkdocs.yml diff --git a/.readthedocs.yaml b/.readthedocs.yaml deleted file mode 100644 index e15331e..0000000 --- a/.readthedocs.yaml +++ /dev/null @@ -1,15 +0,0 @@ -# .readthedocs.yaml -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -version: 2 - -build: - os: ubuntu-20.04 - tools: - python: "3.10" - -sphinx: - builder: html - configuration: docs/source/conf.py - fail_on_warning: false diff --git a/README.md b/README.md index a876fc0..d1893d2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Python-Aternos Logo](https://i.ibb.co/60SRKcH/aternos-400.png) +![Python-Aternos Logo](https://i.ibb.co/3RXcXJ1/aternos-400.png) *** # Python Aternos An unofficial Aternos API written in Python. diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index d0c3cbf..0000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = source -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/docs/build/.buildinfo b/docs/build/.buildinfo deleted file mode 100644 index 8d7ff67..0000000 --- a/docs/build/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# 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: 248bf4413f52c61df59cba2c064f51e2 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/.doctrees/environment.pickle b/docs/build/.doctrees/environment.pickle deleted file mode 100644 index bf423ab37c5820212df0f31f0a788e9cf6a3d224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88241 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 diff --git a/docs/build/.doctrees/index.doctree b/docs/build/.doctrees/index.doctree deleted file mode 100644 index 2df261885b671eebbe65ad531fa132cdf7bde347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4978 zcmds5-Hseb6<&Kizx%(A4N+pzxk$V=J2Pt&iDYjO3POSvi-b_3Tv+Xz?wYCcbXT{l zs&{8E5Q&5%FO&o*9VG7H6?g)KkdU~AC*TnfLPFw#ud2IedS70)BN7Y`A_ma(~;y6q_5Z2lv)p39G*beH>zu8tAu(N|wd61! z0Am5N%0mS(m{t%Gr9i~@h9GhAtsQ3Rd@&@!MADJt=}hD3P^H8ItDQ=!s63&0W?Gtz z?TMUq*=@FJI(`M19IIx9#dilRiRmCDauN`I@a`Z0ga?aI8{niG6ek8;gml`MO6TTA z#0AZd8rcvoY$@y0M9d)18mwvEyNAt&<~pLaEpz_^8Ua+)!fElgyGzi1qX5Z{*}wG2 zKR){Hg+qnW_n`X&_7+=ZcaPb<<7`OSS72@SDq!~-K6mi>8a{74$}{#R8-RVkU}t;m z-cie`*0$(RG7;7kD0E{huyXN&Pp)Im_NF@#PqZQM2eo%>s z&cNG6PO3e?E~{JE`_>%aVRxMwIxx$(mu+XZO3izxlB6k>IaxO6w-(I_^V6C6&ArnC z0X?1c77@@>y$Y)?xj}I0D|5d*^fIs^b&w+YS5zOxQM92fGJR(9* zlc9Bq%T+s{yEO;f(=P@#QG3$11KZj#i;!vkh$Fqe?77or#jK|kdWx|>#p#O-9n<8(1$pfu#n~OxuI|d`+W+Qq z?f1+LcZpe5It23Zzh^I{%b>~Osb4RHtK%vZW$qX;8Ki452UC;V&43B`Kugkrse>gvwd zT=3s7?}GnarPw7dc+$MKf)e$zVF52xPp|vn6`1wkSKVIsfo1;ZixR?@lY>{(a|46!$jftO(bd=J)x29 zV!Dh(vt`5V&?$$lG|`!=m>Q-L(qT5nb(=O>+v)_ll*FKPv_zw8l|l~Rk4Jv zKPRP%W?|xE$N<+iifN*#Uq9(k5@`Q~D_%f!%MZD-EfW+eU)ibxg6)}gD5DSpMQaDt zlx+U2@x5)o;S!88w&jI~t+Ws>Uqg#JTLPjxHmZOeF$NGL9;3|vVEeAwOlj)d+K*U7 zD!|Lp=%m0q-fn}#e3faPs>8tmWYsUa&we7ugWTM*obCbO^wDL(J=)DyH0`~4@HXtZ zDM!JQcuSd!f2$IYU?mo^6Ds?h>XEwxVLxCxj&NBA2?|jZ+8)1c?f{dqKMT*90)8>x zottfShM{`uGd^Y!K5hm}EcDk^jM?6Qnjx+g40Y43i=`hW0V!vSI{`yK7{KvGyur%O zgg8CPQuIjnrwBJBlz9LX1t?sMfPpG8?AlbJvf&aRk1cqkgcQ+er^87O%wYTo5yEG9 z0;6cS&dsd=Toa$7Z;O2VY=WuPPQ1^}PB}yZtkI}QYv*Q_ijy4Ol4%#|1n~1E!q}4s2=pg? z{L4(o?%590&FpM)?l#Xe_NpB!8QXV!Ok`%G?nWnf15K#IyoF9dvC&%b6$;cT1s{F} zfZO9?63vj|SYKHp&bT`Z5PXuP(VU);Vh*rkk@8p=ghToXa#u2_IHnNXtQ3KAZ+K9 H4g3EC?i_ke diff --git a/docs/build/.doctrees/modules.doctree b/docs/build/.doctrees/modules.doctree deleted file mode 100644 index ea2cd5231c699078dc43d83941bffb8af0825e00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2736 zcmZuzTWcIQ6n1Ry)qAm>rW6vlgp$Ugwl|bM^zu^LM^itPQUW0e?TmIMtdXXYCSE@T znumlK^cM9e^ndo#+`Q}7uy}NIbS~fd&XNA={Qb{xtNim*n{%O7XEaTfPMHn9pX#K@ zm~!D`c=k5D3CDh5=#|xlNm%e(&`7wDsbMO-3VssRosjmdKHsw}aYC#1IPdT-@4X7g zeBe7yILX$w{3O42T&q*+m{Hn>s0qd0-`Ofg@Spv6p^B-SQ$*kbKkx(6hRk<-w~q9} z?@FOqxG3h-52w`UBI*>r=jbwS z1wQ2u`G`N_JN(H1IO95Fvy__4gu3V7&k|rc+stf+AnmLQZkFk^kj$PLiwr(L-!A6J zxu57P*M&;g@Ts8VTX3usXV^M+_1+gqh(88uU*h)!zo+;;!|$Q*)qapDuri`d@A#qt zl{BEg4;Q{;nJe<}J}^HLDv?FX76LIM?PLBE|C#xIMpr4z9S`TbK#t~RnSt|C>Up^F zT`tlTthn*x+CVGlt0J2-!_siR<%cB+tXA?Gxp`>} zjQPGUHFk1UcX)_VtDDCR#0!Bj6Az z$uY9TD)6qK(86hQEAra{j2fp!mXnrsK(!PI5Y8wnqrqt@0kq1-+TV(D%ZgN!RTlZQ z&sMp%jI5t5DUvwyT3Au>b4pTS>0HJ{>L`0nH}DfbLNXTor}an~*J`90LH^VD1t*r7 zsDtuGYbolzhXK+q!Ow%(QlO1mf`w9K!i8V=pQ624P5=s~kV;CxMo}`Sh&^_O|BO4A z+aG2#i0xT5yw9{*&VqjsHOl~?NgT^i9*1)DAwPZc{9E8TF^lAm`6#(H|5aliok}BL zFPS+L%q>bE==m9UnS`@}qjR)S8s}`^AAyh=X?wFxfY>}Td5<%%_zF;&jL+t0o46+T`h^!39Y8PKT0@7JScqCY(Tk$5T`G3BixjCd^xl0A%Fpo zc!gSk1I<)8jB~;k^E-MXi{zD>R;?JX>-A=MZ4(67Q#CL@?I2H-~1(iVf`Qq+;t9M-vs{h#`4Gb|ALRKAFmgy zJUvbXN*>+AVkL<^+2~bau1hLC1drlob1mEYm#UxK5w_Zc4U2=uYkBB!!#-xKadDVG zxNEE4!7Yu6k>E7~S_HqBXej|Ka=?|*`=yqDMDp*#Z}F8z4f+W0CyRPl4%@-8A>M1n aWy$vHmjWoVjMW;ZakkZCAl|pd{On)kR717^ diff --git a/docs/build/.doctrees/python_aternos.doctree b/docs/build/.doctrees/python_aternos.doctree deleted file mode 100644 index 971a361e8aebc5707d01ed4b7eea9d358a63ff47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1020931 zcmdSC37lm`bwAE9Gd(K|YqJaukFazP%rrY{0|Udbh{Av~EGog_P50}5@6!EV``+tW z*uJvRacWs$2KArElD8uSI*|f2}o**>a`2d$c$)QLRms8uP8?6SeWVnNqbm z|AzT>FQ30c`XNKi%_TLe0l%YitVxy<;AT5s{5AKlIcpdG{0qTN3pfC*lgA- zJLa0uW^Ci)%0vU(vuu32*l0i^TraH_XZY3fiMd(zV+T~RUYf)_bFF2~;uPMRFRv-D zEw3&gQC?ggYMp;lxi(WeX`)!aVZ7Kp`8g+zgLF^gZQVdkJqaq=IEhz|Zi&W?)*H}} zBcH$b+>Y`p-U~vE<^9C(*2-;jJ7#JVbJI{sCaysvi39_+I+@pMOZiA_d-*76aQSEu z?=kT2IQTaV|JFfc$|tf$Y~b0;>!Aiq^#ZMx4fVvLC~l={U@MhG1eo2N5v@H(S-LP< zY>rP?pic|Dm7FN^lgw~pjFHe_We4{T}97qNq`0hv-YTS#^%VCT7iL zFUuOaWWseEI&KND*?6koM&QoAcxQW~0>idBS2x(`*}QrqAf#HgI##$fT?I%7f*ak$ z>1s3oxsItOg0ErV#cH+IELt?!I`!JKk7)v(jTMGj^M^OCFPtqZv%LY#R~jqGEQR5X z8(~~B<{WG-WhLg7X1_|;Y`s++NNag(Q9+CxxKapr>Ifz)v=;4}FWS`bI?%jV&Fv^< z>;8(}Gt*p=bPqFq z9~C0Y&Y&du-fT&Zv{r$pZ2)1gC%5*&im<+9ze~E1%lDM;#UcJ4C9Lwh8D~QaR z)gKU}6KBi8miVcv_BXz&Eyt?ydM!uz>?%Frs?q_hN-*t$Okp@oS76f8M0;}VDB>a) z161Pbn1ce-9Dg)S_Tu8jvAsPdDPB@^>j3>!lKNJ*q*{xr>EZB?Ad;^!K8r3U_@G4WWqQcwJe?}@YNC;o_@c!%KNtdafOY~b=+o#PrC@|c9(*CAaTM6;#p z1Q7Z5-C+G_y+TvLV9PEio0{wc_NJ#&nh^rlW@&PwHdCxr=UaQv?g5hw5}JEvVfG*r zWLcWU`c$bo-x^L2U?)Y-w^pIeHd`96OjgF{U)@>(6Cl|Y!nkxy%*!Dcr`|0vG?P`> zjv z{uMZwr|QMovZgkz!_F^)r9D;{6EYsVp4az!8qb5RWt2sYn&i2bDkZBSL8|Tn8DLO} zWz!X4sp7O&g=8y&5qFZTl+s>pJ;|IS!MbDPfGa8J$p)?`hOAL%u0)u%$rbR&*Tt;? zrugIFQ<*9~uMdf&2r!Nzfy!OlJv&_)uQWlqam?&0)~lwTC+A{erPAe38AEA+Bp?-i zsLyjX>J{r>pOt~Ny9h-(l=bGihM6p>E#J#BvoF{L4i;koe>sG34c__doqsA^oS16&v z@L4%oDNRpow`O_besJyCZEbAvJ2?8Oq&*|Ayh2zG%6-+6l(^m!C9XGN?zPE0{^4u| z!%o#=M{QzHs+OkCyo%cfg%NWcq66ZbTGkadY;gE7&b;9AG@8Zgc&V_f0xDLiR+^RK zbmhjXcUbmat+3h1o_;^5H1aeUOXp1Mmk#HrU#` zFrpDJChK#!LA;~~d$slxwJpuemWz!_L$7b}WK9hU&aaf^b5<=)($>vwB$9`Ci$BX+ zoSju?V9xgrzGXHFn>lq>O}+rwrtNWi(ttEZ#z_+^fOD%bEu`=lt@FqpI%jF&$=lwb z`E!Z4e_AJVGiL1iK&9q$aB>yYPmpQyGpsD1E!*gsf5*}+JmzA(k>q-~A3B--8{`d| zOp_Tz)ojY-x0sN&DIFckC(u-9C3A=nECAWJLrDt?!hE$D=t*=I8)qj(u!7Qb0U>4) z%@Rxp_V_HaHhC{p!6!JZ?R&7AoI&#@;y>Y8?+ieF9nUJ}6jAH;B1+|E>&)?Tu{u@S zUIJHPdSso8t+^*pvp)E!<=OGjpjTO*psx|9_Y#v1)nQrae4>Y|>q({oEMheA-d zAIl23-T0*F2me*dEd)PafakgLNzD)L^yUS)a_AR>!ZG2v=IlXm7~!^(*313R)Z9{o zSl7Y;SHzl{2>DaYnb7dU)82`s&b7%ctTU_`+ShN{Y$%2RINizfU9egMMPBf`wc(OH z4<*DjSA-VpC5Rq$ySMcu*lTh*=ti4-E zsw;3CBySpAgtd2xKaHirw1oS7p^sJ{LhRY^=F zmSSrfh+}}ey9-IuOpcE#Io{!r;~N}lZ`RUU!4BV#qNGC(-#=p^+3&#I$$i?xd1sq_ zeHfcG3L|_r-cZ<5+C_cN`gSDwkOt7onPUDss?OwT{T2#2JS|MtEoBFPBoFI#ll%^T zfkoyAEH<(HnnwQ68Ytwm5_R5>^@k1u?Bq$PJ-I<&g2txZASoHc4YCE}a)TUsR%$(~ z#-N>1(Ue%())vNv{rqdzV}2o${fr73Xg@#6vL?ABXkcrxf}0bFdc;rFrc0xGn?}wh zSSV`bTyQnou@~0swK~Q=E}2BStW;q5bTw(_O(r3K zzN%lxs^C&(yrc5~wMT7=QhR>|$ZZsJkC-t1g*E}bfH5K_ zeyQBxYnTN`c%Ke%=g?j!p=BtZXBik)JjC;EXd&#Af(29U_p)k@Zxwkp%-H4KtlQRd zhmoSZZF{=UA%_r$(XLv3BF5Q;Z63J4DrHI0CJNz<3Fr>|-BV3#OdyWbrYD%gyS`8@ z?aFa|*H|qT13s0m)cNnNF=FcIh}QxB|76+Ljs16kg@jT*@BwL&af76+oZ;mn58csx zJ-8#}wivIKtR9!`jc|j%357!3;2-(H-EJ^}=eoha_Jh0KU;@`f6XgakUt+Sasabj? zSvQB0p1Q$HpiZgj%Iya8)|+&vS6aBX=mvk4_pzp4Vyvds3+_nu!fT~o>-_?AS9655 zC_l244>Xn^UpDJPlGrt6E-CMl}f2Y=`rDTl2j4c?KH|xl=+UQp`gzc<~>O7&DZ|2Ab z#rSo|1Cz{GSk~kl@JCE5P8|gMM(N-d_~F&TY|H3`rKa9wcOX`hbntj6b$x`XYqrD@m4c4Q({_+UxB4+FE!uxP0F|OIVrq(tz6j$$P8*Ks3sVng z^d)&8*cMEElK11)>rpd4Ag}%cu6h?~!Cip3U9AU^76IKsq~!$DKof{Tn+rrFMHCXQ zTq<1+g!h8vb;2?A&>vyBSC(Cf2#acDUv?RMS~fN!yz)sX6cS$fk{{gd{}Onv|N9+3 zxZD3F@OJ&*pZlMw*+0gF($nzDPgrM|3ZAh$gttDMzV-0R$6c^m14Ul+f7OUdK86zN z-2Xjvz&C#N$-yV+F8jX+L8VfGth7jk|Lc;9l6`U)NUB%K5j*-HkoO zcb(_%EYO@;0U6={<`z+WeNJ$HqcK2x3l_lt6-{EVmV)MwQN4TZ|89+v5Ba~BV&k=Y1B4yA@;C( zWoOliDAtX=6|i*|;@S8+<;F_M7%qe@7?%s-$irL+*|%yW+F2E2dED6Rb7X^JBx4_y zGSJw+Gys*1eK8KBjD5j`a*Q~P{Xd2}z{_WBAFjF7%8h-z&yD@h;1x6W*;Q|h{qrX4 zwVCbX_0j~qwgxX@Gy<%B{_2q2N^Bq70PkNITZ!!_bYS$KK}Np~IU@9q7Fk7vg0HmF z^35wnl%w@*>m797l$bZsS1}n-FDhOCHguWJDdk+F^9NQ5iw@jICqBlf^1_sY7tWJ^ zln-d#)W_vryN76fS8ed#FP(#LB~0H?^8F9l7?*S5_rjDQlHVYVKAK8Jk_K1*wxxGl9!CMa#Y z-Y-A5w*5Y@N$&3dsvq2~Z3LdHZ8!VD-P%Ur?P}W{{%0@>WEZLYEaAGTXuQNX8zm0I(O7uaZEQvMWG-02jLba7Sq8&MJ>ulTE2 zXo!r8j8);}QCMdX_NRE~B5&pGC}BmY<+m5%I~XFFPXy)$ePw9SLa<6uittoaGs%tq zDHL+J(U`28ypG8{c$@yx+z$1%sS04M_La47nU`5IrvOrTUbgdlabSEb4}o~J%v(r zyuN2v+vjd=uED?qEsU*=;d_Z609Tj@uf^OZbT#VkoB4Rn6{;su>Hd!-`HoFOs~m5nYz|DlYE=dsTsCZltN!{XoN3xB^lS9Kl~k>7L*(-si#JeOAB~3;wdJ-UNToVlg;4pr%|3d7s9L`<`H_ zuruzNz06{&D#p7?(=Rcx7-@>VHp|+_M|M@qlk*YAitHYep)RaOBYK$4$Vj(U z1W9>P9@pwc-gabcqqqtRg#>k{{NU~|8-eGB+2;JFHYra2IZxVo}ATNIODex6cZV-SU|*6})Y`yc+teR+=VPThSy0FkxW#1Mgmt)`!GYT=EG)lnKEw|uxQx{+ zJF7nB#|Cb<0=DjxF2&!e{ZCRdMlj44j4K%C$dehkweu>f^#pED&k>Fm^*V)R%?;e1 z09Hj-%$8V-Ek|8;0XIJEm&>w^lG~vIx+Z0JDb|{_@|CRCsSqtD>sXy=<=ZVRf4xX6 z-^%KhomJP$qy(8GLbUIM?D<+LC1Yr%Ef|+pI`RyeAzHhm)%0SQ4bsw==LjpMrG8Y3 z&5j13Qv3%g+~*);1t>OqILn&9SSZdDA}3G$RFZlUfOHkj))jm@%{AY{LV0t|#d>7+ zg3W4Eo_@#>o*snfcu&+yjp}f-zz^MnWn+Hu5FMNhhk4g-sL;8Zu0dq1#O!B3OSm8D z8%hrU86^iA_P=4hkS(%^;dK+d{lv11lZO5au=9u4FIWv+!w2u^9SeC*y=0Od*CYiF z$C>AeTuI0V^lLvwKcC8x5GoaEKPpw1wO_78WUow|w8|7yc4un(za9%k>3?bkf@+jX zSMokDs%9kbbD)rK{aBMXHloY&HdZ01g+`ic-E~o|Bi?y27K)O4#zF(u&A}ruMluSh zir0fH9x?jy;~e_v&#Fc~Ayiqf`n8yJ<%WQ)G&WK2QM%$M2U?jB4pr33gm84F9ynGe zm?h&`nZWyeW#V3F7+;xSSG`%8IGaU|X)cT3lAd?EwT|Aw+QiX%a6?p<{`PxC;%}i_ zjL9oEBKM$G!WseYh#Wq~r`96mi7OJHkPqnVsjX(`T1yhE&AWWdxtXYl>)Wyc@rx3w z@yX)|V=YRo*42btTWWWC`lf!&H+)=FeH#P#SN>KNf7)B|j8%xAL7|XUi2wD2yTil; zo~xAmtTxp+NGS=t-7xV{{%2~DHDiA2=_$9g1F(h#n;>WCyEum@+ z6nQaB?9yQMl;k4-)wM9OIK|o+onU$4yQT|C9xPD&F;e)DK=EigP&|j<{RIDvhAnw! z=&sGt7k&p@vBlI-e?hSFq9IFR;eLMU!01x?P}LTybkF0$lTp$kn|T}y4H0c;#f1%D z{bbR%@)&J)UN3%8cGHy?ZryVEw(Z+4+_vqK%eR<*x#5IM9v7~c;Ca>AH$^pvT<%>^ z$Pxd=WZhtJ827>P-`87M*#v`1_z;i(zK+!^JF8B%vGLzO0c_p!e?I{wqE?3=XmsYImi3m4y#HIPEsK7oW4YN{I?0S|pKPnaw7x+9t=?azIv-o@( zYY$V@d1_H8@uAtzfbj42&6c-Q^YE)c6 z*fmlQ9B~0AY)@PO@AJ68c_0HG7hqSti3^+#pS#`8zNlRfhziJ8)Ys)~RaB@QL<62n z(EtTDf;Fx1lfT)guF{`U=WP*RQs0K(3g;gw8Y!!NbSo942+ZqAYGQejcSQN$kG@Kl zZO!#@|DfJ9%ST?NiO+VCQ}=Wad4LxbvJyX)oMvTPU5@F^Lj2=f{oro@n80)W zVZs-TpCeeKw5>pBMe(vI|ygpva58_=xfDFu%d@+=t#2C1Ow-{BUpjrYg_rjMNtc*8irJ=%NUP-|CnkNy|yH6%0; zrk~ssx7G)ZU{Xb<(k?W!Y*B5dR!MdLW-D-C66EQr!1(4*@Kn0WUu` zpZ-4XaZpr!#<8`Oz4|im@;dbI4|6zw8`TQj?zZ^)S zV6mHJqQ{h|#QiXvpFEZQa%6&4Ax{N$FVIu@FP1ewiV)$|UO}xFt+S?jZBEvP%Vk(7 zYPbaUP_~yF2%x&H6x=Y~nu-j7wF0Z9$H+A8l?u5wDF!GE>DEgEvXX9LM@8wDn)Y2G zGV+22iwm9c7ozWDi78#`jl&CWKy`hGw&8v51-}Ka*n4~IsyANnnYv{V;|J%hi|e=@ zc*2*FEv3UjHQ`&&x568^uo^OYDSQCo+A!<*IzCBh?(k|ISC~9zq8e@=h7QS&O8Q;m zzm#SBx&~!7&vJ_Q9$CkmeAF%TBjuw(I@Wj2br(f7Ao(=5CGDb|-hPi5W&=Od1U!}{ z*tOdCkiINs=ybI;9@pv4KDR4%@a`&2k@&pahCA{FsGI50Un|sU(Y0C|e&BC|+oR{; zZXsp5bx-@B6ez9K-l)LYpk22vEk{0RK^+!dr^#{Y8sAtf`{bBS<)rVzXLPB&DxAC* z1l%>BQLI`U0~Y2^c0w{AaLl`SKlN&e*Ldm`#X2nffzybn=mvt@S0@j$QDDBKJU*(l zqXA!$5jxvWQAL!;`a4HcJ+uzkl;7W_c|*#ykbE>%8YJ5*zwJ3ua-rpwGqKPRk#5iu z@)^jR*xfPy8~+II2#mAkqPRBPo@dqE;G!=0c~>HSn||KaR^3eVKF-hE3RrFWdDlbH zct7tbDAl2#cPh63$mcHxKTmWM^YfOIpV#p8qoOl=?w2ETZE|srP%tYQZzQHoI=@7Fx?!UQLa4)qrzFHB64vQr&i*k3|* zeO?&e=U&*?@rrq2?5a0j*ciMK2M3(hCPKcD1E(uBE8_*ZA~}+x`EldWY>C~08+I(Y zVG?VE9o40+M~Y9uj+E8m*r%z(v3aFq&cz;ZVR{sm}c!*nl^o4AuZm_k} zsmjh$wE&YJZp=1bdIwJ`Ag5xtcLXbvG|h(=R%m}lHE!2q4*tUKUq^|C?D`L4p&^>0 zg8XKF)Qa|%+--qbg4utv?Hem=kB7I*ZA=1?2EQ zf;U=!*TS+`S))(Xw}<#f>&IEWva{+_Nu&dld=Id7_vOv_JGIeTO2*h|Z3_kl-_pX9 zx4ogD&G3#q`=xqV^_!htF`~y+{<|FcpeV^>LjClanV6M!R{sUdn(rzHY#lgce^Z09 zyAq#IL+Kza6g8CAJ-4)bqB2#2I24`}fx##|Y=C$Yj-;Qi?JCvBiwzlZj3}Y{Xe6pN zq+XAxE$V3rF^}3%LD3&2+%cxj}uuEi*I${}2w4Qy{c%R2IUIz{1 zu?%+An^?xVbr|)vdI|Pcvv*4a7L~2jU`KNT8rB0k2y2{7)~JOzGFh1}vA3=Z=M;u- zJ!us7-qowM#xP$m)k7RT`~KIvp|A9*K0ny;msSaDSh$@`e2h=mh3kaDj=SXp`ug!< zt8-Ezk2R?bJn)f9SM$c-%a*uSlKtTiC57ZO2xEmm4$aaXI~L;4s0T)tAfyOd@E@uv z-|{vk!@2$j6bcE7{Hq__9TXw(+@Q#>{NQeVCGd8GBFhdiN0l{3G^5v;y?VO;d@t|3s-VzP(YI+FqM2)r&yp^KY0JUz}+zI!CA?Tq!*~#rw$C zqS}1XUVu3Xi>ysT8+D%d31x4iRo$?dDx3R(dY`3^l zxZPfbv&Rx`qWB#U@*LH>=TV{8MG1)9qt{@eA)2{^qC!{U?8{EOTwkcM4-gfnVFTiZ z!bO`TXqsg`j~~4O-#sl6h^wA)hj!zKKaImksbhS-E*wt?^GCxOU4YA?Y+JrW&ylZ zL-Eme+DK1W4S_Q;ck&$q=0leYof3~$3916$Z>IuJK%tafk!9gL0-3}8^W+DRJygiR zhDNN;);?FP&XMPw&c>S(rj4y8L{DJv&vJyR1&xqmd@dDcrNG`Fv8-JQ>>YlfIi|A* z7e1fZ@DMB%#fEJhnQ&rM%_v+m0)>3atH~Q1(Peo@1nHg|)jE>uj9F5k<(632uUZ5$jdI7L%@A9gvkmdnouQUGb9xh4zHW6BXJM#;DW-M`(`;+Y{Qu z`#iMwdT1CA?Xj!gg!azFcSIxNdUA_W-pe97ZU^DKGsp$e;j&|S_!7yM8n}eGbf=$@ zuv#xKre!lx%_i>!!Rxk^sj>c0(!H{5UtbC_o43I6t4~WAxI%Fm@vBclp^*61m;B)F z_!WWY#;?BP2Y1IK2)y0+)zAIU%(Cu!8o&Ap>kL!x{r#3J+T{oN231C=hl@5j88}fG z+*!e@K`(xCHb58=9JDqlS{14t$9f;(Z^Gqz6U=}VZ8IYc$|jU$(0WBoj-(vT^=VAP;WI|F0+K49=}snV{d~(j@TF`>-L<3 zd&~fi+&%%6#IBW^e#FAE=17ehQB5f}_F-19?5sL@#m2@y2H1Mo=B4;M6&vG{FCRLFL0%+@|vY|N2olP@+FHs+Mp z+W2bz@x;g8k|R)5aPq;CY65-mR|TMw4=&g>$_E!yn`AzR56*huqDFkG=$ zh1iwX2loq=zsXd-krPq*-OM^Ni;N^sKxA1QCsWeRo8*0qp(1#j*XtBnFLq_ut9(&f zW+Uav){%T0&Ia220)NNZdqo>&Y7=v?A)zGHLFC*{IbpjD&sm_H#quz`#l7x2widXu zytcfW8nzy$#^pf5tAxSMBjh9H{X{}*h}Yuxb?{nsQb3bEOu6>T$fcC~JdlM>@7X+y zme3k7RL_wm%2?g~pt>&j-{- zLwf%c-YySpY0ek1TGtrWYR$Cw<`H1RPOGtr+Bj{?biFZ*6%!}6ZHDX06zsow{-U;p z&}^A#g%Q5_3$}zhTfJ_+b&T_d36m)t9#kmrF?(#Je5*)k9ZRpk^VW?Nn|LgGDgH(DhuHFn1y@G(B(748}C^{UDT^k2Pz zgvB=!ECCzrnAY=DCa5sROyA%E>{NJjAIub>e0 zZ0@(C|IQEY4%!iT?!fu7AKX1~2wVm2L=SUzU~+Q!31GZg8I=UT@2`jE8W^Ui6|6|T zoo7AI6SYXK%)q3LvrKC_%nAIAx-Dq5(Ocu+Wu0fyjC+$BmzHU*=;nzSUl=iZzYA7t zyvU0YBSlGSEUKp@6@Utejo1rm)NHl|y*!YdhgQ=&u~rla;lrKieMA%~q0 z?>02X3S&Z=W7pSqB&G2tKjje5*;qzdw2cM_44T%7p;WB{GQg6nv^@sN5s1NwXn;Rb zd%%&_1I!MMJ1gUG!1DS~1NG7*SQqo@GZ9CiX#80j`$8$^t+Ec{$0CX*N>v@||9r)i z1G~;Qxnc!*ASxMytP~SkgO^;TF4j7+1)l>eHsFY!TD?%3s5J5ALVjc>{AuD(eq0M^ zQ9w?`I-BTm!r(W%Umv8Zx(g&vO)}}@c)A!ZyE;lF6fN6^g@%ZRf}&+F;ZtfMeOLqU zS7FYQy@~tFQg)9kr#Q=#tzjm{M_|OXEy#c-b)^kAL^YklW>ZiIX7Rz6`DP*}>wcBN zT&{gjf#--(yyZsPg#yl%>#c>W5Cc4y)Vlz{Bmq2zKD0Y9fn z^b{LNj`MiMeZkYp%n>mcEutd695Rt37OV<|;E=!aCM(*ac0~Xxh2R8bi(0oCCuz2x zgeSct!Gd}GS9E_?F0#N|#Tn-^u zgV!ho2Wu~QTgh?_f@I24H+6JY&p-YIpW<<=66AHwhZ4So@S|2iwR}c1IXq%L*d-N3 z2FZ`%VIBHB+?GbSr#0wSYVigK^$W9h|BbXQ#1%S@j-h-W4Cn%UyP#32Rr%qQeCu-q z&Rv+2@3#f!RvmqMa7Sx4?ZOQaCcaas&d#Oa?tCNQk|?o|U3(E08WJ51ikkb4fCE^s zR%W0FMc<0Bk?WS~wiid$k9K-q1BHB}N1NiXDS=bmW|lSIr-;}Uyeq18B>g59ijqF# zJT%FID6th>DV-7{4PDN|x}|#(JXX2w(jZ!!+zvPLdXqZ-RRLMawm~UIb-dzJmvKe5 zjTo`Qw(%FDlL!S%%1(7GFTNG3>pO`M@AGB6PvaF^USwDHGG4;$mmyj~Xm5$C**aH! zL~HwOy*As3Ho;C$`K=iy7DfBoR@#Sa3{ zUHsVRP@gJf>`5hXwfM0FwU~*>J?rrMN?u3#pQ=Us^=T*966cTUz!YB#^-4`Y?j?;- z0YAszRQKu<2M^k}e6bhbyKgzP30HX^;nk7E*tfg{Sx$^3{zK`+xc4dT>{I6L%bu3S zN)oO*{g@5L>^Psui>pqG0+S!%*i8GSM~d%W_*gt+s9+JzY5fDQSVEoF)D~v(g$wqy z4o1waP(72x+#k94Q-3quB*wwraYLx+WuH>fmGlu7d{|ez!2S7w;X05wRN=bEv|}qrfKJ zi`^XQw?btMhjSPULVS%(jgT15sQ8q~^fWC*j-t6#syAVGTXrxfwwRhAmL29bRWvnI zQJv(gjG$TLmQZZZdIeL=ngOj7$M(cy?p%7cvNG(s{ z9o-RuC9HMf4N=vyanzV{`R^1!SjVcBJ>_eWBkY~P0K&lms1!gD3Mu;?Lr$P z`Za|%auDC(7dCnKzH#wh5J-praFdW_DG`y7LgxPP}3v zB6gJ#A|m3!ZIVMhD^#IV4)!z zfI&Ob_SppAlt1ax+Bkeos8$suXQiqR`%P4>$m;qf6!MK3&FaDis+rp4(gNFo7C~Y7m$_K z>rjeO9j{o_W$%-@EyiiodY#}!*{P28x@SRked~32pBrP>;T1E+*j0ux*5P{HMzmCR z)#}p|Z7$cH7HW%W56LvgTDSCnwa%zl-eO%fJyB}qN7%JI_?!J2Ue8=H9-iuW1#gYj zU4nK~>56!Ffg0&U^Rgk!{%-V)TE5#5C2BIz)vDe>uHuwStyC>#xrB`Amy+xq zQaVmU)4de*8YpDOz}?>ydz&BJ9bqK!+=aaN`N7>mUIJI*iJOf+>3^nX3G1^_?lNAd zX8Ffif0%BIEGPz%{H=!3 zUTb{>)y`TTuSoVhFV^R9E$;gOM<8(RKP`lQ+)ysqKcXq-%AytO}NGThzzRW;3idg z7yMuAeM&nd!K)BM68U*?!C%=-$*Yh>)8VWxF8IICE0zUc@P9W{&m=MTg8$$8o8cxg z4j#1N|A-&IT}J8D_DGAzz2N^({_6Y0lfU5qb3eG7g1oXf7ySRrj~^)eUM={iyTHBR zzuyr)Bc<%?f?V1V3;r(VP=%8jV3Y2Je22WAtc?0{3S*(mS+WU3qQ0k7)OWhHvot+A z0qc^J_1a9KFBQrI`!J=dw<5eX3$h zai%1`!N@Y1>%+Q@Z*3OHaiL!lB>>tY@M0(gvx@x+F(&JQ4#&)3o=GSDSAb&IN`V>{ zmSyx=3iJ>x+QQ5~%j%V#RrhNnqpZmsVCzBF6Yw{lyl1~4#)V@xH1qJiRy)n4Cv@fT zy|=ehfww{-UmRJNb8*jPbb^F>xQe=Cfx@uPm3 z_u>lzP-!UzXO_UFlyd@5X(>fargF|o?Ogg$?#`upu{u$kxw0~T!?xKHnh&&l3121X z_V%SqrOlGRZR!7D&6SewJ7g-nU-M|s5?M(Dzz?Eh^HhemDhc}$^guesrUs92w)SjQ zLN@2CW5+?|`RW+E%2*vEE2)#MO3#85b9#7~fI!b&6U*PCbb@Kh3&at|uw!h8U*@+e zmW$jXK&ujzqHOdkihl`dOqT8UxdN(XY*kOK9j#P?;jLD|U;CE+g4a?tW8w6{e<>kd zB^w&C8uS7vWClpwt3l&_aJTzO;JH!Wm-@lo5dZ>LQQo+BiC^J=reko?v-3xhK049Oy0XKb-;W8Jj)<%&RXy-1*Bajo-Zr$^fZ?8uTiq0SjrEv&=3u@plxr*G2SnX;J$fu zceaSWOrK$4heG`G$A3lDpS+p>fI^N?2qx>UOnxW?kENlPIjn*nDz^K0{ZPe?v=SLs0t!C?aC}m7P`+=PfA-{j5znZWnRYiWDSSnp9 z_AK;|&L*a|`py4oS+?Ih$WraJynv%}M9AoHMB5m$N-ID&mGwKoZwd|-Ka~*wND3mt zJ$MBa3ULqK=m&SZ2Lzt$9=yvB?sg9dTnR`9+Z}TeP_Pw$|A_yY+N2Zb9^hW(4%~we zvHmdiKV$z67eMwLAWVMTgY+^6tErlBLvbaQy@6R)g3NJ4zvY*l+n4zUuR!k6>i_Bo zck3B}=jz$7{NQdqBXA|2#X@EodS)(8FFVRdZMr+>)3cOo)TOu47enn*R+O&?W7I7_ zFM6Yjzmr?Be>(R@Pw9=wJN8C5xP+|{4Gmb~jk*M*M4C*2u)61sT8s7e)Fzx#-b2jm zs?cBxaY~1_p;OAO3;nfxb4ts}rDnRTgF9GrQv1B|-n@>Sbe_g~99nl1b@pZ4-ue5I>Ug;jq({a6Qsn~IUPb^b7_dF0Ce0Tgn$vY4zJ zpAK3#7rUjQk+v%S%)+uJa&53{uI!sxy|T0F6GN;k`*y(AUD+4lZ`Z266prD_+Ol!E zvW`5f^!`=j*3PNe%;UelEJr#hNLsVJnPtsgPCk?ZEHF{a0E>#8#Kly;29MO0C%YH1 zo}`FhX7vPFnkUp_vW}Inh{6&TFE__ zO3Bk^3P8c)NL1x6E@jz7*oJ;7kyfNwBBC}WC=?R4+2sd!d(#A->rKDP5AOD+30#S1 zUzhkCGanHC63nXYPJ5HT0-CX9OkCCqZ_2gq)>(vaNOh9?)r9x^o8j&x4(^td73q4w zj~^(e)Q8;IQ#y!rrN!fZHQ|f?>ifi#|7yaw{ormL_R8Kg!+z|?50rgMMY|OJNq2$! z)r9}{x5C#2mKEdatTI>Ke+^i)xFS?b?{?qHU`U?ZFt~a#9~X&$KDG3j^P;W4_@nt{7B~-8LK5 zCUX3zp^zg2g~_^E?U>fh2o$%3Xg7sz7QM#|MW3YjCqDj$OE?aS6} zaXr*dBSU42_L0~IWZFuPwe#3-K%rjA_VJEn>o%pHYNwH0w%`F7Au&wVS;G|)bL2VL zNrswRl`6BMwWe8VPM5aB*K$ksQgysE|Au+_UGIIa*NBvVI~Z!RN=wwRSO1<_=WN13 zZd!@CVTI6YsIpW%VdDxE@+k)5Q)CTin!w1~RRO54Tf}NDCfBIQnlOCi#OH{tF^2F& z*6==$tepk&IX)tkuLS!mFSvlpZHJOv%Jsy`t!qSo)T7tKnsh?3`!SL*|hdSUSv z1?(Kj4%e;LO9%or6O~PRm3Nf+!*nl@Wq$_*ntr1Kx7V=gL&f35Ru*w9;*E-F+1QBS zTNw(41mAA-gS)+E0?!S;-R=i>2QCO)1>dBleJ!oL^Qn%% z+F%GYZt?wqW1s>-U(iMIk`KNw6mt0Bn5<(t7}0c0C3mKYa@fMMxJe@stQUFU$Fh25 zXVp11)&pM$*t(baL+ClD2QGzUcpA2BT%Lv_&uUzJm))yIg`HIqg2$d;l_MUMB-!(* zmx1>DZ&=p+^Hv777AuWXLkxQHQ?;oW)#WsRUV??92GG#e#p$`yh4p%^PA4JokR}YM zN_C1=Z^Wg!AA&hpdTc8dh-i?Wq#Cs+s!=q)cII@HuE)vQkU2ZranoYBy8^t2Dhv{Q31>>Og!ep%u-*^$KaV*OU=Yn`ME0KN360lzm=A4J`{EN!x ziG|+z7qd9DRhnL=kVd$cc|2y+Lhdm?j8|+g3cJeim}$xbskZ%jl5@~HVJEJzQ?aA{ z=2Jrs#WtUj?K$7v-!rl8YUTOPpGoh8(Im&WimHt;S5;wW>9x1I<#P?5Lk^o08}J=l zPmZl~)1}6BuGgN{7p7p(Y8~#&leRA^PB%*H`FUg3$=uog{Jypj_~sisSq-Zvy~E1y z(?220wtg47T6y(v`(5rlKAURq%p5Cf%T-L%C3eY`hDs?PTWnsYptty`diJ-ncOrri zzk)&`L5O9?n$w-d#_k{lf#(Jx4)%k)gAfF+1aw5cI2|Sp&h4zA7F{0p*GIFv4I{(~ zP^6sZ)%@w5|6|(io`R=)7=v}Uf848Juk*Lf z*FUChm+@*O=NK!iCNUAa!&f7p=1iK7CySNJhPXT1h>Q;baB%ZO085$ACI%AyQlqHmeNH={ z0^pTslOekDDWTiFZOWKOUkQamrlvpjgS)3D0?$?4d;H*T#U*gX3^H8rwver*&X4+^ z*)A`zr*z;ze32ZVT7UcHR;2S_s;);gCgZ#cf2NjFw`qGS!%T*YhSEM zy9A>|nmh)=>fW045x&@^{00K=AhzWDZS1SSt?%o$;i|Oy0s@auVf^0y4uY8KB1$No z-x%EQxUxYJ{l}Tku_m2G<$Jx&d}~xaX$|gjEHso*bwQ6@i`ea)d2kx_#)uu>Qr2dz z-rr6Y?t?-;;?xD5ya_UAFV)&EQ1Ta$y=_5%P80NcP0)YePAdZitw-TV(t45-_1D^| z#G_ECSEBw#C!&5v6ZLhPsQ;~h2^go z?PFTU>Xn_f6H*xk>>yH+!Z8%lmW@jh9eJFGh}ijp)NsEX*~F{iVInH1eHeus9z1|( zo~xunhQx3xLGjyoRIigZZf7lX2^8<>3JH1kp^u(WMb)G2yg@?!{aB&;QR!rs>jM~r z_M4#znYUYoj?KL^0F^fJ2&-8dr>RXme_3f1igG`K`N1p};95BbE0^%rtFdEYJ$(_a zIK6UgwpcIDh@A_mF9a2Kl`G@rmCC=EnQJr)J4%JpM5S4pFds-?=%PpN!hIHWb}aAZ z;ZSA{9zN#w~eY>U3*+hqf*>r}MgIg}THBVt^dy{YnK?|f8Z|d&|x6C}- zo6vIO+ner(%Jc0_>?&(}6L*F>+1|9#+};v@+D`CU$V}7N9xB+KIk2TUUj(_AuK`J~ z8MKJU^LoyuJ~zGNvv%0Y$3{i96Or|FrDk9Bs+oVg&*x;>g*XveZx0JPmDPTqg*<5I zhf*pL+id;`3WWr~pYemc1K4i4Hmz+VB)i#LqBynQv@ zI%sEKsGiwL?rk;4`8EVC??yJ?)d$vw0PW`W}fS>zE3>) zn`W-|gS&OuD|_?h@d-bEpzKqz=`QUhNOysIU(9ZQD|}sG8U-2ad7KoiteR}}eKFr* z)Ms&xBQLHss2L~uHZo!7YYlJnOG2wh6y4F`*vGr0pVQ7_GcBgq@VOl&P3 zpDs2U^CcZ8dEa8F4&LUqdra1jU8QPw4nARs*RJjN0#3Z3GC5fppPO#(DU7g6!PoWN zd-m4Nx7;^I6^3OJvnpyY%#}SR@%{>hzoEX4M-)!~in z3ujN18spm=m8tEG+2T0tl9yQu!y7kp+8e<*0hhR%J)Z{g8gYVLyXd!835%=Ta|%Aj zRsy}(1qHqWXzge60j;FhuSh6q&vUE!J}Krw_m)lJPiNg$qTP3$DOyudBjx+cA2Bpv z$lyJO43d2ihP|xu30b$5dcC<+nEU9h6t0f3HGqL?Tnm=nsl+w_FMyf~{W^;4o(?3Mfow6nv>qdbtD2fUvgiM68Xf%h_- z9)3dl@0=b+%s0vk=NI7x$+5!N?4B_;w8yT$wN#y(8NH<1yb%8KlVNb=FQc5A<$Sdz zcEj9m9p=YOuF|Hiupc&^<3f zq3tjcbS7yHz?+K`wek6622t@nM)<;Tu~MB+rlF`h54OMIW_d?I<92D`XX4M8HeF;o)Max@49^Pnu9u zAt+F(UKuY;R~qug#Ow@;bzVi_VqVVfEmgUN5ZyK@gtje*Q%c1K*bMHuLa}tA*o1e5 zcg!_QU_Ts}mwOaJEh9qIRmjw5M66K{CMX!1`p3eS@CWb#%YUfed#|_m{6VmLW!YA( ze{(lAl1-AzPFi#dnNGPT%_n88ok1$MN%L_iWX3LK29}U0Qkq%uMe`$7uksm@~(&QtlF?kxt#EQ_98q zMAu0VLAykH9Lgp=nF{96681xp-ccYoUHi=`%TIc1W!b(eB5#gOdZ&ew-l?+I5u`T? zg+fU0JU_Ub^awnc^tSlH-K0n0KzgTXq=%_`w}+9Q>hNR(0$8Ls2x+|`J=Wz5L3*TX zjPwpAnYB%N0su(QA--VJy9w&SN$+O7Vx-5edP91rRq=q1=}6ie&b9S8YzM@rg^Wf8 zm_>a9S~`%Q_^Igcjnt>Yx{RT}KbB=%FYTkvCz@mv;HjYmc%Q6y1OeUyg+d7MqkeEV z0TOsF0e;pG?j}G22Le1*BS1`zCqUKZ$-5B1BES};b&miY`YkAMLG+E0;2k8lwnp0=VEDaT`mm@;0}oJK+Ww{a26FVH|_u# zssu%ct4=gWMGPG-lVw|tKGLCTmQ9E!hZ5qEvgQ$lcsLXaA;k55a5o_mcrGE1`N7?U zNZ>$-Cu@X=squuUIz2fI0W3n?8`8Q*h)z8hl(;}T$4GGr$*yfu6aYYq4lxFk;uO?_ zlVTaK7%8$VFDYi*{vcbi^eTe$P(!&eV-}>P*X*^;Ia#}%vUcn$RlBaNZLYf*Hlohd zCQ1P-n@757S|C{59J8*uMqu=1Rr5{|tUieIcgnoUDq%8y#@np;7+>gJ50t%DKA=_Z z^|T;l-TgJq56D)yrU?IkVu4>KW(keks%%8}4zHdF#`TU-&XFlq! zWyX5uBT&e1 z&GpP*(u0H(+rfI~{~#1sL&tjNUh7SIG09>iYCZG6P-yL~XRd^5#II*Q1rOxwnb==B z>zVzeDyA&hhdxThshCzXkHB8wCw4y#rAWn$)y%<@ro`muTFcD3t@!2`Z%^y%&Z=U4 z<##4D)%>>CF;6c}z(?Aeb9FEi{6>JWl$n!vRH9m@gQ&3>s=n3C1H{Cjqgh_v3hhCB z*lH=NJ1_Qjr$5TSS(a_p`!#{&kv`w_8Wxxo+J~ zKe*eiBXBFug{itlsAfR)D)fOY=2=|bRDGUYg#eaYw-M4hoI4Xn!nhr%<_NLB0Ow^Ai~4(iV-2Z>J1T|-k2?oH;YX;-YCb~i?R$Q zY6n!PW=svu;=&c?EeQB)DT)nG15xUOB8Cl5l4biiPixJx=`eT;$VIZ^5p;My6bhlk zEB)YZIwbI1I^5w0chez(10CvHKrmJB`7p~+^?9-h0W3N^0n)lhhb}!AeAquVnoQUyhNBi;elkux~B-@Lk;EPjae{v-Sa?MyMtuy*j1`_U0L@$ zaa*arvs8z39vcBGpBe9TDh!L4W7a<5W0j&NeOdk70OHk$asKM(8CD6?`ppOt;$wWF zdOeV~PClUb@A)WccYpo!d9od@X~Mt$sbr8`f-uZ%SL>fE^?LKLjh>{Y=NIPG!56r3 z)}beBpjB@zGuA*8DCAoV6Doykpp$`laShbfY{g#5u>jTK6eZR`UyQY)HBjEmY=$@< zl5t2nX9#NzbSUec&fFI||Ad|*3^#KDbTIWorvfzJ=6oCCa1~sFd9>|O@30~Iq!p_@k^g~Kqr8l%<61Rsit?Z z>RGM8o_;V8+-shymqKD&D)(rS<61_8sIic&ch%E{W_feV zxvt$oesH&IN8s>*U0YsCD=?34A*#6$eGPqxiy0SJLzO-xzd!)X(fbahbvTPAjF2$gpddB$7 z#E$9O_zjUvnX&I*>stZb0aYI8gtNGExq1*MOO>F;#kJl6=V!}nWZB;D`*$|jqRYYI zQnk2ay0l@uHZxPKPHbTP7tESf*_;U0OrTH*Yu@Y!ce5se=d$K&{NQfZB=Esjme`b% zVAgo@RO*pb5WphOt&r9|@^p>}!Ja*TL%^+_j6Sa<*|kld0s!dKA;w_({20`O)91(W ziqR*#>J5FK0^}2GWM-TaVhYzjeK*F!T$6&bD02zcS~v~-hZ+T6p`LUbK7OkFqAc6{ z7v@uqv}khQ;o|gkZP$kJGHmy01k>XWWfLOk@t>ej2t7XI2Y1sWf#=fWUMHLMWm&9l zdL;0{mMt!&5SS&N7L_U_-$MY479WPR?$KgO;{_%5{H&U^7BV{gJjtwWIurmvhYs-t z)8Pit2~LNjc*W?DUG;_zpQW8K73X=MnCGXDD(DU@%7eB3(g7`kTxs2d^;A7cjg5=F zW6n>On`PP7T(9>XXEfWQ%+o=5U)n>qymP^Uwb!PNOKs0XLc zd+>@;C%ftmb)GgkU70F3Bi-6V{gBo@nsjKspvazYNpWc+qsNbu+}fr`0RZ&q5MeMq9(IbL$HVc8 z(IdO+4LzO?Utt|DP0d8|W3CZ8O1K>mI1@b z-~6WJNwRETL+G+m7D?_m%o1h8mw5YoCwlg?2f$g-cS*Ft_USu@H!lw{X7Wg@^E58n$;dw~CVFSz6x z%$+v@9yb|p#w*61?5a21d0Ms9ESECh16KB%v0E}f_{d>9;7vUQBfu=y9MIA+_((t1 zz<48dZaZe=AIq|R4L*t{S*D~2KJweaY;2$vb|mmzb{zAAyV;Sz2V0i3ltN&R zcyd&#kQ{~p7CG(>X}uvwQig>fN2!O59G8&X+9pQ<0OaTpVK6yPK|MG*mhp;_BfIJi zIi3RFC5_!Zp1%bWK|3HueM1)>!gVDuH?8Nl__7 zawh^x<`sBofnkY&rOh|hl~(!B$>5Mhynlz(ILKILi{e&gA?Ktc*O{jUG;_# zPe&QlOE2yEQZ?arK#Tf9okX*kahZMt$Wi`QgW)&SvF-5VFJ#%iE>+7$SrmB)4EdMN zRqCY;*3jpxRJnw+@^q6IOzS!09mD}B6hf7U`oY~)N#MCPKi&`Srb+@IY-P$#X$j_y zr%a_E$x;NcDD&r_KHZ~C*LV=D+0TV*rJam8pQ16+HgO67AWnx6gNbt+bO0yLEAfgE zC%ftuaZVTa#4q6F@9~-CxZNU7ftDgp?FJ)G`mKhRRDC9Az8$@SR?`|vTLROKcG%*$CCV>EZeH~af=UYj75e^haokX z1b;0n9zlZ7K%o#4Tylmi6Vn1hB~O zaY*YP`PsTHh_C+|$4KuxB(b(hPXGYvIfNHXdgp>7aMC*uuNdjEtKN{_nQYs`bo?E= zQwU&D<`t0EJ<4>C20@$)rI(C8x03YQrcVI?^yv^}FnxXm>cQ#rqj<&WlU?aGYwvIugqNJKXquhkH^5JaXA0n;h;+mxGR*}l5jtTC1~xq5h4 zxza3cn65OM!FJ>eW&I=Q@Jc8YLWh%na5o(icrG0_{ormoBygldU06yNFoUiOVf)0D z79`scz@o#mA+39KXluG4!hSm4T>qHWxRE5*HU$a*pg@Q4f+_INp&s07yc@3=1+ptI z1!ngzh*f+AKpbNYHIzq~n+0>f0`OO|b{~|rV^^u#b>%AnCtOpjPfrAX1mGxl7(hZ; ztQ_+Vfc+#$Up@iwIgqVBdhg+Af=|9c1K#qSO$;j|>q|Nk{W(L6+b%;tvA zP@g&HhOV9eKWfRm-ShvSjW}Eb?eqV~tVfvL8h8HxnK?b^Isg9xC>nqM{|QivpZ|~D zUmj;tQtfT~%>Ogh;dNOHq>^<;3a74AMx| zlT^RH+}p2ym+lr>w)b%^cdJv5-367&$;$ZLbaPLzV>d5b;hL~B44ct-H_Jd44N=b zW@rDq#{f;M3#N;VfNmt|IVbXv^Zx|^xKIv320MA*g?ex&?+LtOP9D2TxlxRKIz9jY z^m4I2Fm5XW!iW@ zi2e&%w)ea4T13-r)y#lOTcTlHl9?;BFEmaCqID#H9Kk zZ^aX!>iOg*1h5Ej0@AuifVO@M^6Po{Kc#bw_$EnWZ4;jW0OE59FPQi~2le2@_j$Zx z#K*3BLwu*=06XQ>IO;n-C(u61K|3Hn6>pbV7X1x~XK(@(Kh+TU0d;6Q_Tcwq+16~| zg59#E774B%uEY1AYBNz(_-omM2r7IA3WZSNlINK0V$LpEyN@||E)^c&2X|8;)g0Ys zU06yRFhe{cDm_S^MgWTtABVK=5n@{B1tl(o4l+{w4oR(TQWO9{iVgt=lj6Cc6Py&! z!z)IL?8-}u*`W~-tXLBjp?#>KT+}fO=B|leCTq7v){b4JYS)!D(G%GOwsmg0)WMh0 z6^6yqF{`5cE0n%0i%x-f^+BA!ELyWlSWM+66MT#>mahla#^nQg{|#Lw?e4FOzEZZs zHDCDGMU@PaS0D_VztpDq9egXJ&N}pDW%NF8Ei=B1eh(B1T^YSA zFfXo*x|*%nD|rb(bvQwZmC<>u6@3|<_cEIyu7_kClFk{TYb&FV&{Kph*Y3*bHxY+C zX6wu7k6Di}nIdjw^y`4->ut}<=#x-1er5DwD8*Msv73A=qe)-PSvEO|V>hw$d~}MF zF)fY$60*|L=;!d#wKRGX9<*JD*{^^b1jS1>`&!A0RsJ6V3EeR}R$nkt73njVvyr44 z-1ge&vx^fml`4Gpak@6;_2{_qP;55ql^t`<(z^N9dXG!Ta*t}*mdPM$E+p(*A01Sa zfr)6jcdLxY@gZxZsSZABjBAQ`yxGD2Sl3!vwzac=Bg1UDD%H5ciU+MjxSTCMW*xvv*}i&njg{s&^3xx$1an)5Ojq{Fy0LBR>CopKMA5QQiZE zLWuICesDKY5_m3Ae%24}CQ1UwucN!grW6FT#*?K|jpSVjV3B1D(z-{MsSzMpvgaq@ zrL~gL;~gZkw&_s-06jXy7fg>&Lp?Y>K7&_`9@$lI=<&=Q)9{x2M7@@IQi+n6!I8e5 zc-+>M$Q@Xkd>2v*&tl6J+M_sSYAI@1tUAja7BM#FGFi4yd!JHmw#ajz;fdOnmFdz2 z&~@R)<&m-(5uABA6bj+Y^?qeNb^+i z&L?+7I_JLiRzBDnY6oP=*PaY4izt`UBREOYFEtomPTkp#VR?%z+o#o5qn#Ex9t?Xa zsuSdTUj&QeJEG21mQ9Hu$=5@n5R$yx5AG&O0?#GM5BkB~BuU_dtqiFt{lJ{@WT`YG zxf1~_vfK@6-6PBN7!X9+pY>N$E16|^BT21ok`w?yk`4g|ljL`y9-Jhfz$-?Q?5Z~; zc^ZZ=OVvo0%=l1|HVJXq4ro$a@EjFj7Ecan>F^4m_^C$1Z>Ue(Vai{~vc3NjheK`_ zRUU%JT@q7nE*C4+OH0+MW;uAf-paF0PB4w?jBw=u6bd2BL;c`xvLx_avOL}o?j}nD z$5WLvGrT_rKbcisR zFt>sDIbmLjSBx;(RqqJ1HrMP0VFGOT2$O+12vejJVd76U7G|umVA6zteWxPJ_M0$S zlPtnKXn342>70*|lgsCtvvc7moZKdx5@A~242442@(w?^n=J`Emo4As2Y0h2fe*Ia zLR0F28RMx^DMoS=0$5Zz0cky>N>q&nqDronj4CHdZf#Sg0063Vh%lHcKL_>TRQY+l zVpPeldP9|GOceK2D^ulIvds8^ur?D3;11~WKqs6;>=J#aT z-hV*Y*TmGmY3?MFFHqz}+HE36~;G{SMff%O^yF8W}J0 z4m!W3d6g{NU(ytI(kSkjE?vmF>$2KTwg+=_xfJmU;up#$MNsCIP$+~lC;i}V z$|Uey%53_<-IPh-gDt=Cl)7L6U0uSqt}8`JwjqE;pJzi__vq6xDg=4g6^L~zz-Tb6g=6(dS^)gz*uEKX0yhcWYsl5o33loHJ*O8o{BrTDFe z#Cxb?+p#R)CCm1eC`BXKK-89gRuAKy$mr!KWE&z_@}p2Fge4#LgS%Ohz;jvhn|^RN zOAuknr%0s<$wv^tqR4kZT5l*)=)yu!q3fWa}sPJ@@K~Jnjj@tnt>hTw^OOYcsH_}>sw`@ZMIo=J0LdfxcKe(G52|Sk^KjQ~?lOusMYf%%H z(g(~CPmW3xl0QcPiyU7AY2717m*xw8>}TXr4le#4c#9<0Hbn{mph$-hgDLXgp&pzf zpTa9fk?g8h6j`fJRd)J6$dWb~0~~6O+bxO|XqMTyY*M?yD3X4wA+chUIV56?$EC7t ze<@Nl%A&}FhN-!*opR!e>EfPJJ$y6e5wa~2RCy>A3Zcpq{NQe?B=B6Se6}ClO_c zE{Xo7AKXo%1db%?5}HyG%otCiN;#6(A%I1qJ0Y!mB$_cQ1dlG5b}}m6P4a7-N(BH= zsY8^(RQheG2dC2S;1#1%cGVjyJ^hAKX|__`+4YS=gxdj$>TZfevlw)legmyf@mmdy zUs1=l!<|pdvVFBaMI+d7)RuGB4C9?ksyktORIMKV<<#Zpo7`X;;2FnjEP+BHoH^(R zcXK9z=W^z;esDKu5;(4VTk=v`fqCNTQt3mo7y&H0{3)nQ_vq54|AH&~>82}fWJLLM z8WU|3r2qh;bO{_z=?7zUNNF%SG^(1XH8dTD!8X|GWLD(e4A52cR-i=?5YD= zjJeXfhc>5{q(;aM)(A04!@og&N|x=b&8fA+rp^Pwe7Y2SurvXCEGL^Wdn|92t%)!> zZ-hc2^x5)*yXlj_bLsP~esDK^5;*R$bjVC82wpJBLlG4@#uZT?cWB7!!b zfz4^SBL77a3VTPO@v8ECm3Nr9+ItWO)v#1}Dpnc*V$)UG;`6PX{?n*J`mQXa3?4 z;dVfkx_ctgET&wh-$3_V{8oeF8t+*1o0;2W*}l5xq7k-@xeDy1%W69=h5iZ-XC|@< z5hOVYg+fSjw;$YXTM~FKN&cZ9+)a`MKG-s3rL+O>$5W)zgQSE27DaA>wC+))OYa3k z_R}p_TF40U3X)vg1StT3ARR&sCdj{rdT@fgAFmieva8+@Pt^MVumx#N=b zkP+g8B(t^&Q2+oTI>Z-Di0dv8gm?m8F+yZly&=TYXN%2xZ90|{^DRcg?SK~bnNy-! z%(zUyffl3qtp>wp5TiaAOxMqEF`g^S_SIq(jj%1o1Arp0VEq-%l2^-?M6l#mC=|ky z6Mk?vOA>f4OV<71Zk8l){K8{eWJ)(Mo30ySThoE5FyY1MNACYDI8jX~#ut^hNOSz=lsLfO>#b7`C5!r|cx_lT4 zh0x{WesDKk5_m3M{>TsRrb`0n@9-#LDTTlc@kFUqA$bS^ETa4%q;-!do!T#$vY)X? zO%oYaewbv}HdP7$ph|}rgQ@c13k6jU;uWJxcGVlIJhfh|OvLhJ{s+q#Y6m2#f2@hH zEQVaFl7SxSml_Huf$;R95MxiCD9iTsgJskp%i-Qv9K^O2J1UqO&zEh8pvH|*D1;iX z@PoUlk-&4Q@g;t6H#HLYV9OSl(g@6=Yebk8sdOPZ2LUW{JRZ`zM~-Q&7tGktPm~Eg zWVAR!Qfr$Q1pv^ZLx91w_*$q3w;)@1#b}XT^@bMDgcls=#!C~Er$sJk=YRZGB6mQK z`iDO?Jc}Y%n74o?wG=fl?xikn$Bg`QS+=hqzttLM(d7Zdbnk-Fj=8Bzs*|-~%KW%& zO9W-!4~0S~^Fcqjn=%PJmomTZ2X|8@fur-C7Maox%ob0ZN-vVXMgWU8-v(*jqfPf{ z5Y*Yv&*18M$>{SPB)zujQvd*cIs_R^pNlRM^tm@)G5Tazy`j%j>!qpa4?G4~m5AB_ zZ5s0{$FeAMDXTbpWt>@+ERz}xYe9JWV2H6Q50Pd2YgO`gS~Pj^aJAT+s~4xY;_Xts z*sRp5!AvxN#OVyT&L8Oeqc^rKf-KGr5VXO z1hB~R07&Z|S*FK;Aj-bln531ABo88~wM~)&07%jyz+jTx1@+)I=5D-VB+0INLz1W0 zs}oH)vL@2P%wNiz=7tH-IeVZ#5kLm^!u{%kp)yY+o03WTPy?+<&-U ztWMNs@Qk5tv+&*UV6wbNHY9>9?}9=hWcgt~xSK2qJeMp#?FV<0C4u8d%2Ei1Kzw>mE_M#(<#8elF=Kjbvo`8j@VwWGMiEEFD4&Cd;2eJvdqZ9IqHz zva8;ZcuQ_}Ja*G${*sOW?tm`!ptgdu_;R^%2MALosBy9EVsl)?7?_J?*}g96 zsAgG|xpsJ#pQW)4yAC!BT~Vr!!%L1aAKf`zwkd)<2cb|1d5-wO-Q-E&x#W4KAKXoz z1U}gE%1)^Z=8vaQr6|e42w>6Z|8$i`onu4rXg?QxG(BZRx);f=Z6Xx_K%@>a1{3Kx z)Poc01YR*BWmml+($gE&+OA$4-bT0`(5OD+N;Hc_m+3dq>J-1#ptyxPwjHZ;k1X3) zt5Y!s3-vB$T)UbZ5FHCs?9gf-vc2Y0h3f#&TfY~ z|6P`C?d;=`L`LH*3v{1hc6Tf5#bAeh;JGGOm^OIE!5Vu*p%C^w$PeyjPXf1-FUhj4-F>A~qx}}49u5=%_ls~)QR8C1ZdBTg-5b6!>1Nrk2-|cw z6bfP2*Z9HR>`LId?D}RuxSL%Ge6ZycozfW09#6GOSCU-_U{US$kk&n_%^od+Y!^~r z8Qtz6DYi|w0s!dNA<$sD{RgNAr`rediqS2*>J8nV4&T+CfU|46zMw?79Z;<9+DkNx zT$kxL(6tx8)$sTpb!9=LszPk3J5w>fOue@Bz`fFS4yOht!mPAnK&!JEVh3<8U z$w20um2n0Kf#*`_zJ72wg%UV_OUM?P(hbZOPn}9DlAj@fMV;S-wC+)-YZM65?5B&b zbdu5KV22{?rfdrb`0PrOW^HgS+XHz>zL(fhoPfO!0K7G$Q#H0$6nU z8A$6MUAjhqAj^K5n@S%UReqKv*EUrO0H8{T5QC|5_<4dVNAQYKCA;!cW%ia{5N)yv zEW`5JHC#GAU2HVwOXcIPn=cQ;zjfEmC+}Mf)j31f?o3%bc9p8# zIS0cNhWN--wHrxZ4C$>ScocO5e3YSHtu^59c&$3QVWu`QH(i3~9s|#WXN!E>Dc>m1 zSD<`FQ8!edmF2bN)m-(<>tU5}KN#h!*1dfGmidwL((*u=aqNB~p;h2D_@M<)g3#M?+mmD5BA= zWw2`r4$5rIUk4c`T2$||sKV*`&bN-@g4^JVVPn&+c}-QWeajkQA!a@{Q5$bSZL3p- z+GJ)8M>lbO*j%gf>cH2!+LlPOb*c$h7-4E%s8lm6ux`FJoF$x84XSYeped3fXc!r2q0#`yL|WokPt zh>e%V3NlM!c;iOU52oSp(lH;rN-K9s9iyt{&QCA1N?3aAo}chBb34>fxAnDrPx)Sy z)+<0-4f%it)2uC^SocYRAC}qcVmZZ=Ly3A`w##LbjFj&$f5aeFA(QtQGD+TmFwCn| z--q1SR2oq&J6YA`?wq#tLJ=G)(=+uCMJ#fO@W%!(tg_nO73}ge9S5 zwT^i}23T^HmMi%zV(^(_fIm`uz=PHU%yBf5Tn|XCy=V8#!$B&0Ht=z4^a+S1xe_u# zmwX1W=609}`uyA)sFx;zW#^L_M1^;1;nz&DQk_p8g`)5xL}{|QXSOsi2%@zLQcAmL zrz_)?=KQN!hF!&ab^g^!0}zsrLaC&QSJ*+x9HNRQV!c*DLV0Mx#xK(m>_H#rU_CEl z^-P|Gth9OPV|aN)c`;~~p+y&MMzf~?Uyv&_O4SLRtTtV7NugeP>0GJNY!r6vnZ^5? zr)zT)lheg|X(haTQJ5{(8<-Wp5>~5%8j7LWEjXpHKcBJ zjbIu=G_AS4IyW=2&K(qGR)$HCg_%;bT$_Ly{j@9^vS##A?Ln3$B$@&Gep|cC-kn%N zX4Tlt;IS`CrX=*jBOt`F!mU6Apt7S^RpI^0Yb({}`oiRNtq6a>M!Rl(VF$437}!ae zUa!r_pM`S@r<}a5uwf(SBW6`I)G9-MoD+>SrO5j}pN~MdBKzaLD`nZ=nZ9^LPDJN- zE?<)CS0(0JhUxAr%KVtjycjYI0%F%n=*LOHxr~$Y4~zPA0t8b2N0@ewhC*N|{a8L= z(U^dTD+PXqlY*t2Vftxw=!g%7d@!I6_ zRCiq~yX#u59aH{xxVwvkyCt<4*h0gf^Wz7~39UpXMCE(G<}x!qO!p9i%HkWe#Rr4p z14Y&cimp%a?fP0#amDAVyRNJFR({=eU36X4|D38*&s+E0y0?2~_`iSoKA^j&>eQ)I zr_QTRof7-DI&8%IeEgHz&GL&`lSSuq21kbO+ZQ^;=)OaF;9-gp@LXwe3=cfatpwZ< zM+i>zQ=_E!$^4ksVsToo>(cu~u^yh&6J|0=fRaqMB5m}hxNWg&qd3m|V7Ts?JRQTR zUo2*sZ*lGBfrq({fah}E6c0Sibp*UD*S(k@bFR4V`C>hyxGt8uZ{}ypQ8!t?!isy% zJ6*9Kd@_9Z9u|Ib8i4SP{p4}*BS_rXDSUz*BI7!W1fFcQr?Ah7>(w0aqnX5g>W={I>T2&5TEy9D&Lc{qy8bu<^Ci zBy=|;eq96Nm+Z`KFRhsP#ZfviAbtvHaS=#T+{xQv<{4Bm^i1Xhr8JL-72`HhsPI|G)&8eTN$*tCJ?WGsgCTkEagN!vb1^Xw1 z=P`xwd<~2NY*4{YJqlf5pyW<#aKh0E!yX4AjLN!omGg+ua9&p%-z!LrM5icIpTM=6 zyw8HxW}+Xb7DE2L68V#$6Ig%{2&g=8{mm6iI^kdJqh4rpWFEqXl74TqFZ@$8z2d8r z69qD!BJ!By?S|-iaq(Blraci*UnZL>KGVyIa?W15OV>cd^M)!Tt;z`O6&X~7SRsgG z*du#JTEmr{>w9hIgvA^itHEDJM=QJP5JDeoTn#N@l_4yGJ8fw{o>^49 z2$&33f;hWkX+MPDYhx6#+*02oK2b02E2vh=X6vt<3kjOz2zD3jWNg=48LSW0rbc0p z!{{fjClICwAk$lEOkhR2+UU~$$vPCO8}F}dksydECGIs(FhFaZMZXm_UD;m4)5&7B zA&=FPWk;J$-ky&XRr_|I^>!3v-0R4*&QgF1`xQqMEdTKT*UMz~s!#riy{g6Cd?2XW zHF^7yl5~__(%K3(nLA`v9vLo_2OOa+otMKJ%5=+D;3ttoBtE6Gbi~1iLKlz3FLkv? zWcEp`{S+$LSXX%`JFw1Hsq>oCW6x`XLuQ`b5JjJp<9?yQRkmNH0iN=(;)fHGq*<2mXHQKrBd4y?cu^dgBM=-2V z?P6TvrG*GaafKVOQxEO)r@?;6jVnBf?1W0y@#VmLTUWWz;UF;YcDIH-mrzPaFW{hU z4Pqtz-LS*$g=R;Ahc`ec;f3u}sam2Kf3~9zfzzDi3)a?Y>vJE7Pk2Z4cYClr-Dind zWYc?P2;lt!uk5C_9F%TKAj=S)VVMFdn$zKa@*#koJOJa|AQKR;!tXi(5s?rnhpQ7w z9CxDo^j6e%#*c>lUnw(98o|y7rAU=S-Nh;%poTU-7zF;U370BC8jHBD zm(7_$=O04z0(8dn;o~iW`aBqljs@C0CTfcrviTs4#$rNbugxJFG7*KyP=5HHwXM;y zDTT;hD4OOAyhRs^ppcHD>hES&tG2ouID04I_$2BM#ZHAp-D;QEn9;iJ>`f5ax)NWi zkg0iW8-wxjg)kP$wyTrlpcBWw);i$iy1Wj{y{6NFI&_0S1!!?f#ygJ=QN>7yEH@a}7Zjj4ke2Hs z+^yS*%HYZ5dcWrw?^pS`TEAEJ437*9FU146(PpDE4zGg1u@ssBV~u9ZxzVEbQ@6mG zo%oArmO)cMUeS4E>^rd*KQ(KSK2eWweYNGM+(Km;8Vdcn5QWI{_#f=lL%TZ4=~Y%9 zvd5M6z5Q3$MyKi&DN)PMwlNqVZ~-S>ecPD~g5}VO+oYByh?9#n2>u|N=3C^B)yG?c zy@h5+>v24GDzqNOEWtCQk+LOkLB~673H}(!8}z(Sk62Aw`2L8dWC8toOGnU{+yntBWA$+@1hG6vlIBTFx zJ8+KfWI3n_+ljd!cZ{c*tvO@0!v^WLlS)n1S7;%=o5TJF{3iY!hZ7x} zFF?W5tSAe#mej71A*M=exYj}o)HgoWRcf_?Issw!+t;Ew!x)>%i?I{b7lC8Lub4@v zt-X9BW8sCh5$oEw`fBj|Ng@2mw0HnJ^(Zuf#d6O#j=XScyfrdbzXUGv<2e|nP!7RT z)WsF`I$hWe9T_+|l>572)Kd9Bo9X?j(DdklV+n+kvew z$Gk?FW+0G&Bgv_J=6hpfK3g3h#^9VU1(meXN2&iNp zDW=yv29}PK%-Ozu0J5FO8!b31g-p%UhU>M#jTLw&4HBO!Pq}FG`MTl(&G<>!v*J^RJxl0z zl1+FvDT*Bfy4FT1(-um&KoN*>m6IszhXsm7^rgqkws2oOC*i>mhB=1rr6<8*s%Pt_ z!BnRvM@4FKFO|%oFJLLu#-OH-Di*Poa-X*kjtsP}fXv4&jd4tyuC;2pjZk*L^@7}X zfZaf&aU~Qr%WaAkT7=KjU)j}Yi~>IAfY!+x{$eFw!e11p?2DfbYh0(7H|WoV6C1CEPBA&DZ60_yCzXKb=A^!k2OiFv zB;XclF#L}(xqw9qN?ioX47J|Hk2zOo5O<38@RT^WbguHXEk1REgZJLA7GSM=@5^Me zzkP+oP*TOBD8Q+{8sdGGCteueFH0P9E5Cf72OefM0-noi5AwjntVX~Mfr^T5N*N5FHL zZzB&p%zOmgFyHJF$#<76ZrlQPO)23!jzV zu~X<}hscoL5_kdW-Or9vMtVyWyw$WAmzCZ}*+&*}0(`0IqGY)JlM&b@9H6DTakKg8qD5y;#4VKE-d`1kR6aEu=%#=pzLXT^Bz6n@4Iks-z<@B(7|zt~aA zh;fO6x0)8?vSR$OjN{}~)MSZnsARYGixJ)XU(BlWFq18XPBEhU2p)Kt*$H^A=stl5 z9_C;IZbbKdJd+m`%8)<}3uLIQV1!~&7Cp>`5|GhA^!J5CuPA(1F4Bn}OxmZU_)V%1E|%lu%b z_F8so8MfUm&?!bhyqyOg77zqHS3um&0}t~r0WU8g?&U|FGXe2gu_RFfB9_2Exf0QZrV(_ZhT*!}E zRvw5^IjJJ>ew z16;Y=AmqEL(()lH8u}+!0A;&+iR!4_Bx-%3U#_aSR|^3Ty6V%?kCA=p+-@Y~cMCRpa)lwD+=QWx!?44%I(geTpf z`W1HSNeErwuF(Cdug*`G8T?l2H}_i1DoEq4R3Uj)7LKF!y7s*>RPQ5apHZbE};VQ=z)cSyu`sbc~Q3XnWT(EW9MIruFxx$&L z!_O$h4aB7viutCv6o2j(mtN_?%4R)_ONRws*-dROO*TMdq0-{2>WxA3C@$5+ak$i{ zO^8baZH`e~%B{QMULQgf_ioLhT5;|@TjmT`s_ucAd0#<@R@iuWbCsSZajS9aq&%-4 zr%FFo{7lKoh5~oMWNaSHW(J%V@$(x61ycNsKijZ!rLM{ECH%|}2Ez||Pb?R%YPu%^-Py z*a>-mYmwJ}#PRoKW*Jz&c4l4G`IoxPpUr!g0FGQhQ$|(olLlQrv^4RdWe`{aoj6CM zlYMd+z%H;)K%6)l0BK`OlaK}ov_boX7n4S`_}!z#|Lb#jzqt5ckIBYZo&c>9xUVVg zEc~&zG9oJ$ka+_a#=(G*Z}fVSo=smqzYuSblz)ogjS$)KFW%Brqj5Ln_rXMw|7?L3 zzq=gUk%xM}G&3I-W+o4n$`7C;66-wt{ZUUPb%E;6AOsKkj9$?^XeVcicyw+T4 zjF0XW#rVY3i1#yxvLWP+rVpld)df*m0ScR&+P_Pi!;Ps?c&-jgz(Jt~cU*B6N0hUG z;Ss8_%oNeo8J8H0rqQg7j_j(?5JQd8(Z-&o=Qjpw_+}PS6>CRqxaJyNI-=>KfYE-! zzzmRufC#ofrLhNU`or^ZSox$$l}@DhBf{-V;bkto@Q)~9OeGXcadFt75m3>5d-kf* zg|15=3tcR|WEkEPGqqMK!?h+7&-XnhP;qCV)u zF>ebRS%}3rEQijjlL6D3q|58NLWWuu_gee#%KzP2@S@!R?kp;hU^BN6r$Czj-C6p5 zKNJ`dJIg5f7kRbiHLI6l9#ypiv1zuE;8T6<=P;f1Ps*Gf)NKf64EGF*+ zB`f|e3%uM0$jbsR;!{?E7m04FG@=a|twKU^;;G7dN^ZuFc;?}uC_{n^21aYmX6Qk? zcOqVQA+C3648^AuhG*djJ+h*L8Kj!*fZy9k%5pI4YVg+Sc%upbC+)Bf3V=+(gD`a! z#8XYvm1Cfau4q~tUJI#+$6p~L|FCew%cX@l+zVC3RzZw*nfHFp@PXZLr=P*wGx>y`wo%8-N#3b+gLajT>buZxuYQCAyd8;6JDtRBq?t z+(d-mc|APY8$K$>VSIsPOEQ%=`g~x_U+4kmgfVet?$ktImBm`>Y%sflksC{%sf2T= z3QcwRgTr?_8beXz?G81P#Rx`}qtZo_G^4=!x|_m`ept@vpC7(AIQmC2MmG{a`4KEt z#3Aru8AO!t6Adp+@NIE16%;zy^O)s9< zyDp%qQR80(jbLd`0a$F5ZQ*2n2qg1#GKNr>h;R5Z+jR0|=-OTcKZwU$+GG-h&SCaI znak-LU-75jF94RL`7jTfr;1jGUN39LXAd1~jG8q>sgq@=3gN zVNz-}+bcG~!`a}{3Po3ut3j(9`jgplR}esDBe~0L%RLLBpCF&hTB!yhv)7c-WLZSY z_ES4V@0%>!&(Z+Sj+Yi{3$Uh=+W1M9)W%OK`%hRkJ&D8^;}Fsu$TH5p=V9S) zzG4=^cK}vNi{PiwwYWv_W#}a>0$gNi5ybgoma#BLB0(@A@&G5rEcN^cXiDn&AMsT10yz)wE((n1_@3_86CZsjDrAcMv)99wg&9}s za2Rd}+os6PV0cX2a@edHj}t9`kIkhbsg#tPUK8+rhTgag`pRJx2@EWxL~*dP2qR4nvIO z6$r+&I~1RQ-QjEqBT(LyGdO2?ga$X#A-NJjcg^y^nJCLc&Qys0aYBF2ERTCU`ptml z@hKdFw>&=MVc~ANVwT4z0ai)NkMBcM zQo|p>j{)0b4drZzYz=V-q$$*xOyX!Nt0J$N+1@{)feP6RVopK4sY+65~#6j}>zJUN|*A4hur&#|eDM!fBjofm}U%kqZ~0JR{`qaG7T#fbn4* zsE`rzDX)hs3Nwrl9ERJ%wh?l-9-uw9>(gaBVEnj*Nu z86X!Rd(4Iba+$}6`6np5ydJIq%rHQ37;e|v2FN9Pfc6|OP?s%`J$horEf7PLtH*&v^Trlhi8 ziys3Kk<)D(glpit7t5LR5O?ZSYFNgQpGBCLQZg88P(9O)2>5fJwgnuX#b+d|Vc zqJgnY)P@GjL<=^zW0Ym`03aYOlON$HVVQ_eS(b^!xD(5ST)l0r#$;``GE8#fB2ME> zyJQwkY!{(Cv*fq9%(G#ZJd6WbURJ(YGXJmL9G#8YQ^G<&2WK6WW3Y zkq0K z8MX-y!)<8WHhH}spglM1(q)_EV|qTtBPE6w$wv{4XOk#40h`3$3`UlGF=uSf772}Q z1VeHQfbNYdEM?cpX=}PI3U*Ztb8p$gC@t}u=yXA_R zBR>aNCC!nCplfk+x6*ruyv@Hn-YGqfSwOg50J*CL1irTXqbPrK`wpzMQ z+hDsVv-T_^JKa7atMaV)vumIkwAxpeGSCoae$`pginiN1h$M1%X%e*By%wxWRi>9i zo&A)3isK$X9k`*LM#!m0Ysez)38s2W`xXnAYORHbzWqwH$g{{^DAL~=?gyV|vbQo0 zuRGC4QSq_AlCEeautPdsv=<7upI%WP`|uCFmFCE`0OC5R7YX@QeHV{IRCoIbzHKlx z+NiazfDY@W3uWg-Ki(9q74#}ntd?q08vY;F+)VVzEmS+<_3-3ixR4AEV~Z4D@YyEq zpdMhhIT`&cW6!P(GGU+6ELndxw0)tTNO4=%5FvR1f^lux_A-lA6++H$28)|>u;8rP zAQoTNl{{~Fq-+vFg6i7Q` zjR2nv@DK68!w*{%@Z4?s4?OVjHYMPOK>HD&N%1FU;aK%lY<*?hYiK6ETQ%_X!~XX*5c45T9c%>az6e^ag6+8==m^D&oHKckfY~vhW6lMqT>~gZa+;icNlrVG%wJ{P`gU%L{}#v!>Ex@?H^YIq^P~)O;2Xqb z^EvSEc;I0XN5FF#@8dl1Fyj$$!+47oAqC;Wa?Z3dbo&ZFdRZ1sd-LeL^l2nZ%E2#* z1&dO&vE=_bPXLbm$@&#miTZh`E9nTI41phF;U}j72;Wdh9tS^y=!%`f{2Hr)*(q$b zr?8(|AK_}M>3F}IsjXngO}6_}YaiU4nwV%zwsthf;QrQCQ&4QTIejAP3DC`Cg_ zzpz+YAX-~2|4bf%4@G?o@QCjndEPPgL#!lfk><}5p z>@)>OYtCD*CCGY<&;G>1FQXmh;NCh~{Hg+?CU%hD_CByPLJ>RDGug2t>Kr;FWFo>a z>RqW@0F*j~mLW=U3Rr`m={)bOdB&uYfugE=2kY>3(SpXV1d8OcWeJYn<(f#2jBc;6 z$`aVX+`pO2zS%TPO@1rKpy zvE`wLN}q?6Gz_QpR`5}-3ce_9TZ^3mF;?c&3CSX9Xmhd#7Bz25ZO`Q9)KAsqR_nL+ z(hF*n5IcesU|sXc{>czzs1QM317m>j8o*9Hbl~wc;FaV~Yj7z-lCQ!m@G7#dq{_Ea zzqx{Dr;PJg(l1ZoAzyt`y=W=J+{ahetxKOkhFSurLHUaD0qK2IllNKZw$*8Zk~4JH zU}*H*LNt1>q|tMr6SyWT+xt|imdwJR?d$|cC=%tqU}JY|Dk>hDpwfnst?BoF$=LY%go+~G{ zWL%wS0?#|1p)V}Jg31He-&|qZIBU@EQ%@&G5ngIQS806&X)2Xg;q~|!yB@`K+K2L% zDO;!g19Ua3)QL`uq<~)7o@57-V9nF^1wo^Bi`Ym@%q}+kt6C_5Zfq$3lt*i=)ycIv zgu$lY1W^ST>=8|qJi)aFbyuYd`36ELU4Y-9<}c<$VGxd7c}MK9r$@g=8bl{Ck;wU_ zz%?au@MjyA!|oxGqmOO?ly^?E?|=&{TLvHvNnAV%I5)QfE^_+ zG;thp;nOB0E&^>1Of9hCNWXa$NB&GK9Z$_-9JvyYiwsAi5vEU*JOwyk{{f~iznJOt z7g}-R#8bqIr#KOR?iMF*^*4X(#M`8^DfYZ%tB%y?u&?*gMeX zpfqO~8u{&``225jXjGifPe(_!QZ?~=nH1Oy#r#{4C|DacERHRED}(i++SDjGykH^7 zIF>JvZP(X7DEWFJ&LBSjikNkZ&++F%d`{;M#LlTxh@W}zvRTpM+8+ztvYU3owZ8z^ zQCuqtl-RCUa{Ez09cjlq=M;Y_GfNs^x#imhZ7)2sph3OkivtGT#mc6bMcn1kX{Kzi zg8+7E;(pO0u6@$6w#+OeiA(1NihKQ2iYJsA`lJ~o@LzR8;NMyVwvRKmmYHQ>d$jlI zttd{#k47$E-oXfY`(v>Zs%mKSgF#@d3<3#snyH=A0N4d~3dm_kc_Q^~F&$E#fi|mz z@(k%5Ln^;pln%WwM`EXRC=d1i`7piJNh`t!dOL_u3P9#Xs9zx?GTBtcTvaS# z_)<51Ieg@ErmMq8!71S}@UMM1un3-?orGF2(^o))R(r!>eH3D^)#I~_Un?sd-W`OB zx`S|MA|3P;hO*VRPr{vcZjO85#blqI7$q znj@Y1&{xB;_pzJ1I?UzC->du1A*oDW{ytT@c%Q{s>U0rL3=QtdcX1j>_TVhlkf%dqD~xmkRr*q%cCwl)?Ge*ABELO$2@b<4W+l*`5Bs)X573^NO}!;a?p@THuNMLZrTAiY z+jfm zIk=IBZ(CE0vPmc3!I2A_mzbk#T!W==MXP-;)0 zB@8OHOyk&6BMJbh5xo}-0WCFRBv?R^d>GJ>isU2sNhlKWDMOKvL@ujDPKA4HJ1}Jh zZ2W>2{knWzVgb)oDJ6^S3cUq)=LQ=Cuu1Tx4yXcE5TiWX{%Bj5S#yyF{;s{4Y>wfU zs%7CXv)U;y-ucZ4-fs}cDUZz6LA>C-U-zAB`js^J%>1gV!!SDD&_)#j_aoDLRAvA%7LaAuyf)}GLuGQxN zu|<6~OdmUMsG_J05>m>lz+Q4Q#;hmUDVA*gVkUHEp$XAR%|__NZ3KH?=HymA3mhxk zGfy@FYjAbxKFaeNQFUmy_*GvZ%t#}nG@@6pf@z;A4JsBdPWks!R()yWgY*si3v z1rs)ve0UV$n{PzSn_e$IPo|75*2H96id zN{Ohw4ZmV~Yrov!O8IpQoFV+R-YW6br0@Xkq50sNDH7xnm%;-|=mEvFrgGQ1nmhwg zYBS*h{JXU3UWuQCRVO}WSar1JI|&b*jD|=HYEu<7>(UjZQy~HcIn$=g4-@qGT8A)& zz$yAXzE!o@3@Ib0<_E(U?_~Lcx2N8w`?g!N>8_i331hURF=en%K8zDd8&ld74~Tz| za-KVTuck&<4Jk272WHe~0WD5@cxF_HDrVy*Zw6@HGoua(F|@X!Tij*F*ekB z+J>qRjF+XT0tz`}oGJ;aW zO7RB%Vz66L2s<)f4uDSF{ z6221|Zc5VXMNOaUBo_j@oZ*IlmxkLl_(>RU;!}p<)?qkq!$@-nq=^a1%UXLi%g2TkBmZS6l?dEJoAvD!J-LgpkK`Iyh-N?nW zG|I)bi5*AY+@#GSl*s#uMM^6X1pt(Y-V26+u}WkEaFSFaC*dcdM8u~VQX;aWC_nU`t-??5uFvjZ0v$m-R#(J7S%lYJL#nbk#~XW73Qj(!{QfU+sw&CQ2!@6df` zH&fJ}iL}K`a>H_)LUQir)s*xftHY*}@B-0Q(TlzrN_|4lHnjIM3N3#GI)UYu8^OMh z2OhqnK)`d)ExyYG4-0StZjq;O((JGJam$*EohQxyOstB_>g)mh zClJ!W&*=o1{9FvX+$JRn+dmoNY%N3_%EUMyJN3|(i^_sILTH6bRY*Tkk!DMMkCPDN z6`{#dBZGy|rsU?G&k`@{a4( z0=Mj@9i*Hj&jQ$X#>vU}J(PH@3FOp&@acnd_KR8u+AOnI*f5;m(nuv=Dd^p}I=Lc; zI@px*TaY(xmmma{5}VG8fJ*r-YC9?ekH?zwTa>KRTgCBJgkhiD1UPW{E%OCMj7#?!ch0`Ubtglx$U5{W7Dj!(ubKJSj6j7}op_P}mj(?r!9* z_;2dIvzs_+<|RCEW5O>rWbqAn|4#+X_uuGg7BJs`1)XBd_doH#!{$2y&o$qdUCAwO zM)7|FZp?Qbqz)(vkc(cVw}&6o(ge16Px9`&bsFhC9MDSHlHu1OBmuIeoifJJaQ~TD zW_QzsjC?fQ&2~wCimTqa;eKvcXx)9oeN%|o*2;T^dx$WG{K@@5tnL}^PENd*B%n-1 zK@qty!W#V=?aW||%ez;&HPa^VUAk+kRhb$e9l5ez!Qs@M!&dFedUI(FZ#$h;qRi+mfGg_zznBB8KNpj(Nn1pxsp~bZt z(~twf`&ed{$#DoqjBAqJt@^4FDI|ZzB9f6pax!!RC6ViFoXZ0bFSrCAP%tQ0{c5on z^CMUWrmY}yU5kh}?Q%*Q$ysCz?=ah%1vNdBc`(QB8M{uNfM8rQbmwHt2(x-$TEw7P z9h2*>0DvOVJHil9M3|&az?L+60iYpO$qVt5P$l9Mt4iE)Y)223E``9BLJ13kF7O&1R@_AO2Zl_bQE@_>{tK13oI(Bjrlzs(r^}fsTvt6|ky62@9eGwH~D3 z=M~go)YOnXJ^X{k}})cL6^gA3oMPM@;=YzX@WJ&Ulm`{3~1PKhxk9N!K) z-B2L87r}U1);#S^=R4*HGyXs2jL%i84UTW(i?$DDas%vNP1MZ(6?B<&>kXCxIk!O!v*PM^aVqP*llr822?y-Yz+cS%eG-9FjO4DbZy88*W}j4M(xq*Klk^Kg zSr@>SDyh_35X*#cXFa>Lx@y~}p?XJS3S&iA&R|#(f+q4{jbpaN8c1$d>ld?}1MG70 zF4_*=cjoVqhGy)!g!4`my1JV0v0beZ4{7R*1w8QZ!4?6} zHN{@V0}uO}1RP#^IMKorf3<_1M(_C{IHg@N_+ZvNxe5W`8knBRW$;^v8Z!~1S5`m| ztU4*tIpR1Whc73}mGM`Q_M;^V1S`^yxorU+(dTFYLmw9$r?NHDTSRKvoeEJlM5i0)jmQB z%XKw)NqxN0g#V-bS~u1hoB}CXS94J9c2K)M*{(wEYQt+G+xqw`M6tW2!>fmvONJlr z1$Uqdn|YZEc&Hn?2dW?1t0e}P+n~o3VDk8=&7*>CjCkD!l(2W2w`ncc9Xb2}Ff1<6 zJp`)j0o6+tW)juR7-`#i6KSx$TGHZ)fl%JqboLJ@@51h3>o9CF0=SWq2v5!uy}6{7F?J!h=mDr z9vb9SiH`|;GOg_7%7qe`nvMEuCh~c9A{mj;&p;(WyHy_GfrqyW z0XKo-{Tz89=;TBtN$Rg`dkqZ*f5+otX_-RjqTYDSHT(9#f&DaXy*IW6O^szT>;K=y z(s^PfoQWxEWlV%Dv4ZjLPlmu+Q&%DgeEV?-Lwb!1Wh={t zIMExxUCv_R?R5aFWO)0D(6xAY`zYuo!`rw(GQ6#(s2R0qHno#r3tTi#i6Uwg*WL_G zDXx7qehkF5Pa&})U%D8Rc2z|l?+(Gk?^lo1_h8~FTGvg?LY*3b>iP0@NCC`m2Dt8)fCodpQCHUowStX z4z+}YfM%;UK0uF$x|yj;r7K}U3g2+Tb%iERxvAGeC(!Wz#Wnod_NW}mCRL@In|f^2 z1eJLb+1kwQW)B}%5c*tB`K_-IbIWdOtLdWot+xPdJHOQxc3QlxPBej?{8pd7n1|(G zeDm8lYtZiN7ec0gXB6S38gn(zJxEijc?z$`huQTgrkFmMw@eEs>qGF?*K{%lO5a|z zZQ+)aYvBKm=6EKvrT~VO=st(rP~eu48}~-r9l5ap6ZvoLGQ)JGwW;-a}5yJ{z(Z zQAwfCgb=n`E};Xn3b_vbmFwVj8&KnY7mtrL#8pyzcJOf#{Z-9Ne>XDtEBx%jD1S+!ksE&e9uGWBIs%?6gMY~b53?=- zH!@h?-OCUqU_4m7@Gw87wQ8KmO^Xs7r2|p&2eBTmF_NJ^B>{?XTYg)NDH`i0IT(qA zk$tx;6YW^sVqsdRM8|Pgan_dYTo$5s=c40iK#U97(Uw(}nL@NNR81ZRHQG_URVdy> z8aBLv9^x7{geLcHlvsw`IDTFbweL9pD@qC$GtBKT*{gWZh&O)T2 zSlSiXsfV^^RxItS^UbTZ((J4z-%9=FzD&9X%==2!7_!p)5}~ziz#CE}xdAiABY0M! zxlyQW4|EEI%JAnxp)xYCiTEjV`xPEMPuyCvA6b$@T`v>3WjD12SJ6<{s{png>N*F% zi>ut8Aub8z#08Vvj{@qDwPPFO?{*f}n-UFRDF>Dhz zc`Gy)Dz<*j#OTPtNNf5=6QL5vR-$>UHVN;4PA4CO=B0`IMT@w$DgU)Hvy3FJrCu>; z>0ciGVVR-751nR;z(4AQz`wN!Y}@MpU1pY&z(6!75{$pv;v*CZ4z!ssq@I!1eiNhj znE+!ehwdm~z6pXE?5?Xs(_Arq9C-qjs*HxMtANOcci^jM^;WKge>cOw=blB`IIg(X zP6O>+{oPFR*h!aG+42rCC$W7LbP9-V{Mn{^z*h963L4K!s<`HQzXyxQi$wMl1YX%q zJCQ1<0qiKLqKV`1q)(d=PX^i?8eVI&etw@QCS8+5rxcU&Q16%gJRZUN6kA7|CNj2u zncO8erxa8*xz+lut>27QysqAqHMIJhLOez0*R!!xp80jIjmdr}NAM!DDIN@~?fq)7 zdPO0usFKRdB36)SjT7iHt(|vbiQdj{W_Ir`G&`dCJF!zCnp-L~Aa!uF`C9ce(TH^* zHPoD# zsUrB=Agoje8+*n_8@0h^WuztjHZV|%cQk8%NA%ij8=_|}0f|O0Vf@Q?v|7OLl2fGR4wU;e0MK6Ng({bFYwB4YAb`Han&CIY}?kp4Znxts+u^C zlkU?d)7df>kjp%oo(vBO=yVmCwnjKO69PCtx z;@0~ak*3IBMkXb= zD6tg(74CKA^vYWCZLLU7HKw}lXfHO1NKf1RUd>uDG8!9M|=VtnxXdEj9moPg*0;Qz`45BuN* zysQuY8-7g7LUTm%O#9%!66@h|dxj4lOWh??+*Zn{G9rN|>sOf5?>5weBE9QWg*uFd zpPU9DYIa@|nhB4CAHm{{ox-u~5d0Lj+EZ9W;z>dA`13Ol--JeeT;O5lCL<8>| zjMXMvS4}lq_2%@AILj^eEVEUd3V>iTS{}vZ1@{aK7cC6_wW1G)ePgI18uV5M>qE7vQ3$9&n8lWK{-cDv zA@Sxyv!bBNZO|zYRKcHZJ1*cTMQ1+T^nQ77pdD&`<75Av2%?}2FACy7hU!fBxpKUrP_d(-$ zhc+)#CI@tE1I98^Fy;Lj|&ziLS7e_Ru4TrQWwEX;z zr#O}}PYT7cl<}ySHW0@WVwH(w;ooH(>*X*p8OIWzW+;vYNyo)=L~`R;3Tg*&tV?W@ zUBRpBtOyajQn#?TlD)P4x^(giMBG*R4TLD~+BvZ<1zZWU#rg*$#O{Q}ux%uli}_gB zTXf&qGq?2=WT~^6%q#hOJ-q@kt&c&cn3&c-^1#C}Edrh!)A|=4csQm-z{|$8{trK< zWgt6Zd8T7pzYy!;a&<;bOA;VkimLDjhDtsZ0&C4twZ%}0*(S+7NThVAb)T ziMdz_4$DA1Y!A27W1}mn+wBL??RGt42iGnS1{B@R6Taa7Sbi$u%_D(_>9vgN7@;7w zNcLC!IM#X>;_0Jug?T4;SJOlcU&G$aPmUvE?jBK*un_B;&dHl#JIqKVOlt`+r^P$G za^r~r&6{x#Mn=NURgtjF8bm{$8s527m9~OJa}gp#%`P->6*r~=XmQ!7w-64Cwoiy3 zT8!eBKDruV%ag7Mt}|xAH6Bi`04-Mbs0FY%mxp<7=6TT7Tq05Lu5eV)p2IiJFqL7(LXCO4av}7eplM&@dmF74o^pY^zLvzbBan@HEm0 zew5o_W)r^NN&_j6!(}B~?^rJU9oVUd^kr0>auyQ4K3Zrd6q~#UIt5~r__J+yJDWaK zcTU$;04X9q8&ci~&p03GRw{P6NTWm-;?#GeQ$E0Ma6WSR9^H4Yh-?Cv`@8g$y42i?3;o$n z%ww-8d`Zu0F)6&605mKQsPK6Z$Vv^)tsankbkS-V!T zH-0n%<}`MMGRb&y_-rkyqQ)3u{!D1qEf!R5F~V%bS@LP*;dF#~eL0C7HY?|&ShonZ zoh6j*;X9_57y3^{mX}dvS&Y`f{<#FubLCk$s@&kG5te5Xc$iL(acKDJIs7=*8gt}I z-N22AaCMc4;i&Q}`N?ra%-t6%svKf>(>ZwuY=Le?m7U9|$_4?uS_GBlUK2s(cj2~+ z3@UH9uzuB4y$P9ewF-j796AgmHzDLFE~qvq>H{M~BlW>b>apQceGTiqmtP%=_0V^a zsg%iGLZpakzMJ|7lNfFcece*ZQe_ z5Sm_V;G{M4QZ38y0m|?4$shx_g7Gh;7*G_ zPJzA%R(1`7LLB@@QCOjgk9o@=wJ^gm#>N)5gh=q zxKJN+MAQRaiysl)1-#nP5s?xz3&8xs)e+nI(G1I&z3VS##NO3X4Tn>kCvRI)yhW)d z*lXH2bcdv;SebasSujHxZ`p*O#7nW_Q%1ansFRB9*tQ@F8A4G#U)vy*)X;t|)@x|kZ3oc9Rw?d2^;Sf@8GE_zA>NEV6_CEvEkhdp zW-Q?ycr%vph38VU9*$KlhMnh94RY|+rKh7ZBSlk-i# zqD$k!3$i__1Q8dP41&lQ&oC3eJ6NF6H07vNsmH4InCan}qbom|X<_*8m70q}u_yjn z)0gSKv%JV4v4+j_sq^L1OXVoPnEBnVaSYFodob0^FL@J!5ph=&5?m-(NRr!x0_~se z5a7I~S{V3b5WI&)Fe3@>{m=<$koywB=Xl^@KaYUt2LHa!0}qF%2zc4x-;en*E!U`! zSDqLAYp=@MZCUS~{y?mdC&k0zKuHp#~#Dj zY(?=YWr+z@-f1n!$JVc@4|GAZA{g%|&X^kcnsv26W5{S$6>vRsoPrA7*RaoEw+*jh zFVuZ!OT$V63r%NfSoteySnXy)Xgg0z zKcX&ehQM0$Q*BX~h8We=rOSL#lA%*k(wNQjjjm8Tbttox4rOpK?l^%_t@p=KN2%5j zfy^=_n*mz)RO@cUjZ~|Y8$z{iC1OI9@+>QWtlo5Sg34>o22C;rbvPir|J2&mwQV9z zuA)^Y#oF?knU(xK4X(0mJa)DC3U#>*+Rw637exArurvhv{f$l$nn?!`xw#qeOoP1%QE->5F!AhXb{@$XR z9p^VT;>P!&^p0DdJUWLs*pyO(kr(r#xAchdLeVt;Xf2`^)#**V-uQHfqP zH!k`?fhN*l5B$YQ?fsv_lYtA58!{yOA($C)-XFsvnBlxvpi_+V{&*gE*m)=5xz76; zJn*pdPQc4L?-%l8T26?g5xg9~RMMKTN=y2YTf|y;Dn1+tmy^$y#>yc_=lzHfSZjW& zEjsTZMs=NcZGva$T@*xS(>(i;N9Akc$f3OT5Je2#lZQaSbidsRjEx*HuhA&#+j@)n-B$W>gOW5 z1kEtS?a>UO&7hvSR2_o;w-M4n|CtR0++Bz|WIMkfJN1xa>3$#}IR?2;DoBV4n5Fzu zA!I2M@OkJIhy>uzwv7=GF42*I?|ZO3foe%UWHE{a{ENUVyQ!@Nibeu{0I+SZ;0^d4 zD;wI808JPt65!J%6bT5l$&Lj0jg2T{A_1SxAr8`!+z@2ONH^p?qG?wm0jsWa*(ZA) z5mnkZhhnEf`$muz#HTteq+Q|vY_`bph43Oz|2XKB=N}TaaSC0gb^%ZSoIB}i+K-6N;lj}b)+P-biN}swelUQsY**^ zlO8dDuvpUL#At1AeX^;bliUa-J$em|B)JVJV=G9OsYKG_>vRv1^mqm!-TkCT!k0;U zR4v@3M}u7Z%2IIw0-K-os2XCrJfxMadD^_vglM&o7f>qIfzetMo>d!9=RDGIkn^}E z6&3POagrVlLGn{GmJ2MZSJy_T>hvJ@@C#HvYy0urPdlbnzoyk+Su4<7yRo-&8Wy+M z(Hz;m1F~-i;0AzhQdzrkqpGwBrwpQpW#iqinTXKJ_2s|q_3#)q?91aYoJdnH>hr-x zy-yD?+pL4Rly_=6r*lTt`l=HFriIzq59;ZJb3#5ie0M!`EdO?g6v?j;jF*eDfOuZo z?)1%!{KuS;xqy~g1Z!lI@3}zmrk{*r|7yZE_OHN!vZulFz`tPyUpPFn96E6(l;S50 zk1URCi{X*bw2dB0J`WTv6$~KGk#$Fg7ba(bbC5g?(7;?3H}mB33TN~Sv}`fKfS$8z z%{t`X_D}3p*MzRCk57&DoelrlDb@#zxGkb)*2X`{BfH~}wO29#-Fj^s5e{WT;h@$K zXLv)nlA_pso6~X@k-2a4ROnj#zRh~*CGXqdGRcx`OEhWm!3tG+ZPxW0@F}hyCr=SQ znOBiq4o#_o+KKp4-uXP&N(yNoa3F1Xp3F0`z)fixLvEx7cz3$kdyGB}#I3=p1oPNc9@g4_ znB#bTa2>&vr4XvaxpvFz^dv%hIHUZ+tDzGZ1=i())79p1UUj;Y2Od5>A>g@~-@^kB zTU-QuWjjqU!xY%ab~=oz^Mgf7p`w9i*de(E0pJRmp2>CaTjxqrXh)$Z+ZMx5+B3Mv2$7HN40N_vuXlG@tFVO-el(POKz(ab}KgLhu>|A_GdDKF(begi>H!{)e zsssdhol8Ig#Fv2TM@$jH&xYCmL~EyHtgEtk3HaZ-@9eUkn2jd^mn#Vfe~gxX2VU>) zba(O@(r-C*ijjV6c;I2_N5FHXUoQ_lEd2;LJn8EY%P<2rC@%R78zjpRfG7EW2V61} zk`K9HP9&dXKOy-Zq8(6L@+kly`2w_ymVD0yx=YD-8GaIyPkfpo$=B$zm%NMggsc;vW=PiU86NGbl?U)TmvsV&FYDBgDC_XEVfJ6p+Lf{L zexm!%uB;QY@nqeywR?s~TJ=#l)rgjO4{Q7jNW4Elrx=O1^trASah1q$SmF`zT#2`e z2OgGq1RM$~+q5#QfPXJ8_Y4yxzefO`-1`CiHWP9Wd0qF zMghA%5x%^lw^D00>yuaaSEx4pHuzGXoZ;inF<3EMB;eLlp7KqlCCHXxb2`kOiNi_2=5Tx#-FQ@zH zayaHDL7>nMiO{S4UC&n9Vbni zUbSoH^;(O5@bg>+;fZ^WH2J#ZC?0s2tvR}Zd#qlakX5Wi!Qe>Z{o_HGY!eJeVt>Q;f83@W8_q zB;dKy`Z+xCFk2IFBdzyy>_9=Mu(0tO8VbIg$HQ7sPGG0RjyGOOUVo`rDNmemi&}&o z^V?!_Q^=$-J(EG;?9M$~mE80?+$WUWB+WSCVh+L2Xn+S@%&J>a`S5gdQ)5>GWv|)9 zroZ>Nz+s~H3M;Y62IeL;eGy?u({iC~WvPh!yaC)bEtb}FZ-^^wMqM~rAA*#L>11pk z=(Z)|+gNR6d^-6SbS<9N^fBlq)0%LBWLlG&A}p86X_^yHL@)?0ALlwDl9bu>GiXYg zO&`aPfy|~eHi<-DxDQtutBu!oi@cKw%yVi?HhU{N#8#<|4_0JiNrj9oQR!aSsq7q( zkyF1WWWym!KX4%@J2$?eSP_f1Hvto>{8%bae{<@mYI3XfTidRePkYM#$&h8==gT#W zBMaR&c@%c)AxAOlZroAeFkuCKawFw~23R(|w=y;bf7(@-x;uHFJqyOoT2%;dx+ZrB zbOOa4sQZF{aY7U;+mB{&HT3g48qw~DAM_qtog5_aa7CEUfpjeeNu9SdsRqoS#3tsU zz6{6%9+b2ZfY$R$!kycdKh{^kpt^ zh($u{Jc01#Iv*RyXJ)x4J={83?r}jg7lJJ(nB{&pbnVV^M^YeX)lcti9~=7mYabzS zdu%>bq7U@IrLI=Z%p`0ts*gkVY`r;+iNCG(hT7m@@Qp_$KuB|-_=ERIpc=p+gnF(FE@=c1hRy*h#iu*_K}neLkn>7z(&?O* zonoQ~U*~~`qXz^$H+t{`9(XuWf7j)+i-;NLM+UC6rA)C-X3fux zUUTh=^vs=X7PQ<*C53Z2ygOocS9%PDT zz$?3{Es2U2gLxjnwhKp`hTpLmj4$mqah!rMK5arFf?}f>LY%88k9Ba6trAiVdhesq9T2Ys&CZLQ(G*=XMfKx0>7nIJBA9!|?Ai0qOJj zNhBbNPpK3iVG?(m;&a+4nCCmBSZ)?K=TA&Ih6JilGDQ=u|2}(+4($3fvtU*SY6HVy z;qPiRM&VucizcCVL1o=Wog0KmU}}&mMqn~Jmb<7)```W1aPq&wg4nXd-Nbw@`@iVE z?dxXW5pZYec?2uc)bm|~tR}XPut0!OP6B;1#Cu2+pn#X~Tj&(yCCq;zw=x+Cq69qG zOIX1J4|@p&+;|D|kvRo*GHh4zcSEno@S{fBt|>o3qS1lvS^>OLwrki?h$ZkweySXS zqaIj4pM}ppupT>w%h(|@?zl&ziJP8q&e$E;$}+uP%u>R}%C@JHJkKur74;l%`uTvK zE4RYgP_O5w5sq$1;9)v>7V0~A_+^Dir@@9adBVvzpWxBw$dk*`%DE14s_C5k6L4== zo$FOuMvV5d<%SWS;dgNFM0(kWTp->)RX%o8c-Kmjg#TzH%lCLnTa03P&2w+a2qJx# za1XlA)%+Te_K`4qO8g&%h(!MLud!1PNx`U7;@!fKs#MV+FpqPCLA$PU-jIlus3MV- z0jLfl-|U8uU;+=ykV@N-F$}!ggO;tPEMI(;z%09|tvibP;ynP{_Qk&qd=T`- zC3)Pb?$cXQI~PBiX`WPOnlyra{u_#PEN)C-37(p?Qh~$Lots)o6X(biH5%ZSVk2w(UQLaZ>4N?V^I6!bkmNiZtwd4WhiYP~kfY9}Vp^CrczGdgsmN*@Iz_GlPOQso zP@uBzy9&*Y*5V!5snA-8$~jihB_Q5WjC*$dr=yXxWphE9L8C@VjZcWRLaDLc62tgw zj_!gko-zJyuTz}fDLOYXXu+vn!Avbm0DV+YDSJXzxE4975cBg0P`FmvfQ7=f%DUE! z9SGM7ZN!9Y@$WKRyZ?*flL*&}Pcsv)J!P^!*0{P}JW%`Cs6efR-a&}=SlhcHTy?@h zcJ>9N8soH-&7-~=k-Qd&Yi~H0)%eisF}iR2n%NJ%s+oB~S1;LOxbrlOje42|0<8Ve z$qiJ5uiTx_0}p%R1UxsudKnKq9RDNWCcr8LANp@$P2&mUQGQIzcybht7eGpdSH&nD zL|2E!dbr%3kwGH~kS!fmI1WR1r-Z;-b5w0HbZ53paxxMr9l9%;hVkmI(7O9+7_W+> zii#A42xG{ftO00UjTEg&%TgU9k}D&^9~Gi5gg?%*4z8t#=Ur>*yHLnkD-&aAvN4vM zi&3 z1;Rl1v#r?!(%X%VXgQy@u>a`6^5m!`@T?%v?*(4jO>OyKGzj!Cz_xAid+>WGAwv_# z2~PO5ff=XX>J7BXNyzYf7#YTd7`~rFCCkD`2931vzZ3zLEPS;m3t9L|HtPKnu<#GK zfltW5ze@}M4E!W4eDR63@Oh$AzKFV!2BV@GCgI9cyN;|dDN(c!v4Q@i)yViz!_7nzUTt-zUQv0uW>%VPuDkUbuZOoG z!tNFh!wGfeL12;Ym+ArLhDkxlTW_hXO06F8wu&}nH!wovU3y9(=bA4nWXO@+gu zaFC;YSjLviDjxJlu|S?23g?tbiWvLFH(8Y&!l=g=1XwGywo*xS68a>!(`+c)X*Q&< zh7FIok+mtps2>TPV%YFR9(b4y33x6WK8Xh&WkaYE(1Cqqe#k)e_Lq%^GDx=YIYRFZ;xQ^NvR7MiQNmkOQ03s~9q?xlLL z9I+P4*3_P0+U>jEgT=F^x|b^O%5G|Vh((V{Ls%3SuTOa{5a*jdp zS380We@`8Q1lp|1Tx_$1emA2oeaBMo;?>Du4ymx|H-R%@LN(DemrqZW9ww%E$GR`b zm0t2T6!t`4M+rFf)y($89wD<=8>c`F`#~{<5Y6!~_PRJc+g_hpfGF&cg-Q^88Ap(c zI@+%@)BTEvpF7=Rn*2+G3N8d&$TLNVz5`vmqsgObptn>{avl<4&C?bDGphB9(!Z;d z_vK7E#pe9xxnJ&xzm9-Pxyq;(@^Gc9Z%>VYN(YHb6Dq~+YK(tYh1M#2Mq0yAu4$w- zQX3t)7OqxM%mb81vk7_fx)K|*bARl93R}HjH7J?h9 zw+4nG;SXwN?5?*e*Z|KMdMktVq1x1FtBHTvi5EI{5=t7jdxJ#kIM~Sd{J%LzD@k?# zmwJ+C+0n*0XfKr1P;$_}MY+=JoV}@$!tXYK^6SJDfcTe7a+A*#AHSprcT7~7>jlGrA2J6j%9nF#5JDL-<0jL3>TUFL> z+^8=6!(A5D$>O3-9wX#eQGc4(!(*Lr&;*C!#Fz?MrE*niSxfn7hW6eO z)gpUQK!E7)hS_&&#KQ+<+_99Ibg~1%h|$f;YfHD9ACH`5(a0zSFb zS6>2mOe1N|10BW83=MDM;oEV8u9gNvbKHt{CluRJM!B3pw)6_~uUSgdGwFvJb{v8d z_{mCD8L|W9_V9Ctd**fv3Ag(+TGC)VEVI-i>K#fEQUJg`)_cPc6rB`G5i$al1*6%whT@eiAuM;!`S1NJ#EZi^`lS%hT2;cYrA}Rd2R}_Z5N~NEeDcCFKZ( z+V}Y*Wh$cf^X5RFif5(_8R*HQy{#W? zm2Prw9~>EIT>&L=uy7t&jI~xRx6yFDHdvp`2iAmp#jVDbb+CQW&V)hEsf{+N@D8ne zvk$VH>Z46aAZ|`H#+&K7n+K*BQ2Kl6KNvyz9okjOyl~Ype;eeRy6+>1BTNp)9gqAK zCezHMbSzdl(_hTl+rID@WrmB-W(|L%*CAvuWMp#u3Oa$N&ducb6AwImEJ?s~&46WX z*ZFX{FXPyWfLo-&T5=fMh%ya&_%Y|oG&mg4N}X?nPn0DAT-9YODrH4r;>OS9G8+zC zW=Xpgld0QzDo!igT6X@KJn_Q#o-U@A&uUwF;9*uH;JK`J1rI!IaT4&dtk&SioGVtl zQmlu!*SMuC$!a}Hmj-ocn)zgNCFB;;S0m?c=E)hJ!OO*D^O^6>Jn%5{5%65*dk+sh z%zOmgFyHe6;Q?TK$M0Ad*(8bU!&vR|ym@_w;)ne~v)jW@mR*F5@qISqTL%89ypD=5Q81 zn;H|lch|B*WY{P)g{>>BSgN_}3GoWQzV^xNC}mP(BnsYYT8ztD39F@lqxQ7p{GuH}V`+3JR zDzvXjEml})zk;7ic(Ek#IHCPUet<|?bzf+w2^1FE@8|L72;^<^u+WZW{Lk}vaEu=% zw7<#1XN7j`6dquQ$Pn5RxR=kU-$@7v?SE%SDI>Hc3f^j3jLQn`H9FoDC$|?-dnLN{ zcO$)*+{EhdFrO`ePBGH^FdlfA-wAlG^gfmc9%f}sq|EIlx}g%>)-OhMe~z7AhT;7w=oBNm zzs>^>Gdls#<=`Liz{4C&z>VlGdRgVS{HWG4a&x(lHDOA}ZGDL&~?uv*7;;2pSB>HA{(JAaWWrT!8qKJ^lZ;Mw}%xPTm zQ#`Xt7n?f#I`%9vtfm+1^F~9Ii&>)BM-hd#%BoECI@mr>2V7IPg{Wxg zpL_)<+s&+tHT)s9E>a~|ROCT?jSl33c@SQaswZuu$HIuRnBPbvR?fWOyrm*BQziq5 z4E~W8X7E=;5&Xfgdg)E}llqqi?^DugH9zIZ8i z>PZM);JeTZUuAAztb)^DbM@jvnF><5_`>t0b>QB%V2+C4QD|0_w*FS=1V({>&jNqW z%vmpZ&*GCFEKl88`xUu@?pb_H;FaCf7CuGqS$qm$+xIM{@Vh8C<)w6K;yCv#eA)o< zQuizZZJ_qBNb(UYYxa!a(g-BxYQ-Hn)Imbh)rvQXrny%uHpt`PG#|>}^~>v(bI-o0 z(wMAVuyxx-A^yxgWqt_ou{kSyiE$FdrN0%ENO39tY{Lp@x#*&3%U zPp(wm;F$L;1c+3l{+jO1038bSFAL=zT%T2lZ-}2a3cgA4GyYtNpUqJ)Wp$Vz%o<(d zLFEZgoPCkNFuQ3doc&CI9mUy_OwJZgZa)fWBy-=KTH}o}v!ns?o_vr;yELkQocuRs z27dMolJ~itkoUJ1dF^`VuPHOj!1}c_-|Tox2P5Pypn0N0?UROj#KY{9yUQT(e&{q) z8sI|!yTCpHapGtIUz&t8K%foUC%l+6B=fsRiT@|&kgT}zvK|kq@m45WC0Jb!lc_}- zZ*OHpz6C_)%}5gsnBI`(!k%j%i!JD(O*I;KLw+Aj6#0Krl>9tY zy07?#2%S#%715F6F8bj5(|yGoBB0WJMddqc7Y)kWId>K>y$CK(w}ycOFdqo+Ey4}K zUG)k){j>{89}LQij8faDO#`~k7RsD3MuxhysE_J4O*P@xVuikELe=fFtQQ4X2Z#IB z6IZpQc1@)=K3Lgy_9h4bK$`i|=5S+bbP%To&7s($eg9F!!)PuRF!uuF(ti0?RzHRj zU^mH>bodpL!Qkc?Z7(lbeR$>n(zhW~`@2qGv*C|>r7JhG?K9j&Zh&PO#1Yjd$=iN( zt44*RU{C3=qbm)n(yLKkU*Jv+dOh+^&FO%=yi+4SW!$Nu01FnUyj0!ypqpSvK4-c* zd=#9}!F3)d5V;5#eR8DUoQ7*Y!>#rc;Jvqj`e=#UG`(@RX(asYJ2d4gvv+hSQK2L* z1u{2hyr86}6g&fMT%ci7c5|TuEKP3p)v)9xEKBm2Ot$I1C7&GW9?8trl6|Vj%M*hv zc2g&P7??LRNa{G5bYR|O1_q)Np!fY`!Iq{;@WO``EpuEj@5PN&QkWd3gIN0n;Kdob zUaUPt7$Z88%>b>NvGzmUSUWK-2tmByNJ}F^%oh-OgAsPeUTCk{B*aKlmBAUUO^pu> zL*XRJ9xIs!W_!FgdO0nLy%jsH5%|7ZlGti`deZ4i?lM}+NbL8*kWym54?l@p zkm6I8#FprGCb1jiLnFIqP+|-CnG#!WHSYTTMvuW1z92V)b+3n10f0?3GRV)WBUjDu zAO#jebqpYYm8JeATKF=T_dc)t&WT*5nF&=?Qm&dAB;Ucwq~+>kqRAeXyQ*?Dt&iEU zKhwnPL;$C91&&FX7P#admvkVXe*|b3kk26kTk`qS0Bt7avt$t^pXCw@dG}eOeo#Jp zC!o)~u-=-Q9B)>*5=tJ4cP`acU54Noqdo|QYoHV!os%}}E&Qs=YCt^k{o2*3W(%6b(8N;}%JiJ_mQLK*BApncxCZ>+l(a^Pc9j8Um z%bdZ$FtP{+OoFNWVkB#FpvvxjDnXTwMJC>Pn5)7v*KjKGO`7wQR z9`U$$#N)JQ(-2{WWcy=?A|0Bag`IjxhG&&5JlEp?_6ZSkveMX|8;du~S}woeJ%gDDjBA>?kN*RVS*uS+YB$ zCuRGk1yeKHQApWmBCg)h%3yW!7O}28=|zBSb@Jwjro>pdN`)AU=WJDL&!a8hiCjHp zDQTujyL!nz0JzP#diZzg>U|GC30F^i%5e3_PbwRjJ5_i&lVc_PyvRChG(e`KHy5>z zG){T3xg!HUrXW^UaBh(XEj5<@Zno`19&5Q9f)CIAR`;Dtvfc8iM}d6+|Hy)8B^^pL zmt_9U1S`37A7gk^ATC>8`hmKG5e%4I`BL5%h`F~nI}X$x0C;h>gBPd^5yr@$tAh<=OPOgnGrhh}+7xV<(NZsL^(4U+f%MR5sEzDjyHF`x+&(P`0uMtfd zt2>$cbJWM4B*4`KL4a$PG?ce$mN5c+D-02V6cJ*GSYrtZU!o4j(7}|Un}t{uZJt1Gp;(|Fq{#h4k)lvW?c_3 z7w)klz0iEtp_2Mts;!0e)$GIh9Re=aM&W5KLRwQ%K0&V5-LZ0%1}9-`V1mO+bE-N zB7FuLpaX^D88sT<%xj!K5l<*1G+*p2m}bq^u-L(2Vl~cxYn0}~YtXd!RL&y(2Xd9v zccXM3%~FO}I%d+z;Rwc8IwRv0t;{c0*2|)ip>(RyDMsn^^T5NaFM($$9h{k=;Zu0{ zrIikj(t*;EGjL^HmeL6=rRkac4%oY!N+&~hD6KOG<;~U3Ag|^j+RvrcjsgH`NAC?o z&{(yz2RKWroon!uP&?w&%&47{>rS8W{HpxTTJ%Y z5$Ra~jk3a1^CeIzaOD>xDPF}&3SQdYr2Eb>sY(W;4F1XOI29y&XThlVXo`d!CR^0a zZZPUDz>5oqc)_R;VT`CqZUAWAl)Wp`?5uBP%Y_k!_e+VmK?&$aq7FNAV4yyMkIf9% zE1Mfh4RQ<4zWDqzRmxcA-_6GOX7o~8QK*+-CmDtMn#R@(CRobXibAQ$fppfqXh?2J zXC?~uD;QGB<_GbUkj>&#hHOqGx}8L!PEqguR8!~0A%R%P0Oq&TLhu~Z~7t_aR zl034+^pSv90WlpSjFB11!yp8@DW(q&u(X!ba%F^^{)?7;$yruP36(2wvP@3G;u)2i zy3FF$&cLtg5i!aP!?(ng5HHu+Y^tY3bAct{|BRE968>!J&#jmx;T2gx!fQ4*s}(2V zcfgQR!tcaSLc)trSrT5N+nIzP8Lc-Hfyc#2vvw(wthTuIml6M~1v`p$vB zZ?28kcB@xZtz_T@LlPGygvB?*FMC;j;f3&&?mH(!Sk6o6tdc_5OdxqN&Lu5`0}0px zdWXXo%j{(_6o0j*S|@Tk6+1sNWqWvtb`aut6`;%s1kchAk<|!=WCEbgqzD&$0WwM) z`pR_`B7BkvA2hYS^xw@YH#alm)}^kO`ipz6g75gjtCH~Mj!Y(mRQyoN@5elTaG0rG zjYU9=;imik145SjK9@TTf8Oii<68Q~at%KVusFtHQhmP$U5n=$-UGe-RNvgWqducF z-?=a*Nsb8~MP?9*jXiFbug_3sxqS998x6Iu?VVc+|3@$kDf|!P$C=IU{T&UV4ia3B z@=>Jh-v7W(JtUW-vU`uqk$@^y6t_gRd%JAetIO=N{jgVNhEK6wwgh06++~MB*ID0X z39%n$^DZDdWM%WJzboE}VDHt*J~;%zoj^&K$Y$K>6E>x6-d~HRUCrh_i)OE87qv5< zgq;fQj9dwrotc)~)kvaCq94ea+X)fw$hp7bBNGt?>;xT)c~G=9+v8!H99qf{TPDVNc|ry?=v6 zBjfD-e&`f)_Wna2czDqzaK{qTH#oe6uix*(l+)U2!k3(ZE7$Vb)-0vz znYu9@yfcUMzY z%`hN{H)yFVwkYblEFK`b?t0(_c&~uR%I}4@E3&J5iXLAjBx{r5ZmOr_g^J^?eKohiw5}d&aBp zBX!&Pr@e_$9vDMZxglWgU+oi(1iguh=E{PF@SFS|F0{vIL%s7g1wzIz<2HwLpb=P| z+&g|>!~+lC=0L!6bC}0@;9-+Szzt~@8;XSu9erRZc0J#3SyQ(UKZm->K)Xh;%bgc2 zXI)(#GMIP;@R=d7*6@{2h_#B$L`%*<`lTc32gNIhFr!x3dc?5n&e>ttftl>G(dZ(k z{_Z&Hs`~{(1U76;4h3kv^j^HoL8Yb1fgv6XXX0?8f6$rmqUzgoqw3VrphaXav_66R zTv%2^hSwWSD7L(9bgW$;2m2z*6>hFgV$DSYRl)as1paHD2s!fCS(h1s4P7AI9kxWDIN=FahAQNnKntddc}pFz{&QNjnHl^=_bBY+On^e2ZQ1?1K=vPpyq zPjzGCB_+a8+2_BRS4;@qLhQ?kV^#<~KVH~(eyv%993t>dl@YgJ89W!iRraF-L9R5| zY8(kjar7Ork)|UMFm$zqlfSSZco3rCt@PW(1gcGaf{sa8Qb_ij~zZdC?5Uz%Pe!~bpuSuRF@Zd>J;Xfob7eqm>P%QZgA50l!wejgX)e;514OKF&ooHpMw&wQYC~j5OH50n^ zwUj9g-{5F05B5xt-L7_Cn~RYgcR(*+fPkf5&U4O;3|;79U zh8@$!`gr$21+C5=~~(fQ64HNP`x&ByR7Ect-J$BFSkPO#3vD} z5>FYiD)L*p$x%Cj+{?>`8`G2R68j<>QfvujFAqB1WX7&&Z-)sWtqBH@B=)4-P2hYM zc1k`6jIk$a{!Yn*UJGwhh9eBv4JUYNRg4GZ@6#Q0UNZMd-5z7TEt8$RpQUE>-kLf4 zV?C5m9Ep#@88Re4LNNX&N`V86zh%+L*hKj?G>X|o`7;kZEDsX6GA-h9D%D5Z8sz=(T0_#W%3E2U@yZEtWE*XMC_(K38t2agnWv`Cm0Ed z*;Y{iz)f(o4F-TaF@4Uli6F7;Y?IwP!;u$x#L^<3RS=lc1xQIY|kiCSrkmT)0p!Qs9% z2CAvYQQSZo8YEXD7|%fMdObuxAmk`^yEe7jO?i=fHGhNT6)aL2=IRD$6l1P#=7EPr zLjn(*t3~JFF@4`dy@^&P&+4l_g z1j-j%z3%6=i1G}un^@0aciq8!e=0PJvH8#Afro9r1Rl2eVq}JfBRu@lwyet~svLo<*|N+{h?S;gvI~r` zm*ys?hde);Hp0B@M$9a2UK9W@FM3uOQpTE>Hvt;byv*Q}SdfaR*)cCiz-DTR zb?Cuy>repRg>l){U49B+vu|7ehU7r)8|SY&@Ag_m*%s_3*0#J)chH%h`&Fl)yJuP! zDrSIX5zj^`epw@1+_0E|CJ!Q*E)2^LSu`>X%XgtsjA8jD4?JvGB=9K1^6xzS`7$hW z1g=iYGAtohnwH7CVT8RjECF4i?8>}N8DUo5OROwyRulj*D|${CLdKevwQpBurHW6& ztca)CF)Po6%WB)TW_$M1$Ekx%^D-YP%o-=5x0u~O?|uP8tgPZdOEqY@^Q8YadiP}D ztGy<2tq{NGbb@X>|70_n--Yh~G($+v$I&1Qx~t@NnI=leklA{V+ki?1^t!%QU=!fQ zr6$r2l*)w-5yt3`f%9m;^-3ev$A6ruTgc=lRYb}O`+LpFvinzTUx|B+|mqvwSore$c@Q>BN3R7q2_9-oA% z5l zO{~2+O?S|_X6}PehWMVzS!RBbOCs~a7@jQ}_u_`fj610#7~k+fW&5x5#J%kYF)X<8;H z!U%h5c(U||vOV)VjfD9*nV4GI{3rlme)Q}xB#kvcUjQ_u`S~I~3G*YKX2<*-RW>FS zS;$m?&on&q;;v&5Zbs@ZCLVRJXYoYnZnRz-5hEI^Y;H8hE5}z(uZ_3hTw6_4R>vy^ z^e-1Sr|a3*4=g6aNJUM584dGe5=OPia!nY&JovtDJKy9rajW%3DMxn1lrMN%1_b)h z9N1s3KU9XtdSfX3drhT~9n3iW{und@1C(ps7XBr>G6|_iuq1OR?uVrnX?4}E&w=dw83jIA=v+W)lnTO#tMJ$1j=ZDG>I9b1&b!+Q_ zRjK1(ZciW5xREMW~N#_V}Xf(k<-yq5*d0};9ngz(%)x3 zRAaMWnE~Fw4lqMaycinAsEOC}z{6^Sfaj`-cksZ&QcS=Np^B=B5Awavo0_;wu*5Z^ zJoj=5`~W{xj=)iB;yWySR!zjp$fIl*8EQfTch$rq^mf!tl7E;v^f=o~86_c6D550t zzr`vv#&t@5js5{HaJ$hNQ{2fLOg;F8Xmw z;j+_OkvJpPY!4%oWZ{hTr5axCm{l7QN(=7Qa5u|R?~ULd70o;}V07p9cZA>w^fpj? z5Te(o?)<3su&~Fo3n5B{JE zfKoeH#=bTV>!EcO!3WKT3f$I>1shD8iN;7BEAkAFR%+wpjcu*U_Qo{cdeXXLYzkjh zuAHtH<^0p(ed~>3b-fS;sl-SP8iAc(-Py5HwfsAL zZKoXs9PH!)OCCDL$YNHqaLf&6*Lcu88)nT}6vF!fE-12X0<-K-?G2HF1(cH)18loS z@?rRQ8~RP|y%FdENQheaYZ6Hwcc?oKRFs*(M>EVfl^G`Wu+kzXU8v*GcbSqu)wOwH z5O{YP1pXQtacb12bMglGSgdsFS5J+P4Ue^FZZg#v5`P~mc`tlkfX*N~3l6pj>PsQ+ zLRKER;Y~Kt1K(UUE7Oy~D_OC>Q8AsRmx~3*<%(0O6~_aG*whEGVLF&`lDY%CZp;^k z=IkYgR_1Gx7v=C5Km8V{L+E3Z_%v5JUSw7tLG5_bbh|MDw|)$RqT5b!CI7-cSM_Pv ztLkb#dqG30&wgbj|Nj;uDe1m{62ndDK78Ff-S=k?TDC&7bl;x@X4#*1GbeZWtH?Pi z$rGvjRs&R9}F=J4W^&r)nYKv%IX zxg6)I)@%M6>Fh!rAhl+CEU4BV$(bT4wZ<#UuS*ShNd#1?bcViXo(iT)XQzr!^PS}- z7u3dDcxjppsjEMYn!BbDiOEUchK=%^WT%+g`i=GGRrTg+uorMzv)O2(%X{%?9lYG; zb}T!Ijx4T3v?oJ!wE~IIw8dX+T?yax^W-)3@Z0iIP1kqam_rYoD%xJ3{#g|m z=k#Q4GhD!CP1SS9ChNn^+7>`qOz*ytY4JOJc~uQM-aIxw*4~a?(}>qr#Fbm}>sAH2 zZoo3PS%E}R06n4f)FmJOU*5I*o@Bgx<)b!3%9F$G1 zLSCQ^bcoVbBUQQ3WU{GoAu4kWehSFT90T!`kz-)Ii_uFCe(B70P~~PZ)u`GR|JV=K zPu?1;v$Q_hZo-70!J0Vj&e34=+S6sysRtsH+ywm0Oasc&V>bMsn%eLOe5Gxk-5YxT z(-WZl1h*Y;b8Vm}a^al^?1qyuwXueE=l-Bk>Rde!32wwnFTHJv6d~pJs6Wk2d>Ts@ zK54>?I9ZKgx=3w1m_;Kawe28i6qDL^G!Hz?dI>xbh6Lxyt3`7f58sM5I?L!aV8xhN zmh7dAU4A(NSI^lYo3QX2R+^T{V<6kT+^Y!d4e$y@ZMpfJK4K5z-)Jg>&zRmKiOH%~ z0KnkrnPJEoo7UC_xsoPl8lOa3n|R7FIbCK|A1igmWmv1a_z9l%MNAI%(S_OBBV=|Y z%-PSae!Vx_^G(k!UW+KxgWbfMp4aFOIxn6t(<8~h51t+~Hx2a}ky0keer3$i`}GJy znPt2gGNVuKLNEdcQ}wn;8JYW7G&0Q4C!tY{8TtwjJZy#}@C-AAhi(iFzsJKbZHBr$ z+9OBcYQHQq6k?@mnYfoD6eN3hNlPbcii9kft?;--K<|^5jsv{7 z(6pDd6e5gK70I3et(O|uE951_m2@vLMrgpjiMT-x=)`q9yKIDs9XjBj{=rOzdNlJe za!v85HP}d=?%%BOb0?9_c5F%UC^a0=$6ERfku819#G_seUCPD5b@(K-v3SbR#)(81 z{j;+1sG-*M<`LLvhwP)`>w`lh*9WSLOx>Ixm3o?|BMr#eUme^+lAsQu9z1A zDC`zuH?gaOn{@}BYv*BgV5sjc4wh?iQfmY2jhUMt(ddU1D{rRE(31}%7=LL{;PB<& zvuI>24L%2rVwMKqFYXh%|Uv zGxSW_^(3KejMuzFR2pYwho~=Cau<4P&qfE~<4}ZQ) zj~s!k>#|Hwh?S;gvLB4Fm!>B}cPPWNeeQiYJyYar=Kx}9X|tmMfZ5S=!w@vq?7SP$ zkSn0~;FB;r;%Row&Jo*MtrFp=$P&i@Jk#9FN3~vokI-36FzS4Fp@jshK`QoeV{*$_ zb3&i$7uo6JSbzFDa%eM1P%cIi2m@(05EcqNq=FXDMmc|mq)@H2T(iZm3+~Zv=a;r7 zdbMXJ;pF1ToY&3y(mt`f!UC$+Sk5~`&F^T6giKw=sn2gfBd{^KNBbY;frroR67bw3 zrH}K#!v>6imp`++=v}UxG#t z228$&69`qk8vw6FDeJHg*k`G9qhq$R)UiiZXwK}LiY$6YrHkn_3@E3jljXB|(en^h z4eye>fzrM76uoNYXe-G}B&Lce!6!&T2HiF9!0+${_4aggvXyAl0esyO<8IBuz`usJs1KoaG z2Ou7_(_-Oq6X1d24G`w^@$mcuFMa3N;L3@58}jCrLu9`)cz%)k34515o^Julf>Qk) zHqvARdWBAh+oupZ$5~op)w@ z-zzjeI_C0iXe5Lnbto2paiUJEJBJh)i^0nW6d@mLl5YsS+^Olah>n{ei@3NIN*x`d z`g8&DcXL1!df*CSM>URFk#^h=WoRdFqFf1eDtbIz@ZvZkJVAg@Q>ExDelL(QCr;HF8S$xo5Zcn~4B@}Oj+7(jkC-28cTtv7HtI3;R1FR>1rEbGX?pg>a z;m;Do%^E}Tl)~@@*h7Dpdq;JuU_!C8>gY#D?{*|#5#kPq5XoB*jKI&t zKbLC6rRvvzo8I4>)BBf3?+^C=$*kT@P;#-5PDu(AfVAJ50Gj<4WKgy=Sl-KGnGs+7 z1T>0ReUD=BJFL|(qIuq-uHoT^FO!|n4 zwu`c%@T|%9Y4CqpAOTm@OX*9?Bl$<_NNFW^LA@sr(_KOT z5j7>`6XA%D{UHMV1<^&bFHz2 zydWDnSPVYQUZso)n4WYW=gNZek^m$v^@DTkoy4J;%1owP%B+fHi^4Y{G5Fqr1F&w|6q56bm%PS==+taiqp zz{$|a-SIkJO&OM^-@3IMF{0z|ZuAeL*DGUGUM zasl-Qz(X#e{sN!G5>Gs(7EnU1bi06BpFr)7Vp{OPJS~VIyHJ5El?s$_JpH#wzXktD z{$VuV`-q83)4C>%*L?5MZ97wQsrlr1e6_beR_)!Z(Jr9&J^_tl)ZUkQ;9<2#z;o5! zcX{ApwMW1~?X9=e9==-!Z@@<>WKJOKYKl`q=&Ifv8&*jYB68PvRvYUQj*e{| zg{sg{II%G?QJ);CkKkVWbgSNXxtqS+5~fsUG{K!^P?s?L#br*&^|)>@uw2s5(FnD4 zJ0-qXhjCT0hj2Y5qgfyHfV&dyhw5lE95E7`;VVVT50NAq<-LL^8{)xoEW7@OLH!5i zQ8$Xv4`vu4n`4VDrhpOV((%Z{Rjx?pL2PMkop9vSc?WQiV0wS&s~)t!2=Jk$_Y4J0sUI`EHb# z@3+`$&u~1s2?2O&uL0RC(XU zC!zAh)9k3c!N!&?*}E^2P>#>He~!-w@VZcUeZ(38#Zz_*)k|>n#j{a#j}i0A_;~-K z+jb`B(8m*l@zq?kd$;ILcZR!8ZH9Zd12l?JbGz}t!)lIz=c>614?L{q2)MWDf^Unf zIm7Sd31q#e=6(V1da34YiB?K(?&VCVxL=Z_msW8K0I0YC>7rHKxxhE6;?Bb-q2k2T z?5MbPn4QaOEl0!c$A3H6nCwEqEmsN-fOz_CM+7WAIeawQZL25e?quiPxMAJ4GclLi z4Tj9#qSGNIZoCu)^eZ3+OWwgBOxRofQ;52@O|h)+VbiKp37Z5vvn)9sPQ zwqgn{GmDUPlLFd>n#22i;c(%g0p%&XWzH|)(U})U@%@OnTE?yWo^CrgSzW0C`|58) z>=O338uJ3`@7K^MM*aPn2Od^`1Uy&$t$d%Wvs^=!;gu3_P=6aNn}=_Ut3Si^1s6q`Yr3&p|gep`oj4Is7PA%RCe2#8Ax2jN$BIOAl9;*tsXv_g$h4{9(Dl|+_Y6!qnh0lg}v!V(W)8|DM zs?KSX{~V%RX;r8IfGP|SF%xQXQo8Wz_#||pcw%*7_6`=1R%KhO#6iGN zrV~2*_7;ZO+1490c1LLJ#8V18JKNe|S53Cv2wVD;8NIFsb%7=uE%<*+oR3^L(HNN? zufwq$s!gQ6yo|maR9{x;%i8E#IEa7nrJ@d3-{_jrl~VXe2f)Ui2@`vTI(jbe0o|i)Rm$m*DnKN2 z76;PRgDS^YWVKc@aweInrxhutwXD%Fa!t~8UJFm2!zKy4v2%gcG**+;-cG+#cQB`t z20Cxlr10+^6ivYk@USv|HIx2kJ%*6S!6)yV@h5LYFv9II$@_LiM^Z)hD}%#rIXG~x zUJwV9#J|3%6q68}(iOW0A<$>0mc>xAF0DKr40k?Cj<$jR|9(L^r zcXU@ zMqHo90}qQU0nZiJgLvR!aV6kJTo-L_G{zYzmA@O|Jeu#dtZ>S17@17|2=b62fg1!n zq9ibuxX$q_fIu=8ase73N2><}i{E;6<-B=ACoov&s4DO1>4B2h$5fLN>~_>$bR0~23}WFr39oVC5nQ->$HDeY7dDdB`Phm^w|Ts9 zEKg@QtD=z&%q?Yf7s7ym7I;-l?xZVr{_9SFRr37T$DnEP^Iz|PR`UE8 zGDx2PQbW`Rt$$8^Tp<_8HO?1D-00lb1Mn$@g#QvB1LwZho`MCCMa}7n+GK4juI#qe zH@BcfPra>bt3sVW<-$dOZ;Zg#sq1j?(myjLQJ;IVS_GQaddQC!q6XDN{wX%%C^{o+nXZ5r^{c1G$A-t+GdCISCoGRx z3BaDw)_Qv;Sq-q0N1&e@Wvz2p?`ci9CeZ|5a4e9Qsk~S)m0-CY?$&YY~ z>~r=)5H!UpF_D&=S#0E2eWA3uaf$r(nKndgl7AO-lNa@GfvN%welI@FRb2B{?|qz= z7k~beZW;pEn{xHueLzussSCUc@P&u^b;-iVBe;EsRBUM2@|+o}BLCwE zs8mH>*>WYLuFY%qtjKzF1$k)&fw!|#;QhUx3>7T!{z0!fFAj939s3kYV*mUC@0PXj zQRU@{+*s02OF%m)&O+Da_Eg%P^~2+hR=s*~z~^yy3@UKF#b{#$_7>7A)%|i%fb@1; z6sn{BCC}Gj9|d<@6e1$#%v8m{SS?4cvphk5ip}n z{vE*x2{AhYJ62`s^vpBPieeZU3Bhu&yjr9sDd28{8kE1Ak?sCBt`+o{92qCPcSmxn z$hDe$7J^GfRQf-Z-9UCoa+I{U$ zz9nXi809mmJtq~|k_zD|qQK%^Pdg(K=rQNtJ#hhaDYNJ{;*-c65l^Yy3}JEpraLHE9HDz&8EY9)1Lrjw-{Kb2j5WCl!E|FWL$JEDnD1prW-mjXFvA**J1m7L z1Qx2FNqTQFZwI_M-RN1&5MhjdOojnk&n)I{>8Y%3=6q-#VNbRYA0w>hGdGS+OpVto z+iKgzC1+?JX-G2Ys_G|Iwlo_PmG&sqY?C+GP;9I`0AoMD8ZCF0{j6gnd6B|{dc2-; zvV1(tek$^S{nV4t$VZ(0{26p9?dPNTB*np^v6@yfNI@&_3@M|&#%HnV*VOA!9_ zl^JWY7lP@=euiLmXFrc-M>c=kdzJmC~6-)KDBqhLq%Hn-g1qm?J#6pN-+-ng7zfOZSU%&tqLWze#vf4~7t zTlxZO&&i8rOBJcWmg)&x($BhNDKat z|JB2(Okrvnm|oxPs%cUlfSFaliIzRfqP`j%NsIa`Jzh^ug;%GFJYZ4vL^LuIXHggb zt+J>~@JU!y@swpzCA!^M)D2L=y$<%YS!j8hE-&F3R0TELo?bauC(i~AE_vp(-!iAF z)m&NA3UJ&>{>V+^uX-&!F%4T&>?YQl?yWoM%p13iFc<^^di8kfGG_T#;D0;H9+f`DSb*{I_oI!yhyY#qhLM?;42R4!h_r;nno+b+$Tt!AOxO%!8Ns2SLw?LP23Hug&5(Za1Wf@$FZZ`(^ zQ1pcg8QXMuby}?8Cf$jCcdwZnp21ip@DJ; z#IqUh&)DH+oG1PXG=gM_-1Eeb@xa3eGzoaFXZHjTJS?yT+>mCkJTiv!u@;MFR-WFj zf9HCp-t@7wbD{0!m9~PJ=^`;}C&15T*(N0s3pQEfIEWudm}L@pm{N;SLah!q@Ew#T z)CwY$=xq+@bOt|+;&fUF*1;mvMLhgSGU2I7`|L_b^wLxE3}`VLu+Sgl(dWpMA0gew z0}s!9PDU4k?zE79B@aK6_Ni2nJ`z#vtfwr1!=%!dEx6Pg#jX4(SQc2CJR>ZS2&ym<1j3 zj=Ed!|B0uBg>xaJE0e9en4*6Kyb3J$LxeHpPwoI3_iVYp%3H_irGB|`>|OZeVwwLw za^ix^eDBQu0UJetyr!1k*TjK@q_n}zt&8*7jeib7qwhy5S6r0s!*GCm12_3uM zfQ|ZT@soAz+POycG+3HcszE25mdooZ=gP3oKxG0F`8L-pHC#!HifT=G9zp*S4WM^u znpyOmU1)4{B=HPr1Rk`1TpC~7A?bh@>>ihxzMNy>V&X)?@vOl%e zU(w^vn*p|c+<6WD-3G_fKl>pGoTK^B(GRP5Ouvp%ZJKz`$1?lTg3fH z7sT!CI8afJH9i_^@nD%@#!?qo2a3AxvgG?^x_x*Ssr$n&sGB@)X$E`Q@_3n1hE&gk zRtNUd^ocGy$WuMc+*tKt*G^&W_tusfrQ{x1R;Nw|zO@Z2 z{GO_l5%^~R2yekmWgmcXyK!&C-Z0dT-MPxeoDvn(IMgj;#iq~$)?&(nSOxbKwiRJ}D2T>Jx#>7iIRpyIw9F7`a91R?$B zQL{y|!Wxb;N6tGlg|1wvtxS zHjK>OB*0n)Ui(Phz^ptLbyPf7hJ`&v9I*$1j(=Fty)BA;`933se73eI)&O=X z2PrJlk`6^gI{#Y?HXF;5+=$FaJ?{paTiR;QwVe%fc$u>9*6cfLcG$d%cA|8TU8t|q z1h4H}fbhohrTkFBQ!p0z73G1)Gh;j7N!d9!AIx|iKa}p6@%Hk-!_4q>-}`v@W%Z|x26uwJ;M3*foN>~0=- zaiR3|!WVe>Wo2^KRC8E(9_B~ENoMYHP1OPnt=LTCP`Tq&ILg_qwHr;Smr!d%zC!bgR%Lr*x>?yWJvrQlLjsi=l<8BY5>#w^uR>zWm7-Syk8-rU1#F-ZOk2%Ov8HQim@Y%Mp_NXjv zG@_6jR56(UG5DG=(I0q8wC0oEu<4(-*s>6yejffdC}U?CHtJUb4^f+5U6gRXl+TQ!!4x+Y_an$>Ib+bQoHoqWpN1w+FGLf{^w}R81u}i`wY?!3aLt|M7j>;>M#z|O=Htp{ zB*%Kadr?MD@F_3onPMc_pV|@dqIp5b18jT$_%V?4U|x_Wr?b85Q!})^8~A2zth5-) z`B02eVfJ|U&7mAlAu7PXxA-)-0RLGS{jOBo(@>IbpwgH^Yfu{(GvK7=*6E4*WE%>+ zj*dZ5fNf)-$|2Eh3T~PK6%I83oOuzN32bb=1sK|rn=KGHESd!kF)Uz*Rd+xIjYIYvA)Jxt0WSr+jA4&~0UgNj>Cc zoh(zrq=;-@7&?Eb3<4j7MyWu)rE0pN^GAx&83fVMAHE!h^he;ELyOKeLqQ)}lpYz+ zp~qQU(edct6p@-ZMl5C8tt?uh=|(CQBW%GMIu zQx*FsU*zAgQJybyhHd}`C6sh)M->CZXzu!AcXO+uO{)R+V{J=JKn#vos# z(jIHWe;ZIQWE^raD!3YG)+SqHsPPB;E=0#1vzN!9Y+4I`9T}UfHK9Uj{pvO-{oxv% zO^4s`bb6x#9#FGA2>*zw?G^=Js9uBUFMQ;N_gcZz6(1`?e!4Yc5t4tOvzNo}*-~oH z&3$B?Xt^d?1fS=9O5%t-?y)$okm6W@$gaK$z`}ah`n~wt^a$N)4`3PH_izG ztgZ`^K}oshb$DzZTkn{YQI%ncRGfREL_Y!twcId!yt-bu|RBEa0ri)~oYXL7#VUtX$ z?Zgmaj9yNT1868u5VzvMBXFcjahJ-&8H`S;WiW=A|1=c;QC41P&t5;sU}- zyVio8%dyGI=GyQTTj5m6Uyf`o+z(}rM2*9w~VctO0(OEnVs*6 zmSG*m=ub|-MzYG@?V4_$y0c=R*piM`DKdjq))U&uT3nUAd!b8dmG8qRVU@*GhE*nX zQ}*AUpcaagcPYhBm!hW{R+EF_);4vKa^Ub6{wy*4vc^z6r7%1ZJL~WA@E7g$z?O-) zlLv({besxq8|AmqMwgt|o~hwvycn#FKyB~Qg&IA^QtwQ=l+~+hX6z=`GXF$((5cUEpp^(cBTeC*>U4i+_YlW* z`a;I9hNe4wLJ57?NPl$nZb#0QTXF{oiWz+J1kynmY2zj=)hNsA2KsN)`_4JNbGMHM zdpEa_E*26gwW>LBX1_J3ZtS;kgjTjRSRTk?nQ`u>0*xYU@hBcd+B@=FJhc%Two#PlTV|4^Ilz${ z{>!GeuammSnF?q+E`*PODd!`tHoFjPE7Ms5*W-;ehG&uqgt}b(HBlRzoJn2;P0j6j z%C>|yW4G0slQTCZEr5`m3aw-&0kSEX7Em>5F-c2aH`_mVYDq{3@{QA-h#2jqOu?t* zOPq#}U~xdEoV}~3U0mP1u`zr_y-lfHEwO{4chxd~H*625o#oPTX%Q6Kc!mfTwAGo{vZErTRht3; ztF{2`tX11`ty)4gG5!d6$Ys&LZ4=)(PjKC~jLfYya3 z+{pvv>A}SWUur@6%Lx6hpLB)ZHDJ6B+)20XTrnrB6G?emqZkdiyn5I`1$XhImEVCH z^8(7R0*zvn-{Cy)u<|3|xytWE9(Y*!5%AR=i&91e@Ymvc&oDpP7Xf&BZyCJnncnk6 zTxq>I7CNEx`iNMib)EtMIxj%CXq`6!cu1W$iBCf3iKp4oc>|CDU%>kd#)(v^jzNIc zg}z&%^qm0XX}g8$C9M0zvk~)G6X%q7Swz#lT(|9v&5foL5bNFQ}J%z z+cf3{G~F%GC`QxW$pa5-Is%@n=|08-4{JICzPjVk$_N4eUR>81_9t&f0G_V99^Um# z*E!;?G~JvEozQbP5TQ!zIRyapT!3cLdhTa{htzYA;*-#G;%RpD+@Y;@tvwA9Z_Z_N z7P<#;Uk*xeU1&QM0oRZ`g||fYApJY_r;+&oCPtP~d;g)^cE;yM?Wxgtns0e^eL)Xz zmruD9-PQIP%iEREC`Rw?!vhcNJp!Jq_Xc?2VZBGd(Zkb}GBSX_7T0=)`^gFf;Ay?z zfpGLp>-l1?6yIEnozQ)MAh9p4`xF4seF4fv>%Qj$)urxx0X_-cC!S_U_YJhCiYPwb z#{*bhXgzHN1sG4|EmSYj$HQkM=q*ps-C57CW*fTgT={rn9G<3IQ9S~Dy!P1e74bga zt2E{Xe7u)IqZnN`!vhcNIs%@n>u%?PhjkqRM<36kl@S8`y|}hB>`z{b06cA%z`LGl zJ4d{gs+%JpPYRvTbK^v)(t1t-06iC=S+t(}I^ZGo+(Y;z^qhEN^_&T^Vn_CN7*JG2 z7}a(nV5s+y-G)`U3AZ?~11Br){zzl@V~w47N?~UwU6@X)$)%8t(ODz?#C1>-pgGxS z!T%vwXx&6(WE%EC>S_q;Gxx-Dg+8l|u7!~ve5t6C&^NkfbfuK@(E-@$Iv-~93bk)9 ztMXSzcTq1otIic&RbZo_jR##-+&=Z*Or(E-@!Au~)utZBM^`~G{Fl0gK8zGxKGricGo9V#59?gN+cP!>k&@dpK&CB&u&)fesx7+e zVvC2$V682_qDmI0K#Q@h5S%=FLFr+)J8Kq;C9vybO2RrZMdlQ zs-X(K-3Wiwn<~(1Vz7sAI_>~GKQ{zhQR8rEx~oi_eeZDvFTc3dTCasCs$oNd-PoHo zY7(khW^ePX(H+daK*5gEsL9A#L9$v(mn7U~bCSmk|a9+vHc)`tz$^2d>Z*OZs{MV3kbz`VKTL zp7eDOw310*C<`*_YY7cePlx`wH-BQSf~@0gH6lovU%!A)Df8<-d<6}7 zua7`g07#cdFQ?vw|F!W??H)&bX;j+3Qg=$eT=shoGod?A^t325tC!ds@_jwE#6 ze*re?Cx0XA61x{kdmV_|OTG@e?rUY;y0kMN`m#duk2Bu8-A?%gN*R#HV5DKsLPMvT zKf6OCa1s2PKls{SiaDAqbOqZ%u5E+0N@#e>zlr?XjBU`vhnMvGr6GNW7+dzIww*6p z3u`^Vwh!^T%1o=THHjv$Q_IGuFEAi=)sg>=!-LMCNroAydkrdF3?N9z&s{MuFNhnT>GwCPvwqH(*2@Ve(y5Vshl(Bg<wGQ|Kx)>6oloTOI@hw>S!{(auYurTHdGW5eg#M z&W)|dlf3ns=!IFOC8)`*m03ay6}3A1B%sAjAX-MLL#ZLEnCYLq1)!B(NeRqkqOPiL zD`SF&p)i{ zer-7XNHmAFTI`?4xgp5+6GOhV9~)8IRaZ_U%d7u3WcgzuvXBe=J8YyG4H6ov>gt?E z*-dbDYyvo_c&psA&`$=xW%qGP&YqZ>ZEKRn(1@Eh_$gU497?1$drW+qU%$>N4n~xB z-kH%IRA_WW{r#~~A?g>?g+tLu*}AZxPumeV*-q_`fV^gfjx3@O)lm`Lq^c_$B0eR? zBNYoV-YC+LA4P7Anz71_;TzFO0i`81Q=L;5*jqI@6VUB2RafwLN}0tcnKFw{sf|40 zxO96=;F;*4$VJy>Q_aRyE8g4k_O{gG)v_iw+)S^lbN$@=EiPihe__17=cm0s8$cE5 zCa;Sbs%&mF#w*8HE^NX<@XERq^p%^Z!tL{$V2{qZWs?f|S^nZKK0B0hP5)q&&y64+ zW&Ouj=(bN1J{UjpX&H2tBr%&M?05EdNuL3z$ZEeb1pO;bl%NwCj;g;M8pUjz{0$F0 zylq0jbGJ?I;em&@O$fNzHd%yHEJzggx#jPMUSH#TwYCdvLzC-t%Wk^xx*rrQahFpW zn_jU5{y9HXj=g%RH{U05o$R#ljI*p zCU#|eNj3qXn(g&+PbL7d-B5Cu$ z!zzfSJ=7GoX#X-EekAQvA{u)YQBEW!Euqqjf>^k&ZCQm`eG5Mdjs>|YMullYn!_|s zt_N+>gD{OM1eoPmgNhX48mYWQyy2x}MPkA=gA}g8Yk{O&JBWT#z1fB|x9qr0(PqXn z+|6^wk}p*Lv|W0G(9B|RAEx#&xO6Zje^qZ^ibIQf`<21-!9sY_n*K}Js6QceL6_!6 zRE{=YDQ@_kwFPdtsY3xZES(S4;zz)KV0m}E;09u~ZK#)0F;#uM-9Fo$Rbw;YtvUYV zLSv&{zwbjMv00JYbi!Zk6$nhmgX0HcNbbWilPR=Rr&z(m0xi$W^Q4Gk1<0MqSiu(} zpi-dd>Lk&K-@C9A4z99j~Fj_7{&E+wDLsFcEDjP-q zfIY!czTkI+FjPVJL99}Bm3iRg|4ihKP_6uoE1bNfxcX)hSQ5qFJi(zLkkY*%4ceV_ z<(QJWnIO;sfU*n%9f(gN2qc~|fNML+ntN}(#)2ZM03}8aPvGj1nFLENSF2;d$SEUQ;0O=G`u&~qBYa79pKQfW8utzp=E3SmWl)$P!Tn=Hs%@~dzFdFGK)NnS5L z&3DtCjW+USop)w*pD#2zqWNdAQ6ZWa(|`|0BV}vA!kces`RvWNYoOcU=G!;nhdgc) z;~$Fnlo*dxEW~)DK0_WoIn-*N7TSDMdQmequ=(~+fG)TBhQCX{YsF`k-zAY}liW|YeR6Qd?8U7sL~8QI%@*BLL(SPV4DZ{&R&xA&9Ks$Vx>DfH+aJZ0w=kCf~!UGRSYzep_Pci$G z@O{pg2fhW+N|_;+b-C1i1wT@bx=~wlH?#2BExA|$xsB~2V@pl~cemu0k``2xNdIl7 z(FfVS%52O@M6xZr+HAv(xg(%=n2$y^^nUmLes+Kv`@dh1c;y~?{5B6ftS1O~t|b4A z2OgGW0&es~(cSys^SzeU6kYG$KPFh>+E1Q)xddMIInFp|%ri;gC{@wV!e>=Qtc*N^ z?Sdad{O^LzrS1|@%6-Tl#{_tfpaAc9{i^!- z;7F}4BfKrRYJ6wD;a0D?@g;x6v&j-R69`WFg_;&a z{XVsap{4_}`7uI!-(GEZ!L23;^+wyV+|y_ukHb&f0n9=UK-j$XI|DDi9rXg?2@=k0lT-49T~JCVD=>UC;~gq9Ug{xz-MicAGC9XQ{!X9W9^xn%wbzm%tP=8ZV`mw+DvjTd>$ltn9eXP z=SZ|KjPQFZJ0K8Y&LJLZ#&3bf0Kwi-e4492 zjy0Jcu^B_CP`b|=dKutn&;0Buh=U?6a=jQ-h%fky4Gz9p7n3z)24m#fhZV(|YXxfj zC>+-CP`@s@_ynkoREW#dWVC&PCMI(GBgP;-aC2RpZ|QYX(mC3B$xlZ5ABedT(tACD=OvFak;q+I0{THQHcw`HJ|YHKDF3AMT05&I@SiA*H%l(8d5?ov0INb8}xO-~R0D|ngvVEGwHhqzw6 zf+%nN9D+MX+v2nrUhhKN8m9Q%GWE4`3Cs&48oy>mgWop#g>F07=bX*RyyT-kVQd6p zuD#6IpF<_lpX~@3}Z|^FEKP_C|3ylKd4}5K}TJpmm zs(=k(CX}ba>oXp#Z1sgQN8yiq1zy>o+S1r)yms-F;k9?0$A&80Dv1z(e1Okm^T2lDzn`A=-)($lF=f6&UJ!VYMh?Kzi$o+X;oyF z0V}Kq^rLZfm&hNL?N)ypA|9y;Q6LxWFlZFB5;%ni9$pC$@Z6Qab9vz5l>h-Z1kxe( zfb~H$gK5ErTEl#wmOp6Qj{KDX_R_^^>dOQ_T=~yP@Q?(^*80l3#}uP=0<4u{q*k1` zQ7TUf8A9f)IA6_EF1&1cxkMm0m*~wr@UWZ_@LV~27Y{rvX9V1kXQ855hMc*3&v)~E zM#@=g71X1X;~x@ii4r$Sha%#Z|1B;&js8vskXGFo(-_=RqGQlYlEv+O&n*{>eD8)Y7Km|!sf5xn*XIyW6V-@T@H1S zkhBwdi1;*jlXwq`rO4%rjHQ?$NwM(BOQB0!c(S>Oc#z9_!7VdV>= zazRiKU4P>i4;GIXg-_lj@XG$w7R2O5@Nt1;hPT4!QG%$6;|QWpn~)#|zFCgp6F=nT ze-|Z&*W}P9C5Ajy+7MqG0hQt~sGK9?Fi(kqN^uxvj|#aTxJ5J8_t2diJ-(OBz)fkxBnx zRQ3*Ea&?lc9QcsTe*t5qKAYx| zsR#}IWk~uomZTZ0{HH*pm;lW|Jn-IX+K+mo-_->hYa4&kAh=?=l6u;fKn-VpIWrBgO;lR zmsD0n;9HC$8IzOjj6>)?iu84!5*8kXR8H4Xq_4zLMMaT9gfZk#{s^YJ2T>%i9%IT3 zgOe=M7$k2*80kOANr(v}9eL3doa2BpaaoZhED+Zo6=wvtj$Kus6eR+cAuie481COi zivlhNWRBvK!1EDgevELR?YPtO`<2fZ+3(T@Vwe?uhaMO_h+g|1WD~Me%+$724#MP49_5<3;CCP$Kme+Sq znNd;)c_%}dSl$cEbo=}Q#7)kGj|+rQUId?)Chmh4aR)5ow#$q%mbmB|5l6lF)GNw# z`%-Acc>=cN7A5Yhx*_i47I81Ni2IH*qm;yj)sGVZ!?(8L2nE0b-|QaLhZc%{n`FiQ zRv><-%PrL@?>vN#S6DACPf) z;j+0dis&LG!bQxzH{Ojtc4Kw$0Wv_cV{t3(7D`3BFOA>%XW+Cw_1$^J$Kd``w|x>2 z)D+E9c_)}ABMgKIviUz1I0Ui#1010;B5S)sqnOCr0X*>Vl9+(!M%E7Ffrq0K1l&Z{ zv@;VGB|3%g({j}vyXpngdLAWumf(jg<1Fj4EruOM*eL|o8l(CaqX=fwBrB0f-A557 zdP3_|RH*AH!dM(tR1_gZ7(@Q#cc5%~5Jm8+{yM4>EW3yxNWO@r?H@_S#Y7Nx-KY*i zD5Iv7Z{QcBfp3mxA9@~iI`I#P*FFNpH&FZF>N}#kZge$=_ZC8wmf!EfM*Rul3(7E5 z&B0lIub~}uY2)M$xTRys|&Fm1)uC^)~>vy#jn4{vA4lpo!zGA$;0|))0YjR^leQX0MqQ{-;J0Fs}PY zbI4=4?kJa$uKR7`)BLh1OD?F5!3Df((yKqsnED=c#V4DOh$u~?`Qk?=BuY?H&_gDz@sv*gBvZVS95H%qCl^N9jg$70QYhP%@t+8x5PW}n#pB>4# zb|L(VcXp}D76$_CC^=pukO;{s{$kH__+}MUNN~t#DByn`C8~SmP{0yZlz>8_$|FFl zOl3B-Y{7!jt(UX^NTc4GT-%0AQs4rWic|W$vZc|4*Ge=F6rV!X4)$Y1vKM#+=4XOy z^YBEzLOzcybRu6_aTu%ixm+SurIay?W0XR5MvFx&nG|XgS}vM|I$WEs_Xq=m-I&}m zcrn%jhqS^LTocQDal!O>y>)5mq|!iTD`cBC;dfp8`t;g(t3DvhNqM!hvzP8W`$Uit zYyY*GNUvol62E+ZwQk#aGO*e#;NS6NW}dX4)-jg@6}D2uELjqdQfR1^Sx&38V~Sv_ zKMiMZ*W3wic7?aT-wBOk;thYt0}sa=2zYM1;nO_uaJ+$l8v^Z}PtJf7gVtO$v_i)Z z@%UJtw&Qkqv53_Ac%>|MKPbEFB6a1fDW-)pdmiP-5oVeM9;VcCEvpu_9_M?Bq*f|& zvoE7pQS)|lpe;?naPH5NFS~A?=XG!d%+LLKDi1s?^&EHljQX(Hvp?TWS@u*I_6QBu zTmFO-gO1|I#_`AX<}yNhQpb3oS`<@ZIy}wzHaRKNp<}h}SRizKAwRCLDnB0@#i;Vl zJn%5l2zah4pW=asg_?jHRbK2g^kMh970!YAf1@QAc@UQ?9a3g?4OY?t=?=?~cQ#P>c z()!4ALX?hk9JggZAc&=tRmj@o^IsrGDq1dkGWqhAy^+LC~ z@0$caqSQhxb+_{)<)|B_7GBN5XVpUN5Z=sok#S>(1YY=ZpLel+l~D~6ks_)g|6AOC zHbI}{R$S?Izy17qcIC>+R=H176%719|&u`#D4yL(=4>K&&2YKkv;2E%mJg zk~3m=_Z74pkJ*4ecq48=n>z_)UAq3ZJG3s!%X zb%!h?h3ugXx!s@M?|*Xm^pf385EvdfY8Z_@NxF8 ztiSe2o(G?oCUjPQ`FNR8MiSZ%zY(SFSBBItE`!8&Xv7&OTc(SW`uc82ot14qQ)ZNs z)Sy+IOc8u*D;12{S01_HP4k%kh z^;sJHUV&#ygX3$P*tr^92kQWocdp{w9xNU&(%#j$)i(rNmUaDwOjR&fVf777;U!)wWg&G{ zPi5Qa*zjndSzk;{x7v6)NquCjT_15fq&u^y%WaroL3Lgwm(6uaAAT~SZCyabp>9O< zbWfalUb>5+Wgskyt$6}NnM`Uq2vVSz@2>n-rMtjnGNI=tGnp<0J{7L5%Hx_liD+%wQ*jjsZt=L<|b$q6YG9E4?G;}Cg8cT z?)UM)!_im*ZerbC)W*4oN5ERQJMLUw3e5^ip%ImMy2zmUc#28k44SX=!w54;0uT7j z=pf@6Gc#v@#KVsylfQPBz4Vkk;ry7#c=S2)s;F&+5Md1YlL;VJ54IHo6_#x)j1JLt;4(_qh#-7}reknlVRYZ? zW~!t6fruUe|5~KR6&`t_3V;R+{-GHdHmu5EEaQo`fR@q|ZR3+Ta4w!QJW*-4-Ci=# z+e7<)$+7r|0_iraCa2sBAG!hr+?JjfERch{oHT-r7rcuLsd})C8jQX|S5H2C z({Ts1>sPmjDr*IPYfl)c95+&L4PVw8+j?1Rsx}NM@cNU=+7nKYimr;m6-jDiFW&}q zbz%Xzp3v=H3s1|3tq6AGbKhpSQe-a&MRtqspwljU{sGxHIJJFfq%kbdT;bi)9?QhZ z1M#6t@)_wd->C_{%4?{$?o#g!SwF7F5OQ>@qaPi;+Yxs){yUuUCm%yF;uMCtRB>k? zTRNcNy*9Y~eGV>P8ofV=%O^8%F>^S1BY-ZeJ4cr!CqlF)xgTJVcAPhU3w``1qEk>G zSKWhId!Af_bB05eA&@aKrG_qVY)(MvWDymdYD?)8%Q^kA#|g)y?d+BTEV&5Cq=Yf~ z1;UUlUn0A-I{2m6fjc*=$>jh^nuKLj+t*25;P4);%Y`zA_Rj!|v$CBfaN-Z<*Gw{j zQ1Sd9+?!h)o19602Tje**GlPxwyL((nv*j(B`tuEd=Fa5jXxBLWE!EWAtGKY5U>9E zl@a71r^gUaiZCttI?i1oSwDbQsANI1&VWHEUUp7D1r49f4yaF#z|qjkN#~zcY1Xft zuD2kMVDt7V{QZ>i#`MUR@mjOq2X_-!AVk>0Pn-4DRAbUQ?%FGGMs@6jW3UXDD^Iop zHv^wv1{qS9_5zN818G-5Wx2~HrzhA0f5JzYsJBNOBj6Ea7sU}a#scbj2MT47?HlI9 z-VHja32VdnCw14(*o~_|F#ot8+yFRG*)ra!!T-P#!_mFXpgG0$xbVK&n9zS#j;|cH zUYyIr6+NoB>Zq}LD;y-H{&U_Lp*@@xT0U$ysM|hicwr)UCwEU@qN_Pmu|~j@2{Ase z=wlPUS_mI2=SMsnqMxM+7jk$qmcpk&qnOCv#XRuvlAM6&`m=Q&c-WsM;D$7-ITAW{ zesl?$?^J5eHXaje5$IUkybxdfDLJ&j9qWl($MC?z6eHldw(krc zcvxBqxUqdgJ)=>J(%#SK`?Q$FS-GBT?~4RKyaf)&x{^Y+TiWSON!v2@jgmO?!bsh9 zJRQTRZx^G?KT-Hv9(Y*l2zaj4-O2+GOC13(D|PSZ`6JO6p>%`}h1vIqF88 z8~P>-pFKAeJA|LIU1XdalEB?_LpvU}UQHocH0UvfD+gi2 zalf^h4WS)m5u;v{TqKb3%#Wo4P&g>17Kxr0`KFZGlOmu}O0AMJ%}&&AHtR0g2gDDO zlgHW>k)$eCqYz1~H6h^0;?hwcEt-h{~i*ZTVJE1Zvjg%}2@;QFaL?nRX%E zF7xw5J_0G|@Vmm{j3)8vuKFkSQ>y!0ntzEwi{%uY+T9-9peizu0 z+2HNldpj3F@R@rvlv={RPLY;OD`G>QrE zJkA3TFSQAH?oxY)Z@4~%r?10{K>}WOsl6NDr{!MEX@F;EKr6Mv2uDd`sXM@rl%sCc zQhSJn&n~rNhj1p_MaEKF0{55NN2wXK<6%cxzQ*&|9?C4WW%sTHvvU#bAny;wEcC?Q z5<&GXF13x;OMZZpvfHKhG&^z|<6;w`%cb^}fL3ZEq)DQd+99eK+9zKGO7&o=ePE37 z)YUm8d&ElhOQb$y7Tu?uK^_I3(nGc1n82h2Os1K}l$t(5qEZ{*+GxU6lM^CE0jh70 zO%5iIs53UMHvxJA%b1wAMazm=us_LcvtY+tXdJ=7K`*bu_}fARqsYMruu(tF?x>q6 zpGDq5rRuEKz-e1oxxkSiaO$?UN4-U#)QR488QR03L;(G_5r;1p8XbieJ`0V+I%~&D z)l$It+Kwv(c4?fV8Xdi#0}%*s>-~EktZc=KVtPMj?5#<@Bk;=p)Yg7QtB3pmVB6=< z-;95YD>EpsR3$G+;0&dG0Jh@p&33@gke{`Ok37+@EmGf0ke&fk~8Q2ZoFfzNIq1A{F7pK-kH%Qg+@pG*out`@uS$j z&P$?^>Ou|3bC6Mb;99{VUT+cOua5YXqR>diLX77%07apd)1uDj@Qo;{rW{Yr)WGp3 zp=6oUSNOY(s(ly+CZlTNDI=;zL8wbq207&tW}Ox5EUiz1dkYsLVKQyIbEFQdwCckJ z0%?at2GRg(7xA;qC4fYB-3jQc3q@on2CuZoq|}uA(#+hi0F`Z5$Q4gMCU(DW+j;5y z#>51fy-?VWbWkkw+@QVCHA6|hhokCtq5BI>nqYj)T3b50$4gxGeUAJ?*EvaPj{;hp zLGkvKLsT)EAo)B%>%l^IP1ZsexeBg^*i@EW5eup>5^ZDFx2K!+ty;-y3r?kDa1(93 z)u>F?>m#tWghqa%0X1aob0=yR^$MJse>;7Pn}2ph1f4Er5)TkYGa zg`e{M42AYDL?QAm_Qgj1G?$~6waSk}@wlSCeMnyTC}Sat{p>de;|+x{CX>G&8gWz8 z^0{$vktTm{@oB!#?f7-PuXlc-(Gfq+#YTnrQOwt?Mlnos+Lwo`Ixn&cC`!>RobJqb|3hdzI&;TG^=UT4G1&K zejhCl#+^*wkB#KH?8nWZ%Vaq&$-8ZM`L{VO;JdrzJS@RR{R&MGtlaFzeJ_}v#QU2s zhQsu@mjzoBRL)Z{oz~2uu)lNP@Xjt6#VY@`A^(1bhDVze`#>XZvJ~)GQuhuY0I==g z)Ng^mL5F28fkY?>jlbB68@^GsQHhvl{QkFQ5{LW`a)6$eGk(kSMM;QsfEGqTB?m|e zy_PXQ<+5|zFytgpHrlY?3Hg-Ajn-=;Csf+Ctyl=>%nQ#wM^_$zEJShNcIA{NtR_JQ zVQDEYy&iG}5H-T|WNq_!9rG}ubWO7c)pabjL4W}sI3)CkK9Ji&59 zPrfdYOJAh~7Q-f*Vq2a-P;^r1bKtTzy{>##lcNA7&SS;jrN??DJ_(OiJY{&Sgl;!E zf5(!cxNKP0yeQzjuIJ;FY1r95?5pP`#23Oa$CbV02-sxxyxBCE>U49QivP-j74!$_ zwAuvJvALegKt4y@d{G%l!!TM7^0046qw+G_HWKbS}si zR7DXh82?UZ&^KdED7T~EU)Y=mJVAXlx2x334Z@MXo`}&JoM?>H$6JFJP}vk=-|R^8 zZfUY98yNb@OzqdQQ=5+}zgoBLJjq1P`24^7|512IJWML-GDQXY#Y&HaUzDUQ#AhQK zw`=wWS1jT5!*@cXn9R|?}9C+5Z~u~ z?IV0u@WV6M9P3;|Yuk3U3nT8g6=1FN=PNALoDwn>S)y>I`qL2acRcaJ`2JSnkbA@E zj^Avnp5cKh5L834YY!g|D*k*~1I5bNBmf7a4~aByjie zf-Ff*rd9r7blWf3UdkL`kSKWEv;>#+64uDYn9?H7N-d?h7vaZBZOcE*z!p5r8uhSv z{Wnk}#yMTZ0}qQi0ne4)eja#Ob_saTl=h)K5*9!0m}cT-z09i8eg>fEGApdKPvM6W zW|jmVr?j8TcMwUd-Ye}ifx=3=&g0J!$eZTutjZPq?K~cw;72L#SF`Y0r5!tW-^_NA zp|mCN0!sT`Y%gV$wnV|>rX{$n(%wf0$Kv$%Qu-uJR2%&55e325Xhgdx?% zf+5Sv`Z5nZEbjz7SBSsM0}l%^0q>di{w0ru#n^e%-v69pR#{3CcgIKhw7-Y2v0S?wJ=g!9=hGPJh@UO;=l zi0!3}_LeAk+_VIj)!zHrTNZH&yw5aI3f6vQ)c7`bs2OU!1&w0V_$ztfVZkThxoZ4P zJn*nI6Y!p?@%QjZSR9@=HU8HrW`))GC;6d-nI(b8sqy>y4kBsQdo`XWP*{!sfXAOB zkT>zeYCKl(|CPss6Z|MO{@*NoR*lCFVa4}Yi_Q+=IlEcK2ieHUo@_5=)VLg<$4yIc zSvCH&jO}EhpzV?{%k_s!cUy0a>OPzuUWV!(ghnx{`$QgiSl9`8uIfII2OefW0XM39 z(dI@&ZhU6wAMv}P*X4Y#78^NToz_31n=T@^FBB~CwzR@3B9_3{@I&PY9Hk;|WZ|bJA@CgU1X>O3EcG;7Hm+{2cFE-`4kJkj3SVo z7f}TH-(np(lhc{pib+}NV^4eXS*hX4u}o*K8lrrUC5oMSR>-B^BQt5Xi)r(1z%`ZI zWX)k(yQ#W!Au1aBCocuc_TZS*ez~dB`cS^)r8q713d*&MIW4t*BP214f^+g(M?3d-YX2Bo%Oq}(5UEO)WOgQto-VZTfGfm+Xs>Yy1^}KrjL@R^J`D`V0k9Yqc&A< zdzQc}`%_!76g*;{oC>h*16%(AVi!EHrHSKI74vBWBVJs2s2sDonrEf6~}3kQf#bA@n&%mPl!p?p73nV5!p9Z=f-jMFZxK>3dI zpR@78kbJ5P;mm~LYXBcxva(r>gCHrrN(>?;rTE&0)s2+C!Gp!)MN--kcx8WTOKEa3 zd@KxE{pzXlvEi}y%uVLH;&ko1H^S#pQmTpLNU2Yokdy|#IY3D%$9E&WK7=UgZRJp{ zxb&VTQ-dp2cbm-Ib0AbJOgy~Cm`sFQGZRl71?8ENj+H#qpN0Zog2C7_m@N#JJbzwL zASKWE+J==Y&nByv@G~zAhClG2@)(k2e^+3b{b@In{Ud-KCE1cpj-g3z+Ye|Yi_tIG zWa-g=D>F*!Ag_3)%+jS^{mkHnKXjRvO*0e#BJU2+i1SLjA@5>j}3^c_~)jVm?kwa^U$CN?fC}=cWj64=#7hoi)6UPGh+9YHF0^gv2 z!mCN6TKwiw>i;u2s-?L4Uyu35SbzY%5;%@2{VaSrP#N0-BI5;r!hFq^c zGMltKRY*3-YZ(`^5h6SOVk>(1rW%dAA-@kMiu_{&D_%=Ez9SFy>(b4vL@@OZS(q6Y zQhDdeshsV~2&hzGK&>7163s6#aLIWKci5pl3KD=vJM>jeaBBQ1$m&-irbZlC94$pCS)4R~nP!+eJY=F*K6>%&u$* zdA;fFXkAx9)J}l%k2NNVs#qOj!_`;o;t(wt1q|yG2Bw271jH%s zGaK8W@;+SChP6#vs0dqdvzA!>h#-3(+>nLW@*xTsQwhaVTpTuN1k^Ecd-ST7g|0jx zOIh??JX(hiKywiWqqP>)uo#vF6cH0R$qu)UK@ApN597Q>`>ctn@%jXCqCVooX-(CK z$F_`tq#Ip`$(Pp;)*%U{^kWcz?_DEq*?vnDK>?7znMw;zf%mR zNp0Ndum7E5rr1o}6f@TTF3)M;O*qwZp>Sm%M1qus%(J~z%SA<-!Jz8>1lJX)%8-T% z`PA*ee{vUCTk*TBcJ9hQIt2^w8gBE$o#PgBQwqrn4qoI!69Fy5zj}Obv!R zdNFWMbieoL!qNWDRH-U4^=7ltYz=BZ%n2o=^Pliiip~le= zOmw03hAux%%|3a(D$cE?^p!QUp5ZaV2|jjq&xV&=1U{f<`H=`l#^;vnj;(Hv_PX(; zEx8qhrwe$v>_#|r2iKh&2Adwh%Q+w_pGPI||EpL^o zpfIj!T{V92OlL3m&7jrHt0!kX1u~J@cDwUt3rw}vhNbRRLn=>TBm7Zs4!{DmJxYb! zCSmV{9=G6?HBd^;L#x)t>*@w^G#A1LP|Hm{4&o03mDbob*o#_giYd-GjSI- z7JplRu-u5TT#3VtD|7?Mr#Bnu1JxENG^nYinD;9&tH;JE_U;em$* zjDVLFuy^u(&WC`#P4FU0z~tad3fR8n)GC+N_g+(Cw^%e#az}p|!TUT<%CO*lS`0Q{ z@E+oUhXs#-=L+7BdEjBeBj85xmMKCC3We31`Nq)gw|wtqMQ|T}t-{tRWbEs&1;e7G zGnV{)KVeNGNB*dT8GEqs*@GFeLwGvdMaIDl3EVxHv6B)av4B)_&3kKP=LojnG6yy! zQYBT&8oAyLu5(lBWD$O>MkxO<13Q-;ScaE=7Bq@+lQ!|d!^(t!=PHvi9(Y)q3Aj-v zyQXL;=@(Wji^bPg-0@l-iAbH2s++gc4rG+oAlp)03fJm*13!i^mn85omAsR0f62p- zq)}=alY8=wQLbsy$mA`EVJ{f4*!v+Kb&fRo@t@D|z{3K}(S5N9c3J3ujqjl><*A>N zetnwu;R-1~<&o!T?`hSrM-;1Pe$V3(W|IUSWi=Q6BWIOas~J0lUD+-&tR@Y?Io-Tq zy|N?lWQ@qZEc`OoQFiX}(URA6$RPh)ahy?yR7`Bpv`k(GKX<#g_X&(((B9r0hh61) zJ{n@ow%(rUZN0|k1oF_>J-yRBb~{#}vzxW2X9IIL^qzw-Wbk!~{K}H2=XxEuUU0S0 zZr-^7tK@FpCTLoGH}6DfC3o{s669{48lsM$_0M%gUWf)Vj@vx2Hq9pBQ`$5;86N|? zc*mg&EqCwah0KsRIN64M&=zbpZD~|$n;X;Z${1vAVw`TEf?GQk%=5JU(e8j471Smq zGs1nA>M(G5 zKr^;Kc^Q&mpR*UjHjmFLMZk$j~X2w~0@4PcZL; zw#%GfJ|F*r1bs}Q-vZ{3f(6dqqwKcSu0M6vMD|=mTuJ5Z1dReJ2VWObIeJeBCXcrP z^mGpvj~A(n0|Z{#pW5mo`3ID|6_6|ycTl+su%pz4CXS;neA3<$2 zk$pKNDlU<$aUaS^BsyVwo60|YrhkCpFY@-UE-l1ylEmkW;Q%zZumisCl_WMjSlQx* zv?EDu2)wdC?M4#Y06R(&HE|qC^l1~4#K1RV2g75T|5=m-J}-wf#U=1qu|E~?wSd;f&}$FV$>-?#n*)dHE(x^+=0B$j28K{he5W? zTH<|=7)|!4-H7*R0d|ylYmz$R?Nc-)-hpp+O-qKMk^g;^oZp^9qvCRYJT6o#RkK4N zlL^f^J0s%wrF%Y4M#_AJY%hKNt(e~zk_?jb$Hb^pa*nSH$vN$8kT|FIIr<)P;bn`W zCACYT5gU53Q>P2M2P*+~l+;QBIZLn1Y7hID86|a)S1dqmR}gu<4U)slbbIJ568DI1 zi2LAvAS!Z^h2rbl)$jhA%M zL*D#|DyH!lWe|8BG@30nbThy%poTzCJH`{KZ>#B$@eF*khcKQYn`3OK-z>_8{zh06 zUb#E#XC5k5ad=C_s{D=xK#4WUtHh@~RI1|e@(8F@#X-efRV-oj5_J@Xl5qFE4$c_v z2m6o*z`s_kxU&=vz2lkq89ap8?hL@K>re@>dT`45wUWx|Bs`q1*w2eJSsx8bNZug} zgJ`EYhZ*}C8IdZ_9PHRTJp!P`x)Um<(AB6ur`K7c#z^}-^rw;0->}n}zij@Oy6rrY z%H;F!Se55XMzcgo?O5V2q`^J;FB}GvJ-Ks7>x7iKio%Iu>YQ=^Ue6Uja}`PU6n2&h zUaEL14@GvvZSZFDUW0XPiC=jdc_N>56oWAVr zmX=~&7*+B^?3VqUBrLd*>Ke^Pfe%m{#nS2z;7M3 z=je+q=`fob4(#t}p)<5a%}0mXn3MNsK$r3)+nM+zPO^!o)JZm>$@&wCZZ{{{4%sq2 z4uwp!HECt4*_f&~+uK3m?wkGDAi~L1xA|wOJ&e*J(s5Gs;LtKkA2Vj!PKg`6sUZWU3 zJjNZ{GQ&%*LolLWQ++^3(5v~W)PKREF&a)_>Odn1_2*_kzLN(Y=CcGIwkY0yzz2Bv zwvS}5;yr_sPTGSK5o|tVjy;hh_kvI;_eZX)I$Iwt5G6l>u0|-J3C^CQ} zr!$P8BQiDJ)zkIp?rN&483q*5^+IdKmC>#m9-uE%<;2d*x7yZ%;x-YzcQ z$9m%WkI0NXU%q(xUR8Cw-}mGDfY+~HMn*lcR+^T{H88?H7?ZSK z0G%r~_Rs0`5EkKS#I&Hr%JfVu8=(MzjnL9>NM_jxqpSk^oxcWXNGtJmd=gedJY`r3 zQod!K@>6%#JJ(_93Ha)ujq)2ctY6{n(6_(ox^By93b- zCQ7Q7r@q4JLAvYCJEL5GO){opDc8X8KKn0p+xeznNyps`AX)gmpyR&C5IC%7=>tR1 zgAkB)_KZtVTe)$rdrH$%KRx*Fs{k?1xAc7X5N(X^NPYyo?}NHMG()U!|&H_P)q+hSQ?RI-6O!7~#CLo3y>=C0|)Sm{wOAFyg)nl8m(NIEYg6xFuGPoELJu3Us zU4w}%aV`~}v$|=#qNv=M-bpKkfxMwpZLv&)P@}Qlm;sFy8W1h6)SwYJ1MCTzQx0{@ z0*I5*Q|i=OpltUf;{e;v9G;GUcYrv42z{+UB9s}#Uu?|*-|Xkn&=A1?*i217>7^xZ zP4YC+ceX~tPbqVU%;#bV{FE|x7ezp&%$<^REmoK*aYX1M6>?YL3|2gOvW5qG!g-WC zcB>;t%mI`lZ%VF$K7i6_Y#?C2z!}2d<#CCpCWZMlhZaJ>rAUxRTnh7*(gTWV6Xo){ zn(PLYx=fglze@-1UVIV`oOsG`;AqPC66O!12ZHCi#d>hZ<#=!iE7N_;5BG-4X>ZMQSmuBRlW@Hu)|F zyy)~{O^r~5U)pC9z4YKQ{U@Ns*$dBO3Q@&O)#T#SK(Y%@Rsnfbjz-zo*rwoNlj~4s*e!O zj9c}6*FwhV-g%o}f(a`LV_-tsv8(3aR<&evy))aI)~=oY+YsgWLPR0o?ig$|M6)+* zXMkgvWrYt4g7T)7ZVdclusfp=c2xI!8Z_c2p5>?DK=Mo}`6)+w?}+R4k}Wy z5aW$14tdDrpsM+*(jj~!^3jy0)l3C*=r*h-vw$w=qv7w;NBdiR5cKa2*6$Rw!7s+#3v_nEt=uI22fY@a`3WcKu^V3;Y>&oHalcb{ zFu=WRw*R20Eu2AXrC+_5sl&zer_p<#*NBE3Hs19$gG@e$U_{?$NoFBlyg&~5f9cG^ z-XlsA!;`_|yDT0VYck)2MlowLKj(pm*)4&Gy5jBtkpP{iRlSc4`$;ak3EPP=?$Yz2C#_#L?CrByK$x0BFb)H zH?ekOqwb(PIk0R(kldc(Sfbe~Er1acv7}N25 z9(dSvNZ@g%<4(SVc{3ey46Y{2G94jqnwH7qV2FJ%9YHmrY{y*B7GXTjC*GAd9tr>$ z4?PVG;bM))zW^FC;`kUo3F9H224g%FW@=uY0uKpm z@Uh0%iRCJ+%r6M~p4TGEW?(n5Hsh}Uc*$=O zjAtrzMkS)~YsEvZba|`@7k({)MlqJ+a2|NrQb^!oOCd&P%?b z(%QEWngduGEdDUs?JqTo#Vv#xUeZM{*sqx*$xe9JZ?z(@C$&PIiuvB4VU(Wl3INRa zz*u7E`#S&)Ip5!jPh!4{r@_qkQ``M5^t8bBF#FfrajpfjdSh*J7A~a` zRLatMXN31(iR;QKbSE&MME!(rJGZ5m&gjHUH6;WqZ3@Y;n`=nYKUOEqvAv5#Q$;WO z%TVfDdbFWwo^h)2*P#)3V7WQupYXuL?i~ToT{3ut2Od_^1l%Hzsc8y3eW@zc{eHmu ztYzK4-m6fT17fMg!0?H#k_<*AqZ$kOh!2GQ?>WA`aC% zG_lbT&9$gnlOu&Ws8p4$U0=DpzRTgJcMwaC{di#^w5eM7FQ5_F5C3c|d~N5N0t(qV zouo@Tljxe#)UWa2W$Q4MxBH=z3sl(O2;8zi?V+$Ec`d-U>pHH%zeAPGnn2DO2tIv) zfT@EW1K+H$Icx;Z|I(-<-x}!IxF)$RhdTHvRgs`<+HQXcDwPjSMnI)15;Yx_XUAhr zRU}H+>8awxBf^JI?g1RQDiZu%dhp-DC*i@1r@?se!>GQgl9t=jJ5}#YG{;~=FIVNO zVD;d;SAE}I;6`pK)cIz+?MqGXa^=drFv9o;ps79e-TB8m?7z`%=e8ixjLY-Zmm9M9 zzPkTY0Z;wF|KdoL;i>Njjbc3Y3J*N&sT1&APkopN9`@7;xbf6=UO8YEKofe&*~jyJ zTArG%(33&$$~{N$!FSPEzk3Jqp z6?LRWh%koy$uB_7^ub4Wip;eN0lSG6H^dR)c>apiT8x8!MW%zkZut&4T7GtVvT=RA zg5A-co=T^7eZ9TBhI=%yC|%T|PlGGyqzn2E*J%7ZqJ>7gA4Bt|-vvXugz=ywfj1SR z3`GKOz(!hrKSDcjEwU8q#*)K@XOv zdMzD^Vn#8*X9Ql^pV}rPXE&o?+?{+5VB0aki}CMJ44{eQ!~i~RLNP$#n~WI1|I(t zB$k}nxt%1!MLU7m7WA28ipLcIuo8L>7?O!hku>=1u|9VL8q!X@1)oH&NIbE2!tKXi zVnK^asjTPGon?UF-S~);)NNRm_eU%movgLndjf|JJqQvev3rlkPCTWsd-(m(!;sV@ zrB4D~OPM2iVNs#{#;jS)o;K{yI{E*cGJKO)mOD<>vC_dZ4pm1N8E`4 z7dhXKSZ89T2T80oFLE{HSG*Qcwh+7VrO6gUTeo~#chJ3|R9!sXW;L^WWUM(#L1=T_ z6N+JZFO`4m)gEb^-lF#~t@601mb+8$4NZTj2N1TD_fEXWnLBFmcY`Bf2A@2PU_1-G zuOn{?7w@gXIW&IM-3s-Z> z+z@=W;6(wpx#lXQU@)b*M1Zx#Y_(F=G`mP4rzK8)rzMX5G!j?iX&9EcYb83lB`-}L zcv#{Hc&@}fiw7Q-I09}YZodEl!@}o(X=r!{k4afMT|81d?G#u?%qEA0?dO{ z#^Gu`T>5M^Cns^eb9ZyLrA|GpT-JclzEvCVzzQkev8=R7skTN;ZYGpe*zSsn?f9A@ z%}+EfCZkud$V?lW9UH|>gedvFn3>Uotb?qX33WUtdf@eP-xm8OCC)FJ*9?{ z7a^05x?~Y}p^9Ho_IFM4Gr@RXMjSEcClB3%c2@*cDl$g1kcTT38Q&fOl?n`$B~*sn zJxBRJ8q@7gZF;m`+0}qM&KuKktY>W!t~DLg4h5VT-flFfmydLI&(!rAL*%?&J~C5l z)uzls!}+tF=2WfI7=@EScUSPgs-rE!NDYtIJEIeD957tB4yWtlxz2#qc+Y>BN)>tt_1tTr$60Ez{yOk3X6tR{f&wxsdh^nH-lTLeuCBKf+)UfjeeM8Nq#B(n z2qE7~y*9`RwZ)X9eA835-sq~ctw}0Qk@TTIgj3jtN)_-aA%iu1#Y_iW%-ZC(vBqfU zS|~)pn`Ob}t95F*A5GM2WA#=(uy%cVtkb-{4h1q)?Q&6VvRxOOy>2Bgw}+>ia9?eE zcyqly)0}RrlOj#U;{ItGN&Auh!5ET5f5Jv)6PzJANVoknk_c0k@y0)Y4pSgtiaeGo zoaq;{M7IEbQGT>|Har~GdG`q9zGYQq+c& zEe+bxwD8H#m6BUbe;Pga1)iK?;d@XFHeb(uiw7PSJ_4RAd_UoVhlP)T8{yl}rK2QZ zSm!NOpIUQwub*9r8OJFA0Z`3}m?T-gm*0a%zoaH5d(^7g*g!v9Pje~v)jWM^kpuHZk3$Ac66s0x~E zSomxOP3+tqXS>L#ppn463L1_6K+*EPl?L z(tdA>Sz)F9S$-&CW=Y_2O8fuv9YoT~-%8x=S!t&U6js_l=kezVS?&T8r5`L&0 zfumH!Q(5?|iinkwoop8wDnbHxRm38()TU+<{bgp+EZa{RB_WY0q9pRa#hoo?H7YirqxLZTf$o}kpb(z4YvR+` zXec3cLEJ*8!j;)IaTqN6nk^HXWxYpb>*hv{apD>C*LExV^|Fn>$tQ2U`Z+KdTL!a*!II}^ z2@0gNF21&55~=*s8@d#`9ozo{=fjq`;lJA`wNS__FD5-%8W9=zwSQk zDk=`cMm`lX)qd#1q`#7##dTC(yDi6TTrJC zX#|)}vJxHM;s(qSHNCtV^@-L0kG_MVubJ?5PjB$E*iEpkfb^l7Bze=14oFq$D40_^ z+vsY8s*Gw>)aRV?n7nlX*e{HFjCjh}I70~*n7yU9VGfVtj^at!#G7&3 zkH2Lmik0KSqH zK>keZm+Q9O`6ij!KeA6%o;RDhlT0n=VfNjOAbArGCY^mRdL`q#HBExMI;`B7<4Af} z>!iwcB^o^>)ZYPkac-@bP!AEtD2k*D(E5;2SJ%C`^Ag+zaovmLh{z+~K~xQ<(H*Ct zd)Ng+SG3g`HIud3>Cp+;6Q&}C><`SW_-Zs4(YGPB{8DUml)(4P8ed+alUi281GTKh z&`{gj(a5OfpF)>XE&mLk#C}Hcl%y1l98=Ja@DXW!JafR?G2<$U7y#-Hb|&%iM$ z5<5_i!4s^<)ow*NEfu~DC{Obq9Qwr)pcUaR`<3hUyUga5=OW#9UX&+|OxT-}%F~P> zITQzzR-VU4lRc0a1B$Ctp@~0cex9I-*Nc|*GqkB|0>ybizLfN!gpUQZ3n<|bfsI;7 z_5x@FP{L9&loFPl6-sR%B6?5>duy3b-7F%Gc7;2{$fNA`<@#I|JdmzF21m!hVRW?O z3D7L{rL=Y1CN^?g7 zXOqcU+TZE-w}^15>30`PpJE4@{SCk>IsNX2rt>oWlsGN~_3;X#g_sOW6uXQpso#|> zMTk4ZQ8`3Gv7=-mid|l|f|7-|icj-r2rR^-C8%IJOU)AJof+L1X!L4yQ8VSU*r?D< ziBgX!%gzkZN8Us=H-ma8dQf)ES+K|=&N;GIH(a}+jlr7ayMnJg=|xPnCizyxrzBX& zr9y(mOSU@g&Z8~gh~hcrDQTgBD9deFP5v7IbJywN?=qfS^WQ3-6HgiO9EC^MxXYfI zS&;4$$R)QL_4Xb-IIPn>MFcmksrX=yKk1CXWkz$|-Sd!SL)W%7MHl2ShtM1y2qXn* zveIlz^l+tp(tn#tdIoUOULkVDpN|z!)otgWY$bz5Glb*<98Ee{EShQCtclV~4A}on z+vR{4=OB2Qwh&>Au1HP>XnhFsyu-khxPnp^sW!rwlEfNW6Q>x{bkkr*K0YzZ5dlYR=SQfe&tu^SudIxk+f5dOAPr<|T0z zJWzxKK9KS)#CPS(<)2OXPOpV0FX0^&*o|+#jcCEHvNuiqJ1( za6Q-%&ppuq2X92q0fO6ZdA>^7=(UJ4BG^r=5jjhDFo&laYm$3bWQqQPA{+I$u_I5_ z_!hS#W~|9I2*$S~jcH0H<{t%iJ&Q($9oY$uV(iFn9(dS}NZ=WE1V?6Q_(C3jX*+_w z^k7Hi2wa7hWk*7+G%b_UVT66KBN>`P8Irj>)mY5~3PR2x29~xY3IJFVJrfN1VlByi zfQF1m-iuGdl8C3lSdw-1*~wab%IFwx0m1cS5mu%R>E1X%e_9>EtLg!$9z`M~R1%Xc zIx;;9ph#AxXrTlum8ty0Xo1g@5UGg9H7&eH{(x>f&!j4uATszT-^8IH+1-uMMH56n z(G&^UC0mWzY4O~X6MHVjdKmC3kRS>X#wdp5et^~oy?S6;iuHbG$q(T$f0}3-RC8{2 z=+N^=N9!|KrVQ2kmo<|btmR+0_0sdz3QgwkWM z?Kx^&&b%5Ns9-IEhSHV_X3DTmf-a>3J{g~c0v1mh3OJGI_L2}EGeUC11muH` zWwo#XmaT?&&Al2XjPmsGkSoE8C|Qbl5rLJOnEo=NcOff!yed9lx9!d|xk~C{Gk|0Z zj-_{9yhD@Z&r26S1MuRsgO{ui5yohUpQp#k8vt5;Rb&A*uBF#7DNc>Q7P^#b z{B`&w)VO%cQsWZc-qd(wvfhq&rgPLd0?Sn6lt5y<+Os_wB;10fwBu957s2nB)uwAZ z)m5O@9)v~X5*MXu#a~7`{)xC-#_7FRx1ASFE5{`aQ%Oy029SIb$CB2xfzsswy~9a{ z6*gN8#lNhn){8PuC9RM4{EAw~L$rrP#ODF!0(v?`R-*!vcL1~j=xHGil!+jA3O#)f z(L1Q8y~5ecR8?zct*T2@uV@yhS_N1B;6_BaZbp{j!Rk+_SoZgx7&tQ2t;QlC`fv+n z7ycGRSx)y{p)g{(7+dw}y3u_A7AG%Ek?j7^w0M=?e*-c7BH7%rqq(C3+4*o3Nqq?! zMPU#nfkSS6tS?Z8UB393`GqDnBRD%2c`U8^Z_KP1R9)=ptVH=JQeEr@Y&4|iFAybk zER<6hdqR%lQ$?0IC93_KWlusx3(vAkS(+59g?%ExDmlxZ0!`<9mL(*9SO>e2=#W(h ztA1B*NrZT>NzTt92u^q^S41)6R)p|Vs)JoGKJ9BA>~m=JYIM9~O*7+GY*c7wiE<$$gt7{Ilo`*_l!AqXpRQq~I#HS=o$eBXI#7i^PzA6o^ zgoJNI(U)>|w4gvtYKWQ?$iL2j&7VQ z=`A8UQ%SW@a{)YQ`G-+Hd;QL(oJ$8jQD}yk{0T=Z`Yl&Qbs&pI#_IQe&?sj0yTStx z^I8IT+#S8a!KRON>X)&IGPr_n|r@>f^Q)VV>yWx)5_-q|t zK}Fy)?Z$kR{cD_rR$@|xW3CESq?v4Y;HuqJXhc5`U)pGQ+VZa4%x|ugRK`y!lVOzd z5{;h>f%M--HQ&Ul6<#%Wbldr-y~!;eA461`wl}xaE*Fgiy@`tExcvq2oBV!tS3Dc) z-JvNE%o2vrvVRFQ0*jJ+Y3N-%@bFCp1U$Fs_ia4zu(=}OhBS)|#ll96J}?yfXTIOE zX6&fU`5`gv!NR>yu*-E>GOh=b^l>$F$Qa`FwJ!{TwT7?UJUoKOOtj<$NWXLj{88CT z#8(huMy;?vGwgb3FzoU*eXT>9YS>1j2c~^Dj=Jh>{1AZ+8s3q1 zTH!I=Kx7Yk3|=;TcWyR3KwB>*K84Ftc#woli#Jv7X4gLIv5qw^gY!-O% zq^7hTlA240AXg{{d|m`pO4}*v(oDokN@v01<5-fHtEGf@vAt5Co}H@PSeu-!(>bHU zo#cHIbK+=jFT@D!Y`Z>^G!we@wUjB$$lz$~T6&M&u6ACVi;*06KrjCl0+xC?&nGi7 zbf<@nD;UKz@*O!sz^rQC1x@>-k@JS0*2Rm^B^0Oww;tD{Kt(gUXEXdBxP0k2CtPL1qpfqBhuB9am<)MNC z)gg)7WmPU7F?GQI2`I~i)I<0r5>nzRBOyh8OD_dvXOMe&-Dq=mx)Z;i;UDW1Oy@|T znF*@=g0eL%SeRx5Ug6m553UU5uW&5&T6j}1oJPQII5AV9FYXq9M2q!6w`{P4_m(>L zb!13+m)=`5F^5)$0jd@F5YuU`AxR8rM=3wqr8Cr99_J=^Sr1=+CDv`l^ja^8m&1FJ#6>kz9TgWM*@ zPb87t_#I8@U~(g7IYa>f+oNZNA!Y1x$ju;A()!$jPr~|$rwr@U;{y7lmDa%2Nxb1X z(R1^|^hKCG*qtLdsDn2$Zf@0bFJ+XQlhA z^ts)a#^&6k(GRUl@HWQ`J$WaB@odfkx55#EkSY|5Q`=zmSl$_4&0o*>7>iVf1^O^F zidlaDJP$lqP*wY6$fK%wo3z#>( zCY*r3BsnbY1SkOD1ZXv72pQ`HoCo}tPQc^vNjL%GX)sQ}x|wFHfbr+6=nz&9M&GNG zk~Taia(4|pVepxlWAy%4}$#+4L`(P^qnn9V0xt<`xQhc8#XlYBK0Dz^?Gr*87 z)>4dv{76f&6Q6{o5Kn`#6sN$YrJY)<)317K0+(qq=A-6U<0NzvQ*Z5^PH#w)b=1ug z4O(W_^xsCOK8Mu@yiR?VZae>EGo{jn?twHzNbbPVAPagseC)NFD4~GH)@j_TPAa9= z^WkH!2E4eUK3djM#iJp@7;Ta40%(0uvR?715?4~R#1f(YZYHt@)t_7BbkJt0Gvone z@>m z#Ort`{t>T*CnI6s4!enU;(w+)=uXd>6Hf&9-1tR?58%ktUuL2m@IU2Uc{9pne+1Km zD}Nk|MusbYG&G8FhqE;4Rf!(cK5_)E8nexwT|W?FrD>V` z5ahWJRwk$+lrul~6GhmwAJbF~+OwE?0R;eThn@w7be8R4w@*%k3`y(J#3x}r#8Za# zAaz`J!~KSKbG!prOxEL#$D`QnkAl~O{aEd$fDFXJn~)cIGdMpF^fIqSlnKFZVok{N zbO+rV=FWtWRHW(ymO9)3Lt}WP8E9X`&s!g`*>nb&IKsO#puYb9!HCxXXnwzl>D8ne8Xp<`1QNPUci^QI>LORywLO~ev-3EYI5ZKE^h zm;@fBCJtfYvuYxC2*m_1?(qY&6f%ZqZ#ihX{EQ=(VUlpqDC>=`i0&Fyt z5WXM;p+hM?x6rsTa<^SI`Eu%=yGnSIcDyT9bS~GyF)?^_dTkQIp!F5O2hD~GT)T{i z4VX4l&9OS3CNnxwsZCBcceN|Ko3nVGM*I5448E$|Fk7F6SZl04UYni7+mMc*m67~vA(E2rJ02PZ zbRWL%pYA)?gT^zPbl-@;Ec?@5=H%l5cGR4dhqQba8}Z?R(%}CyR+WelY9|iN2$+G3nW6*7Jsn~416=h zlh@G0Z_7(HT^VtI4n1(LkW{0v6q0Hl0Xln5MUh$zv5?jlxoePfyBeK|<}65+Sb!3O z=H3wt2SteqQjv1Bd3Jglz7irj!VBnf8H_a`cAjk2$7;JPE!o%uxrJ&CY?!ooR+(;g z8sm*RfYE+Nr2AgvyO@^dba_KFm(D1vlVDfV{EUm=rg3Rhr{4!$dPU zHgT$f^^}jUT>ON}I84Ur=B^XHE*#ibZmPgIXQyjB;LJoCS5gBm4PNx*o=Xw zEKREb^0JUXJY^IT81G`@8kMx5qnD0;7VH5&2I40#hUzYVwla_d}x5Aw5iA#QA+WB4!Pr$Ul6UCJ^LY4HO3`ul)_?|L5>~R89#-(>2wY`m=Vih&YglPoCL3Uc zeOQMGYYEWf;#{<_Wsuo-2!-VE8yg`tIh8r!WhMnTm#Vhpk2Mw zsDzY~UL}4AHMfmu8dP&minY7{7MRbWZSUzH%nW!_G|#Nm(9^Jy-1Ghhji2YGS#}g# zQff#I2b8WBIzwAa=`yLI4?vev<$e&Kgvu3987eoC=%UM2*0DdeJ-cHJ*1Vw*DB7?0 zuZQ=vmI9cmfGHMX6yc$nAP4W&f0_6m@74cbuZ1TsVZRQ$iS_C~uRG|r=FY1(eDs|9 zWm;yGPj9_36Yv)r>yXmqO^_LJ@^b{^yYvP2FD_ijdfnmj?!BNp-PCikNRGf&Z?+Y*lSLs`nwH7G0ekykbTT!D^62Mh;s{IkAWejz zrHe@!DF9$w^lUIBv}_BzC;keMC23u*#3x~0#8ZZKAvImrvYbL|it%>Ezmvx`0tBuH ztKyx?qX7=yrZl{1oS%ih!D|s^Q?Q#@n^M;ubZ6$wrf8CT7G;V4K}IwBZ(~hfpz$qk zP0U!6=OdUNtjVibG%^xId!SK_HF+}+JZw!Q@F;6?FAsmdtce_ftI)EnNr;uEWwISc z*avHpp(&ItnU4u0EXfXHU};OD0DvXYGr^EA){=Y|(2$nod-xS`o` zuz4m=zd+z2m9Ka4f3;R!N-ZZ;q>D;V{*~LZxl1UYly;Hcoh$ zT;FL-$^G9|s5@G!IT;p(me&R%Y*IGK&>jxnsvA z1F=PODET!?j$CX&zJP^a-95bw#|=Gw{+daFzP&y55f9olZQ=1Lzyk~XL73BO zdck7ZPuQvS@uck_dtoC@HlSB%&$L~e-#y!M%y28n`Of}6m|3tBM6TE3wh%0ll~b%v zr{lSM`W%;zWZijZ_;6UE@zLgwgQ1ZSg49+~{KeaMaZ-V?7`%Ky5%RGnIY8j$PEDUh zvS$}xABD*CP-zo}l1j~dG@=fpzqkuG`50?hf!GN449M;2=fl1N*iAs; zl4AH|ZFYKe0+gw{p_8`2E+2ur{^}J=eq@+sw$sB#2BFMH;+1)GM*=uOLxerz2dY84 zkBWR#-v(z{f{Q$nayQK7?gYNvYtHkLw#;FlLcrG*Auorty#cc)^R)xVQ`mfsu~aB# zzP1bEWYdu`U(?WZ-ptoR@NzX{PpK4?aif}ifs9a1+7=)VN=f9YA6l6@?d1~L3_D9`O1_~ydO?Vi|EHQk8#!x(^Fnsv^(8ExVYd*(Y8n`N)D0EHTxZ%V--NW5CPGV~D z<()k>bhEDpo(iPE9npv}NwRZH-&L7x8&L*fi`X>==R;;D%_t#eibhY{cFu8~`c0jY z%33jwwdbv?oHJH$k6zbq?7Xf$QyT>Zu0N@)J?}hluRwpGz9x1U(SASB-Z9^~$(Dcd zT6k(9oD0BidZTix|OG!#6M$D?fO((8{)y1d~7U>ugh zES2%>DFwiY<6yGrm+_d)O{AGUyU`p$z(m*?!7o&?OQ@)I|Qbm_ZL&ZPPNj2Q*IET<^r<c4>9+bFTw;QWpz@e+;lvhRIe?i{VHU@H+P-Q;*Y{3vFlZq8#`-znlHjOI7J#5BPKk-M%*H>dNVFp=1St4ATo4f=ZN?;_r%V5 zTfw^ri4|?lNH_hX7*uF#;4d~f_@>+no)0LBFK-oiW$Tp`UwEi=px!MN8ydDe zXNJ}VkBfjx>w?ObD;agy1Y3PuHj7>plvWUUJCG&29|C1;87jDB_e-xiFAlV1hkXhq zacusQofQ%IsPgheZY=4i#h{-QXQAtBRJyp}p;sr3PBz>1>>cG-gF8G`hjaVJU`4_& z+c0Yh!vc&~Gpx{?7%F)oZHer;LPTV(nRSpOeB4u8$b+jKwf64m(L$>nqJ_otW0tw% znZL>9M6ZP>k>Pv|cEhO>mGQ^JwT5&D^Ta2!x&VtpAdbqNq`!>0Jx^mAUf1B(6wD}- za}kV?5VNLGXzzRomRqkVZ)`_5%yI8@K3x88M)ovzWOi6+d$);q-c^ac^XTAO*>9EQ zQ3vEd1@Ph$4J1dZ_{PX$?t zCu~Uz^NJ`Cs_O}7WWm}+!_*G^HFPOg=3j+RqIN($rB>#Ju^CDvx=;d8+9Ix_3aCh% zm~q4k*v(-Alx-Eu?T{*E73C(F_`_8!{O8ItzKg_5`KkGq@%>&4Pb|Zh5xa@CjBnQ+ zl-&N=JFkpwT%zSk2KV}JGs8ct@hxs2%~+EM5lk=kF$AkO`}jk4Wbv$iy*X5et^U2u*!mZYLFbP5fWYORd7 znp1G~2%Lv47w;+WRUUwuO9w1>9d%E+cs7r$uaMB&?-)%CeRc-CnIFmJs*FS|Xr76Kg3^$%`V@QDijHh!E~kWCMyLFYv@O z-&$VcweSQwY%Q^ySZnz>-ND>iON&>owUj>?YbpLVGkm+ox45-5V@<9@FuhpI5Uk#; z5!Uj&3*;^i zG?jQwp;@q&D@GJmiu+u^kjmX~>EN9Kn%%Cor?XDU*G z<?cvE$933Nmx$tlw~<3y1iJ=;p^-5nc8II#@Os@#&rW|do-wQ>sjt( zr!w)2g-o9PJjzPs=w@>jZ+?lyEI!`+y4S)J&#(o>ZelIy=X3`pkFe_pzl;rCrg@?= zvep|j-+!*LE^bH7h?Acom|pB?2v%=)bYIwmYOf`E47c>r+-7B$0bT{{XoxUILnfaF z!uP?Bs+$O0g`_O${OBKHOCKQljIgC=U08!VeII=`Y=4Ao%UB!!kN?&4pfZCcVPI%| zBdaDzc>rcUogOW9mi_!UF?+;#H&A;{La-&-PemTEpLz-!>4>wRPl7I`{k#O9g#8px zS@u(++l&2N4|j9b!FskLL(gNqQZ38$C`j4X^M<+F{WENE$upiqff3A=?W}tunjd{m zc`ZCu8n&I-O|0##=?=Q{#w}wyml{6G_|v>F6aBdw<>H3Z3^#cWg6YL@hG6w(IA6<- zZ2kh!R|8(0TJ!?Y5MhjJOtt~EJ{Zn}0ux#1Yv)Clg&BDU@i4+{Ub0#0VyqQux8X8G zsG-KptZyaT%W;Jh^SN+=Aw;KZ!NAhtEUCrL%Syt8oAE+W&8+))v}{`D^;&Es!_$vy zx_COwatAH*s>lfDRZmnSLviNyYtW@MuV2R}VP3^kmU)%v_F`U7M9(MEv>ughS`kX7 zS(RFEf+^EcXZoQ}DG-8P6(f~f;baK#!-ls`LoNO`_1DJ6XlEOU(>ne8`O~|vU565O zt$#nnfReKRO`;JWQvT6v;fYk(EMhmYX7T5`gYMLvIWdy!!Xz1!xKO^8=1~4&Cgp)} zMn!g{#h;&OhL{|HU_4X!n36IhU3#-g^JoD_%AAokBV*!w`@q8m&_Kln;@J$h$__VU z-|+F!2nri=4>&xN2Oi#Z(0cABB5@NB7*`T?QM>rkZ23ll47GP94?e6z{ev(b#*N zH6R>!_B_ZqIavY^lWZZ1s@1_wd0ST?#t@9NdC^j+zK=HNFIHT zv990GntAV2izupe8&8s`0IMS6S#ii}$W7`k%6~jh2@B^!wnWxO_b^4z0lXrpqKcM7 zgfZk#egqzLAENwKR+KM1VTcjM8uOgHPAb))A5IbT`pRW8 zo3pMm1(kR^;Gjngro}N`27 z@+o^SGer+nBbbUM{@#PP5U1Cpc5bbBN;8WeSp0obKQ_ZOCCumhII zlo@46_57>VfgO}??4g4^)x*qOFW8tT?mmVD=E=P`^(q8)62&jJvrVrvR z)Z5tQu+;euwXIooMW*L4f{-TW;6xV$-CzxGX^!I&IE7Gi^T1PIG>px5`qJJv#GvF|Y~4&xNS(R4?)m!?rWojxvOuy0DVdBMScBBi1N3 z^1#EwPQY`8eKQX{EbJ-bEKqz23%dB(P-~3u)5;8RLO!SkiS2-0q)1CT6cOqCZ}Id| zV_A|1P#K|~cT>x4Z8hiG&W1U>R9SaRZeKbWHm~wLj9%2&iv_Rk5`geB@*DY~gr{IE z@OPF69?y&q@tu^NbMwKBFYrU@jTzr64?N5aPxt+VhhLTteOio7i)?t!ZlC>GHzk$@ z;lm!L2;}|0OJVIX{ZtSnzrtcySi^CzidP@1QIX zdS3jGH3|R1S>gqPRZPysQqVY}Mu#3Km6m#XnIJE2bXh?v1cJvsLRf zTX5h(tpn8wt?S#B-ObrnWgM=n?7*&oN)67?Q)eBhO!n~dtMLL%vnz#u(A!qjc|!FH zRr%KOJU&b>uUp=L3joB%75I-iJ)trRzjolWU5(C!Jc(#bAvdhDBmZmgH7SqB@-k@6 zB)vQ{G;djDAwXvl#=-KOY9DXqy|NH#s6OX1Y&4_<9`ZH)y0hR)DW8Em3n248OgUX~ zRe^k#Gsc}O?TO~>K0(Cw3+FpJPIOR^M zOHQ(waON}0W+b=viVU*`L~J!J<__&jr}_YVn!)cc=f8V>y&VBGXy;HSuZgS@@eU?_H^OX5j=ma}TkY0q3`N&Q8^* z;lATt6AjqszpDYN9Lm~e;L;aR;jpdWnHQm%z-HC|2{5!JH(MZZSTqan6~h9yxYcd= z+J==o3l@nHE0aTi8SXsb!Q*iwx&E}kE&Eeju9H{5#|6r-J`0~m$+aYqJLNMgguY*9 znAAgFjmgsH47wJzNkwGy!qEBGWf1r!G)krLEgRbloqt=5&LD`6{_y26q(1`RoKkeI z84CK)qV&i;ITTFk5gsbt-SCVEs8nx)2Hr30uvZHa0jf87lK3>=BU!RpT%E2L@$}z@ zR*yZ<)e_lL75gV&Izxd!$m`booVBoO0@km95iI)CtE! zf|{Obw%ZM;)TneC9r$k(jsTg2DvSz71FhP0yMdE*c==W6m}9LnIPMS(G+Seh=~@d8 z6ovbWLFtdyU;{e*hFj2^74U#soniP#Ol|kX?gi>Ki2j1_-1cTGZF*%P^3xfin}GeW zm3$ejn_Wunxw(&w6D`*yo8a@jPe~k+$9)#Z6;d24qMVkzD(9UM%XT5UkXX)Oqe5c& z7`2GEZJT+*3Y&F0$Gr{yT!;UvN*w%|40~GN1BXKkgD;96P7jLO>N(0RK2LBM)wR8U z6yMrzgZ(=Q9RA$i5%484M*c<*T(*9h*OBXy6&S9UI{M(8j8t@5kiB+|Ziu~hiLL*8 znA5=}ps&mc0j#bIl0iwi=5=^%9$SAjC!;FER>ihr= zYe9)q6HjvpwM+cVatt1s6MB?kaBAed3r#-Db6^5S`Yh-G6!KYk1gKJYqY!5@eZ&$N*ee{8N%z3gJRA#yM9G*{VAtUOC znd5@&^JI0ixjGZ?CEm=y(Y@%8uIT^*dqr$n@CqaY$RpWk}3bn59W|ke)a(56=t0 zpWSn4)g&5hCuUwg94);%XEBug1vZig=RKt9<|#TW(}^u<+ms?R*kC=Cjg-Y5oVWME z$_DR)Ph#7Yc*?NBgl@{(+f&m*@!gA+H%_;ary5q1X}BA-3pW|U8pEEt4JUc)0@%up zKT9uRmBvs!r7(Q>{jddXsK+zM@+~^uyULRQ zrD#&`4KXj&n1^lly%Xv%~+vccghi6CCLSQW#sBdwDPiUH$UXr5$R9TO2VzIc? zHQ9>jkaIV;%1@LJ9RuB?H3&L&-g!ueKcNO!xQrjK10-2}vUFzmdT9ST2+7Bw zl`LyPK}cp1>S7wAo(n^BY!-!NAm2Cxj@Z%C-p}Aua&|v~k5ZnTrPRlf9;=*xSMBNvrt|*R_oN1g*d+i9C0+Zfn*fpZwOf>ny%#73d9U{ zK3HK9^`#&n%3-0ii0(|iswS_p-gTE>S!>ncHv4)@uc_Ow3_VsJBAFLQ4_d!mhK+{E zg^4-o}B1Zwv(9OBCQ^#NZl=sbgK-|p0=N8vs&tW0f8!?HNsHgz*BpexA%9oB}W za;dZ2BfOOVp>z#-Cx$}D6rvE7It@XiK*1lrwjFUtF^0~WiZ-}}e)RWdd}n$%@iXFn zkTS56r;G7re`>4AqGf<*0c?By!qt~rL#|0Qk)1LgpT@A1kvh}G|Hk1%cY`u@k=~B9 zg|7K}DpFONuM#}j#`2_?eY-l3RoV8f4o&-G-=b-t**lahLLwY>$pR2J#V;|XPAV|r zjhHJCO3@jgj;Yx^B8PT}EtR35PRz5NFPD>NaRgLa(otqWVO{#J_w}O_wdtMp>+0aS zOa{)mk&!1Hd)b+2jzMa~ze7m=K5Rqr@+2u#nbnK60dUnDYm>9}5!{8~-(g@Pkc*hU^ znD5gHDs2;(c_RXjP17C~L#n{}zXU&A0cTm4t^QOnjDhoeLtw2j zs&6rHHZvx<4~c}r+uIt_p{u$1Yy0XPtxK#SA9*i7ILXT8J=){K@NpSYhk|83-djs+&GWtL90%0^@QD?eRUyqgp)97O7fby(sqoc66BM--g z*;1f|(Lm=!^Vy2Y=20sPI-X5PgOH~Kw0>^FdU7G^P=t0lHX5Rd7!{!%F04ca&zKWC zNG`AMBA$n$rW~6xUI=H3nRY;`!gwQ#96j7QnV+oyXwc9dHwU1+R(Y#5z80La|QZo8=aB%{25sG&+j$kgv-jj^!bv zOh$UhmxxdE_YExGTx&pVuY4Qzry0|G0FW&_*<3_KY4W@a8x@*78=r!{>xHcrEOA5P zV$(Qk%*HfKsm7SnoVBsB7Nj96jkdK53vV%38+mD-rE9g_gvD~xmm0VI%8dPiLSv^% z_-R4;Y%- zeo=H=fX{|j=jrhl2x~{6QOqjxr9AL(SWCcj!`i3uz{6oJ0k=p4j+`J(z+Xx`Mw5J> zmSf}?fI)|~6M`SEm}i8wk^tFCP=%@()}ATA+7hOwYg)qK7cF7!~0}nhbVFbLagnfwbbG{_({emA+5+(^yM8fjF#l(rx%*h!@ zq}~%JKj;gs`=2=ZUWnKh=e@*9h%knv$x#5U4~di2VOy?qCz2;3=C2T4V=5<3(zz4i z?xW|Dmpm!b#HgWt596EyJ4=Qxsa(FFXBR*ab2;H1OrYe4e)e)UEwtIM41JC*M4!Kw zOEgDgqam7)S^1OCE%X=WtGQ=(91dQJNwQo4e;C&YRx`ZQXoOEgqx1Zma|;cNqPw%9 zQ6R;FuWi3F;4(y~ST=jGJk@H=b`(cSv0NeW%Kp@LI*O)Pt^(M0)VUP@4y9N$ahw#3 zPn%Fw8u(_V!&)Pa{-;KtF-ev)bI5~~q@!a_7oX;fA-FO|3@?X2STW3Yf?f>$*`kxp zLqw9q@C5=%prm^c48FEu^&*C^^I-9Kkr=*4;FbNUEr!WX_&7WH;ji!{Z-CFE#84B* z5ksFgAu$Ymv(jO$5kvpeC^7tt9P*^ZkcUbqk8Fs5N^9(>l_L`=M@B%UM2a#*g%T;s z70^Z^kVp{{!X#4gcbQ1}89s?big+4qA_YzZX-z|MSVR>7pGZ-FdPt<47h$2*>sz zx)zLW703dyZEh2zukVUxHu@g(7u%{K?V*zRR~urciv#)?+rFz1eJHkl2R72Y2aO#% zp!H&igH_RacTJ!+zzjJZw&qj^++PT5iWxozjRK)7zV27d@O2NCr#USZhtftd!~YR@ zWq)dG{Gy@jHvqOBGrS7_4u!6oI8Myq(x6lqByS zuOSjf9q%1}>}fOr3Mz@f`{_xQW??vFh}dH3RJFy8%R##_y)>)?#; zG1&AB`yblb?!DZEqf32H@XFlDCHLX=;N_o@0kW#3j22B*4nnS+(prq!6MfdUbB@C^ z4M!?##Sr8OitLPDVYRbXavlo|vXw~wc_tTlExh?3_A;>>PQaDpgy)$&Mt9J?We%5X z(@YoPhAF__KmCO)!cPBSG{-f1FrjFI54#K@lB*Gn7ycZ{i4aMUSxMg4`I>$!0V-7CHUdZ+VG04BtW*YQ?nKqmd6EHD+J%yQE6#`Q$K5g(=Uv`eS{}r80!y8 zOmf$mALN0D1&)B{3f$Lu;9-Fy;AI8wCw!mtC2$W5enbhJBtQ{?%l{T*@sK7pEtAs# z!#;$Zhi2G%wVpcP=1c^;k0v3B33kuCvSs_0$pGp$vWwSZ#JF}Q+dW)ikB zyXz>R56d<;^S=UlBHKIhgvgR;D+r!vr$JD8h!791@bV0Y&1kpML(B# zkJfUbi|L<=7xt*v(h9gmy~fd?)n4<$2*QQ5foR|hVxtQ0<>%q%jPwX zg~au5#8`mh?$R*6wqf-muJ7_-@pzHAzC+-Z{i!Xk$<6R_fu-Sl;qxeQ)x>ec)u&BJ zTm#=6AH{ql#Xg8ADSl-R*-}!>L!~9-3nHLWQVF#@7jq*5v@QD-@o9c`R$op*s#^bT zX!RQaWs7UJ++hD?kbZ@Y@(j|&c3yUs^tHe{kq2O?*_e87Fk5t?sCeWe~$oUGz&g6XYcbW5@f`Q434)HXY zobPEO88=aDPt=)hFYet^D5y5x~ z-9t0PMY^GOYR&nOel}Sn6F@N$)%)0SWaM(+1C3&Gx%czH!>Kg_o|{_xG7mf~pak3y zsaP)eA-+#55#bmq(23S5LWy4)DKo}BoPF_K!4GeShO?rQ0NFM~%}~tc-Xp+T0=HCY zu9U1TfM3*%5zl6(tbpO#swWD~CD15F!Vc$whb4@F=StXG9(Y*72zXfuJDcxwz9j4n z!H)v0D;Sy~ol^M1J_>K_GO*`L}bzi7VpT>#q-LhJZP0aB=)vOgBEkH{w*-WQfC4^ z9biYzuq^_K&45dT6n;sq1{D0Jsguq-s9bi#vzvAhhBxO^t!QxX@X zeIaq-^#iR*sNky5nuH2^wI~GEB!o-DtV!VSa!q2<(eNa8nTn^utVx_MvdCo7qHEAI zj+?e&^{^^&jGfj{sL}uDdM)B8V1i?q< zbG^lgmF};y#@u~rG}UAE0E#b1n87C_2*z8ESZRxi^sr1hdHP3ti|rC>s{Atjw?X{L zEaDmK50^osnC$R%Jn(RKn1JUB~KhkO)tqI0ICn!VRgi`Gd01l6}Obm<$25w0<`7wP!f)q z{P1u(KRnyU3j}KwnzIy&VSF|#12XWKiZ(Oz{2oG18Glb$EUsdhK-u8=rs&%ZMbn#D z`&qvG$wJg25BX!*Xoz%nRyx=T&NnFD>atvMl5V9rUOE4&3pZbW#g^-~T)1V+rYkOY z192zn)=FFjT1v?qW`C{Fa45$9cW4wy`{HZcTL`%F(P`hGd9ZjPykDk$e=P9I{?yjA zMbo~&0NA#l|2F(Pl=jucak6VZZ9=($z&A(daoupzZ*5d6lL-D&4#liQ0Ln1uq~WKO z3HylnG(Qs-kq9`c;>uJubFqJ#Zfmhoq3Mt9 zKc5J=rqJk!?pv`@A-ZS8^*tm4rlJwIwL!87n#JeZV-f+G3ZemB<;ehv%Xq}6ln6lD z7ZMj#giGfZl}eU-m~4yMfU|`2WNduqxu!kY{y^%cgGiiXv+riMhI`dy5!{%*;=i z-O$Tz{A7%3zcQBOeL!*Bj=MUS-vRv|-L^YBhoyq{(7d2{g+)F;CQkikhs29zLlqIL zKMkEer^gzKb;;0d_B=I-$Un4|v_+Z0<|jK}k0l zA+8?7O?G>Dh1lXB#+RX^dZ?s49uViuC{b9QVHF~>VP*18AbcOP4hN*Pw<<{^){645 zcOjP}ueEBy%4w}rhik1M+(-MQt|G>~f><}C*PAvDFW(9`6?Z1!(iYrgQ?HF-xH#Ep zE7Jz=$MHt2%JtLDU83!#jkr~~UAwVfX*Z{!abv1JtTf(ybZrFlvS`6XrtW&6r3IWk{d#Y&!?8gm6$%jBBmqk_9U14z6+ z6!9rVzR0UW;$_T!C^JTpuhQj8Z1_g!%LJq{>{@gJOW~NW;`uQp%|d?#kZRTBNM=1LR1Vt-ifD zF(mk=ak30h=tG>SR;Qf_3zkwGbSx*Fh$vRjh+`ItPrI_#f(1SZ6cH+heh})lC~9n1 zM7*dEg{tppH#&N;xJ*-{D4)l(#gaSp1t?OR%LQYH%CrRk97EYs3&s(#+TRqS3wfTe z#70A;bfcDv&p^G2>@E_s$!lnb99fA-szGHGsthF-&at5olUGwtF_T>OHo5Ig;S0OBO(Er#K~+ zvW zVhd4&2$q67Y}ch|XeP0;BQICHkV_&PuqJs#klvjtK6NPa`d!4Q z#Cs%UA>Q-CN0FD(%!;RcBZ|C~q11d0L|*#=SGdRvf0vQhqwz^ZUgBvmk=LoP=M7FS zYmPCO+rUvtoyKTIuRI>@>39m4G^8Fvuj74KRdH^bweF}cX{}C}W3Ep($6QNXi=1%1 zST?b=)n(qq$v^yLtJlJl@$ga>cEbs-iiEJ>c$4m++nK`^O^c->jx+1H%dDTI4Yl4F z9h7LiL*Wx2zM3&74Fuywk}E99kTH)bGfw^HEUC(dDo$EVe;TB3W0B5SmwP5OawDZg6A_nGZwi66#;Crc#*{=*~4mv*8V@A@DBfmd38X^-F6)VfrQ>;sEw@9|aBDi$LglX~) zCs1aJ2B7{l$X5#?Pes(nLn9HjxrfK%YdfL|1RT*t)aQDzJe6$eP9*C6GA14ocx8WT zo05VNOY%5?ZO1FW1@SWBuobUp;y6XrK5bzBEvkIywmU192O0Qg{}huA>-^7+I%LA* zV{%A@1ECNJMU?Y2@l&dr-dB8@A09_!o^}B!TZpo`iT%@T>R_Wnv+2Yq)^8eX?5soj z3D14N929P3CshgO%TG3U)mx*rwoWt_XkmEtqC%sgF!uR^n*6|tM>z04^Qgf3^xqd6 z9r5ao*r*V%iupV5k4DN?2gzn=CLG85O*4~?(MD&_?IuT-ahP6|KDZA6bBQ_>V`BWf zBR(a@BNYoVp4SePzfd-_Q2s)BCz`2&{Dq({Q!|af%lyTU@k!(_#M5B%7iYF$;x}7$ zsGDxL8_ntL#bfVKSARi?{6!C352=g|VTjf7#$;V=p{|@;S$pd#!%$b(nr^n&%5_mY ztue6MyB0sn)y(+`j{UqAo=OV`me>s^*(z4T1jjzQgE_q`IK^%+&9N%=flPL!-Wx-4 zoE}N>l!u{0ax8-JQXYq8$&R1@;6JpJAqx?tN`=Tj%uvo|hmw&9IRhHSBtkCcfrk?z z1UxqpvXuuOmRAB^HW9Lu@6&R09dkA4+VWAs4{yST6CttGeGWfTj=IT)1FdUP_dZvN z9y}SjyMu+FoC6?g{=&g2@DlV$>=5o^yO>~yaD_dDm9`F7qj6uFfxV6GHQDA5tb0&< zc4ns8g4*e+TB~!zY!iyG_uP(-#^v^Svt0tEV=;GiD)i3zFX~&&U4=A}=_UCi*!DhT zX;z1Aq|VjcJcqgNl%_vQWNiKfBb9Zl$rB(pRX6;~Rkvz#vGp!=bCupD57q5s+^%T| zBLf#-MKw3_^#xYG{3%045Pt?l{w(2Lwr1T<=dc-`hYAsh;+*ecqam`$Q5l}CXjR2Y zlcx)L2 z&MH9gk#gV536HvBWV4&o6}8MN(lr7aDO21BpoV#zFL%-UX6x zZ!9!AqWkNxQ6akb|CodKMk8)3=YqN-=9q&_HT`bESbol3B*o>O5ucK{Angl@3$Gt2 zWv85=LMc1to@!ADr0j%lW>R+eyG+?Vj87tEC!PkAvRjWkJ@fN*y4)yZvxg0(hcw+8 z6oS~`vU7B}3FPwTw9J@P?M)qadu57OIxmg+Sg@A!fB34HKLLxRA2z3(I-HTrcV6lU zmVOy|snyUZCNEXxfrs-_1Uxq{btVryoOU4KW%E)`7J#k&%~@z?1TMsV>`VnY@%lDckO;TodM{4usx0M@@Z; zc`2j*k^>NF%#gb^RSUI#4uq%>D9GQ9GJYF7b~|UnO^?(LFWF5G1#EZ6QAL$ig$QHF zpZp%oMjsM(YRiyg4#1HXTZSYZZ ziVjSnVs31_)`#5K?+cBXa$~=SMuFTIzV26UY*p2T8$rd}Du@wAe4joZ`j&ZYk!da3bUGZ$?0+xLfJiLUFe;a9aNb z;%*@TOx%sX%eebid=hcDcw*yjo~X1F>6n9+7D+bZBf3d$!)kKLAt0ZN0(%paw=RGz zIQ}fLdx^$QJf*OE`2A=rWwpb^HSP-8MAkn4?vna6l)b`o=CyDTK&J~?!RGAP_++hB z7xw_|=^mBZX5@Y_vH0@No*FtISA%0HkPw^jy6sY{hV@pf*=i5Z>>e3wj#BktXg@1` z=c6lQ;@$4(s}r}X7s;!EinumqSNNQ1HZIj~8m)_!q9S{jmg!d3YQvkbBWpWies#}3 zcrCoi7>=8;8(*kwZ&`WmSl#mm-NAe^=PimC-Bq4wsf11Hz0qwS)k6rE_1ru09%qBE z8vfnR@RN@q7`MnsO9rUy)GROvd^QJxPfpw)MBsfH2pDyc{4Ibk8yrk5P96{1Sqy># zf%)RG@R(mqWQvJA&Uyk=1-C~kBQWWO9vs=8KGcQgI~`gebdx+O4EL=sAqdv=d&uLH z6NPq9E!S7F6=imc9e6q>G74QyxBcyfn9QLIvLy#q4pXf@((Ss7QrY(roT_AVTuKUkxPLS7;{ zG-_Idzok{E+psDF8_Og*>QFj0>j7)&)C}X3aJj@&hEtPBjKO;Yg2CXFU^!_*CvIIFj$Olb1n+QT=+H@ds3J0+g#zb@Z>b?+h8}`{8h#seVdKC zgOa=C`oo=`oSQK{hT_hR8Gka0U_9qWi3S+U^h_}7q?LmK=iP)bFuEZ*4?y?o-QXyc zcQapeP}qp`iB9w8-n`gj)BxO@J=g{B-n`Po!kyK{+?$sJtdj1{>!E3J_vZP~O1d{F zRwdn=d6hyG0!}|#CjVXVDVh8i;$y(Sx!Cq^QWr{rms6jb>Ffsgr!hJKr;ya9@o4GM zW~&9>O=Z*=E9K_&4W3a??<3Szn!}a13~%T0p`jba#CSVumV>vWb*kGi%G>!IARxV+ z&*PKucEnSbw<9s`#oIZ4V`F^0F$xL#-Ic1`as^v3UElr0J>A3IH^Zh?rtd@frED*x zdw_vb71xlZw^W^G5-tL{BFPp?l^LOU*b|C;XXF=N3r~!~&IoqHO*Y#Z`A^+JHz}0` z8*NUH=jXu0SBBbqq|xum1zB>ER1V=8R-NGTD`wQmVg%#5Al>CQrqZt1uM9&E$-#kh zLV`H_n+n;xi>!O`%sDmoTT|X)zlF`^vZcZDWERVe>X)_9h%<6Zh;TjrxX5pDJw7yS zqp6Z_gFN=?dmW1C(4C2ME7Zc{`YuhW7>}zGNGR2(XQzfYO?NJY|FemsD?Prtp4H)Y z;wTN%O%Oc|K}ktpLS0+Ap{IKtxmu{0^K=a|XNL>HHiyjNh2zk)xbt)gw35yf%7t{E zR@(Hy%|j{&G!No}T;#O1`tpOR~I89oMFqr*-aGxih&sNRBu*z`Go5L0D;U=+r) z33ynw+T1e8&9V6qGtCg8bh727daVtPN2YgCsdZq{X~%4*4o--_z+}wCFoN+s5rv(i z;soP~tV)3r$q{pW+CtfZoTBm%!>_+%`NfxqzD~F8P7KTeNR3VyTyq}Z-lqyzyqfP2 z-KWtFB_1-$-QER_+)B>yHqwvtz{8cC1U$Er^9wxiuq#KvVK>XEmOjR}b}H4_Pd`LZ zRvPn8hSSMC2mpCtS|+cCcV#VaB2+6b>vU6+tSs?dN|(?MuOTW0?QrHYGio$SAu9k7 zR0Rlzq*g(dRub-+y)uRTC%{7nRePPRf-3Qp3aW(0=yhHEq={M!j*9A8qam0+X*3DS z*J%1JSfz#H52Miz2TIuz?)nS7Mmt2eog0lN$Kh+V(_=N-I*o1tjaG$5F&b@z2OidF z1Uy%xJ&^|<)@TGAG}`HwM#Hx@zl~nvG@9XbvK9e&8f|}g*Jq6;cs-{YjigIxv;&Ds zr8SxY02(bouxO1o3wTJ4b|XHCG?923j7D2G-E2+OCS!G)mprmkMZ*$M4_eL27-?Xh zUR$g>k-nPx)9AK4h>OZEETY?9qT3G8-?qFpH5OmHoffOz-l!2Spxs^zjbgOhJ9*$? z?MA?JwcCey;9>1Xz(Kp6W@$HkTU@&tUMF`U08hKU0N(XMy9Fd#>9@fJ!yyS18tz3z zsnQxw0RRmbAX>DB`yt>VHQbNzNoY9nG#CvxJX5cY*5L$)SRLnYakL1kK=q*I4hn+v z^xRU@k<@hNh0%43*13{jMAz-D+jb}CA~H4O@wMHCSZ#NhM!A5tI~W?pXuA`5;9+e? zz;m_Tqj}(AZAZXC+ikG49lkBD?F_e*gAjnH?H=imwhKzO(sy$$WkTcqPp=wJ0RW8` zAY8P@s{zra#@m5ULgR@iR^w&+=~f)A65@cNUTtw3QXHLKTi(>z&1mezQwqDj)RrG} z;aCIf;J6jZ)n0^6O+2-0O0lFy;F5s*5r{cii@Y7^XwTC8)Z1TqEnHomk$S^!>@*V> z&OKju(7nEt!lz4mbIaD~JIyhn?|WK|e6vP9r1<&8NHgr@?-7i^#$r){h>3?=5 zlD-)x7@iZNuu~J1b3#_7KzVWB65R*QQ}wrD+Y?x}@!9+HblZ{{t~e(kHA+9`i(Zl3 zsu2#E{tUP1$@&c z6P$B>uWsAjIlzd<9h|SpqO(_@(byKyWcNd(7)|znc;I18M!<75*+V?=uqGqmUiJ## z7T08k(a9$ffTzjc0q^>t$y_N`YHSWAOX#qBh(e`xm;wMgEI_Pi9d_`r(qV_-lh9$} ziPd4*mI?h^s{Bx)6JV%Aa<^e_#_Cv&-EkT_@sz@@FBz+4cr1t5YrLm>n5RR{Pnjnm zOqJ431vjEucnBSpT@RO>1~i+K{ekCTM^=Q9p9b6LwQ%i0hQEj1aIuw2V_==u*}8-7 zys)LGMA%a`@*x|-C&J9YlWP!+5E7jT(=q`z+LCr-sCVXc%^B)Y*Ji>ervvD+`dg)g zP^6X0o^!qm#eF6bD5$u-gwQ}vI(W9nAvaOfmy-@|$1Y@Gnsw5_OFS&x30y3T^g@7D zGK=&IXj;6Q{bpz-vq&gUCAR|3kN6??IUR`hm-0(@!>5#AdL}*w3f(u_djLDF-FVF@ z-iLWpeH4nd;rzd`M!PnNSNV;>Q3n+|^g)~o2sbR$TW~|UIp?51z>F$-J0Ts88Nvnh z$r+(R8ztli(w4iTCN{V$T5-A!RiUam{wHwO!6yI#85DjJpM*mto-$k(!nl{+e~&_+ z;Ii6uZ6~A(neBf^1Y8Kuk|FE(RQ`5A_{JiAKXwB?qR}qycbFk3e?Ty<-_c#+pek*P^Ulos z<)=tx6`uEe;xmYaS%^C%D4#N!ZuSQ_o1QS6 zd;M|81;60~upMKmI;m>U`*_QQDF;t~Id@n9?1%0DD*ntTj^g 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 Q`z+74b`0eAHq0jf1HAjV*8l(j diff --git a/docs/build/_sources/index.rst.txt b/docs/build/_sources/index.rst.txt deleted file mode 100644 index e2a80cc..0000000 --- a/docs/build/_sources/index.rst.txt +++ /dev/null @@ -1,20 +0,0 @@ -.. python-aternos documentation master file, created by - sphinx-quickstart on Fri Jun 17 14:02:03 2022. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to python-aternos's documentation! -========================================== - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/build/_sources/modules.rst.txt b/docs/build/_sources/modules.rst.txt deleted file mode 100644 index 118e4e5..0000000 --- a/docs/build/_sources/modules.rst.txt +++ /dev/null @@ -1,8 +0,0 @@ -python-aternos -============== - -.. toctree:: - :maxdepth: 4 - - python_aternos - setup diff --git a/docs/build/_sources/python_aternos.rst.txt b/docs/build/_sources/python_aternos.rst.txt deleted file mode 100644 index 0881aa9..0000000 --- a/docs/build/_sources/python_aternos.rst.txt +++ /dev/null @@ -1,93 +0,0 @@ -python\_aternos package -======================= - -Submodules ----------- - -python\_aternos.atclient module -------------------------------- - -.. automodule:: python_aternos.atclient - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atconf module ------------------------------ - -.. automodule:: python_aternos.atconf - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atconnect module --------------------------------- - -.. automodule:: python_aternos.atconnect - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.aterrors module -------------------------------- - -.. automodule:: python_aternos.aterrors - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atfile module ------------------------------ - -.. automodule:: python_aternos.atfile - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atfm module ---------------------------- - -.. automodule:: python_aternos.atfm - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atjsparse module --------------------------------- - -.. automodule:: python_aternos.atjsparse - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atplayers module --------------------------------- - -.. automodule:: python_aternos.atplayers - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atserver module -------------------------------- - -.. automodule:: python_aternos.atserver - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atwss module ----------------------------- - -.. automodule:: python_aternos.atwss - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: python_aternos - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/build/_sources/setup.rst.txt b/docs/build/_sources/setup.rst.txt deleted file mode 100644 index 552eb49..0000000 --- a/docs/build/_sources/setup.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -setup module -============ - -.. automodule:: setup - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/build/_static/_sphinx_javascript_frameworks_compat.js b/docs/build/_static/_sphinx_javascript_frameworks_compat.js deleted file mode 100644 index 8549469..0000000 --- a/docs/build/_static/_sphinx_javascript_frameworks_compat.js +++ /dev/null @@ -1,134 +0,0 @@ -/* - * _sphinx_javascript_frameworks_compat.js - * ~~~~~~~~~~ - * - * Compatability shim for jQuery and underscores.js. - * - * WILL BE REMOVED IN Sphinx 6.0 - * xref RemovedInSphinx60Warning - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} diff --git a/docs/build/_static/alabaster.css b/docs/build/_static/alabaster.css deleted file mode 100644 index 0eddaeb..0000000 --- a/docs/build/_static/alabaster.css +++ /dev/null @@ -1,701 +0,0 @@ -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: Georgia, serif; - font-size: 17px; - background-color: #fff; - color: #000; - margin: 0; - padding: 0; -} - - -div.document { - width: 940px; - margin: 30px auto 0 auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 220px; -} - -div.sphinxsidebar { - width: 220px; - font-size: 14px; - line-height: 1.5; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #fff; - color: #3E4349; - padding: 0 30px 0 30px; -} - -div.body > .section { - text-align: left; -} - -div.footer { - width: 940px; - margin: 20px auto 30px auto; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -p.caption { - font-family: inherit; - font-size: inherit; -} - - -div.relations { - display: none; -} - - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebarwrapper { - padding: 18px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0; - margin: -10px 0 0 0px; - text-align: center; -} - -div.sphinxsidebarwrapper h1.logo { - margin-top: -10px; - text-align: center; - margin-bottom: 5px; - text-align: left; -} - -div.sphinxsidebarwrapper h1.logo-name { - margin-top: 0px; -} - -div.sphinxsidebarwrapper p.blurb { - margin-top: 0; - font-style: normal; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: Georgia, serif; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar ul li.toctree-l1 > a { - font-size: 120%; -} - -div.sphinxsidebar ul li.toctree-l2 > a { - font-size: 110%; -} - -div.sphinxsidebar input { - border: 1px solid #CCC; - font-family: Georgia, serif; - font-size: 1em; -} - -div.sphinxsidebar hr { - border: none; - height: 1px; - color: #AAA; - background: #AAA; - - text-align: left; - margin-left: 0; - width: 50%; -} - -div.sphinxsidebar .badge { - border-bottom: none; -} - -div.sphinxsidebar .badge:hover { - border-bottom: none; -} - -/* To address an issue with donation coming after search */ -div.sphinxsidebar h3.donation { - margin-top: 10px; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: Georgia, serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #DDD; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #EAEAEA; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - margin: 20px 0px; - padding: 10px 30px; - background-color: #EEE; - border: 1px solid #CCC; -} - -div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fafafa; -} - -div.admonition p.admonition-title { - font-family: Georgia, serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: #fff; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.warning { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.danger { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.error { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.caution { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.attention { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.important { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.note { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.tip { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.hint { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.seealso { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.topic { - background-color: #EEE; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt, code { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -.hll { - background-color: #FFC; - margin: 0 -12px; - padding: 0 12px; - display: block; -} - -img.screenshot { -} - -tt.descname, tt.descclassname, code.descname, code.descclassname { - font-size: 0.95em; -} - -tt.descname, code.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #EEE; - background: #FDFDFD; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.field-list p { - margin-bottom: 0.8em; -} - -/* Cloned from - * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 - */ -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -table.footnote td.label { - width: .1px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - /* Matches the 30px from the narrow-screen "li > ul" selector below */ - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #EEE; - padding: 7px 30px; - margin: 15px 0px; - line-height: 1.3em; -} - -div.viewcode-block:target { - background: #ffd; -} - -dl pre, blockquote pre, li pre { - margin-left: 0; - padding-left: 30px; -} - -tt, code { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, code.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fff; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -/* Don't put an underline on images */ -a.image-reference, a.image-reference:hover { - border-bottom: none; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt, a:hover code { - background: #EEE; -} - - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - li > ul { - /* Matches the 30px from the "ul, ol" selector above */ - margin-left: 30px; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - - - -@media screen and (max-width: 875px) { - - body { - margin: 0; - padding: 20px 30px; - } - - div.documentwrapper { - float: none; - background: #fff; - } - - div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: #FFF; - } - - div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, - div.sphinxsidebar h3 a { - color: #fff; - } - - div.sphinxsidebar a { - color: #AAA; - } - - div.sphinxsidebar p.logo { - display: none; - } - - div.document { - width: 100%; - margin: 0; - } - - div.footer { - display: none; - } - - div.bodywrapper { - margin: 0; - } - - div.body { - min-height: 0; - padding: 0; - } - - .rtd_doc_footer { - display: none; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .footer { - width: auto; - } - - .github { - display: none; - } -} - - -/* misc. */ - -.revsys-inline { - display: none!important; -} - -/* Make nested-list/multi-paragraph items look better in Releases changelog - * pages. Without this, docutils' magical list fuckery causes inconsistent - * formatting between different release sub-lists. - */ -div#changelog > div.section > ul > li > p:only-child { - margin-bottom: 0; -} - -/* Hide fugly table cell borders in ..bibliography:: directive output */ -table.docutils.citation, table.docutils.citation td, table.docutils.citation th { - border: none; - /* Below needed in some edge cases; if not applied, bottom shadows appear */ - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - - -/* relbar */ - -.related { - line-height: 30px; - width: 100%; - font-size: 0.9rem; -} - -.related.top { - border-bottom: 1px solid #EEE; - margin-bottom: 20px; -} - -.related.bottom { - border-top: 1px solid #EEE; -} - -.related ul { - padding: 0; - margin: 0; - list-style: none; -} - -.related li { - display: inline; -} - -nav#rellinks { - float: right; -} - -nav#rellinks li+li:before { - content: "|"; -} - -nav#breadcrumbs li+li:before { - content: "\00BB"; -} - -/* Hide certain items when printing */ -@media print { - div.related { - display: none; - } -} \ No newline at end of file diff --git a/docs/build/_static/basic.css b/docs/build/_static/basic.css deleted file mode 100644 index 0889677..0000000 --- a/docs/build/_static/basic.css +++ /dev/null @@ -1,930 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 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 form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 360px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} -nav.contents, -aside.topic, - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ -nav.contents, -aside.topic, - -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -nav.contents > :last-child, -aside.topic > :last-child, - -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -nav.contents::after, -aside.topic::after, - -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -/* Docutils 0.17 and older (footnotes & citations) */ -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -/* Docutils 0.18+ (footnotes & citations) */ -aside.footnote > span, -div.citation > span { - float: left; -} -aside.footnote > span:last-of-type, -div.citation > span:last-of-type { - padding-right: 0.5em; -} -aside.footnote > p { - margin-left: 2em; -} -div.citation > p { - margin-left: 4em; -} -aside.footnote > p:last-of-type, -div.citation > p:last-of-type { - margin-bottom: 0em; -} -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { - content: ""; - clear: both; -} - -/* Footnotes & citations ends */ - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/docs/build/_static/custom.css b/docs/build/_static/custom.css deleted file mode 100644 index 2a924f1..0000000 --- a/docs/build/_static/custom.css +++ /dev/null @@ -1 +0,0 @@ -/* This file intentionally left blank. */ diff --git a/docs/build/_static/doctools.js b/docs/build/_static/doctools.js deleted file mode 100644 index c3db08d..0000000 --- a/docs/build/_static/doctools.js +++ /dev/null @@ -1,264 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ -"use strict"; - -const _ready = (callback) => { - if (document.readyState !== "loading") { - callback(); - } else { - document.addEventListener("DOMContentLoaded", callback); - } -}; - -/** - * highlight a given string on a node by wrapping it in - * span elements with the given class name. - */ -const _highlight = (node, addItems, text, className) => { - if (node.nodeType === Node.TEXT_NODE) { - const val = node.nodeValue; - const parent = node.parentNode; - const pos = val.toLowerCase().indexOf(text); - if ( - pos >= 0 && - !parent.classList.contains(className) && - !parent.classList.contains("nohighlight") - ) { - let span; - - const closestNode = parent.closest("body, svg, foreignObject"); - const isInSVG = closestNode && closestNode.matches("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.classList.add(className); - } - - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - parent.insertBefore( - span, - parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling - ) - ); - node.nodeValue = val.substr(0, pos); - - if (isInSVG) { - const rect = document.createElementNS( - "http://www.w3.org/2000/svg", - "rect" - ); - const bbox = parent.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute("class", className); - addItems.push({ parent: parent, target: rect }); - } - } - } else if (node.matches && !node.matches("button, select, textarea")) { - node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); - } -}; -const _highlightText = (thisNode, text, className) => { - let addItems = []; - _highlight(thisNode, addItems, text, className); - addItems.forEach((obj) => - obj.parent.insertAdjacentElement("beforebegin", obj.target) - ); -}; - -/** - * Small JavaScript module for the documentation. - */ -const Documentation = { - init: () => { - Documentation.highlightSearchWords(); - Documentation.initDomainIndexTable(); - Documentation.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS: {}, - PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), - LOCALE: "unknown", - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext: (string) => { - const translated = Documentation.TRANSLATIONS[string]; - switch (typeof translated) { - case "undefined": - return string; // no translation - case "string": - return translated; // translation exists - default: - return translated[0]; // (singular, plural) translation tuple exists - } - }, - - ngettext: (singular, plural, n) => { - const translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated !== "undefined") - return translated[Documentation.PLURAL_EXPR(n)]; - return n === 1 ? singular : plural; - }, - - addTranslations: (catalog) => { - Object.assign(Documentation.TRANSLATIONS, catalog.messages); - Documentation.PLURAL_EXPR = new Function( - "n", - `return (${catalog.plural_expr})` - ); - Documentation.LOCALE = catalog.locale; - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords: () => { - const highlight = - new URLSearchParams(window.location.search).get("highlight") || ""; - const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); - if (terms.length === 0) return; // nothing to do - - // There should never be more than one element matching "div.body" - const divBody = document.querySelectorAll("div.body"); - const body = divBody.length ? divBody[0] : document.querySelector("body"); - window.setTimeout(() => { - terms.forEach((term) => _highlightText(body, term, "highlighted")); - }, 10); - - const searchBox = document.getElementById("searchbox"); - if (searchBox === null) return; - searchBox.appendChild( - document - .createRange() - .createContextualFragment( - '

" - ) - ); - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords: () => { - document - .querySelectorAll("#searchbox .highlight-link") - .forEach((el) => el.remove()); - document - .querySelectorAll("span.highlighted") - .forEach((el) => el.classList.remove("highlighted")); - const url = new URL(window.location); - url.searchParams.delete("highlight"); - window.history.replaceState({}, "", url); - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar: () => { - document.querySelectorAll("input[name=q]")[0]?.focus(); - }, - - /** - * Initialise the domain index toggle buttons - */ - initDomainIndexTable: () => { - const toggler = (el) => { - const idNumber = el.id.substr(7); - const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); - if (el.src.substr(-9) === "minus.png") { - el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; - toggledRows.forEach((el) => (el.style.display = "none")); - } else { - el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; - toggledRows.forEach((el) => (el.style.display = "")); - } - }; - - const togglerElements = document.querySelectorAll("img.toggler"); - togglerElements.forEach((el) => - el.addEventListener("click", (event) => toggler(event.currentTarget)) - ); - togglerElements.forEach((el) => (el.style.display = "")); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); - }, - - initOnKeyListeners: () => { - // only install a listener if it is really needed - if ( - !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS - ) - return; - - const blacklistedElements = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", - ]); - document.addEventListener("keydown", (event) => { - if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements - if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys - - if (!event.shiftKey) { - switch (event.key) { - case "ArrowLeft": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const prevLink = document.querySelector('link[rel="prev"]'); - if (prevLink && prevLink.href) { - window.location.href = prevLink.href; - event.preventDefault(); - } - break; - case "ArrowRight": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const nextLink = document.querySelector('link[rel="next"]'); - if (nextLink && nextLink.href) { - window.location.href = nextLink.href; - event.preventDefault(); - } - break; - case "Escape": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.hideSearchWords(); - event.preventDefault(); - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case "/": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.focusSearchBar(); - event.preventDefault(); - } - }); - }, -}; - -// quick alias for translations -const _ = Documentation.gettext; - -_ready(Documentation.init); diff --git a/docs/build/_static/documentation_options.js b/docs/build/_static/documentation_options.js deleted file mode 100644 index 11f635f..0000000 --- a/docs/build/_static/documentation_options.js +++ /dev/null @@ -1,14 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.0.6', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: false, -}; \ No newline at end of file diff --git a/docs/build/_static/file.png b/docs/build/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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( diff --git a/docs/build/_static/jquery-3.6.0.js b/docs/build/_static/jquery-3.6.0.js deleted file mode 100644 index fc6c299..0000000 --- a/docs/build/_static/jquery-3.6.0.js +++ /dev/null @@ -1,10881 +0,0 @@ -/*! - * jQuery JavaScript Library v3.6.0 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright OpenJS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2021-03-02T17:08Z - */ -( 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. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -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 = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 - // Plus for old WebKit, typeof returns "function" for HTML collections - // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) - return typeof obj === "function" && typeof obj.nodeType !== "number" && - typeof obj.item !== "function"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( 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; -} -/* 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.6.0", - - // 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 ); - }; - -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 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - 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" && !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 ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // 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() {}, - - 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 ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - 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; - }, - - // 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 flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // 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 = toType( obj ); - - if ( isFunction( obj ) || 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.6 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2021-02-16 - */ -( 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(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = 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]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // 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 + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - 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" ) - }, - - rhtml = /HTML$/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-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - 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(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { 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 - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.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 ) { - 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 && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // 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 ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } 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 && - inDisabledFieldset( 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 ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * 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 - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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 ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* 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 ) { - - var input; - - // 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( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // 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( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - 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" ); - } - - // Support: Opera 10 - 11 only - // 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 - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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 - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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 ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - 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 - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ 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 ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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 += ""; - - /* eslint-disable max-len */ - - 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; - /* eslint-enable max-len */ - - }; - }, - - "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 || 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 ) { - // eslint-disable-next-line no-unused-expressions - 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 > length ? - 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 ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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 ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( 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; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -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 ( 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 ( 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 ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - 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 ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( 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 && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && 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 = 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 && 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 ( 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, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - 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, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].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 primary Deferred - primary = 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 ) ) { - primary.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( primary.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return primary.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); - } - - return primary.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 ( toType( 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 ( !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; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -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[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ 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 ][ 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( camelCase ); - } else { - key = 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 = 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 documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -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. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - 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 = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - 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 = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( 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; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // 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, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -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, attached, 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 ( toType( 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; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -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 ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - 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 = Object.create( null ); - } - 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 ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ 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() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - 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: 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 - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( 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; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - // Support: Chrome 86+ - // In Chrome, if an element having a focusout handler is blurred by - // clicking outside of it, it invokes the handler synchronously. If - // that handler calls `.remove()` on the element, the data is cleared, - // leaving `result` undefined. We need to guard against this. - return result && result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -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 || Date.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, - code: 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: true -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - // Suppress native focus or blur as it's already being fired - // in leverageNative. - _default: function() { - return true; - }, - - delegateType: delegateType - }; -} ); - -// 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 - - // Support: IE <=10 - 11, Edge 12 - 13 only - // 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( elem ).children( "tbody" )[ 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 ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle 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 = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - 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 && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, 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 && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( 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 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 ); - }; - -var swap = function( elem, options, callback ) { - 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.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( 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; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - 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; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, 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"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - // - // Support: Firefox 70+ - // Only Firefox includes border widths - // in computed dimensions. (gh-4529) - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "border:1px solid"; - - // Support: Chrome 86+ - // Height set through cssText does not get applied. - // Computed height then comes back as 0. - tr.style.height = "1px"; - trChild.style.height = "9px"; - - // Support: Android 8 Chrome 86+ - // In our bodyBackground.html iframe, - // display for all div elements is set to "inline", - // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is display: block - // gets around this issue. - trChild.style.display = "block"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + - parseInt( trStyle.borderTopWidth, 10 ) + - parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -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 === "" && !isAttached( 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.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.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 cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( 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 potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -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" - }; - -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 boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "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, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": 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: {}, - - // 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 = 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) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - 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 = 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, dimension ) { - jQuery.cssHooks[ dimension ] = { - 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, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - 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 ( prefix !== "margin" ) { - 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 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - 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 = Date.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 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - 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 = 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 ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( 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 ( 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 || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !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 ( 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 ) { - 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 = Date.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://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - 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 ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - 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, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( 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 ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - 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, valueIsFunction, - 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; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - 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 - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = 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 && !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() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ 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 && isFunction( elem[ type ] ) && !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; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - 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 ); - } - } -} ); - - -// 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() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || 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.document || 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 = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml, parserErrorElem; - 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 ) {} - - parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; - if ( !xml || parserErrorElem ) { - jQuery.error( "Invalid XML: " + ( - parserErrorElem ? - jQuery.map( parserErrorElem.childNodes, function( el ) { - return el.textContent; - } ).join( "\n" ) : - 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 && toType( 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 = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // 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 ( 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() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // 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 - 15 - // 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 and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - 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.guid++ ) + - 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 ); - } - - // Use a noop converter for missing script but not if jsonp - if ( !isSuccess && - jQuery.inArray( "script", s.dataTypes ) > -1 && - jQuery.inArray( "json", s.dataTypes ) < 0 ) { - s.converters[ "text script" ] = function() {}; - } - - // 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 ( 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.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - 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, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( 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 ( 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 htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? 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.ontimeout = - 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 = xhr.ontimeout = 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 or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - - - - - -
-
-
- - -
- - -

Index

- -
- A - | B - | C - | D - | E - | F - | G - | H - | I - | J - | K - | L - | M - | N - | O - | P - | Q - | R - | S - | T - | U - | V - | W - -
-

A

- - - -
- -

B

- - - -
- -

C

- - - -
- -

D

- - - -
- -

E

- - - -
- -

F

- - - -
- -

G

- - - -
- -

H

- - - -
- -

I

- - - -
- -

J

- - -
- -

K

- - - -
- -

L

- - - -
- -

M

- - - -
- -

N

- - - -
- -

O

- - - -
- -

P

- - - -
- -

Q

- - -
- -

R

- - - -
- -

S

- - - -
- -

T

- - - -
- -

U

- - - -
- -

V

- - - -
- -

W

- - - -
- - - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/docs/build/html/.buildinfo b/docs/build/html/.buildinfo deleted file mode 100644 index 8d7ff67..0000000 --- a/docs/build/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# 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: 248bf4413f52c61df59cba2c064f51e2 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/html/.doctrees/environment.pickle b/docs/build/html/.doctrees/environment.pickle deleted file mode 100644 index 8fc745b7f85adc185363840743899fe9a4d032c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18046 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 diff --git a/docs/build/html/.doctrees/index.doctree b/docs/build/html/.doctrees/index.doctree deleted file mode 100644 index 2df261885b671eebbe65ad531fa132cdf7bde347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4978 zcmds5-Hseb6<&Kizx%(A4N+pzxk$V=J2Pt&iDYjO3POSvi-b_3Tv+Xz?wYCcbXT{l zs&{8E5Q&5%FO&o*9VG7H6?g)KkdU~AC*TnfLPFw#ud2IedS70)BN7Y`A_ma(~;y6q_5Z2lv)p39G*beH>zu8tAu(N|wd61! z0Am5N%0mS(m{t%Gr9i~@h9GhAtsQ3Rd@&@!MADJt=}hD3P^H8ItDQ=!s63&0W?Gtz z?TMUq*=@FJI(`M19IIx9#dilRiRmCDauN`I@a`Z0ga?aI8{niG6ek8;gml`MO6TTA z#0AZd8rcvoY$@y0M9d)18mwvEyNAt&<~pLaEpz_^8Ua+)!fElgyGzi1qX5Z{*}wG2 zKR){Hg+qnW_n`X&_7+=ZcaPb<<7`OSS72@SDq!~-K6mi>8a{74$}{#R8-RVkU}t;m z-cie`*0$(RG7;7kD0E{huyXN&Pp)Im_NF@#PqZQM2eo%>s z&cNG6PO3e?E~{JE`_>%aVRxMwIxx$(mu+XZO3izxlB6k>IaxO6w-(I_^V6C6&ArnC z0X?1c77@@>y$Y)?xj}I0D|5d*^fIs^b&w+YS5zOxQM92fGJR(9* zlc9Bq%T+s{yEO;f(=P@#QG3$11KZj#i;!vkh$Fqe?77or#jK|kdWx|>#p#O-9n<8(1$pfu#n~OxuI|d`+W+Qq z?f1+LcZpe5It23Zzh^I{%b>~Osb4RHtK%vZW$qX;8Ki452UC;V&43B`Kugkrse>gvwd zT=3s7?}GnarPw7dc+$MKf)e$zVF52xPp|vn6`1wkSKVIsfo1;ZixR?@lY>{(a|46!$jftO(bd=J)x29 zV!Dh(vt`5V&?$$lG|`!=m>Q-L(qT5nb(=O>+v)_ll*FKPv_zw8l|l~Rk4Jv zKPRP%W?|xE$N<+iifN*#Uq9(k5@`Q~D_%f!%MZD-EfW+eU)ibxg6)}gD5DSpMQaDt zlx+U2@x5)o;S!88w&jI~t+Ws>Uqg#JTLPjxHmZOeF$NGL9;3|vVEeAwOlj)d+K*U7 zD!|Lp=%m0q-fn}#e3faPs>8tmWYsUa&we7ugWTM*obCbO^wDL(J=)DyH0`~4@HXtZ zDM!JQcuSd!f2$IYU?mo^6Ds?h>XEwxVLxCxj&NBA2?|jZ+8)1c?f{dqKMT*90)8>x zottfShM{`uGd^Y!K5hm}EcDk^jM?6Qnjx+g40Y43i=`hW0V!vSI{`yK7{KvGyur%O zgg8CPQuIjnrwBJBlz9LX1t?sMfPpG8?AlbJvf&aRk1cqkgcQ+er^87O%wYTo5yEG9 z0;6cS&dsd=Toa$7Z;O2VY=WuPPQ1^}PB}yZtkI}QYv*Q_ijy4Ol4%#|1n~1E!q}4s2=pg? z{L4(o?%590&FpM)?l#Xe_NpB!8QXV!Ok`%G?nWnf15K#IyoF9dvC&%b6$;cT1s{F} zfZO9?63vj|SYKHp&bT`Z5PXuP(VU);Vh*rkk@8p=ghToXa#u2_IHnNXtQ3KAZ+K9 H4g3EC?i_ke diff --git a/docs/build/html/.doctrees/modules.doctree b/docs/build/html/.doctrees/modules.doctree deleted file mode 100644 index 4eb6184d3c6d7205279ab42c8e4b57da4a4526db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2721 zcmZWrOKV&=6n1RS)AO*MrW6vll#(W)u_u%+`q&h@H1(pCKo&u0?$wNhb){QLHy$rS z+eJzY+C}Z}?Wg;iM+}3nj*iabJKs6dU!8yd8}5~Verj_r)art!snRL4!S_?06d6-4 zdcS)}_&sPOT*%Zg6b)K~>%|Hk4>PuFW7?((&i<>^(n83KQu` zS~89rNkvNEx6C=Amgu;XwuKf(E5|?p-+f7CfkHGr$fs9+uw;rE>a+=1q~MixG|RC# zs@xFRzQ%G`FAF2F8UsHPNgQ|Kt`ot(4gPeYwNu)$jm^t@ejNK3)g!BgHd%mVVnLmp zfSqwHSeSfRNtk4%gxm&lM|%e8StvNueI%Y8rORJO~GKVd5YtQ>WP zZIn8`ld^fSguBTNH40ck!!VjbGH`|_EG8A+`-xC_;RsXcI%owyDBR-w`*SPs{b+lW zFk`eKoT^lUN+=w1OI+|%UAS#4ozhD1XFEGPCitIzQW;$b&>VfVy|HuBAIAhNP~yNx zBB9{NlB#7vmke;HSns2~{C&d`ZBl|>1UcX)Hu9D4CR#0!Bj6Az$uXnED)6qK(86i5 z7WsVvMvc=V%Sp>Rpjrw92xkgcB#vb$k3%{7ke@$(@g4A-m_@Qp8AX@-q19;jX9=f>2ZgVi4Jelo;`DWq!$rK*%b8sd0StIZgj#?D%~UvzbHWz$ z9X*jn@=8ssR*ZM>bpU5@8>HypTZF(Fb8zw?fz~x)85NS?{b5*n6TkN-^$P-Im5XYo z-T4Ei-o(4y_p4cg<^>gnN(Gw35l79EVK(6&KS5BSmcy$Aw84!QuY7;HC9Q6Eh+%Ef zF1oRW@GyY97lqX~f5l%~KZpW%n*-Rlfxo)5{7d|Q$w$_YH;YxC9w!1NkM3cylEj{D z^r|p7C6yk6M{%>cmTmn@)lYVWt@dEc;-K+b9y;B!kJ)Nm9Oe&pZPh!tr78- z;Exh5C4fZ^xH5Xb)bbBV{$2PjKFg>0{0|{tK63y7 diff --git a/docs/build/html/.doctrees/python_aternos.doctree b/docs/build/html/.doctrees/python_aternos.doctree deleted file mode 100644 index 2f030ebe24c853bce743e3873c420db367a81c19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17539 zcmeHOU1%KF6}Ba>q+Q99r8G{kEob8dtC* zW-~vQ)DoJ~hGyGKLYfJM(!TVEK%g%zeJU-1Kwk=d375Y%`~F!v__}s^fTT$ zT4yy!b99op#cu2GIMg(*OR_^O!?c@yS=p2~h{wC2$B`$=HV-8I zj%^=>o+m=~Fb{tDZIZkS-&GVU7blJAih`(!w-1GmM zQQdxg(ME_C>2MpDO*`@izva;ddXmo3Q*@Fpvxiry*(0l}Y;7vCbMbSl3ea8kb6p8i zT}6=gsvlf%D@?9s*+}H{l?k^^XZ=|SVWh{xYu0$eZTC#o)e)qC>v*au00vQA^rKp* zr+M!54kS$P1iYWdzq|48EdJe#Waxb&i51_RUO)u3WCzx;V~=v!J=2;PtPvv;4pxxP z9T_ULWJl38Oli|kGR!fsiccs}wv5s~DViIdG%|ILA`poEioP4u_!$?2^zV0xJXt z4hw*3<^p3th%(p&h8b*|i16hy=2<+~h4Xt=!6!4(1orv(7zlvhX7Nd}&r z@=998;QXc>IBz7tIhO)wxV*T-VQ7ZSD;ZcJFmPA^%*o;M>hvTUrhlNC|~074zI)L1ZD{-N(5I3 z4crw#v+$VM0W`6uaIjX6b^=4~F#wmMbVdc>p{R!d;2S9b7W_5vN)$o77!Gd5!4)Qo zVM(+(VaGEHA8rie(F2PR(rD{AC&|oJIPkud_e(?Oa*L{p_cP8YOok4~|9*>y}QZekM}NOe?odwnS)9)J}M8Wg}XWStMVAX~`uneS2+n70q_bSB{oxZLE6iR&FT*fTiS+9;U~^ zbj+ZAvo7k|22i(%YyVQx zO+^l%T~?@!crfvPy#ZwbA$o7ReYoHUbmG)4(18KiV=9`_0S7{1SmIKFqn(VM*5l;W zP1&zTetNd)fit}}QBlG>2!Rsfz{#x&tTrXmlQmt!S)xV68QP0%F*pqbS@n)DYXde( zjGO!vj?MUTg8Bs&HAB@<9FFA3)&_w*;RJ3GL4jHhP8dNOm7lpi2f<6V`sZ?J#%P`B zVv3g#j`Ywz%^Ur{&vkF0$h%MT$Jr(N5WP;nNnL8um*|h^>-1OjP5MXr4t<+`L_h4# za?2V1aTou%lYe}Hf2{G3Yy9I0e7LO6$9H!6m?s>p2@eB$X+WhgAh9&oD;x7B%y4mzusof+^@w{!K zXqsnu68^I1Oj9$0#d`Bhv;YucST;Y$ZH12kyG4vMt;Unq4jyjlA!NI$$cAZXsOyA7 zPOMgV?D_I1#PZ(rKZ~Pz@A;o6;=!$5BSMcTrlFw<BU<2?_yX~jW~f9>(qwZ?!J%a@Wed$BBJ}R zL>s&7>&B*GZW#&Oxx3T^MU!yu6O6OSwLnMlwFDBKnW%tH4V|#=uVWRVf%&p7wW0c( zNpjw3wVLtFudN09=x{k49g8=b&E{H!Ud`KploTJJ>e z1n;*hyjBI99}8^KsvwP`3jE8*F@<5z{Y2XEOJrGE8#pxMX~PKAIh{+L18oR*QGDMr z;%4JdRrvo0!T*AT-$HFTldlcQ@3YV3PVjzf!#h>5d0SwU)`r~|{r=bPV@ktbyNQ(H z1LRm*88|TGDZ>cFxhI!62g*=E873wxtQ!6&*k4r{&gUyb@@0pa>Nd z;fGaN{{zALs*13duL#MP_||eKc)u0l*Hy6jg}^4Q2)pn4gI5j5l!ZO_6KTWmkY#CY z;Lwbx4I@zJi@DS}(1r@y@YgE*|BK*%Rc&}UUmKF|u0EVQ!TYTZ|EPk^`vRM?+7P^9 zyXV?4rk_X~{(~$_YXgU7JZ%_(I+t^)bD#|sv|;H8=Bwe<9hn1tsGtwm zsuaKzq5!I{9j@l`E&G zhh#iu7>za8a#?er3>B2&r&Xx`6G8o|%J5XaGGuk3E!j^Z*K*H&p(Mm*B@CeEICQTmJ{WUaesO diff --git a/docs/build/html/_sources/index.rst.txt b/docs/build/html/_sources/index.rst.txt deleted file mode 100644 index e2a80cc..0000000 --- a/docs/build/html/_sources/index.rst.txt +++ /dev/null @@ -1,20 +0,0 @@ -.. python-aternos documentation master file, created by - sphinx-quickstart on Fri Jun 17 14:02:03 2022. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to python-aternos's documentation! -========================================== - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/build/html/_sources/modules.rst.txt b/docs/build/html/_sources/modules.rst.txt deleted file mode 100644 index 0f5fd7d..0000000 --- a/docs/build/html/_sources/modules.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -python_aternos -============== - -.. toctree:: - :maxdepth: 4 - - python_aternos diff --git a/docs/build/html/_sources/python_aternos.rst.txt b/docs/build/html/_sources/python_aternos.rst.txt deleted file mode 100644 index 0881aa9..0000000 --- a/docs/build/html/_sources/python_aternos.rst.txt +++ /dev/null @@ -1,93 +0,0 @@ -python\_aternos package -======================= - -Submodules ----------- - -python\_aternos.atclient module -------------------------------- - -.. automodule:: python_aternos.atclient - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atconf module ------------------------------ - -.. automodule:: python_aternos.atconf - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atconnect module --------------------------------- - -.. automodule:: python_aternos.atconnect - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.aterrors module -------------------------------- - -.. automodule:: python_aternos.aterrors - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atfile module ------------------------------ - -.. automodule:: python_aternos.atfile - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atfm module ---------------------------- - -.. automodule:: python_aternos.atfm - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atjsparse module --------------------------------- - -.. automodule:: python_aternos.atjsparse - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atplayers module --------------------------------- - -.. automodule:: python_aternos.atplayers - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atserver module -------------------------------- - -.. automodule:: python_aternos.atserver - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atwss module ----------------------------- - -.. automodule:: python_aternos.atwss - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: python_aternos - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js b/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js deleted file mode 100644 index 8549469..0000000 --- a/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +++ /dev/null @@ -1,134 +0,0 @@ -/* - * _sphinx_javascript_frameworks_compat.js - * ~~~~~~~~~~ - * - * Compatability shim for jQuery and underscores.js. - * - * WILL BE REMOVED IN Sphinx 6.0 - * xref RemovedInSphinx60Warning - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} diff --git a/docs/build/html/_static/alabaster.css b/docs/build/html/_static/alabaster.css deleted file mode 100644 index 0eddaeb..0000000 --- a/docs/build/html/_static/alabaster.css +++ /dev/null @@ -1,701 +0,0 @@ -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: Georgia, serif; - font-size: 17px; - background-color: #fff; - color: #000; - margin: 0; - padding: 0; -} - - -div.document { - width: 940px; - margin: 30px auto 0 auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 220px; -} - -div.sphinxsidebar { - width: 220px; - font-size: 14px; - line-height: 1.5; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #fff; - color: #3E4349; - padding: 0 30px 0 30px; -} - -div.body > .section { - text-align: left; -} - -div.footer { - width: 940px; - margin: 20px auto 30px auto; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -p.caption { - font-family: inherit; - font-size: inherit; -} - - -div.relations { - display: none; -} - - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebarwrapper { - padding: 18px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0; - margin: -10px 0 0 0px; - text-align: center; -} - -div.sphinxsidebarwrapper h1.logo { - margin-top: -10px; - text-align: center; - margin-bottom: 5px; - text-align: left; -} - -div.sphinxsidebarwrapper h1.logo-name { - margin-top: 0px; -} - -div.sphinxsidebarwrapper p.blurb { - margin-top: 0; - font-style: normal; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: Georgia, serif; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar ul li.toctree-l1 > a { - font-size: 120%; -} - -div.sphinxsidebar ul li.toctree-l2 > a { - font-size: 110%; -} - -div.sphinxsidebar input { - border: 1px solid #CCC; - font-family: Georgia, serif; - font-size: 1em; -} - -div.sphinxsidebar hr { - border: none; - height: 1px; - color: #AAA; - background: #AAA; - - text-align: left; - margin-left: 0; - width: 50%; -} - -div.sphinxsidebar .badge { - border-bottom: none; -} - -div.sphinxsidebar .badge:hover { - border-bottom: none; -} - -/* To address an issue with donation coming after search */ -div.sphinxsidebar h3.donation { - margin-top: 10px; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: Georgia, serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #DDD; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #EAEAEA; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - margin: 20px 0px; - padding: 10px 30px; - background-color: #EEE; - border: 1px solid #CCC; -} - -div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fafafa; -} - -div.admonition p.admonition-title { - font-family: Georgia, serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: #fff; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.warning { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.danger { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.error { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.caution { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.attention { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.important { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.note { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.tip { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.hint { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.seealso { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.topic { - background-color: #EEE; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt, code { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -.hll { - background-color: #FFC; - margin: 0 -12px; - padding: 0 12px; - display: block; -} - -img.screenshot { -} - -tt.descname, tt.descclassname, code.descname, code.descclassname { - font-size: 0.95em; -} - -tt.descname, code.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #EEE; - background: #FDFDFD; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.field-list p { - margin-bottom: 0.8em; -} - -/* Cloned from - * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 - */ -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -table.footnote td.label { - width: .1px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - /* Matches the 30px from the narrow-screen "li > ul" selector below */ - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #EEE; - padding: 7px 30px; - margin: 15px 0px; - line-height: 1.3em; -} - -div.viewcode-block:target { - background: #ffd; -} - -dl pre, blockquote pre, li pre { - margin-left: 0; - padding-left: 30px; -} - -tt, code { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, code.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fff; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -/* Don't put an underline on images */ -a.image-reference, a.image-reference:hover { - border-bottom: none; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt, a:hover code { - background: #EEE; -} - - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - li > ul { - /* Matches the 30px from the "ul, ol" selector above */ - margin-left: 30px; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - - - -@media screen and (max-width: 875px) { - - body { - margin: 0; - padding: 20px 30px; - } - - div.documentwrapper { - float: none; - background: #fff; - } - - div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: #FFF; - } - - div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, - div.sphinxsidebar h3 a { - color: #fff; - } - - div.sphinxsidebar a { - color: #AAA; - } - - div.sphinxsidebar p.logo { - display: none; - } - - div.document { - width: 100%; - margin: 0; - } - - div.footer { - display: none; - } - - div.bodywrapper { - margin: 0; - } - - div.body { - min-height: 0; - padding: 0; - } - - .rtd_doc_footer { - display: none; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .footer { - width: auto; - } - - .github { - display: none; - } -} - - -/* misc. */ - -.revsys-inline { - display: none!important; -} - -/* Make nested-list/multi-paragraph items look better in Releases changelog - * pages. Without this, docutils' magical list fuckery causes inconsistent - * formatting between different release sub-lists. - */ -div#changelog > div.section > ul > li > p:only-child { - margin-bottom: 0; -} - -/* Hide fugly table cell borders in ..bibliography:: directive output */ -table.docutils.citation, table.docutils.citation td, table.docutils.citation th { - border: none; - /* Below needed in some edge cases; if not applied, bottom shadows appear */ - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - - -/* relbar */ - -.related { - line-height: 30px; - width: 100%; - font-size: 0.9rem; -} - -.related.top { - border-bottom: 1px solid #EEE; - margin-bottom: 20px; -} - -.related.bottom { - border-top: 1px solid #EEE; -} - -.related ul { - padding: 0; - margin: 0; - list-style: none; -} - -.related li { - display: inline; -} - -nav#rellinks { - float: right; -} - -nav#rellinks li+li:before { - content: "|"; -} - -nav#breadcrumbs li+li:before { - content: "\00BB"; -} - -/* Hide certain items when printing */ -@media print { - div.related { - display: none; - } -} \ No newline at end of file diff --git a/docs/build/html/_static/basic.css b/docs/build/html/_static/basic.css deleted file mode 100644 index 0889677..0000000 --- a/docs/build/html/_static/basic.css +++ /dev/null @@ -1,930 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 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 form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 360px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} -nav.contents, -aside.topic, - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ -nav.contents, -aside.topic, - -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -nav.contents > :last-child, -aside.topic > :last-child, - -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -nav.contents::after, -aside.topic::after, - -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -/* Docutils 0.17 and older (footnotes & citations) */ -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -/* Docutils 0.18+ (footnotes & citations) */ -aside.footnote > span, -div.citation > span { - float: left; -} -aside.footnote > span:last-of-type, -div.citation > span:last-of-type { - padding-right: 0.5em; -} -aside.footnote > p { - margin-left: 2em; -} -div.citation > p { - margin-left: 4em; -} -aside.footnote > p:last-of-type, -div.citation > p:last-of-type { - margin-bottom: 0em; -} -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { - content: ""; - clear: both; -} - -/* Footnotes & citations ends */ - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/docs/build/html/_static/custom.css b/docs/build/html/_static/custom.css deleted file mode 100644 index 2a924f1..0000000 --- a/docs/build/html/_static/custom.css +++ /dev/null @@ -1 +0,0 @@ -/* This file intentionally left blank. */ diff --git a/docs/build/html/_static/doctools.js b/docs/build/html/_static/doctools.js deleted file mode 100644 index c3db08d..0000000 --- a/docs/build/html/_static/doctools.js +++ /dev/null @@ -1,264 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ -"use strict"; - -const _ready = (callback) => { - if (document.readyState !== "loading") { - callback(); - } else { - document.addEventListener("DOMContentLoaded", callback); - } -}; - -/** - * highlight a given string on a node by wrapping it in - * span elements with the given class name. - */ -const _highlight = (node, addItems, text, className) => { - if (node.nodeType === Node.TEXT_NODE) { - const val = node.nodeValue; - const parent = node.parentNode; - const pos = val.toLowerCase().indexOf(text); - if ( - pos >= 0 && - !parent.classList.contains(className) && - !parent.classList.contains("nohighlight") - ) { - let span; - - const closestNode = parent.closest("body, svg, foreignObject"); - const isInSVG = closestNode && closestNode.matches("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.classList.add(className); - } - - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - parent.insertBefore( - span, - parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling - ) - ); - node.nodeValue = val.substr(0, pos); - - if (isInSVG) { - const rect = document.createElementNS( - "http://www.w3.org/2000/svg", - "rect" - ); - const bbox = parent.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute("class", className); - addItems.push({ parent: parent, target: rect }); - } - } - } else if (node.matches && !node.matches("button, select, textarea")) { - node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); - } -}; -const _highlightText = (thisNode, text, className) => { - let addItems = []; - _highlight(thisNode, addItems, text, className); - addItems.forEach((obj) => - obj.parent.insertAdjacentElement("beforebegin", obj.target) - ); -}; - -/** - * Small JavaScript module for the documentation. - */ -const Documentation = { - init: () => { - Documentation.highlightSearchWords(); - Documentation.initDomainIndexTable(); - Documentation.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS: {}, - PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), - LOCALE: "unknown", - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext: (string) => { - const translated = Documentation.TRANSLATIONS[string]; - switch (typeof translated) { - case "undefined": - return string; // no translation - case "string": - return translated; // translation exists - default: - return translated[0]; // (singular, plural) translation tuple exists - } - }, - - ngettext: (singular, plural, n) => { - const translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated !== "undefined") - return translated[Documentation.PLURAL_EXPR(n)]; - return n === 1 ? singular : plural; - }, - - addTranslations: (catalog) => { - Object.assign(Documentation.TRANSLATIONS, catalog.messages); - Documentation.PLURAL_EXPR = new Function( - "n", - `return (${catalog.plural_expr})` - ); - Documentation.LOCALE = catalog.locale; - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords: () => { - const highlight = - new URLSearchParams(window.location.search).get("highlight") || ""; - const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); - if (terms.length === 0) return; // nothing to do - - // There should never be more than one element matching "div.body" - const divBody = document.querySelectorAll("div.body"); - const body = divBody.length ? divBody[0] : document.querySelector("body"); - window.setTimeout(() => { - terms.forEach((term) => _highlightText(body, term, "highlighted")); - }, 10); - - const searchBox = document.getElementById("searchbox"); - if (searchBox === null) return; - searchBox.appendChild( - document - .createRange() - .createContextualFragment( - '" - ) - ); - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords: () => { - document - .querySelectorAll("#searchbox .highlight-link") - .forEach((el) => el.remove()); - document - .querySelectorAll("span.highlighted") - .forEach((el) => el.classList.remove("highlighted")); - const url = new URL(window.location); - url.searchParams.delete("highlight"); - window.history.replaceState({}, "", url); - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar: () => { - document.querySelectorAll("input[name=q]")[0]?.focus(); - }, - - /** - * Initialise the domain index toggle buttons - */ - initDomainIndexTable: () => { - const toggler = (el) => { - const idNumber = el.id.substr(7); - const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); - if (el.src.substr(-9) === "minus.png") { - el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; - toggledRows.forEach((el) => (el.style.display = "none")); - } else { - el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; - toggledRows.forEach((el) => (el.style.display = "")); - } - }; - - const togglerElements = document.querySelectorAll("img.toggler"); - togglerElements.forEach((el) => - el.addEventListener("click", (event) => toggler(event.currentTarget)) - ); - togglerElements.forEach((el) => (el.style.display = "")); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); - }, - - initOnKeyListeners: () => { - // only install a listener if it is really needed - if ( - !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS - ) - return; - - const blacklistedElements = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", - ]); - document.addEventListener("keydown", (event) => { - if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements - if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys - - if (!event.shiftKey) { - switch (event.key) { - case "ArrowLeft": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const prevLink = document.querySelector('link[rel="prev"]'); - if (prevLink && prevLink.href) { - window.location.href = prevLink.href; - event.preventDefault(); - } - break; - case "ArrowRight": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const nextLink = document.querySelector('link[rel="next"]'); - if (nextLink && nextLink.href) { - window.location.href = nextLink.href; - event.preventDefault(); - } - break; - case "Escape": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.hideSearchWords(); - event.preventDefault(); - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case "/": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.focusSearchBar(); - event.preventDefault(); - } - }); - }, -}; - -// quick alias for translations -const _ = Documentation.gettext; - -_ready(Documentation.init); diff --git a/docs/build/html/_static/documentation_options.js b/docs/build/html/_static/documentation_options.js deleted file mode 100644 index 11f635f..0000000 --- a/docs/build/html/_static/documentation_options.js +++ /dev/null @@ -1,14 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.0.6', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: false, -}; \ No newline at end of file diff --git a/docs/build/html/_static/file.png b/docs/build/html/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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( diff --git a/docs/build/html/_static/jquery-3.6.0.js b/docs/build/html/_static/jquery-3.6.0.js deleted file mode 100644 index fc6c299..0000000 --- a/docs/build/html/_static/jquery-3.6.0.js +++ /dev/null @@ -1,10881 +0,0 @@ -/*! - * jQuery JavaScript Library v3.6.0 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright OpenJS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2021-03-02T17:08Z - */ -( 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. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -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 = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 - // Plus for old WebKit, typeof returns "function" for HTML collections - // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) - return typeof obj === "function" && typeof obj.nodeType !== "number" && - typeof obj.item !== "function"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( 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; -} -/* 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.6.0", - - // 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 ); - }; - -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 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - 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" && !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 ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // 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() {}, - - 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 ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - 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; - }, - - // 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 flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // 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 = toType( obj ); - - if ( isFunction( obj ) || 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.6 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2021-02-16 - */ -( 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(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = 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]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // 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 + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - 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" ) - }, - - rhtml = /HTML$/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-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - 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(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { 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 - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.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 ) { - 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 && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // 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 ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } 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 && - inDisabledFieldset( 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 ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * 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 - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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 ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* 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 ) { - - var input; - - // 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( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // 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( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - 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" ); - } - - // Support: Opera 10 - 11 only - // 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 - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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 - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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 ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - 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 - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ 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 ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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 += ""; - - /* eslint-disable max-len */ - - 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; - /* eslint-enable max-len */ - - }; - }, - - "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 || 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 ) { - // eslint-disable-next-line no-unused-expressions - 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 > length ? - 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 ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - 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 ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( 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; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -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 ( 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 ( 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 ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - 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 ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( 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 && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && 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 = 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 && 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 ( 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, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - 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, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].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 primary Deferred - primary = 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 ) ) { - primary.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( primary.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return primary.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); - } - - return primary.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 ( toType( 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 ( !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; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -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[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ 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 ][ 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( camelCase ); - } else { - key = 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 = 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 documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -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. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - 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 = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - 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 = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( 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; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // 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, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -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, attached, 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 ( toType( 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; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -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 ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - 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 = Object.create( null ); - } - 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 ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ 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() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - 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: 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 - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( 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; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - // Support: Chrome 86+ - // In Chrome, if an element having a focusout handler is blurred by - // clicking outside of it, it invokes the handler synchronously. If - // that handler calls `.remove()` on the element, the data is cleared, - // leaving `result` undefined. We need to guard against this. - return result && result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -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 || Date.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, - code: 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: true -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - // Suppress native focus or blur as it's already being fired - // in leverageNative. - _default: function() { - return true; - }, - - delegateType: delegateType - }; -} ); - -// 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 - - // Support: IE <=10 - 11, Edge 12 - 13 only - // 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( elem ).children( "tbody" )[ 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 ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle 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 = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - 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 && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, 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 && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( 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 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 ); - }; - -var swap = function( elem, options, callback ) { - 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.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( 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; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - 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; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, 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"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - // - // Support: Firefox 70+ - // Only Firefox includes border widths - // in computed dimensions. (gh-4529) - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "border:1px solid"; - - // Support: Chrome 86+ - // Height set through cssText does not get applied. - // Computed height then comes back as 0. - tr.style.height = "1px"; - trChild.style.height = "9px"; - - // Support: Android 8 Chrome 86+ - // In our bodyBackground.html iframe, - // display for all div elements is set to "inline", - // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is display: block - // gets around this issue. - trChild.style.display = "block"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + - parseInt( trStyle.borderTopWidth, 10 ) + - parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -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 === "" && !isAttached( 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.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.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 cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( 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 potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -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" - }; - -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 boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "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, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": 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: {}, - - // 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 = 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) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - 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 = 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, dimension ) { - jQuery.cssHooks[ dimension ] = { - 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, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - 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 ( prefix !== "margin" ) { - 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 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - 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 = Date.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 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - 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 = 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 ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( 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 ( 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 || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !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 ( 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 ) { - 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 = Date.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://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - 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 ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - 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, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( 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 ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - 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, valueIsFunction, - 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; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - 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 - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = 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 && !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() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ 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 && isFunction( elem[ type ] ) && !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; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - 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 ); - } - } -} ); - - -// 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() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || 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.document || 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 = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml, parserErrorElem; - 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 ) {} - - parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; - if ( !xml || parserErrorElem ) { - jQuery.error( "Invalid XML: " + ( - parserErrorElem ? - jQuery.map( parserErrorElem.childNodes, function( el ) { - return el.textContent; - } ).join( "\n" ) : - 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 && toType( 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 = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // 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 ( 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() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // 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 - 15 - // 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 and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - 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.guid++ ) + - 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 ); - } - - // Use a noop converter for missing script but not if jsonp - if ( !isSuccess && - jQuery.inArray( "script", s.dataTypes ) > -1 && - jQuery.inArray( "json", s.dataTypes ) < 0 ) { - s.converters[ "text script" ] = function() {}; - } - - // 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 ( 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.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - 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, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( 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 ( 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 htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? 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.ontimeout = - 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 = xhr.ontimeout = 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 or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - - - - - -
-
-
- - -
- - -

Index

- -
- -
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/docs/build/html/index.html b/docs/build/html/index.html deleted file mode 100644 index 21fe6bf..0000000 --- a/docs/build/html/index.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - Welcome to python-aternos’s documentation! — python-aternos 1.0.6 documentation - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

Welcome to python-aternos’s documentation!¶

-
-
-
-
-

Indices and tables¶

- -
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/docs/build/html/modules.html b/docs/build/html/modules.html deleted file mode 100644 index 4f382a4..0000000 --- a/docs/build/html/modules.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - python_aternos — python-aternos 1.0.6 documentation - - - - - - - - - - - - - - - - - - -
- - -
-
- - - - - - - \ No newline at end of file diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv deleted file mode 100644 index c38f556..0000000 --- a/docs/build/html/objects.inv +++ /dev/null @@ -1,7 +0,0 @@ -# Sphinx inventory version 2 -# Project: python-aternos -# Version: -# The remainder of this file is compressed using zlib. -xÚ…A -Â0E÷9Åx€ -n½ ¡àÂ¥ÄdhŠI&4S°;¯áõ<‰¶‰˜@Á]òÿ›ÿ:ô½×x‡Èzoå-4;èrº5ì,æ§øašÔ Ä­"‡ÀabC¾‘Œƒ§øz<#|øÑ¡gÉ=ùp¤W”aj¾EÚ<’-f¹[>±Ôç(ÁÉzÉVQŒý±´Ëa-«ÇJgݬ©!Hu“ŠˆrP¦¶§,RßÎìÈÑŽs \ No newline at end of file diff --git a/docs/build/html/python_aternos.html b/docs/build/html/python_aternos.html deleted file mode 100644 index 7683e19..0000000 --- a/docs/build/html/python_aternos.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - python_aternos package — python-aternos 1.0.6 documentation - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

python_aternos package¶

-
-

Submodules¶

-
-
-

python_aternos.atclient module¶

-
-
-

python_aternos.atconf module¶

-
-
-

python_aternos.atconnect module¶

-
-
-

python_aternos.aterrors module¶

-
-
-

python_aternos.atfile module¶

-
-
-

python_aternos.atfm module¶

-
-
-

python_aternos.atjsparse module¶

-
-
-

python_aternos.atplayers module¶

-
-
-

python_aternos.atserver module¶

-
-
-

python_aternos.atwss module¶

-
-
-

Module contents¶

-
-
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/docs/build/html/search.html b/docs/build/html/search.html deleted file mode 100644 index acdfecf..0000000 --- a/docs/build/html/search.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - Search — python-aternos 1.0.6 documentation - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -

Search

- - - - -

- Searching for multiple words only shows matches that contain - all words. -

- - -
- - - -
- - - -
- -
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js deleted file mode 100644 index ce3ce5e..0000000 --- a/docs/build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({"docnames": ["index", "modules", "python_aternos"], "filenames": ["index.rst", "modules.rst", "python_aternos.rst"], "titles": ["Welcome to python-aternos\u2019s documentation!", "python_aternos", "python_aternos package"], "terms": {"index": 0, "modul": [0, 1], "search": 0, "page": 0, "packag": 1, "submodul": 1, "atclient": 1, "atconf": 1, "atconnect": 1, "aterror": 1, "atfil": 1, "atfm": 1, "atjspars": 1, "atplay": 1, "atserv": 1, "atwss": 1, "content": 1}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"welcom": 0, "python": 0, "aterno": 0, "s": 0, "document": 0, "indic": 0, "tabl": 0, "python_aterno": [1, 2], "packag": 2, "submodul": 2, "atclient": 2, "modul": 2, "atconf": 2, "atconnect": 2, "aterror": 2, "atfil": 2, "atfm": 2, "atjspars": 2, "atplay": 2, "atserv": 2, "atwss": 2, "content": 2}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}}) \ No newline at end of file diff --git a/docs/build/index.html b/docs/build/index.html deleted file mode 100644 index 21fe6bf..0000000 --- a/docs/build/index.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - Welcome to python-aternos’s documentation! — python-aternos 1.0.6 documentation - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

Welcome to python-aternos’s documentation!¶

-
-
-
-
-

Indices and tables¶

- -
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/docs/build/modules.html b/docs/build/modules.html deleted file mode 100644 index 77a7e3a..0000000 --- a/docs/build/modules.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - python-aternos — python-aternos 1.0.6 documentation - - - - - - - - - - - - - - - - - - -
- - -
-
- - - - - - - \ No newline at end of file diff --git a/docs/build/objects.inv b/docs/build/objects.inv deleted file mode 100644 index 23ef6716e8fd800c9847be5f50b68b471df1ec8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2560 zcmV+b3jg&ZAX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGk#d30!R zZY^PSWpZwBa|$CMR%LQ?X>V>iAPOTORA^-&a%F8{X>Md?av*PJAarPHb0B7EY-J#6 zb0A}HZE$jBb8}^6Aa!$TZf78RY-wUH3V7PB+|RD#wiO59{e21-?e-d-7TIK1Ow*!3 zf(|kPW@+$>l+9d<)R2_#IIF%!U$0M6>Ypu()J%MSXA#VeZGMs{ilWG)(_Z4q*@KA6 zTNifi<@?6T&Zym=)8EUl_NUmGKaO8M|7rL9wEFsQ|1FF>tN$K^>xdRhB{X>T{<; zJXFSYvNpmaE$;{Ko$t%5FO_PecJ^W7AKEB-!{|%zr7|iahcPI1XH0MOjXkxo3r*=e z#MDZovJu^(p{G_~U`L08)E+;yz zEWa00dKCi0uIxpeZk$u^160u@R>D@wFgVu{AA{o?9FndP+HzF7l6vToIjGJE{LpF@ zs}lp0E|P#Vjf;|_ZdxNQ$}{ZH1f}k%8#^PWJv$g3cs%D>94{IcCUqpjGxR0FxX9AY z1y{$nX+#BEOve^Q>;lscC21ad;~MmcGArE+Uw@hY3rzjxTR{4QPh)A?%{vv|r?Gud z*bXq<&?aSm@&lAtrCMS189gSiDy65P5x@imJtp=R`cZ)MilJtLID^bQqk>F}yuUR$g!#L!Yh86F-NPQg zx^IQ|N`yfWF?#*dMMY9hV!Wy`#X8>zgFCGfm8v_c^uz7B>cM)QO735j^saivw!fdJ z$q7V1&w#Y9zWh(ZiX&;7VNv=zqdQM}JbKYBEorV3R3I}_sl?Q8Y zQM#XLrCi-hVi=JDQ&CIHr)EWa)*2swkvq#IbVlIHzgtqfz7^gJtD9-;PiPs*OILB7@_6rH%~_aTtxWAx_s4CfRfiDUUnO8f_Ksw1T4<_KH`Z z8K7IA1w!W*M?x#!EYF2{*2eVXH-_C8BR*gj)VyJF_i2ZMR4Tj zlv(-QsSY)!RWd-ht^EKUtA8{8@FzFg;D~3iC(x9KED;X|+FQo1Q2d1i6ozgQ2OTDMN zlBCZEETGQnb06p6aq6wVfs-K-t7`-a@y)B5pvR)D1UM*V!$YD|Hb^8)WleI#s}xOo z;7XAL0xZ@Z7Rs{L(3qCB2L-pRF@`9YHHn71B+uCzyYdqNzj|3>pf@l#LGLxZw;`YF8s~S-@zhv07a8!1`<@3V?bUvGvN_gO@FH5?sA3g1{nX(c`;; zU`v_>4_n#HL1clmpn>b0CGp63gTq!ma}QknEP&7&Xu*S*LQ5vTBATn%!f5WH>!Y~{ zFOx3vAONc+Lk2fEsooZarq|na*%Ix2dke&rdz&zrd~eg`NyFFw>zxl!yBZ0Olzvx> z=T-O{$Ma77)k9x@zC!r>ZfgpB@omL1y!f#aIo<$SllZG3R}qdm7xDVaHuZYy0WiB| zjsQt63m84uWdQ?IUT%ogOo{~#Nq|}A=y@;;9z7jq0i$QdEMS5C%m&^wOHY+KVL*a} zl>p~SSbIRaghVx17uJ9&KGp=B=OY7wWFIAqobe;WkhC8e2IT$_@z*enUZIvS8R;)K zOkLNVtscFj&W8Fj4$cuHx`V13@!jEy5JCFkEVC?7t93HSxi?kjnwswcav`39dIda;EDokDBs&!=vZE-TuVyC4f`81JuUVYOwNzJ0g@AC zZ+Y~L*&8B|I(tima%gX%+=mTh)&43;Pp`enQUl7%9F}lW+ts&WT))qajP9|9<2u!q-aahKkHHW3%5pllasLu+iJeC1} zP0;h;=Mpk7&Mj(A{LF$f<7XO@l0L(zS@JUo%#~mA=o#}zjh<)ft~{7+>fS7((-_gj5hVBgrvhoRv8#_sECxy?c?u0GrKZ*qvEdJ0PT^jLkj_3^W@*vIkv594oR W*Dkj+d@%lQ{BAthr~d;!l}!1aI?#Rq diff --git a/docs/build/py-modindex.html b/docs/build/py-modindex.html deleted file mode 100644 index fc962cf..0000000 --- a/docs/build/py-modindex.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - Python Module Index — python-aternos 1.0.6 documentation - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - -

Python Module Index

- -
- p -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
- p
- python_aternos -
    - python_aternos.atclient -
    - python_aternos.atconf -
    - python_aternos.atconnect -
    - python_aternos.aterrors -
    - python_aternos.atfile -
    - python_aternos.atfm -
    - python_aternos.atjsparse -
    - python_aternos.atplayers -
    - python_aternos.atserver -
    - python_aternos.atwss -
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/docs/build/python_aternos.html b/docs/build/python_aternos.html deleted file mode 100644 index 5e90af6..0000000 --- a/docs/build/python_aternos.html +++ /dev/null @@ -1,3426 +0,0 @@ - - - - - - - - - python_aternos package — python-aternos 1.0.6 documentation - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

python_aternos package¶

-
-

Submodules¶

-
-
-

python_aternos.atclient module¶

-
-
-class python_aternos.atclient.Client(atconn: AternosConnect)¶
-

Bases: object

-

Aternos API Client class whose object contains user’s auth data

-
-
Parameters:
-

atconn (python_aternos.atconnect.AternosConnect) – python_aternos.atconnect.AternosConnect instance with initialized Aternos session

-
-
-
-
-change_email(value: str) None¶
-

Changes an e-mail in your Aternos account

-
-
Parameters:
-

value (str) – New e-mail

-
-
Raises:
-

ValueError – If an invalid e-mail address is passed to the function

-
-
-
- -
-
-change_password(old: str, new: str) None¶
-

Changes a password in your Aternos account

-
-
Parameters:
-
    -
  • old (str) – Old password

  • -
  • new (str) – New password

  • -
-
-
-
- -
-
-change_username(value: str) None¶
-

Changes a username in your Aternos account

-
-
Parameters:
-

value (str) – New username

-
-
-
- -
-
-classmethod from_credentials(username: str, password: str)¶
-

Log in to Aternos with a username and a plain password

-
-
Parameters:
-
    -
  • username (str) – Your username

  • -
  • password (str) – Your password without any encryption

  • -
-
-
Returns:
-

Client instance

-
-
Return type:
-

python_aternos.Client

-
-
-
- -
-
-classmethod from_hashed(username: str, md5: str)¶
-

Log in to Aternos with a username and a hashed password

-
-
Parameters:
-
    -
  • username (str) – Your username

  • -
  • md5 (str) – Your password hashed with MD5

  • -
-
-
Raises:
-

CredentialsError – If the API doesn’t return a valid session cookie

-
-
Returns:
-

Client instance

-
-
Return type:
-

python_aternos.Client

-
-
-
- -
-
-classmethod from_session(session: str)¶
-

Log in to Aternos using a session cookie value

-
-
Parameters:
-

session (str) – Value of ATERNOS_SESSION cookie

-
-
Returns:
-

Client instance

-
-
Return type:
-

python_aternos.Client

-
-
-
- -
-
-get_server(servid: str) AternosServer¶
-

Creates a server object from the server ID. -Use this instead of list_servers if you know the ID to save some time.

-
-
Returns:
-

python_aternos.atserver.AternosServer object

-
-
Return type:
-

python_aternos.atserver.AternosServer

-
-
-
- -
-
-list_servers() List[AternosServer]¶
-

Parses a list of your servers from Aternos website

-
-
Returns:
-

List of python_aternos.atserver.AternosServer objects

-
-
Return type:
-

list

-
-
-
- -
-
-static md5encode(passwd: str) str¶
-

Encodes the given string with MD5

-
-
Parameters:
-

passwd (str) – String to encode

-
-
Returns:
-

Hexdigest hash of the string in lowercase

-
-
Return type:
-

str

-
-
-
- -
-
-classmethod restore_session(file: str = '~/.aternos')¶
-

Log in to Aternos using a saved ATERNOS_SESSION cookie

-
-
Parameters:
-

file (str, optional) – File where a session cookie was saved, deafults to ~/.aternos

-
-
Returns:
-

Client instance

-
-
Return type:
-

python_aternos.Client

-
-
-
- -
-
-save_session(file: str = '~/.aternos') None¶
-

Saves an ATERNOS_SESSION cookie to a file

-
-
Parameters:
-

file (str, optional) – File where a session cookie must be saved, defaults to ~/.aternos

-
-
-
- -
- -
-
-

python_aternos.atconf module¶

-
-
-class python_aternos.atconf.AternosConfig(atserv: AternosServer)¶
-

Bases: object

-

Class for editing server settings

-
-
Parameters:
-

atserv (python_aternos.atserver.AternosServer) – python_aternos.atserver.AternosServer object

-
-
-
-
-get_java() int¶
-

Parses Java version from options page

-
-
Returns:
-

Java image version

-
-
Return type:
-

int

-
-
-
- -
-
-get_server_props(proptyping: bool = True) Dict[str, Any]¶
-

Parses all server.properties from options page

-
-
Parameters:
-

proptyping – If the returned dict should contain value

-
-
-

that matches property type (e.g. max-players will be int) -instead of string, defaults to True -:type proptyping: bool, optional -:return: Server.properties dict -:rtype: Dict[str,Any]

-
- -
-
-get_timezone() str¶
-

Parses timezone from options page

-
-
Returns:
-

Area/Location

-
-
Return type:
-

str

-
-
-
- -
-
-get_world_props(world: str = 'world', proptyping: bool = True) Dict[str, Any]¶
-

Parses level.dat from specified world’s options page

-
-
Parameters:
-
    -
  • world (str, optional) – Name of the world, defaults to ‘world’

  • -
  • proptyping – If the returned dict should contain the value

  • -
-
-
-

that matches property type (e.g. randomTickSpeed will be bool) -instead of string, defaults to True -:type proptyping: bool, optional -:return: Level.dat dict -:rtype: Dict[str,Any]

-
- -
-
-set_java(value: int) None¶
-

Sets new Java version

-
-
Parameters:
-

value (int) – New Java image version

-
-
-
- -
-
-set_server_prop(option: str, value: Any) None¶
-

Sets server.properties option

-
-
Parameters:
-
    -
  • option (str) – Option name

  • -
  • value (Any) – New value

  • -
-
-
-
- -
-
-set_server_props(props: Dict[str, Any]) None¶
-

Updates server.properties options with the given dict

-
-
Parameters:
-

props (Dict[str,Any]) – Dict with properties {key:value}

-
-
-
- -
-
-set_timezone(value: str) None¶
-

Sets new timezone

-
-
Parameters:
-

value (str) – New timezone

-
-
Raises:
-

ValueError – If given string

-
-
-

doesn’t match Area/Location format

-
- -
-
-set_world_prop(option: Union[WorldOpts, WorldRules], value: Any, gamerule: bool = False, world: str = 'world') None¶
-

Sets level.dat option for specified world

-
-
Parameters:
-
    -
  • option (Union[WorldOpts,WorldRules]) – Option name

  • -
  • value (Any) – New value

  • -
  • gamerule – If the option

  • -
-
-
-

is a gamerule, defaults to False -:type gamerule: bool, optional -:param world: Name of the world which -level.dat must be edited, defaults to ‘world’ -:type world: str, optional

-
- -
-
-set_world_props(props: Dict[str, Any]) None¶
-
- -
- -
-
-class python_aternos.atconf.Difficulty(value)¶
-

Bases: IntEnum

-

/difficulty numeric list

-
-
-easy = 1¶
-
- -
-
-hard = 3¶
-
- -
-
-normal = 2¶
-
- -
-
-peaceful = 0¶
-
- -
- -
-
-class python_aternos.atconf.Gamemode(value)¶
-

Bases: IntEnum

-

/gamemode numeric list

-
-
-adventure = 2¶
-
- -
-
-creative = 1¶
-
- -
-
-spectator = 3¶
-
- -
-
-survival = 0¶
-
- -
- -
-
-class python_aternos.atconf.ServerOpts(value)¶
-

Bases: Enum

-

server.options file

-
-
-animals = 'spawn-animals'¶
-
- -
-
-cmdblock = 'enable-command-block'¶
-
- -
-
-cmds = 'allow-cheats'¶
-
- -
-
-difficulty = 'difficulty'¶
-
- -
-
-flight = 'allow-flight'¶
-
- -
-
-forcegm = 'force-gamemode'¶
-
- -
-
-gm = 'gamemode'¶
-
- -
-
-monsters = 'spawn-monsters'¶
-
- -
-
-nether = 'allow-nether'¶
-
- -
-
-online = 'online-mode'¶
-
- -
-
-pack = 'resource-pack'¶
-
- -
-
-packreq = 'require-resource-pack'¶
-
- -
-
-players = 'max-players'¶
-
- -
-
-pvp = 'pvp'¶
-
- -
-
-spawnlock = 'spawn-protection'¶
-
- -
-
-villagers = 'spawn-npcs'¶
-
- -
-
-whl = 'white-list'¶
-
- -
- -
-
-class python_aternos.atconf.WorldOpts(value)¶
-

Bases: Enum

-

level.dat file

-
-
-difficulty = 'Difficulty'¶
-
- -
-
-hardcore = 'hardcore'¶
-
- -
-
-seed = 'seed'¶
-
- -
-
-seed12 = 'randomseed'¶
-
- -
- -
-
-class python_aternos.atconf.WorldRules(value)¶
-

Bases: Enum

-

/gamerule list

-
-
-admincmdlog = 'logAdminCommands'¶
-
- -
-
-advs = 'announceAdvancements'¶
-
- -
-
-blockdrop = 'doTileDrops'¶
-
- -
-
-cmdfb = 'sendCommandFeedback'¶
-
- -
-
-cmdlen = 'maxCommandChainLength'¶
-
- -
-
-cmdout = 'commandBlockOutput'¶
-
- -
-
-daynight = 'doDaylightCycle'¶
-
- -
-
-deathmsg = 'showDeathMessages'¶
-
- -
-
-drowndmg = 'drowningDamage'¶
-
- -
-
-elytra = 'disableElytraMovementCheck'¶
-
- -
-
-entcram = 'maxEntityCramming'¶
-
- -
-
-entdrop = 'doEntityDrops'¶
-
- -
-
-falldmg = 'fallDamage'¶
-
- -
-
-fire = 'doFireTick'¶
-
- -
-
-firedmg = 'fireDamage'¶
-
- -
-
-forgive = 'forgiveDeadPlayers'¶
-
- -
-
-immrespawn = 'doImmediateRespawn'¶
-
- -
-
-keepinv = 'keepInventory'¶
-
- -
-
-limitcraft = 'doLimitedCrafting'¶
-
- -
-
-mobgrief = 'mobGriefing'¶
-
- -
-
-mobloot = 'doMobLoot'¶
-
- -
-
-mobs = 'doMobSpawning'¶
-
- -
-
-patrols = 'doPatrolSpawning'¶
-
- -
-
-phantoms = 'doInsomnia'¶
-
- -
-
-raids = 'disableRaids'¶
-
- -
-
-reducedf3 = 'reducedDebugInfo'¶
-
- -
-
-regen = 'naturalRegeneration'¶
-
- -
-
-rndtick = 'randomTickSpeed'¶
-
- -
-
-sleeppct = 'playersSleepingPercentage'¶
-
- -
-
-snowdmg = 'freezeDamage'¶
-
- -
-
-spawnradius = 'spawnRadius'¶
-
- -
-
-spectchunkgen = 'spectatorsGenerateChunks'¶
-
- -
-
-traders = 'doTraderSpawning'¶
-
- -
-
-univanger = 'universalAnger'¶
-
- -
-
-weather = 'doWeatherCycle'¶
-
- -
- -
-
-

python_aternos.atconnect module¶

-
-
-class python_aternos.atconnect.AternosConnect¶
-

Bases: object

-

Class for sending API requests bypass Cloudflare -and parsing responses

-
-
-convert_num(num: Union[int, float, str], base: int, frombase: int = 10) str¶
-

Converts an integer to specified base

-
-
Parameters:
-

num – Integer in any base to convert.

-
-
-

If it is a float started with 0,, -zero and comma will be removed to get int -:type num: Union[int,float,str] -:param base: New base -:type base: int -:param frombase: Given number base, defaults to 10 -:type frombase: int, optional -:return: Number converted to a specified base -:rtype: str

-
- -
-
-generate_aternos_rand(randlen: int = 16) str¶
-

Generates a random string using -Aternos algorithm from main.js file

-
-
Parameters:
-

randlen (int, optional) – Random string length, defaults to 16

-
-
Returns:
-

Random string for SEC token

-
-
Return type:
-

str

-
-
-
- -
-
-generate_sec() str¶
-

Generates Aternos SEC token which -is also needed for most API requests

-
-
Returns:
-

Random SEC key:value string

-
-
Return type:
-

str

-
-
-
- -
-
-parse_token() str¶
-

Parses Aternos ajax token that -is needed for most requests

-
-
Raises:
-

RuntimeWarning – If the parser

-
-
-

can not find <head> tag in HTML response -:raises CredentialsError: If the parser -is unable to extract ajax token in HTML -:return: Aternos ajax token -:rtype: str

-
- -
-
-request_cloudflare(url: str, method: str, params: Optional[dict] = None, data: Optional[dict] = None, headers: Optional[dict] = None, reqcookies: Optional[dict] = None, sendtoken: bool = False, redirect: bool = True, retry: int = 3) Response¶
-

Sends a request to Aternos API bypass Cloudflare

-
-
Parameters:
-
    -
  • url (str) – Request URL

  • -
  • method (str) – Request method, must be GET or POST

  • -
  • params (Optional[dict], optional) – URL parameters, defaults to None

  • -
  • data – POST request data, if the method is GET,

  • -
-
-
-

this dict will be combined with params, defaults to None -:type data: Optional[dict], optional -:param headers: Custom headers, defaults to None -:type headers: Optional[dict], optional -:param reqcookies: Cookies only for this request, defaults to None -:type reqcookies: Optional[dict], optional -:param sendtoken: If the ajax and SEC token -should be sent, defaults to False -:type sendtoken: bool, optional -:param redirect: If requests lib should follow -Location header in 3xx responses, defaults to True -:type redirect: bool, optional -:param retry: How many times parser must retry -connection to API bypass Cloudflare, defaults to 3 -:type retry: int, optional -:raises CloudflareError: -When the parser has exceeded retries count -:raises NotImplementedError: -When the specified method is not GET or POST -:return: API response -:rtype: requests.Response

-
- -
- -
-
-

python_aternos.aterrors module¶

-
-
-exception python_aternos.aterrors.AternosError¶
-

Bases: Exception

-

Common error class

-
- -
-
-exception python_aternos.aterrors.CloudflareError¶
-

Bases: AternosError

-

Raised when the parser is unable to bypass Cloudflare protection

-
- -
-
-exception python_aternos.aterrors.CredentialsError¶
-

Bases: AternosError

-

Raised when a session cookie is empty which means incorrect credentials

-
- -
-
-exception python_aternos.aterrors.FileError¶
-

Bases: AternosError

-

Raised when trying to execute a disallowed by Aternos file operation

-
- -
-
-exception python_aternos.aterrors.ServerError¶
-

Bases: AternosError

-

Common class for server errors

-
- -
-
-exception python_aternos.aterrors.ServerEulaError¶
-

Bases: ServerError

-

Raised when trying to start without confirming Mojang EULA

-
- -
-
-exception python_aternos.aterrors.ServerRunningError¶
-

Bases: ServerError

-

Raised when trying to start already running server

-
- -
-
-exception python_aternos.aterrors.ServerSoftwareError¶
-

Bases: ServerError

-

Raised when Aternos notifies about incorrect software version

-
- -
-
-exception python_aternos.aterrors.ServerStorageError¶
-

Bases: ServerError

-

Raised when Aternos notifies about violation of storage limits (4 GB for now)

-
- -
-
-exception python_aternos.aterrors.TokenError¶
-

Bases: AternosError

-

Raised when the parser is unable to extract Aternos ajax token

-
- -
-
-

python_aternos.atfile module¶

-
-
-class python_aternos.atfile.AternosFile(atserv: AternosServer, path: str, name: str, ftype: FileType = FileType.file, size: Union[int, float] = 0)¶
-

Bases: object

-

File class which contains info about its path, type and size

-
-
Parameters:
-
-
-
-
-
-delete() None¶
-

Deletes the file

-
- -
-
-property full: str¶
-
- -
-
-get_content() bytes¶
-

Requests file content in bytes (downloads it)

-
-
Raises:
-

FileError – If downloading

-
-
-

the file is not allowed by Aternos -:return: File content -:rtype: bytes

-
- -
-
-get_text() str¶
-

Requests editing the file as a text -(try it if downloading is disallowed)

-
-
Returns:
-

File text content

-
-
Return type:
-

str

-
-
-
- -
-
-property is_dir: bool¶
-
- -
-
-property is_file: bool¶
-
- -
-
-property name: str¶
-
- -
-
-property path¶
-
- -
-
-set_content(value: bytes) None¶
-

Modifies the file content

-
-
Parameters:
-

value (bytes) – New content

-
-
-
- -
-
-set_text(value: str) None¶
-

Modifies the file content, -but unlike set_content takes -a string as a new value

-
-
Parameters:
-

value (str) – New content

-
-
-
- -
-
-property size: float¶
-
- -
- -
-
-class python_aternos.atfile.FileType(value)¶
-

Bases: IntEnum

-

File or dierctory

-
-
-directory = 1¶
-
- -
-
-file = 0¶
-
- -
- -
-
-

python_aternos.atfm module¶

-
-
-class python_aternos.atfm.FileManager(atserv: AternosServer)¶
-

Bases: object

-

Aternos file manager class for viewing files structure

-
-
Parameters:
-

atserv (python_aternos.atserver.AternosServer) – python_aternos.atserver.AternosServer instance

-
-
-
-
-convert_size(num: Union[int, float], measure: str) float¶
-

Converts “human†file size to size in bytes

-
-
Parameters:
-
    -
  • num (Union[int,float]) – Size

  • -
  • measure (str) – Units (B, kB, MB, GB)

  • -
-
-
Returns:
-

Size in bytes

-
-
Return type:
-

float

-
-
-
- -
-
-dl_file(path: str) bytes¶
-

Returns the file content in bytes (downloads it)

-
-
Parameters:
-

path (str) – Path to file including its filename

-
-
Returns:
-

File content

-
-
Return type:
-

bytes

-
-
-
- -
-
-dl_world(world: str = 'world') bytes¶
-

Returns the world zip file content -by its name (downloads it)

-
-
Parameters:
-

world (str, optional) – Name of world, defaults to ‘world’

-
-
Returns:
-

Zip file content

-
-
Return type:
-

bytes

-
-
-
- -
-
-get_file(path: str) Optional[AternosFile]¶
-

Returns python_aternos.atfile.AternosFile -instance by its path

-
-
Parameters:
-

path (str) – Path to file including its filename

-
-
Returns:
-

_description_

-
-
Return type:
-

Optional[AternosFile]

-
-
-
- -
-
-listdir(path: str = '') List[AternosFile]¶
-

Requests a list of files -in the specified directory

-
-
Parameters:
-

path – Directory

-
-
-

(an empty string means root), defaults to ‘’ -:type path: str, optional -:return: List of python_aternos.atfile.AternosFile -:rtype: List[AternosFile]

-
- -
- -
-
-

python_aternos.atjsparse module¶

-
-
-python_aternos.atjsparse.atob(s: str) str¶
-
- -
-
-python_aternos.atjsparse.exec(f: str) Any¶
-

Executes a JavaScript function

-
-
Parameters:
-

f (str) – ECMA6 function

-
-
Returns:
-

JavaScript interpreter context

-
-
Return type:
-

Any

-
-
-
- -
-
-python_aternos.atjsparse.to_ecma5_function(f: str) str¶
-

Converts a ECMA6 function to ECMA5 format (without arrow expressions)

-
-
Parameters:
-

f (str) – ECMA6 function

-
-
Returns:
-

ECMA5 function

-
-
Return type:
-

str

-
-
-
- -
-
-

python_aternos.atplayers module¶

-
-
-class python_aternos.atplayers.Lists(value)¶
-

Bases: Enum

-

An enumeration.

-
-
-ban = 'banned-players'¶
-
- -
-
-ips = 'banned-ips'¶
-
- -
-
-ops = 'ops'¶
-
- -
-
-whl = 'whitelist'¶
-
- -
- -
-
-class python_aternos.atplayers.PlayersList(lst: Union[str, Lists], atserv: AternosServer)¶
-

Bases: object

-

Class for managing operators, whitelist and banned players lists

-
-
Parameters:
-

lst – Players list type, must be

-
-
-

python_aternos.atplayers.Lists enum value -:type lst: Union[str,Lists] -:param atserv: python_aternos.atserver.AternosServer instance -:type atserv: python_aternos.atserver.AternosServer

-
-
-add(name: str) None¶
-

Appends a player to the list by the nickname

-
-
Parameters:
-

name (str) – Player’s nickname

-
-
-
- -
-
-list_players(cache: bool = True) List[str]¶
-

Parse a players list

-
-
Parameters:
-

cache (bool, optional) – If the function can return cached list (highly recommended), defaults to True

-
-
Returns:
-

List of players nicknames

-
-
Return type:
-

List[str]

-
-
-
- -
-
-remove(name: str) None¶
-

Removes a player from the list by the nickname

-
-
Parameters:
-

name (str) – Player’s nickname

-
-
-
- -
- -
-
-

python_aternos.atserver module¶

-
-
-class python_aternos.atserver.AternosServer(servid: str, atconn: AternosConnect, reqinfo: bool = True)¶
-

Bases: object

-

Class for controlling your Aternos Minecraft server

-
-
Parameters:
-
-
-
-

instance with initialized Aternos session -:type atconn: python_aternos.atconnect.AternosConnect -:param reqinfo: Automatically call AternosServer.fetch() to get all info, defaults to True -:type reqinfo: bool, optional

-
-
-property address: str¶
-
- -
-
-atserver_request(url: str, method: str, params: Optional[dict] = None, data: Optional[dict] = None, headers: Optional[dict] = None, sendtoken: bool = False) Response¶
-

Sends a request to Aternos API -with server IDenitfier parameter

-
-
Parameters:
-
    -
  • url (str) – Request URL

  • -
  • method (str) – Request method, must be GET or POST

  • -
  • params (Optional[dict], optional) – URL parameters, defaults to None

  • -
  • data – POST request data, if the method is GET,

  • -
-
-
-

this dict will be combined with params, defaults to None -:type data: Optional[dict], optional -:param headers: Custom headers, defaults to None -:type headers: Optional[dict], optional -:param sendtoken: If the ajax and SEC token -should be sent, defaults to False -:type sendtoken: bool, optional -:return: API response -:rtype: requests.Response

-
- -
-
-cancel() None¶
-

Cancels server launching

-
- -
-
-config() AternosConfig¶
-

Returns python_aternos.atconf.AternosConfig -instance for editing server settings

-
-
Returns:
-

python_aternos.atconf.AternosConfig object

-
-
Return type:
-

python_aternos.atconf.AternosConfig

-
-
-
- -
-
-confirm() None¶
-

Confirms server launching

-
- -
-
-property domain: str¶
-
- -
-
-property edition: int¶
-
- -
-
-eula() None¶
-

Accepts the Mojang EULA

-
- -
-
-fetch() None¶
-

Send a request to Aternos API to get all server info

-
- -
-
-files() FileManager¶
-

Returns python_aternos.atfm.FileManager -instance for file operations

-
-
Returns:
-

python_aternos.atfm.FileManager object

-
-
Return type:
-

python_aternos.atfm.FileManager

-
-
-
- -
-
-property motd: str¶
-
- -
-
-players(lst: Lists) PlayersList¶
-

Returns python_aternos.atplayers.PlayersList -instance for managing operators, whitelist and banned players lists

-
-
Parameters:
-

lst – Players list type, must be

-
-
-

the python_aternos.atplayers.Lists enum value -:type lst: python_aternos.atplayers.Lists -:return: python_aternos.atplayers.PlayersList -:rtype: python_aternos.atplayers.PlayersList

-
- -
-
-property players_count: int¶
-
- -
-
-property players_list: List[str]¶
-
- -
-
-property port: int¶
-
- -
-
-property ram: int¶
-
- -
-
-restart() None¶
-

Restarts the server

-
- -
-
-property slots: int¶
-
- -
-
-property software: str¶
-
- -
-
-start(headstart: bool = False, accepteula: bool = True) None¶
-

Starts a server

-
-
Parameters:
-
    -
  • headstart (bool, optional) – Start a server in the headstart mode which allows you to skip all queue, defaults to False

  • -
  • accepteula (bool, optional) – Automatically accept the Mojang EULA, defaults to True

  • -
-
-
Raises:
-

ServerEulaError – When trying to start a server

-
-
-

without accepting the Mojang EULA -:raises ServerRunningError: When trying to start a server -which is alreday running -:raises ServerSoftwareError: When Aternos notifies about -incorrect software version -:raises ServerStorageError: When Aternos notifies about -voilation of storage limits (4 GB for now) -:raises ServerError: When API is unable to start a Minecraft server -due to unavailability of Aternos’ file servers or other problems

-
- -
-
-property status: str¶
-
- -
-
-property status_num: int¶
-
- -
-
-stop() None¶
-

Stops the server

-
- -
-
-property subdomain: str¶
-
- -
-
-property version: str¶
-
- -
-
-wss(autoconfirm: bool = False) AternosWss¶
-

Returns python_aternos.atwss.AternosWss instance for listening server streams in real-time

-
-
Parameters:
-

autoconfirm – Automatically start server status listener

-
-
-

when AternosWss connects to API to confirm server launching, defaults to False -:type autoconfirm: bool, optional -:return: python_aternos.atwss.AternosWss object -:rtype: python_aternos.atwss.AternosWss

-
- -
- -
-
-class python_aternos.atserver.Edition(value)¶
-

Bases: IntEnum

-

Server edition type enum

-
-
-bedrock = 1¶
-
- -
-
-java = 0¶
-
- -
- -
-
-class python_aternos.atserver.Status(value)¶
-

Bases: IntEnum

-

Server numeric status enum. -It is highly recommended to use -AternosServer.status instead of -AternosServer.status_num

-
-
-confirm = 10¶
-
- -
-
-error = 7¶
-
- -
-
-off = 0¶
-
- -
-
-on = 1¶
-
- -
-
-shutdown = 3¶
-
- -
-
-starting = 2¶
-
- -
-
-unknown = 6¶
-
- -
- -
-
-

python_aternos.atwss module¶

-
-
-class python_aternos.atwss.AternosWss(atserv: AternosServer, autoconfirm: bool = False)¶
-

Bases: object

-

Class for managing websocket connection

-
-
Parameters:
-
-
-
-

when AternosWss connects to API to confirm server launching, defaults to False -:type autoconfirm: bool, optional

-
-
-async close() None¶
-

Closes websocket connection and stops all listeners

-
- -
-
-async confirm() None¶
-

Simple way to call AternosServer.confirm from this class

-
- -
-
-async connect() None¶
-

Connect to the websocket server and start all stream listeners

-
- -
-
-async keepalive() None¶
-

Each 49 seconds sends keepalive ping to websocket server

-
- -
-
-async receiver() None¶
-

Receives messages from websocket servers -and calls user’s streams listeners

-
- -
-
-async send(obj: Union[Dict[str, Any], str]) None¶
-

Sends a message to websocket server

-
-
Parameters:
-

obj (Union[Dict[str, Any],str]) – Message, may be a string or a dict

-
-
-
- -
-
-wssreceiver(stream: Streams, *args: Any) Callable[[Callable[[Any], Coroutine[Any, Any, None]]], Any]¶
-

Decorator that marks your function as a stream receiver. -When websocket receives message from the specified stream, -it calls all listeners created with this decorator.

-
-
Parameters:
-
    -
  • stream (python_aternos.atwss.Streams) – Stream that your function should listen

  • -
  • args (tuple, optional) – Arguments which will be passed to your function

  • -
-
-
Returns:
-

…

-

-
-
Return type:
-

Callable[[Callable[[Any],Coroutine[Any,Any,None]]],Any]

-
-
-
- -
-
-async wssworker() None¶
-

Starts async tasks in background -for receiving websocket messages -and sending keepalive ping

-
- -
- -
-
-class python_aternos.atwss.Streams(value)¶
-

Bases: Enum

-

WebSocket streams types

-
-
-console = (2, 'console')¶
-
- -
-
-queue = (1, None)¶
-
- -
-
-ram = (3, 'heap')¶
-
- -
-
-status = (0, None)¶
-
- -
-
-tps = (4, 'tick')¶
-
- -
- -
-
-

Module contents¶

-
-
-class python_aternos.AternosConfig(atserv: AternosServer)¶
-

Bases: object

-

Class for editing server settings

-
-
Parameters:
-

atserv (python_aternos.atserver.AternosServer) – python_aternos.atserver.AternosServer object

-
-
-
-
-get_java() int¶
-

Parses Java version from options page

-
-
Returns:
-

Java image version

-
-
Return type:
-

int

-
-
-
- -
-
-get_server_props(proptyping: bool = True) Dict[str, Any]¶
-

Parses all server.properties from options page

-
-
Parameters:
-

proptyping – If the returned dict should contain value

-
-
-

that matches property type (e.g. max-players will be int) -instead of string, defaults to True -:type proptyping: bool, optional -:return: Server.properties dict -:rtype: Dict[str,Any]

-
- -
-
-get_timezone() str¶
-

Parses timezone from options page

-
-
Returns:
-

Area/Location

-
-
Return type:
-

str

-
-
-
- -
-
-get_world_props(world: str = 'world', proptyping: bool = True) Dict[str, Any]¶
-

Parses level.dat from specified world’s options page

-
-
Parameters:
-
    -
  • world (str, optional) – Name of the world, defaults to ‘world’

  • -
  • proptyping – If the returned dict should contain the value

  • -
-
-
-

that matches property type (e.g. randomTickSpeed will be bool) -instead of string, defaults to True -:type proptyping: bool, optional -:return: Level.dat dict -:rtype: Dict[str,Any]

-
- -
-
-set_java(value: int) None¶
-

Sets new Java version

-
-
Parameters:
-

value (int) – New Java image version

-
-
-
- -
-
-set_server_prop(option: str, value: Any) None¶
-

Sets server.properties option

-
-
Parameters:
-
    -
  • option (str) – Option name

  • -
  • value (Any) – New value

  • -
-
-
-
- -
-
-set_server_props(props: Dict[str, Any]) None¶
-

Updates server.properties options with the given dict

-
-
Parameters:
-

props (Dict[str,Any]) – Dict with properties {key:value}

-
-
-
- -
-
-set_timezone(value: str) None¶
-

Sets new timezone

-
-
Parameters:
-

value (str) – New timezone

-
-
Raises:
-

ValueError – If given string

-
-
-

doesn’t match Area/Location format

-
- -
-
-set_world_prop(option: Union[WorldOpts, WorldRules], value: Any, gamerule: bool = False, world: str = 'world') None¶
-

Sets level.dat option for specified world

-
-
Parameters:
-
    -
  • option (Union[WorldOpts,WorldRules]) – Option name

  • -
  • value (Any) – New value

  • -
  • gamerule – If the option

  • -
-
-
-

is a gamerule, defaults to False -:type gamerule: bool, optional -:param world: Name of the world which -level.dat must be edited, defaults to ‘world’ -:type world: str, optional

-
- -
-
-set_world_props(props: Dict[str, Any]) None¶
-
- -
- -
-
-class python_aternos.AternosConnect¶
-

Bases: object

-

Class for sending API requests bypass Cloudflare -and parsing responses

-
-
-convert_num(num: Union[int, float, str], base: int, frombase: int = 10) str¶
-

Converts an integer to specified base

-
-
Parameters:
-

num – Integer in any base to convert.

-
-
-

If it is a float started with 0,, -zero and comma will be removed to get int -:type num: Union[int,float,str] -:param base: New base -:type base: int -:param frombase: Given number base, defaults to 10 -:type frombase: int, optional -:return: Number converted to a specified base -:rtype: str

-
- -
-
-generate_aternos_rand(randlen: int = 16) str¶
-

Generates a random string using -Aternos algorithm from main.js file

-
-
Parameters:
-

randlen (int, optional) – Random string length, defaults to 16

-
-
Returns:
-

Random string for SEC token

-
-
Return type:
-

str

-
-
-
- -
-
-generate_sec() str¶
-

Generates Aternos SEC token which -is also needed for most API requests

-
-
Returns:
-

Random SEC key:value string

-
-
Return type:
-

str

-
-
-
- -
-
-parse_token() str¶
-

Parses Aternos ajax token that -is needed for most requests

-
-
Raises:
-

RuntimeWarning – If the parser

-
-
-

can not find <head> tag in HTML response -:raises CredentialsError: If the parser -is unable to extract ajax token in HTML -:return: Aternos ajax token -:rtype: str

-
- -
-
-request_cloudflare(url: str, method: str, params: Optional[dict] = None, data: Optional[dict] = None, headers: Optional[dict] = None, reqcookies: Optional[dict] = None, sendtoken: bool = False, redirect: bool = True, retry: int = 3) Response¶
-

Sends a request to Aternos API bypass Cloudflare

-
-
Parameters:
-
    -
  • url (str) – Request URL

  • -
  • method (str) – Request method, must be GET or POST

  • -
  • params (Optional[dict], optional) – URL parameters, defaults to None

  • -
  • data – POST request data, if the method is GET,

  • -
-
-
-

this dict will be combined with params, defaults to None -:type data: Optional[dict], optional -:param headers: Custom headers, defaults to None -:type headers: Optional[dict], optional -:param reqcookies: Cookies only for this request, defaults to None -:type reqcookies: Optional[dict], optional -:param sendtoken: If the ajax and SEC token -should be sent, defaults to False -:type sendtoken: bool, optional -:param redirect: If requests lib should follow -Location header in 3xx responses, defaults to True -:type redirect: bool, optional -:param retry: How many times parser must retry -connection to API bypass Cloudflare, defaults to 3 -:type retry: int, optional -:raises CloudflareError: -When the parser has exceeded retries count -:raises NotImplementedError: -When the specified method is not GET or POST -:return: API response -:rtype: requests.Response

-
- -
- -
-
-exception python_aternos.AternosError¶
-

Bases: Exception

-

Common error class

-
- -
-
-class python_aternos.AternosFile(atserv: AternosServer, path: str, name: str, ftype: FileType = FileType.file, size: Union[int, float] = 0)¶
-

Bases: object

-

File class which contains info about its path, type and size

-
-
Parameters:
-
-
-
-
-
-delete() None¶
-

Deletes the file

-
- -
-
-property full: str¶
-
- -
-
-get_content() bytes¶
-

Requests file content in bytes (downloads it)

-
-
Raises:
-

FileError – If downloading

-
-
-

the file is not allowed by Aternos -:return: File content -:rtype: bytes

-
- -
-
-get_text() str¶
-

Requests editing the file as a text -(try it if downloading is disallowed)

-
-
Returns:
-

File text content

-
-
Return type:
-

str

-
-
-
- -
-
-property is_dir: bool¶
-
- -
-
-property is_file: bool¶
-
- -
-
-property name: str¶
-
- -
-
-property path¶
-
- -
-
-set_content(value: bytes) None¶
-

Modifies the file content

-
-
Parameters:
-

value (bytes) – New content

-
-
-
- -
-
-set_text(value: str) None¶
-

Modifies the file content, -but unlike set_content takes -a string as a new value

-
-
Parameters:
-

value (str) – New content

-
-
-
- -
-
-property size: float¶
-
- -
- -
-
-class python_aternos.AternosServer(servid: str, atconn: AternosConnect, reqinfo: bool = True)¶
-

Bases: object

-

Class for controlling your Aternos Minecraft server

-
-
Parameters:
-
-
-
-

instance with initialized Aternos session -:type atconn: python_aternos.atconnect.AternosConnect -:param reqinfo: Automatically call AternosServer.fetch() to get all info, defaults to True -:type reqinfo: bool, optional

-
-
-property address: str¶
-
- -
-
-atserver_request(url: str, method: str, params: Optional[dict] = None, data: Optional[dict] = None, headers: Optional[dict] = None, sendtoken: bool = False) Response¶
-

Sends a request to Aternos API -with server IDenitfier parameter

-
-
Parameters:
-
    -
  • url (str) – Request URL

  • -
  • method (str) – Request method, must be GET or POST

  • -
  • params (Optional[dict], optional) – URL parameters, defaults to None

  • -
  • data – POST request data, if the method is GET,

  • -
-
-
-

this dict will be combined with params, defaults to None -:type data: Optional[dict], optional -:param headers: Custom headers, defaults to None -:type headers: Optional[dict], optional -:param sendtoken: If the ajax and SEC token -should be sent, defaults to False -:type sendtoken: bool, optional -:return: API response -:rtype: requests.Response

-
- -
-
-cancel() None¶
-

Cancels server launching

-
- -
-
-config() AternosConfig¶
-

Returns python_aternos.atconf.AternosConfig -instance for editing server settings

-
-
Returns:
-

python_aternos.atconf.AternosConfig object

-
-
Return type:
-

python_aternos.atconf.AternosConfig

-
-
-
- -
-
-confirm() None¶
-

Confirms server launching

-
- -
-
-property domain: str¶
-
- -
-
-property edition: int¶
-
- -
-
-eula() None¶
-

Accepts the Mojang EULA

-
- -
-
-fetch() None¶
-

Send a request to Aternos API to get all server info

-
- -
-
-files() FileManager¶
-

Returns python_aternos.atfm.FileManager -instance for file operations

-
-
Returns:
-

python_aternos.atfm.FileManager object

-
-
Return type:
-

python_aternos.atfm.FileManager

-
-
-
- -
-
-property motd: str¶
-
- -
-
-players(lst: Lists) PlayersList¶
-

Returns python_aternos.atplayers.PlayersList -instance for managing operators, whitelist and banned players lists

-
-
Parameters:
-

lst – Players list type, must be

-
-
-

the python_aternos.atplayers.Lists enum value -:type lst: python_aternos.atplayers.Lists -:return: python_aternos.atplayers.PlayersList -:rtype: python_aternos.atplayers.PlayersList

-
- -
-
-property players_count: int¶
-
- -
-
-property players_list: List[str]¶
-
- -
-
-property port: int¶
-
- -
-
-property ram: int¶
-
- -
-
-restart() None¶
-

Restarts the server

-
- -
-
-property slots: int¶
-
- -
-
-property software: str¶
-
- -
-
-start(headstart: bool = False, accepteula: bool = True) None¶
-

Starts a server

-
-
Parameters:
-
    -
  • headstart (bool, optional) – Start a server in the headstart mode which allows you to skip all queue, defaults to False

  • -
  • accepteula (bool, optional) – Automatically accept the Mojang EULA, defaults to True

  • -
-
-
Raises:
-

ServerEulaError – When trying to start a server

-
-
-

without accepting the Mojang EULA -:raises ServerRunningError: When trying to start a server -which is alreday running -:raises ServerSoftwareError: When Aternos notifies about -incorrect software version -:raises ServerStorageError: When Aternos notifies about -voilation of storage limits (4 GB for now) -:raises ServerError: When API is unable to start a Minecraft server -due to unavailability of Aternos’ file servers or other problems

-
- -
-
-property status: str¶
-
- -
-
-property status_num: int¶
-
- -
-
-stop() None¶
-

Stops the server

-
- -
-
-property subdomain: str¶
-
- -
-
-property version: str¶
-
- -
-
-wss(autoconfirm: bool = False) AternosWss¶
-

Returns python_aternos.atwss.AternosWss instance for listening server streams in real-time

-
-
Parameters:
-

autoconfirm – Automatically start server status listener

-
-
-

when AternosWss connects to API to confirm server launching, defaults to False -:type autoconfirm: bool, optional -:return: python_aternos.atwss.AternosWss object -:rtype: python_aternos.atwss.AternosWss

-
- -
- -
-
-class python_aternos.AternosWss(atserv: AternosServer, autoconfirm: bool = False)¶
-

Bases: object

-

Class for managing websocket connection

-
-
Parameters:
-
-
-
-

when AternosWss connects to API to confirm server launching, defaults to False -:type autoconfirm: bool, optional

-
-
-async close() None¶
-

Closes websocket connection and stops all listeners

-
- -
-
-async confirm() None¶
-

Simple way to call AternosServer.confirm from this class

-
- -
-
-async connect() None¶
-

Connect to the websocket server and start all stream listeners

-
- -
-
-async keepalive() None¶
-

Each 49 seconds sends keepalive ping to websocket server

-
- -
-
-async receiver() None¶
-

Receives messages from websocket servers -and calls user’s streams listeners

-
- -
-
-async send(obj: Union[Dict[str, Any], str]) None¶
-

Sends a message to websocket server

-
-
Parameters:
-

obj (Union[Dict[str, Any],str]) – Message, may be a string or a dict

-
-
-
- -
-
-wssreceiver(stream: Streams, *args: Any) Callable[[Callable[[Any], Coroutine[Any, Any, None]]], Any]¶
-

Decorator that marks your function as a stream receiver. -When websocket receives message from the specified stream, -it calls all listeners created with this decorator.

-
-
Parameters:
-
    -
  • stream (python_aternos.atwss.Streams) – Stream that your function should listen

  • -
  • args (tuple, optional) – Arguments which will be passed to your function

  • -
-
-
Returns:
-

…

-

-
-
Return type:
-

Callable[[Callable[[Any],Coroutine[Any,Any,None]]],Any]

-
-
-
- -
-
-async wssworker() None¶
-

Starts async tasks in background -for receiving websocket messages -and sending keepalive ping

-
- -
- -
-
-class python_aternos.Client(atconn: AternosConnect)¶
-

Bases: object

-

Aternos API Client class whose object contains user’s auth data

-
-
Parameters:
-

atconn (python_aternos.atconnect.AternosConnect) – python_aternos.atconnect.AternosConnect instance with initialized Aternos session

-
-
-
-
-change_email(value: str) None¶
-

Changes an e-mail in your Aternos account

-
-
Parameters:
-

value (str) – New e-mail

-
-
Raises:
-

ValueError – If an invalid e-mail address is passed to the function

-
-
-
- -
-
-change_password(old: str, new: str) None¶
-

Changes a password in your Aternos account

-
-
Parameters:
-
    -
  • old (str) – Old password

  • -
  • new (str) – New password

  • -
-
-
-
- -
-
-change_username(value: str) None¶
-

Changes a username in your Aternos account

-
-
Parameters:
-

value (str) – New username

-
-
-
- -
-
-classmethod from_credentials(username: str, password: str)¶
-

Log in to Aternos with a username and a plain password

-
-
Parameters:
-
    -
  • username (str) – Your username

  • -
  • password (str) – Your password without any encryption

  • -
-
-
Returns:
-

Client instance

-
-
Return type:
-

python_aternos.Client

-
-
-
- -
-
-classmethod from_hashed(username: str, md5: str)¶
-

Log in to Aternos with a username and a hashed password

-
-
Parameters:
-
    -
  • username (str) – Your username

  • -
  • md5 (str) – Your password hashed with MD5

  • -
-
-
Raises:
-

CredentialsError – If the API doesn’t return a valid session cookie

-
-
Returns:
-

Client instance

-
-
Return type:
-

python_aternos.Client

-
-
-
- -
-
-classmethod from_session(session: str)¶
-

Log in to Aternos using a session cookie value

-
-
Parameters:
-

session (str) – Value of ATERNOS_SESSION cookie

-
-
Returns:
-

Client instance

-
-
Return type:
-

python_aternos.Client

-
-
-
- -
-
-get_server(servid: str) AternosServer¶
-

Creates a server object from the server ID. -Use this instead of list_servers if you know the ID to save some time.

-
-
Returns:
-

python_aternos.atserver.AternosServer object

-
-
Return type:
-

python_aternos.atserver.AternosServer

-
-
-
- -
-
-list_servers() List[AternosServer]¶
-

Parses a list of your servers from Aternos website

-
-
Returns:
-

List of python_aternos.atserver.AternosServer objects

-
-
Return type:
-

list

-
-
-
- -
-
-static md5encode(passwd: str) str¶
-

Encodes the given string with MD5

-
-
Parameters:
-

passwd (str) – String to encode

-
-
Returns:
-

Hexdigest hash of the string in lowercase

-
-
Return type:
-

str

-
-
-
- -
-
-classmethod restore_session(file: str = '~/.aternos')¶
-

Log in to Aternos using a saved ATERNOS_SESSION cookie

-
-
Parameters:
-

file (str, optional) – File where a session cookie was saved, deafults to ~/.aternos

-
-
Returns:
-

Client instance

-
-
Return type:
-

python_aternos.Client

-
-
-
- -
-
-save_session(file: str = '~/.aternos') None¶
-

Saves an ATERNOS_SESSION cookie to a file

-
-
Parameters:
-

file (str, optional) – File where a session cookie must be saved, defaults to ~/.aternos

-
-
-
- -
- -
-
-exception python_aternos.CloudflareError¶
-

Bases: AternosError

-

Raised when the parser is unable to bypass Cloudflare protection

-
- -
-
-exception python_aternos.CredentialsError¶
-

Bases: AternosError

-

Raised when a session cookie is empty which means incorrect credentials

-
- -
-
-class python_aternos.Difficulty(value)¶
-

Bases: IntEnum

-

/difficulty numeric list

-
-
-easy = 1¶
-
- -
-
-hard = 3¶
-
- -
-
-normal = 2¶
-
- -
-
-peaceful = 0¶
-
- -
- -
-
-class python_aternos.Edition(value)¶
-

Bases: IntEnum

-

Server edition type enum

-
-
-bedrock = 1¶
-
- -
-
-java = 0¶
-
- -
- -
-
-exception python_aternos.FileError¶
-

Bases: AternosError

-

Raised when trying to execute a disallowed by Aternos file operation

-
- -
-
-class python_aternos.FileManager(atserv: AternosServer)¶
-

Bases: object

-

Aternos file manager class for viewing files structure

-
-
Parameters:
-

atserv (python_aternos.atserver.AternosServer) – python_aternos.atserver.AternosServer instance

-
-
-
-
-convert_size(num: Union[int, float], measure: str) float¶
-

Converts “human†file size to size in bytes

-
-
Parameters:
-
    -
  • num (Union[int,float]) – Size

  • -
  • measure (str) – Units (B, kB, MB, GB)

  • -
-
-
Returns:
-

Size in bytes

-
-
Return type:
-

float

-
-
-
- -
-
-dl_file(path: str) bytes¶
-

Returns the file content in bytes (downloads it)

-
-
Parameters:
-

path (str) – Path to file including its filename

-
-
Returns:
-

File content

-
-
Return type:
-

bytes

-
-
-
- -
-
-dl_world(world: str = 'world') bytes¶
-

Returns the world zip file content -by its name (downloads it)

-
-
Parameters:
-

world (str, optional) – Name of world, defaults to ‘world’

-
-
Returns:
-

Zip file content

-
-
Return type:
-

bytes

-
-
-
- -
-
-get_file(path: str) Optional[AternosFile]¶
-

Returns python_aternos.atfile.AternosFile -instance by its path

-
-
Parameters:
-

path (str) – Path to file including its filename

-
-
Returns:
-

_description_

-
-
Return type:
-

Optional[AternosFile]

-
-
-
- -
-
-listdir(path: str = '') List[AternosFile]¶
-

Requests a list of files -in the specified directory

-
-
Parameters:
-

path – Directory

-
-
-

(an empty string means root), defaults to ‘’ -:type path: str, optional -:return: List of python_aternos.atfile.AternosFile -:rtype: List[AternosFile]

-
- -
- -
-
-class python_aternos.FileType(value)¶
-

Bases: IntEnum

-

File or dierctory

-
-
-directory = 1¶
-
- -
-
-file = 0¶
-
- -
- -
-
-class python_aternos.Gamemode(value)¶
-

Bases: IntEnum

-

/gamemode numeric list

-
-
-adventure = 2¶
-
- -
-
-creative = 1¶
-
- -
-
-spectator = 3¶
-
- -
-
-survival = 0¶
-
- -
- -
-
-class python_aternos.Lists(value)¶
-

Bases: Enum

-

An enumeration.

-
-
-ban = 'banned-players'¶
-
- -
-
-ips = 'banned-ips'¶
-
- -
-
-ops = 'ops'¶
-
- -
-
-whl = 'whitelist'¶
-
- -
- -
-
-class python_aternos.PlayersList(lst: Union[str, Lists], atserv: AternosServer)¶
-

Bases: object

-

Class for managing operators, whitelist and banned players lists

-
-
Parameters:
-

lst – Players list type, must be

-
-
-

python_aternos.atplayers.Lists enum value -:type lst: Union[str,Lists] -:param atserv: python_aternos.atserver.AternosServer instance -:type atserv: python_aternos.atserver.AternosServer

-
-
-add(name: str) None¶
-

Appends a player to the list by the nickname

-
-
Parameters:
-

name (str) – Player’s nickname

-
-
-
- -
-
-list_players(cache: bool = True) List[str]¶
-

Parse a players list

-
-
Parameters:
-

cache (bool, optional) – If the function can return cached list (highly recommended), defaults to True

-
-
Returns:
-

List of players nicknames

-
-
Return type:
-

List[str]

-
-
-
- -
-
-remove(name: str) None¶
-

Removes a player from the list by the nickname

-
-
Parameters:
-

name (str) – Player’s nickname

-
-
-
- -
- -
-
-exception python_aternos.ServerError¶
-

Bases: AternosError

-

Common class for server errors

-
- -
-
-exception python_aternos.ServerEulaError¶
-

Bases: ServerError

-

Raised when trying to start without confirming Mojang EULA

-
- -
-
-class python_aternos.ServerOpts(value)¶
-

Bases: Enum

-

server.options file

-
-
-animals = 'spawn-animals'¶
-
- -
-
-cmdblock = 'enable-command-block'¶
-
- -
-
-cmds = 'allow-cheats'¶
-
- -
-
-difficulty = 'difficulty'¶
-
- -
-
-flight = 'allow-flight'¶
-
- -
-
-forcegm = 'force-gamemode'¶
-
- -
-
-gm = 'gamemode'¶
-
- -
-
-monsters = 'spawn-monsters'¶
-
- -
-
-nether = 'allow-nether'¶
-
- -
-
-online = 'online-mode'¶
-
- -
-
-pack = 'resource-pack'¶
-
- -
-
-packreq = 'require-resource-pack'¶
-
- -
-
-players = 'max-players'¶
-
- -
-
-pvp = 'pvp'¶
-
- -
-
-spawnlock = 'spawn-protection'¶
-
- -
-
-villagers = 'spawn-npcs'¶
-
- -
-
-whl = 'white-list'¶
-
- -
- -
-
-exception python_aternos.ServerRunningError¶
-

Bases: ServerError

-

Raised when trying to start already running server

-
- -
-
-exception python_aternos.ServerSoftwareError¶
-

Bases: ServerError

-

Raised when Aternos notifies about incorrect software version

-
- -
-
-exception python_aternos.ServerStorageError¶
-

Bases: ServerError

-

Raised when Aternos notifies about violation of storage limits (4 GB for now)

-
- -
-
-class python_aternos.Status(value)¶
-

Bases: IntEnum

-

Server numeric status enum. -It is highly recommended to use -AternosServer.status instead of -AternosServer.status_num

-
-
-confirm = 10¶
-
- -
-
-error = 7¶
-
- -
-
-off = 0¶
-
- -
-
-on = 1¶
-
- -
-
-shutdown = 3¶
-
- -
-
-starting = 2¶
-
- -
-
-unknown = 6¶
-
- -
- -
-
-class python_aternos.Streams(value)¶
-

Bases: Enum

-

WebSocket streams types

-
-
-console = (2, 'console')¶
-
- -
-
-queue = (1, None)¶
-
- -
-
-ram = (3, 'heap')¶
-
- -
-
-status = (0, None)¶
-
- -
-
-tps = (4, 'tick')¶
-
- -
- -
-
-exception python_aternos.TokenError¶
-

Bases: AternosError

-

Raised when the parser is unable to extract Aternos ajax token

-
- -
-
-class python_aternos.WorldOpts(value)¶
-

Bases: Enum

-

level.dat file

-
-
-difficulty = 'Difficulty'¶
-
- -
-
-hardcore = 'hardcore'¶
-
- -
-
-seed = 'seed'¶
-
- -
-
-seed12 = 'randomseed'¶
-
- -
- -
-
-class python_aternos.WorldRules(value)¶
-

Bases: Enum

-

/gamerule list

-
-
-admincmdlog = 'logAdminCommands'¶
-
- -
-
-advs = 'announceAdvancements'¶
-
- -
-
-blockdrop = 'doTileDrops'¶
-
- -
-
-cmdfb = 'sendCommandFeedback'¶
-
- -
-
-cmdlen = 'maxCommandChainLength'¶
-
- -
-
-cmdout = 'commandBlockOutput'¶
-
- -
-
-daynight = 'doDaylightCycle'¶
-
- -
-
-deathmsg = 'showDeathMessages'¶
-
- -
-
-drowndmg = 'drowningDamage'¶
-
- -
-
-elytra = 'disableElytraMovementCheck'¶
-
- -
-
-entcram = 'maxEntityCramming'¶
-
- -
-
-entdrop = 'doEntityDrops'¶
-
- -
-
-falldmg = 'fallDamage'¶
-
- -
-
-fire = 'doFireTick'¶
-
- -
-
-firedmg = 'fireDamage'¶
-
- -
-
-forgive = 'forgiveDeadPlayers'¶
-
- -
-
-immrespawn = 'doImmediateRespawn'¶
-
- -
-
-keepinv = 'keepInventory'¶
-
- -
-
-limitcraft = 'doLimitedCrafting'¶
-
- -
-
-mobgrief = 'mobGriefing'¶
-
- -
-
-mobloot = 'doMobLoot'¶
-
- -
-
-mobs = 'doMobSpawning'¶
-
- -
-
-patrols = 'doPatrolSpawning'¶
-
- -
-
-phantoms = 'doInsomnia'¶
-
- -
-
-raids = 'disableRaids'¶
-
- -
-
-reducedf3 = 'reducedDebugInfo'¶
-
- -
-
-regen = 'naturalRegeneration'¶
-
- -
-
-rndtick = 'randomTickSpeed'¶
-
- -
-
-sleeppct = 'playersSleepingPercentage'¶
-
- -
-
-snowdmg = 'freezeDamage'¶
-
- -
-
-spawnradius = 'spawnRadius'¶
-
- -
-
-spectchunkgen = 'spectatorsGenerateChunks'¶
-
- -
-
-traders = 'doTraderSpawning'¶
-
- -
-
-univanger = 'universalAnger'¶
-
- -
-
-weather = 'doWeatherCycle'¶
-
- -
- -
-
-python_aternos.atob(s: str) str¶
-
- -
-
-python_aternos.exec(f: str) Any¶
-

Executes a JavaScript function

-
-
Parameters:
-

f (str) – ECMA6 function

-
-
Returns:
-

JavaScript interpreter context

-
-
Return type:
-

Any

-
-
-
- -
-
-python_aternos.to_ecma5_function(f: str) str¶
-

Converts a ECMA6 function to ECMA5 format (without arrow expressions)

-
-
Parameters:
-

f (str) – ECMA6 function

-
-
Returns:
-

ECMA5 function

-
-
Return type:
-

str

-
-
-
- -
-
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/docs/build/search.html b/docs/build/search.html deleted file mode 100644 index acdfecf..0000000 --- a/docs/build/search.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - Search — python-aternos 1.0.6 documentation - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -

Search

- - - - -

- Searching for multiple words only shows matches that contain - all words. -

- - -
- - - -
- - - -
- -
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/docs/build/searchindex.js b/docs/build/searchindex.js deleted file mode 100644 index 101f966..0000000 --- a/docs/build/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({"docnames": ["index", "modules", "python_aternos", "setup"], "filenames": ["index.rst", "modules.rst", "python_aternos.rst", "setup.rst"], "titles": ["Welcome to python-aternos\u2019s documentation!", "python-aternos", "python_aternos package", "setup module"], "terms": {"index": 0, "modul": [0, 1], "search": 0, "page": [0, 2], "python_aterno": 1, "packag": 1, "submodul": 1, "atclient": 1, "atconf": 1, "atconnect": 1, "aterror": 1, "atfil": 1, "atfm": 1, "atjspars": 1, "atplay": 1, "atserv": 1, "atwss": 1, "content": 1, "setup": 1, "class": 2, "client": 2, "atconn": 2, "aternosconnect": 2, "base": 2, "object": 2, "aterno": 2, "api": 2, "whose": 2, "contain": 2, "user": 2, "s": 2, "auth": 2, "data": 2, "paramet": 2, "instanc": 2, "initi": 2, "session": 2, "change_email": 2, "valu": 2, "str": 2, "none": 2, "chang": 2, "an": 2, "e": 2, "mail": 2, "your": 2, "account": 2, "new": 2, "rais": 2, "valueerror": 2, "If": 2, "invalid": 2, "address": 2, "pass": 2, "function": 2, "change_password": 2, "old": 2, "password": 2, "change_usernam": 2, "usernam": 2, "classmethod": 2, "from_credenti": 2, "log": 2, "plain": 2, "without": 2, "ani": 2, "encrypt": 2, "return": 2, "type": 2, "from_hash": 2, "md5": 2, "hash": 2, "credentialserror": 2, "doesn": 2, "t": 2, "valid": 2, "cooki": 2, "from_sess": 2, "us": 2, "aternos_sess": 2, "get_serv": 2, "servid": 2, "aternosserv": 2, "creat": 2, "server": 2, "from": 2, "id": 2, "thi": 2, "instead": 2, "list_serv": 2, "you": 2, "know": 2, "save": 2, "some": 2, "time": 2, "list": 2, "pars": 2, "websit": 2, "static": 2, "md5encod": 2, "passwd": 2, "encod": 2, "given": 2, "string": 2, "hexdigest": 2, "lowercas": 2, "restore_sess": 2, "file": 2, "option": 2, "where": 2, "wa": 2, "deafult": 2, "save_sess": 2, "must": 2, "default": 2, "aternosconfig": 2, "edit": 2, "set": 2, "get_java": 2, "int": 2, "java": 2, "version": 2, "imag": 2, "get_server_prop": 2, "proptyp": 2, "bool": 2, "true": 2, "dict": 2, "all": 2, "properti": 2, "should": 2, "match": 2, "g": 2, "max": 2, "player": 2, "rtype": 2, "get_timezon": 2, "timezon": 2, "area": 2, "locat": 2, "get_world_prop": 2, "world": 2, "level": 2, "dat": 2, "specifi": 2, "name": 2, "randomtickspe": 2, "set_java": 2, "set_server_prop": 2, "prop": 2, "updat": 2, "kei": 2, "set_timezon": 2, "format": 2, "set_world_prop": 2, "union": 2, "worldopt": 2, "worldrul": 2, "gamerul": 2, "fals": 2, "param": 2, "which": 2, "difficulti": 2, "intenum": 2, "numer": 2, "easi": 2, "1": 2, "hard": 2, "3": 2, "normal": 2, "2": 2, "peac": 2, "0": 2, "gamemod": 2, "adventur": 2, "creativ": 2, "spectat": 2, "surviv": 2, "serveropt": 2, "enum": 2, "anim": 2, "spawn": 2, "cmdblock": 2, "enabl": 2, "command": 2, "block": 2, "cmd": 2, "allow": 2, "cheat": 2, "flight": 2, "forcegm": 2, "forc": 2, "gm": 2, "monster": 2, "nether": 2, "onlin": 2, "mode": 2, "pack": 2, "resourc": 2, "packreq": 2, "requir": 2, "pvp": 2, "spawnlock": 2, "protect": 2, "villag": 2, "npc": 2, "whl": 2, "white": 2, "hardcor": 2, "seed": 2, "seed12": 2, "randomse": 2, "admincmdlog": 2, "logadmincommand": 2, "adv": 2, "announceadvanc": 2, "blockdrop": 2, "dotiledrop": 2, "cmdfb": 2, "sendcommandfeedback": 2, "cmdlen": 2, "maxcommandchainlength": 2, "cmdout": 2, "commandblockoutput": 2, "daynight": 2, "dodaylightcycl": 2, "deathmsg": 2, "showdeathmessag": 2, "drowndmg": 2, "drowningdamag": 2, "elytra": 2, "disableelytramovementcheck": 2, "entcram": 2, "maxentitycram": 2, "entdrop": 2, "doentitydrop": 2, "falldmg": 2, "falldamag": 2, "fire": 2, "dofiretick": 2, "firedmg": 2, "firedamag": 2, "forgiv": 2, "forgivedeadplay": 2, "immrespawn": 2, "doimmediaterespawn": 2, "keepinv": 2, "keepinventori": 2, "limitcraft": 2, "dolimitedcraft": 2, "mobgrief": 2, "mobloot": 2, "domobloot": 2, "mob": 2, "domobspawn": 2, "patrol": 2, "dopatrolspawn": 2, "phantom": 2, "doinsomnia": 2, "raid": 2, "disableraid": 2, "reducedf3": 2, "reduceddebuginfo": 2, "regen": 2, "naturalregener": 2, "rndtick": 2, "sleeppct": 2, "playerssleepingpercentag": 2, "snowdmg": 2, "freezedamag": 2, "spawnradiu": 2, "spectchunkgen": 2, "spectatorsgeneratechunk": 2, "trader": 2, "dotraderspawn": 2, "univang": 2, "universalang": 2, "weather": 2, "doweathercycl": 2, "send": 2, "request": 2, "bypass": 2, "cloudflar": 2, "respons": 2, "convert_num": 2, "num": 2, "float": 2, "frombas": 2, "10": 2, "convert": 2, "integ": 2, "start": 2, "zero": 2, "comma": 2, "remov": 2, "get": 2, "number": 2, "generate_aternos_rand": 2, "randlen": 2, "16": 2, "gener": 2, "random": 2, "algorithm": 2, "main": 2, "js": 2, "length": 2, "sec": 2, "token": 2, "generate_sec": 2, "also": 2, "need": 2, "most": 2, "parse_token": 2, "ajax": 2, "runtimewarn": 2, "parser": 2, "can": 2, "find": 2, "head": 2, "tag": 2, "html": 2, "unabl": 2, "extract": 2, "request_cloudflar": 2, "url": 2, "method": 2, "header": 2, "reqcooki": 2, "sendtoken": 2, "redirect": 2, "retri": 2, "post": 2, "combin": 2, "custom": 2, "onli": 2, "sent": 2, "lib": 2, "follow": 2, "3xx": 2, "how": 2, "mani": 2, "connect": 2, "cloudflareerror": 2, "when": 2, "ha": 2, "exceed": 2, "count": 2, "notimplementederror": 2, "except": 2, "aternoserror": 2, "common": 2, "error": 2, "empti": 2, "mean": 2, "incorrect": 2, "credenti": 2, "fileerror": 2, "try": 2, "execut": 2, "disallow": 2, "oper": 2, "servererror": 2, "servereulaerror": 2, "confirm": 2, "mojang": 2, "eula": 2, "serverrunningerror": 2, "alreadi": 2, "run": 2, "serversoftwareerror": 2, "notifi": 2, "about": 2, "softwar": 2, "serverstorageerror": 2, "violat": 2, "storag": 2, "limit": 2, "4": 2, "gb": 2, "now": 2, "tokenerror": 2, "aternosfil": 2, "path": 2, "ftype": 2, "filetyp": 2, "size": 2, "info": 2, "its": 2, "filenam": 2, "directori": 2, "delet": 2, "full": 2, "get_cont": 2, "byte": 2, "download": 2, "get_text": 2, "text": 2, "is_dir": 2, "is_fil": 2, "set_cont": 2, "modifi": 2, "set_text": 2, "unlik": 2, "take": 2, "dierctori": 2, "filemanag": 2, "manag": 2, "view": 2, "structur": 2, "convert_s": 2, "measur": 2, "human": 2, "unit": 2, "b": 2, "kb": 2, "mb": 2, "dl_file": 2, "includ": 2, "dl_world": 2, "zip": 2, "get_fil": 2, "_description_": 2, "listdir": 2, "root": 2, "atob": 2, "exec": 2, "f": 2, "javascript": 2, "ecma6": 2, "interpret": 2, "context": 2, "to_ecma5_funct": 2, "ecma5": 2, "arrow": 2, "express": 2, "enumer": 2, "ban": 2, "ip": 2, "op": 2, "whitelist": 2, "playerslist": 2, "lst": 2, "add": 2, "append": 2, "nicknam": 2, "list_play": 2, "cach": 2, "highli": 2, "recommend": 2, "reqinfo": 2, "control": 2, "minecraft": 2, "uniqu": 2, "identifi": 2, "automat": 2, "call": 2, "fetch": 2, "atserver_request": 2, "idenitfi": 2, "cancel": 2, "launch": 2, "config": 2, "domain": 2, "accept": 2, "motd": 2, "players_count": 2, "players_list": 2, "port": 2, "ram": 2, "restart": 2, "slot": 2, "headstart": 2, "accepteula": 2, "skip": 2, "queue": 2, "alredai": 2, "voilat": 2, "due": 2, "unavail": 2, "other": 2, "problem": 2, "statu": 2, "status_num": 2, "stop": 2, "subdomain": 2, "wss": 2, "autoconfirm": 2, "aternoswss": 2, "listen": 2, "stream": 2, "real": 2, "bedrock": 2, "It": 2, "7": 2, "off": 2, "shutdown": 2, "unknown": 2, "6": 2, "websocket": 2, "async": 2, "close": 2, "simpl": 2, "wai": 2, "keepal": 2, "each": 2, "49": 2, "second": 2, "ping": 2, "receiv": 2, "messag": 2, "obj": 2, "mai": 2, "wssreceiv": 2, "arg": 2, "callabl": 2, "coroutin": 2, "decor": 2, "mark": 2, "tupl": 2, "argument": 2, "wssworker": 2, "task": 2, "background": 2, "consol": 2, "heap": 2, "tp": 2, "tick": 2}, "objects": {"": [[2, 0, 0, "-", "python_aternos"]], "python_aternos": [[2, 1, 1, "", "AternosConfig"], [2, 1, 1, "", "AternosConnect"], [2, 3, 1, "", "AternosError"], [2, 1, 1, "", "AternosFile"], [2, 1, 1, "", "AternosServer"], [2, 1, 1, "", "AternosWss"], [2, 1, 1, "", "Client"], [2, 3, 1, "", "CloudflareError"], [2, 3, 1, "", "CredentialsError"], [2, 1, 1, "", "Difficulty"], [2, 1, 1, "", "Edition"], [2, 3, 1, "", "FileError"], [2, 1, 1, "", "FileManager"], [2, 1, 1, "", "FileType"], [2, 1, 1, "", "Gamemode"], [2, 1, 1, "", "Lists"], [2, 1, 1, "", "PlayersList"], [2, 3, 1, "", "ServerError"], [2, 3, 1, "", "ServerEulaError"], [2, 1, 1, "", "ServerOpts"], [2, 3, 1, "", "ServerRunningError"], [2, 3, 1, "", "ServerSoftwareError"], [2, 3, 1, "", "ServerStorageError"], [2, 1, 1, "", "Status"], [2, 1, 1, "", "Streams"], [2, 3, 1, "", "TokenError"], [2, 1, 1, "", "WorldOpts"], [2, 1, 1, "", "WorldRules"], [2, 0, 0, "-", "atclient"], [2, 0, 0, "-", "atconf"], [2, 0, 0, "-", "atconnect"], [2, 0, 0, "-", "aterrors"], [2, 0, 0, "-", "atfile"], [2, 0, 0, "-", "atfm"], [2, 0, 0, "-", "atjsparse"], [2, 6, 1, "", "atob"], [2, 0, 0, "-", "atplayers"], [2, 0, 0, "-", "atserver"], [2, 0, 0, "-", "atwss"], [2, 6, 1, "", "exec"], [2, 6, 1, "", "to_ecma5_function"]], "python_aternos.AternosConfig": [[2, 2, 1, "", "get_java"], [2, 2, 1, "", "get_server_props"], [2, 2, 1, "", "get_timezone"], [2, 2, 1, "", "get_world_props"], [2, 2, 1, "", "set_java"], [2, 2, 1, "", "set_server_prop"], [2, 2, 1, "", "set_server_props"], [2, 2, 1, "", "set_timezone"], [2, 2, 1, "", "set_world_prop"], [2, 2, 1, "", "set_world_props"]], "python_aternos.AternosConnect": [[2, 2, 1, "", "convert_num"], [2, 2, 1, "", "generate_aternos_rand"], [2, 2, 1, "", "generate_sec"], [2, 2, 1, "", "parse_token"], [2, 2, 1, "", "request_cloudflare"]], "python_aternos.AternosFile": [[2, 2, 1, "", "delete"], [2, 4, 1, "", "full"], [2, 2, 1, "", "get_content"], [2, 2, 1, "", "get_text"], [2, 4, 1, "", "is_dir"], [2, 4, 1, "", "is_file"], [2, 4, 1, "", "name"], [2, 4, 1, "", "path"], [2, 2, 1, "", "set_content"], [2, 2, 1, "", "set_text"], [2, 4, 1, "", "size"]], "python_aternos.AternosServer": [[2, 4, 1, "", "address"], [2, 2, 1, "", "atserver_request"], [2, 2, 1, "", "cancel"], [2, 2, 1, "", "config"], [2, 2, 1, "", "confirm"], [2, 4, 1, "", "domain"], [2, 4, 1, "", "edition"], [2, 2, 1, "", "eula"], [2, 2, 1, "", "fetch"], [2, 2, 1, "", "files"], [2, 4, 1, "", "motd"], [2, 2, 1, "", "players"], [2, 4, 1, "", "players_count"], [2, 4, 1, "", "players_list"], [2, 4, 1, "", "port"], [2, 4, 1, "", "ram"], [2, 2, 1, "", "restart"], [2, 4, 1, "", "slots"], [2, 4, 1, "", "software"], [2, 2, 1, "", "start"], [2, 4, 1, "", "status"], [2, 4, 1, "", "status_num"], [2, 2, 1, "", "stop"], [2, 4, 1, "", "subdomain"], [2, 4, 1, "", "version"], [2, 2, 1, "", "wss"]], "python_aternos.AternosWss": [[2, 2, 1, "", "close"], [2, 2, 1, "", "confirm"], [2, 2, 1, "", "connect"], [2, 2, 1, "", "keepalive"], [2, 2, 1, "", "receiver"], [2, 2, 1, "", "send"], [2, 2, 1, "", "wssreceiver"], [2, 2, 1, "", "wssworker"]], "python_aternos.Client": [[2, 2, 1, "", "change_email"], [2, 2, 1, "", "change_password"], [2, 2, 1, "", "change_username"], [2, 2, 1, "", "from_credentials"], [2, 2, 1, "", "from_hashed"], [2, 2, 1, "", "from_session"], [2, 2, 1, "", "get_server"], [2, 2, 1, "", "list_servers"], [2, 2, 1, "", "md5encode"], [2, 2, 1, "", "restore_session"], [2, 2, 1, "", "save_session"]], "python_aternos.Difficulty": [[2, 5, 1, "", "easy"], [2, 5, 1, "", "hard"], [2, 5, 1, "", "normal"], [2, 5, 1, "", "peaceful"]], "python_aternos.Edition": [[2, 5, 1, "", "bedrock"], [2, 5, 1, "", "java"]], "python_aternos.FileManager": [[2, 2, 1, "", "convert_size"], [2, 2, 1, "", "dl_file"], [2, 2, 1, "", "dl_world"], [2, 2, 1, "", "get_file"], [2, 2, 1, "", "listdir"]], "python_aternos.FileType": [[2, 5, 1, "", "directory"], [2, 5, 1, "", "file"]], "python_aternos.Gamemode": [[2, 5, 1, "", "adventure"], [2, 5, 1, "", "creative"], [2, 5, 1, "", "spectator"], [2, 5, 1, "", "survival"]], "python_aternos.Lists": [[2, 5, 1, "", "ban"], [2, 5, 1, "", "ips"], [2, 5, 1, "", "ops"], [2, 5, 1, "", "whl"]], "python_aternos.PlayersList": [[2, 2, 1, "", "add"], [2, 2, 1, "", "list_players"], [2, 2, 1, "", "remove"]], "python_aternos.ServerOpts": [[2, 5, 1, "", "animals"], [2, 5, 1, "", "cmdblock"], [2, 5, 1, "", "cmds"], [2, 5, 1, "", "difficulty"], [2, 5, 1, "", "flight"], [2, 5, 1, "", "forcegm"], [2, 5, 1, "", "gm"], [2, 5, 1, "", "monsters"], [2, 5, 1, "", "nether"], [2, 5, 1, "", "online"], [2, 5, 1, "", "pack"], [2, 5, 1, "", "packreq"], [2, 5, 1, "", "players"], [2, 5, 1, "", "pvp"], [2, 5, 1, "", "spawnlock"], [2, 5, 1, "", "villagers"], [2, 5, 1, "", "whl"]], "python_aternos.Status": [[2, 5, 1, "", "confirm"], [2, 5, 1, "", "error"], [2, 5, 1, "", "off"], [2, 5, 1, "", "on"], [2, 5, 1, "", "shutdown"], [2, 5, 1, "", "starting"], [2, 5, 1, "", "unknown"]], "python_aternos.Streams": [[2, 5, 1, "", "console"], [2, 5, 1, "", "queue"], [2, 5, 1, "", "ram"], [2, 5, 1, "", "status"], [2, 5, 1, "", "tps"]], "python_aternos.WorldOpts": [[2, 5, 1, "", "difficulty"], [2, 5, 1, "", "hardcore"], [2, 5, 1, "", "seed"], [2, 5, 1, "", "seed12"]], "python_aternos.WorldRules": [[2, 5, 1, "", "admincmdlog"], [2, 5, 1, "", "advs"], [2, 5, 1, "", "blockdrop"], [2, 5, 1, "", "cmdfb"], [2, 5, 1, "", "cmdlen"], [2, 5, 1, "", "cmdout"], [2, 5, 1, "", "daynight"], [2, 5, 1, "", "deathmsg"], [2, 5, 1, "", "drowndmg"], [2, 5, 1, "", "elytra"], [2, 5, 1, "", "entcram"], [2, 5, 1, "", "entdrop"], [2, 5, 1, "", "falldmg"], [2, 5, 1, "", "fire"], [2, 5, 1, "", "firedmg"], [2, 5, 1, "", "forgive"], [2, 5, 1, "", "immrespawn"], [2, 5, 1, "", "keepinv"], [2, 5, 1, "", "limitcraft"], [2, 5, 1, "", "mobgrief"], [2, 5, 1, "", "mobloot"], [2, 5, 1, "", "mobs"], [2, 5, 1, "", "patrols"], [2, 5, 1, "", "phantoms"], [2, 5, 1, "", "raids"], [2, 5, 1, "", "reducedf3"], [2, 5, 1, "", "regen"], [2, 5, 1, "", "rndtick"], [2, 5, 1, "", "sleeppct"], [2, 5, 1, "", "snowdmg"], [2, 5, 1, "", "spawnradius"], [2, 5, 1, "", "spectchunkgen"], [2, 5, 1, "", "traders"], [2, 5, 1, "", "univanger"], [2, 5, 1, "", "weather"]], "python_aternos.atclient": [[2, 1, 1, "", "Client"]], "python_aternos.atclient.Client": [[2, 2, 1, "", "change_email"], [2, 2, 1, "", "change_password"], [2, 2, 1, "", "change_username"], [2, 2, 1, "", "from_credentials"], [2, 2, 1, "", "from_hashed"], [2, 2, 1, "", "from_session"], [2, 2, 1, "", "get_server"], [2, 2, 1, "", "list_servers"], [2, 2, 1, "", "md5encode"], [2, 2, 1, "", "restore_session"], [2, 2, 1, "", "save_session"]], "python_aternos.atconf": [[2, 1, 1, "", "AternosConfig"], [2, 1, 1, "", "Difficulty"], [2, 1, 1, "", "Gamemode"], [2, 1, 1, "", "ServerOpts"], [2, 1, 1, "", "WorldOpts"], [2, 1, 1, "", "WorldRules"]], "python_aternos.atconf.AternosConfig": [[2, 2, 1, "", "get_java"], [2, 2, 1, "", "get_server_props"], [2, 2, 1, "", "get_timezone"], [2, 2, 1, "", "get_world_props"], [2, 2, 1, "", "set_java"], [2, 2, 1, "", "set_server_prop"], [2, 2, 1, "", "set_server_props"], [2, 2, 1, "", "set_timezone"], [2, 2, 1, "", "set_world_prop"], [2, 2, 1, "", "set_world_props"]], "python_aternos.atconf.Difficulty": [[2, 5, 1, "", "easy"], [2, 5, 1, "", "hard"], [2, 5, 1, "", "normal"], [2, 5, 1, "", "peaceful"]], "python_aternos.atconf.Gamemode": [[2, 5, 1, "", "adventure"], [2, 5, 1, "", "creative"], [2, 5, 1, "", "spectator"], [2, 5, 1, "", "survival"]], "python_aternos.atconf.ServerOpts": [[2, 5, 1, "", "animals"], [2, 5, 1, "", "cmdblock"], [2, 5, 1, "", "cmds"], [2, 5, 1, "", "difficulty"], [2, 5, 1, "", "flight"], [2, 5, 1, "", "forcegm"], [2, 5, 1, "", "gm"], [2, 5, 1, "", "monsters"], [2, 5, 1, "", "nether"], [2, 5, 1, "", "online"], [2, 5, 1, "", "pack"], [2, 5, 1, "", "packreq"], [2, 5, 1, "", "players"], [2, 5, 1, "", "pvp"], [2, 5, 1, "", "spawnlock"], [2, 5, 1, "", "villagers"], [2, 5, 1, "", "whl"]], "python_aternos.atconf.WorldOpts": [[2, 5, 1, "", "difficulty"], [2, 5, 1, "", "hardcore"], [2, 5, 1, "", "seed"], [2, 5, 1, "", "seed12"]], "python_aternos.atconf.WorldRules": [[2, 5, 1, "", "admincmdlog"], [2, 5, 1, "", "advs"], [2, 5, 1, "", "blockdrop"], [2, 5, 1, "", "cmdfb"], [2, 5, 1, "", "cmdlen"], [2, 5, 1, "", "cmdout"], [2, 5, 1, "", "daynight"], [2, 5, 1, "", "deathmsg"], [2, 5, 1, "", "drowndmg"], [2, 5, 1, "", "elytra"], [2, 5, 1, "", "entcram"], [2, 5, 1, "", "entdrop"], [2, 5, 1, "", "falldmg"], [2, 5, 1, "", "fire"], [2, 5, 1, "", "firedmg"], [2, 5, 1, "", "forgive"], [2, 5, 1, "", "immrespawn"], [2, 5, 1, "", "keepinv"], [2, 5, 1, "", "limitcraft"], [2, 5, 1, "", "mobgrief"], [2, 5, 1, "", "mobloot"], [2, 5, 1, "", "mobs"], [2, 5, 1, "", "patrols"], [2, 5, 1, "", "phantoms"], [2, 5, 1, "", "raids"], [2, 5, 1, "", "reducedf3"], [2, 5, 1, "", "regen"], [2, 5, 1, "", "rndtick"], [2, 5, 1, "", "sleeppct"], [2, 5, 1, "", "snowdmg"], [2, 5, 1, "", "spawnradius"], [2, 5, 1, "", "spectchunkgen"], [2, 5, 1, "", "traders"], [2, 5, 1, "", "univanger"], [2, 5, 1, "", "weather"]], "python_aternos.atconnect": [[2, 1, 1, "", "AternosConnect"]], "python_aternos.atconnect.AternosConnect": [[2, 2, 1, "", "convert_num"], [2, 2, 1, "", "generate_aternos_rand"], [2, 2, 1, "", "generate_sec"], [2, 2, 1, "", "parse_token"], [2, 2, 1, "", "request_cloudflare"]], "python_aternos.aterrors": [[2, 3, 1, "", "AternosError"], [2, 3, 1, "", "CloudflareError"], [2, 3, 1, "", "CredentialsError"], [2, 3, 1, "", "FileError"], [2, 3, 1, "", "ServerError"], [2, 3, 1, "", "ServerEulaError"], [2, 3, 1, "", "ServerRunningError"], [2, 3, 1, "", "ServerSoftwareError"], [2, 3, 1, "", "ServerStorageError"], [2, 3, 1, "", "TokenError"]], "python_aternos.atfile": [[2, 1, 1, "", "AternosFile"], [2, 1, 1, "", "FileType"]], "python_aternos.atfile.AternosFile": [[2, 2, 1, "", "delete"], [2, 4, 1, "", "full"], [2, 2, 1, "", "get_content"], [2, 2, 1, "", "get_text"], [2, 4, 1, "", "is_dir"], [2, 4, 1, "", "is_file"], [2, 4, 1, "", "name"], [2, 4, 1, "", "path"], [2, 2, 1, "", "set_content"], [2, 2, 1, "", "set_text"], [2, 4, 1, "", "size"]], "python_aternos.atfile.FileType": [[2, 5, 1, "", "directory"], [2, 5, 1, "", "file"]], "python_aternos.atfm": [[2, 1, 1, "", "FileManager"]], "python_aternos.atfm.FileManager": [[2, 2, 1, "", "convert_size"], [2, 2, 1, "", "dl_file"], [2, 2, 1, "", "dl_world"], [2, 2, 1, "", "get_file"], [2, 2, 1, "", "listdir"]], "python_aternos.atjsparse": [[2, 6, 1, "", "atob"], [2, 6, 1, "", "exec"], [2, 6, 1, "", "to_ecma5_function"]], "python_aternos.atplayers": [[2, 1, 1, "", "Lists"], [2, 1, 1, "", "PlayersList"]], "python_aternos.atplayers.Lists": [[2, 5, 1, "", "ban"], [2, 5, 1, "", "ips"], [2, 5, 1, "", "ops"], [2, 5, 1, "", "whl"]], "python_aternos.atplayers.PlayersList": [[2, 2, 1, "", "add"], [2, 2, 1, "", "list_players"], [2, 2, 1, "", "remove"]], "python_aternos.atserver": [[2, 1, 1, "", "AternosServer"], [2, 1, 1, "", "Edition"], [2, 1, 1, "", "Status"]], "python_aternos.atserver.AternosServer": [[2, 4, 1, "", "address"], [2, 2, 1, "", "atserver_request"], [2, 2, 1, "", "cancel"], [2, 2, 1, "", "config"], [2, 2, 1, "", "confirm"], [2, 4, 1, "", "domain"], [2, 4, 1, "", "edition"], [2, 2, 1, "", "eula"], [2, 2, 1, "", "fetch"], [2, 2, 1, "", "files"], [2, 4, 1, "", "motd"], [2, 2, 1, "", "players"], [2, 4, 1, "", "players_count"], [2, 4, 1, "", "players_list"], [2, 4, 1, "", "port"], [2, 4, 1, "", "ram"], [2, 2, 1, "", "restart"], [2, 4, 1, "", "slots"], [2, 4, 1, "", "software"], [2, 2, 1, "", "start"], [2, 4, 1, "", "status"], [2, 4, 1, "", "status_num"], [2, 2, 1, "", "stop"], [2, 4, 1, "", "subdomain"], [2, 4, 1, "", "version"], [2, 2, 1, "", "wss"]], "python_aternos.atserver.Edition": [[2, 5, 1, "", "bedrock"], [2, 5, 1, "", "java"]], "python_aternos.atserver.Status": [[2, 5, 1, "", "confirm"], [2, 5, 1, "", "error"], [2, 5, 1, "", "off"], [2, 5, 1, "", "on"], [2, 5, 1, "", "shutdown"], [2, 5, 1, "", "starting"], [2, 5, 1, "", "unknown"]], "python_aternos.atwss": [[2, 1, 1, "", "AternosWss"], [2, 1, 1, "", "Streams"]], "python_aternos.atwss.AternosWss": [[2, 2, 1, "", "close"], [2, 2, 1, "", "confirm"], [2, 2, 1, "", "connect"], [2, 2, 1, "", "keepalive"], [2, 2, 1, "", "receiver"], [2, 2, 1, "", "send"], [2, 2, 1, "", "wssreceiver"], [2, 2, 1, "", "wssworker"]], "python_aternos.atwss.Streams": [[2, 5, 1, "", "console"], [2, 5, 1, "", "queue"], [2, 5, 1, "", "ram"], [2, 5, 1, "", "status"], [2, 5, 1, "", "tps"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:exception", "4": "py:property", "5": "py:attribute", "6": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "exception", "Python exception"], "4": ["py", "property", "Python property"], "5": ["py", "attribute", "Python attribute"], "6": ["py", "function", "Python function"]}, "titleterms": {"welcom": 0, "python": [0, 1], "aterno": [0, 1], "s": 0, "document": 0, "indic": 0, "tabl": 0, "python_aterno": 2, "packag": 2, "submodul": 2, "atclient": 2, "modul": [2, 3], "atconf": 2, "atconnect": 2, "aterror": 2, "atfil": 2, "atfm": 2, "atjspars": 2, "atplay": 2, "atserv": 2, "atwss": 2, "content": 2, "setup": 3}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}}) \ No newline at end of file diff --git a/docs/build/setup.html b/docs/build/setup.html deleted file mode 100644 index 3938e57..0000000 --- a/docs/build/setup.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - setup module — python-aternos 1.0.6 documentation - - - - - - - - - - - - - - - - - - -
-
-
- - -
- -
-

setup module¶

-
- - -
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/docs/howto.md b/docs/howto.md new file mode 100644 index 0000000..62db1fc --- /dev/null +++ b/docs/howto.md @@ -0,0 +1 @@ +Very interesting information diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..c7572e5 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,4 @@ +![Python-Aternos Logo](https://i.ibb.co/3RXcXJ1/aternos-400.png) +# Python Aternos +An unofficial Aternos API written in Python. +It uses [aternos](https://aternos.org/)' private API and html parsing. diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 747ffb7..0000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=source -set BUILDDIR=build - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "" goto help - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/reference.md b/docs/reference.md new file mode 100644 index 0000000..e3e878e --- /dev/null +++ b/docs/reference.md @@ -0,0 +1,39 @@ +::: python_aternos.atclient + options: + show_source: false + +::: python_aternos.atserver + options: + show_source: false + +::: python_aternos.atplayers + options: + show_source: false + +::: python_aternos.atconf + options: + show_source: false + +::: python_aternos.atfm + options: + show_source: false + +::: python_aternos.atfile + options: + show_source: false + +::: python_aternos.atwss + options: + show_source: false + +::: python_aternos.atconnect + options: + show_source: false + +::: python_aternos.atjsparse + options: + show_source: false + +::: python_aternos.aterrors + options: + show_source: false diff --git a/docs/source/conf.py b/docs/source/conf.py deleted file mode 100644 index 8d95068..0000000 --- a/docs/source/conf.py +++ /dev/null @@ -1,53 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# 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 -sys.path.insert(0, os.path.abspath('../../../')) - - -# -- Project information ----------------------------------------------------- - -project = 'python-aternos' -copyright = '2022, DarkCat09' -author = 'DarkCat09' - -# The full version, including alpha/beta/rc tags -release = '1.0.6' - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = ['sphinx.ext.autodoc'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = [] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'alabaster' - -# 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'] \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst deleted file mode 100644 index e2a80cc..0000000 --- a/docs/source/index.rst +++ /dev/null @@ -1,20 +0,0 @@ -.. python-aternos documentation master file, created by - sphinx-quickstart on Fri Jun 17 14:02:03 2022. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to python-aternos's documentation! -========================================== - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/source/modules.rst b/docs/source/modules.rst deleted file mode 100644 index 118e4e5..0000000 --- a/docs/source/modules.rst +++ /dev/null @@ -1,8 +0,0 @@ -python-aternos -============== - -.. toctree:: - :maxdepth: 4 - - python_aternos - setup diff --git a/docs/source/python_aternos.rst b/docs/source/python_aternos.rst deleted file mode 100644 index 0881aa9..0000000 --- a/docs/source/python_aternos.rst +++ /dev/null @@ -1,93 +0,0 @@ -python\_aternos package -======================= - -Submodules ----------- - -python\_aternos.atclient module -------------------------------- - -.. automodule:: python_aternos.atclient - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atconf module ------------------------------ - -.. automodule:: python_aternos.atconf - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atconnect module --------------------------------- - -.. automodule:: python_aternos.atconnect - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.aterrors module -------------------------------- - -.. automodule:: python_aternos.aterrors - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atfile module ------------------------------ - -.. automodule:: python_aternos.atfile - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atfm module ---------------------------- - -.. automodule:: python_aternos.atfm - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atjsparse module --------------------------------- - -.. automodule:: python_aternos.atjsparse - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atplayers module --------------------------------- - -.. automodule:: python_aternos.atplayers - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atserver module -------------------------------- - -.. automodule:: python_aternos.atserver - :members: - :undoc-members: - :show-inheritance: - -python\_aternos.atwss module ----------------------------- - -.. automodule:: python_aternos.atwss - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: python_aternos - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/setup.rst b/docs/source/setup.rst deleted file mode 100644 index 552eb49..0000000 --- a/docs/source/setup.rst +++ /dev/null @@ -1,7 +0,0 @@ -setup module -============ - -.. automodule:: setup - :members: - :undoc-members: - :show-inheritance: diff --git a/examples/console_example.py b/examples/console_example.py index 73f0715..2244451 100644 --- a/examples/console_example.py +++ b/examples/console_example.py @@ -16,6 +16,7 @@ if resp: async def console(msg): print('<', msg) + async def main(): s.start() await asyncio.gather( @@ -23,6 +24,7 @@ async def main(): commands() ) + async def commands(): while True: cmd = await aioconsole.ainput('> ') diff --git a/examples/files_example.py b/examples/files_example.py index 121d175..e865901 100644 --- a/examples/files_example.py +++ b/examples/files_example.py @@ -1,5 +1,5 @@ from getpass import getpass -from python_aternos import Client, atserver +from python_aternos import Client user = input('Username: ') pswd = getpass('Password: ') @@ -9,7 +9,7 @@ s = aternos.list_servers()[0] files = s.files() while True: - + cmd = input('> ').strip().lower() if cmd == 'help': @@ -31,7 +31,7 @@ while True: print(path, 'contains:') for file in directory: print('\t' + file.name) - + if cmd == 'world': file = files.get_file('/world') with open('world.zip', 'wb') as f: diff --git a/examples/websocket_args_example.py b/examples/websocket_args_example.py index cdfc5b4..28f1ebb 100644 --- a/examples/websocket_args_example.py +++ b/examples/websocket_args_example.py @@ -15,15 +15,18 @@ aternos = Client.from_credentials(user, pswd) s = aternos.list_servers()[0] socket = s.wss() + @socket.wssreceiver(atwss.Streams.console, 'Server 1') async def console(msg, args): print(args[0], 'received', msg) + async def main(): s.start() await socket.connect() await asyncio.create_task(loop()) + async def loop(): while True: await asyncio.sleep(1) diff --git a/examples/websocket_example.py b/examples/websocket_example.py index eb5714b..b7f44a0 100644 --- a/examples/websocket_example.py +++ b/examples/websocket_example.py @@ -9,15 +9,18 @@ aternos = Client.from_credentials(user, pswd) s = aternos.list_servers()[0] socket = s.wss() + @socket.wssreceiver(atwss.Streams.console) async def console(msg): print('Received:', msg) + async def main(): s.start() await socket.connect() await asyncio.create_task(loop()) + async def loop(): while True: await asyncio.sleep(1) diff --git a/logo/aternos.xcf b/logo/aternos.xcf index 19c59b6ce9a34cb593ce8b53a03fc177b619183e..a46f8a0c22f20db195ed34c0e468fa1dbe9b18de 100644 GIT binary patch delta 7161 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 I9UsL18(MN9Hvj+t delta 4373 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 diff --git a/logo/aternos_400.png b/logo/aternos_400.png index face267225b2b9c28897bcbf4ec50bb293de9234..838e8c56b9b7ac6aac5c8b39da50ce0213c9a143 100644 GIT binary patch literal 22246 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 literal 22336 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

$6@7Bg<9Y{H7ZM#=4D1~JE+%t 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 diff --git a/logo/aternos_800.png b/logo/aternos_800.png index ab95376e7d4d2da2acd445a32ee0af6174d5610c..df38087175e43be9a2d51c90cb0f67334b3957b0 100644 GIT binary patch delta 67918 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 z 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

QRx*peV!1lv@_)i{ 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 {|5}lg%#z85(S(jgcYWXUE5al0Y9B6 zVp2CYJ9?&J$!wm7u@#Wpr9QOPqF&ml)S&12ZogR6$D+hBNLhL-Hl#EJT`l1wmN(v; zy}X}{k+(snDWsB0|tY^U@#aA249ynVXGh zal7G3XdM*dqsU{zUfS426Z$|e$yqf)x1Y^7LiJ>uln(m)R>StaGL}Yue}7M;kQz0_ z_a+pv`Mk&J3QbA%q?zaC`17SVhP`_wKBJ5gjz@BGNjc8NN90(J1~M2727|$1@J$Fv zoWT|^h!TmMf1?K@&#J4HxdznqhGfzeq}6=;^^mjLr7hHOE$dD(^qLH}-q^iRt3vhr zxfBiQQM^YtDKNd})zy(Dd4FbNd_UL{4Xd^gDr+!aw(e_!m&>`9CIc&{n? sSQ4}{>f5i(G=srlFc=I5gD-^t01;f5N3Cdr%>V!Z07*qoM6N<$f`zbXBme*a delta 68023 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 None: + def __init__(self, atconn: AternosConnect) -> None: - self.atconn = atconn + self.atconn = atconn - @classmethod - def from_hashed(cls, username:str, md5:str): + @classmethod + def from_hashed(cls, username: str, md5: str): - """Log in to Aternos with a username and a hashed password + """Log in to Aternos with a username and a hashed password - :param username: Your username - :type username: str - :param md5: Your password hashed with MD5 - :type md5: str - :raises CredentialsError: If the API doesn't return a valid session cookie - :return: Client instance - :rtype: python_aternos.Client - """ + :param username: Your username + :type username: str + :param md5: Your password hashed with MD5 + :type md5: str + :raises CredentialsError: If the API + doesn't return a valid session cookie + :return: Client instance + :rtype: python_aternos.Client + """ - atconn = AternosConnect() - atconn.parse_token() - atconn.generate_sec() + atconn = AternosConnect() + atconn.parse_token() + atconn.generate_sec() - credentials = { - 'user': username, - 'password': md5 - } + credentials = { + 'user': username, + 'password': md5 + } - loginreq = atconn.request_cloudflare( - f'https://aternos.org/panel/ajax/account/login.php', - 'POST', data=credentials, sendtoken=True - ) + loginreq = atconn.request_cloudflare( + f'https://aternos.org/panel/ajax/account/login.php', + 'POST', data=credentials, sendtoken=True + ) - if 'ATERNOS_SESSION' not in loginreq.cookies: - raise CredentialsError( - 'Check your username and password' - ) + if 'ATERNOS_SESSION' not in loginreq.cookies: + raise CredentialsError( + 'Check your username and password' + ) - return cls(atconn) + return cls(atconn) - @classmethod - def from_credentials(cls, username:str, password:str): + @classmethod + def from_credentials(cls, username: str, password: str): - """Log in to Aternos with a username and a plain password + """Log in to Aternos with a username and a plain password - :param username: Your username - :type username: str - :param password: Your password without any encryption - :type password: str - :return: Client instance - :rtype: python_aternos.Client - """ + :param username: Your username + :type username: str + :param password: Your password without any encryption + :type password: str + :return: Client instance + :rtype: python_aternos.Client + """ - md5 = Client.md5encode(password) - return cls.from_hashed(username, md5) + md5 = Client.md5encode(password) + return cls.from_hashed(username, md5) - @classmethod - def from_session(cls, session:str): + @classmethod + def from_session(cls, session: str): - """Log in to Aternos using a session cookie value + """Log in to Aternos using a session cookie value - :param session: Value of ATERNOS_SESSION cookie - :type session: str - :return: Client instance - :rtype: python_aternos.Client - """ - - atconn = AternosConnect() - atconn.session.cookies['ATERNOS_SESSION'] = session - atconn.parse_token() - atconn.generate_sec() + :param session: Value of ATERNOS_SESSION cookie + :type session: str + :return: Client instance + :rtype: python_aternos.Client + """ - return cls(atconn) - - @classmethod - def restore_session(cls, file:str='~/.aternos'): + atconn = AternosConnect() + atconn.session.cookies['ATERNOS_SESSION'] = session + atconn.parse_token() + atconn.generate_sec() - """Log in to Aternos using a saved ATERNOS_SESSION cookie + return cls(atconn) - :param file: File where a session cookie was saved, deafults to ~/.aternos - :type file: str, optional - :return: Client instance - :rtype: python_aternos.Client - """ + @classmethod + def restore_session(cls, file: str = '~/.aternos'): - file = os.path.expanduser(file) - with open(file, 'rt') as f: - session = f.read().strip() - return cls.from_session(session) - - @staticmethod - def md5encode(passwd:str) -> str: + """Log in to Aternos using a saved ATERNOS_SESSION cookie - """Encodes the given string with MD5 + :param file: File where a session cookie + was saved, deafults to ~/.aternos + :type file: str, optional + :return: Client instance + :rtype: python_aternos.Client + """ - :param passwd: String to encode - :type passwd: str - :return: Hexdigest hash of the string in lowercase - :rtype: str - """ + file = os.path.expanduser(file) + with open(file, 'rt') as f: + session = f.read().strip() + return cls.from_session(session) - encoded = hashlib.md5(passwd.encode('utf-8')) - return encoded.hexdigest().lower() - - def save_session(self, file:str='~/.aternos') -> None: + @staticmethod + def md5encode(passwd: str) -> str: - """Saves an ATERNOS_SESSION cookie to a file + """Encodes the given string with MD5 - :param file: File where a session cookie must be saved, defaults to ~/.aternos - :type file: str, optional - """ + :param passwd: String to encode + :type passwd: str + :return: Hexdigest hash of the string in lowercase + :rtype: str + """ - file = os.path.expanduser(file) - with open(file, 'wt') as f: - f.write(self.atconn.atsession) + encoded = hashlib.md5(passwd.encode('utf-8')) + return encoded.hexdigest().lower() - def list_servers(self) -> List[AternosServer]: + def save_session(self, file: str = '~/.aternos') -> None: - """Parses a list of your servers from Aternos website + """Saves an ATERNOS_SESSION cookie to a file - :return: List of :class:`python_aternos.atserver.AternosServer` objects - :rtype: list - """ + :param file: File where a session cookie + must be saved, defaults to ~/.aternos + :type file: str, optional + """ - serverspage = self.atconn.request_cloudflare( - 'https://aternos.org/servers/', 'GET' - ) - serverstree = lxml.html.fromstring(serverspage.content) - serverslist = serverstree.xpath('//div[contains(@class,"servers ")]/div') + file = os.path.expanduser(file) + with open(file, 'wt') as f: + f.write(self.atconn.atsession) - servers = [] - for server in serverslist: - servid = server.xpath('./div[@class="server-body"]/@data-id')[0] - servers.append(AternosServer(servid, self.atconn)) + def list_servers(self) -> List[AternosServer]: - return servers - - def get_server(self, servid:str) -> AternosServer: + """Parses a list of your servers from Aternos website - """Creates a server object from the server ID. - Use this instead of list_servers if you know the ID to save some time. + :return: List of :class:`python_aternos.atserver.AternosServer` objects + :rtype: list + """ - :return: :class:`python_aternos.atserver.AternosServer` object - :rtype: python_aternos.atserver.AternosServer - """ + serverspage = self.atconn.request_cloudflare( + 'https://aternos.org/servers/', 'GET' + ) + serverstree = lxml.html.fromstring(serverspage.content) + serverslist = serverstree.xpath( + '//div[contains(@class,"servers ")]/div' + ) - return AternosServer(servid, self.atconn) - - def change_username(self, value:str) -> None: + servers = [] + for server in serverslist: + servid = server.xpath('./div[@class="server-body"]/@data-id')[0] + servers.append(AternosServer(servid, self.atconn)) - """Changes a username in your Aternos account + return servers - :param value: New username - :type value: str - """ + def get_server(self, servid: str) -> AternosServer: - self.atconn.request_cloudflare( - 'https://aternos.org/panel/ajax/account/username.php', - 'POST', data={'username': value} - ) - - def change_email(self, value:str) -> None: + """Creates a server object from the server ID. + Use this instead of list_servers if you know the ID to save some time. - """Changes an e-mail in your Aternos account + :return: :class:`python_aternos.atserver.AternosServer` object + :rtype: python_aternos.atserver.AternosServer + """ - :param value: New e-mail - :type value: str - :raises ValueError: If an invalid e-mail address is passed to the function - """ + return AternosServer(servid, self.atconn) - email = re.compile(r'^[A-Za-z0-9\-_+.]+@[A-Za-z0-9\-_+.]+\.[A-Za-z0-9\-]+$|^$') - if not email.match(value): - raise ValueError('Invalid e-mail!') + def change_username(self, value: str) -> None: - self.atconn.request_cloudflare( - 'https://aternos.org/panel/ajax/account/email.php', - 'POST', data={'email': value} - ) - - def change_password(self, old:str, new:str) -> None: + """Changes a username in your Aternos account - """Changes a password in your Aternos account + :param value: New username + :type value: str + """ - :param old: Old password - :type old: str - :param new: New password - :type new: str - """ + self.atconn.request_cloudflare( + 'https://aternos.org/panel/ajax/account/username.php', + 'POST', data={'username': value} + ) - old = Client.md5encode(old) - new = Client.md5encode(new) - self.atconn.request_cloudflare( - 'https://aternos.org/panel/ajax/account/password.php', - 'POST', data={ - 'oldpassword': old, - 'newpassword': new - } - ) + def change_email(self, value: str) -> None: + + """Changes an e-mail in your Aternos account + + :param value: New e-mail + :type value: str + :raises ValueError: If an invalid + e-mail address was passed to the function + """ + + email = re.compile( + r'^[A-Za-z0-9\-_+.]+@[A-Za-z0-9\-_+.]+\.[A-Za-z0-9\-]+$|^$' + ) + if not email.match(value): + raise ValueError('Invalid e-mail!') + + self.atconn.request_cloudflare( + 'https://aternos.org/panel/ajax/account/email.php', + 'POST', data={'email': value} + ) + + def change_password(self, old: str, new: str) -> None: + + """Changes a password in your Aternos account + + :param old: Old password + :type old: str + :param new: New password + :type new: str + """ + + old = Client.md5encode(old) + new = Client.md5encode(new) + self.atconn.request_cloudflare( + 'https://aternos.org/panel/ajax/account/password.php', + 'POST', data={ + 'oldpassword': old, + 'newpassword': new + } + ) diff --git a/python_aternos/atconf.py b/python_aternos/atconf.py index 27a686f..1073f91 100644 --- a/python_aternos/atconf.py +++ b/python_aternos/atconf.py @@ -5,327 +5,346 @@ from typing import Any, Dict, List, Union, Optional from typing import TYPE_CHECKING if TYPE_CHECKING: - from .atserver import AternosServer - -class ServerOpts(enum.Enum): - - """server.options file""" - - players = 'max-players' - gm = 'gamemode' - difficulty = 'difficulty' - whl = 'white-list' - online = 'online-mode' - pvp = 'pvp' - cmdblock = 'enable-command-block' - flight = 'allow-flight' - animals = 'spawn-animals' - monsters = 'spawn-monsters' - villagers = 'spawn-npcs' - nether = 'allow-nether' - forcegm = 'force-gamemode' - spawnlock = 'spawn-protection' - cmds = 'allow-cheats' - packreq = 'require-resource-pack' - pack = 'resource-pack' + from .atserver import AternosServer DAT_PREFIX = 'Data:' DAT_GR_PREFIX = 'Data:GameRules:' + +class ServerOpts(enum.Enum): + + """server.options file""" + + players = 'max-players' + gm = 'gamemode' + difficulty = 'difficulty' + whl = 'white-list' + online = 'online-mode' + pvp = 'pvp' + cmdblock = 'enable-command-block' + flight = 'allow-flight' + animals = 'spawn-animals' + monsters = 'spawn-monsters' + villagers = 'spawn-npcs' + nether = 'allow-nether' + forcegm = 'force-gamemode' + spawnlock = 'spawn-protection' + cmds = 'allow-cheats' + packreq = 'require-resource-pack' + pack = 'resource-pack' + + class WorldOpts(enum.Enum): - """level.dat file""" + """level.dat file""" + + seed12 = 'randomseed' + seed = 'seed' + hardcore = 'hardcore' + difficulty = 'Difficulty' - seed12 = 'randomseed' - seed = 'seed' - hardcore = 'hardcore' - difficulty = 'Difficulty' class WorldRules(enum.Enum): - """/gamerule list""" + """/gamerule list""" + + advs = 'announceAdvancements' + univanger = 'universalAnger' + cmdout = 'commandBlockOutput' + elytra = 'disableElytraMovementCheck' + raids = 'disableRaids' + daynight = 'doDaylightCycle' + entdrop = 'doEntityDrops' + fire = 'doFireTick' + phantoms = 'doInsomnia' + immrespawn = 'doImmediateRespawn' + limitcraft = 'doLimitedCrafting' + mobloot = 'doMobLoot' + mobs = 'doMobSpawning' + patrols = 'doPatrolSpawning' + blockdrop = 'doTileDrops' + traders = 'doTraderSpawning' + weather = 'doWeatherCycle' + drowndmg = 'drowningDamage' + falldmg = 'fallDamage' + firedmg = 'fireDamage' + snowdmg = 'freezeDamage' + forgive = 'forgiveDeadPlayers' + keepinv = 'keepInventory' + deathmsg = 'showDeathMessages' + admincmdlog = 'logAdminCommands' + cmdlen = 'maxCommandChainLength' + entcram = 'maxEntityCramming' + mobgrief = 'mobGriefing' + regen = 'naturalRegeneration' + sleeppct = 'playersSleepingPercentage' + rndtick = 'randomTickSpeed' + spawnradius = 'spawnRadius' + reducedf3 = 'reducedDebugInfo' + spectchunkgen = 'spectatorsGenerateChunks' + cmdfb = 'sendCommandFeedback' - advs = 'announceAdvancements' - univanger = 'universalAnger' - cmdout = 'commandBlockOutput' - elytra = 'disableElytraMovementCheck' - raids = 'disableRaids' - daynight = 'doDaylightCycle' - entdrop = 'doEntityDrops' - fire = 'doFireTick' - phantoms = 'doInsomnia' - immrespawn = 'doImmediateRespawn' - limitcraft = 'doLimitedCrafting' - mobloot = 'doMobLoot' - mobs = 'doMobSpawning' - patrols = 'doPatrolSpawning' - blockdrop = 'doTileDrops' - traders = 'doTraderSpawning' - weather = 'doWeatherCycle' - drowndmg = 'drowningDamage' - falldmg = 'fallDamage' - firedmg = 'fireDamage' - snowdmg = 'freezeDamage' - forgive = 'forgiveDeadPlayers' - keepinv = 'keepInventory' - deathmsg = 'showDeathMessages' - admincmdlog = 'logAdminCommands' - cmdlen = 'maxCommandChainLength' - entcram = 'maxEntityCramming' - mobgrief = 'mobGriefing' - regen = 'naturalRegeneration' - sleeppct = 'playersSleepingPercentage' - rndtick = 'randomTickSpeed' - spawnradius = 'spawnRadius' - reducedf3 = 'reducedDebugInfo' - spectchunkgen = 'spectatorsGenerateChunks' - cmdfb = 'sendCommandFeedback' class Gamemode(enum.IntEnum): - """/gamemode numeric list""" + """/gamemode numeric list""" + + survival = 0 + creative = 1 + adventure = 2 + spectator = 3 - survival = 0 - creative = 1 - adventure = 2 - spectator = 3 class Difficulty(enum.IntEnum): - """/difficulty numeric list""" + """/difficulty numeric list""" + + peaceful = 0 + easy = 1 + normal = 2 + hard = 3 - peaceful = 0 - easy = 1 - normal = 2 - hard = 3 # checking timezone format tzcheck = re.compile(r'(^[A-Z]\w+\/[A-Z]\w+$)|^UTC$') # options types converting convert = { - 'config-option-number': int, - 'config-option-select': int, - 'config-option-toggle': bool + 'config-option-number': int, + 'config-option-select': int, + 'config-option-toggle': bool } + class AternosConfig: - """Class for editing server settings - - :param atserv: :class:`python_aternos.atserver.AternosServer` object - :type atserv: python_aternos.atserver.AternosServer - """ + """Class for editing server settings - def __init__(self, atserv:'AternosServer') -> None: + :param atserv: :class:`python_aternos.atserver.AternosServer` object + :type atserv: python_aternos.atserver.AternosServer + """ - self.atserv = atserv + def __init__(self, atserv: 'AternosServer') -> None: - def get_timezone(self) -> str: + self.atserv = atserv - """Parses timezone from options page + def get_timezone(self) -> str: - :return: Area/Location - :rtype: str - """ + """Parses timezone from options page - optreq = self.atserv.atserver_request( - 'https://aternos.org/options', 'GET' - ) - opttree = lxml.html.fromstring(optreq) + :return: Area/Location + :rtype: str + """ - tzopt = opttree.xpath('//div[@class="options-other-input timezone-switch"]')[0] - tztext = tzopt.xpath('.//div[@class="option current"]')[0].text - return tztext.strip() + optreq = self.atserv.atserver_request( + 'https://aternos.org/options', 'GET' + ) + opttree = lxml.html.fromstring(optreq) - def set_timezone(self, value:str) -> None: + tzopt = opttree.xpath( + '//div[@class="options-other-input timezone-switch"]' + )[0] + tztext = tzopt.xpath('.//div[@class="option current"]')[0].text + return tztext.strip() - """Sets new timezone + def set_timezone(self, value: str) -> None: - :param value: New timezone - :type value: str - :raises ValueError: If given string - doesn't match Area/Location format - """ + """Sets new timezone - matches_tz = tzcheck.search(value) - if not matches_tz: - raise ValueError('Timezone must match zoneinfo format: Area/Location') + :param value: New timezone + :type value: str + :raises ValueError: If given string + doesn't match Area/Location format + """ - self.atserv.atserver_request( - 'https://aternos.org/panel/ajax/timezone.php', - 'POST', data={'timezone': value}, - sendtoken=True - ) + matches_tz = tzcheck.search(value) + if not matches_tz: + raise ValueError( + 'Timezone must match zoneinfo format: Area/Location' + ) - def get_java(self) -> int: + self.atserv.atserver_request( + 'https://aternos.org/panel/ajax/timezone.php', + 'POST', data={'timezone': value}, + sendtoken=True + ) - """Parses Java version from options page + def get_java(self) -> int: - :return: Java image version - :rtype: int - """ + """Parses Java version from options page - optreq = self.atserv.atserver_request( - 'https://aternos.org/options', 'GET' - ) - opttree = lxml.html.fromstring(optreq) - imgopt = opttree.xpath('//div[@class="options-other-input image-switch"]')[0] - imgver = imgopt.xpath('.//div[@class="option current"]/@data-value')[0] + :return: Java image version + :rtype: int + """ - jdkver = str(imgver or '').removeprefix('openjdk:') - return int(jdkver) - - def set_java(self, value:int) -> None: + optreq = self.atserv.atserver_request( + 'https://aternos.org/options', 'GET' + ) + opttree = lxml.html.fromstring(optreq) + imgopt = opttree.xpath( + '//div[@class="options-other-input image-switch"]' + )[0] + imgver = imgopt.xpath( + './/div[@class="option current"]/@data-value' + )[0] - """Sets new Java version + jdkver = str(imgver or '').removeprefix('openjdk:') + return int(jdkver) - :param value: New Java image version - :type value: int - """ + def set_java(self, value: int) -> None: - self.atserv.atserver_request( - 'https://aternos.org/panel/ajax/image.php', - 'POST', data={'image': f'openjdk:{value}'}, - sendtoken=True - ) + """Sets new Java version - # - # server.properties - # - def set_server_prop(self, option:str, value:Any) -> None: + :param value: New Java image version + :type value: int + """ - """Sets server.properties option + self.atserv.atserver_request( + 'https://aternos.org/panel/ajax/image.php', + 'POST', data={'image': f'openjdk:{value}'}, + sendtoken=True + ) - :param option: Option name - :type option: str - :param value: New value - :type value: Any - """ + # + # server.properties + # + def set_server_prop(self, option: str, value: Any) -> None: - self.__set_prop( - '/server.properties', - option, value - ) + """Sets server.properties option - def get_server_props(self, proptyping:bool=True) -> Dict[str,Any]: + :param option: Option name + :type option: str + :param value: New value + :type value: Any + """ - """Parses all server.properties from options page + self.__set_prop( + '/server.properties', + option, value + ) - :param proptyping: If the returned dict should contain value - that matches property type (e.g. max-players will be int) - instead of string, defaults to True - :type proptyping: bool, optional - :return: Server.properties dict - :rtype: Dict[str,Any] - """ + def get_server_props(self, proptyping: bool = True) -> Dict[str, Any]: - return self.__get_all_props('https://aternos.org/options', proptyping) + """Parses all server.properties from options page - def set_server_props(self, props:Dict[str,Any]) -> None: + :param proptyping: If the returned dict should contain value + that matches property type (e.g. max-players will be int) + instead of string, defaults to True + :type proptyping: bool, optional + :return: Server.properties dict + :rtype: Dict[str,Any] + """ - """Updates server.properties options with the given dict + return self.__get_all_props('https://aternos.org/options', proptyping) - :param props: Dict with properties `{key:value}` - :type props: Dict[str,Any] - """ + def set_server_props(self, props: Dict[str, Any]) -> None: - for key in props: - self.set_server_prop(key, props[key]) + """Updates server.properties options with the given dict - # - # level.dat - # - def set_world_prop( - self, option:Union[WorldOpts,WorldRules], - value:Any, gamerule:bool=False, - world:str='world') -> None: + :param props: Dict with properties `{key:value}` + :type props: Dict[str,Any] + """ - """Sets level.dat option for specified world + for key in props: + self.set_server_prop(key, props[key]) - :param option: Option name - :type option: Union[WorldOpts,WorldRules] - :param value: New value - :type value: Any - :param gamerule: If the option - is a gamerule, defaults to False - :type gamerule: bool, optional - :param world: Name of the world which - level.dat must be edited, defaults to 'world' - :type world: str, optional - """ + # + # level.dat + # + def set_world_prop( + self, option: Union[WorldOpts, WorldRules], + value: Any, gamerule: bool = False, + world: str = 'world') -> None: - prefix = DAT_PREFIX - if gamerule: - prefix = DAT_GR_PREFIX + """Sets level.dat option for specified world - self.__set_prop( - f'/{world}/level.dat', - f'{prefix}{option}', - value - ) + :param option: Option name + :type option: Union[WorldOpts,WorldRules] + :param value: New value + :type value: Any + :param gamerule: If the option + is a gamerule, defaults to False + :type gamerule: bool, optional + :param world: Name of the world which + level.dat must be edited, defaults to 'world' + :type world: str, optional + """ - def get_world_props( - self, world:str='world', - proptyping:bool=True) -> Dict[str,Any]: + prefix = DAT_PREFIX + if gamerule: + prefix = DAT_GR_PREFIX - """Parses level.dat from specified world's options page + self.__set_prop( + f'/{world}/level.dat', + f'{prefix}{option}', + value + ) - :param world: Name of the world, defaults to 'world' - :type world: str, optional - :param proptyping: If the returned dict should contain the value - that matches property type (e.g. randomTickSpeed will be bool) - instead of string, defaults to True - :type proptyping: bool, optional - :return: Level.dat dict - :rtype: Dict[str,Any] - """ + def get_world_props( + self, world: str = 'world', + proptyping: bool = True) -> Dict[str, Any]: - self.__get_all_props( - f'https://aternos.org/files/{world}/level.dat', - proptyping, [DAT_PREFIX, DAT_GR_PREFIX] - ) + """Parses level.dat from specified world's options page - def set_world_props(self, props:Dict[str,Any]) -> None: - for key in props: - self.set_world_prop(key, props[key]) + :param world: Name of the world, defaults to 'world' + :type world: str, optional + :param proptyping: If the returned dict should contain the value + that matches property type (e.g. randomTickSpeed will be bool) + instead of string, defaults to True + :type proptyping: bool, optional + :return: Level.dat dict + :rtype: Dict[str,Any] + """ - # - # helpers - # - def __set_prop(self, file:str, option:str, value:Any) -> None: + self.__get_all_props( + f'https://aternos.org/files/{world}/level.dat', + proptyping, [DAT_PREFIX, DAT_GR_PREFIX] + ) - self.atserv.atserver_request( - 'https://aternos.org/panel/ajax/config.php', - 'POST', data={ - 'file': file, - 'option': option, - 'value': value - }, sendtoken=True - ) + def set_world_props(self, props: Dict[str, Any]) -> None: + for key in props: + self.set_world_prop(key, props[key]) - def __get_all_props( - self, url:str, proptyping:bool=True, - prefixes:Optional[List[str]]=None) -> Dict[str,Any]: + # + # helpers + # + def __set_prop(self, file: str, option: str, value: Any) -> None: - optreq = self.atserv.atserver_request(url, 'GET') - opttree = lxml.html.fromstring(optreq.content) - configs = opttree.xpath('//div[@class="config-options"]') + self.atserv.atserver_request( + 'https://aternos.org/panel/ajax/config.php', + 'POST', data={ + 'file': file, + 'option': option, + 'value': value + }, sendtoken=True + ) - for i, conf in enumerate(configs): - opts = conf.xpath('/div[contains(@class,"config-option ")]') - result = {} + def __get_all_props( + self, url: str, proptyping: bool = True, + prefixes: Optional[List[str]] = None) -> Dict[str, Any]: - for opt in opts: - key = opt.xpath('.//span[@class="config-option-output-key"]')[0].text - value = opt.xpath('.//span[@class="config-option-output-value"]')[0].text + optreq = self.atserv.atserver_request(url, 'GET') + opttree = lxml.html.fromstring(optreq.content) + configs = opttree.xpath('//div[@class="config-options"]') - if prefixes != None: - key = f'{prefixes[i]}{key}' + for i, conf in enumerate(configs): + opts = conf.xpath('/div[contains(@class,"config-option ")]') + result = {} - opttype = opt.xpath('/@class').split(' ')[1] - if proptyping and opttype in convert: - value = convert[opttype](value) + for opt in opts: + key = opt.xpath( + './/span[@class="config-option-output-key"]' + )[0].text + value = opt.xpath( + './/span[@class="config-option-output-value"]' + )[0].text - result[key] = value + if prefixes is not None: + key = f'{prefixes[i]}{key}' - return result + opttype = opt.xpath('/@class').split(' ')[1] + if proptyping and opttype in convert: + value = convert[opttype](value) + + result[key] = value + + return result diff --git a/python_aternos/atconnect.py b/python_aternos/atconnect.py index 6eed53c..aad43cd 100644 --- a/python_aternos/atconnect.py +++ b/python_aternos/atconnect.py @@ -10,235 +10,242 @@ from .aterrors import TokenError, CloudflareError REQUA = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36 OPR/85.0.4341.47' + class AternosConnect: - """ - Class for sending API requests bypass Cloudflare - and parsing responses""" + """ + Class for sending API requests bypass Cloudflare + and parsing responses""" - def __init__(self) -> None: + def __init__(self) -> None: - self.session = CloudScraper() - self.atsession = '' + self.session = CloudScraper() + self.atsession = '' - def parse_token(self) -> str: + def parse_token(self) -> str: - """Parses Aternos ajax token that - is needed for most requests + """Parses Aternos ajax token that + is needed for most requests - :raises RuntimeWarning: If the parser - can not find tag in HTML response - :raises CredentialsError: If the parser - is unable to extract ajax token in HTML - :return: Aternos ajax token - :rtype: str - """ + :raises RuntimeWarning: If the parser + can not find tag in HTML response + :raises CredentialsError: If the parser + is unable to extract ajax token in HTML + :return: Aternos ajax token + :rtype: str + """ - loginpage = self.request_cloudflare( - f'https://aternos.org/go/', 'GET' - ).content + loginpage = self.request_cloudflare( + f'https://aternos.org/go/', 'GET' + ).content - # Using the standard string methods - # instead of the expensive xml parsing - head = b'' - headtag = loginpage.find(head) - headend = loginpage.find(b'', headtag + len(head)) + # Using the standard string methods + # instead of the expensive xml parsing + head = b'' + headtag = loginpage.find(head) + headend = loginpage.find(b'', headtag + len(head)) - # Some checks - if headtag < 0 or headend < 0: - pagehead = loginpage - raise RuntimeWarning('Unable to find tag, parsing the whole page') + # Some checks + if headtag < 0 or headend < 0: + pagehead = loginpage + raise RuntimeWarning( + 'Unable to find tag, parsing the whole page' + ) - # Extracting content - headtag = headtag + len(head) - pagehead = loginpage[headtag:headend] + # Extracting content + headtag = headtag + len(head) + pagehead = loginpage[headtag:headend] - try: - text = pagehead.decode('utf-8', 'replace') - js_code = re.findall(r'\(\(\)(.*?)\)\(\);', text) - token_func = js_code[1] if len(js_code) > 1 else js_code[0] + try: + text = pagehead.decode('utf-8', 'replace') + js_code = re.findall(r'\(\(\)(.*?)\)\(\);', text) + token_func = js_code[1] if len(js_code) > 1 else js_code[0] - ctx = atjsparse.exec(token_func) - self.token = ctx.window['AJAX_TOKEN'] + ctx = atjsparse.exec(token_func) + self.token = ctx.window['AJAX_TOKEN'] - except (IndexError, TypeError): - raise TokenError( - 'Unable to parse TOKEN from the page' - ) + except (IndexError, TypeError): + raise TokenError( + 'Unable to parse TOKEN from the page' + ) - return self.token + return self.token - def generate_sec(self) -> str: + def generate_sec(self) -> str: - """Generates Aternos SEC token which - is also needed for most API requests + """Generates Aternos SEC token which + is also needed for most API requests - :return: Random SEC key:value string - :rtype: str - """ + :return: Random SEC key:value string + :rtype: str + """ - randkey = self.generate_aternos_rand() - randval = self.generate_aternos_rand() - self.sec = f'{randkey}:{randval}' - self.session.cookies.set( - f'ATERNOS_SEC_{randkey}', randval, - domain='aternos.org' - ) + randkey = self.generate_aternos_rand() + randval = self.generate_aternos_rand() + self.sec = f'{randkey}:{randval}' + self.session.cookies.set( + f'ATERNOS_SEC_{randkey}', randval, + domain='aternos.org' + ) - return self.sec + return self.sec - def generate_aternos_rand(self, randlen:int=16) -> str: + def generate_aternos_rand(self, randlen: int = 16) -> str: - """Generates a random string using - Aternos algorithm from main.js file + """Generates a random string using + Aternos algorithm from main.js file - :param randlen: Random string length, defaults to 16 - :type randlen: int, optional - :return: Random string for SEC token - :rtype: str - """ + :param randlen: Random string length, defaults to 16 + :type randlen: int, optional + :return: Random string for SEC token + :rtype: str + """ - # a list with randlen+1 empty strings: - # generate a string with spaces, - # then split it by space - rand_arr = (' ' * (randlen+1)).split(' ') + # a list with randlen+1 empty strings: + # generate a string with spaces, + # then split it by space + rand_arr = (' ' * (randlen+1)).split(' ') - rand = random.random() - rand_alphanum = self.convert_num(rand, 36) + ('0' * 17) + rand = random.random() + rand_alphanum = self.convert_num(rand, 36) + ('0' * 17) - return (rand_alphanum[:18].join(rand_arr)[:randlen]) + return (rand_alphanum[:18].join(rand_arr)[:randlen]) - def convert_num( - self, num:Union[int,float,str], - base:int, frombase:int=10) -> str: + def convert_num( + self, num: Union[int, float, str], + base: int, frombase: int = 10) -> str: - """Converts an integer to specified base + """Converts an integer to specified base - :param num: Integer in any base to convert. - If it is a float started with `0,`, - zero and comma will be removed to get int - :type num: Union[int,float,str] - :param base: New base - :type base: int - :param frombase: Given number base, defaults to 10 - :type frombase: int, optional - :return: Number converted to a specified base - :rtype: str - """ + :param num: Integer in any base to convert. + If it is a float started with `0,`, + zero and comma will be removed to get int + :type num: Union[int,float,str] + :param base: New base + :type base: int + :param frombase: Given number base, defaults to 10 + :type frombase: int, optional + :return: Number converted to a specified base + :rtype: str + """ - if isinstance(num, str): - num = int(num, frombase) + if isinstance(num, str): + num = int(num, frombase) - if isinstance(num, float): - sliced = str(num)[2:] - num = int(sliced) + if isinstance(num, float): + sliced = str(num)[2:] + num = int(sliced) - symbols = '0123456789abcdefghijklmnopqrstuvwxyz' - basesym = symbols[:base] - result = '' - while num > 0: - rem = num % base - result = str(basesym[rem]) + result - num //= base - return result + symbols = '0123456789abcdefghijklmnopqrstuvwxyz' + basesym = symbols[:base] + result = '' + while num > 0: + rem = num % base + result = str(basesym[rem]) + result + num //= base + return result - def request_cloudflare( - self, url:str, method:str, - params:Optional[dict]=None, data:Optional[dict]=None, - headers:Optional[dict]=None, reqcookies:Optional[dict]=None, - sendtoken:bool=False, redirect:bool=True, retry:int=3) -> Response: + def request_cloudflare( + self, url: str, method: str, + params: Optional[dict] = None, + data: Optional[dict] = None, + headers: Optional[dict] = None, + reqcookies: Optional[dict] = None, + sendtoken: bool = False, + redirect: bool = True, + retry: int = 3) -> Response: - """Sends a request to Aternos API bypass Cloudflare + """Sends a request to Aternos API bypass Cloudflare - :param url: Request URL - :type url: str - :param method: Request method, must be GET or POST - :type method: str - :param params: URL parameters, defaults to None - :type params: Optional[dict], optional - :param data: POST request data, if the method is GET, - this dict will be combined with params, defaults to None - :type data: Optional[dict], optional - :param headers: Custom headers, defaults to None - :type headers: Optional[dict], optional - :param reqcookies: Cookies only for this request, defaults to None - :type reqcookies: Optional[dict], optional - :param sendtoken: If the ajax and SEC token - should be sent, defaults to False - :type sendtoken: bool, optional - :param redirect: If requests lib should follow - Location header in 3xx responses, defaults to True - :type redirect: bool, optional - :param retry: How many times parser must retry - connection to API bypass Cloudflare, defaults to 3 - :type retry: int, optional - :raises CloudflareError: - When the parser has exceeded retries count - :raises NotImplementedError: - When the specified method is not GET or POST - :return: API response - :rtype: requests.Response - """ + :param url: Request URL + :type url: str + :param method: Request method, must be GET or POST + :type method: str + :param params: URL parameters, defaults to None + :type params: Optional[dict], optional + :param data: POST request data, if the method is GET, + this dict will be combined with params, defaults to None + :type data: Optional[dict], optional + :param headers: Custom headers, defaults to None + :type headers: Optional[dict], optional + :param reqcookies: Cookies only for this request, defaults to None + :type reqcookies: Optional[dict], optional + :param sendtoken: If the ajax and SEC token + should be sent, defaults to False + :type sendtoken: bool, optional + :param redirect: If requests lib should follow + Location header in 3xx responses, defaults to True + :type redirect: bool, optional + :param retry: How many times parser must retry + connection to API bypass Cloudflare, defaults to 3 + :type retry: int, optional + :raises CloudflareError: + When the parser has exceeded retries count + :raises NotImplementedError: + When the specified method is not GET or POST + :return: API response + :rtype: requests.Response + """ - if retry <= 0: - raise CloudflareError('Unable to bypass Cloudflare protection') + if retry <= 0: + raise CloudflareError('Unable to bypass Cloudflare protection') - try: - self.atsession = self.session.cookies['ATERNOS_SESSION'] - except KeyError: - pass + try: + self.atsession = self.session.cookies['ATERNOS_SESSION'] + except KeyError: + pass - method = method or 'GET' - method = method.upper().strip() - if method not in ('GET', 'POST'): - raise NotImplementedError('Only GET and POST are available') + method = method or 'GET' + method = method.upper().strip() + if method not in ('GET', 'POST'): + raise NotImplementedError('Only GET and POST are available') - headers = headers or {} - params = params or {} - data = data or {} - reqcookies = reqcookies or {} + headers = headers or {} + params = params or {} + data = data or {} + reqcookies = reqcookies or {} - if sendtoken: - params['TOKEN'] = self.token - params['SEC'] = self.sec - headers['X-Requested-With'] = 'XMLHttpRequest' + if sendtoken: + params['TOKEN'] = self.token + params['SEC'] = self.sec + headers['X-Requested-With'] = 'XMLHttpRequest' - # requests.cookies.CookieConflictError bugfix - reqcookies['ATERNOS_SESSION'] = self.atsession - del self.session.cookies['ATERNOS_SESSION'] + # requests.cookies.CookieConflictError bugfix + reqcookies['ATERNOS_SESSION'] = self.atsession + del self.session.cookies['ATERNOS_SESSION'] - logging.debug(f'Requesting({method})' + url) - logging.debug('headers=' + str(headers)) - logging.debug('params=' + str(params)) - logging.debug('data=' + str(data)) - logging.debug('req-cookies=' + str(reqcookies)) - logging.debug('session-cookies=' + str(self.session.cookies)) - - if method == 'POST': - req = self.session.post( - url, data=data, params=params, - headers=headers, cookies=reqcookies, - allow_redirects=redirect - ) - else: - req = self.session.get( - url, params={**params, **data}, - headers=headers, cookies=reqcookies, - allow_redirects=redirect - ) - - if 'Please Wait... | Cloudflare' in req.text: - logging.info('Retrying to bypass Cloudflare') - self.request_cloudflare( - url, method, - params, data, - headers, reqcookies, - sendtoken, redirect, - retry - 1 - ) - - logging.info( - f'{method} completed with {req.status_code} status' - ) + logging.debug(f'Requesting({method})' + url) + logging.debug('headers=' + str(headers)) + logging.debug('params=' + str(params)) + logging.debug('data=' + str(data)) + logging.debug('req-cookies=' + str(reqcookies)) + logging.debug('session-cookies=' + str(self.session.cookies)) - return req + if method == 'POST': + req = self.session.post( + url, data=data, params=params, + headers=headers, cookies=reqcookies, + allow_redirects=redirect + ) + else: + req = self.session.get( + url, params={**params, **data}, + headers=headers, cookies=reqcookies, + allow_redirects=redirect + ) + + if 'Please Wait... | Cloudflare' in req.text: + logging.info('Retrying to bypass Cloudflare') + self.request_cloudflare( + url, method, + params, data, + headers, reqcookies, + sendtoken, redirect, + retry - 1 + ) + + logging.info( + f'{method} completed with {req.status_code} status' + ) + + return req diff --git a/python_aternos/aterrors.py b/python_aternos/aterrors.py index 13a9895..f2b88b3 100644 --- a/python_aternos/aterrors.py +++ b/python_aternos/aterrors.py @@ -1,39 +1,56 @@ class AternosError(Exception): - """Common error class""" + """Common error class""" + class CloudflareError(AternosError): - - """Raised when the parser is unable to bypass Cloudflare protection""" + + """Raised when the parser is unable + to bypass Cloudflare protection""" + class CredentialsError(AternosError): - - """Raised when a session cookie is empty which means incorrect credentials""" + + """Raised when a session cookie is empty + which means incorrect credentials""" + class TokenError(AternosError): - - """Raised when the parser is unable to extract Aternos ajax token""" + + """Raised when the parser is unable + to extract Aternos ajax token""" + class ServerError(AternosError): - - """Common class for server errors""" + + """Common class for server errors""" + class ServerEulaError(ServerError): - """Raised when trying to start without confirming Mojang EULA""" + """Raised when trying to start without + confirming Mojang EULA""" + class ServerRunningError(ServerError): - """Raised when trying to start already running server""" + """Raised when trying to start + already running server""" + class ServerSoftwareError(ServerError): - """Raised when Aternos notifies about incorrect software version""" + """Raised when Aternos notifies about + incorrect software version""" + class ServerStorageError(ServerError): - """Raised when Aternos notifies about violation of storage limits (4 GB for now)""" + """Raised when Aternos notifies about + violation of storage limits (4 GB for now)""" + class FileError(AternosError): - - """Raised when trying to execute a disallowed by Aternos file operation""" + + """Raised when trying to execute a disallowed + by Aternos file operation""" diff --git a/python_aternos/atfile.py b/python_aternos/atfile.py index 5091fcf..059a29b 100644 --- a/python_aternos/atfile.py +++ b/python_aternos/atfile.py @@ -6,142 +6,146 @@ from typing import TYPE_CHECKING from .aterrors import FileError if TYPE_CHECKING: - from .atserver import AternosServer + from .atserver import AternosServer + class FileType(enum.IntEnum): - """File or dierctory""" + """File or dierctory""" + + file = 0 + directory = 1 - file = 0 - directory = 1 class AternosFile: - """File class which contains info about its path, type and size - - :param atserv: :class:`python_aternos.atserver.AternosServer` instance - :type atserv: python_aternos.atserver.AternosServer - :param path: Path to the file - :type path: str - :param name: Filename - :type name: str - :param ftype: File or directory - :type ftype: python_aternos.atfile.FileType - :param size: File size, defaults to 0 - :type size: Union[int,float], optional - """ + """File class which contains info about its path, type and size - def __init__( - self, atserv:'AternosServer', - path:str, name:str, ftype:FileType=FileType.file, - size:Union[int,float]=0) -> None: + :param atserv: :class:`python_aternos.atserver.AternosServer` instance + :type atserv: python_aternos.atserver.AternosServer + :param path: Path to the file + :type path: str + :param name: Filename + :type name: str + :param ftype: File or directory + :type ftype: python_aternos.atfile.FileType + :param size: File size, defaults to 0 + :type size: Union[int,float], optional + """ - self.atserv = atserv - self._path = path.lstrip('/') - self._name = name - self._full = path + name - self._ftype = ftype - self._size = float(size) + def __init__( + self, + atserv: 'AternosServer', + path: str, name: str, + ftype: FileType = FileType.file, + size: Union[int, float] = 0) -> None: - def delete(self) -> None: + self.atserv = atserv + self._path = path.lstrip('/') + self._name = name + self._full = path + name + self._ftype = ftype + self._size = float(size) - """Deletes the file""" + def delete(self) -> None: - self.atserv.atserver_request( - 'https://aternos.org/panel/ajax/delete.php', - 'POST', data={'file': self._full}, - sendtoken=True - ) + """Deletes the file""" - def get_content(self) -> bytes: + self.atserv.atserver_request( + 'https://aternos.org/panel/ajax/delete.php', + 'POST', data={'file': self._full}, + sendtoken=True + ) - """Requests file content in bytes (downloads it) + def get_content(self) -> bytes: - :raises FileError: If downloading - the file is not allowed by Aternos - :return: File content - :rtype: bytes - """ + """Requests file content in bytes (downloads it) - file = self.atserv.atserver_request( - 'https://aternos.org/panel/ajax/files/download.php', - 'GET', params={ - 'file': self._full - } - ) - if file.content == b'{"success":false}': - raise FileError('Unable to download the file. Try to get text') - return file.content + :raises FileError: If downloading + the file is not allowed by Aternos + :return: File content + :rtype: bytes + """ - def set_content(self, value:bytes) -> None: + file = self.atserv.atserver_request( + 'https://aternos.org/panel/ajax/files/download.php', + 'GET', params={ + 'file': self._full + } + ) + if file.content == b'{"success":false}': + raise FileError('Unable to download the file. Try to get text') + return file.content - """Modifies the file content + def set_content(self, value: bytes) -> None: - :param value: New content - :type value: bytes - """ + """Modifies the file content - self.atserv.atserver_request( - f'https://aternos.org/panel/ajax/save.php', - 'POST', data={ - 'file': self._full, - 'content': value - }, sendtoken=True - ) + :param value: New content + :type value: bytes + """ - def get_text(self) -> str: + self.atserv.atserver_request( + f'https://aternos.org/panel/ajax/save.php', + 'POST', data={ + 'file': self._full, + 'content': value + }, sendtoken=True + ) - """Requests editing the file as a text - (try it if downloading is disallowed) + def get_text(self) -> str: - :return: File text content - :rtype: str - """ + """Requests editing the file as a text + (try it if downloading is disallowed) - editor = self.atserv.atserver_request( - f'https://aternos.org/files/{self._full.lstrip("/")}', 'GET' - ) - edittree = lxml.html.fromstring(editor.content) - - editblock = edittree.xpath('//div[@id="editor"]')[0] - return editblock.text_content() + :return: File text content + :rtype: str + """ - def set_text(self, value:str) -> None: - - """Modifies the file content, - but unlike set_content takes - a string as a new value + editor = self.atserv.atserver_request( + f'https://aternos.org/files/{self._full.lstrip("/")}', 'GET' + ) + edittree = lxml.html.fromstring(editor.content) - :param value: New content - :type value: str - """ - - self.set_content(value.encode('utf-8')) + editblock = edittree.xpath('//div[@id="editor"]')[0] + return editblock.text_content() - @property - def path(self): - return self._path + def set_text(self, value: str) -> None: - @property - def name(self) -> str: - return self._name - - @property - def full(self) -> str: - return self._full + """Modifies the file content, + but unlike set_content takes + a string as a new value - @property - def is_dir(self) -> bool: - if self._ftype == FileType.directory: - return True - return False + :param value: New content + :type value: str + """ - @property - def is_file(self) -> bool: - if self._ftype == FileType.file: - return True - return False - - @property - def size(self) -> float: - return self._size + self.set_content(value.encode('utf-8')) + + @property + def path(self): + return self._path + + @property + def name(self) -> str: + return self._name + + @property + def full(self) -> str: + return self._full + + @property + def is_dir(self) -> bool: + if self._ftype == FileType.directory: + return True + return False + + @property + def is_file(self) -> bool: + if self._ftype == FileType.file: + return True + return False + + @property + def size(self) -> float: + return self._size diff --git a/python_aternos/atfm.py b/python_aternos/atfm.py index 36b2800..91ad4f8 100644 --- a/python_aternos/atfm.py +++ b/python_aternos/atfm.py @@ -4,150 +4,155 @@ from typing import TYPE_CHECKING from .atfile import AternosFile, FileType if TYPE_CHECKING: - from .atserver import AternosServer + from .atserver import AternosServer + class FileManager: - """Aternos file manager class for viewing files structure - - :param atserv: :class:`python_aternos.atserver.AternosServer` instance - :type atserv: python_aternos.atserver.AternosServer - """ + """Aternos file manager class for viewing files structure - def __init__(self, atserv:'AternosServer') -> None: + :param atserv: :class:`python_aternos.atserver.AternosServer` instance + :type atserv: python_aternos.atserver.AternosServer + """ - self.atserv = atserv + def __init__(self, atserv: 'AternosServer') -> None: - def listdir(self, path:str='') -> List[AternosFile]: + self.atserv = atserv - """Requests a list of files - in the specified directory + def listdir(self, path: str = '') -> List[AternosFile]: - :param path: Directory - (an empty string means root), defaults to '' - :type path: str, optional - :return: List of :class:`python_aternos.atfile.AternosFile` - :rtype: List[AternosFile] - """ + """Requests a list of files + in the specified directory - path = path.lstrip('/') - filesreq = self.atserv.atserver_request( - f'https://aternos.org/files/{path}', 'GET' - ) - filestree = lxml.html.fromstring(filesreq.content) - fileslist = filestree.xpath('//div[contains(concat(" ",normalize-space(@class)," ")," file ")]') + :param path: Directory + (an empty string means root), defaults to '' + :type path: str, optional + :return: List of :class:`python_aternos.atfile.AternosFile` + :rtype: List[AternosFile] + """ - files = [] - for f in fileslist: + path = path.lstrip('/') + filesreq = self.atserv.atserver_request( + f'https://aternos.org/files/{path}', 'GET' + ) + filestree = lxml.html.fromstring(filesreq.content) + fileslist = filestree.xpath( + '//div[contains(concat(" ",normalize-space(@class)," ")," file ")]' + ) - ftype_raw = f.xpath('@data-type')[0] - ftype = FileType.file \ - if ftype_raw == 'file' \ - else FileType.directory + files = [] + for f in fileslist: - fsize_raw = f.xpath('./div[@class="filesize"]') - fsize = 0 - if len(fsize_raw) > 0: + ftype_raw = f.xpath('@data-type')[0] + ftype = FileType.file \ + if ftype_raw == 'file' \ + else FileType.directory - fsize_text = fsize_raw[0].text.strip() - fsize_num = fsize_text[:fsize_text.rfind(' ')] - fsize_msr = fsize_text[fsize_text.rfind(' ')+1:] + fsize_raw = f.xpath('./div[@class="filesize"]') + fsize = 0 + if len(fsize_raw) > 0: - try: - fsize = self.convert_size(float(fsize_num), fsize_msr) - except ValueError: - fsize = -1 + fsize_text = fsize_raw[0].text.strip() + fsize_num = fsize_text[:fsize_text.rfind(' ')] + fsize_msr = fsize_text[fsize_text.rfind(' ')+1:] - fullpath = f.xpath('@data-path')[0] - filepath = fullpath[:fullpath.rfind('/')] - filename = fullpath[fullpath.rfind('/'):] - files.append( - AternosFile( - self.atserv, - filepath, filename, - ftype, fsize - ) - ) + try: + fsize = self.convert_size(float(fsize_num), fsize_msr) + except ValueError: + fsize = -1 - return files + fullpath = f.xpath('@data-path')[0] + filepath = fullpath[:fullpath.rfind('/')] + filename = fullpath[fullpath.rfind('/'):] + files.append( + AternosFile( + self.atserv, + filepath, filename, + ftype, fsize + ) + ) - def convert_size(self, num:Union[int,float], measure:str) -> float: + return files - """Converts "human" file size to size in bytes + def convert_size(self, num: Union[int, float], measure: str) -> float: - :param num: Size - :type num: Union[int,float] - :param measure: Units (B, kB, MB, GB) - :type measure: str - :return: Size in bytes - :rtype: float - """ + """Converts "human" file size to size in bytes - measure_match = { - 'B': 1, - 'kB': 1000, - 'MB': 1000000, - 'GB': 1000000000 - } - try: - return num * measure_match[measure] - except KeyError: - return -1 + :param num: Size + :type num: Union[int,float] + :param measure: Units (B, kB, MB, GB) + :type measure: str + :return: Size in bytes + :rtype: float + """ - def get_file(self, path:str) -> Optional[AternosFile]: + measure_match = { + 'B': 1, + 'kB': 1000, + 'MB': 1000000, + 'GB': 1000000000 + } + try: + return num * measure_match[measure] + except KeyError: + return -1 - """Returns :class:`python_aternos.atfile.AternosFile` - instance by its path + def get_file(self, path: str) -> Optional[AternosFile]: - :param path: Path to file including its filename - :type path: str - :return: _description_ - :rtype: Optional[AternosFile] - """ + """Returns :class:`python_aternos.atfile.AternosFile` + instance by its path - filepath = path[:path.rfind('/')] - filename = path[path.rfind('/'):] + :param path: Path to file including its filename + :type path: str + :return: _description_ + :rtype: Optional[AternosFile] + """ - filedir = self.listdir(filepath) - for file in filedir: - if file.name == filename: - return file + filepath = path[:path.rfind('/')] + filename = path[path.rfind('/'):] - return None + filedir = self.listdir(filepath) + for file in filedir: + if file.name == filename: + return file - def dl_file(self, path:str) -> bytes: + return None - """Returns the file content in bytes (downloads it) + def dl_file(self, path: str) -> bytes: - :param path: Path to file including its filename - :type path: str - :return: File content - :rtype: bytes - """ + """Returns the file content in bytes (downloads it) - file = self.atserv.atserver_request( - f'https://aternos.org/panel/ajax/files/download.php?' + \ - f'file={path.replace("/","%2F")}', - 'GET' - ) + :param path: Path to file including its filename + :type path: str + :return: File content + :rtype: bytes + """ - return file.content + file = self.atserv.atserver_request( + 'https://aternos.org/panel/ajax/files/download.php' + 'GET', params={ + 'file': path.replace('/', '%2F') + } + ) - def dl_world(self, world:str='world') -> bytes: + return file.content - """Returns the world zip file content - by its name (downloads it) + def dl_world(self, world: str = 'world') -> bytes: - :param world: Name of world, defaults to 'world' - :type world: str, optional - :return: Zip file content - :rtype: bytes - """ + """Returns the world zip file content + by its name (downloads it) - world = self.atserv.atserver_request( - f'https://aternos.org/panel/ajax/worlds/download.php?' + \ - f'world={world.replace("/","%2F")}', - 'GET' - ) + :param world: Name of world, defaults to 'world' + :type world: str, optional + :return: Zip file content + :rtype: bytes + """ - return world.content + world = self.atserv.atserver_request( + 'https://aternos.org/panel/ajax/worlds/download.php' + 'GET', params={ + 'world': world.replace('/', '%2F') + } + ) + + return world.content diff --git a/python_aternos/atjsparse.py b/python_aternos/atjsparse.py index 924f771..00d0cb4 100644 --- a/python_aternos/atjsparse.py +++ b/python_aternos/atjsparse.py @@ -6,42 +6,45 @@ from typing import Any # Thanks to http://regex.inginf.units.it/ arrowexp = regex.compile(r'\w[^\}]*+') -def to_ecma5_function(f:str) -> str: - """Converts a ECMA6 function to ECMA5 format (without arrow expressions) +def to_ecma5_function(f: str) -> str: - :param f: ECMA6 function - :type f: str - :return: ECMA5 function - :rtype: str - """ - - match = arrowexp.search(f) - conv = '(function(){' + match.group(0) + '})()' - return regex.sub( - r'(?:s|\(s\)) => s.split\([\'"]{2}\).reverse\(\).join\([\'"]{2}\)', - 'function(s){return s.split(\'\').reverse().join(\'\')}', - conv - ) + """Converts a ECMA6 function to ECMA5 format (without arrow expressions) -def atob(s:str) -> str: - return base64.standard_b64decode(str(s)).decode('utf-8') + :param f: ECMA6 function + :type f: str + :return: ECMA5 function + :rtype: str + """ -def exec(f:str) -> Any: + match = arrowexp.search(f) + conv = '(function(){' + match.group(0) + '})()' + return regex.sub( + r'(?:s|\(s\)) => s.split\([\'"]{2}\).reverse\(\).join\([\'"]{2}\)', + 'function(s){return s.split(\'\').reverse().join(\'\')}', + conv + ) - """Executes a JavaScript function - :param f: ECMA6 function - :type f: str - :return: JavaScript interpreter context - :rtype: Any - """ +def atob(s: str) -> str: + return base64.standard_b64decode(str(s)).decode('utf-8') - ctx = js2py.EvalJs({'atob': atob}) - ctx.execute('window.document = { };') - ctx.execute('window.Map = function(_i){ };') - ctx.execute('window.setTimeout = function(_f,_t){ };') - ctx.execute('window.setInterval = function(_f,_t){ };') - ctx.execute('window.encodeURIComponent = function(_s){ };') - ctx.execute(to_ecma5_function(f)) - return ctx + +def exec(f: str) -> Any: + + """Executes a JavaScript function + + :param f: ECMA6 function + :type f: str + :return: JavaScript interpreter context + :rtype: Any + """ + + ctx = js2py.EvalJs({'atob': atob}) + ctx.execute('window.document = { };') + ctx.execute('window.Map = function(_i){ };') + ctx.execute('window.setTimeout = function(_f,_t){ };') + ctx.execute('window.setInterval = function(_f,_t){ };') + ctx.execute('window.encodeURIComponent = function(_s){ };') + ctx.execute(to_ecma5_function(f)) + return ctx diff --git a/python_aternos/atplayers.py b/python_aternos/atplayers.py index e545617..7576d91 100644 --- a/python_aternos/atplayers.py +++ b/python_aternos/atplayers.py @@ -4,98 +4,103 @@ from typing import List, Union from typing import TYPE_CHECKING if TYPE_CHECKING: - from .atserver import AternosServer + from .atserver import AternosServer + class Lists(enum.Enum): - whl = 'whitelist' - ops = 'ops' - ban = 'banned-players' - ips = 'banned-ips' + """Players list type enum""" + + whl = 'whitelist' + ops = 'ops' + ban = 'banned-players' + ips = 'banned-ips' + class PlayersList: - """Class for managing operators, whitelist and banned players lists - - :param lst: Players list type, must be - :class:`python_aternos.atplayers.Lists` enum value - :type lst: Union[str,Lists] - :param atserv: :class:`python_aternos.atserver.AternosServer` instance - :type atserv: python_aternos.atserver.AternosServer - """ + """Class for managing operators, whitelist and banned players lists - def __init__(self, lst:Union[str,Lists], atserv:'AternosServer') -> None: + :param lst: Players list type, must be + :class:`python_aternos.atplayers.Lists` enum value + :type lst: Union[str,Lists] + :param atserv: :class:`python_aternos.atserver.AternosServer` instance + :type atserv: python_aternos.atserver.AternosServer + """ - self.atserv = atserv - self.lst = Lists(lst) - self.players = [] - self.parsed = False + def __init__(self, lst: Union[str, Lists], atserv: 'AternosServer') -> None: - def list_players(self, cache:bool=True) -> List[str]: + self.atserv = atserv + self.lst = Lists(lst) + self.players = [] + self.parsed = False - """Parse a players list + def list_players(self, cache: bool = True) -> List[str]: - :param cache: If the function can return cached list (highly recommended), defaults to True - :type cache: bool, optional - :return: List of players nicknames - :rtype: List[str] - """ + """Parse a players list - if cache and self.parsed: - return self.players + :param cache: If the function can return + cached list (highly recommended), defaults to True + :type cache: bool, optional + :return: List of players nicknames + :rtype: List[str] + """ - listreq = self.atserv.atserver_request( - f'https://aternos.org/players/{self.lst.value}', - 'GET' - ) - listtree = lxml.html.fromstring(listreq.content) - items = listtree.xpath( - '//div[@class="list-item"]' - ) + if cache and self.parsed: + return self.players - result = [] - for i in items: - name = i.xpath('./div[@class="list-name"]') - result.append(name[0].text.strip()) - - self.players = result - self.parsed = True - return result + listreq = self.atserv.atserver_request( + f'https://aternos.org/players/{self.lst.value}', + 'GET' + ) + listtree = lxml.html.fromstring(listreq.content) + items = listtree.xpath( + '//div[@class="list-item"]' + ) - def add(self, name:str) -> None: + result = [] + for i in items: + name = i.xpath('./div[@class="list-name"]') + result.append(name[0].text.strip()) - """Appends a player to the list by the nickname + self.players = result + self.parsed = True + return result - :param name: Player's nickname - :type name: str - """ + def add(self, name: str) -> None: - self.atserv.atserver_request( - 'https://aternos.org/panel/ajax/players/add.php', - 'POST', data={ - 'list': self.lst.value, - 'name': name - }, sendtoken=True - ) + """Appends a player to the list by the nickname - self.players.append(name) + :param name: Player's nickname + :type name: str + """ - def remove(self, name:str) -> None: - - """Removes a player from the list by the nickname + self.atserv.atserver_request( + 'https://aternos.org/panel/ajax/players/add.php', + 'POST', data={ + 'list': self.lst.value, + 'name': name + }, sendtoken=True + ) - :param name: Player's nickname - :type name: str - """ + self.players.append(name) - self.atserv.atserver_request( - 'https://aternos.org/panel/ajax/players/remove.php', - 'POST', data={ - 'list': self.lst.value, - 'name': name - }, sendtoken=True - ) + def remove(self, name: str) -> None: - for i, j in enumerate(self.players): - if j == name: - del self.players[i] + """Removes a player from the list by the nickname + + :param name: Player's nickname + :type name: str + """ + + self.atserv.atserver_request( + 'https://aternos.org/panel/ajax/players/remove.php', + 'POST', data={ + 'list': self.lst.value, + 'name': name + }, sendtoken=True + ) + + for i, j in enumerate(self.players): + if j == name: + del self.players[i] diff --git a/python_aternos/atserver.py b/python_aternos/atserver.py index 07ec381..df7f6e4 100644 --- a/python_aternos/atserver.py +++ b/python_aternos/atserver.py @@ -15,329 +15,337 @@ from .atplayers import PlayersList from .atplayers import Lists from .atwss import AternosWss + class Edition(enum.IntEnum): - """Server edition type enum""" + """Server edition type enum""" + + java = 0 + bedrock = 1 - java = 0 - bedrock = 1 class Status(enum.IntEnum): - """Server numeric status enum. - It is highly recommended to use - `AternosServer.status` instead of - `AternosServer.status_num`""" + """Server numeric status enum. + It is highly recommended to use + `AternosServer.status` instead of + `AternosServer.status_num`""" + + off = 0 + on = 1 + starting = 2 + shutdown = 3 + unknown = 6 + error = 7 + confirm = 10 - off = 0 - on = 1 - starting = 2 - shutdown = 3 - unknown = 6 - error = 7 - confirm = 10 class AternosServer: - """Class for controlling your Aternos Minecraft server + """Class for controlling your Aternos Minecraft server - :param servid: Unique server IDentifier - :type servid: str - :param atconn: :class:`python_aternos.atconnect.AternosConnect` - instance with initialized Aternos session - :type atconn: python_aternos.atconnect.AternosConnect - :param reqinfo: Automatically call AternosServer.fetch() to get all info, defaults to `True` - :type reqinfo: bool, optional - """ + :param servid: Unique server IDentifier + :type servid: str + :param atconn: :class:`python_aternos.atconnect.AternosConnect` + instance with initialized Aternos session + :type atconn: python_aternos.atconnect.AternosConnect + :param reqinfo: Automatically call AternosServer.fetch() + to get all info, defaults to `True` + :type reqinfo: bool, optional + """ - def __init__( - self, servid:str, - atconn:AternosConnect, - reqinfo:bool=True) -> None: + def __init__( + self, servid: str, + atconn: AternosConnect, + reqinfo: bool = True) -> None: - self.servid = servid - self.atconn = atconn - if reqinfo: - self.fetch() - - def fetch(self) -> None: + self.servid = servid + self.atconn = atconn + if reqinfo: + self.fetch() - """Send a request to Aternos API to get all server info""" + def fetch(self) -> None: - servreq = self.atserver_request( - 'https://aternos.org/panel/ajax/status.php', - 'GET', sendtoken=True - ) - self._info = json.loads(servreq.content) + """Send a request to Aternos API to get all server info""" - def wss(self, autoconfirm:bool=False) -> AternosWss: + servreq = self.atserver_request( + 'https://aternos.org/panel/ajax/status.php', + 'GET', sendtoken=True + ) + self._info = json.loads(servreq.content) - """Returns :class:`python_aternos.atwss.AternosWss` instance for listening server streams in real-time + def wss(self, autoconfirm: bool = False) -> AternosWss: - :param autoconfirm: Automatically start server status listener - when AternosWss connects to API to confirm server launching, defaults to `False` - :type autoconfirm: bool, optional - :return: :class:`python_aternos.atwss.AternosWss` object - :rtype: python_aternos.atwss.AternosWss - """ + """Returns :class:`python_aternos.atwss.AternosWss` + instance for listening server streams in real-time - return AternosWss(self, autoconfirm) + :param autoconfirm: Automatically start server status listener + when AternosWss connects to API to confirm + server launching, defaults to `False` + :type autoconfirm: bool, optional + :return: :class:`python_aternos.atwss.AternosWss` object + :rtype: python_aternos.atwss.AternosWss + """ - def start(self, headstart:bool=False, accepteula:bool=True) -> None: + return AternosWss(self, autoconfirm) - """Starts a server + def start(self, headstart: bool = False, accepteula: bool = True) -> None: - :param headstart: Start a server in the headstart mode which allows you to skip all queue, defaults to `False` - :type headstart: bool, optional - :param accepteula: Automatically accept the Mojang EULA, defaults to `True` - :type accepteula: bool, optional - :raises ServerEulaError: When trying to start a server - without accepting the Mojang EULA - :raises ServerRunningError: When trying to start a server - which is alreday running - :raises ServerSoftwareError: When Aternos notifies about - incorrect software version - :raises ServerStorageError: When Aternos notifies about - voilation of storage limits (4 GB for now) - :raises ServerError: When API is unable to start a Minecraft server - due to unavailability of Aternos' file servers or other problems - """ + """Starts a server - startreq = self.atserver_request( - 'https://aternos.org/panel/ajax/start.php', - 'GET', params={'headstart': int(headstart)}, - sendtoken=True - ) - startresult = startreq.json() + :param headstart: Start a server in the headstart mode + which allows you to skip all queue, defaults to `False` + :type headstart: bool, optional + :param accepteula: Automatically accept + the Mojang EULA, defaults to `True` + :type accepteula: bool, optional + :raises ServerEulaError: When trying to start a server + without accepting the Mojang EULA + :raises ServerRunningError: When trying to start a server + which is alreday running + :raises ServerSoftwareError: When Aternos notifies about + incorrect software version + :raises ServerStorageError: When Aternos notifies about + voilation of storage limits (4 GB for now) + :raises ServerError: When API is unable to start a Minecraft server + due to unavailability of Aternos' file servers or other problems + """ - if startresult['success']: - return - error = startresult['error'] + startreq = self.atserver_request( + 'https://aternos.org/panel/ajax/start.php', + 'GET', params={'headstart': int(headstart)}, + sendtoken=True + ) + startresult = startreq.json() - if error == 'eula' and accepteula: - self.eula() - self.start(accepteula=False) + if startresult['success']: + return + error = startresult['error'] - elif error == 'eula': - raise ServerEulaError( - 'EULA was not accepted. Use start(accepteula=True)' - ) + if error == 'eula' and accepteula: + self.eula() + self.start(accepteula=False) - elif error == 'already': - raise ServerRunningError( - 'Server is already running' - ) + elif error == 'eula': + raise ServerEulaError( + 'EULA was not accepted. Use start(accepteula=True)' + ) - elif error == 'wrongversion': - raise ServerSoftwareError( - 'Incorrect software version installed' - ) + elif error == 'already': + raise ServerRunningError( + 'Server is already running' + ) - elif error == 'file': - raise ServerError( - 'File server is unavailbale, view https://status.aternos.gmbh' - ) + elif error == 'wrongversion': + raise ServerSoftwareError( + 'Incorrect software version installed' + ) - elif error == 'size': - raise ServerStorageError( - f'Available storage size is 4GB, ' + \ - f'your server used: {startresult["size"]}' - ) + elif error == 'file': + raise ServerError( + 'File server is unavailbale, view https://status.aternos.gmbh' + ) - else: - raise ServerError( - f'Unable to start server, code: {error}' - ) + elif error == 'size': + raise ServerStorageError( + f'Available storage size is 4GB, ' + f'your server used: {startresult["size"]}' + ) - def confirm(self) -> None: + else: + raise ServerError( + f'Unable to start server, code: {error}' + ) - """Confirms server launching""" + def confirm(self) -> None: - self.atserver_request( - 'https://aternos.org/panel/ajax/confirm.php', - 'GET', sendtoken=True - ) + """Confirms server launching""" - def stop(self) -> None: + self.atserver_request( + 'https://aternos.org/panel/ajax/confirm.php', + 'GET', sendtoken=True + ) - """Stops the server""" + def stop(self) -> None: - self.atserver_request( - 'https://aternos.org/panel/ajax/stop.php', - 'GET', sendtoken=True - ) + """Stops the server""" - def cancel(self) -> None: + self.atserver_request( + 'https://aternos.org/panel/ajax/stop.php', + 'GET', sendtoken=True + ) - """Cancels server launching""" + def cancel(self) -> None: - self.atserver_request( - 'https://aternos.org/panel/ajax/cancel.php', - 'GET', sendtoken=True - ) + """Cancels server launching""" - def restart(self) -> None: + self.atserver_request( + 'https://aternos.org/panel/ajax/cancel.php', + 'GET', sendtoken=True + ) - """Restarts the server""" + def restart(self) -> None: - self.atserver_request( - 'https://aternos.org/panel/ajax/restart.php', - 'GET', sendtoken=True - ) + """Restarts the server""" - def eula(self) -> None: + self.atserver_request( + 'https://aternos.org/panel/ajax/restart.php', + 'GET', sendtoken=True + ) - """Accepts the Mojang EULA""" + def eula(self) -> None: - self.atserver_request( - 'https://aternos.org/panel/ajax/eula.php', - 'GET', sendtoken=True - ) + """Accepts the Mojang EULA""" - def files(self) -> FileManager: + self.atserver_request( + 'https://aternos.org/panel/ajax/eula.php', + 'GET', sendtoken=True + ) - """Returns :class:`python_aternos.atfm.FileManager` - instance for file operations + def files(self) -> FileManager: - :return: :class:`python_aternos.atfm.FileManager` object - :rtype: python_aternos.atfm.FileManager - """ + """Returns :class:`python_aternos.atfm.FileManager` + instance for file operations - return FileManager(self) + :return: :class:`python_aternos.atfm.FileManager` object + :rtype: python_aternos.atfm.FileManager + """ - def config(self) -> AternosConfig: + return FileManager(self) - """Returns :class:`python_aternos.atconf.AternosConfig` - instance for editing server settings + def config(self) -> AternosConfig: - :return: :class:`python_aternos.atconf.AternosConfig` object - :rtype: python_aternos.atconf.AternosConfig - """ + """Returns :class:`python_aternos.atconf.AternosConfig` + instance for editing server settings - return AternosConfig(self) + :return: :class:`python_aternos.atconf.AternosConfig` object + :rtype: python_aternos.atconf.AternosConfig + """ - def players(self, lst:Lists) -> PlayersList: + return AternosConfig(self) - """Returns :class:`python_aternos.atplayers.PlayersList` - instance for managing operators, whitelist and banned players lists + def players(self, lst: Lists) -> PlayersList: - :param lst: Players list type, must be - the :class:`python_aternos.atplayers.Lists` enum value - :type lst: python_aternos.atplayers.Lists - :return: :class:`python_aternos.atplayers.PlayersList` - :rtype: python_aternos.atplayers.PlayersList - """ + """Returns :class:`python_aternos.atplayers.PlayersList` + instance for managing operators, whitelist and banned players lists - return PlayersList(lst, self) + :param lst: Players list type, must be + the :class:`python_aternos.atplayers.Lists` enum value + :type lst: python_aternos.atplayers.Lists + :return: :class:`python_aternos.atplayers.PlayersList` + :rtype: python_aternos.atplayers.PlayersList + """ - def atserver_request( - self, url:str, method:str, - params:Optional[dict]=None, - data:Optional[dict]=None, - headers:Optional[dict]=None, - sendtoken:bool=False) -> Response: + return PlayersList(lst, self) - """Sends a request to Aternos API - with server IDenitfier parameter + def atserver_request( + self, url: str, method: str, + params: Optional[dict] = None, + data: Optional[dict] = None, + headers: Optional[dict] = None, + sendtoken: bool = False) -> Response: - :param url: Request URL - :type url: str - :param method: Request method, must be GET or POST - :type method: str - :param params: URL parameters, defaults to None - :type params: Optional[dict], optional - :param data: POST request data, if the method is GET, - this dict will be combined with params, defaults to None - :type data: Optional[dict], optional - :param headers: Custom headers, defaults to None - :type headers: Optional[dict], optional - :param sendtoken: If the ajax and SEC token - should be sent, defaults to False - :type sendtoken: bool, optional - :return: API response - :rtype: requests.Response - """ + """Sends a request to Aternos API + with server IDenitfier parameter - return self.atconn.request_cloudflare( - url=url, method=method, - params=params, data=data, - headers=headers, - reqcookies={ - 'ATERNOS_SERVER': self.servid - }, - sendtoken=sendtoken - ) + :param url: Request URL + :type url: str + :param method: Request method, must be GET or POST + :type method: str + :param params: URL parameters, defaults to None + :type params: Optional[dict], optional + :param data: POST request data, if the method is GET, + this dict will be combined with params, defaults to None + :type data: Optional[dict], optional + :param headers: Custom headers, defaults to None + :type headers: Optional[dict], optional + :param sendtoken: If the ajax and SEC token + should be sent, defaults to False + :type sendtoken: bool, optional + :return: API response + :rtype: requests.Response + """ - @property - def subdomain(self) -> str: - atdomain = self.domain - return atdomain[:atdomain.find('.')] + return self.atconn.request_cloudflare( + url=url, method=method, + params=params, data=data, + headers=headers, + reqcookies={ + 'ATERNOS_SERVER': self.servid + }, + sendtoken=sendtoken + ) - @subdomain.setter - def subdomain(self, value:str) -> None: - self.atserver_request( - 'https://aternos.org/panel/ajax/options/subdomain.php', - 'GET', params={'subdomain': value}, - sendtoken=True - ) + @property + def subdomain(self) -> str: + atdomain = self.domain + return atdomain[:atdomain.find('.')] - @property - def motd(self) -> str: - return self._info['motd'] + @subdomain.setter + def subdomain(self, value: str) -> None: + self.atserver_request( + 'https://aternos.org/panel/ajax/options/subdomain.php', + 'GET', params={'subdomain': value}, + sendtoken=True + ) - @motd.setter - def motd(self, value:str) -> None: - self.atserver_request( - 'https://aternos.org/panel/ajax/options/motd.php', - 'POST', data={'motd': value}, - sendtoken=True - ) + @property + def motd(self) -> str: + return self._info['motd'] - @property - def address(self) -> str: - return self._info['displayAddress'] - - @property - def domain(self) -> str: - return self._info['ip'] + @motd.setter + def motd(self, value: str) -> None: + self.atserver_request( + 'https://aternos.org/panel/ajax/options/motd.php', + 'POST', data={'motd': value}, + sendtoken=True + ) - @property - def port(self) -> int: - return self._info['port'] + @property + def address(self) -> str: + return self._info['displayAddress'] - @property - def edition(self) -> int: - soft_type = self._info['bedrock'] - return int(soft_type) + @property + def domain(self) -> str: + return self._info['ip'] - @property - def software(self) -> str: - return self._info['software'] - - @property - def version(self) -> str: - return self._info['version'] - - @property - def status(self) -> str: - return self._info['class'] + @property + def port(self) -> int: + return self._info['port'] - @property - def status_num(self) -> int: - return int(self._info['status']) - - @property - def players_list(self) -> List[str]: - return self._info['playerlist'] - - @property - def players_count(self) -> int: - return int(self._info['players']) - - @property - def slots(self) -> int: - return int(self._info['slots']) + @property + def edition(self) -> int: + soft_type = self._info['bedrock'] + return int(soft_type) - @property - def ram(self) -> int: - return int(self._info['ram']) + @property + def software(self) -> str: + return self._info['software'] + + @property + def version(self) -> str: + return self._info['version'] + + @property + def status(self) -> str: + return self._info['class'] + + @property + def status_num(self) -> int: + return int(self._info['status']) + + @property + def players_list(self) -> List[str]: + return self._info['playerlist'] + + @property + def players_count(self) -> int: + return int(self._info['players']) + + @property + def slots(self) -> int: + return int(self._info['slots']) + + @property + def ram(self) -> int: + return int(self._info['ram']) diff --git a/python_aternos/atwss.py b/python_aternos/atwss.py index 4a8d7b7..928f4a5 100644 --- a/python_aternos/atwss.py +++ b/python_aternos/atwss.py @@ -8,215 +8,224 @@ from typing import TYPE_CHECKING from .atconnect import REQUA if TYPE_CHECKING: - from .atserver import AternosServer + from .atserver import AternosServer + class Streams(enum.Enum): - """WebSocket streams types""" + """WebSocket streams types""" - status = (0,None) - queue = (1,None) - console = (2,'console') - ram = (3,'heap') - tps = (4,'tick') + status = (0, None) + queue = (1, None) + console = (2, 'console') + ram = (3, 'heap') + tps = (4, 'tick') + + def __init__(self, num: int, stream: str) -> None: + self.num = num + self.stream = stream - def __init__(self, num:int, stream:str): - self.num = num - self.stream = stream class AternosWss: - """Class for managing websocket connection + """Class for managing websocket connection - :param atserv: :class:`python_aternos.atserver.AternosServer` instance - :type atserv: python_aternos.atserver.AternosServer - :param autoconfirm: Automatically start server status listener - when AternosWss connects to API to confirm server launching, defaults to `False` - :type autoconfirm: bool, optional - """ + :param atserv: :class:`python_aternos.atserver.AternosServer` instance + :type atserv: python_aternos.atserver.AternosServer + :param autoconfirm: Automatically start server status listener + when AternosWss connects to API to confirm + server launching, defaults to `False` + :type autoconfirm: bool, optional + """ - def __init__(self, atserv:'AternosServer', autoconfirm:bool=False) -> None: - - self.atserv = atserv - self.cookies = atserv.atconn.session.cookies - self.session = self.cookies['ATERNOS_SESSION'] - self.servid = atserv.servid - self.recv = {} - self.autoconfirm = autoconfirm - self.confirmed = False - - async def confirm(self) -> None: + def __init__(self, atserv: 'AternosServer', autoconfirm: bool = False) -> None: - """Simple way to call AternosServer.confirm from this class""" + self.atserv = atserv + self.cookies = atserv.atconn.session.cookies + self.session = self.cookies['ATERNOS_SESSION'] + self.servid = atserv.servid + self.recv = {} + self.autoconfirm = autoconfirm + self.confirmed = False - self.atserv.confirm() + async def confirm(self) -> None: - def wssreceiver(self, stream:Streams, *args:Any) -> Callable[[Callable[[Any],Coroutine[Any,Any,None]]],Any]: + """Simple way to call AternosServer.confirm from this class""" - """Decorator that marks your function as a stream receiver. - When websocket receives message from the specified stream, - it calls all listeners created with this decorator. + self.atserv.confirm() - :param stream: Stream that your function should listen - :type stream: python_aternos.atwss.Streams - :param args: Arguments which will be passed to your function - :type args: tuple, optional - :return: ... - :rtype: Callable[[Callable[[Any],Coroutine[Any,Any,None]]],Any] - """ + def wssreceiver(self, stream: Streams, *args: Any) -> Callable[[Callable[[Any], Coroutine[Any, Any, None]]], Any]: - def decorator(func:Callable[[Any],Coroutine[Any,Any,None]]) -> None: - self.recv[stream] = (func, args) - return decorator + """Decorator that marks your function as a stream receiver. + When websocket receives message from the specified stream, + it calls all listeners created with this decorator. - async def connect(self) -> None: + :param stream: Stream that your function should listen + :type stream: python_aternos.atwss.Streams + :param args: Arguments which will be passed to your function + :type args: tuple, optional + :return: ... + :rtype: Callable[[Callable[[Any], Coroutine[Any, Any, None]]], Any] + """ - """Connect to the websocket server and start all stream listeners""" - - headers = [ - ('Host', 'aternos.org'), - ('User-Agent', REQUA), - ( - 'Cookie', - f'ATERNOS_SESSION={self.session}; ' + \ - f'ATERNOS_SERVER={self.servid}' - ) - ] - self.socket = await websockets.connect( - 'wss://aternos.org/hermes/', - origin='https://aternos.org', - extra_headers=headers - ) + def decorator(func: Callable[[Any], Coroutine[Any, Any, None]]) -> None: + self.recv[stream] = (func, args) + return decorator - @self.wssreceiver(Streams.status) - async def confirmfunc(msg): + async def connect(self) -> None: - """Automatically confirm Minecraft server launching""" + """Connect to the websocket server and start all stream listeners""" - if not self.autoconfirm: - return - if msg['class'] == 'queueing' \ - and msg['queue']['pending'] == 'pending'\ - and not self.confirmed: - self.confirm() - - @self.wssreceiver(Streams.status) - async def streamsfunc(msg): + headers = [ + ('Host', 'aternos.org'), + ('User-Agent', REQUA), + ( + 'Cookie', + f'ATERNOS_SESSION={self.session}; ' + f'ATERNOS_SERVER={self.servid}' + ) + ] + self.socket = await websockets.connect( + 'wss://aternos.org/hermes/', + origin='https://aternos.org', + extra_headers=headers + ) - """Automatically starts streams. Detailed description: + @self.wssreceiver(Streams.status) + async def confirmfunc(msg): - According to the websocket messages from the web site, - Aternos can't receive any data from a stream (e.g. console) until - it requests this stream via the special message to the websocket server: - `{"stream":"console","type":"start"}` - on which the server responses with: `{"type":"connected"}` - Also, there are RAM (used heap) and TPS (ticks per second) - streams that must be enabled before trying to get information. - Enabling the stream for listening the server status is not needed, - these data is sent from API by default, so there's None value in - the second item of its stream type tuple (``). - https://github.com/DarkCat09/python-aternos/issues/22#issuecomment-1146788496 - """ + """Automatically confirm Minecraft server launching""" - if msg['status'] == 2: - # Automatically start streams - for strm in self.recv: - if not isinstance(strm,Streams): - continue - if strm.stream: - logging.debug(f'Enabling {strm.stream} stream') - await self.send({ - 'stream': strm.stream, - 'type': 'start' - }) - - await self.wssworker() + if not self.autoconfirm: + return - async def close(self) -> None: + in_queue = (msg['class'] == 'queueing') + pending = (msg['queue']['pending'] == 'pending') + confirmation = in_queue and pending - """Closes websocket connection and stops all listeners""" - - self.keep.cancel() - self.msgs.cancel() - await self.socket.close() - del self.socket + if confirmation and not self.confirmed: + self.confirm() - async def send(self, obj:Union[Dict[str, Any],str]) -> None: + @self.wssreceiver(Streams.status) + async def streamsfunc(msg): - """Sends a message to websocket server + """Automatically starts streams. Detailed description: - :param obj: Message, may be a string or a dict - :type obj: Union[Dict[str, Any],str] - """ + According to the websocket messages from the web site, + Aternos can't receive any data from a stream (e.g. console) until + it requests this stream via the special message + to the websocket server: `{"stream":"console","type":"start"}` + on which the server responses with: `{"type":"connected"}` + Also, there are RAM (used heap) and TPS (ticks per second) + streams that must be enabled before trying to get information. + Enabling the stream for listening the server status is not needed, + these data is sent from API by default, so there's None value in + the second item of its stream type tuple + (``). + https://github.com/DarkCat09/python-aternos/issues/22#issuecomment-1146788496 + """ - if isinstance(obj, dict): - obj = json.dumps(obj) + if msg['status'] == 2: + # Automatically start streams + for strm in self.recv: - await self.socket.send(obj) + if not isinstance(strm, Streams): + continue - async def wssworker(self) -> None: + if strm.stream: + logging.debug(f'Enabling {strm.stream} stream') + await self.send({ + 'stream': strm.stream, + 'type': 'start' + }) - """Starts async tasks in background - for receiving websocket messages - and sending keepalive ping""" + await self.wssworker() - self.keep = asyncio.create_task(self.keepalive()) - self.msgs = asyncio.create_task(self.receiver()) + async def close(self) -> None: - async def keepalive(self) -> None: + """Closes websocket connection and stops all listeners""" - """Each 49 seconds sends keepalive ping to websocket server""" + self.keep.cancel() + self.msgs.cancel() + await self.socket.close() + del self.socket - try: - while True: - await asyncio.sleep(49) - await self.socket.send('{"type":"\u2764"}') + async def send(self, obj: Union[Dict[str, Any], str]) -> None: - except asyncio.CancelledError: - pass + """Sends a message to websocket server - async def receiver(self) -> None: + :param obj: Message, may be a string or a dict + :type obj: Union[Dict[str, Any],str] + """ - """Receives messages from websocket servers - and calls user's streams listeners""" + if isinstance(obj, dict): + obj = json.dumps(obj) - try: - while True: - data = await self.socket.recv() - obj = json.loads(data) - msgtype = -1 - - if obj['type'] == 'line': - msgtype = Streams.console - msg = obj['data'].strip('\r\n ') + await self.socket.send(obj) - elif obj['type'] == 'heap': - msgtype = Streams.ram - msg = int(obj['data']['usage']) + async def wssworker(self) -> None: - elif obj['type'] == 'tick': - msgtype = Streams.tps - ticks = 1000 / obj['data']['averageTickTime'] - msg = 20 if ticks > 20 else ticks + """Starts async tasks in background + for receiving websocket messages + and sending keepalive ping""" - elif obj['type'] == 'status': - msgtype = Streams.status - msg = json.loads(obj['message']) + self.keep = asyncio.create_task(self.keepalive()) + self.msgs = asyncio.create_task(self.receiver()) - if msgtype in self.recv: + async def keepalive(self) -> None: - # function info tuple: - # (function, arguments) - func = self.recv[msgtype] + """Each 49 seconds sends keepalive ping to websocket server""" - # if arguments is not empty - if func[1]: - # call the function with args - coro = func[0](msg, func[1]) - else: - coro = func[0](msg) - # run - await asyncio.create_task(coro) - - except asyncio.CancelledError: - pass + try: + while True: + await asyncio.sleep(49) + await self.socket.send('{"type":"\u2764"}') + + except asyncio.CancelledError: + pass + + async def receiver(self) -> None: + + """Receives messages from websocket servers + and calls user's streams listeners""" + + try: + while True: + data = await self.socket.recv() + obj = json.loads(data) + msgtype = -1 + + if obj['type'] == 'line': + msgtype = Streams.console + msg = obj['data'].strip('\r\n ') + + elif obj['type'] == 'heap': + msgtype = Streams.ram + msg = int(obj['data']['usage']) + + elif obj['type'] == 'tick': + msgtype = Streams.tps + ticks = 1000 / obj['data']['averageTickTime'] + msg = 20 if ticks > 20 else ticks + + elif obj['type'] == 'status': + msgtype = Streams.status + msg = json.loads(obj['message']) + + if msgtype in self.recv: + + # function info tuple: + # (function, arguments) + func = self.recv[msgtype] + + # if arguments is not empty + if func[1]: + # call the function with args + coro = func[0](msg, func[1]) + else: + coro = func[0](msg) + # run + await asyncio.create_task(coro) + + except asyncio.CancelledError: + pass diff --git a/setup.py b/setup.py index d7b4bbd..f4e5638 100644 --- a/setup.py +++ b/setup.py @@ -1,43 +1,43 @@ import setuptools with open('README.md', 'rt') as readme: - long_description = readme.read() + long_description = readme.read() setuptools.setup( - name='python-aternos', - version='1.0.5', - author='Chechkenev Andrey (@DarkCat09)', - author_email='aacd0709@mail.ru', - description='An unofficial Aternos API', - long_description=long_description, - long_description_content_type='text/markdown', - url='https://github.com/DarkCat09/python-aternos', - project_urls={ - 'Homepage': 'https://codeberg.org/DarkCat09/python-aternos', - 'GitHub': 'https://github.com/DarkCat09/python-aternos', - 'Bug Tracker': 'https://github.com/DarkCat09/python-aternos/issues', - 'Bug Tracker 2': 'https://codeberg.org/DarkCat09/python-aternos/issues' - }, - classifiers=[ - 'Development Status :: 4 - Beta', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10', - 'License :: OSI Approved :: Apache Software License', - 'Operating System :: OS Independent', - 'Operating System :: Microsoft :: Windows', - 'Operating System :: POSIX :: Linux', - 'Operating System :: MacOS' - ], - install_requires=[ - 'lxml>=4.8.0', - 'cloudscraper>=1.2.58', - 'js2py>=0.71', - 'websockets>=10.1', - 'regex>=2022.3.15' - ], - packages=['python_aternos'], - python_requires=">=3.7", + name='python-aternos', + version='1.0.5', + author='Chechkenev Andrey (@DarkCat09)', + author_email='aacd0709@mail.ru', + description='An unofficial Aternos API', + long_description=long_description, + long_description_content_type='text/markdown', + url='https://github.com/DarkCat09/python-aternos', + project_urls={ + 'Homepage': 'https://codeberg.org/DarkCat09/python-aternos', + 'GitHub': 'https://github.com/DarkCat09/python-aternos', + 'Bug Tracker': 'https://github.com/DarkCat09/python-aternos/issues', + 'Bug Tracker 2': 'https://codeberg.org/DarkCat09/python-aternos/issues' + }, + classifiers=[ + 'Development Status :: 4 - Beta', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: OS Independent', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: POSIX :: Linux', + 'Operating System :: MacOS' + ], + install_requires=[ + 'lxml>=4.8.0', + 'cloudscraper>=1.2.58', + 'js2py>=0.71', + 'websockets>=10.1', + 'regex>=2022.3.15' + ], + packages=['python_aternos'], + python_requires=">=3.7", ) diff --git a/tests/js2py_test.py b/tests/js2py_test.py index fe88b1f..8dcc05a 100644 --- a/tests/js2py_test.py +++ b/tests/js2py_test.py @@ -3,78 +3,83 @@ import unittest from python_aternos import atjsparse +CONV_TOKEN_ARROW = '''(() => {window["AJAX_TOKEN"]=("2r" + "KO" + "A1" + "IFdBcHhEM" + "61" + "6cb");})();''' +CONV_TOKEN_FUNC = '(function(){window["AJAX_TOKEN"]=("2r" + "KO" + "A1" + "IFdBcHhEM" + "61" + "6cb");})()' + + class TestJs2Py(unittest.TestCase): - def setUp(self) -> None: + def setUp(self) -> None: - self.tests = [] - with open('token.txt', 'rt') as f: - lines = re.split(r'[\r\n]', f.read()) - del lines[len(lines)-1] # Remove empty string - self.tests = lines - - self.results = [ - '2rKOA1IFdBcHhEM616cb', - '2rKOA1IFdBcHhEM616cb', - '2rKOA1IFdBcHhEM616cb', - '2rKOA1IFdBcHhEM616cb', - '2rKOA1IFdBcHhEM616cb', - '2rKOA1IFdBcHhEM616cb', - '2rKOA1IFdBcHhEM616cb', - '2rKOA1IFdBcHhEM616cb', - '2rKOA1IFdBcHhEM616cb', - '2iXh5W5uEYq5fWJIazQ6', - 'CuUcmZ27Fb8bVBNw12Vj', - 'YPPe8Ph7vzYaZ9PF9oQP', - 'UfLlemvKEE16ltk0hZNM', - 'S1Oban9UGRXVIepREw9q', - 'S1Oban9UGRXVIepREw9q', - 'KYDDyT1DWOJTZpNtJWhM', - 'lZPFwRqIGIf8JKk1LG02', - 'KbxzYCJUrFjWzbeZcAmE', - 'KbxzYCJUrFjWzbeZcAmE' - ] - - def test_base64(self) -> None: + self.tests = [] + with open('token.txt', 'rt') as f: + lines = re.split(r'[\r\n]', f.read()) + del lines[-1] # Remove empty string at the end + self.tests = lines - encoded = 'QEhlbGxvIFdvcmxkIQ==' - decoded = atjsparse.atob(encoded) - self.assertEqual(decoded, '@Hello World!') - - def test_conv(self) -> None: + self.results = [ + '2rKOA1IFdBcHhEM616cb', + '2rKOA1IFdBcHhEM616cb', + '2rKOA1IFdBcHhEM616cb', + '2rKOA1IFdBcHhEM616cb', + '2rKOA1IFdBcHhEM616cb', + '2rKOA1IFdBcHhEM616cb', + '2rKOA1IFdBcHhEM616cb', + '2rKOA1IFdBcHhEM616cb', + '2rKOA1IFdBcHhEM616cb', + '2iXh5W5uEYq5fWJIazQ6', + 'CuUcmZ27Fb8bVBNw12Vj', + 'YPPe8Ph7vzYaZ9PF9oQP', + 'UfLlemvKEE16ltk0hZNM', + 'S1Oban9UGRXVIepREw9q', + 'S1Oban9UGRXVIepREw9q', + 'KYDDyT1DWOJTZpNtJWhM', + 'lZPFwRqIGIf8JKk1LG02', + 'KbxzYCJUrFjWzbeZcAmE', + 'KbxzYCJUrFjWzbeZcAmE' + ] - token = '(() => {window["AJAX_TOKEN"]=("2r" + "KO" + "A1" + "IFdBcHhEM" + "61" + "6cb");})();' - f = atjsparse.to_ecma5_function(token) - self.assertEqual(f, '(function(){window["AJAX_TOKEN"]=("2r" + "KO" + "A1" + "IFdBcHhEM" + "61" + "6cb");})()') - - def test_ecma6parse(self) -> None: + def test_base64(self) -> None: - code = ''' - window.t0 = - window['document']&& - !window[["p","Ma"].reverse().join('')]|| - !window[["ut","meo","i","etT","s"].reverse().join('')];''' + encoded = 'QEhlbGxvIFdvcmxkIQ==' + decoded = atjsparse.atob(encoded) + self.assertEqual(decoded, '@Hello World!') - part1 = '''window.t1 = Boolean(window['document']);''' - part2 = '''window.t2 = Boolean(!window[["p","Ma"].reverse().join('')]);''' - part3 = '''window.t3 = Boolean(!window[["ut","meo","i","etT","s"].reverse().join('')]);''' + def test_conv(self) -> None: - ctx0 = atjsparse.exec(code) - ctx1 = atjsparse.exec(part1) - ctx2 = atjsparse.exec(part2) - ctx3 = atjsparse.exec(part3) + token = CONV_TOKEN_ARROW + f = atjsparse.to_ecma5_function(token) + self.assertEqual(f, CONV_TOKEN_FUNC) - self.assertEqual(ctx1.window['t1'], True) - self.assertEqual(ctx2.window['t2'], False) - self.assertEqual(ctx3.window['t3'], False) - - def test_exec(self) -> None: + def test_ecma6parse(self) -> None: - for i, f in enumerate(self.tests): - ctx = atjsparse.exec(f) - res = ctx.window['AJAX_TOKEN'] - self.assertEqual(res, self.results[i]) - - def tearDown(self) -> None: - del self.tests - del self.results + code = ''' + window.t0 = + window['document']&& + !window[["p","Ma"].reverse().join('')]|| + !window[["ut","meo","i","etT","s"].reverse().join('')];''' + + part1 = '''window.t1 = Boolean(window['document']);''' + part2 = '''window.t2 = Boolean(!window[["p","Ma"].reverse().join('')]);''' + part3 = '''window.t3 = Boolean(!window[["ut","meo","i","etT","s"].reverse().join('')]);''' + + ctx0 = atjsparse.exec(code) + ctx1 = atjsparse.exec(part1) + ctx2 = atjsparse.exec(part2) + ctx3 = atjsparse.exec(part3) + + self.assertEqual(ctx0.window['t0'], False) + self.assertEqual(ctx1.window['t1'], True) + self.assertEqual(ctx2.window['t2'], False) + self.assertEqual(ctx3.window['t3'], False) + + def test_exec(self) -> None: + + for i, f in enumerate(self.tests): + ctx = atjsparse.exec(f) + res = ctx.window['AJAX_TOKEN'] + self.assertEqual(res, self.results[i]) + + def tearDown(self) -> None: + del self.tests + del self.results