From bd25618fbdf7bd247d2a8fb7c68597fce49760a2 Mon Sep 17 00:00:00 2001 From: 4tochka Date: Wed, 20 Jun 2018 15:53:56 +0400 Subject: [PATCH] docs --- docs/_build/.DS_Store | Bin 6148 -> 0 bytes docs/build/doctrees/address.doctree | Bin 0 -> 43437 bytes docs/build/doctrees/block.doctree | Bin 0 -> 4040 bytes docs/build/doctrees/classes.doctree | Bin 0 -> 2656 bytes docs/build/doctrees/contributing.doctree | Bin 0 -> 6285 bytes docs/build/doctrees/environment.pickle | Bin 0 -> 1608634 bytes docs/build/doctrees/examples.doctree | Bin 0 -> 10451 bytes docs/build/doctrees/functional.doctree | Bin 0 -> 147638 bytes docs/build/doctrees/index.doctree | Bin 0 -> 14936 bytes docs/build/doctrees/installation.doctree | Bin 0 -> 5501 bytes docs/build/doctrees/transaction.doctree | Bin 0 -> 4701 bytes docs/build/html/.buildinfo | 4 + docs/build/html/.nojekyll | 0 docs/build/html/_modules/index.html | 120 + docs/build/html/_modules/pybtc/address.html | 337 + docs/build/html/_modules/pybtc/block.html | 146 + docs/build/html/_modules/pybtc/tools.html | 1423 +++ .../html/_modules/pybtc/transaction.html | 767 ++ docs/build/html/_sources/address.rst.txt | 30 + docs/build/html/_sources/block.rst.txt | 10 + docs/build/html/_sources/classes.rst.txt | 13 + docs/build/html/_sources/contributing.rst.txt | 36 + docs/build/html/_sources/examples.rst.txt | 118 + docs/build/html/_sources/functional.rst.txt | 108 + docs/build/html/_sources/index.rst.txt | 113 + docs/build/html/_sources/installation.rst.txt | 39 + docs/build/html/_sources/transaction.rst.txt | 11 + docs/build/html/_static/ajax-loader.gif | Bin 0 -> 673 bytes docs/build/html/_static/alabaster.css | 688 ++ docs/build/html/_static/basic.css | 665 + docs/build/html/_static/comment-bright.png | Bin 0 -> 756 bytes docs/build/html/_static/comment-close.png | Bin 0 -> 829 bytes docs/build/html/_static/comment.png | Bin 0 -> 641 bytes docs/build/html/_static/custom.css | 1 + docs/build/html/_static/doctools.js | 313 + .../html/_static/documentation_options.js | 9 + docs/build/html/_static/down-pressed.png | Bin 0 -> 222 bytes docs/build/html/_static/down.png | Bin 0 -> 202 bytes docs/build/html/_static/file.png | Bin 0 -> 286 bytes docs/build/html/_static/jquery-3.2.1.js | 10253 ++++++++++++++++ docs/build/html/_static/jquery.js | 4 + docs/build/html/_static/minus.png | Bin 0 -> 90 bytes docs/build/html/_static/plus.png | Bin 0 -> 90 bytes docs/build/html/_static/pybtc.png | Bin 0 -> 48394 bytes docs/build/html/_static/pygments.css | 69 + docs/build/html/_static/searchtools.js | 761 ++ docs/build/html/_static/underscore-1.3.1.js | 999 ++ docs/build/html/_static/underscore.js | 31 + docs/build/html/_static/up-pressed.png | Bin 0 -> 214 bytes docs/build/html/_static/up.png | Bin 0 -> 203 bytes docs/build/html/_static/websupport.js | 808 ++ docs/build/html/address.html | 351 + docs/build/html/block.html | 138 + docs/build/html/classes.html | 137 + docs/build/html/contributing.html | 148 + docs/build/html/examples.html | 224 + docs/build/html/functional.html | 979 ++ docs/build/html/genindex.html | 393 + docs/build/html/index.html | 226 + docs/build/html/installation.html | 150 + docs/build/html/objects.inv | Bin 0 -> 859 bytes docs/build/html/search.html | 133 + docs/build/html/searchindex.js | 1 + docs/build/html/transaction.html | 138 + 64 files changed, 20894 insertions(+) delete mode 100644 docs/_build/.DS_Store create mode 100644 docs/build/doctrees/address.doctree create mode 100644 docs/build/doctrees/block.doctree create mode 100644 docs/build/doctrees/classes.doctree create mode 100644 docs/build/doctrees/contributing.doctree create mode 100644 docs/build/doctrees/environment.pickle create mode 100644 docs/build/doctrees/examples.doctree create mode 100644 docs/build/doctrees/functional.doctree create mode 100644 docs/build/doctrees/index.doctree create mode 100644 docs/build/doctrees/installation.doctree create mode 100644 docs/build/doctrees/transaction.doctree create mode 100644 docs/build/html/.buildinfo create mode 100644 docs/build/html/.nojekyll create mode 100644 docs/build/html/_modules/index.html create mode 100644 docs/build/html/_modules/pybtc/address.html create mode 100644 docs/build/html/_modules/pybtc/block.html create mode 100644 docs/build/html/_modules/pybtc/tools.html create mode 100644 docs/build/html/_modules/pybtc/transaction.html create mode 100644 docs/build/html/_sources/address.rst.txt create mode 100644 docs/build/html/_sources/block.rst.txt create mode 100644 docs/build/html/_sources/classes.rst.txt create mode 100644 docs/build/html/_sources/contributing.rst.txt create mode 100644 docs/build/html/_sources/examples.rst.txt create mode 100644 docs/build/html/_sources/functional.rst.txt create mode 100644 docs/build/html/_sources/index.rst.txt create mode 100644 docs/build/html/_sources/installation.rst.txt create mode 100644 docs/build/html/_sources/transaction.rst.txt create mode 100644 docs/build/html/_static/ajax-loader.gif create mode 100644 docs/build/html/_static/alabaster.css create mode 100644 docs/build/html/_static/basic.css create mode 100644 docs/build/html/_static/comment-bright.png create mode 100644 docs/build/html/_static/comment-close.png create mode 100644 docs/build/html/_static/comment.png create mode 100644 docs/build/html/_static/custom.css create mode 100644 docs/build/html/_static/doctools.js create mode 100644 docs/build/html/_static/documentation_options.js create mode 100644 docs/build/html/_static/down-pressed.png create mode 100644 docs/build/html/_static/down.png create mode 100644 docs/build/html/_static/file.png create mode 100644 docs/build/html/_static/jquery-3.2.1.js create mode 100644 docs/build/html/_static/jquery.js create mode 100644 docs/build/html/_static/minus.png create mode 100644 docs/build/html/_static/plus.png create mode 100644 docs/build/html/_static/pybtc.png create mode 100644 docs/build/html/_static/pygments.css create mode 100644 docs/build/html/_static/searchtools.js create mode 100644 docs/build/html/_static/underscore-1.3.1.js create mode 100644 docs/build/html/_static/underscore.js create mode 100644 docs/build/html/_static/up-pressed.png create mode 100644 docs/build/html/_static/up.png create mode 100644 docs/build/html/_static/websupport.js create mode 100644 docs/build/html/address.html create mode 100644 docs/build/html/block.html create mode 100644 docs/build/html/classes.html create mode 100644 docs/build/html/contributing.html create mode 100644 docs/build/html/examples.html create mode 100644 docs/build/html/functional.html create mode 100644 docs/build/html/genindex.html create mode 100644 docs/build/html/index.html create mode 100644 docs/build/html/installation.html create mode 100644 docs/build/html/objects.inv create mode 100644 docs/build/html/search.html create mode 100644 docs/build/html/searchindex.js create mode 100644 docs/build/html/transaction.html diff --git a/docs/_build/.DS_Store b/docs/_build/.DS_Store deleted file mode 100644 index 2c3e9ff0329f599a9fac554c19d0b03291fac171..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~F>b>!3`IX%4*|M(?5HIN=naG*JwY!Jq!}_e$dF{$(ep`hsgt=df=_^aB4xt% zA1o7qZElAzU<9zDJF)gKGh;sBh$~K*4wv6)e?CuMq`h^(Q~HS6er^j=Knh3!DIf); zz=9OWV|?|opl8yfNC7FZ3uR!f_I6kfAC`AEpJHg%+hK(X&1yhF3P^#O0`EN^{rvx?Kb!w&ElQ<; z6nHTOY}o#6H+-o)TOVG}>$|M_y3xtFoZ-(;024ooKj~rIFTNmavURdT(~m&NpdbbQ GRe?LeKN7kC diff --git a/docs/build/doctrees/address.doctree b/docs/build/doctrees/address.doctree new file mode 100644 index 0000000000000000000000000000000000000000..798b9587dd872d7ae8e36fb6899b5544c89cd572 GIT binary patch literal 43437 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 literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/block.doctree b/docs/build/doctrees/block.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d7323e12d19d8b488140db8c8927ce3c0515b52b GIT binary patch literal 4040 zcmb7HTWci871pjax0N)~%9bCpyI8^4)~=Bz4|y<~JcMBKGGqcq4k2M_YPxHtYSrD< zsj8MngvIfLVMQtr!JXd_0wECcoPU!akrzY0Q`Oyb*{>fGu(m-^$*U;lHk z<^S9;QE_QyYR+?&a8tQH5i*|J>YM8ESJjK^)D1MdHmcMyuiO?mVj* zv3o1tWdKL;<1F|w5f3R^;t@h5-bdtrh~EeJeTd)3a9=zYpNI$I39Rij?w3<{U9w~MnIEVA^eDH!Eazt9}uy5c_kzk!sC8g-w457Y(hd4JA} zo2LXq#2W}wvk=rKmV^Mfx))r z3kKeTP4%7n%Be0KyLz>*{KfZE{)g8oKk~{c6*F$RP9;)wB?uiK$Z*#Uj#}n7F~Zz% zY~9>%zANLJ2>k^{{`qYf|MWU)wf3lz9l8Ma(k=Dvt7eXq|R zyZ-M&5qnmx`}6NjGu{4`ze91Gf55L)^&r0u)wDn{`-=G z^5*)pGEGC<`H~F#99n)AV7^S4kg~DL?P_0c`s~t-*A(^tz9MhM>I9Ad=Mx+<(?8C2tkCUB(=c^hC*jj_4tc|CrgJJEkjq&H$^ZjN%*mRqfQ|Mpc*f{JC$p?c#34|#1jd(w0`MhLvj)*5HMRzgV zx_2~>l}@6BQz?ZSnqelG22?(Sn}~=^B6RSXTu>qpS!q?YB)Pk&K5joLvm$DNhroJ* zL?-K;r6lmcQ~bC`*S{nchL?$oFff4Y5amc29<84AD2Z)!C5;RaJ%|!%*fb?aYAbt9 zLWn1B56&2*Kp1g=nwl+|Nz_l8l!pZ`BC54WrP%w6Mp6K-P)*o&C&JpoJROa$udgv~ zSfTQBrRSrBUyZCs2W4Xz_KY)AhDtv_uV4^DvR3OYR!+roOSEo^VY~5!xjy9z%9in0g!j`v}u<} zyhC%7TegUVoQo7cz;q{7gz!C+G33+lOQf&C$#?uZEF%p2td8KLSYWn@alaw0aAQ<| zBAmV~3p4|IarswKo$j{)iHc=D!&Nu=e?%3*l+$&-L!M1}f|R_0F2T|KZryR5Ds~xh zG|M!?l#Yp#9z8GJHqWmJUFeY(Pb{h>m^y9s5>tIY6bED@fQ2G10d*UNhU#H(AG!e) ziyDb=CG9zDfyvz%}kQo2s-0iD!LxgV=Hp z)+7!Zt^Ux_ntT*cZK+}(Z_287wp<@Ip=BFlmP9Hcat7rl2y9b-jlA2E{WaZ7s2bIY KOHHzzp8p@dS{JDR literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/classes.doctree b/docs/build/doctrees/classes.doctree new file mode 100644 index 0000000000000000000000000000000000000000..76d20577b2e0e27c0fa6c363f33d558d6c38537c GIT binary patch literal 2656 zcmZ8jTWcIQ6n0|o&GD`sr|Clyla>gPvHrOwLCToj6N6MR1cIWKJZ zH@y5a{2osIK-0NVPNzKh9Y~}?W=!)Udx#jPMl;)!?=EsCf9$MIXk zwHd2yMz5(Z)eRlLZt`TtulWtnR5>n}iA~4IpBdLajvMP2+Q9v1m%A=Oy!}+=rE&$^ zNK2hDe`rb}i^TQ5$GhDO0TiU{edjf%rQQdS$$S~FMbd|ao^ABg7MOdaCskQ zXjxSrrI=+Z3Aes0Bx7L4tsgcjTA*LJJVE7IxZLsk6)%h`vSqk+;-&aTJQZh1Q3qK+ zM@8H4{2-^sa*aF$8e{c`O-jz^nwBNkfD!(-T$78a`KxsuqXp1~ZzxCM8#Y$TYfYQr zhNb~D?beK_d__6ee%>uZ%TsX{y}0K`sne0iq~-6y3aNSQ`-WR9iy6A`VcV8dtqRLQ z7T^7qW)9_8^`#h1{9wiluBlZT1spI6{#%-tvAnez0^QeG?l()PGpvS4A&IcCi05US5RY}0)I4TTOKCKa+@d_bxX$4tzA1pQp zns%J{1Ih5Kb2~ ziwX}bq#6~m_G_p#+%ZKKdF0a(UzEylvU#$iNNUNAG_vOBAz{+cB#VJGUiMbqAkO>& zf-&GfZDz`_5hJT9T3=k%P1`M+_`}fQz?XqU(;#vaobPgq(>C zA2_;~sYvewlT$R)Zw|d{aPm>Lu9pO3oz`>QpQM7KO;F#ur%BrpEHV*2? wcXc&8c!ppav|=N?vCu?#9~lgqT4CGtTX6ksh*YQww9n!kYFakljV`(PAIm=-bN~PV literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/contributing.doctree b/docs/build/doctrees/contributing.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f95cc1972165a7a11585dca3058d60e61df499d0 GIT binary patch literal 6285 zcmb_hOOG2#9iK^Jk3Ey|WD-IMnb~w6D6`rf8zB(cfRI*MC7aD+E?HJWL_Ov1va3Dq zuHLHZc_2ju5K>mE1A^v&#NId{J_84?z-Qo+BL~D0AtCXr>Zk2&JXs~u*siL7)&Kp> z(=)&Q`B#?gKi%=Um#83=-H7{Crn+S|CNxs%Z_+n^mOe>$bX$-^$rItxR4)O-V?pQ( z8l{iZ9k!&Kiii=d;8{ao>UJGBJ{~A<*W-~A!2md-(Vdj7JWlm0QP~#onfFfzzQkL4 z#S4j)*u?KfL?+pAcVnDooL5CR(eguB1&(C8@6TPCy$lOa=Tb~Joh^7yhbu%U) zT&3(ZTV|(qvta9f?;}Zt?D23!_KAr30qMP$3qtnZqX#tPanIuEK|r#XUF_Al>k6sT zWB`e*Nb0G8N2Lf^gEbB7MqCXQsF2o<^x3;L8Cekl?93y2WMn#X`peYn1P{K&uCg}` z7tHCiH~PtdunkC)Z9Y!f1^iva-zEHAew-$3o81EV%?zAfV{bfcfYKY8f-CBFiVeN} zAd*TXmJR6)xo}EWxsVx=-9=CpvEKvs@4gzb@6?EGS+TaEJTej_W_9WP^g-ls;Zxx# z?o7x&b%^7IJfaRCI*L)}exTk@29BUHzvJ+jMs^n#vG0(`cVa=MG+V3J?{Tqz-GQwt zjyE&7B#x=r6~Txp2X2uRuO8BY6O$3`7P9!oYop`&)889PoVUl#`K1OhI2Zr_AZ*#tAMJf;kav zsTuZfu<@@&Y!p0S2Jk-@0nhXNz&cT!z}W=-B!Ry99OG?VlBOA^=etwrzVt#U zG}TW)4*==}7t|Ga%kG(7Gcjsecf3TH?%K_}>OMHkcWnRN*DZYJ zBQ)~OACeF`sH!n;^>uqhBU8C^kz(P)$)qBa7>l(G4GQ{bAIsHznTQapb;Ui`3=7OD z&^17pIL54C$hnHpCe#iw7g#qPI|8zMgxEMSlY$Q7We~d_Y64u9c=AfNLqlqJ+(YC@ zw-{LfV}2o@VSstlaSG*zW_pl5Jf&9|3Cm?eZ_=XxvQk7PvH)u6hEE5{2{?0Kd1U4_zt*7cPoSKcoV3Hl%tg z)f+rf)2}q_E2-X|IhlE4{22^Lcd~aY8X6xxy0?29_@@tMF6(oK2MIwjh$sY4sa_A! zqa;WRkhqWaDU6r&g{)q7eTuH#2buuJ(brA*%@AxtB7yH#IkQ6&#ocO4pEA>-bw8QJ zZfSTBtldE6O+`dP^WcWvfpjBj)L(7Ik|sWPk0!>X&cRo>q;CDDwGw#QK_G+7L^oVN zkYo@VMsg}w3Ws3V^jR<*2;V z>m42*cH?8kc+}-$)br^<50J8#>Wk)vdC}Z((a}Q6=!|s>`@3KJ`Zpn#ju?6~Xv|K9 zW~)G>ILCM}plWE*Ff|E*qOHgPF5oMcK5Xf27}UfqeX9&Qu8fU(KhV}_n~3YWY4r!W%k12w*nYw`&CGF&-Ly~P%e=$h zv5(kXn&|bqSy(RCy#P_q@C8z{9pkzMT*iNWCxgRS7{)Of@UXNr3;Ly*%@Vpj^CidLL0(C=>QC&c2nOEa?^kO9|G&C=&jN5w%3j${sA^M|~T^r;a>Er!*;ctL&B! zg{wJRKCkNP+wVj0!lW)IGYRMV{EYj$8O9-%p>r!ze64A=h1LIzDi;ifKS0s*-vw~G zkteZbeJ1N!&OGSf`+>61bC|G(H5 Am;e9( literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..75e1d8d69ec1b7ca4bccc746c756a85fdd23b299 GIT binary patch literal 1608634 zcmcG%Ymg;Jb{+$Qpgf%%0Y)MDkzyD%cg^N@Q+Q| zqWr@aBNSnU!!~VyCo@k~p3JPu>be&j3t;9})%WE&dGh4Rldqq7>!)8j{=&~5fA9E}>6yK(Jszg%UUzsr{o~he zkJ91jTGl&A-bsdo>|SzhIcrY{Wpr&hy_fc~!L`BB?znvo-;J*A5-$CbAV$a2$40}p zLi*}Skw)2M*iM1a&ieb^gX8IWBMATfu_gT=FZt>0UOF6h_rUwT7Sz{uqi-syv=vv>p(^@$@O{ zmo}9nIY8NMs>5X5xtlzYuXguY8XMqVH@)A^_5fg);GjG1Om+tV9v!FCQ@x~rFd>%p z>EnZ8b~kOK#E+_~IG&zvXM>|*_n?E{o_Y0)U;4^b{OjvKa(TBqP6nfec6N9?eH^7E ztsGAu!e54IFHJ`2ap%hP!Z8{ZhtR@z)z$P+P%qMN@#efs$qIzaCD%os5KfN^{Ad%xo0}#!(MCL zNe}Vs>7ZRl9!5r}gv%8OS*^fGl)6?qjqwaSh>LXwJDo`fV^GeJS z?07dBDpUTUAO2xwxo48yY%*S;=di(ka<6-kkQ&S{7f^@l?<4+UlqSP=XE%FbemJ|A z^--_-Z|P|Igr*wft9D-3kE2HD2UO>i^t_Yy22k55?I%!ax< z@&~PMUt2u=Wpw=hWOw?sX>Gu0q0R4gsp5`5m|haU9}bdXieFE`d5!TZRsSn!K!>~O zo^B|kPMVJK#xw0+mb}wS50h@MmF(>e)6od(d4GCtkm~AcO@=U&%Usy|_wULEqEc;`lJDK*Z*x#S@ z+sEsjPrvb%>6!g((%&OH93B5T)Ev9ObEtBZVs}E73O6tw!YP1>Y+(9$yO*fSn?7zT z5{`Tqg1m#)mOe<}j3LnU9AqCSuu%Qg8KR{>qK*9G^b{UwS{O{{7hYfd-GB7qcmC{O z_^X}o>p%Y7|Jdz(p#S*ux2|;F(|>&Txwku0^T&Vo2b~Y~AOGUFf1&fP{^P&D@b%6Q z%pZUEM?3H9KmN*Z{^iN^++I3J;o$r2E|uuf5hIH!`1g)G z-^V{6;Gg&K&lLZBh=1P2KR>`f?|%=T{4r(FsttF3LD@a(9}TDvlY%B5Rga+y6M3B; zCihL$gI@SlyMs^)O%g7z^LM6??7%=tm8Tc;#{ToiDrD>Yy8YwyG4de@@;bjZ*+q|x zK35qY7|EA>th+}}v@kmS`BC!h>eo|ylR@#9-K6~v+BH3yOdlU72dW3?{N2fJ=lh*s z)urzIdgn^#@1cmlF@5Yh+3W~a%f;efI=|WZ9TcYX56C!w3orj8{PWxR=O5#re**N* zf2&YG2%w(cV$Wm&TR#H(_v>K47r;J;5VB~NMY-kgVEDs24ATI^sTFR&1$yxtkpHL- z@`nNB=Qbz9^fEhv(dFC$TWTtQr}LY4&tia3hy2|D`4e~29-L)*d7NF|eEa&&l11u2 z1KIO6$$k(ZJGW{(zCw@kcaVI(CdvCDlAXdO+a`QY{0@?@)FYWp&-AkXf$af0zlLV> zJDm?Yzu$SU^M{>j=Z`ucs#@s0tMt?Pfs&x}zUG)dGNx`s`Exjcv%3>GSagV8MB3~# z^49lvrl;vatBW|@dzz0|;9QOGdD3)sh^jDD876~{_Z2u#7e?hV{)X*z@=EFaeW>W| zh>FPb(m((`*Zb4Qz%dzikKrNDB>i?L!|#YQJ6GTo?%n|s0CysQ^y-#=b-l)`xAd#4 zHC}yPz0>*r-JAG>^mupI{GYb{pWgC*3c1S8??KF;!>d&-GOV}nm+S3kBY>9P{&bC3 zjoyB`#;ZneAJo&^D|hQE&T{;P&Hb;?-QS25Dy+K?%60eGB7m0e{$urONYroP33^VQ z4)I%9S$|mc;U7#NM_)dq5bLLoU%^nHBgA(Rri(C=elStvyT}h9T2w<2ikj88cYhaU zx%)rRzkUz@LI&Y5d4L!WL)bTd2;qPpy8`5qgI>0asQ9r?cMstm{&e18DjPp0wnbyRP=8Gy{eH=3CQ~J zs;-x`D(tvxZ2GU%L`CTHUZ|pdUr^tsWwcS4^}m7$AN!$dX~SmyUb$I66alo%`j3=O z0@A)Ri|hL&_2$Eg9w}VL2=H<~Hp-Ch$i<&VUW9T!9g(Gua;BfULgOkf&{Y%&IUf@h zQh`VzrW<-G!e{C36E$8nruV#hbrzLg*g?8-1U;I(W1&O$36yptQnFe~yLg2%q$6m` zP+D4AiV#>@`iUB^3N2N)Wz+1n-B!P9Q2(#`&3+na2!Tqg-|UNFKwe*WAJLBM&qVYR zuA^yrtN&9GK&wuU)T;quXKM8qmN2>=rW=IPhdF{|kE{xCbd{7!mgxy0~uXzag;l(Lq_p1FcN z7^~|l(O)HcOK-msp|SM#_iDU4H@&^!jD@LJ;c71|t?Di4@DCy-uBF2luM99OznTxr zRe!=ou{8NVN60Kq{!cYtotq|~G3`{(o&=Ow@&fdC=3`Al73s95&vL8P1z>BmjqvdZ zkEOatYP>2`SKVot{zZGp>Q@cwy&83AhDsj>T<%Q$OL_7qZxVMe>HcOZqNlLwe^}n% z{6qxMs-r)qUJVF8Q-5=AbJ)E{9S%I09aPHSVYR!FlGYJ@dj85l(~-jzA!927ZzXtGBhzX6R|oZccW4-L|V9@iVmZZlp}Lv~vzVk;pvd{MiV)rJSFs@#@@^6HBo} zF@H5uo?41IbH(%w7@?D_W|;9GMzAfl{N)<2&P^?kZL2ADD<0urppbtYDM>AbJbp#H zeOnvL=)2kH@a4 zDRkTY{+S4_rHVgQ<5i)G>JZvQ+d4k1e$}9UqlT9=(e}H6fODp3+n@E!{odWnI?Dd_ zhuwd&35<5;WcuxEd>-@b)N$ZG?C>zoB)qSS3 z+UtKGfwvU#-_>~4nA3lwbv8qk{ld2<-S#_JdA2)DhDVo6=CP~Zg6{s`NQrCd?!_zL zp`u(hMY&2j?|dzhrOE$0LS||5|E%%q+%$O+nK4>Bb$NS?wO*Kb%3Igedjy?*`q3tF zg=}imCnz6Aq*tLUMQSPPr3izis87^*b#97!@lGch|I?rO^P|iC^#0{;|FT|f`Rc+K zFaNluwCCxy&j(+E`ffx@T+8I1yK)~KS4US-5ZK#QRgkN%Uj3roy(~qTEH(Z_jaTQU z#Uhcy(^dIk#*t{VTL1 ze}{TLjFhUDdd^=FD-A9Ed_Mwj>F50#ug*lD-|Dup`@lA$;A3d( zZ$-*jOIuH0!JY;pzY21=drfXB?QcX_ET#Rm8n4EbR)0S1$sJnIdwFC3GOfy^4JKB@ z3p|9zem7FUS{l1_WlY3Zvwb!3tB5Uq{Z53#($_yxuLgpwyZ;aopjR|d?zK)pwVlNM-zsnWK;T0l(g!140|L9*2KZbvOjQ;f~{`C>B6}kJ* zpq=SYG+Za5HkqhZB6t5eaNgL5UHpq0b!LVay3T41FLXRu{i;FL;db?_rse#t8exeYb2GYweO1ge@? z9drkmvDW_`+Ch~IJ`F#IMcs*%ypAfSdV*C=tb+b3(_7AFCqiQ>=vy^jH72&Mb?IA5 z?TP89Xkr>$vM!sjXi0`e!N<_rPe;mFOKVT7X=#vOEeVqzL|81PO=`R5V- zTK%d)y;h?DrnSExF#bS_qIMn1mCU)#-~BP&*#CBoi;A z4BL~`9$H%Wtx&L$rSrirs)d{8kFbK1wsrNR2q(0pIk$Q6dN9-}A zHJ)HI+jOzpNnUJwdT28JSbH!~PtH=3 zxivaE+|980jQ7846zn_2Thqt3_0xPs`ERaIPh+=Zf4ni=pbfkE{?kpYO+Qro(Rlai z;t*Tnu<&&+#q!Xh-U)@k2m7tmqVe_V#qMY;wV!@Kn^UlA^S8OEKXg}B)7^gwb)Z@w zKg{+fv_v+4j{QTVd;J`n@6@<;!OSNku|+G@A62VUkKa9>zUV%t&9wuy8*h)^Je}{q zp|_v*-tJ&aWR2I5`SM?T&O@VBd424!s)2YP`%%5uE*eBNU+c;Gg7dUeRK3k}LC-S- zY9T18_f}BQkGsUBa-P?3F6uo}Bw$fh&xmIWyeh|2!X^10O)mMGde(ob6_oIK`J!1U z&y zeiM)A4eJAJ|C5+T*zSmMTKAG(7yiI`$5bN25Ta^%y2_oGjUfTBc&P-}R0!1;6*ISV z2hqG{9@Cq;ex292lzGvrFpbzbrmABH&@|`#oh-Lo=S9=VATqxj)}!$v@cW2M%fL*@ zu;FP``i?P#J#1;mPGO4F%g~G`H|?TKbw&UfZ+HKwl~3b)hG5D@FSM`~b3~&O*H~WG zh7M&YB@}4IK5O@rGy0QZ=hcx1XP%8-9m2agdN;)xV(&F6D`*u@YHU5X+){JPE{w4+ z^9trbu)PaCt^3-iY$O#wD8-k)Z&Z&18b)M^$ju{9@1dH`Nie(dc7%=9Wo0sLS8cwgchvqymrtsx9W1taM?EYP&BQnQ zoluF5?AE4F?By={l*!%4AE&U|w{ZrG-X@Rm z^F05JjwPTVbov+$JV`OhPvQ2dgS4*?QMvp3;Ki{|9~)U!UDpXOUdqB-d7a{I9H!bp;l? zZ|JCm&U@3)&(m{a=Qc!mI_YL~Oog1;?7Um@U|Kcl`X08sV=pRpwB=Qy^lvKR-Q&Ce zJBoexUnm*zHxkxJj9>zXmCzYD7+m2v0Q+xv^Z%hw-n;up_z(W}&?)@w-MbItKks7R zM~$Q&p>u*j0dTvn$a{)p_-06NE7Ve`yQ;MdzDOQS4Cl!Izy6KCOaQOI;zBuR0%nmLq6O zX`%0a)cNi+MI>ES#vgM&`@9%GReky6&X@n1_>x9mRbO9szW%H=3ak2V#rf`Kr!|FC zbJO|eQ#3lOB6-94;0w-3t?Ju#{x;Zf#`;0pf4SzOqK6_b=OT*thaK6FZR545qfAZ7L zC!h02t>F*XJUb05Z;V=Fz=L@rTyTyay@K=A{`RYeBk3W_U zfBx?{pMRPM!g}x={^;LxK6)iI(hh(6mz+;O$9%=GI{e{(;C%Q>@d5dbs^b1f&Zn2{ zVR@MCSKLqRQF{23zwUlw58A_@{7vVRPs=fU_@lq=e#E12XaV1cKl;1QM=$Y57zl^I z_)ncLXeO2i@-*NNfAya^U!kECsApHJs^ZO~y`E`DPf8NhSoKIMJg+QS5U-P#KW+2J8;4r;*2j{%1 z>8a^s-9vQ*=Jc#NY?e-w!||#&aKsBuf8FkPzq70l+{0RJgEw8@0y1lxwju#%=R0n0^0KhLVeD!#G zozIk{vl8utDZhNJeKi?$uR;E!4o~^(#E%-n1a-j4Kp9VM&XB<4bC7IGI_BE$aF$yfn0zvGOY0i zPR$KKN3C(6zALaT7zTd=;KS^@X@47iq^I?NJ*IV>ifX}2Af|x9-!O;1`V3Kn=Lt`X zMu0KPna!iu)4osem6!-fRu|Yg1j9bNd9->s$cE#VR+G*qkA&x0j!|?KLctP5WX5N} zNZVX+sPS5gHPL&%OiM9BoB@juEy4gG^Px%HqB9u1%8xb)3UUgL0>nnfVUkUd@tK93 zgD~>>&7(5iL`~M!jSXbut7!wj>~VbcVNrT*F&c>R;psNETdQ>3^vx`LM_5y|=XXO4 z2a7pAp?=>&5KE`faSPncR7fNkZ^g_h$XJHV{Al)=*%@F;p-E@WC!X6qorGf^=yE&# zPPjXb>eBB{1r~F_xdi=V)VT=%m_sluJo`57b?~h$>e)y1U14Mv41<3X;Oc-lNHoDN z^R#ulPx1ENjc(f869(|jm;vBQik{6@fy?xe4Z{YoE-l`=CD^_mW9#<2mS3?@7#me? ze)ZA6(Fk4RF#b~o{>ocRE1NrNEMP_F(OxSkLaP8{CUn0n$<_+S9vE_1G(Xl%7K6kb zPclbAZ<9nLtB@=O6tm>@eQR}nMM%-8z7+~%=k*=XQKR~HG(=@53vbX4ot9z2aN*Iv zQrGHZNBh??J}a7d0m8^o3kJ_>@sQVfM{9MWzbxEYtN|DijR!xB5wYp( zLa-Rd#*R7yz2w*`umi?CRPvqS3&;kvayzc9T5I+$!e54_8?+C5xVL==;!-6{@+TS2=q!MK?ti|o6)zuBP znqDwQJ1o!Z*hsldAQ&C>+d49rekW?WR7^BF7RZ5O3dnFB*FdF1#FRL#-fq%S89W9X zi3#90@?2FwQPDhNRkF(9F%`)|i}eCD(aw=*+;o)#k2bQzqX(g=XjSO*iRqAyqBaUB zF8;?Y{5!ZT3~O5MXG2`~VOPp(%# z%h=dJXEbL+!4Vz5mvPvDOo!lwGJS#CkBj1^`kcBaY^3QLVSC9w2OF6c%J$(pArpB7 zSXN@y?)j4-B&&*2ub@PiHN4SFuqVehu?8+#f;lWmV+JIOj!4@jc}z!ps%C~+fFWM% zNPt?_i@*8Ul!a`9?dLKbY&a{Gg$#g4omD8C8Gy&`tB}P;-Id?v-msv!b}3xWZ#DrdvP> ze9D~937?^Cd^K)x@lQP5Sj%A;n`(f6Y;E^&K%?Ec#cRMB&p24jf*y2TU7`}Q-6)A? zyAq2@kQoTHylD3ja!*d%L(HLnS;Sp)N!~bws-m+wuCWFYSr&`~IR6?_S+u|KROX^F z5!wcPdO&Z{{=&^sJ37OB)V9p`BC3_6<)|ldvScAVmIGDfJofX|(fGNVPXjU`B9fgB zE!^?Ds%W#6U6l=Eqf=@zP%%-1cBD|bMW=GmQSD&B8$geCf@E1m7-*qz(b3k+BlBom z_abwN#UwD>H`*C z8m*-@rb#J^!UcG=waAukp)mI2wC@({CdA8Fx85@((zYDCzc%r$LeFfhW+99VTsqWIC|d>CB=F~y56#bSRim>j$j z8xdEq*_cd>n2lt+-KV3jeBq)AVvo*7ViJTMMDk|h*G;r7dIXHZ;F$Zjz?BHLpthym zJhAc&nTN{cpJH;H9f85WsWOzuTyk%-NAtP?QA=Q%9!~x`<_KGU!;R`yPN!KYjE#^; z{ff0vr6(wi203KrePq55^USXLVG_DY&9>ehHTVWIlK-!?%TVG7`rhMjdVm6=N|A zW-|=ScK5p}Rqu^#h|SSLu4r1jgv^0t&O(zr*_<^g0Byc}9rogOYkOyFb^UcAVbmp8 z&2O~|Or}IOi{`lW((gsp8l2V_*D1a)UH+XzGNCX9E0 zydLw?aXuLsAWLhJV#9`GqVc9zrA}BO0R|K`<}c@nb6XbQ5DixHWU z*9QdLSaj?ZB$DpS*xX3N`>rbZyf=D-InkytxzeA79 zX-_zcT1M@ent)?za`Bps^5e3i*@u^uDlyXva{&LRidUWTE5s13om$lBsoaMKXoT zYhf`9ypLIrROU&ey?5!dp@28F=rD&57p3;h+LhFt&H`lVXqA^hMm z#AH$g4i@P;)`bZBh+1J4okC+Gsm#zGo0*i!fJ~8)f!tf=!V70ZAzjitWT z(VOZhP}@G5tB=u`2oVa`liP-)$+l8q>=ta*4<>%H+FC_Ak(3nQahRbUL=~&3v6Z9D2$D{CWVc@Q8b}wc07Pg7#=Q8 z__P(%2p1SGuG>nQ;M(nj^{_n$JrIUlUR3MMdLRtOC7Yn_<4tVBTbF837@OJ=VWUgI z@{}9HRCXHC;EVR-Se?BC#Vn+8dUW!d^x^HAR7+en?#kf+SCQK07ab)9$_{W1#3e_D zno8boUB~RmsE5AhADl}Dq_~eT!|T!iILUU>V2c1-S4ZX zbhNC^8O=fmg_U?rhctnvyM+zulYwf?f-D~Hg(}lVV=4@)H5COZ<<28M8VC{km`qDi zv$EH%^Z*NoopxQzuY0zdLorESYy8AlWV2e6cmcXHAKaAA#$&p?$s=u%CWmwcfTPA{ zOEMx{QM25W&fxfIUSpmmnFR>-QwRUT%lMJ`g{qklIo#hQS@-k#D zf~rYJJNK1%ofd{cq_Y1d7a43l1Y*Hx#;FH zS%55)*}z1{6;UQHm)Z8v(fOTH(F7z@D(|AzNY9ru9G2`X3W&}fR5CIm6IwE^;uyEZ zk$yoKN^=r8j3v0m+mq%%VbmurvtyJ$O6hN58g= zbv8TQ!_a^z+HKPsoiV;GqHqU|%Mas|PyF^3HH8?NoTPrvVq9L_S!q!Y`{u^&En$Dr z6-*VR5|t%|f6gV%-&k8++S=G&S=v}%7W5mjF-{$N8=OmlkT+C{_1img4mo;yOT7Xp z+)D0%@N?ldxXg|4u#kJ@*3P1;_T|O5w}sxLOUJ6jmaxqHa*)}o8(D&H%~JDu2?RWs z1cx^Tbf6U_3lR+uYN>&dncucO)ziR9U_O+5jHrZJ>fgm>ZoAdfJ4A}}&<+QJd6rf$ zQJELBm$}Z#(ZJ#aV>FPi&@|&Q7eW=mwYIUob5pQI`|${yMr1yW?gZc4D~r;JMkAvL zodRSwy9Rew*FFNjEm4`*_S^XzR{IhPp2cqm!MPN6+p%7ptKW8UE4kp*yNMziB(TZYX4<+m-I=xoHlY?+|BkSJ2^sZ~-YP2C;{9DIn}f=%)Si@Vc#g>q zcaA3BBUBL@zz~<-cP)gQjmrRrxo8jeT)7k=b191_`+yGb46&`>$xy{xaFr4nk=e-R zkxjyxMGtW3le5|-I`!e7%~1d`1Nm?;1YAUPvekzV`0pIscMfqMgpaL3ssrUofHnRy zTi8efg~Hh6u@x=-N;89W0EIBFxK9WOA<&r1)HSU|9OEu)Ij`2Bt_vV$z}_$|O@_Op z?e03dg)>yu1j5MVHAzo!(5pC~Uw}uKoCd%dhw-@{%JSQa?6xyZse zjL))|-{&NYL}Mc{`5rL7yBmc0Wu@|6H=Wt;U=w7qcAqxFE*G-=qC27 zKp2@zy_VvRR$*67O07{Co9kQsO0f$Lba+*8G_hTY#$3oas`_@jis*8YKpP|s#%0Z~ z(=DB|dJYA`$P|;1=Rh!mGg6XCPvSS}BP=Lp;Wmv&b7|9z!}wgs=Jz?ZX^F;MTo>LV z-X^U;Ea9c`0@cOs0Y(3!o}&wd0|sPZxZI46b%hgW3Zn_Sfnjvm5j-1~sO<5+Q&Ik? zk4qo4(}B9~wum@fK;}YT+&ofeRpE*nTH!1BqN@@r_yj0(BJLzkHDR%h>$h=^t{{xY zon?dqk=bBlip>kDqV2JiM#NPZ{}BEPD}5~)x9Q4l+qFc;KV?)Nsw35n6l8*`u~Zt0 z@zINrRDr!6(FxBoSqv64pbZraa#Ke%OHobnX71}TyF?u5;h{)xH*j=BUq)l$u{7B4 zub8^`(muF!`wN-ES}gBgN*aV_e$%GV(dF#IEE=~dfyiu_UFy=6Q7j|}LlVLl(lMHclyIf?} zxbJd7nbXLH$H1?#{H2%WHv18HZ3M+6INt9xXl@q9Y*I;e5Se-0o#0Y-eqxY z^0ReHByI7|M^mK229d|H>Z-)GMb}4ExHiXQa_w9x;Vm_k+cRpS5KT~Uc`(j4deA%9 z@E7N#_2?Sn3MJT>%!qXvKI8Uew@tG)!k@3tAiBkzV{-`#ub>8o!^uDfAG3Ic0+HEF zUk#7pU8~Z#uVygjK&IR1G|;@Gv$_=(=(Oa5CyV%Aq$Il)rvvQ0jSOZnqJjMzkGrJjGQ^e{>+IVzru$aNLH2v!U_pNp3 z)Y1eZvzgJ7{Vbr%#-pVGE;E}EKD`mhRWu&qTX@W5MjLAB{q6oR>5gb0yl5JYM;k6E zb5bqREl7)PI`lF{dz7a+My*Aj{OMsa54C!WN1p{OM2n8B%b5%sbCD+_F8UX3X%RG0 zzwF<0Ai+XnM7kQ)}}dNaxVRrjm12LOqh}xrE}`H43pDu6$NSfkKin5HoO_ z(wZ8Pd3ROPUMA0@`+EXh0Z3*gd*F#4nqgW>CeE>}%|=Q-CNt7VNjwdld(>>C6hdWI zitX*^suFi`e1fRRX0d%3mzjlzVLo%$aE{50Lc{cQ{u;JWnN?^Q&p#3k3tVPKhJ^C@ zYR&Zx*;=CO7|34~>kDicM#oH+`k8uf+~O|mCAyL>0M9s#k6uRMtI<TDn=<>$x>$g^f%HlM=EU^}ux>zg@f-3VUv>`U?^+OlgVb`?T zTgxP5SyY_BV%&JuhvZOeJMuvnReb^Pug8s!7=ltL4!N5Gqkcmq7P{JDQ#1?>a|t|F zTP_zRu>;$co5^K?1&IPS-JHlVYIOfvfoQ$nj8k-PO;B}=#Ilf|QO1A=Yl%DvAR1tl zF%VFYpet`lX-)tjCLk-L>l!JJAXllc789*Mnp+ADc0!=cN!~_X`huPz&`P6KGfHh= z;~+5!I#h?mZ>!O9cNLRttz>L@NwA1SXfWz`N_Yr|kvg1MpHu7 zG8#nYBL~b{bz5CLYALThyX9fR#^#_Y)o)Fbo|o*34n!&>1E0WU`RvvRZ~0NQMhBLe zZQH>s+;rw;I~F7}+ARc+b8EIKXK5ieCUe58zP@@(U11pTs?nZEj@un1=0JCsKUwK} zJ}nydmXH`IX2HD;ISYKxPNzH4DFpw1#;ETuVGO`BJ3ML5&Ud@m^%iZ5C6tWCJXk!4 z>zxBt72TWRUhix$7?=!!f&D-s8ft~nWr%>A|A@kMQ?JEVJb2i)b3!vUpu&IHx{t;N zAp(KMN)D?AXhVoPd&Z#8g@ zV6^`#;}nR@2(vScOBj{)C-Sh4c&iEPld+fu3!e7 zI&+87!9^`rYXT8|FvuG)pXeg-THKBeVJTjapBmI=GVb&-*pgA-R?Gp^Du%@8S|}`f z<-vH)7A+B(5fPw~AKiuiQz{n^N2BTzd2KvqD=ZsN*OG&7J1~H4YS|7Xa|#I+=T0Km ze$OCbj>l|84N`IRRpr=TcCwhdT%#5uGh!%fYEb`2P{pH_uuC#f%z;fSf5XV-h~f~x4~u|^3PmvvBB z7~<$G359G;EldD1A5!nD{XHD)sZ-{55E_l3`;)`nbXcUPY#_$RNQy$T)}eBP)RPL| zRAIZ=agE*&dvvbtVpS3S!Df<>%toHKj}z4T?NlEu6A&vJ4IZX+@QFNxI-EE-0|gMI6&BpSnhd(vBBTbAS;^zOlHSDO z(}FYZ0np@Z19rqvfXt}cjPt^Y>oOvwU6&yVz2g;Tl~5eDpxTNfp-!}TnvKUU)ta?n zS-)7mjiVRL4t7zE(IYmx_|B@v0)?@WTT$4a{-Q@B1fYe^&@a%DKdnVI1{TGRPWJck zVNq-whRcl{u>N`EUpgM0c?rQA9L9&v6~5o8MRguPm$S*}(F$xo?-Y%;%Lp{oFMsx- zhaaNJjg%e^FXv~FSgyJHPzq+%sCaOIe4g_d&pb&$1MQl?B1;h+& zS~T=L@rg_!5eyFF=Q_eUa@Z*$JA+0NFc33v(?kE74&|t^Nz*ehjE<9XR2{o6KAMdU z=*D*ItoJPp6o$^)wkA!Qak$*9cU-zOAKT1>ukyPMBm^U1^`y-rP zl5R6!b_LrtO%Tc#0f|8L;C_)dWBASfa}xd%nH|7&F-#3;4aJ8go1!ri62O*kjpB zi%wydh{ISxX~sA^NP51;(r74Vv8B1)@6r`f!ofC`hOwB3`+2H3^DK~*Zqm>Dh|Gyp zNnTUJ<=fR2O_h{XmjGl&O!5R7=|`c~XhO3Fs{&O2cSO1PgJ90?V_bYc67R&MIw-)Qqy{N-8l~ zQuMhj>CI$>Lu`dcqb|5qL<7b&$c9RqfN0TZB0}b<)3Qh!cgmFp%`H-6v0ND3vRvLN z!ck9LDvvlz*s7shY5!m>kD6>=Lk5f`v8>OGume@p+~g%DlUnMd-c;CLbM+}Grm)oa zrhigwbM+Z8roklZS~47Uu&tObwY-&##=0M)ZiseB3E84E>4zH2c8HbWTnx-Ii(;UE z2^JtaW~eTJ4a?LR*V@z-(#L1cs-$;-nI6ZFh3Nxk96kTDQu?9*j>kbSZx>;^gM>^_ z`_UQhN`8sU@?*%xfSh&Krt!NwwKB*6)tqUiA$Eua;F#!N=@Yje`P!C`cxc{iQkNb`0+ zpP~}zXDhiMFqwFl7f?&8$pvr*`)>_xFrk9~czzwfNo zjYmuhqLk8tE$7w65Ds%5yau+MS9fl6=QXg*tF4IZfF`l8FK(|0)@c4CQn5KGbIQ6^ zk8j_&v9cvtXVtL<%e)kb7dC|sjE=GB9!#={Y&P+zq}r?`GPBdTN-ehww4G=k-CaN? zkeGo6^oBvKd9ZU!HCm}$5*S2eMoRu@#(dSDO%@-?IqMHyFy>KKO65|w1_zh^)$nye z!N^W>K;|ptqQ~1Sw{8gAY${g{#yqMoQgXRLO^v=ND2^T1sF*{cZ>PO|Awi9vGzhPN zxbzec=q3N@ev6jA3W|6eRQKu$ZR=t)lMOar_dzNN$b96Tay~3jgp;5} zu~N8rUaXYShGb5xd=i{%NqZ>I1&=Q=ts>NT%tk$VE@7aXiH`?Lxt!jGJZ{dU$A3X} z#z(-Vj1DTxC~8r^<12NBTC^dVlRUhZ)?bVl_wZo}x=QL?V zVWb(R?p;yw5k(1)hGLE79;CIT9=tja50Yc~EVLUCJGbY;!dT2wSR93wV8LRK?LjIJ zxNK^14kUA8rq0xnd_n3lo*@obmW#=(g=HYpan;$>G7J=R6qZ2`+%07d`xZ)pC@f|v z{4SnQUe4RK(bVtSc+6IKL+fe4|2Fl8J}NT{ZF)yT%%Dw$#VizmYL9`E(35~{@%S@r zixQC;DNf57)m{nFwBvDFDVYXi9*Wa6&&lJoFohkb75y=O4d|?Ce_Wuk97QaJQ9f>^ z(!H3_S<_fb05TuyNAGxTE$)u8-o)8Z60IM1+m#E(Jg6Ujv?uqEMC0f(3g86L`*T7E z4x^*?x$GleS7HyMqP1TpL5{{uh))btgZQL`MaC!S84Sa6_uip%M|ZSmD4{S=z7*l|>=?vRyf3uggQw(#2P|=vKgv^2~ z=W+~sRxZn~F$X2(DpO`O(^D;<4a;((Cz9N^MxE}y9KuC=qH0=$$c&ikl#ICJaM*pY zhRbfdgPvT$5zQ}EGdsv!0>pw&2}0b_STMrPn9N#uFJo>SC!AZV<^vitq3@FNZD#kK zd~meyswUHb%!kQa$+wjr;?DLxhclWTt>!F1nb))3t-0H-L1aeHa&SM2-)e5#ync4HWZ#fg9GkQUSW3HmlRa?e|V{h79X(VPS`rOq% z_G3sV*R;E#{hVaT z!B~c(Mfx2`(-tXvj-pR2yt{2=O(XgOjb$m?O`wx#+HRcQp{SSKh1O}Th2PcS4w(?=PJ?LqU3?3N3E)XUaATVe9TPPj-JI)!8w>_Umnt z505tJ67A$*%z*|#9MFIJ@PsD^mQffiX3%x5YnbX1>xDWOkSj19X3cgbTk&f6Eac$7ght1T$jv+d1WPz#eO zF-*)$rPksGIHSg2rCb}7Ny#vEg4Ai_d1FgjrHW?jhKpI%HXD14X z@r#0YI5Fz+v>l(a*jh-c+)?Am04^`jWRnzsum?$zkDC~lMb|ZvnM;f6aJZ367(pB6lOsnIa!y%gvD=oMX7v>Dwy<{ZE&CR)T zIOZyXxz!P6^u-`DI=Cz8sST9R5jZ)bDTi}zL{UHb!A&H2g)B{VX2JRL%wyxJX`s%= z(_$pzM%YnrS7Ft5d|lLhAh?cdtD3}aIhG`utdgcoi^;4-v`Vq_{G(MLm6;10p?Bt$bzv-KDdH3JWRCHPL}W%G*W6-A zaETbQuzm0Jou;-g&fY0J5ELdnL{kq$IIN?h^gBlb*?%@Iy#iwVV#Gi{tIVR1Av$6x zX}1L$GojUP;>a7EX1|TQO?s*N%gK*!!94O&r+d&T@{}d0%!|`g!f)K@CC-dN^vImL zjHkyZvP|4ba&#?G>wrF2p z$tJmQh!1gj6%_TYVGf1EwFA%1*iO|%W4m&6t6q?aE%1FcMWf&<5~(F)XC$4^)6mWe zFxD5QdPyGaw@zs>GZqxy$}+hSC7KBh%j7~bBRpq-(HF6S=Pbo#Zqur)qHXkL2i&k# zIf%@Mg%(bkz~_q^&80*&oWn9R;xJ;?-Lluxq7gut&_ZJ#<2Q;YPOEF^Hv}GYA%`wy zT6y5>GP;~2CK`h>tB^3z!_Oq4)3XZ+^|LukXoIqZ#%Bg(Yv?l_sf^FGsqIN)R1t*LfrF;IxsOcjxaV8=6IfIUuv?mZWXw2F`>Pb`fn!6=Eqc zX2JL|*B?DlCl`4)O-1JlBXk97C9ik?)LeMQWmJf^q`V~Sw$N=f+KLIQAz4z}LU|@` zUKYxD%w=0Bp3T=nb3kUZEz~oaSu9k6F^g@XX7lEf?f`i2`H2+42M`Y8H8%8nRn7=SAn$ zq8X2+vRgEs&9_D8fXrssl$Y0?rKUt~*S2u~w#iv6T%)lxIEWV#((!4+;$Dkoz(%RH zI-3y~6q{)1CqJhf-x1`(Y77_HyF|AEu)<(qWkM)%>0yh}*-1|!5{rp2ucuUl<0`%2 zGQQc%(+x~hoeX7_Mh~C%Bw!Qct z9gMNt&Ds?hz+^$lT@$gb%MgbJ#zdq! zhseqB#Jjd?Dl554-c6CYmKtwiAr9MGsec~hfIjla`jjfs$fEkfIX#n}T`3M2>x(Kz zJ-X5Dhlry6OPI()VAY&qYTLs`Zb#0_G^dEGuCL1$+W(#=zhE;(TuV(B$HCW zbu=PBcPAP4H&mY`>?a;@**o8TEG8m*b&2?vJX@<#`NU@RQb?wy_+8V!6%a1EfFeZ3 zKukeS927V+;4m3)k8zrjTm%x$@_Hl!s*EO^$ie9hGz7&oG^~O&=-l;6GGPqyV8k_s z0*48xZ`A}wkutLzokZ}o1&SPrNwAcONU$-6A~-f|$rN={9+L;hbQHgV4vhuXM8H$IH)cD}vZ-_HUAfv6+iL%=%j9$I0iz+yq*@$KLJ1Fxeq z1Jy+G$ZKNj46%P-N1tjiF4{*lmX`MGgRxwQOYDc3qez{zQKQjxIh8?UE?At+1rH=- zin`)*B7$NTHx~Sj>Yt_#L$LfR~8+p+Ms;kQkqAA^+9) z5K*hEB9Z<9J&$6dgVE^^q8&wjLkUj~#`2*1*`c9iKw;64#u=>GI1EqKUcmeMipo*W zA+<#wK@*iGNTb8}Fqgn%xez>Sy5Q(N>JfrWIaH9un^kR2BBoNw%#`BbU%eq!w9SMC zaq<9#vO-fI4dq}cRu*zzS`ODeN292q47O(`pQ2Q>>24U0hOj|w1;gdem6MNp?J-|7 z<>XLIl2+lK?c%#)5MiNk!O5fN*uIB~*FXt@ z^iMepxs#=&-I4yh5laEZvQRyfEac|B>p-I8p|LMX4#W&d#R!Hw-EoHwP?Q76=<3f3 zssfQYDN-h>%rOLu-d3=9FXBrkz?g|^$vkvjNt0T#pqPbg2_Dy9mDr?~av)})(UR5} z=9*8s_b*U4AW%4r&w9cpyAuHPMp=#Vp+FSGQZQFNyG{Nvqc=j7@HrG_*RR zvqAAEfgkVpe1j^Gn1kyXQwrVvuCwpENj>L4%)lC=1CQjf?@ctMQ5YLL*i9C4Ic;Zq z>B?}JVL2#9tj^#ux-%#=rH|rt`||M1t=Pn7%|h7tT#~RR)SGhh zb6%P-(9DnH{==FGq@*_Irw1odRay#|%_!@O_A|#)7x19C>udR(+Gu z;9Q2VJs==jaW1%+mpvG0<`35dUit`YqCn?TglhuteRMUEgL4^*nov&Rqw!GzXyz|` zl>L(JL+oIF79UlH&m{?KV$MFwD@1XzP+^nKOLO*7VRY6)X({I1GMrMB`Y7kU`L>K8 zIBOzo4`@L1^ig&R3^enHYXUEQgf&s1b14cRPs#&ShMEC3jwdv)G)7GQwxwRzK7fJ}!J2Ft#0JD%EZWn782jW>CpWz1$d)N3@Zc{piGO^I|c39 z^`-3qX>^@f1*rwel%KXKx03sYe+BFJ2Wf!*Td_{Ng1!Wvi-M$GA^q*8?bn1+N3*~c z#0rdQ>=rwsCrjBtX4htDu>~O0i57c%=f;=58qn%2E!M^?BmMHL^C!(QnN-%_&W*3n zul@*(XBic}soX`V2nLun24}gz!Xna4|6T zf})CN@kBWw(}_CfrvW>jrH&m~rp8)p|VmT~>&=Z$JZOskBfH4ggoaK_J`BDE~v*;>_a)B&FCbYbX zE{Yiu3GteH6N$;B*1%4`aASKp-A`~ax1eo4zH(8S*zzvUD;yozt*^OvDFNqVSW%sR zQ;*7o@Xez-0a;F&wUeFI|peCV3yW5EezC+qGPjq7V}j2f7^zd_beggKz-iWMkWSl4I=>}^xNEkY(yrsQt9LXX$&Okny1nW zJSMY}AUIK44mg@8K@?Pw!daC%3k9HYPon2C#%KFncl^odIMz$7c1@P~v7bo0Ygs z?ii8DsfhZV&4?J039X=!s+;GM1Y`5un1EzTYcN0?bSc%`^7i63PrFJ?CbevqUbwZg z{`$^MA!TzTvH+RRa^>{Y6R)`|&*7NL>S(d%GjL*U^NzN_V=`+l3=h2}0L|yZ7>$Xn ziBolhMW0M5(Da*6oO-ZKZP}-O$DD&KtfjeqN=zoTBA9PxUAgzCd3d3q0u*not}hF5 zno}q!rm%+GYm0BSmToR?wccF3bz82^Yd++5K$#XtE^zkQ-C!EscUT%&*!$J3+SyuJ zoR{hp6w6>u7Siu;i|T1US*Wp?#PSvNKvj?+YVIovJSMYzAQorOGn~!gn96cXIFq`U zIQQ8$cT0@ML{|T7-P|Zt*t~zX5t-03i|s+LD<=t?n}x<=6037m4|?6cv;Dkz=V$>k zon?jCDm?NRmo~S;0xv+elXQDHHm@x&r*2MG;4xXT%D$zx1?=OTK8$_4he>ZI^OLO6 z<^HA4sSKS9VyQUapCGJs2B~?^O+FB@`s$o4l;CaNS9`E5r`0^}Y~jpTA!GCAp|P06 zQl>hs%^R3ES7w37WRU1in!Gbi_XB5hL?ybfKP`46NGv8ngBK4rhuMP@uE(ur(tu2d zo?;kAT+H1iRjeO;)Y%UbD;LQ2f;&|nO(?iG4oVO30WCR9K{21&6vbEH6$}4Nh28pjwU)F zjZr#TH!|qum8Gqf8^S)KkQUnTJaLh&yyI@;Soa0}kexj5~K{1Q5rOl&pC+pwL9FhjMWFavJ zc??MMCiXAj(jQUfC-oQ>45L%Ozq&rJe%~N5I2C;rXV7#AvegKp?sn1`--DJX;qFq}cqEsM^N=**K zx_QM&4ivMHi$a=qsNy6cKr~wt42=pbmq96TP7E508K`@};S`?#J8Ad87>r9bK)-1h zJG0YspqPbP1wERN)00TdftA6;fwjQ>J=}7KVP%@=bsr}_nV>5!!KgrGZi+F@DHE;L z?ZsQ`x7UOfM0+VOjqAacQElFo$C1oPMQ}`oOqo>-4A55B7Ha7;zR<)XfBt*)Ivq$h68#(rGxRlJy2# zT-jQcXSvQ)Zw$zEQkk1utLr<9*Kf&0`%KC#AemAsb9-}fNz%=vObr*N+F9LkB%6s! z!-c7CZ*I=hL^K>z*(S1svvKCyv@AbFv@1P2Pz)zP8A`wh##v3_oq^WH*5=Xmqj9RPC3ACD(Q(QyeaYE< z7l|eKI3BDXQYBGlY;WbkIPH4_(rC}nRR|VW5Ry4B2+pqP(W6pTP<8XD$YP*j-h3Do z63cK2GU!}8&R}otY%MOy$Rz4jyv7j#WU{Blv)k)FU9^U(=@^m;&liLzp3%e99QOLq zO~#fz7*!D%b37q9-gM4yiO#r2Xb6v)s2S;tN^l+DiJOtQs>DTNiZgi7YPWEny_^$| z`p7miuD$eur7DJD=+hdypUR`#qM5rOGNCxYgG^4@HUlOU1~$qV3^SQoX{HPX<3N9B z;#}U)3|hf3w9)fuBJ;1!)Ilf=e7=oQE^da_w;>B(6isKz8{|{ODZNSJK6nlcCFjTvarb^z7+nz#bmN4iU*jBn+#E=3R%t~)tgVg2o^$)J0UZcoW}@3Lzz!({P8q<#0Y!#R*D%qr6RkX4w~ z97q)=lVYXe^~wHzIz&dZJzCh^ZyluLUG(NoN-%@RY>r&sC}<|R6dE%*_CCTj zYx01;ne1J|F&DDhwhqTb%(o7mmK@#4QKiKkkr{1!Y|+(k3sj;x*`o!>e71!8@jY)5 zX>$o}L}r8!(S!AcR<_&n0+6Voc-@hU7AC^#yL&>7GZ85?CW7soGC&~8>-A-YMGdk{ zqymnqFo#-D(Pu)WsQ;}XQeaGj?sGf+&Lr)(Q;s1<-%&9HqEtD2J$d(8h5XA8KlJcJ z^gk{Mwpj<>Z)bgEfQ0PPZPuRb<+w~9Rs+b#SOg)R&Ro=xBXa?+1f}ox)!wyMKnu|u zO6q9A!LL`CVLCt(LR86I3uExPFgVp9P=B6vMo%@Ur4O=sCJq~9AgY~UDFOcj`2TZj48bPV52>Sr|u9UON+iK@L0CHXkNMw<0!9Pn3Y30Y6V7aCpW7y zRF)Odnta6@F+{`Ah@=XT>Abq6r&6=C)}=;dLQk=H+--Yd;;f1-P?^}1wC&viJ*%V| zkqNz;#38bBFVUv%|V&g^FVrjPddF>JrHA7kg6F((N<G5Xmpb3x3Je&1WF-W|fWb%4Kt>UuTw$0GZBna|7JZDBbF; zZcZaIp;vdvAk5d_C_tt|Dn0dW{6DZiL5~wUH1WlX)W%Oxw15n7?-7$yrAt7A#YH>dmKT?4`Z4sy7EM zrKNLGdfkz1sE0lb;gIiEA0gd#Q3zo&AdmOtes?dbeCZng~4JLOg1qKoOwFLVFN;x z=(JWDPmUI13Wcl9nHY_kteQc>TZq%RW(bJ!Y5Tho8>joo`K#!9@G^ZVBxbNA$ae3} zM*;$3e5=;6))Q+Advc{@F<{JtcqHeU>}t0rsiOX+l&ZjEwzD)PGQ$6l`f@B8-DfhE`70ZT!O!a-5B0(> zp{}R}2jLls3C?MP{zNTOwEMeg6Aa=TAcnu7;YVgxSqKodsvtoQWhf@o$FasTX=5xw zODs|M*KglwEv~=aTH09OS$+NX#_erEd*Zqe;IVkvT~1FmlVFKfzH4C?4x^(@7QeQ( zHUvRbd*uWK#T@W3ilaQC(Pj1_ zH7OKEhL2}tw+^CBqzpVz18hZ}y*8==fyR=cKO{+Ty7TImd+uS>n}kHkk(dD+`iQ|f zK010%K?oZdjB08CW!~6YmW{bl4KNVnBZ8w+o1fiEK5+!+U@?oa|LxVaO=lZ%Bl|Zv zjBa$ay|cBtydsaFZlogyVtk_`^YdJEWMMIjkYWxsttqy1OEN8h4si9hsW)l?Ig%xT z9@n&Px<`RW;~U!4(#HOjVs|Ak`_f>{kuN+`KchW68)&21od}UeWVU?a9?ojt@}-KV zt}4iKK;}a4eOq6B)cVr(w|7=r-cj^XI`3qL0APUb)p^rdfC0MK=1pe-2I%gnv-anx zObd|dkao-m;U$I{&1HmaB?QWxm?CRkUwM6Xy|s7?`}12nH|d~x={TbC9?cOIn`wf0 z%tvGW>$f(R-Uu>9J&4OBkeGu;FDvWI6%s`w0*A*(V=g+*3ukyPt;>Kc+GB+3iGdiK zMwDACJGZyiTQ?SOZLf%sFUqi+Wj(7>1Q0XO_})BN-&mIf(LS}04SGI-!eM;m1q=Kg z)o-t@tnWD8YjoNL1NyXWTUcIZfyu0vR6ASF-561+!fI1Ej8CU|c{k2Pw{!+;T*275 zJ8y5wYG{V5U>KKjAh*}cTU|6hb6SIo#XNL|RB*ng~H(T4cx3)H3Uvy56Kl$yl z6~Ii7Sq=Lw@@8T7=&Xj<1D4}5Ic7ENm%_wRL$4$*Fqsq?|D5!j8}Q-zE7E~SGydhg zF07%ROwSFDzLB5rrVSxP`hy)YItJh{}tq4TuIHXV(8IVvLbG8!L{xt?9h`hE1CFt5d3943?Q`Ggg# zKT8S2sLXn?VD;%5*n$hkJeG7@>HcIicj*Kwvp!uE2j`aHXyf59lk>V2o<6Qo3zHcy zEn`7Ist<2rYqC?#6$92Xz5pV#om$zr;mcGJI+bzcIE?(nO8;JWnDy!837?^2pi#=; z;xW_duve`Jn@cHj_srNAadR!aHYS<_t+#=7yKv0&Bt2Nq#y4;wM4;I=@Dn~Db6vWD zZLW0d#3ruC3)D>m3kx7J+xZ(4O4Ec)xk0}t!E%n*(|$TkaDj<;+t7>04r>SMb6Ceomfv!NLOy#8@c`j=qL@x*F>j}Msf1!>UMJv?SQLr)&~92Mz= z(uydM7#(t8xxjET2=<+gB-g6;&K;$9yWXAi_@UJ`+&@K>Wwr&(ZI*&IE?%x ze%Z}%h;Xhq5!W`5!Utrov$wMBoyox0RfBe7L*@8u>0z)g8sOVdjQ^D0C1392E0(91 znQ#b_`A)Cn+yq}+4SK}_h_Nq0iYoJM(1QdJne8b&gWu_;6iS4`z6P2LK{DUt8{59# z8hCn!Vchc@I2mETm)-Z#8}w2Vj5(e+mvaR|K0Ao4$jX%2S~)OtU))TGhusmKTB&h`QVHE7oXM3+t9e&>tUoXtjLwsWQ= zK2HNH5LnFcjQMqkuP^qgDkiVX;)^gSb6zly*%#Q3rGdY9(3s`yZA>?WC>nSc8;bGI zsM|+Hzv*qr+Za8*q(Dr>m z<~rXRcW6cTLh7Y*Yg7Y&tadr@Uo;XEyr@<;ce91nzCQkWjQgjOKvM5p<%I--Y(rZ*>p5V;ZOoCxIcs z#%%KY;LLxCrT^9>oun&=gR$HRP{TX1;&H&LRXfHL8e;u+n)C&I)UQv@+Sg~@bJ zGo9$9ZI@VMnui(viWR8Lc|Mu!b+c^Htl99#s@d>gWV1QDySKY=eQ)<$6K7j{#fn%q zQu7~G{ z!c1-Be|xSa5;R<%9|@FapeK13uItHc{kKgl%@T&NKi9&Qb8<~+-@%d|bZh_#d zLt`@EXT;koYd*+u<1A8U$k>fLehJ>1Sp#J(TqbH;MfHid{o-uTw>VNe)T&BKvPOBu z{y~}9{>k|kE5OFu`fPa_?R?0|{ZS#fZ$zR}Y#J`r=R~PY@r}jbMDUpo{i^)-%sMOQ z;c~qo%C(-A)!+KeWs%s-|DwY$oPb?NHDXZ#<=4@ACcwD_&x_AC;f7(xer42%#08Mg zFQA$IOgkGK1wytOF_rq#(Bv45d%8Wk7YILIt5J>kP^0Du4El7NHZhJC7KaDwz7k(c zHD+K9hNcMNG21!BI5;mMpqv^(l=)V(*f@-SVQ=?vVGkQc1Nb$D z1K1k+7swicLC@2(gZ?A{T(L8dV{idnpfI>nNIzWclPbi5VfbfpG(MK!jTe@)_747g zBkA_A>O_QIHKqv}Me9Bc$&@eh%eQfU(*O|+qT_u1knLM479r=#GgN{%gv;bFq=%4D z*VJg?IwelAu-0!eH5{uzQUwsdNNnc+q)NroC}4guyD!Gq^gJTE?6!xGEn zAW(uD&Q$>UB@oce{weX1d8I@N73Vy&4G6T-B3Srbj?aoO*CxGjcaRLnOIe>z;t$To z))*oQ&_Hp@Xt-3*?^B!TEd-W^*^Q${F2(?dp*;t-1R3j^0PNdMnOgP@D{=pV(Tcu1IjhUqGFvm8So9+}C^IXDFirHYi z@Vfes@3m^^&LF5t3ZOC5IrGf#D{J)f0S?(?K8rU7IChBy*~EW2b8Z`Wjb4XQSeOtb z3-mmNSPSi5m(nxW6P4MWjBdHNkX4+u&o*HLDQ5cziOl4muwOx{rk{z^R7(dwIu}Az!p)tX&2Yy*Yb8izCck290PCWL z8JrxPy;=INQvISXY9vu?NUtu+IJiJB*k2dvN}BW#<*3mO+em&n#C%G=PyJc@qt(8e zl(@YmPqwJo7FEj>ELfKM<2Eg|znv_*mG$KXp*2E38^#ma#%1E?>@Tp6%~X9Vm0e?n zmyP2w3t*=Hl>NyT)=Q4l~0G^8>+z{3v4YK}-7SEH#$(f#6 z-H->)MR?gRJ7$xM<%zWJ9_upY&|`;QAARH6HH;ZX3+9f+Yd0{{jpV--*dg}O!jgK^XRqBmsPD~ANnJhW7aN(mpX%b&D%jM* z>e}MwYYPc&1QTAkMh=A`l(hU88?S`S53*(>bAl~d5=@BuXS~%2wiqQKTn@?dUBWEB zy9d&a?P@F-0D@-nk(lMQ?yR)5tPeJBhiaS)BU z&e1LGy)=+1tugvA-zpY?!{`@!-#ttgZhd=g(RVI&@ab!fE^!$DJf)a+v(P+q4a4V; z6$Af87nBKJ$bWvIPw8C38Mc8ruo}@DBS|(NmZ_iO4{oSqNPPv?@LUWbIBh&8%jLuz z!KB?;(`xlOo5~r0W$I_RkO+^|LKvU5#_~f35t2$oCcJW}5<`0S8{PiG;$+;xSe0g- zgQ=)*$3r6*QWv8J4;SiFE`r`yj);A``q`_#SjEsjA#1kc-UTmw;r~w%%;s>qakV#C43l<=}z~%p$VTF(v&qcj}L8sb(7{INu6gU6cpbISKI5$dr$VLVjYK)1@w+dh2 z6zHAF7!&Wl+0;ST-)eLlhtZ!N>0h_8bz7Yj;;rzg(bf%y%_8xb?b4`wfU6M}R>#;k z*34TP1kL56G1E(Sz#^E7@c$@`dkT5(kRl|dq5*CO-!kcL?(B02MSRgXtC%JH>QVc`4Id$e&XN@?6 z!93Oa$iV_&M|XEX)3GCSf|N+N&Qbs$xugJk2BfGNyZ@Z604_2Y;Ca>>RRPTbr^Ar+ zHR5vy^3*R;nfO!uz9t@GiA(7eRE-HoMhmce&|HLbBOJ1qHtk{bx0=t!Vf2dz{UGV4 zp8Kz{57B&X6Xa0Lah_lD8EWk1<&Wv2AO5ojV*Cr{XX;q6Az3tt8mU7DwFnrA8J-z^ zr-z#wzq~;H4>wu|R(;j+IR->4D~QO1=b6y=F?A#g5oshQc$NuhvG)Pa*9?pRYYaRY zMTq1;GUappaz5pd^nCH^^oSwxJW!7onW=+ea(EaVWi+MrK$-R;OB-6HQzQE1&xK|g zi%Fgyjd}}9bY|(k+Gpddv&I56!q6-sFs8aluWfJN%1_?2y?&i&)Ml}9nBW`}cy6f1 z&_c*S=n90PpEA%mAAxRa_q9}~KAiFkEGAO*0s1>hUo8*tnNC_C9vD+SV`L(#J7~WF zmsDdc>*~!xW3p!r8SQi4O0h|=?@Lx=%FtzV;h64)5jGIx5X3H4FVF%b{YRg&POy=G zZfv~xyNk^1=k$Tv4Tp5jpZa3m~O(A;9Q0m ztk1UdFPiB$|J=x2{M|)n_UA2jPSZaa;B>kZFDbHsT-6vSM6S)M(L8bh#gYFlhhwJa#>sG>(n^$6qKWn3OjnH_jd2WL z2`JM(&9ARKz=fIZKxV$iwqwQ+lmd|Hp5j-_c9hjfPB4UEv+|%lk5X`Ho)sUfmC;^UT4S}XK=F%E z;4<$s;tQ-R_9d?|FDF2J+8mZyPfbEyVvW>0zSHphJtLmEpWF*AM5?h9RDG#XEeyte zmTp8Iru*baJFj8aK$|#y949S#F+)sCRhd7W3Gktz-)Nt3<_lD2GW2R>x>P6&|c zp5s@SvqOaN@T1#slPHpKSvC3~#*vgRDAT^kuir#BkPO?MBeOfiWv<~b7)mgQaG5+; zu{x+aByUp{3qYoOo(s6z$CU_+*3~0I$2Ib>3?wA=QJFZeTeCG{v29i{3Erl4>wz+D zUbp6rrA|VTuj=jvbJMyF;WGKBSV!h1Ec4fC9v$ur{u;psqd6K^8(3UuF2cw8BU1z# zGJ7qm#;GL?6XMP>nKZX)Ith9-NYo*A*$Cdv)z4(=g2z{vo7tc2ieYDgX^(|&@Ar`HZ)b=8AGGG17r zfBSuUt)(U!As4k2nCVrW%C}N4RIX8{gQH4jjmf0SMU0XM3)_ot%@kP>MlP!d$aF80 zip^7)874}z0~&&roWM|HCny8D+$HE-5al$Af)q2+!IL0rI*pJHL}SXqxfm)8FvZwZ z$1vot*nxP>Fd)S5pfd5L?{)_&^Mwt=-|h}*(TZqXHO8Zipft~avEWLmh;@!s3XZ9s z=3?ARh6ia#t{NR4V+gqfAk#gESFwW-E72Fgh3&TZlkY5Q3^NNHCJnu+*r2&y^aKBjbT*EHf`3P1`t`WPdmG|7TO#qj#~FI zH-l7$V6U-1(__b;9P6sR5CfOyytxU2QYn3TN<@v6pGz#knBxilnGCs)I8De`BW5V0 z$?=%!NtfwWK~y_vzd*;2 z3+>hLm#+3)IOgGFx|Jtcz||5MtvK7$YlJ>78+Ib+XQmgR|37hW+U>}3U5U!y+Lpzk z=9!~Nji5x?YD?~Z{m81KRPHLWTvfCzd4O?&y!S!{AVCZ@aINhW*0{H;V0SDNm+4xX_e1K+;0^IKphtz$3PN!4} z=$2(yC37@DKquAI%{Uj(2dMTa5$>7}bLx)kQGk1iW@<*SDHbsQ(t?TknnHM1{uJ)e zy=@C$7A{L>4hB5L_ZG+k9LU}r(Nx)IPoE8_=vT7|4|Q4!D1}n?f@Jf$OOn6=0UdGf z2~-T=*vT164MC{FE5C_D_{Kg2=i{L~oVV);Y$Si1hS zdvQ1pHaAVY;>>*0L#O=$G(`zjAGE2Wj`e0b;%7Q5PE*@g6lkF7eP~Kfy{8z0&JLK1 zDb|1PW~UYwD7p+q|7efMpO0Q8wO26)3%f)+QS!K;y@IcwR%U_jz^xVK6-?3125s9DZiht?a6`#0j4rRb)g8tv`lF{LE-wZz#;* zvsUAy>hy%r_#91aQ$Z;j`Z!Cm^F ze%hvrS*|5`M?h!ZcWID7ptt}EIwEX%PK(|u?r;<-Nk}57gl1}PY&OGUyzM-MCV~RZ z50IMaVzc5yUM>BRqO}|fz~2No6|N0^W|^Ugt`j=}2Lu;EFsIY)a+#r6o}Q4zSRi@> zM6>{zt|?*(QN-5?hlc@t$c5E*CW_M`x!_O$ehJ#??CE@wRaEdK1q>{uT35r>h=$ap z_dJLy1_RYq6Oqs=_q*oDgT-k*pr3M-PBFIRVO*UrK$bb}XdUkgcjfeu;QSy-=X5b% z*(;VuGnZuUe-!6Awx&4)uhQalA59D3q2+R7mt-(qF~Z$y2@43m+XnVmju8_P1qziMclrjiN#Alj1?2GCd_Mo`tB3bL z`*Qg7*=Nu0KV>>pwKckG%G)LSivWj$OElQlT-5aR{@rJHpWJ8EiX|2dBc%o^IDar+ zy{5DB=hf!C-hU+7z3f;R4&X1Ft9HE5E^L-Vjf1KGtmjpl1PtE}l9}(DuprF3MsA=i?nD@;zz2saHDFic6pt1QzR4&*XOk6EwN!vHyQZ$fVGihqRwi8pP zdEtSMCb*4LmIVZ*t$ocCrt}UMTYe$SzO^p{2RfM3g_wPrQ=m0uxLwT5UJfZdIHRdo zmUkLk#=~1#K=54*x1(7;^DJl67_!Lb;J}5O*dD*W_weChcs^Q8#9}**k50)r9@sAU zl=*Ly{+6Z+6uDSu>y~Gt$raiMPWOWihNDHjcs;MTYi>-%U})y1xjZh?c|B!!v%{QP z*)j@*uisu~OHB0yh!xK9K%qbO1STZ)2h+w>#FxnCE z(^VzviDDgPD{TY|ZkbxQc8ELHZm9(#7_T9#sv;xe^`@A5QBTpT|>py6|#=(qbZ&8P0P$i5;263s&B7b>k>8;!Ya#i&xZIvS%QrB{P_ z!iUrwDO%3(cFD@t#ewx!cszWF{72ksDdr3UM1eX&27kudnZnhBwLNMJ@8;VnP0+F$ z+yk#i1#iZ0B;L3Ozrj3m^`UF?v6FYJ-f7nDmu0Hh^j|4cR>Ut>I z?yG_iRP+S{5U(N$ESO~)h3`8&67r1An!8Iu8orV~PZ75UjBN6(7e&gNns50c-w=D9 z!)u^K1+PeF#@lpEr|>j_FXLr8@)bRdu>eiM(13{y6At$<91}Keyjt|VD5|}1M(uPH zn>3t-LUed+l7&X9n|RDT_HDhW2HVY;H6Vw_CJYjc7iq%TPFv8ObJ;ybirxxepqK*$ z+g0}EH`~$741bCxk&1|-!U0HDGQDG%iQVi6U@*CcWE zYGg)Kc+wTN2TqnZfEH=PcHP(~ccl%WpuG&0_q>_UX7veAs>VmQnb;wM@QNh#JBi{{ zYN~D%Z`Bl7e-_=>N`FJ>A^W$PQtzjC7xu>S|iCG$}X>*x@Ce z0?rb7sIy>zNZ|)4v0pE+eepg{$H;n&mNplQ?g7cFO&dPMe26#m507cH%PH@rEAEs8 zrb3M;fSh;nYEDk#PZUeVfVWc$b1ENH=GIhuEC_ARHA`FRYP!wfq@KJU+C|4QCQ)qJ zvf1GZQx=75|J`P+~~o7-p~MAk%#Ey*0SMUkL^sP{R56qOk159P2QE{G#4 zBv}#&`pCWRirK0N+|JK>6-il2aM=Ob(5-LB=TGX8S<)5d~4qCL#yPf0S zjhP{Y!n_@$7ibud#z3|r6zt!QSxTt%t;e}7gTXIGuO!vxKaOcc*6aO6HjnT6!{*Jw z3UtcQeSdbzVbgvyB<{{8g)FS|;R+r(eKhR}L}R_0eP($f5ibrE=rrlNDCa zzXR2Q7>Wl<#WdKM2>$bTAQ-&R`=hMhd$i66KFhEDVFhB+yV4vZH0J%m?~K1Mv{3!~ z1IY$$d7tl|X5mUa@Ylc3&k#akzMX&c;L-hms#fOWAD_|l(VxYpkN(^F66@Ytr;Gm^ zS}iNI=4*PILVpnht3UnM^fE8>=39ZsbR0eH)T&nIFk%DZO9O5D9L;&8(tj(kgB;59 zZSGSVkC;`y_u^HXJ`=^O%+~$4xoynQ>^qyZTV+j$=MCd@g& zSrQ2H-K6ZZ63>Ol)Y?ot$3G?M66veBG&+p(7jG-hE^xVno38su&m47{kpun_4QLyCE6$K_J@>OkF&!*$oW;WMa zn^q(k|1dnIgG%@^c=h0yM~t$ol>>TwNadfkmGZIEh5(zSkyGGHIn}vWRMo}=Z9ZJd zXgjyPt?V9lbxBuA6GTwv2g5STXj+}t+72^wBI?0jl`zf&UEU*PbZs}Mf5+UD;=~bG zomFxyJXG9bFFy9gX;YW|Lf}a z{^EP)zc@%xERX2X9=MJ1v#E=b|6VMJ05x1Jxf(Sa|gD&2bXWl3lEjCys2@Ny^ z+&JAVY5l<9i)W9A&mKMfQFE~A3^3VCiip{%BL&osPePNqq(HPX1R zfZ~Y5uMD(>)W~41a37==6r?xOls>OszpPhcWw+u?v<9h=+5imli)VDL)!=vZ&lluG z26MB{o+Vdt_NRrgggG!Uy?s7fpPRB|eh!jZQN=kV0bnzqeGq;LXdt?DJ|B$-zkl@E z-NA{uMrxQGov-0C7&c8=G;m#RzMV|ZXgO_4rr48YK?GS02evmFw#0sllX-JAY`*v% zGblG0&!)6gc3^JnenJ{f#!c@*S>_x>d ziBJra#gOe{A`S?;6~D~{$(78Cwjjo8S7N{+p`1B1`Yi8D>NRsb{%#?3?a^k-LxNs~ zczg(XH#Q{8lw1>~SQZ=OwPy?nAmz4uwXUB}t3QucG_Y$v+0L_EcCOYDz#=K(Z-M|i z-fPt{+^%@FQ4FdGz};Fb3G@`~LX*wo(Te+%UhM(`==hOHhBu#Ea7Rn1?a_C`iP(zq z@8+%bZ$J5j7AaF0@|w_zlaPUdt#5pu@)q z(nZt$XWD7TWT+d(fYo9Zj}H|$g*|;9rKe6QCV&J~iwFk~4TT&*qZtpV_L?IgfR4P^ z_tPKebg>34A2sdtr!05+^!hn2sLR(T{{|gyYtPeV%KEHLk_W1M=p9O)D?k2eQ{;d1 z>%V296q_N`=UYh@txv0a<>Xj>D8^_9|9g3;6vMdrD~4+t|JMWqq#}YuS%& zV@3?!eAtVqxCTB!xSsrgpITX zCC3cq8V|CzrJ6bc$tIlRc@WMCwZ9S;$l2Myxmf1}PmfkW5?W}s?hlxA2V`oAk|>R$KD?uTx{0yD5;A5Ki8Ew@=-2-g$_w?>+~gCi9NP(j|u zae@nFH3`kMqbPe8R5n(tsr7W7=%%I%#Ig%2j#TRtPFV6&g(X+!wl_xi;@E;1U0aW0I>`K43{)teG>>BE*m(sSnm7CRrVSY+ zx-rrnmNa1@v!OO5+&8-|5v2WCVLeB{v}xn$J+*lzh|>fi?v-qPIZ_ZJ7$H_uUDmJH zS*1s+E-@WsYRclv@2V_1B1mJ|efM_{+;RgJ8;{SXW_dYLt6 zXJ6g@>f!L8?mv0@;Hxj0F%{i4pxL$tzZ9S$;Ua&|E?Q!|idF1@$nZKmklnzOPL$d1 zMMs*Mkt05ap;)aCqzos61@&#ZJBKEijj=~3mWv$BCK8cs66 zUfFv2sGe+R)l*uxH5gN66+W_`dYN)SQnp@3kJHNOA+3uZB_mD!)XNeR-` z%^q?YZts#j2PFNbaVm|UicCtIo#xg}4A*r1*!VnDNj?ss81!q1ir!1d3+bOUh>i5G z9zT2V=)s@v-`ml+D^9a&;ERIW*dQ}oEuMb$^^?1WfT*8pAsHa&$4#;tt39Pl(8km> zm19=LXk-Iiv{#;IKWRzJc_eA9IsbW+IB7N7)3|Q4oMN3`1HQv@IWAaFFEO#;5hXG! z-fR+Tt_m4E`s{ZP?he2F`qAh2pRhjR!wx;96d4w}IbE2gHDQD2FX{4N?$b4yps<2RhJcbC z*3+{EZOai$kbAO20}dItV28&ztZgt_ENTj!OCs35+Y5?Ax(hOZjFr5I`CmtJM?z;$_A4?f?X(!s>lw9Xq|c#S?dT^ zr9C8!+3?_W1vId|6Rh}$)o8h-u`qkOm&-SKABtw6UYfH23;uVfbl1E+(sc0P@r%Fl zhn>%mYzumj3deIh=)iZ&XgbLngK!4Od9N&|u9qjH@pG0t znnq142KbQjeo@MNJKIdhBXLBNV$ErT*q%oX0mKyQ4jFN|n!b?3j(ydg2p&Sp8ANs1 zEDhz=r^gHm_>l5pV@^?Yx3+hb?l%2e(dsFSOH2Vlg}P*}p&$=;I(dw3%jnT2?u)f_4J@++5L2i* zQREj(=^9u@QV_R7NI8Q-;1?_DF@pj=q==><5*Jn#w z91%o8{36pvb`7E=HYA7uB6`e3G1*qAYXDK=fTThu(V3Z$Bi8)(l}VfdazvyD^-Yr= zmzS=QUWyJGg|dR6I2O@YSphaA6f%Z~fw7RjGKMoiPQm@#hZmVD)R+5b1Q1hjb@thO zQR&Oo2?_|}?a{A~J4l#=hY%jgg(r^@$)(^B!5hW!+;sWkZ_JwfrRc|ZY!tKjkiz{* z^XM_gD>LYj!7Fq8;Bm$)3k;A`${@3Xvj6c)CIYgoXefQ=igOMmD*8R%P=GrXGhl>QsRIl;Z?=sx%j?gKpmMU8{zX|WchSH#_u?c zTqc2)_%QOXzx*zSky}_GOGGV@b(~@3peKTd5YhR7kfU@y67U@&vel~NFmkX(0EY+> z6hQ3JhLM93&Hy zNEsCHVUu#vjiT{bOxJieN^HacIih8X9zIsQU!Z`Xf_->2ehm9?2FMXH9mFp(LvmeX zI*APlBA$sJJJzUnaCekU#sNu%OyXnC$H*kk068M?goW~9OxF%biVhitvT}_0A0mJa z35AR)N4|Y|7tR1Vh1Q6Lq;WCnII11WEhB)Kf~&L7=8H<#ARM_QC?M#@pXmag!9P6x z>dSkTIkWP5;&!kaL~!2Ba+;;a zBC(2#(ss~#P%!6HD=%Q`p4#}(r^U>hppB{Z? ze2-geZ=BD0B^Fa_3XFkrge{<8zMf~U>Qk0h#cnVQ)WT~Z!TMgFbx~E5HJvHG+;U4R zMhJJY$Iv@eY!_SF=rEj&HX~+(9#q88P;qr$&Fj_c7t`wHU~CUOot|xLaRr+q-}&yW z5-3(}*W%>$Myy-uk}eMirZ=N>Ehf`Bs}qWCe8n_bFtEH4vD7DjW+aNOTtyOt z1&%m}=sv_ra@BK}914J7dn-!O`h2wHTN4#q#)@fjXyCaJ^U(Dd6HyfQ-q@MJ16S-d z=0yI7R9Vt(*ZLyHS1X6r8SPB zl@K!DUR0aac;Nmu6Pet3Dkc*-hzbJ&LFVc(yp;mm)Z1Tu-0GSa>{QqByY!Km~rFg7^lWHxk{5 zEzR-Sv-p|AR~(f9q=Z?(g8CB8e$YjgYq}@gSp3z14n;m=q>AnYFdS(Put-N84(>U- z(pf;z-GZ_wwiu0Obm7&ao=@o*s+tcSD)ztvi={FP4Eh^*B|Jrcpj$yDxh7w|RrBNx zEU4e4E@MUKpbhCD`0+-ZlB1}&yxS(hz;d--Zs;r`IvMAyr8!k=@Y&sGbfoc9R)7?v zJ^{uiFZ?Dz!TMqHz{5X$_Q$8gXMcQ5heGBgC}yMrW?n*$0eWtScfH`J&%SzcKPyBr z`WC>lLO66$LD>|Y6>w-MxEy4A8<@vStW`FD&S;U11flv5{@T^$&rGc z%NK`+f_H*qk@8{YSVKjG5a3!30C1>C{N4Dxo>CvSUw;QsuqJhj!f0_MOy|1gAiVEyr1ppL6>v=2Y4!Egl#%sT@;RO!jmXy}L3c0Ku6lw-kc)S#BL1_%h|z zKG18q4Txa9oaW`E;*%4K{#@Cr1`J&9rCg_UDk-@Gnvy%&%K2GEr@724fuSLjtEaP( zIJml#H*#>`%h>l!oSxRnz6Pv~ON?Q6eaNB`r5JJ;WOj#awZ@ zuvj#(WlG4r-+J%hz?Z4__JLmOeLw_jCY1}b^PB}zo$7&u179W&SJKgR%0r6=woK|) zNt@Uybq)@Enbak8ol6O`6Tx;_X~S zZu>3a1phD{6KUQWl)XVu`b{jnNMrfcd_(fvgm za~mXclZrsagIR;L10!cHipNgnIlT(^)xv7w!1ea>^>}u&8r-FM%k{v7PAq+jhTH?V z^d(^6xyX1jOX)Rfa_A|OSVVt`anZ2Fc|GCPTH!{D$pT(JWmKx^UOZ;QE-CYH;NrQJ zREsXT#cIF>X2JEAPFiP4Qn^D}`z+RM)*&wC37lYomPEMcz{mtA-<)8trle(;?d9ElbAga}x#(s>MWt?`L%e1LYS2 zzF9(awyL+hTq>4pM%Hl@4N{)PEZTgu>ie znhuyCfZOEmnnt7+e5J}Ex$9woZ#=@PI-_+k>6p`g9w9~n`o(~5%T1cC|8pDq(HsNB zd+8ivk#JIdv*iI|S3-vf!b=c`6qgrob~2hMEzaO z=@3CkK8x2IS!5JpDj>2&#^8bM3Z8u8t9{1HE2igwlIL>`2PhMRZnm@zl9iXP26c#m z(9X!Z30~@ht_I|1gr`xM)PdLp=J7!H=DM1hg@BJAJib5t{Od1R$`tL5f88+&C~#c% z578*uvYyRy!(@s|kYN&l;JfG_tx9Z)zI=v_!GY_7fABfEt;J@L?59=qu`^UL8kjC| zrqeV6(Uc39MR9g{E{|7Yo6acEXN991o5KSeatvAynb0enkx%FeF4{`C;Qs%x(&42$ zxI((NN%82!<>0^-%7=9rxk`3mjxjv2-EiivX=(UVTc+yO|E^xA4obvrfignu!P767~g7|jx0wbmoU%8?9%iW!Y z2CR+UV?)A~^|{#y;Qpm^9Lz2Z+9AMvgT|d(6vvwf1mW8;;iNj*@@}1CJBtHIxEvN} z-i&GF(GZFbb%7*45#j=)SdZm?X~oEIiN%2-E!R_`$v4|tF3?b{KW^m%CTLmuri)|{ z`0(_3Fc4je(`WAJrL{zS&%Va7=1X9J0~t$IW~}b;REZJ0+i|LvW+;7Y_oWQS=d_7} zRWQZ<^o5*DakJ^nl$OKO>A|u@YdWoY%meDfi98sHnCIBk&&9f(!##(?0uA$sFVE>1 z3z}&ZX*%2^Mt~r^6&IA|`{9~)$?;f5(*)(KK>`c%%Z$8UP14e-2{a0<0S|N^uFtod z>1?o?QzfqkqZjp*j?Y=Yo>S$a`*k)Ox8auXOHjF zX;8GU*KYS@byJho7RAx$0b2;oF44if2%}KYvXwntZ6rPvs+k@-)YF7n){i}$#2$!4##HI3iD{1USp0v3k(65 z*0dzOqWuf*$LVN3o$)yXO}ph@c0MMD2eylxjSd>w@FO-g5o(dl!GY@n=Q?C9p-0H1 zi>)R6se8_qS9|QDH~AAYAF|%~!x!y3B$lH?gp!vwlf?Yv?>a+|PGB%jL+R@Fyk9tz6y??Ld%S)yV|@d!N?Ja6w-&XI%lw z8n4%!6+F;&r(`$xcV;V1Y^tsX9v?bBXxA}J+=Aj18V1=~C*6~d1d85aubTr6)W-AWt2B4F%6CFa{ z$9u7mbv<(({dDqEanUUhi%JAMq};)ak(3p=BDw>f_GR&wQ4^AR8M#83g zwaIGG3~27qz_20W-JA$In0IEzU1(Vx4^0%C$AMR}#D;-G#x=Zlce|ovcn5Y#L$V1$ z(+kQPL4tzzx}Y_kL03VT<5JB01BfTv@kXd1zJcd`dTHgfM1JDB6d7kus{TV6Mrcq=L7tWgae&*KKyy00To(Le@A?#X=jsxL=gKm~cIBrc_%d`;^&SZWWcBq<_Dg?ZPmf-=Ix z%?mV;-9lx79_tO9M66p{%l6d$$ee_)X(`>yuKmd2f$aikOCohmMi#l)cH#Hv$Z%??&0)xcyEKAR zO&+`7Tst$K^W4;Qq#Hn&(B}670aE>8yB2ay@?HzY4%i4&A;)t-(T}3HGvZg(X1iJ> zha+nSh8m+NR7E^cw!>Dmw~2Nau^Q34tvrWbk!)Lzp~!GR(YtZ(*)vAzm|tJKsS7O5 z_0SBTwd7hBA4)!IQxfHFyqDph6+@qU=!saM>isrVnG&SfQyn2D>dN?=flm_X=7`8-%4Vy7S|nNz0HABfa+2L0_4w4 zI^4jlNFF>Jt-dfnm!nt1bGji*E?!rxyaAMrpYTf#7vvYChaN0W>%o~AA5-*90U=2P z9>^}^NmAs#Oa{gk!x{j|)3M_tuHjh_nzfk;ry>>uPL?x(BAu7;IB1i>V#V@3U}P!T zP;p|`^i;X7X5|OVCFx5{+BJPF7vla2MPMh0VsMM#Thysc}49SUYG@%QVhs{cRCP)#x1oB(snmeuN4#aBcCX>0KKkgoQ z3BYARSsEz&AOOV5ri@o`We+k$rW8zrUcq*&}0V9Q3ykU-T(;q_P* zb&=L)`Q&1gD>91F)qq+Sm2yDSt?+iN$y9GTnv><0V!eC7Dk}jp_-}-FVt!g^vpHw% znvfd}K$+d)g8SO$oLV5W4u#e!uU1prBqe*m6hk=;j-xKYg7{|h0*DvGmm~5U`|mMm zpbFd#GU%^2?|`1}4A@M?IyQ~TLrM$ezy>3zB%uzvmrFq^z zkZ$VNbUsSSWuPFvoRB6_mSQBh0m-M71?V4dp40jUD#x@?j?U4jCZ=``p88)*4I7-U zM&f|`v7)8S!8$#;Z!&~1%165uzBmy#nw%V0pyg}yt*D7GHzEz5;nV$B=59%|PG&e9 zkIX9kA@fa|h67k`qMB9}Ye*pKN4uVPi!g*NO#~ElxXcW{=F=W%AncbrgwYwGOS%(e zZST3K(kB#ZGB!xkD9rFd>JM9`RUT}syNA5Mp_61rq7sMEv!uWQNguRY$pn%M zzDG&Z2ie0$o&j>+ZIvTWtyHXpZ}4^(r}#k2cDuL>;F(Y8*)E;|c6q-^$1_;B@lte1 z>zJSNujzOIN8zCy0mQu5D#o-x%rc76Nzyh zel32<(Pxsb*lrx-6v#!&Ka5{_x)?3j=k;b_|7ZeG8n>B?!#cE)W~nR|NnnkeWl4N^ zO*4YjRynzn=#n)ifVPLz*_+cb9j`5S!E_cNuwemK9G`}VlHri9#Zf?mp0!}jGoeth zRzusA7K=kjUW4B*je9*7-EYN4DTm{lvl1joZ)QkmwOKtO zcs1jDmaN1ZP(gh?Lu~>GL97{WYbExWpuLr$rE|TWkIp2srjWHVH?Saoe@hchbdcDF z=2X|4yR>zFa7w2lZC6$32{Ny!@X-O$8b171#)p>M>9b~9_Yn>KkS&-DMY|cm3Nm77 zD7YS83TkP3%J@RYuE>V~RA2`zn6HHw0&`|vnWD@GoC2{&1#c$Bt7@FgqxXZ=-~&fv^+@Uo&3~RaXa+JZ;`>z>!w#peeLaR@^m9^h3Zx}Q*3Cs8SED2 z!TR}>7DDm8d5V#S09DKa0E3;k&tB!`gw|e-M>C!U-P-2_8Va&y(0GpZlP%w|(MuT! z$l(7t7%j5@c7a;?bUQYiCq;2obR+|8F)wl?P}NvvPP=6(UZ;O(j?tWUCqh?6H!?`E zSX@sIzD)!bi`g*QT-Te31|A~bjGRT>j=15A(M;UJ(wjvX1Ee&qnziO5lR4&af?-7gmbeK@G5^Q2x>Q|a0tmUe zUCqo*TQ&+B{QlXq$95wa4HJr!5)|_n49baU0f&M+?6pQgZtsSsbi|ZxB7hGaw+lKl zC%I@`saA$K+~pQi@%593E;}+J6jOW*E4770hb7+g@A<?{+&x9URM()=2^J(RGlGAZ&WBdD`_g{P@uyfMd`JfUt2?=`Qj@3-> zOwpGfK;=X+cxZS>qy`V2ZYd(5?^y3iF>Nj2+H?d8Xersl900>~^lJ|b4-Kf(FeL2Z zS}CSN<7Ic3VnF~M9|=R^v3fNB z1+|lZ5Q@VW?~PM;z+X`i$?;-4;qehaf`3wD%Koi&SgyRJ&2ThAON(C?qZw_!7|_3Bm6&3} z4k)&E;1>Z2%B$)3w3<#VIZ@1+0j9v|FhP0^Pn)!w_0+SOUF^b_R4W$a1BbCDprHNu z<@$`y9XO?<4i^);G;_^DQrmSIp41b5rm?~g2H4Gf_Cfe%2M0v`MDYUp81b~ZqQMBr zN?o9Vv>yk6a$453PGZZQw_>6t04tSw7M(B?@C(!}n8c4hHYCbc|>Ia`~HmiZ1 zN%~T5EmH(6K(Wm@ei4wMe4BlrtPob5rwM?R&7y(mBA&BCXbY2^I9Hs;0Em>ztYog6>^BdaoXD%`LE0UfhTKv&#I= z%B*5|76WeKcO-NEymn6A1=56D-{LIbUZJwPMv`I4~Qp3J7> z2YepBmy!^W+Xbv&uj%;XV+aVy5O5V{^EGg=8J&G8-L|672N-63i3!r1c-k;czNC4f zM|2bnZErl=f0sX?7;z34$?oszc_=R_!mOMt`cjj0l}2qu7n_A(xKwDeeFVZ{ki0LgFy zu}o;1QfA!FgccEmyxcBG&p#y-_?-$-0|`p*iQF`(u`f$yr}`OTf;5D(HYa-wWn(;$ z-9nDz%NNsnyUvwZ#WFWwrKN{b!GJ-}4E&JR4CUIGE(VS^n-3Q5@(4D+5Ip(aEU11DtK>Ok!jjk~S~=Dfen;J*2{U_r$arR8e}6RKuA zI)vCxdGXQA9&kmcTrWjz1#cIVIbWn#G2(QQpP7=xEkl2Ce;CkRjAr@P=QMBsfKE8% z`$-f--#bjyLWGR_L?Q2PJ=@L~UvB3oV(eStUiVeVxFGW93Xu=#IGv0{#mMr$5+f!E z{7IWYTN(3NtQc8Vs}nSkW*u#*{MmQz%BWef)OJ5rmH~oVGt&zyl(#-JGi8FnpYF`e zs073_$%;#k_On~W192a>iF4b*(ksIiQ}1eFF~>flXyF1MmOX+f%dw9rI)081=o~?m z<$$O`TlUd*(~53$7#4=r6f=$LT+C2G;xF1Hu4&)hl$KN#MJfVFwa6?PWST*w)shY~ znN7`H$mg`sXZ1Sm7b$jga3BOe1#Hlp!SCpiFGe)^N?XS1-^86Nq6-d|ks$FQ;~oBH z^cdaBCkM6^ex1X$3-Jt)Vxq3dBGhZ%)O2;O^|NL>L$ZTGv5JI4X5{2qAjx#g+9b&{ z?-VQNIif}pJNb^k&edbpP~4>SZzHh4Mxq39NwmYpDyeDe6NU-pX)36!bkc(HRn1#qV7eVGE`8RG2QhZKUZemh;7g&~7KO_y{YSVg-Y z=E+Q~Vu%bdRu6uWm>|6@ADC1pTR!Ze7~BO&meL`D@EV?lB9mk@YR`&>V$>WsSzYvjBz+0e4`vkOl6s+^R>#G&<1odBC9|;W}P| z1RCV7=mK$3zZA1!0LrpAs31;?A4TZZiq=rr0JK-*b7TmJJ(;Z_^w^4z?|1NI5h4iR zfrVgdOE}(S7r81TN5EwbF0mmZ$#3KN(i-12zZ+B#$9~)zC%D`=;^^SVIVfn;^wJHB z!;|TTH{PAo8&E-Sec}P&2yryuGjxHL6PqZIvw4#+AV&8|ZUVAWbw_roUtw78q zWG0Dq4asf=9vT8Jerq<4-=kxzTof^=YJOhV|JofNTL_ov3>cW+kxbjgxL&L&kIiL9 zVy;UuIbCLzz))~ARba+hhRFo6rf{2-X4AY~G@zb&`+xp&`TDnhzv}<@pFjFPx6DTA za7f(X<#cmC4C~BUBdREPbgI3(9AWJQwPM2-mxgXdwOKa&d@ve+v!%T`j9IY`6&ThI z_=N$2?jrlvJRb7WdH-!8+44Ixqf407AuK#wG8v^f3~nj$pa6q^0?1I1rC3c9_F59GEOYbS#R z1A$KiRWWhdZmNt8dz>0c+tQ06*Y9VnA z9#Z!<s>RXmFrx6`_GEs>$?ie>J%Q15;Gm&6hQI z7zdVij|2{$Q%&uTZFhM2Yw*Aq#YmfK#%HAtjA1Me@T1!MazzIXXWY?&ZGH>~wrh<) zioRZrUNXO=82rrnC4mUe4{5=&T?aJyY;|Tg5I(jG2M41G&F1?*F@D8tU%+(nr-lJ~ zeiGho(K9?-)!QXgrC4PXkkzU@548PFK*(sDZ#P>yXyf&edh71?sf@~rB5sGZcB(8g zLhnaydZ`y{^IgPWilr_Ab*I9J1Dbvj-WE2bp(2`I*_bkCZ&My_>hyHf|LDtpMK&JhquWs2)+3!#sED<>rmHmIH~NKALgKXvrbF^HSY(*ioCK_ zJgrBH#YX|LHLD_gX!%iiGpptKqJFtZ6)Bdq1YCuphy}XJHlig_nd01^jT(GtDVCn4 zeKsx3y_KGr0BVYLi=sP}Wgac|R<{@f^jx5u!bh)Zn#TT1XRC;wnWl4V-}MD00Rz$1 zn8+_-oi0xK^{bkAE6)}qg7OlhG$-@D9C0_Q2`CGEfCJgvF|AoUZD5dbFXYcagVVg9kd6SLSOoHO`#+;dvF{ie$-w?A^#L9LTOn zL(*nSxh}M2%s&hvl`ZK3LC9*FNjsf|oheu8QYnzA%dmbKGlx*m^Klc5Xdco^J^og@L&d>E1w<=QD#3tCN6 zt;k3tDzvPaYNGO;*_JRs&-*z&rZZYlqv=2GR3q@A#-f7v zqZ04XuJBo|=r+)?SfHU9QQK(;qe5^%Q#M~rzv`IzBJiQbmDy=M`0Rw*iqUv;{{?Ns zdRW&>JDzOj;DmJ)+t;kkr}fV%OjvAY2CK=eT~rYEGY?V_ww|7u70&+PVpfPM#gL=P zzI_D>N(kLyK|6}iYyGh-=&2y=y|M-Etx6-_WNOCa_ca@MAn6x7B!zWz*^HeYA!Dt= zloo@9EplpF2}8k_amT~uRGa~(nWNfUTEYmKEsmMy zXsk@@h*F)$aLgG>2yL?`8Im^V_?PABFGsOw!U&n4wq(0|$t;FGqXk2BBKc%l)6h3- z?w%i`+LVYP`s1CVPib~lEML~l1@2u=ol?)Hm*=*LGD99wo@ax+AMUi?X0+zZ`4mUA zcu;-RHFmbMT#(k*Lc7PQm;b6%bB@wN=V>9h%^gK=X7c+e?kJ^%&|j4^-OoOng$Qoj zKsNlD9igI^nIXF+&~Wpba?|oL0*!_VvOXzW(>&a6$@3#vGS3RRKWUe1s^IXHdSCU5 zU$!znl2S$pku7eCQb)^+Xe?1owH?DP#audRW)b;!B`t74T1y3)uIbuhT1d~AsUD+( zG)$1y(sQAQ>3)QToIW~6w=|-Hu$Iul%{ka8SM;im(Kd57$ZK&d{sl1(5U-RxhGWUI zLhf#BW(FXRXiYH&(c)6f6&m#dI)p#q1Y)_8h zktH7_w!}8(l`UP?Fr!e+9Iqlanj9mx$xuRQiw|_`MZSw5p<#lomeC0JuwC?(&*x)| zMr27Lw#D(7_rCjxCeI4FEfI}*kp&pBi#$d|lMq5=O9fh=Z#NUWu+4NiX(o|R6dj`i zWhf!E#ZRuyh3=!V=@}f|PsUu3=4Mc`e$qbf2T_=|;Sro9BZIg$$7Afas>UyvvSS2a zR+(jjtX(!UJ5y=tIa78tn}H1C?v(o?>y22YqBu#-qv?koED6N4w8CaB`l=qAbCgU= z%#5{%7inO2%|bO#Iznh{b9IfzH7&2^Il9LtUs3>XtaWr$r%DzTo6 zJLl1{3S~nFg*Rgl-R5ny>mq5*RM~El04i81YaX&8pgAd$#@fWRLNBGP$OK*Q=dEL% zkZ-M7;p(OR;;LZGu%Q3lye2=sFI&_-7NvkGjXxSi5z7u6nP3ly$FvdSfu`%Q(cOA6 zv6uH`PfOG6^7YFN%nxpu6dLSqB`b}GG>>EsPt)x1RgjBg)H2+QdNV!clZHKUdt{{h zR%&(k#88f8D6S{+SU+zwe1r}SnViSbZ}AvoPdN{0uwO|n@Ny(J9{hvexwoa=;)3@^ zp4ZHtu)6nUf7})u{9*j#o?nRc7=4+rGKogNDmtK(hlzVkmB5$qN~qw2#t_FQ@7O*1 zW*{&X*g1~fMFw?Yr6FEueD3Ik4m)MpxX0j3yV)cO)Py!BRb#@O4c|@Mxs55ZK+i># zZ@c!K&Yr7AykKh%X)HR^7!-_`I3u-t)X=a@(C$Q_fGDlUj?$xo^KH&43Ga8QypGU7 zg6#rlOZ?Oq-RYQ*3T5gGyYA0!9x%IHN@{0mIELcO^%vfi_C+^WU?;tkF;0`s&b0_=5_NYNcS_=wBnc6Tt z$!bv_scn$K9maTkYW)g{a&gQ z_K3)e2H@z>5F)ZjLnifmL}aZ3gav}#-GwrPOikY-D5~%_%*;n{+O2xUaf<>6w9uAg z*OY|k=rH!Yl&|$oNwoU1-As-H?ttl0CXTTvr<_pg}H-`)AtM!4lht zaV;nag>jeL{*7xeK_`q$U%>*g_vpj85j4m}W%(w#hpCUs;!r_(6`sNsCew(u%^@JCdg<*!bA=mcAoQUBZ8_h>dPNCEjUfZt`M<2 zt>&ZUIjum=w%&V`%(N*@p}`)iMe|6e9p9szw2^ycaA#7Ew)em~*+vd%u!m6Mskypl zl{sR550e){H3kjhFns2}H6A{A$9vVVm#U9G{820F)@08Inv@1ESayP&9sia|mk`UlAo7m@M&g@Y>cA6v* zKu1$IalcKaPWum8)gUdNcD>LCCzxOxkuQ&(-biW)Z}x;JUOH5;aQy2 zXRZVS=*ZU?^O#+G&xG_@P8$X&33HV!e|VofcH(=C+V0FD&azw4Cc74+Z$%ADLD3(~ z`QOyej23p`PnEdZUKC|npr~njY^}z#$>9QfjL(#Fi=nqGn5;&kyV0ithYkfHI&~%2 zt8AJ4*Pa_?hTe-UV4en=^7-=86c|>g`?QKfhXUbQyj=TCQcipEEC~aYgt;k}KURrx zwtQQ}9)lb^^CqHzmaqq=Ss@fgMa;1m(Z2I^G3J@RZOjkAXi1?qENv~lIHCE{{9w@@ z+e`M-$|<2VtW?S=4QuSF^z&$=^Gc=NbWj+2?9a@6Pi7of|VeO`P+T`L((>nM=1?j$nxxDzc^V&@%C$xsWZM)t}2EX>$m!its z#5$G{I!iV+QRR1S(-J4NmgxW~2j?fzudF$*YJEnWYv8w!RSfD2yC708a zMhSaFaC$+G28u$d!m#T)tg0V8b}bt1+?d-_tK}_x=lVb)LS@q>N>->1tCL#ZOO{&i z(fS@B)6zko#+va8=(wkOTx-UxP#Zj7i#40I(6QD%eDnb(Z8)J+lkdrd({c0N(m|i= z2bm#oI@5MJ+KkW5pk%t&SQ`f!q^6$aal!54Ao0wJywguRQPaw7QNim*+5~U9|3?Z|C;FV0S)TveQTtMKzhtciM62b`1=^Rf#*vHMh~d z7bP4XO5E6lunBuq^oX>hjjdLZ1W@Bz{k)pAfNIAkG*Wmubz_YM9hu^)JvUmVM3mY# zo1_Nh)uhSq?5RQc{9OcD^3w^K@U zuS>5WW=%Ygzy!ciH^?A(;mtP=tK*cW~N~Z92GmBMvq_B;PWSpbhTXj71i_ z%pvYsz-8&8IvJPDL+K(o(7la(Gjh@j{yz@LxCRL%p~(qfaVLF9lM_LKCKP(}UFbE!`2xZ4i9Q0H18YGZhf|1Nu zblMP|o3rK15dPNzrea{A3Jrkyc0qS_vK%?20SG`@if^`Jd-S0c76=rv(_AL5%#LL5?-Bwe?5D2YQ#N$3bcx@lZ=jSeCS zNFWKVyiMQ`aU3hehcvqa4s;=R=s>Gg8tfjDrUnTlAx-wHCL)cS!$Z;};6TUIlmxd2 zr-=o&p-W;#WNPRkU6L3Jsd2%C>5-c9^jmJpd%N4&^=7hpy{!CslUYRYy%l{+9Uw6Vph#Dd%b|hi&4`CCo8)b}B6KLy zSTL|eshL#C!DSs%orTwI{7h>J=T1_}&Oc}p+p?oi(NE!}T7=^!68qfs6mwj5#!GS6A2+0oM4jzGR{Eh1C?9W?qf^CQT>cEham?bH1U05s_ zSfW;FMhncRyieAl74m4{x!8E0vN0Ii8v*m+Tj&L)u#`7a<~5G2ezj4fC>1og3`Fq7 zR!lOhixn*xSfc2A{c^M%({a_T?ska210J}d6s4_shZOO)Jo4l;%(GaV8=F~@I(YI1 zFq5V;Y?Z6Osa05fyxjmSHcWeVg+NnL5fp=&FL)w`=n1Od>14G*E z9n8QRy}*z*LI*SOCdgOiq|Vfr)cT|C%bW#sRXB|}E9ArAD2Q~+y zV``iJ^&sC5IjHH6!Gxzk@39A81Sl~0Tu3{i2j&9rfcjj>bUqKv1<~<@`lQo&sCw4n z^v!Y9HH1EAcK_z)$)s2jjEOiqC~q{(-r`)%#qqe@r`*2j)VA zhFkzo)8*?Sw=*3`SS!hlL#@T~!iTA$lNYDqz%Vsn!BRd2X{&i)3V568J!{jai<5Am zXKlbl8q#+8z%=ky*;^>>6ds7qJA^k*zWsFY`JX<$OE(VF3bl1jhwJ!{tVgX`+et`n zS#=o_CcB!_p3b)Gy{82YOo7wkf$)weyhrn#A*H5U=6+#mRcsTKyd_xBzvbz_pjGRG zWmWN`(-k=>2^%0#yi2S7s7E|(`xrHo4Oq2;~s z=I@_9dUzK;*DY4F<%da8?061us@XpcEmLWhpqp@^|3mo7?R#YAy%Zvf-vH46;|x57)} zvBV0BJ+=X>Re(hX|Ml_NbnwNrnoXW=>J^nob8GeKl%_XX>J{^R2FURi5kYz_M`|`7 zGfu^%RV$|j1m)Y~^X=mK;I92QJ!nADeRBXVg$WjDF2*!u$;D{SYq+9MT_6Hli7Gh) zs}mJF-s(b}DjK}sh-(=XJ;y?#JQ&jSR!l^TT=|Y`#jtLH#zJLD*0S$$IEjVIlROuT zcsh_6s4U5*5|gBdlUOK_TpiCw>-AtrH<;3h3*9nB2k4BS4~ML-wj4jOs!nOA1ikl( zIk$06*8$JGpD5ra#B@xN)zCMw#0Bvsq!ifIhz;4SDk zUnB)fF?^GxAOL|Pn23hqWD*WBk%s|%V27nRteL8XQY$iVC=Ce;3v}<6X*V=3`tX_kJpl z57+BzD4;5-S8-C(lc_q@s}ve4E}A5a*K|KP{TP^e15tVvI~6=c$R7!p=b}imPc9D! zF6*^P$b-e0F2khNdZU?{$}soXWD@zMVu0Eh$nT`{2`*zp#rx$asTW95xLDq)8NyQO z2jerhoWJa2r>jX62fk|Qn`zDKd49?pRuvT& zE9~Yrph!38{e!!OCoS_`co}FbZ`$hj!0SN4dxzQCOS6xp8LjNgh-Sc*-xN7gFq>7> zlcH`E4dc??K95Gr!J>LO9G_2TybG-gR~s~6(V9PG;30#mTlAb+B~O){PAo97!v0hF z5mqWfg11UIUDfmFm6$+Rb!M966eR?3NFc}Gymr?MozqwVo$WKHxjt6;G?R`ITv0`g z4_yzA70k9$)@64+`E>I96p3F%lKiwiLuOZIG?W9 zbYZL*)$MAT5(flPfY4;sq@vqz2P4{eE%HazPBu76{xD!rvw9LgF{@7dttSaMBwS5X zpPtXCicxkZ-r<7yN`|;z^2;6-OWb0Vg3-qY7PPta+Fey~G}=>oEiQ;N#f+x=k5kM% zFsL)d%sp|WVitizLdNXr_UwMl&i6KD%uX|A)rwcIermS|Mw&0jWz$taa<;7XQ4R3! ztXKvWq!a=-&j->ZqgByh15~J4L~M~ko-sC!*HDYc65WrnJus*<>0Z%Y$t$soxSwp$Qg3i@|5Y{K(z==f-NMd{^GD6dVFKrEl>D91 zK+lJ5de-OL&7^+G1NDDDj;O!|WmJ;NNuceY5$oacces*3H3X5xmKe>lmfS)iuHO8FBpk7A{U3c6a#6S*+Cmg6Yp$@4%FO>vd-jV4ML z)Nx~3_bq`(0^Gz}2F&E(UR6tj+MY&HVhA;rK$g{cDt ztI%U7HLboG@rXy~^&8CHV!#4TEjdM+PG|Lqo2TcT3LMa5ynT}%nNw47vZ`i3LX5ZD zK868WTJr0Bv>w*W)Y&LJ#VA(e5K!Xd&in z75hrWE}Rq(T&8|(XgY~jLeZ%0bn|pG8b7CVA!oB>yic`~Ab=sME#S~VD+$7Dk%n1) z$kakWY7t(pJECW_q2e6@l z=6S+fO>QJRCscDS0jP!EY{>w(sddJ3^U;E~MG+zN%lc z;@T}e4iD+MFGpaaf)-+SmMCskU(P7M9-Pv*H$=lbDSvn`=%)aC+TcZvKqJ_qNE%^ zC*eSM)mVW37vJ*`w54Qbvn+=P!gt5+2BC*;Ve!M-TGjmUe_>guapBR8L_4ve;)Z{6 zc=sM{Jsy~4j6)i=rNMBXa)l%HNUn-FEjd&$U(YaScAF_&=?-EK3f?n8N_UabQV zbQ}BmbTX;rhA3Ab*Z+4BcMy#*Ax4>Y&lCc0?8On$?iy1X3H@M)< z<$TWSedRo`!JqRqFKNA{uz6o~-9v-@J#Tf>1zV0LgJ<;fq<%G+&`t2Pzkx2%V;P_s z5O5g~d%6~I=(t(XQBA}ODb4cb-3lx$xNjG@&qf=%`Ie<$U-H}1?}5R8(et~kF-x$< z{4`Wec$}u0!GY^?!bL~j@HA=;qiSQbfZ)57@JTvNw9-ar@W3Whx7n;}(TD1mIu8gw znL6_|Z=$=U&f$SAlR7y<+BtOw5PTPS-km%@Q*u5EEv9cKn3_QY*jL*r>utat8BMz>_Me9wt0lRToIB<#5 zVYj^0{21j<gAqwp!@P{_8d%yjZ8 z9uI6HeRNV?Jw6vzuv7X1A{a$2tQP42cBfhhK=6suLT5{fxuH%T#=(J0q>Yx64PT0~ z*(q%R1fR$~`ue0gd(E4LPPrEl!I-8nY0kT*khSO{_ehVhXQ$kAa7de|dGsZ15AUz$ zc|5SCc{d-u>N)QmVwsUf1bb$5h+s@D+H2HK7LB9!w5*84buB9dhm;Af^W^A|PFxPI zz%`wWMby%X%fS`7X8m#*IB*GHGM&@rIKkG*mjDoaq8~C{2v^dnA7atKBuWSEJrz{l za?HYkOZXAuqL8A`2qhqv8EMOI&x{TcjIyLG*8Pq)P!iil8|dp^{g%f=>eA98MpC+# zmS|+-7Vkq&*F)pEHuaWH3g*3X{TOMcXCiQsQjE^|-U2;EpK|1fjm~9Z!7bV%YT9X> zvcJ~dnp;5or_kWBx*Rh&t5| z2L~>ZZwor1ZZ_gUV5c?-fZ!ATXS1JcUeU@PRxmsDpBqSUVy3`Xmj%($dL5eL=cC1% znf79@Jq87@uq{pgu6ngC0Kq40YreLtIr_700|`#yW$4UaSy(&u-aQ`JL|vqFj8>zU zeYV5_5sbp7?t7WUPUW?M1g9uBxw6`+P67~oA`huzOuyxm)}8Xu;}zJ};}snm!HQ@n zHjf83QDWS;qG9Ufy#pc`MTw#DczR@2@eRqHN=yR@PMJ!&gn`yP@YcRtDuLL>DBXB> zMuP}OQA+6$h+g9vk5^`smA+dk-JTdcu*v+R@!#a=jc(QiA{eDL>3dNtx~0$IwXlgH z^UiF92R7k9a}h=-{|P|wi5hR?`(%8iQ;lyR!6{0NeL$AbP9-KFf)Oj)h=t1LfR42^ zohZqvS+!RTq9RPNidgtXV%JWwu!95FHFF@N$=reYKr8Cq#dKncuVN)=z_C5W@S8*h z?`8P}b-o3uqVxoiEUAM8)kH_8iaV$j^&>!J_#7bEu7^i0+jL#y7BbfCEBe3z zD8m`Ug86EA0n9E-8LuMl4={ON4+>UMj!2llUzE{yEJqP4ctttFQn`2+R>yJ#NHAUr zhOzdgLUx)IC51-_C>iqxOmK=kHGKAjF=pJ3dD?)MSZiAPFkOsz;M$cnfPz)zXs#G_ z%uzss@m9!-@S)%b73+rsM4GS0!m)=1Klc^>snj2K^A!vh%$byr*5=7?m9PjDth@%>2TZQ9%G9j}H<;k$rP_TjE_Uozsskh#Z->(BF zMFU2mSjW&%a5KCVKG0*C)=05ZG9Z-sMT?Xv+fn-wC%=cX9U&w2nOcpeBqr~nRs$By zH-fRkhtQ(L)QZvn08lV{zy)`vZkdwVcipm>;LMaW^F3XGGUscQdMIZN@DBF0eeQ|f z0fU{#T}Iu&{ImI%S-e}^6{CVTXY_&^WY>^8^EvK&|JKnNg(y3MemA>-8$PQ|(2gI5DAn43Je<*^W< z9iHbB6}(N$?Vm^^v%_0%1_{QuL(bT*Cn8Qz^!@_?&)NV7rY8QfU*%ip!{aXj3RYoJ zG+%M~>1a_vg0X3ptfbIt#gvCfd>j*;mqI4k?>DJ`QjApvj7&y)MDU5cY}`kj$c}m0 zfP(eipwOg}CQ@lb@rF*wo|!Y@>cxcbC|2CL74Xs&=g^^pmnqYI8OVCmtxN?-FgBjh zq}+aOc2bjxm?J*i6DF`==AO_pXG&K$PZ*4{1xuCVZ7aXEMSA*>%W5 z&e5^o^!EaEn&7fMxgHd$yp^T(e`MLMiQjip z0~qwFgQ1g`hKq_e9`mZ!*}+7(AWz+@dC1f?mhjGQHK2kxt><)<+NK)9I&rtDb3NzK zknrOq-`R6Rd;V8?rgdP`W8TN@&aiVOQ`z+PcZ~g*-Y)(`j!jiXIY_H}aH2 zdBVS@x3inp!h$-N+Ih_*i5^mGAVHZ#F4ZeOA<{K+F?dC?)A@*1uC8PT4`hiiqirTl zOcPhCuD*-`gFbO5^wjBeL5K0O6nAwe4JwEeCrXddU`R^c)rrQqAWup#J+u&4hjcB$ z9ukx}Loev=f}X=+!|G5$oCJmR$Tu>vU4uekf;5*}(?*G1TRjvjj|$>kYS%|dt;Gas zt`5_R_%A_$Wxn!Y|^d|jhx3kbTz71Fn+pFEW3kacy1F)qlHunrGR7qkP3@9gRt)(L1x zNJ1GrSM$Slx`r|lEU1g7e@|WL0={v)2>bem>^A4 zxc}iW@H5%ad>(DXNK;6sy2`G1=M;KOq%iSKq-e`Wdb;{1hX}%?%RQ$X9H+|}9~14` z@&-mFmu;fqCo|5;vDQFoBHKw#XCD)okNTZ@-)>p ztdlbbol_l9L7W6L3!2xWt2xHAkvLVmYcRurL7%j}Nk(^Vdo3X7lKQ)(<^H_c=~{ms zA_$ZE`^|Q=*vM?{T7Ls5Xp?lVMw2OTZMvq@A%ZX|zjVtwUG*YQ9PC zhUmmuVO;|n0SyUB_i~k9;oh}-=^;Ux)Y>&&-afR&V9O8h?pkXZFzAyMugxYQ9y51M zv4;d@Qli)A(^DR=b}i8k5rm0nT7M(rkfirzW( z00nJmw;(V-7<*{Dm7;<;bYH?FJx<;i;yv-v+ zKyWzO$C4i8p$?~v4k2mLs~3OXCbNp2i(WtlaZ=UHByVrixJ|;vG;Zi$u_t<*N6q0P z%^73&IgiSy?d&Xw!1!%0#w(KbHI)Ujcq%K55ri+zeN5?m?4e@>8Caw?CFcE!bDywVFZBRj+R3Un#*IBeE*#Q^iA?S}Dl2a{*2K@pOlsQ9Z zrdfJ0bZHhX64u)+n#62NZI82P5p8J}Eq+91?V&@d5)-M-)!}BcD~?2ZsKX5~=#%)1 zs#0&WXi=K;vuJprr&+WJ4(SX1jRJ!akEs zI&_UF8dMM`mBv2OfrDihG;{L5fS0AmRJoCP6qN(wGEwy-k7yJ~OKVx@2&W&l$v7dgyEfcsVizBwjk2 zFJNu(p=$slddzZ!)F&g85qXbOAsGoC9ad-+@?tdG^3}p!he+dOI&=v6tI2e{q0O~& zBKNnuw;QfElj!>A2nX1I>HbDTpDbg4a~QON0rG#d$aMb;1OB^%fDH<8oi%8!_MERc zI?Ngl2iVRUv@MoHA7%{;17v57rPx(@m^BOvaR1s`nf_uD!Yr-W^O`9gKmz`o7N5?? znN+7ET6D!I6#IoU6cHF$zHeE!OLKYzWBB`nii-#0=(bMrd_4@^0|EWYWO{l!o1P5r z(a&l%pu2RF?T4BHL673*3-gemybj9WZ{{;YOUDwLJp|$eR!tzAV@**(d?O*AkDgaF z>MM>f(sZ|5nHyM8-^^2QMkj(>(I`OM+js@^WE$*^9I>6Q#$`2WhbgAiIY4K_d%QGau!ou#tz8V+%y&g{!TI9Y^USrnI#B)iHY$c<~EWc%T&4& zLKA@IYFi!|0)A8!P|a7>#G2Q!QW;S=JX0w@^lrPr(w{pP`pr4GE zQ@TYZq;wA|DEx5%D=MToXhj!RGV`=Ff&p+(b)bPVh3)(+--YdBs=X90o)7DjKUZS4 z;}LR~t|SOlQ24hYGm5#pqT3GWur#`l&gODr%c}o!n4^T^k9H_t&<$4Y#U6ZfaOw!l=N&*EGeX>K5+viWG?QW)Hle0|QuxD)v8C34@EtBeGdp2CIn6}5_+;cT=x+m6n7Md;b9 zNGd4&Wk_q*t5mP5@z(aWY$q}~19;SL`ODEk>5iJ~Ugb9Ix#ofbigwgo*Z1_UIO&4- zTys-0sN7LM&PTK=jNC9Sq2}|qJ=YJ$18u)(FMUxvMjf(5;eYg7_%dwJX~Nc)fDCV% zOirrEzaK|s;DW}V=`?2S_^-!N=$WAJ{ayMN&zXO2=|BghJ^Zr?sY2IihhMhgSL2JA zte*X{q=L0H3fJd!j2aDZiJ0IR3L`2g+*x-ig!Qjwg67`qZo&qgABNJBZQqFRXwi6hTxWiwgTQBri)mh>+b?iwuEK6NV(SRyx&sS!V29xe2f{_YMda?@}7N+ zq=Ld7rP90>jk$1%J(tRa3mR#FzpYf7_gs816$AYL(r<=yBB)bX5YY>bS{>bjjB78A zVL;?N&=_$+9NFUgGtQdT0$j7Z1t6MXbfU zJzGzAw5e$H#d`XL{`V1ADafEh$U9K(Z4f1;D^Zs8W*+z1mg3OZA_osCck)s;#x%?tn%!rIt>JJ%{+=NJ zcE6%VbVSn;>zbnOWWLyo=MGvrt{O|^2_Q!n3r|f8iQ~9Z1>Y-wq{Vv zfZ)I1{Lvr%$owC4{j#;h_H^iJLkn{>w_3fJR!1#79AA7{HVC~{5Gp#0nw_LAUX3Co zR1m+FC*JO=sNn7sL_TO0L?&`@c z@R0H$?7`DI5wy|5Y%Mk$Pnn*UAx^7Z4sk%#U2}Wgg6v_!+-~%_|L=HQeJ{2eD=fpY zY*WDhNx&ZzL96a#W{zP+Sa^tdqa-zbO|+$#i$dXGt)_7JknuME5*9mK&tB4fWo82$ zGl;@JIADvEm;-V?35(jb#e5W!B(mU7Q7yexi^>^UN#JN!%PqLC-A8taj6mg9>iu`EhW`6yDOnFQWcs#oEeH-G4b?D#-yczB?7Z4hdn-*wxjoZ~)AfT*?ALE!IiP zYk2GMqPp#h%JmmUzp*q`fc&h_e}}1V@}Ktj6-Qeb zREq(4cRy=^$%ZDg`BnUbS-@krmO!R^IvBsl2EUJC&P(d*f)=*wm!nT-vzj*HkSnG| z(XxodqrSjQiloTauI;nQw(_2GzFzQB8eW@ZgSK~KcWZL;r8x|mwVJvYueKWJg04Ty z>T>q_7R5WJJ1iFqF|=>lywtH=ORUi9d%q&b$yd~YGAHkaTy^hPz?a>yh4?7N%gJU; zH%*vJAy}{EuJ~us{T1J`y5t z!eX?WUieqb3S(FQawHJcUW7FC`C*DM5J6bGrP7x61eW5RpPyEC@;O^{W~OJd*j4q4 zPOUxTk*ww5OSdAFWU!c@GAj$*?IzR9CCyi{NULsa0eq-JT77{F^4>pSKiBjyX)Q-` zx|`1PKvr7?Fgd9!8Z(R69tIB;F%g9MNm*E(g$g>uWLqOvU$DMtY@ewx25COg%qo`M1Hp^~$r8Y+luD?VyN z$F#~n;deF-UVMQDqTXx?3)Frx4_7RfbF@QtG6WFP*5FV&ith_1X7C0FBoNdV08Co5 zq{S2s9sn8^NNVegy2P}3SKhZUcwdw;X{Gt)HNHdVB+?otNNa0iOkQ%c|ARL%F%g7~ zcx_>!GfF?sElsxUIqeombA%B3E2U7{bh%k?X~VNP+k2s1{m};4SZquR!G5$3xT0mv zYkbMrx8)QZqF=2zX+6vKrw4A>X zGYW$jV#EVkZDGPD&rNj<9wrzQq_s_5(YEr%WNHp*ncZkC_76UFCAc83&2naU$Qj-1 zb^2isV}i7{v4#2I2N_$$L=e_iPfdE(If?rkgV)o94HDbtL(E4%zfhGshHN#04vf3HL@77JK5Vr*2n{(gY?bDn!q))DufON%Ra<(BzLA$vWo-`m7VG z?z$gkBRiqctW6Xw6joDCZlOR03*F+=aquGwU(7t}Ws+meV@RN*5FIH=vSf3TS`Q-V zDYUyLS$3Rol6IG|L0KVgo3yzZ{*$zCF&T8VSgct~i5>i87Him`OpHq-AIHEdYdQ6D z!;wCpkV5Cri*>R2BwnS6jj7&f*Hvpw483A6P0p^(Iz=p2z3sBA*oGBK6&`?fidg8$ zJpiQ8Ddquk7ERVg)ay)Lt!Wt*3X5|ACsW86p|B+mHER`dA)hP`HEd8;X#Y(xO(!W% z(nAVV&{XK%HVOGGwR)=VSYNaG53g^uv~ios%f))a_rRa5jRP61)#6*tJj)N_TMgR* zWo$X;;2a}`Er5twOISrr zUB@MMrrrH;j3&VcI~Dxg%qRYEyrA9VwL2Rm%^lFT% zh7HOJb1a#qgpkSYJx8@s$1rsGkf6sK~>EjxxdrVa&gC(dZEQ5 zM(ZrC94IGW*9vLRNgA8+QSahV%dr$t<7-%~=8?0E{U;_xefLef6owBSetWL}(w0)3 zF5RE6o(a>7aU@XWXXO0nu^46)#Z&WcI-#h8L4)1b<_tT{iZcO<8~TnAV9=q#*Wt~2 zF`vFP*Yeu+vr%&NReeC%BgHi)hYfzzluVlO8C?!6UZT_26bE=f1}LD$Z(5VqaBC0a z^NL=FH4V6kChAt{ux&C-(B|h=3fi{oeN9_FQgQ0Bty&zTg1UCgZFlQBCvJGl#Z1uV z=evCd@6(Lc;*oQY#Ld+gkQJ?!z(a)}g%ni46XSk`y4_TZ0gKnP|LDK`rjv}Sj4Q_C z)cr%1xC|NW#{E7vum5N{c|miw^spfdnf?8~l?v+of%vlhSZ#?7sO~i$V?f3RjR(s( zt~9a4laz5x28C#cU9EiN{*&Gaq;H2y(Vszs{q@R(gps$iPm+WN#XHFiCvAFSWN`bD zV#h=L;VrS(>aH_0!)m(il+~~PEpe6tYWx_V+a(hvV)LlSJcrDa z;ejq5#gPSf?O#3+^^f8u7HIMt;Ig)20UEJg%nZKW8;fmqnkr5N)-7e*p1 z-neU4Xj6N}+w~)n1Cd9PK+$!xf-zlg=rx|&{D&qB>1t?J=d|px8_^yY zI%`(ZJ(Xj6@M6v%hkbCkG`72$nZfdJlNT_-`N!_}%jyLy^uO*#V_<;%szas)1D_j4 z@DJSxA~f*4cfPKd=C-_=hL8A@*-l0L&*_-^csAKh7`LJg2}rIS8{qImLIFYdLYnX= zyT5BqCAwemTPHLQ-mtfdxdc3fyc6idpNx>jT7hEcQ&+S0V5d8CaDbSgoT0)pNSB^~}m*T>m~go}Ez z;V)Av=I;Vb(RDaJq`VuxjQ+IPZ!gE&_4#hQp+hIEeruxi;VN}57$7HWnaz4bo7mQTg7x@fN0g=upuEEX*b40^G-2La1#U&ledQvleon|_Gqvn z;jLiB@Fy!b;~0ur<^WPI6eB`-M&3P5!qhbea?b$XY74W>W&)SIhG!UC#ORQ5BiPX1 z)=Ir46W~~s`0{Y4ETD*zV4xt43c&xqs-73>M4tl4f8YurB8T3(D_9C~Yi%}dH z^a;yF0*FcLf)&&B+T+QH0qOz=hlprw5(|#{>#>YJW0L~>At9l!ei9)89zqH}!g}ek zl%aft5kO4TZpQYb34=-6=kC*1 z(9%3oT1`0b-1I|3L=V zaIw5?_Zw5DoUK>h8bt6#QH-WyShjjZF#`pLSA+HHYPlAdIUm2i(0HFm1J9d*XZv!w ztmy9CY3W@>MJrfx%q%uEyx*=NS4R}h;4xA_0Yy<8LfeJKEsj0f5C;a9sEji~wnrIz zw7|35P{T8N@Z`~GawbbkwvCv@`e zd9|Q3JiO2Fd1sSFfZ%&I;#;icTzq$5b68-B?Y4Y6lm{3jFuW4wW4YLJ3Pnp&D1Qr; z<5(@WyjkqdVWGfrGs?$mS5H=38WK#GJU{n4djNw3XIwg)!Rn_$0z+In-|y!`Sve+Bmrcwmctp%!k} zJ;E6zFvRVSnS7Ma-M!rb8klZHmNQEov+8Vrv8bL^d|pJenvrj|1t@s03f|3R`;7Ub zVgyzwFvDo!z!lf5t$fzJdrY!W;D|lmY*!o9<0C-u#U5{d9@66j9@uU~rBw>JiZM^2 zz+yx&#x>yCdOlzc02-JgPaHq_`tfM8-|>~a&Yl?Hz!l}n{y3dZnbUW!*9{t&B7d~M zZR#~0`DJ9CBXA7Z%E!m51Mr0r>y_}l=XkuTUhKqVa!bGpGl9lQLed8_FIHIAk=w@eS=%z>sBnJ0<67QEHVU?i-R7b z+{t&62D1aeA)|>Mi5;3S6W7_Uv7?L*A@9J3Y0{>G$4V6YAAs0iDvJglQpz@IlEz8~ zvq^&vAs-?KiA~n~-DaP^b478H0btt=BRC-HXZSi1Wd=&(qu5T0Q#^of7nb3HxGNWb zm~Td3(*Hc5!!x5zRq+t3m|U|6PC$wUp4ToX+eFa}JJ{`hh^nT~$*@YByzxBQ#K zbC~vPN5pY}|7yU`*iSKCm17Wocr|c@48}%NOf2ST0$3(D8Q<%e8{u_#jX6j58isoG zn&>6@n?~Q5VJ0jH$4XCxN67YFGfg(ZRX5QioL}# zo3gm>dSM8&pWJzcGzugs2MUi%eevlz0?EQ|w!$fb81+W$JIxJ+G*CyzdNn@nhC zl>Sv-d8cyefaleOf5;L*3dQMi%FNamRbUK=2gP^_$e{){d@O`h&2ra!@YY_{mIcs5 ziXs+>qM8-H7ow=cLe93Keg1q+T~)IJ>LFDz4P;Rx5&(oOnssotV!=_>hy=_-q5=sd zwG|(wuB-3&a$r1g@kJ~U)#ll#+HGoH49}e{Kw4Q z6!rwDTC)IrSQ2A`mD)VXh}-RHTONn;`7l%6rIF}ki?~% zgcK+;6@Lhq&QL%OHL#(;jVGmPdCXQdumLjbLpcrzqQPSLnhByyGWg1>YOol<+ND@@ zhv5qQ1hpe8E>zs@!Czyqn(0AKpuING? z+EFmC#nr%SA8+tlEEjP=O`$|h*!tm0G|Sem@E^(h%-ZVI<~#Q~+>kz(XM@5wh3~pr zVZKREb*by8qC5iwl#JSyjJIyXinkh%rn3R-XrnA)gi@L#G~uwxWw05|3z}1bS&jcO zutv!Rb-v$_QD+}xcCxwoRMVF%%jJq{%*TkJ%Qul3U8V{-S*)+F9zZmZ?W!UgX!0Gv z1|XDVNIagOkJo&0Zai>NCS=gpZZmhg;mK|0X`t!Pvfls5-5oevn>V$_v~_r2ucX<| z1~glV4=VF*ga3-|3BN3895V9e*`P3APyIJ}0}feF6C&vHJ!?@Xd~)NdqB5ul9Svf+ znsOE>`jzmwFRJs&ez9|v)qg_!P}a|@+1NQC4{wTh=gRmB1Y)XZ_P&kZ5si|81 z5Sly-G{tix+tI@{-Hosq{nl=Od`!pvS9~@5xUqE3MmYv(d7b&MPnm4~Q|uRJI5O-t zxn$R=#F3>*G2hZ;WmP|`X8%<2TU`3rWS>1w0ZaIKQ187yX+EYXHtOok5#XWXHv7=4 z$kb!iuBIq56-z|a;hQ;rYW!KXRa`g2V2b1h7&+%r%;%gE%v>Ly3FsfiQheyhmOy4F z-C!jk_SU(6tE~d`$Qw0pZcg5=2L6Voo)>iUIL!&xG|5H#%#v`So#65Wp=gd`gt0!c z<=pAR5vr$Zc(=zk5ysq(&&*IJrl(JT46`ORgl&t=`MM1~v2E6NRjp?pT>QhdrT8&_Sk~zG^RUv-KlW;@TPC zBTGDDgGf!0+s`ul7fxi$m<}>Et(5(aIxFe6uM@RWoDfnqQI&l;UauB>{BfeFnqh@# zO;?bngv{yuT;J+MT|vPJv8*5P`Ild1x~;SI_|b14KVcE7Z$F@&3F3Yhw@;7f%grL! zttNe6-skePYq6y|e~1eLSv%DB(Qod5`UNv!-*)IA86;k#tAOpbbzeRF^wFD(^o1svl_#3+k(!dU{!jW9^^y;&gZ=vSd$l zPcn-KvMVBI@|5SN{W8Wb%N10#-%H%5*Uw$14iGsL-kG_+uOFSb!tW-}o%?kn_Qop? zLINgJ9|C3}k90fPnRs!gUmiUm=&nPYtDiJh+0%J$R^z|uq7`We#$g6}67p3-TKY`S*L`X1w?N@;XRRittUk z?CME6Y7yiXb8)`BUy!qKpb{QS<0A14RX>k)cp$sWOVR!~p3?pBqQX!rnmcB+{VI$H1f48Jy0My(^(;jL2P#oLmM`l$P5bc4zkb!D zfdr*!Kg>Oo>C1Bc+K+$FSli6IB>CejM0>34!obQ8_5r|2efT#yStr9?w_6C219<>h`iqjScrH2YPJ zEg(TDOVn(x9Mo4GAn2s8%Ip4n`l^8gl`KDd3&~>0evG@=gdjmFjY$KVJtyoLXB;5t zM1R{{!^_*He*JBS2Qtyln55Q!3a_6*Js{{_!#Kc=@%M8c zNdKYNpwOU!=$0T_g{;R*m%r&p7@>k#xXcTB!E4FFOFx%!cp#%8+Gb>Kk^5@7p_*wP ziJ#M261~ACA7cMflhF+=1kqh;t)QU(DWxJxbA#LDY&yFCqMGi_{jp!KCo|GPBjxeA zIe9B@v{xJz2*{A5C4#uO1B4N0Hk?Mf?DaFT7by1k1i*}@96qGHAHK{;$(l%UJTZVC zmeX)R(tF`+A<69X%z2MuFI>QER}@n~(7o`n6SOieRB~m-cDR6-6_db2$cN!WBjl^q z*6f$?u2YeV=ZvG+RT^M3dde)2B?^pxU}{>jtF&){6(}I+gOH)rPDapny|2Z)^@^R^ z0rjAnA`+D-IwC?3Qa_!D3FTo$MI;c_>QQlBh~v?)9u>1d);qz}rU1Q%yETrSk1H;^ z35c1(%Mw70sQx}}sk-&8{u%goA&Wv#97sqE-!8;8>$C-H!?y+vBqWB1kdH#C8b5hR z5TOZr1baTiJ^w5H$+9%2;c@q9X%yyCrQp zp+#9fZc(hO2lT@>OUWSeCjrKYG{t$J9$0!Am#Oi|iaVL&KDhv#(bvXvjI>PO_9W6g z52T4Wp3P0-aDC%=nFX>w4mQsfX6glTGo#pG7T^^{nzBKr=mgV|3)?^Nq1d$LNuRuL zC%D7`Ng{wejs=yPp1uL3NCHu2=oO81So&-~PjOl&KxT?C&j2~1*pkHCw3pYn*h(B4 zNm2JJcJo0cMI4aS=1Fnm9%~xZlVTExYAd>pxn*FvqazZmc^uSE5r8T^)W&i(vIjnpxS=d+9W@63sG{JL>1Ec^)5QL_j!( z6OupCN-o7z#jepnag^Yg5psVKu-bE*jkc4M8MmQ>&|e=Tw3*?FLris2u?-~z|LPdQ znTBI}Qn{Y+Xt7bak8OK8u@ND}Ml-F!XH76T&|~j2(|V8y;-Ud!`J1F;+-HDzfCj>{ zH9fLg+F6YYc$k{rN(Z4)7d~Xob%V_JzK4qF)JYH_0-k(rz#0a_B&PX<|rTRZiXXGFy1iwFbD>tLh z*8A1$)B0j>-r3liLnMorbTf#(ri;(NX?pe^)Kw`J0|ecIAbPomRz%H8EluMtCSr|5 zvmBihk)ne528bWeFIKc!qOL~t5HeqN*KBynu?k2~zL}>qFGud?6MixDLq&`@Ox-|3 zLSybAaY%Egs386^-Rw&S-i>MH`$D{0{P&0Ry4}roFE^FHRYhQdt`IFLz=N z`ER>0G)TaIeZC%jwm(0w=-S+`erv9T7|qPCF}|NqvyEZx_Y;)xz<48NOtztDwuTh> zEE?Eu=GlJ9CPOsaq+02I*=$9*o#(T6K*#N+X4h~lrA0(8@03}2PBpdvAZ^HP#=6hz zxj2f|%eoE@`HX$%TiUxsku`al z2lFjGKEQ7$=#&GG1BNTXM#dYG)1`{;3?ZO0dMhisG?z~8C7 z8>9@2X=8@5RD%Q-6MVfZ*p@7HtK))iiUlSUbHANDkNl1`SI5O%0R#?{8~&4gr2V+u zq*!3Oo-if7?f-pLW#Lq;qiy^x{Omd$aku_Bf0Ibak+Ge-t<&{g(jLWewo9>MrYH1< zgLj3@(C;{=6bnqoa?!6Qax#f)}p}0RcK(#1w$e@2S zd=r~+O&2sRCL3-G#e<;%twlit4iRsJ&tegDx`)byYxqVH;Wgy}Y)B~BVY}Z{HHly$ zY$!W4;1I#<%wPNfb*9JxNxaT9$rE>u8^@k?rc44+yv{V~2d^^%8T8y&nnaCT$F}I{ zD=9cc@H*3^gI~uQde)f)8xjh3Xxuv1Fq9n{aEN%#%xKYhym~Yqn?H(q1;xacn4eGJ za!f1gOAW~6;lOnByDh!?_m7W%`^^{jzWbWy>XXwziX)sB#s=aNAQ`c zBZn=l5h$2nZAaibAPa!pEy}fDDZ{^- zEeRYR3SQ48sg`q|RmGzjz&R|yqJ#fBz9WfLoaR+p`VX_S!f^p&D=PlN5kVL-ysnot zeP=lBpBSgYhd{$QB`9d$M)C(D#r+r4YO|wltc?E{gPWtthtVPAjZ)Ibw3NwT%~N!j z0oG~+hYSIC@r|^^6S?tPaeWrBTKO$7=$rCKeV{gPMGMnoX8*3`pMZk)CX^z@WcvM{ z9$;mxic1Ut!!j%}LE40uCc$jxY6YWJ?5=31ZBRkn)M^l?F|BK@=7=D?4S~(iG;6Y> zO@hLu71!JWDQjW3!Q8@v`Wij}brL-l%^)zcq%2_GKvK|UBBo;L8Yo#p4~ZNmrJ1g) z^es)k#FFMQjnKXG=pd2Dg!0n9@xkgzUrG-N$~!0nl%)IpesaaV;wnl&Ws5V$1$h#W zYP#BqwzRMe_l-xu1Zflck>k2r(vU9`lDdZeEO3#Yc9AxX5X*R9dIk*oq~)PhU(;K1 ze4(dr%hP~@wlVtG>x*w`3{=m|8vjGus45Trcg=Mc81zl9Db)pawrEB(Q{G*3oq&S2 zY5GD6?;EV3yEc6(Du|nk<&)4=Mdr3_UdUZ5mc#^U(+2qjv+8WmpD*j$1~I@AUHU3V zPdWz(I_W|*@tx^1_jI8E3fiXG^ESvdv|XD$jtD~Ov*x0g&uJ-8jE8#qY=jD8>9Z6c zKEIqV_^MM+pKUNfdT-&!zTOy=;681xobKk&sx&MrCcl8k+Q1?>WXMu>jU@{bJxkdm zg0ShTdTE!Ft&dE6n!amSH3JLkt1yvIGhdza{WprutANN^+2Vn$>E3{Bd*5D^KBFd= znYU~ACWj01E0F0E(O(&-VonnXxr`b(P{~@moII^uJIfe**4hXa#L~dU&QwnWGhC3z zy$aK;yF|Grwnwib1qQv0SWT}do__2Zu^LQ}He&?uRL>{%NWSQKgzJQ6h;IdTYqwLqijIc$#!p zKyf=(yCHG}Q1P?mQ*$KaTl<#7>H>zT&ENT`c6xaIJAr16fGZMm-WEcr{EGyt_>p-& ziu#!8)sU;x3ufHV{z0nU?hL1x2lFO=_aDP)&2mB8hljPL{;0T1DuFGOycEYLuzsGv zxPwEH<+hjW{bKeYIYv;O&VVr`?D&47^oz-EazTgjibeeIgDK2XL0MYAWpdLedYoPx zJzV{6A%x1q_DgO>Kb`&9jp@ybQxmStQ*gynRa`xgxJtfmBs8$qPZEGQDZOg;HD;(- zb2=H!-->il_+Fy$APkc1sdVu;_t61+Q5X8jq^6NQD^SH{ z0ts&3)ws<98|?Pe1V?;P2*QdZ`U$d1VZ;ZGsSUq*a{n0}%l>-ZG_$GS4QIm=8}y|u zZTdyh4H&MaEs#OoCrLS^ADEdXW6;m3CwM`%nK|Rr!78wV7^*)$LiH0m_{5*#vlEPPC{E%t`Db&7`*!G|I)xO#OlDMkkmdpe(U)NI}Xi9qtJniaxBazu{xL!h* zN~vr^*8|YT?jJ%KsGuwzeb|hAO?$B_x&V&$xTQuLZuF7og0{5&^7NG}&@pw$c68#6 zFa8Wye-DsCZNd8*OS%r?Da%+=LD``)hEK$^Os6Via6wzz7v$!qOOnKfz~TB_IVR|8 z_Ifq_dYM{0C#SgY?3e)8lqJ2=vT0_)(;9)97+URZg70ko?Rv2=yS$mV4Ob%$kiv%P zNF?`R(o_sL5-HL_VLEzy{O|`Ey(KhIl=cJTq}0cHyg&O+J~uX8Kd?Xsb!lyNGXp=w z$SubNUFj@_NNxA2opctXg%B#!n8H6wYQk_aB|`*N>FA9ob^$QmFE!lgt;`3FX(Zv_ zm^rFP^XXIZK=g2tq)2y+LI=WP@+lR1Iw(BkeaQ^ksl1QPpJgJ-%k9@~WAfqJ|Hm1o z7HhH8r>v_f5mco!-aHTPoW`SizNY<9d;~t+jCU&~lxCs|%NET;W@Qc-Rf>Gj`0J!Y zX7;epa=nH^mufNCB!Pw*x<`85iJP9EUa{qb)^y(O_mdqxKVr5gHXYVP<#6+EB{t~$ zRbtD`7juQf*t(_1cXQdnM>}qd9SF{>a)n&AuFi<)(bvP{DmG$DPj5Yj%pX z67#9}dkw2O@Yv+poO;aUTC-UsB`+Z(=T{mHrVgd|%_%O(un64N0Si1gmXrD7Z2f{3 z;Llzznl}|$xhl*H6ibJ{2uM)Ap8md=oK@mgSH&Jw;1ozbC}^)Bxs$b!=UF~IT*-lu zA+&Iyx`u>~YQIXz6q|a1ksl22#3ay2 z)=A)TLU95daAgedhj2l`4CcQXXPwJN+1Fu~Lz#-#pe8yzBU45An zQEajTU|9!4hmd@s(9+(?3MImZhSI;2}@3Ti725b&CiQgiYh`bGJ21Pb=Di%d*(D@lQZOdlMF+6boAR^8U|R z6`Py^BMr+iLHY_(8&cWbP;}t%c|vBeawO*YS!Tx`Bo+%KuR#js#5FaHMsc?p0AyY~ z8i-=|@NHTqQuS~T4w|Dit;gVA$w5IIn>Eu(>|xeY5Aoq|;yxU*$qKV;53vA^yf&SY zkj{h$NZ>WGYY(x64G~S(EF|;}0UgW~UAtywbO^~NExqxx0nPg&;^jW?pbotkM7|8v+9=h?5v(k|fg> zePd7q3fd$bm=w#*Wh{N;Zj1}^+ptk=?Cq|WhnN*t4*;oXZ4V3T#EVS?}zLa7*DaoZ<=NL4X913^@ z`MK#i#ZKF&)nuSBY~nqHSOsKew3g-9cgEyu*U?lb$40E3=2+BTJ3?CH~r zHh`cDb4@S}GnbNM@57y#XN(TwbFt6y0(K@r+d0w%A zeMp3<1ZL|3Gr&M18f=JYws4p}Bv}fUur)E6-|V`DqX-Ter2;WBlIzz7v<170Evz7= zwxHK8$U3Y@Iha#EA62 z$mZV)7;14V;WxmbZ|ZcMDh`Bk53_5-Q^JObY$1gB6H6GP5CSp;WDCJ2J4GQhz@UF^ zX|E4@Hm{!3K)m{1tTie2`SBNIQaCWZ68$utZ25$}Vw+!)$AW?7#}UhA^@8;p6x+6n zBnAr{S0WBvARjx5B1RQ?fS2Ritgf$5_q9TwZs zwK3b#L;91s%Vj&d*wZ4zm~N9E)4N;MYD+i%@w_T701LRTx22_luy+H16xN7hMtPz* z-q46RpeZmw&YNX9#(GSNrthUyV!25m_woyc+Xt=YQbY`CCOCHO?yBmJUlA zBydE2RVR+y(XSj37@~4dUWo2k?(BW&7+>0`D}HRD2tRpyx+6Y&c{(bA^wsH(CE$Qi z0@s2c*&pm)3|2KX!_kZ{MQGr`Ta|C`4a_> z`sG*jqKJ7`Qx>Y?Ciskr4-h~P{HjU*TdFJnLSt?gx4QXNiV0Tu)fe*#T}UuGoA0P( z7-KiT;&@<#U-@6@o{H&Hnpb0d9ZT8iZxF$F9i{Alcka#zH7kUvBO?nQ5PVlSU(!?3 zv^zyI)>mr$#pP_X-(H^Wce_F2kk4F%iTnxHdNP}@FY5K4`%FhKbvcPJ!78k}qfsy` z!d_OjXkfb4lwVD^z|l3k?#Qm3I@c`W=ZY}_1#j?EB)M3u&sZkA`Y8hh-<>3%epYq! za>`gWWA?V3MzG+%mvGx#DCyY3aZ2 zxNg100|e0XQ(uqUlc!ZoGu}(9wuS}D-YzS9RMlI#VxXClRtW+)bhMNh74K+ zjDt;=e)Rc5?tJVvK8?V@bJg45{&fFEHQkF@LB$%4hlmG?3=Ui@PY)`(c#hTk9(i(L z;6bm|cb9g-E3QZ5ft71_%D){ zdnoUT@ehcomK)L899D$Ghltzxf;y+SR9Rfn>~qz)j5CCVhlE>s2^Zo_uV&A$UV%Y} zfF!~?k(6Y-T0fu6`JBN}5jG)#oTM_ll%+~DRAo+CAgEA4n>{zoumxn$A)rt|l;rdU z6p=tqA$okDENTy1aUDKHByG>PtP>N5)uGxR&Tv2ox-q8{0tN_4>doW%aF%bp zfqDpSe6ZM`=|q|v8CHC(Iz6dMPY9Vm)ydq@vqr2%pPW>rr8`n$T}_|;fD$boB>qBY zMe|MO@{fy?+A<=A+&@27E}dlAaVK5;K$;yhge$!@c~IrF-pZa;QM!Wp<_C9$h*V?I zuW3fsK1Dd0PAjoH=mZv(bddOy7H@67NrU}=4)39Y4FZ!;znrWlw2-u=`}?=mL-!Z6 z8^|RSmR^J8hp>{n*ovZb3<#5&mdK-N6O39&y{iFG@;h1A(8r8bPm3Ef`q zceLl6PcEHQXu}AhN$kuPMLPF1R84Q8gT$m`$G)LCv==Ywm=W!rti?g2p*nVLd=S}g zM~I|z1w!LV?8xaLanxFQ{5MlND?`UpywFoRNGw}2{^qkuUC%|p9K03E5kh9t_iXAM`-*me(1TBp zE825-xfbg-L-jp%%n)9#RIzXxe`fal4qmD9l#r_PR{Lf=t5PTRR!0YkNvAGb7-mw6 zDIBU(S7w7iU2%Uip}P&~R(`&WcGBVwl#r?`Zab63jCs=Hc67%{v{QsXoJ2 z0wOcqP{W5dK8Sq(p#73HL&dwh5;QxxpUAUJ5SFYr*yN9l)6p591uxN|ruZcX#N@3M z#Ed7V9&nYsVQlpp_XA&76?lAIwnaomKtiWV~GpmT8c32s*2aphcCjw15wvj)vlh7-2Y~$ z>pnf~NbYOfjAh|Kc02xcvfo|OA)WbjLg%yi?JtTAzy(SH3gT<4)ox=>FMspRlSiXT zO|0TcK*gynV7Pqd073T}l3Kd6wdi5}gTkU7KIO7#d7_!z{MU=fqJijjmZMqaj-bnf zwVHA(W-JB;?X40m_ZP+4E&!zljd-`sHl({qZ%dH+?$gO;az+Q>cXM$olj7PJV5Qs= z82P@5PeA{?TF|jNK0s8Qb^=V68JHlwg4B*QISr}_1jW*Ihf6`lE662{L0Ipwm)}~n z648PmaP3J%XdvRon_o`EX6;_ab8w*I##_ky)q3U0q7{hb=(-<~K?4yt9vxs8rzCnA z&%uG}26OUN_1rop4=4Bg#ODABO5XU;@AUsTVXwvqfS}{vL7V)B zEGY{In#g#j5fw!JjOPI}RA$b2P$~}ys#hA9IHRd&!PIi&&|#18cpwVqv-jc(re5X) zAgDr~%%&T`)GJROFGEz#hb3}&AiC0&lDV3NqOHhOOMmxpK?O+AU5)6n57@R0Ts3?R zCI~|nrm!sX)+^XLIM4($(!Wo3$)2%ZW(<&^3$dMkt9F&hSg+XLAcBnL&Ajm@*!t$p zLxL_UvAK-y{YuQjfhIEH{24XcB2)cL2t<&D5QT;_p3ChOq5uf0KW%DQa*KP*80B!? zvS=U)aj;5T`(AO-*`P|)>q_68AT!2>U3VCv<877ZjJO3*y1$WE^);ov|MVjunc&~ZILg6?KhdHrv5 zy6;aKv1QzUxEc#w5VL#^9pi~p#Q5uRK53F_QeVgcS4)MX#hRL~@cei)pFUkwVys1E z0T9`HJ;#^yby{kjmeOK^HB@sFWo8IuNwzrZAws}`E2?y|I`pe_1`Q-3>|ai{m!j77 z3i}=}C7PRuc=*Vx7m>%y5hX*sowN+2Lv(gCcLCPR|$H%lWzV zi(dV<0GXkqdv$3`f+)6rbPXivf-la~-dn$tb9gzTBvU(U_ zDx=N%xv*WoGIDsxPZTHW;p0RD3A!j>^jhAa`Eqy}qI90Hp8*{nh(bF*-_`qS;O=~c z3Bt&PFA^8*motY4qR^{Y$i7RjUWG*iNr(}2gM#pfUiHbrf#ycj0@J@=>@LTbX-I0h zo%V1@;;^6%p()!4_X<89F1%Zd(s#<&;*ku zfwfl+VoiG}e%fLn9J*It931iz(+p}d-hT+K5nby)=wQv`AwMzEu!FUF!Uk(0=+xAh zr;(sn&t zW(y;q8SYiH931i!3~2s+MYjV8u3n8wgbBjn_VnY>D@_41OE>g_57CJQA7)OhUBtDz zrRZ9F9z+E=WG(WLWFJNg&Ec+qy9y{nlT2gvqp@(H34ReOU2M2sEq{OnU1(A0x7AcQ zeXkY;fS?NHltzqR2IK+b-g>j!OsHEp`t8QtEc(d&xwdb9(J%6tlH&H_2G4FQZT?n5 zM|MBXr<~2VlQWtRqsb`hyV4UgrvGZzL)pGi#rfI>zC~7<3@S$r49ibtAF4PYQgK+a zL2nURqOIjOLrME zuTnhB)4&}Nl*Vfz77xVf)J%s#nG+)u-1{OgSPk9r7 z%X$Lz-+%U_Kl+jRKagEvWZUs<&QH!LUWd=JIV7-L6)ff=ZI-FOJAB5kKx3i6b3^cK zUoPo&SAGpz%bYU0y#*?uf$i0p&2))bmK1Ng=Xfj*7)*X1(Yc?m=T9p-BXdsIrO_%H zAAud0pBx(4On$cXPz?FND7}#7xcqP&Fub?kZYO(spL13{8_}P~_AgY?pUtP$=xl$U zJmjEw^CQOeZm%GLr1#^`6G_v{3Eey_&d4b)&WJ$|Yid{^>Ye!eR8;a+sII6B!&<(@?jU^RFKzRd^Gj5aMDf@F#Y4~z{9L?t#_&R@_WVBcv=JBmZtC_@1`iH&&LH4U5AC+M){ zSs*HjNi6w^dPq4A2)Y+X4il4DV(PpwC(?}Y5B1j)0!aDrkQ92AV7jgOjg*SZ)?(Of zY?O+?17RP<2#JkI6y1W5I+Nn2*ckV)vX}_c+KZ3k{Ar8N5I{ z2>V%V=A`)O`JK92XG>5sX?~Qq3oZzJ&8~seqsLF^K8@u@&Ut7y8M%cM>q99RcwP-Z z&9~Ky4WGgJ`@>T!{(C{=vA`1LhPH*$WjwrP?3^2bfhWq%Zk^mA-8nZN3oKD?cI(}q zj^VQ!)j2l+1J4yRV?*;wb{c0iy`;@CjHqSR4YN@|@WqqBf$Ay}nmL{ko$B3+F>uRn zo5Nfl4`eq5*@mW#_O!^yGS{+TuOVzOK}v-d<^E!^K4Wx>nJ@sPwzOy<;-!`@DfKEf ze)ry8NP1*Sjb0YF^8~(k#j>Zk+7MW2_9QTJdIz6?p5~&^w`1%rM_><^C9%i2Am<)S ziRA2aFOT(jAiE}WdOknr@A9=QwX3pd0bA%qjOkBDfS|h}bGN10Cecl3*|(s|pN9k` z4*_It%#X(%fnFgX!UU-(MQY@w&-62^2Lv7W&_x=*dwHnG0~wDxi)2NiSJZKEd8*}8 zX~bSs4h~d2XsAdvvP6t<@S`J#dYYPXe>#W(?l6%w)D!YxNq9V zJKkgHRmCGrSZZoQu#edQwxB<%t^I8gDbyC3gXZgfOY7Ej|di>`vM#ilxa!V=H9*evr0zA-lmR$L4O;y;SuCLpVMBLq({OC1aOPHjp_tjD&s_M3FaZ2Y1Z*zD zWZ;VJKIU@?ZgFx16}>_`1cAi?!E4BYnI7KNvcIUqX_YS<$vHL$2QsQREN|2GhChU->8uxXX3;<; z^JTB^XVIotz8oCLWWG90X%zFtrZjE{6K-e_EB!-ND@r8>K;%stGTq$M%aD8{&#RlY zeFf^#Zy$X^p1xFEMgN>FBZZ=US5f(PhaNexSa}w?c-@D^ zVC7kM=YKVnZ|@BjSnh1>VXx66s=d3HkIWf2I&teRie`kGuDgSBCDZ~7?zghs^Q~D= zFb8cJ|3gJj`VfBv4Gs5-8m4<1LW!AuO?O@+0@zS-H>+ZkDF)5(?T`ZCf<5m8P7*7F zA$-8Yg8S~KUYn_ZazOXrDV09mzH9;%A3JL1NIZt~z&2pe-<0(J*fqs7bKnYX*Hw)I);u)s3y4qsOL>n%fze`)Inu%%Tzu zG&dQInLW!m&C%wJ*&t@W$VGmM^;~zs&6D+7-&*a()W+kgx zXDgO$u6A-``zztb_R)Gq+$+Z%7CGk5wO!Li)MPAl=pTjoG@!+qr(E0TZOJ zeZQ~v)##t?|I&Qnj!&j3x~mSrHmWHWXkLwfI^T;`0Y(45z+$05@=8o14F5XK zG@fPZZn_8%gv_?Yf%M+e>K0#$zjD3VZvZAfc#28eqpv_GoSwJ!$Y|g+`$0<#|?hE$@;H4 z!1KM;S2+4?K0Ug+BpI*_772L>HnP9*R-lWGJPh#vw8_Pmihz~CUv@B&1p#)jKed`Q zw@w%PI~1V5O3Lf%g5Hxg>xi-ktyp1>tj}@4@ET*FD#m9)6?dg%DJ&2;j2C%!Y7WzV z7K)&ok~BzQF(u(xQikJ7B1Qqa@lp5h+iFsajUvbSD1!lhP`{-moj!i#;VlZ#O?>nJ zzUN0ij*D*r1IVUsHUHYDZbcx#Cg0rDwC7~>E&Z2RHrzKAtDgYyEr3J=5jm*%>6a`@ zD3y~G@eny`Ob3aFJ8vA~?8kazV z6aM(rjjhuwMY@$6g98`ri67k+4=jFlv!?(AAKD)ObEdL&YkN3ei7l;e{n&VYL&UNH zD^uONMXVSN`Fhn?7W@I7GY=v@=U&YLQ~ILI7(sglNIu3STh^S;tpg(jMU2L^SA!EaBi-U>?j8 z9vc$g4$_$=qAC=J8^smG0kF*$5k92c3txWWMk|j|OEXP}Vu&5^gpvY0ghW;KzKLIL zGWyh#EI33&F8WWlZ_uWqkBjEfA>+#SvZBMmqsR20^UUZ`)6O{rR|Y8>m|kN{$z^z& zUS)}h-Fx@?_HsefvhIJY+B|Wzpxs&>238iwXR82-%w3O3O;p~kpNiW6H0^7iG2nsj zModS$4#(T|zMk^kXqv8Go-YCf;Y~)kr{~%;jG7j`z!)KdlIPJRNNw69j{z`C=q?OM z3b8w31ehgs_PkuL`IX+?2_rxd{^@pME~BOe3;GYA0c)w}#iwjI8c6PKm%Ghu^!VYE zM~}@})p|r5oQRI@>7)OVk49*EV;0ZV!$Z&z@tP4~Ca8^!(PS@9t+wPACn*8Y@NzT| zT|+ucM0c{SXf}?u?3xnvVpA>vg6;~Vo2{qI<7XU-WDX8g+=SKTg5M9&%Y+sUMDMaZ znV)EX&6r~SdOSZLujmd}ao$fpjJOA{*rE!kTwdA95s-`An&tGJID*kHw?G8pRY+Z}421vCVvSNi}?zoTpJ7rzjVn z1P1@Dgr9DSuamnrG)rJb>k@YZTIMxE2Ip-+!7FMCNi#|49jW1JN`zTv-OZQPTI}iU zRX>Rpm|ztVZ@!-Hc$=*0;}lEP!GTNE8gu5i!+^g?=JCLGgM00A^0d=!WF93G?HWWd zigt=_@_xoVM$?Ha=FXyl=_b#c`OQ2H$@{^YWw};52MJDLPs4dm3qUM~nl4Q%r9}ke zoivx`_cW)9lLX~rL`HaSMeA%5Ew>jevzk$AYi11~@_IYXEB%~iRnsp&M9On2yw-H1 zSvGrltwlo~g-y+Gau;YXn*tDg!eh*cWxA{a9{9Mo$JVeB=chWMYylk>@f z`)aQm!eNnD5zS2^5rBI2fjl1AL?6hE=1$TFlEB~>eIQC^Z|0t_xSf0TfnrebioOUX zF@a*xzDR^wW<|dt9yj;uix4X?!7BP9Te^FkSJqyA5eEk@85=J5yBXc;J78=8A{ak# z5#C-#Slbo%Z!22G+U|ZsCn?OXRoWFl-}0*h6%S`H)TozokVmbH9z7&|%rYm@<$0j% zeU>w`5-aRQ9wf$hipT00sLEW92CCj<0B(KQ&e&(hfSO5H+gAIs%FFR90%A;UGHReQaqx?Fk2-t z7HBG#o=<)9(i1#dU5MCmD=b;PlS=c%tApnE^PL7_=lO=b0Yjy}6Vh1kB-_DS?R0z#})&mj*I)vn`K#%4w z&L&g7v2Fk>G`JwoS%F5}W3&HkUC;j@`pyGbL7+p(hneCqNvY#cO&D#(b3+pzEfsHx z1GdzLXE`A1eS97DB+Li)a{IBl!73>vO_%F{pJW&y=vpJl2Kh|4Ml*w-<&ObDcSF!s znE=4v4XBq&3>-~{>Klfc}$T}WX;9ikyilL^S3qhSsh^f!gE&ntREL@v;1=6qYM z-C%+=^p%}7n;{Xs&Fx zi_ybsxvpP+_SJ9cstNIMg5vTigWv*I3I&?0oW{O=#O4z;=kW484huv#GeqNRea^@< zYfUX=77v7P8N$bpzowvT-iI1ZD|?R|P32^6lhZVcF>xC%1l$n<%(UioGB!H6&uBcf zK+Z5hd^<-x-_Two&Z~*JZM+^5v~LPp+flJrrvN1O+-l-(fm*_X{_Pz7tU90U7i9Ou z=wBbcX2}3H^(QKEtAHaz#2Z-=mt%U3d$Q!#*No9x1vIE2e=kSwXEzq>sU0+P4VocA zn}!4&Qtk>VTk3n!;4oA3G>t+*0tW@P^aIlmnk+Ue(+Awq}FfDs{+2P%#&N(2{cnD#S$psLy)WwMsziuU5@FNZE=5hkNO}`L4Ge| zjaAVRG`+DFGjL!?_#h*}%@vyskoms9X8Nc_NDdxyY$F^+vgh?=Gd`R19cRZj!Z|z; z%6ec4-DELq_Y_+z8KWOtT{-~BDDH6w(~&)>Q%KMC!(`;VjE3|(At6w5yIdk!fZJ< z4LmF0?goz$L3*8+vU#vc=2o-AE?>ex1DWmmQ?2sG=-u@fP@q9~!PB@y<<*QgmdvId zx(n^#kn%1!ZzClRs!WOI)_}aR^VkrAehXxq%}exHUZ&;l&~M3uf?C9^{mKM3mg(*> z%Y%VRcr*13l6ckKn}G&0JHiYu*nfm6u|V|W?ao{pxS<0T3z~9drqhgKceCBg=1nz$ z1&;sa{(W1WuNQoSt>VVeZHB=k0ssHD`1CZSm@)ku#b_l(cR0ZQV~f4suXvzT+!UG- zZef6IRadL&dd98ZNwvoTwzW8g+pT#9RHWG zytyuy=~vtUn;PDt0N2_*^AJrZyL%j9Tf4Y_8_OGXI@u+{0*CcTGK)C9*2yCs43PiC zSbV;nELMAdwn1@waB6e_CFq+={_1ZVfB+%(1e6hEpw6hKdiXC#|@15c$_jcQoEXX0}yvy0CCGj{= zZEF%ufKu7YQE{i56rjLheVnelUJT;n00O$TdYv@ioviL)fNZT!&-%#*u#?q24zQi- zVZ5-mFhI6FgF2K#yj8GM&mh7AhqFw2?|e7QI2?gJjIYkK=V7MYOO9t z57sq3pFtzy5j_nseLCK+_FFSeRbTMYnr2s#Lv)LJhtZ+r%~Z*HMe`iHF?DanJb-4> zvsDE{hJu@k0zX`fgRf?`w~g9Eg7b|6XC~8{wUfil9vJ+$6Mi${oLXG7aMVT~P}`ZG zO%{7zIfr0&s9?U4kb; zoYTIH{n?fxquji!**%+*7onj6{uL7D>ARJ34i(I|DEE7MyW+9?k9nDhq8g3R_)bmD z6thD>Kr4WP_X_7t2vuWqt2{$!(ZFQlRV2pzmfnJ(i&qAwK*z5@xW+j%2Gy)=77gn0 zkV8?1?$>d0mqxELj6uQsXH-f2F}CKhp4lUJ(WGx6>ACQIozBMohhh#nU^|nCzvE$` zG8YuyjTAmw)8dwSN@%%X&1nY;kDr=VoS;A|O0l8fdZOT|?4M}L92ez6i0heKF8#)g91iKQu)E$1s)(wbh;A#(?0u&3pmJO?_2%`GT6 zuWt9N$$s?d@91FKWR}@FtqGzQ!uxZI2C7?}iux($O|InTEKS>7B8)NHY0cUg^X36) zEhcEmm10wnvUA!qM^9FXprI;JgOsr^0|ha8ksw}9YTgoS8jcndTRhOco~7%uH}e3a zfdpx4+!bxgG&?u=7^dW{>nuAa-qP0b}QCF^>)0vT=g+pM|!^da+b zAiKhIwyQ)Nu348U<;#MBD45Xhh{!Y~9di}Kfh>5Z`;{_nnvx`@cl6E_6vTHLb2e%6 zQC&00%Gfo7+Cm+|Q#@_bmpY(=IyBskK7^>4xMK^NV1hP;f+k5O?sbf{5)!1D5)MHs z&TU^a2UJjpu9y>-RMw7Nu?P)RvI5y8nK;|40>z*penV8CC`~xZu9ia6j;;>@EFyU5Vun&FmxS zIC%yb>~G}RFBa>wiRd(G=BE_=fQEv*c?ISqhY+9{T`2^3Wboh1^V^V8(O`^wfM)hx zp&>$tj@KI#mwEi z);Fl&4N*6EoC!8*rSBefbI5J{O;BWcAA&z1gFlISWTECEB));Qchuw1Q1G_!_$Ov_ zoDKTZ%lTqfi`&LE$EDglKLZaXvIc~tb8d;gv5x_R{k@_c!e&U`254@L(3v7;fS$LC zdd!ZL6+c9#IVz%);=!Rp`e!g*(k1BYp8^^RLchq>H=HZVUJ3RK<7i4r7Z38VY1z&3OeyINGcw8_d3aHHi%k`SKtQ zbkp>FNoQhs)EXvoGI%J-N6rO3@+U6)9VT*mV6b1MZD;1D-O-at{lNTpGUGW{%;y8b z_7d@z7!PDOGd~(~)>bQ~dH_=*w3r~hj?_?;-fyXx-v&sQlD~759 zveW?;xlRn;B;k!(UxP=mpne@vqdePwH}f#X@CrDkEIUxp=5kC3^VK=;&kT@bz=HZ3 zls@rM$~=9;a;vz73mDnlTEHURirjusItvK8I6{3z)}+%|XA8cn+9N_mh%JQEOMYym zKcPWvA)HnGt)Tvd2C{?fF$-eRJp#L3o4Kepc1aJXQR} z{wcGbs%bkK6z8kWUl}M!ZziO4_O}v!B26RR(BxS?YMIt_9>n;209ua<+B->ZsTHT! z(5Fu;-i#>br2|^=@u&Q_NrBHaWb}KH%rgbBGQ?(|(WL$iX7@0R0{Z3exv>G^IJ((m6m{ z3mn~FJ)76-)sk*|_?Joj<$hAnMkJp}P?Z#6dSfWiq2+^vTJ|fcMzKh2QFUq@KJ-vC z_F`vlZlZqZi{0<(4|I0{-Tfk(G0k)WfV_+nY&&yuiPSL678cAmcbBHoFlRMCo76Sk z_%WKCk!vs)&~!)}7?ceg}r9z|mnTr(8Wky~iw{CW^@{~5J0 zG_bEGoLMszDKW>Gpp0s``aR~R z-+nQn=OXwljb^%}REZ^S8#T3+b8(;dAk-cg)KO#L)g||L^=S-ZOi)IF(*IoVxsCe- z$_NsKQD4jdN^v_=w3_LV14SEvL7w_Er8$K^0~W+lq(-i3*@zDz`b265nj@XlQB%4- zb~P1~482HW&_GK6I^T_+*dOVItTkQybHM|Krmc4%rn|60_nXzzALH^V?YGs zRrB<3lSjHxt(x$nRGe+|5NQTIT%OB)#iDN?E)NH;cXv4;DU=-AgV0{*eNvk4c|#Na0p;L5O%k*HN|W4 z@w4^W`o)M|prNA#+(??~BLpPE;@+JDhlJO&5@Z=^x^yaf1Kdtc{V(PogHapcEcG|* zU3EqqfRoL*eW@8Rs6!2*Vrf$N$AoF;s(GbA+>vuk4apULnFXTm#9q)Or-?M_2%4qV zHb;=y5O6Ci;F3;zFlW$=l~wc>8RTzd$^A(aK98(fFH#9;&>`Y>UPN*QuVyw=r@%sk zKJNi@TA~tToxwc7W48-%kD@Ri7)*f2h5!}`8$aDm&KUb(F~IV1e7t)}2Sh^O zI3Az$tpgGp0`A2@$R(nIn^{30yWu3O3y+T&CFR3luibN;?V1_2Fv)*d!#XvCO5WZkzt%rig?>p(V1FWv4h=8t_lkO?>>umIhp zY6g07|E+I;PSGJEOj1(!CP_BV1c+lMDRW(>A_*k18ILrz?_jbr>O136W`U>!cA`T{ z@=2iK?c_-yDPN!9KjV7MZ&e$tJ~0M}$;X!TMWDfA3x6gr-@Kh*IwE+Ao9aOR^Nl-Q zh|f=_4c53@PbMxg+mjTHM@xj_ukKLYodO4e)pB*gs z78&IE7R0RMCY_qWT95`EBG|~XsUBN#omk&_Fa`{2HqwexEa>c_499&(S{ZoAcqbn4 zrRmJFF>9@U*K;1EKmj@V_S4N?nqwa|ZLSiLVX*cyVS%VaHj>LYC$LexpmWGZyY&T~ z(_y7{0vmZ2*r-&KhMl8{yeBMh<@*w3u@m>r83XK)4{N*0#rRC#&OKOIYtSJg@31CW zeu{N4hvgKIlOL~`v~+8M9nZ;lN2J7NE=yv*-r=xe!pl3Y|ziSFT zVV3>AJq?Ks0nGeJw4y~9@vKB&^9yLuv*6^@q~v{@c?JyXyXJzXiZ(pZS~qP_`L^2b z7rX6fzoC=8JVtBwCtEBxd)@{M@^|y(_8=iOrB(_ne@#d_q=BPD%2g-jiTyf9t+*!K zK}6Z-XrOw9QHg!RidQI0G=v0-D}rLW3-hP3+kwN}WmYg;?(zP99`y20YXnH;> z6`TTc@`YlW9-26xPq~)C3MIma5Z4U((tFZ4U8Zhpx?pV%<*=^y9Hu1^TwS{)9W}$?O>7XlEI%=FFE%h2Dhl7exs0Y`@SnD z*PM(xm~oE_`n&YLBE6AJHzz!y|M{FwC7XSgpVL{{mAG+L5&ar0>u$~8a>(F+Kby*U z`~C0tbU1AH(!907`VWc#*npOWBot8eZu4=_y*2ynK3y!=+ntrg^eC3m8_1HLgaB&Z zX+9NdK3~&~FsT?tL~amU#YFhf@^X7@sv@ zttuS!K?M)!krh5l8cczMhJv>m*}?{2+LJ~6#EhbeY~Wh00C1>yulX#mA}tU_2e`r1 zNa5vjyZKh=`HJtmP{h&(sZ|Bx!WL!jqvN=eJ3Q1_j1ymNzcRBHbUu*FR5PfUkmT-KnqmxIHGhGK;Hiqi4!+hFz6K|?_?TH0iZAqI<<0Ukpc>7kjEt_M1hfSO)8J{%A4d$l~8VZWmu*uTu zGMF_Yd}zsd=+w+IpylHR86chtbm+L*w2@#Q*_&M1z(Fwq*}xQf~Evelc}Y%wV#&b1QrvV*P7G~ zr+6<$zPiWhw@UaS1-OWaenLPv;xs08GOG^Fs|TxNkMC()inU zf0j@y);AiUg3kdK%$Z#8=r+tR*3So@6>D(8otdXZn$!UYn5X36P{HfK*XzlQuI-x5 zw^Osrg_V52Iv|n3&*w>fDq8=7Cz!j^cwFx{Pg-Jto(~%rG75a^1)0VCb^D-RFCVUF zd$A`|amJ#7O+B-P1gdziJ@l0zgI6(2 z{eOq|b~M1c(raj-jMp;PXEN)F_v>2R`rEITNo4Tz(uz{q_jRh-1M0%a+p_wVR+$5u z`0PMPpVQKBb|A%uhC5Bcnj#D79#hlDd_=LKuz^Z_L;!=mWP!(-#&0MK0Q<0p=~T{w z52wLlL&Han>3Avpj?UPa_n)fS<9(_|u@Sz(Z7Y(L1-kes*cT$L8P&FRV*b%@6r4aq z0UvqFWZ#Mnk^M%VIdtfFy|H9eLff6VU_`MAq`@hch(!f&Hg1{}Mg}W@LE>hE41V56 zYb@mWrTP2y(K6sr!Pkj=!snB%uNCKe{)|h%b)qahl<;`@cu%{9M&mL4Z#^Ef;^-GI z1u)ooZ`~!LMl|t-eq$7l3+`ObJvZ;<43YB&80_2woI){46ra=X=K)!GDB+R7B~2%x z`bB~m6})`j#ifvw68+{~0wy@)nXeaawrjsy(fDY*oILgW|C!hKnfWRbKuzp{EU`30 z9}i4`!5-?~(!4hC(EQJMOc&6KihoQHv`D-mNWmc>OqN7xnp+#j<{w#E95W_s7a~a7 z1WoL!+<3BjXY$%NefFoQ-Vq@$>nPU&b;%VvKmCHb(}5hwYYVJCWTi4`hWnhuPnE`Q8GU!y6afv7N~i$vLD@M(lPrnP976A?g2 z=rIH#&56-e%Q1ufRxN@9a&ocB;Fv?{<1G#HSg0Hp zMEH;q1~>Lgp2&^1BN`6~)O=M1qV#{o4Twy5zd-1G*jcnA952e%WW zg0`QxXfq0YHS*uGimx~eDZmezEkg*MKM_!|wWH5gE52Z->8~AEw1N!!+RAvpdb*;O z#2=!J85OksRM_rwx?-?;@Z=F{Dz$hIC-g|gN^I%TNA|XQ(Z&XavUD@wJfW9wqjq^i%ch&%m~J?&scG15pYw}|&Q0Cg{>{f9&(_oJX!CM+xn7Ov6911s z`Ix#UHJx1lSm5UZ%7cTPP%BII0X@xvQZ)~#q!t{eRP#Jg^(&Fb-#mHph@xGwhx6-S z{E~&`%R#KDVTIyPGKyP!5>oPfFv$mLp;>y8$**07rPIV_!E5b%k6RaE`1f%=?uw$8oIE>yPO=)1 zn_La}mYz$iY4xAQ5I4C0L^OTF)qn$}o%R0eL^ZZm@2{HuwMX0clm7|5pLEyzm;V!b z|FY4W>j}xCsl7j&St&D(#S{AO0W{K_17IZJV~(|29~h$T2~g92Nf7jv~IW z(SZ7Arpdl^Gk(m5!;A`B$e{0CVL9=MjZsXQX5r!R04z%bO>#^q60hYn(=cPg919f5 zI$^KtX&=z=T0BghP|-s3uSLn)j}MG3xajW&sUbREsD4|h{?^Zv+loR@35bo{nw9ax z-k2eQ9xNkZb|_A|Um*@wREtw_vq9{4h!ILV zY}nF_NHltu70uP~PVw-1Jjo$FW`+3V_K8TKr{qIUi`g6}?&%t)HGmH>8fcPZaU^zk zZs*K2%nVna2dd=i3{snw*NwT%ja9W_R%cQUsCh#~%`jb=G?to``oj@Z5I~1qOXJDL zerBJUW|+0K0ugk{I24lC)vlgb;_mig>V1X;dgN-x@7(GNdaP^(B;E`;%xXp(8x&$K zy{7k&cXmO&9(`;6Y$kpmnFaQm7Wh}=^J*vFdOBjRF2ZILPSL-YIia*^q1(QyC(jpS zdcA7G>*W#i%n`a;Ys3n*%^Y5YC-b;m&*tZIF+p?0d~F1+mD*53=SPSr5m=&=UN`3l zwa)ZCo(NYh(()an&^j&)H>XwT_@J;^PmS^_ZAkaH@jk~9bF~qy)`XT0`kM8F2q@KO z2l(S!-V1)jh$e#9>x^ijw~3k&pww&HU)j+;q8}b1Yo&q_DsMciR?kNFSI<7%&llzd zYUbJ2&kolUi()kt@WA(8{`clh1-jIC%{LS%&ej}a7wFLPj?_}EwsaQH?5(ER&o#BQ zd}pQN6joVD1{*rwk~-+ws-4-6<_@EC5sE$LWf2k>3T{gU8@g9?Ouiy+TvhDzFOx@@ z;Jqt(E#=rPM6*b!IM+~SW~ktPBhQ_)`B!}^fFlPi*sndGJgfeH-rlsok>g79b+@Ei zq}mtlvfFm=Gltrd?RIz1OgBh^RTzN)4S-c8-+L!72!d5`fdCAEs-o_1zJXp&f8Tpz zc_QOPM1m(1p!$VdMP&S+6DRh)_MHBQW+ewFwRn$|;8J?c(4{U(gVv|PuQb$D*G8*n zV405vsavS%GcVCq*9&i3S2LmeSsdTf1w}S$6$JNMtc!3Ch4P27GF|`Ak4Fe<({-Yn z2fa_ydZPueGa8rY-^(Nw5~>ORPKPuvJRMEA?uP!&p-@i5cdAo?>uwldAfftk>}BdY z4T8x9!A&shoNS5EO!#;?IGev2p9JS4HuP~0g>vX)RXuIl#~u=@j{_esMsLEWp6VOq zVv8$MqdJ;eCsrwKqGoYWdlK1FQkkHx)6Q$EZEELKXnQTWvkIC;qq6(~7?}kXIrcybtul)FKn#ws9+Ft+6m=_h=iv2T>2Cb+Z>2DHs?ndRvheG+M zVL9?XqUj)3AqviR7nh`f3;mzJ84X@9MyIvs^#8vZU8sBYY5b>NOrj?#=m%aW3x z@vRe>5iu3QA4S3^qv$bNN&T``)-oabI1-(YM!efB>0Ygs)IEwLL z4|WRBAMnXw#APt;i`<{U}ei~9FcTbu$6TAyTQ0-KhJ#*1KS zW~)iYWnkJboUinbwPo$8{r?49>;wn)9g#Vz7!Ol^<^l%as>*_vYgmE_)`}c%ogHAq zh~FU8a(qUY)6*Kwg073LJ?}kf+6_0@mZ3tX5>0T37#gM{W%E@jL74kBP@>SwxB?Zd zfJ36ZwN?+tehJd0#+p73OYr|Cn8QnzP^lJ-{QF`fdnPaFEHme~XbScSfqRJ?0};7d zRK7EMK9o6a>t;a&W_|qjWT7tEIHb3jshB9&9G{<_2K#aa!&%GG&M9OTsLn||8!Q&V zcAkw?J?1*qu-S6S#f-Gq}j*A0C9ko#EQmBf-&FzZt6UxPy&AK4F&rmE0TZF~|w zy(pM%V!&|(+qC!D_>{lNEs|MqM`E$CTouXE5;QvqkRte|(#+AX|$ zv*Ee=8*9!511@mQP)90)O!;3C{4%rDYxm4F!Oup%?sJ(g60Nj4Bg zh7ca6{1gELQ+8)(QDzoA{Q%lJGl0I#goY_&%oAHO0ce;|lrQXeL2_&abRs`{cY18-EV>et|5iffC# zZ|#2;6r8GU@mc|x^S6mC8krM#N3fI%YEfoQNx-D2)KC}VYDx_QLp~}s{#St~HZ3&) z8YZ|Z9!Y4<(WjkIwTdrd!-$_F4GTUDTp`%81z<8$1W_b94EZI(6&Vs%BZ6%$K#ELJ zd>9jDPMV-er^}{QIs-#K%AEdJL5ggeIRi9Ih^lnY|R_PHOW<*tb_+{XYO{??- z9;SSP+@$(EC#ny2FqqfWMI5YmD4BCjwec|(!XG$|U`2lW!lBOt}=wa%`cr_OOcZcBMTmr1OlWl7f!0 zjuxw((djH0tXIxh5f#E8F?WxbJ<8Zo5=&P53VrP{Aan(rhWoSr=#sZ{uhA2Et_zd1dKyB># zbTXdut^Xx@F+dgDVEHiOi=+{H18?Yx62tb(&2S1ZqQ2^_=(yxr zjUHsB-Ga(RETahS*a^YRHY5JXK%D0`WCf?ZKn%yU{W&W$AtjEfgROUzJ# zDRCTM9MxvgolT=r&34)Q-hbPE3Uk;%ur^CgiD8b+jHKo}<1Uqh&-7@b`0L?hG~k<= zg?X)#ZAJ~IUE(*I-=qHBkLEWk2jg^qyV!5)`fg^L;C5711}eEti@`8G6}jH9aGR=N zd*w#9DLt5{Cs@{-w<1?F-w8IWZe*Vpgn@dTUu+;%I?Og<-Bu}Gl@`p>EyG%~hH9j< z2%a-Ky~3J=%yXJ@Gu3Ow1G-m-dGU(Pbeb^plB&fFEtrK@StVOJ7F&uL(0RsZz|imsxm~Rf?5^ahEh|G?~XNyUIpQX~C?2%$w~* z&sg`8)%|0O*^Jxw^6FYOE($}}S1&ruk6FFsf-rD>A#vY_J-;g~Buo=#3KCrTF{%l# zI>DVN4E@#RIg`3SsuGR*GJm?_%<1dGTtV_vu&5keb@D?KW(tataw)5euCSHXSyT(c zKtcXg-$!Nrs`IB4g`s*Lrf@i*BW5mk^>?72Tyf4ciX}{pkKkXmiTqH0fftqg+)b#_ z6%$fd^k4v<~gv>QPa-3J->QFt5Oa`R6BzTzC~8j1^&G!4M%2 za5@TZP``>HLLdj@3d*tin${u;llUsiaY_?r>K*TK!^eX}ejHsv%a@RZkzb~Jk359B z|1zUz9HuKiu%2AGt-dl$t|^ms1HM@5Wu}$-i}^#1cJ!!Y7ki`O#9l1G+8e=}>GKP< zbhWCv1&R_9k@;?$rUf!EZEfQ6Fb%y3$_(6Q;wHsl=GtOn=P-VZVv>-8iC?WN zCJovVrTU9Ky4#-aSVRW#M+t&9N1P7}f5a#MN zuA&0D7D9r!TjzpV2eecYVV?RUF$MQ6A$EqJx9j8RMn#;t7_+cVl3 zL_2~8YSU>dQMcJJCdFW;?(!BTD23FAQj1EpV7)=?$CMU~)XN}6M(UEx@|<7~zt}88 zhaq|_z19%*W*IX^u<@*%FP+O~q~lf~+?KH@gpib6q{yS8tmLnnG}evfvWeVZaZ z7`wI})PaK@oNwqh>%o*3jQs7o(yjw0`)|Iff|)aMQ7={$8GJ;yz0l*1C#Gl>wK3Z? zxL6Se>)EuT3jSz0+NVPc#VZ50=ikJ^>i4b&l{#bJ)raMgO|Kr7M?e})C{m; zgw8=al(`?araPch%+J*5ttB(z#b*x%t%&oA1vBrwx>OAY>YTL3Kw3_rdO5y*L@>Wl z#X?^WCSK-43S(+aYZ zlj&{lOD@`YEn711H6%_>3&U*P-Sv@yrSB5@QqMH5OLEW1poSIn z7b~SXSA?OL7A6&p*LZ$!{Hh95tO|qma=Y(Y>dM;Dd2Q-V_pl5q7~hC|TBHTzqGb01 zsA~-QXn~oytz=)X2t%VP$&6vTqvdR(Zgi)EWa>Z6UzwfTs*=_U!c4t4+)wPrVli7F zx%KNE%s9bdL6pu38JHC1Klbe@EpbisUzlCn%6~;#FivmuDD>Bx!D1SAlY|EmeP*%+ zXO=+-X6e0T3PH|SdjKedxw|@+YM|8`Ob(ZP*2$q&5 zJXXdqBLur#LKej%y1-DdBv8d)?Eb<_y`^84`!T#_gy1b#?WVld?x`H6+`Dt}2lfA$ zeI=?hX==uTCG6A|?p*wMcKU*_Q}1;uDitPrIvAe;C{f9kbEVaSb$Tnrdh2xdNF{fP zR<@jtOc9p4X@ERmHm5^6A~T}PQj52?3D(YJMY%`}_9fCe4ifEY+gdsoXu&#>_u`}V zSLi){yxt8&{M4ld+urPaF&wE%XNTUuFc&DWI;X@$)cQ=Q*KLz>@S$GBt7IzWMkgk>uXnMe zQ@lTteNGJaT~cCb3gyQvF~msr`&=geG3;|SUwfTY}{JmC=!Exm-&%TfiWAe#*cv@>`XMv zENcGT4zqG=9ob?z*qE3?Vu4bRCv0sBDX9d@5>+7ko;I<~>B@@>=DDp^foUn&=5{vZ z)pH&|Pe(JWg!lek-cb!jV9(kTp}IM0uj`Liv&4e1b8XE+!G64&g^R(y%lsG=biW0; zf|`YF30ohDI~mcm0iXDl?c(xKSYGh{#Odoz z7^#_yD>K2;VS>6>)U%V0CXV{!vr)3PGvAxxR{ z?L}>==R<1hkm!B}C=u#R8~AiI;jb9WHjQ~`nT?(r zOjJ`N9;eX69&I{`pRy91OXB=8cIJ{WR&8!l#xBjX)Voibs!BWD4c;j?+YYnEh~BbY z@>>pMJF+|t-{5kxF#4ZmMlVJ$DZ`Ey+3EQ-e*H*xj=P%Ov2s<@>Fz-~Ks4kv;*Vmw zQ-06&ny8b@<840y5MzT*5y4(PE*c zVf?>TF`iDY20hm4k7m8mhWYBKE%&`?A55!8&4wWV$hNKPrnYRDNak5sgp2 zAJ0$euy5_~;*aCGI+R<}m(~y4NJ##iKBlhR zY_Y1j|Dt{8>IU8HY<6-U3_}F-j}Bvw_2&O{{}u3I%1_+~%oM6YvuI9O@J?e+gC7#{ zbZ~(Y>Rv9E{@XM{!(qfPa@*a1k<*m1sw)x=SOib*I?lROVFEDbukxVozpOD!y@iwc zMDP@uqg-Z+#b06wl@Yo)>veeUds~KhcoAJftEGkT$J zxvUNCf3PIk5i|peVv0$c2fYWOUeFExADd_q3px+E>ZQ`HDsA->VB57?d7qCAwB2 z_hAsH|0pdL(xCNesHGO%OwzH)N!m}IVxFSMgzn=|H}+?JlSnd;p8s%te(|rmKKtMQ z=kI^G(U?re^W~V&`~J)2a>JRP`d%$f#&j4&>b?EJBp46=~n2*1tp27KWbxvi_80&GszGeQ_X}oCm`i%bHs?jY8{M(xUP2=0=o$ekt z|G!rfa40BzpcUGkdiM$E|63)#1%ZA|(>u&FYtnO#-#e}rF&6jw^?q}gfvZ_;L9p1Q z=(Bn^a!9ol1qu9j+jMChGyAv2j;88hK}+~w2Bk(L0K7wYuQk=QojO<(++;1NPa`yg zLFD1#Mbb$B-$}r}bxzY`@vAx0-+CIjFKIM?%zhss7>#uPiFN6fg++MdN9sez?7&;b@TZ zQ?Er0&X!Y;Ba@oc^WRe!_GrS89$1 zDZgInA04(DX)ji;R{|zv{S2e>Wm>gz$>T_fe&(g!QMUq>g}*HlkXKzKdE!#^Ah zG7s@fzj@H;9QCt<`U@5p!9WrSrsVS=c6YE?3@&P__^HVqJ~~*_e?pW@a4i#(An`YY z<;9e)VO!Poe`MxAhuL_V9iN|`(w2wi_v-4G;3;369wAM@F1!HC`gbn>`= zIb2#Pntt3&N#mgO&>3+?XB=L|u@bBoIRuZD2P{&HVz#Loi`(_#*wYO-)00_OjjXw}-q>Cm3fL zf^k+1gU~%Dbg=hZ<{?R*(Ck=7p&;^*iS(YN#D`*Vxj~KpvbkOJqOCOSKoD=~JQtuDX>7LGItU7p(Nf+m{s7dlx z95s-jaE}&UX$vDAV5BzS+eV$Ii=Y&`@H$HFU!Wy)n(b}sSX!=gd{&#D(Er#PiTO;> z^;AJkR6-CW9#NNhd^VWW^jv-ashW=Ei<^QWAQ(m}1%%u^e5xAh2K^6^VX;iJO|faVw-Xz{AaftqkV4kzQzl_Ll6-B`gnP}=AoKu2-Of>a zFZ-w89vw0zL8lr7rsUxu^%x(T-*y|#R=A`f*wF|`LJdR+265Z#Jm;ykS==-ZQV(I4 ziQ9gw)8RFdU>+HWM9d5iVjtm4Blfi3+RviMtywHto8v>~I?=|n2KVR|L^TtlL6*@m z4KnCvSq4N1y2{G9A<(K?SveSF9-WM7(t@slR3jy7l~2^-KPz_0jWY=u=aHYLSHo!tYitX(5 zly=86*-c_=am8|TRW7zCXK-ueqM7iGVmD{=;GczQsh@^e#wAfwgBB&E&qO@mSHeTe zG&6o&K`@`ILb^g|5y0NjKT^-1wsH;@Je34PI);9gV}QTq@KlemEFc&V#c%}y`U8tT zU5vQdg1P9BtQjHrPlIDVwyFTuj0n6K@w%o8STO*GmnZ77piRAOAV9;*QJJb>Gb>0p zRT|9ZX9J#{1xrdS@eBdh>OwLzCDuQKS+W-Cddt&URY$_BS-*XfW;81MxX76_(ZKr6JsL&Jo72-Ik`nuon6AK^>7m)6Tn)WINgA2R#( zW-HsT2m8Dw1J#sHPJ__TAk=))?sOY!gDRz}ndBDwaqFU)#z!*8m`Y6z0{(ACXM^!X&o|S)`?JB6j;hhqQG+*`IwX_XKd@XhxV*$9 zq1w;MUm`hJci((Ir$gw&i`vtEpL<}Wc2cyMeI;%Cl+G+9)*n(9j6Vym}6rgWewCW=94uW717qblp@Oyyo?RA^& zqaLqG1#7+u0f&OfLrDQlyT>(K4B(39Ukb2)qJ!5%HFeFVWJagl)2LSK4JH4Yr z)wDAKL1!%?;K2|Bm)uY4!NNtg=X|uJ3 z%xEw%yc?Vps^pa2rwRi&oI(=`rMG&<`CL`WC*Pv6*)U)U|{=ghnDdBw>gwS)?3$`g&>NzL~z%C6sbRL7Ja!HG;;mZjym`f>{qCi>m3Oa$o1-n zBdQ+iyL_K)rCjgBAOtrx_qtoCvNZ*0WXxu(7nIpb$!jox-?ueSvwhg@JfZrNkBkJ% z*KytBu^{8z)9!Dfb49zK^UjrXPy1Q0p|hHMGzNCxgnPvIR=AP29)bFU(Pn;c1*)=U zPc=2HvZ+*+Sq`jrF6r$xxx1^mL}OxjyUw$EMYzI*@YYvPgPv?9xWNF9L0jvqcJJFZ z?}t|!v;hPG_`UV@cC6Q!7*6xGEX!1L&DRP8I5K3bxkK|Bj9w{2T22B_qpq#s6$f~i zu+1H{;>h^b64rts;JGK<(^=I$ij%-)t6u9g*it^Db<) zJY+b)JI8c(drejfD%!3vfakXF)%$fuuV}mG0H51Vw>>a=McWl7hBvk`H`wkd4B)wA zqE@}4V>Ac&+%c_S#-*ZT6bA6z_NaZSXgh0Qa@!9YTj+$hI|>8aJ$NwBUePgXx;}b)wQFt9u?tNopAOzzTRs^S3eIv|~XG}^D$0kI$m zc=m_m{fc!>UvYqU{Tn)!dq8*Eu|iv|e*+REycmR&3RPp^&nkE+&B3W@?W7H2w#R4CMPKjT+goXJrT zK?dzSYjo-G*mI^)DT6u^B;caM#x|yRH3evlvktvI41OY18fW=12)Q_f*K1WuW_EiP z^1p5vnfoi{e}jSDkL?_+{%d;Eh~P+9JWU<&Acrige~xbOtdwPQ6hz>#ZoU14@9(JO zFoOXcwQ09;u=|vEgDTagmXp9!Jr54$TK?oIf|3!Z%*#1FE$C84dJeo+?`6ReFu}&?Jh)!8&;My?khy=ln$sG8O}!4SW3^iJ@hZEGXS}zfv{9m%;>lwjv1) z0sEd~_vp6&@JcU1H4)*#fx?|!ft~^36@{Rb#e7Wx{X<7TY8R!0Aa6w~oCdX9^c|f} zo*dJ2S3Fw@P7-?>IRoVP>DQNo#c}wEmf$F{#{~h@&*?P#D^nO=&KBdRs( z4UU6naB$9pI(024xprTPK9ug^2;ks`IrqOf|NHOUO~zSV8{n4zpVKw zCIB!r$YE6ms6 z?1Pi>OS)ztRuvq^bDT)kheGyqRT^q^rggj;(?yV~Cpe$cgS%fvH(dxGW8^GT&eq{! z#K%0Kw&sEkD)I(WaIpaABn3pBe6D(MdhQ8CRcTBc8-U_OTy89aWB1MGntJlB$N96r~sb<}}C% zZVcU2G^axJ*7)q@tCK}dT^Pc1vY=CJ!|J#(4(PY(CEVI>wsX{^?O}Z6FX$7iz?SV( z0KaSCjTik!yGM6YuskWUp5b#21nw&VT6xcC6_N%%oo?wRM-~H4f{2dA;kPupIyj{5 zg{3#8atV(E0i6aUu;1z?b%V<|D!?rT@K49nCB53CF0#q$YNvGe zq|t74>y#2KtpybTNG3ZKV_T@8(g8MhX2t{*XN-iD84dikl|rK^VY1<@1?SO5#7nIOY}`v^k@v}u$QWP8C#7JyLH(jergW4rO3CfMpNJ~rRL zu{jWOEMA@cZiDBUP2y!}5c1Dr=5W)ll z4pJZDLnGxLhxO$IcZGnGkaNgfaz;~J`nVZ2Rr~vmZaiv~B;CxmR%sg4?z|pdyqPUd zYOmi+=&CYSlL=OJ5n4wK|F9@XT&F8mM$~y=Y(ae-OlyJy?0tRR+^D9;wlurY3}(3m zQ;rs(ZI5BlxodygeOm8EZ^H>(lu&UfXxxDYJp~w^)fG%Erz9*13N9Ai_U^Z|FvSw1 zVl04y#w}~dUbcV0H!%wOKZ!UP4(RaFUPkva1^jA00tpK5TN|heV(t;-)r9qm0`k3_ zoW#>QbSP)`?8if9= zX0hwRwvB2vhzElX%AWeE%GQ~5ObiMdNPE&apyR4_nr&ryxLVr#w3HG(Az<6gF}8spjv+NV2B0$ z^ewgJVRBdV6G%|Fdp1}sU(x#=cnihPvV!DBaNYI6Kfr>>wZyxPUtPXtkUs%v!-IE2 z|2urNQLxq)5d9|`4KsXLu{_g%R`I&l3m!lGx^%?7rw@&l;me2Rt@PhL{P2ukyixB6 zs~PAsdgU|I|6m1QF!h~NOkPMsk%S-RpO2zgdvZY5|cY-sBsMuGx)2!C(ygh%>B z9@4=B34?;hJzt|6ib&ccV`C(uSy1tO6=_uV6;tqhb<_@{QQ21pg;?C9XI|7Sa+WP8 zv(+-oSfN-mPe!-Cj}|JAf2r=zJ)>2}iJ9SvfVtGNw%ejd9qEQTx_vX4k`wf(X7=?5 z`v05*h1>R*y`zJ}058}i72qu-WYeuq;f!o~wuOLw$J*WR)(=C&1*84Ia8N+MOTRZ> zWV`itf0r&-;!`1lO2fl54EVP!ze7jK`9TK3hNu8;7$B?kBuRBrI(*--oXRSs?;P#=6?7(fHt|8wu=(Xk&7LvyOXnAZ0QV+I@5lW+!I09k*#f}4 zu9-n$`Ss<4R7Uj5im{QNvEWr`SsOI~HomWI>_;72!N8Z9X$YKpv@z8XK)pwbPrCH{ zCA}*gpL{6SSK=HfsIskpp<{{REuiH}pHBf@ z5Cl+-wL8srIC)&wT8jWz)y%X-qD9lJ!G&k#YUZ2)vhhRQoh$1HLjcwI!EESZ?k(#F zivU;UwNAlCp>lc6r+{vJu@~JISk@PY0II5iI_gay-gK0!fh+(_q)mxAk= zs}KXeNx9zBjcXx`09W-{$nK|fUwzhUJ_{yb%Jo?|2MQ()BX^fgLk$4alxo$%?{vfF zzig?_DWDsR`?P(QwWnn*)&MX~t=y+^O?cyG*;*M4kWGH3r~BIcPOGvlsUd)B^4s(7 z#wFS!!2OW&+hM2Id_nJ`?LDLS#@qdNBgl1v)qk(Jq-aok%+=J3e>7jfQdO{Gn-&8M zT8|cCMknU4>W~0yipq^n zJP6p%>uuU3+-d~d9xHg=aiHM5-liL}gRAW;c->M!S9Ow(78P^mnR0c9Lx8L1RJ++m zbE-Nxc*+aC-KUMcY$v)4rkodi3g{|_n7{8g_jy%UE{AxKnBCk9?$@Zo))26BuXOq} zu4f5Y#Vdvay6S_N2A79?-ZsC#qg)>~MT45kiS~CMk#afFA;7)wxIHyW+H3OR zLAliqLw6u(Xxkf&Z?fH^jcf-Z;%+t*-BVnJh`8YaiITonT!jEvm!tjcAkh~onb&g& z*gCK8Q&(cINpBYn%dooL%hxm@fJuvYa%o*&T*Q1l8t??sjC ziR28BRjc@XvsO_D2TzTzUex>jZl>2l_=vvT=!#*$SG^na1HHK3B6qMnQLcBxIZ#lw zv-w3`=MtR>D_1)QAZRGBzu3&{IyiW$_db}cmLtAbw_NYt0>D(BrbBwC^jLMKZcHeB zVxPie;*@ispsXIAFHXh_mWbu7wg50y9Yhyp%m=Gi3|g*SgTSfZP0uHjji`p;Q%BS9 z#*5i>11bohsyfL2?U-T9)j_ASOS#<> zIyiVL=JUaZ`P2fy{Do$&Ue%W8^Z9H+TSd>OV|C?8rgo*r>hDvDl(`E?`0;t!B8WR7h)Giqn8njOo4XJT_LAR7-C|mvxzBQY8 zai%s3F5s&nij zAH=F$=h&x!{u!gsCX?BlYHRpx}T-%7Lc=61u8UTwW{-ib}ce2j@WHHdPc$ zy3e!M@6+)gmKg*k(FWGJkAuMfNEIS=XyfpFF*;OL#9%snHRDaN;4UvoaeC4h!JSSUr>8+eGEUFMY{s3tae8WEvEXtwI%BE1v7jbGFwQ{c zgcpz7}i%!brA zy;!}PO>48o%P+tF65Tioqixh-LAs&-)!S|IClLipZ$3?j_lf$}Yi3_Lq6rV;P14%y z(DMg8`2_=O&qxaZ^IiIh$GMyby|*6~>51B;v0D$edJqtaEZzYd(IV%5@2zKW_%=QwFuP@x;8XS*59c%lNNGL|NPB+-Uw{fkbfKZEaO}DQ$ z<*{mR<6L8zYc!+NB3sbZ%tFoHPE_4(tZA9h{M3~tTOxbSC+c)tGg##n+@tSE$x`WY zp&jL0dMPY;4SVB!YmiWkN@nkQo$qShxMXT#q29Cb$?T2wG!c5dq-0IHx}e<*UWMH( z2jxs?dOp<$abeBL0U2a1Az<$_N^=?b1 zoRi>3PO8Y)9Pn>1>2aaas#f2pgD$+B3zk1^U=slbO7Q6hCssfz^A!mEJGuQdGshb+ zNeMJY2NBRDDBR@=zhiL_Tw|8@k&^gbDi$=s$V+(TSZESr;iYqTk57wLP6q`7-%E$1 zc9TySR*r!tLE*l2 z=xk?~PgPg*8c0z1*v3Zvy<2~t?bC(n-8x-r&7vgeUnZOvGocC}KHY8V>(A8X8BDO6 z4;clSQHXCBBY zfZum;^|oDyqQ>&Cr0(`ztOXn?7U|N(R`g^jpP#QJ;z$trM8|}3OuIp|@^pU#EzV_e z?IT!b;Vw%OA$m)F`?TJpX7!M_NP^8_OvgbYbYpjquM|~5YY5OE!0L8jv|u|{WVB*L z;9i^WzN-RO41n*#;(n|5-LJE+Stgatw1bT~lJ+;yD&!(wkF5c1^#JYx3HPGRBI&vZ zvH=ZZI^&ZE=x55A-+i@F#`ie|0-KerT;OY0bnoTv>Nleim1GVk_LK!B;-Jg*7Mx@_ z5YVlpiJYl8e$6DxHej4oD8dta6Opf6YD6*N3BHL)p5%{glJ}?yruUQgo@TT(!#pM# zNCnBxVQ|`qTuL=_k(gu#CoSf1kb9uy4!fOxhlW#$5-FLA@TCG2WOQr9f8*&?wlxY_ z5Q^i&bvBAmo*{G{;B25G#4X%ZcNa2Qnn`O^B|~udDInZ?te?SnY1#x>`TpPKdm=;N49J)uK)>IJ?x6U zX*KG6&rsQ6SDFY>T@>sm_I>h=ib8;bjBZ@)Z!doPPya$|Ro&(;UnVcxxFm3p`$AP= z{_k{^ZjauZqJ_C`@D_$(s3I+!Yu^yk-#dtB&$n$q8EJPSAZOO|=pYFj3BzewuR?8t7v6TD;G z6wEEHmv-2->NI}petQ@`akjB~j)i*C=TDn^d%*_PjeTyJ(EaO_&(*x!lP>K5R^>Zf zg*n{R^${JmBz-^!4a4i6H}-*LLig`dKAFITq^4JdeH1zV^m>9#AOX(J4+BJ|^CYl1%9G1kO3&-*bG^hvC(kWS%2d z00|oRq0u}zIO<0a!AS;Wkw}h$ii=5`-cYQx!7&nXq)4OJt{>7X9=y<3@|Gh(83>a^O*LkA9`p zR1lD@)pWrz-NLeIYFbLjZbpybRq#k=C=q*qr^PpYS7K{Q%-(& zjjbqP+tQOY_xC!%{)7to8yL`$Q<~8&@6{|l6nDZ=N%_|xM zdhV5OgP#GZX1St(om;N<^|8WP&2o(aJ-7V%Q|^{(mMcocRwE8(cqO)`#O(07ooZ}F ziP_-+-D+$_iP=ZJEz~MBJD8VzmzLe8)!_sfo}37^wU9q)8j zstFAywtOok^LeslzSxS#H6^n9#a2A7DKUF1K6&B$#Ekxrwlw z!>~(Z2_DowJUV(~32=0qq`jjla#GJZJ@ZsV2g2#KR+ zLEuxa)BIPXw+RVR4Pe5r&L+Q%SfR>nxZ0XZ&I(oLWYKDHJmEQ^T3m7#RH)X}F`l1K zhpY3!Y8*WEAlcR!CyP&m64h&3>CG!Tp|YG0hCD)&Z6C3a2ZPQR%k$&;Vm2Htmo@Xm zOV(~YS1Vm~f{9lWlKuNR%oO4L-w8Nu_+{D#+7+W7^vs@gJ4gKd>yco6D_34)373F9 z4?KHlCbE4L9IcepE5-64LhY`ncGx`RK9_8sD3;PV=={vnp(DlJ{=V7=NK@I*pVN9~ z@Hn5~eF_g3dN_%{#E$-+I?K`ujzVqCjvNm=?t2mF_4hhQe1I?6U|#Hb3xw8ZT+1Ae z(T8_}GA3C)T&v2_Mf%P5;Zgr;^cfoZp9k?LXBQaI-l%Ak+cVCF1%8?CJy*R*UeGox z(;!0aub1c3!FjEIv`2@t^_C&p;X&`p(Se)#-r?>+_T-sVfaLBDkd{nZ)|wdjhC-!oH06^10= z7&N@H#t5n@cdFD{0wXLMMo^1Yl+E|)rCMHJwJCuQ zct~$6)w1klyqr%47q4cs*ICANB;z|mSdo|op$A52^maI!(+d)jjwn7%hoKS!_0k9Q@sB(o(vPB9OHcZ}e2buwBk0^dm{hq;c!0Ds%z$J2l=nU9a?ngV!k`|Nxb z&@0()Fu)tz-_GW0Fwf_!O55%zfZtM%861yKCxe%qE!mXd`^7sh?Sub>k{Y@Q{lN=o(Q&094z2I++bt@l7aYZT2w0 z>#D>2T|L#3Ems#oMk-r%L@-F{Vn&w*y^14JHnZjwz_pub!X4Mi`0G4n-Q;0_*BzMg z*?clOqqhp<3F@*Pm;ePC-L6r0Blb|)cFjS6)-jk2maA+|7y zY<>&ht_!GylxQn->LZ0W7MNXHXICJ@w`&DK}_)=sH+1SnypS}i!+w4Wvc@R0s4KF z*Arbh$sH+vR<{UXuWRg*&%u6GvTr-5@Bxrddz1&}6B|0>W~9YDS~lVq0XucuPk$Rv z8MSQNZwP?GRvK9`Y6V*r0$AP8TD@9~1}AYtQ?{Swb0DDG8rRHB#%IARm1WzS00kLc zHKiK-vQ-lp0N+!&*#0s0kYta5Uql!P5;_gu3>MSW0J&@$_#6o6yz^!}CH0N+jzs|b zA@!W6gX#35b~>Jn)XUD5ip(+HqrlVzdjni}t_B)( zC~ga7fqQIsU!95N)8T?k3_!7BNhBmGYUX#WW3i|Sy50!S#2gGV5AfNO_EDCIm0&p> z1SaI+BB{gri)~7II7mH$O>|iStr#TYC731vgT;#hA$O17wVvzzq5k7!%*&M|8zQ{X z!oNU+&O_RmvZ^g<-xBpPYJGZvd7odTA;}gBVP#?%ls;ri<7M_I{k|{DgM$8yro>`7 z4|AokyO|L5I$_cjy&IrX+Er;)hB(4O$U8*{6`cl@6u*>n9SlmJdrIc@ zu&f}Og46fOXvS1%-_qX?CadpfQ{J8mhKzw0C}7{#zn=^)Cef6qU=$X>9fs4@SCQ%E z=?(+>2U>phz3SPpEG`&v1(sU~$oE&T^+Hmu@nW~3ue@b^Ns+YxQ)(j`gziB|9bJmf zhD&m9O2@$>8FipxYcdW7nGaU8*Q05Tp6UoL4VC0m9n`qXqX2!+L(}!Z!41TML5c|< z@(l_iu)p_ho7d5m?AH{aZ&>?z4^=QYjP1^k&)o(z_K09uk|3wu@x0#TW><2DrobIG zId_}g-J^s3R)aV8Rg%*~LFBQCVg5_(CP|Me%$Ok$ayIwSosYq-z*XF3C=vSLpw4Qd zYG_3P`j&ChUW0B`;;AgDp+nzT4B$5{yu-TQOg=FUf^u0Fk8UXIEkfol~UoM5Gz|M@?YXeRVfuA4{~>m6C15o z^RUAe~4XGrJe-`cw2GA@G7M{ znWOYW1pUr8!NqA+a+HUH{nkBCsM`@d4faD7_kaWZ1Cv7b&#{*zy`-=RG8lwxRj6(@ z+d@@nF#)`_)2#>Bk5{Q@Ee3E~23n2%e(z~>pVzik%0Nzn#3Pdm?uR%XBok9%Is`a~ zy$>;Zy5661kaX;034#FZ9Mz+@o5EgXHAjI23D{2el5K9gf`s7SA9gkeD+s{0iawyt zypd0;RM8Fu0b9Y*-;a2DR;l0&1!(JS^=Q$?PSFs6ZKXyB!PGWa#;#JSfdjntIZX&{ z$L9_N0h`n5rbfC*kRBptF{qN$a}p$MeVKS9qDqw(JPZK`WxCno*``XSYy$-A?TDzNyBoG4RdNkDz}u$K{yEM$RhmKugODv&hpnK%R;hqB1Ynyj)!$!>InoTdQnzxk+2rC>3D+l1{mTfvFSDhX>S zKwFD^G)g(w_5LyN~8mySjgd^WO9=Fu+87tllm*xAQ0#uuV|m=vQ}SSOovZK zQ#yFFnk}ODOC{STG{-ot2no?ojOdQp)xWQ9ji6H|k*Z{YH&jhAA^Q=NJs8nZrjtli zvKCq(>JcG%$4KtdzWYc?l769*13};+1QxVKY&?xsBw0RI@oA8{YozuUw6+#SMp7k* zGC2tn53EE{j*xU_BNZP8A?vo{9ACw4oCc{+O`M*LR=v?`Z?qgP#`9De6Wo+-NM0FB zLLq$5eBK(I9iI&P0`@%IRcRk6fpnU&~Gf{!SSM`GW zWOp!`L{|*S5+YP^s7QnM{V$&lcq}Sv02OMqXWh~2e8G1DSJQB)P@|*IRSqT5c=5T?e7h}*|>+Ga6&S$q0TgWl4lO-OW+VAkyfTb%@r zoaGqFA|_NnWvWMAdd*zF$+q9*vzn4jW3*yjPK7d$ul_4Mjbw$p6agO`7+<$4bm#zy_L z_q@~PnXp=Hau!rRvvGF6P@JC7n_zp*IzK!qI5C!RUlI%LpGMlPX1`DGStsNL*J-Ym z=VVxbGN{aKyf~x_pR?W{S(&I-200IEzx3j}PnURSG=%FM(e9*duR$;8HV^3;X(leX z_qHI?g?QM48ctanHN@3wIERA9LodE`FJ!+NI#)8}h?^p%<8aXO%j{Tna0I90VDf?h&b z`w4pFhrk5Ey~hRRV~qgpx$W5#R0@LCn*v<|fv>#0oSjckY6m-6lO8yz)6>P>W{>xY zWn)Lf!RRqfg|4dc*%x%KvQ?-18k)gTDOvAyjkFJjx~g%Ry1HebReG{s$QoHqgkI!j z>hATTsBY|KM}_VkKb{?)rn0uXAcn+(hU)2?uX@yQ)mzOvA704Xu9QyBE6|EgWp1d& z&S$EzX&x_iU468rT(B?3L3puHQFBPdPW9<>#a1WSh%9TTiX5qNP*QDTu5{2i=mh;o z*{Hin%L1XMdi}W?J@VApuTw+J%A2enFA~g|(Bv^}cY6K6o14YZ0*ln5^Rb(%v7@rQ z#2p@WpYXBuW~IRJ5VMcoo=s{ev$I;`;IK~vY%K4TO*~+9F~C1UW+eLJY5$)D_#`FQ_vCt!ko*A5d0awou5x8DqZa&aCUrt8r_`u?D8e(5XVd? z(qP8S2a6@WiB=oErOWhcWc8u`L$v52SP!3H7>F}s9UDgcqlyCmkgfxtkwwab`fy`b z-|2Mw4c-1x&r%rEg1P95+nPx%X)`q?Pz>U z-OD!3q8p2;XTQ&?lGznly;dC2kobD1zDGN1=(4KN>MQUy(}Iz|5%}871{L{txPAY| zf-rYiVD4^REmu)*`AH+&r{lu3B%O8CLI)iW>4iI&7TdS}Qhh|`cY?_59UZosyK1Jr zj!egL_h|d}rzBzW?*%5?a=6!^;a8V-1vJ}P@Y)((e7>45|Mkl+Pi8~9byQz6R+}we ze);v6lkxFlu(X2hHALi+0WJ>8jw6A2U4OzR8gujQzF1SXyPx=saC}uTJ+G z@uBDcyM0pwH5e+%wL0ig?~qn{pQcav_)}=~5iEcREM3CUQtKD@}g&;}vu%0yP*a>0utV>4xYY_0x9u z>is%xnc9t(@vfkUS)dBTWgfPM$CticiHDgQ43&(HC>!Xx2pY_%vcnaOjS`A5Skn1W z!D+BcdBU_ttWCdy&PSwI&RE)EM46VXr7nE1Df3E<4fM(x`%Sy^yqz8-Ux~4S9*mXr znDiV@SixRFkICu4xStj_p6b27CCiS2LuazNJcEV_KQA=lY_wbsUItbO9zK>?;pi~r zb7jbK@U~{&R9w{PP;z!U8qk5>zy`stosi|0l?nx5hE9_3tNCI!A1zknz>uTMJ27HI zJPDZc*I{7m4SH;pp1_(8CRvy|f=)rmOnN3MBsYuhC1F|j%FI$i)~xft|3NPY`bmdq zs5|ACb9#KwzR((&H`r1#u91W9ei6Dq3d21oSg8z&YZKIY!ujoozYhU0X}Ma^iFJC0 zNo6+rFP5Z&S(uQ!*04zIQjgI~gz5x#c)EPs9`j^ilJ2zo`OKExi|k}HoDAq99x^Jk z)fn@dU7uU)*pkL@c;et8X4guDGh_n1AL}rXd@Xdld>cf zY|H~860$f*eeyjmsn-73YVKs+BbwWyH*=oR>AP@KtYG7z1{t|RBvkL`swp+W#`TmM zP*&yqhnw?@e>HD{|DXT;fByc5_p|KuTy@NX=j#PoBoArsX*1Mc<$p$l{=hSg2i3=?GHC2IC6WWU${E91ofO zf_rZ%2xBS)c<&CzryMA_6jFuZL7A z0`VKwX%$O3t;*B($uN4Bk8v}J$->U(KN}OQBaa#cc{<_AGXUt?l7PG-(IHABc zrq3252A7&n;bOXi0e@|}$t^ z<>+_6VQ7KTCKMxE5Ww#opByu)Am33CjwA$lH;%{C!E!hrGpHc(5RQ`p1O6I)MlZKB zxWo@SRESm}54;==OXrH?u?iJ{H3;Av$L9V@KGu>r#D?Q=z<__}_^dB?8-H}hzcYNv z^PRvM6of+w0dwD@A6LA12&#G=C}a{Qr@lI$zGnWFP*osK)tH=m7QPEFp{hWfsxhFx zGdw$CmP$N&b`lUzT-@JP6M_sVXzo=QPE-(>cuoC0vL*>%h)8YAo?gCoX%+Q0!MldHF69Uml0OGeO z=;_#WU>7Wog3CYru%TcMg%mlH=G)$`XyC_$M9xIWPzFGVP>G-O-m<8~&o2TnL4drj zkaU9*Gg{EmvcV#-LV^9>aB(r`-2h27sseGY#(?_HaQPjxR#J^FzvDzgfOl<3_h|+* z%aW=|hvHNN%E9M!%!X%o30Q~XU;_g978NK0*W$jRBwKr76CxHGO3er1g@$q|9X2Ip zppd#_W2G|ve85{uNhvCFTMa-6-Jsd$k$QTTcjM9!t?R-5wYE%fWoCZdde&GVaG3Lnow^b3o|63sa-WoeieEl3jBbf(v+w zn59DSBNq;WwPW=smW$fOHJJ-8lC^Azf9^taaWw(VuSP{$}?ff0ZipE*Qe#@UjO zue;mzL#FsJ;;)K~pvCpqv{!@|uIF2}#EHP1LZ2+=yv^9QPZS?U{H(|)baetsPIl)W`u)NsWT3u=3kpCo>SG7_&S+izep99G9A?PsRr!KsU zzx^bmG0%W`;b?1KU=lFp=f$SH8mU(lc$rwUBgTPB`6Po14En-xBHx5nW`FChQ3^0* zjb~D|#r8b|6&RGLKWR#c`g}njV|(?d!^4C`m9yr7NOt64B5z4=rELqpn&uUgBEbI<1S&AAZu3W@r0 z5@w;z3yH%*(wn`Q%y<>B`Rs)vLdZ+Yv*mZ`x^DBdWN1ix6&-Cyf5ZEqn^$y(2{A9@ z(9&O`%ei^R$+-zpHC>*mWM=ij=Atg96b{@p=P0wvbo3n)r@!+d?&z~Nn7qw z&M1_2A~3;vcuXTX^98p&1BKKF#sTq?r=-FJT!H}k9yJ70zC~Wr z1yF%FRAWHBrC(!Bon8}^5I-!_@PEi7a5|i>O7~%OAP(0UMBuvWs1MJ0N(y>!(xNAv=7ro zSC^vKPUp1olqacRf0qfx*#?xGPOqQGJ6a{CBOu4)ub%0vIn^G_?-J8>D9$#Z-1PJ5 za5bBi-c^M-fD-{=?zO~xkiZWn6f@L<0KQKDp3}qW z%)^45ZG(kqjq=%QFkOMIf`x32`pGUX3JZoH*=#Td1`6!=sN+5VGqYFFg6Tk< zt1+Oy`|51K3xvQ4Dhy{TNRC{c@mfuSq%a(*AVA($ zL0`oM4A~Y3i*M&2hUabsg(45EO7<`9VY>XU{&|~+`Jbsid^Mhqf;kpJ$;c6Dy&R1A z-N}RKSz~|gcFo!XDy%$oT2M2gb)B|XsJ%!g-!j@g)x%?JS4 z%`qJTIH3!qcwHgMRtU(A#a}%I8X8pUsj6uz9gr*FuTJ6JKP_i`sYuW~s4$GHAPziqGpZBSs} z!AFVpLqRRZL#LFe@1Ty>xy*hKLF{A-FSl!U$)O$#!zV=@9Pxa2^8Fc~1{9Pr6^7## z1jy@DMbooLr6(n9Fa`$7V~;1tGk)e?kmPFli-HAggJSIAfOklRYzh{!70P2Tmaod6 zyE&t!H3}B64GQdc^&x4$)e|J43KLK%#elr2rtsraeS%8C1>|stgTlLXe1dygVl;)} zTm=F0mg$?Ej;FLZ$7&lv57`gPC1xk*laYl&>KdI5pmN7V1XY>|#qkE@fxjCrc=tjC zR-pp01_6Bc?0m8s)4d2o>Jo%?reN_Y2+pMfG&DaA15uSnjYD*E-I`66sN6!5-&G5L z^HgBTF;e;n%D+%EBfi>?*&_Yq7c=|C*+8w{xLOv@irq#&F~2=J~? zr|~?qph>d9IM^l8ar8i`QaZ4=<>14!D^b5xIUeG`z zM?&XXVk%J3Dw$A>9!vmUSDvAog{7k)587Y>+Mr{W6+%ktCrB#>o~1 zi*L*)gOyr_Wcfo-jUXJS1Lomre{Y!mM0gV}z*`vb*XFZmc2iPnbSRECAb{VS&z568 z1d=4A3KU=!2GncwIbHNxy6b5|ajpRYeBIv0#S&4HLlT#G0R{H8Ii2WQ@#^PuMfZ3O3i|A-T0V5F*#+ z7sJUhZ^b29SceMW8U*lr^9$Ny%M6!fVHGIADvYE4`FwQFI|Tx&4#cPi1M0OupU)^q zGh+o#Frfmj208G8ZV;I9%1r<^p%~bL0RGG1+?1dL6I@j3oszn-pc8^>u8%oDP)i~l zw-hkgdYv{>Ey6ljP&?RQ0ow-e0h~5pz1)3YA~Q)r~4)sqo76>B&Q9=$rc6nwdF|N zRLAn6puCt+0a=3pzG*%Q_v8wuyIjBoUg4l{ZTV_6`Hts9iRn5NXB!Z}@6mRP;0jVn zDyl#MR$)LTbE7_;$XpdF;Ij3zYqUF)-tQ=#ggO)l8xSmhcS);C3@eyVRAB-rL4bU3 zdA6FDFCZ!qhiVL{*A=xweP@G3WQ79z+H!hQVbR-!;$#EL!L#A(;E0DLKj=^#Y(N0t zTIzo%_8JK0Z2hnakzlvMyGzx5DmhKA!f>?T2fM!f^Mta{*NiHu>`X8YwkUY!o#m1j z6G4BGf^a4wz}g+h_e2?LX)LKg>VG|`2FSiv7OB?ZM_T01>B#V$a~B4 z>7exOb~;diRv4ImZFzBa94x>~QdEcHTmu6527yYVGJlDnpm zWA1Q4(Kn$YEP>#S>#NuLVKkPMlI&-KakNE&{m8OwbSaLymHZ^yrT_f$jan&2N|lSi zgbxsW70j>-#`Ip$q@Y5^IxBt^SQ(uazk}cD6B0V_t!A%Bd=s5ue5eEQIA{#0H}nVN z?|BU^DRBxz;bOLe0sr2L4%~3I#Ap?WgEa=!o0@t|7dEoID=Ei{qXNcsjf27mT7j7>Vj-A(@WUoV%#~0sK_C_HT98ZWuqi16MXc^v%N8SA#t3qNVCO0iost6> zf_Ghz<(wW7;q`Xw@&?-l*Y>6rEg6yz5N38fGn+T~8kJx(S4>DMdjb&u%X2;?7ObwE zpL2LV7=HKsd|Y}~N`(o41c80;em9!(?I42Qqzc238Uo~vHv|0=E?;OB)F%kX(D-9+ z@tZ*~H!iSPg$b|(fyLL~j0Ugi-gH*11>IB|jDsx-?DyY{j*l0!H#EV>@Pe76JY=BY zfDpMx_Yu++B1}L~>zPm-Za@IvpigKaE4aH{l9o1H2sbd`ufJKoR2SAW!zGS4!8qKa zz`keMcqyG{N5NSi7v4L{#(!7b-Fx?yzak}>QBwA1wlpGU^ zEBhBLTs=Qtx;g#q>s$$XO`0i6Jjo4$hSBs zysO?=XK+EsK7W_p9LoBYhFIkJ4@1A8ex5uYE1UIw+qFWUFgA*Zm3qMzR7aC!ijs^jLAD_@gIobFmyd~p5E^jgb zU>Z3MLLcHgy;`t1pRe?z_AE09I?;=Hz~np}q&~)n z^xI;UO-FC+A6WbZ?LIi6AcsQsBf4#YUO1&q1$4jFa6@Hdwi=b#Ey1mJEC#;3y?B?ezV5{!CuK$F270@QcH z7g#D7Ne}MkxL_AT1soB8doO+y^mpZ*sNb9i^8SDpvDI_0s_CE&Q^B1Ug5wGbV7wWT zAaX-}Lx)az7ep{M$=DhI>cf^jL@vXRk!IP@aelm<%Nf0CMw%ysEc8xA=P zQg?N%)UT)G(d2}y2(Aj@5%M??xTn5Q8y**fNj9Q+7nU@F?iN#EAV}O)pP2Owe@~R4 zOfxoL5z%Gi&0xa2ZDq@b2Eb0rK^M~@UB5F}>QgxC3;=J11=r46#;;a`rCnK0QlWV} z|CO|v?*%=Zbz%w!6)J!xX2aQHMuW=W+=rmcR;-jGq4ra!Mng&JT<5zQv(eiTkEGz5 z07&N;lp7nTv&`f`J4qh*Q~zLh-YNB6@->e+e!g5-B@4EO4o> z#!gq4`T-s4A0hs#cS|*R@?H|blpo?wU6s+m-o9OghW6*|1KJJow#Wd%bsU!(5b|Ng zU%?7GCr0`<*V*Cda&XG$(EFG7fniCU0Sgsii^~i2jK~${g@6uqR}=8xQAquM$QEjX zvcg?3xKZ6}dC+lviREMzoPXG;FJW*{d4xP>W=RrLv1?vM3hVb&5o27a z(zwO6_U2bz020zAYPMo&9}fLn(0?-sHsA_o*NRJ#ra^oDOKMq}{@RvhD;glMiKhF1O@$Sn!ms>Ra=Uzdfpm8r~9C#fE?P^j@ zDNDbvRLNk_x#f<4S#Qqhz)z73EPXycJ%&E@hJ-(u1NglJ-%OTIsjDm`EGfD!0UCtv zMxn*{y3nyWtEvMSWRkO<%e6Jl&LR%rC((xImufP|GH_8fz>y$u8v^I^vFzVldfzp^ z0|6i7;QR$G9=-0qp#s4Z$tl7h6Wv6s{MGrit#0xp2;4_F_}IP+8Y)-iqosQqRn^4>D8dsHXeb0I{QYVx~}2(w^G%;_{{wj1**q(O3eq7_0^m^>X%sUR3cDA6Dk zle2q7C4tasEm9&3GBI}e3H`rNX^kDQAR=rz3~7slK_(WDI+e8+k9i7<`JR3psCe`w zg#HdPBdtu*23RWfT3!q&NF)axcyshC6C`iP_x}`q1K0&WF zv4RDW=%npZ)>5rbVh-TZN&EG3y^_QBtxgIkNW{#xUvsly)E|`!IB3CZm56Ecno42tn*Vty zujMpY0ej{dEHrx=%td zX(t(vmme|Lu)CpRZppkswPI{Ogp0UgIvSkQ-^5KITiN&ASaX! zt?KxBX%4~aDr!q;KNW&OC8dP(r{iH$LI#9dN(uaMxRe0e5uL$Og43y{1b#ADN(eAm zlhPYM7%U|O7*y`WWI5SRK6omM14F+(ek~KVXF(&yKm9(s8Z2HwD|IN1E#?>U7^(J> z05s@4j8<>yyie-+7B(4X$|6I0E+<0oaeSAa`j&E`XsMa&<*8&s^M2GktYCj$H5+D) zBSBi2c+fhbH%a5n|3@T2OS{;A43P|^`Sge+2H*!!#;0>;_Y{8qPj|liID|h3flqOf z{XC*;gQSQlWgijoG$>KMkSlHHmse8C(i`%K(w>pWL5pJDY4P@Nb%d8G)(e9I2z+?W z|2&k}avGH2weV~xuL&HqZlC}8DXscm(s7V#j?1tGiof;ol0$&L!;iUmslW}V-w1ey z0siOwLb2-Kuv}Jv9RSFCd;uVL3eWHlk@*aX72kQc#J}*5*kF2uUufm}cDKKt&7Mui zvVJivVT}+M3Gpw1gl(ts@tjt_be}VgpG&O(gG%xsYmiBDV7=Xg5eKC^F+eoDu5R%& zG&JJZ(j3o%#^d;w`yGFYL}92X@tsN(k_pWR@oo2QcqK%n{pN(OL!@# zi49$>BXR)-mE^@*VbShI(4dpjA3vdM>Gi(r_Vkwlq4sk!eo>r-Yp5O6utdZF{Kn*R zem2|D<(4w{7NtgCIbk@=tC9mF>ajiz)i5U<6N)v={C z6b@1>SaHu;;U3aiR`YH5ZFbTUL4wGeg~;fz8>@=M(B(QV6?hQ5lLU*4unf7mqT?{Y z|D0ba4hl51^#s@ffaHX_r*Yg>OX=gkMIn(efOAr%U&A%VBBL4B78G=Ffd9$lO0J~s zK90)-;BFn;qHP#2*X3}w*&FybChivB@kAX4Z7C4a{l6Im;9Kc8d5g29IH-}+&B6#X z-9am2uPMw7(P5_F1_-mG0F5xyyjK4(GX!AxnSL7}%#H%|>plu~(lG30_8)PcpzQ(dQrlhw#!NNW#S};bjJ}C*B&`0<~DHlPN9bg-*-h0DlK~S{X|FVnxs` z&5M#BKoAHiWKQW(o~YN76FsFs(?R|s;B9E8039MzUp>$gnfa{)!5Q?^`+wg%#GZl> z2lVEOmP++Tdx}P{7h_qswD_5JClUqdkQ=#GB?8@&8yy7T5P@92=3Ts&2xJDZA-t|| z&ABb%br22yK{dXczzhL6I6{~FEsn?w{@{qB+;0i5DE1%nEQcF*r0X+yXF6R1E;of( zI<(C26+n#!-<&utcNPyVu@?!&(lV7I5d->trcZWfpVD3)Ixzb)eI1C=4kAQL6b(wh z2uggE`;MAfbUg#zA3K?i+_})QuVpxpEzok+V`PNDd6Gisr;LOrEwzYuR4y1mnqOHc z(#F@TLxRn;*5513g3dBjQ`(ThV8^|r<3liz4q(uEH|fNKJ;sZgX@>oamGnTSRk$~+ zBaC^uIfOd6P`{gO_ow@br;~*(`4>H3A6y2O*{TpMC5IODvNb zW#kAPwB8C@ymIY^;@z-Du#%lCQ0U$YuNTv4#u`#pUt&`2G_b3?OAR|ADwaeP!v9EV zRAR|8Y+c3@lmf8SJ6Z*|>Ioq9P(tv^*a@9Iu-)oQVB1Ov$%EQ2gE#3c)5+C%OQ)pY zkQNQ6PgG*?C>mjS%pcK?U!FZa)3tL^08wEk)YJgW9${==}gF|bslUx$si3<$N?Lar0`7{&qgV6e}-(Fn@Z zE;G}VU(DAu*&ZGFX)gW8SQ&7DpAEGIo?XCM%9DuIbW=>vBMH7+r^jy;ORy zCI>3DS9C1mfo`^t|Mnj*U$9=m1^aK7L3qdy#f!y}BmX*RIK&ww)I(p<0Tq0e zCY|ZMrU4mwqJpUwi3FIgiLjPhaPi&nPa4~xsW+L-4Yy=uphDDZ01WN7vro1&KaDxs zQD1i}#Z99F(F!fD$uCo<)A>XWA5NXgP^W4%hL|tjES9rbmQy8!Haa4q_d1`HN~PFF z&JtUe7x0IH4+N;xm!Y4gbk@d8lhV6fjuum@P=BFTq(N)mjEDa%(C$$T^2qhQ_)& zOpS=$owy4#&p!U_`!7HK?mxc%RD|C$y63<5(XCks{NteV$zt*Gc=i2iu^vyqT+8EE zEUkl5OB12^Bq{#WZ2vJYmiX%YPdd9;mXuaC6%(rWgX(ANEzRV9%7X{OpO!g_QZJ`L z=|NDUfP6tG9hXv;q*qD_9JKBPt*^iO{LAk?{YF@1DGf>)kf3l63ja|}hL${A5lJxU zAb$S%`Il9pw)n|uP&y43{c*l3~`ccs6c?t>uD%w!E8Ih020Px%nzA z5&w-Ukp-38!C&XpY?5|ZsJ{6O25 zW#+f^Kr31`EVSR1+I09N55v{OEi*$$#T6IoNPm}nNb7dHlBeRdrHsUa%A;T-KcQkg zjLC{vvhi3n)Y)+duZwin*0L&@P<=Dxne@hT_k5yO_gF?A%G^^R zp@~+>b#g*J+1}PF$zagAOM{3zH+DFg&(C!4)Y2}_zxOTi{1+xd>%P=-_tNA>S>i2c zSJdQPH$rc+-^%R-mKeKP&LLslL!maOp8o0}cL`ZWy>Au-^|&T2_Y-+x7)_=g)hyz1 z5KR%2+PCM6@k(BxGK8k59gF;bzcEkII29HfoJ*r7( zGQ9##M?I#w+t3op!R_?aW12Mm@Cs6pr$Y0QDi3}vv!|tJ_p%ZpV4*70EjwP-oc+^n zfI{&!*m+K8=JFY_A}TE-7T&_VK@d^UxCIS;$AqOHUg0wa>^B2@GN$WGXdl-lFL$QZ z8o~~Hdn31_Ktl5bn&;F@mzANVMPFJp@gVR~mN-Mm9GZAjWyuYbFSsuwgi#p8j)^>| z-Gepm>1M1J3|QK`6^jxKI!I|OH=@3hh@rNW7E#cE=ccoZ5ncItIpSNxg;1O4BoAsR zBlxMiv8$A`j8T-{Q$XmUbf7!d$1g@SJG)VHa+cBGnp%c~7Gi6)fSBOTsFl`GTTEmy=pbFW zM@7S-tqe>osK8(RWH*uJY@5G8g2LkvBXe3GJlifuepp)Wm$Q$@w<4yOAJy80&mGr(W^BmAo zzSEVRo3YGXALg!^I6&G@EU3h^zuu~gq}p1{v?Gx?preP! zm1*p#=keUu!xK1YVNS?BqzRLAHKt}+6;meIoCc-0LXOysSF^?0`Fcs1bHlQ-Bx}p}B@?P>>C-^`h$gYdhea5Gl(P0& z?7X z{PX4NP_hl<5`rBeK)Z0S_?_Z(ldj=T6u^I8SzQ|fPHH^zqsHX>Ysl*`uLwe`sSmLX-m`Se|`VuzX&12 zN;H7H*N##l{1ESx@E4zd`Dv+XiK!r?H50Iq3(-XT6EEb(npQahgxq~t$NwFbH&|K{ zM$NVi2dNl?T>racTu0P2r@IJc)zTV+B^AOauyMuz5Xr?*@Z)0>}?`NJ0I%=nStlP(*vHw>E` z-HTolAx06tqb>Zjql!-3l?zi01rdK7Vj`yi{u)20{}<`#>C1=W1eU)CkW!BW(pJ~m z@?7=n4E+ZUjvNTQ9t0-R6^01aXd-CnURJ>kP$B?&hXr|W3f*`yQzs!A1|LOmGYs%l z*abW{ruTHigN#K(Z?Kd|D9BJw-MO9qbf1(vM1l{@63NBTNf1I@wh0)dTuR?vt*>dW zL9LVPn$i;m@Vguaa?|A5$X~-MY%p{Rg$)7(iNB^-{7DmMRUp3x%e@5URtpyDEC;+G1TLPN>roX%x>b)kWPDKvkcZ;B(D2K5aDDxsN#^P;wt z$XC3JY_#6EL*a(<&2a&Q=D)|tK9eugu{Ja?KcQ{a)j<8V|$ zJ10xFkpF#{kX2L=u3y!{#j{?BP7!@y4-pu{{3r8q@yklfx`OOd^QGA5uNfs7r zxSeeeD_+^GPD#C?NgBUDQs_)16}ntSgks6PQEHl6MD>C$BSJ5;b2{7jGL|AoO&IsE zQ&FM&i)5#KV|2Ntb;%;d-7uXQDM!3qWg`r~j$hNcQMv6jr#jzW)3PfOj2jMGiy&Jt zA|4@mHv*^ux%IKYhd|L)<}(?H8;$^rjAMZ)$Vj>g&M#r|r&qE5Elk1$xAWqfN`sADCnf}z90e1zqH zujMjol#W8U`4~t!V)xw;8LUu1c-~3jag_lNOr!h}PPyTj*oZh%ACzFIza2k4^Hq`G zmbzW9WsP{lqQgkINjz+KbzEp?ZN#8Gh!ryQwdbi8cs|=wLeK{@_w~F0 zL;Z2|oA>C;i= zV&1;-Ey>W=*6%h8+H>^7VZEQp4Byv!0fu_kFLh~>#!L6>^YvN|v-RkgDk^ldUWk9= za84(bQH?EY$r}y`FeSBJ!b16H)A@7S(<}-x!wkNj9rX}EA5Pa3zPt78ll9~?s#?E2 z=t~SOlZJue=RRt{n%s9JJE&X&Lhc0CO=sr^xe(1Ve^)chlOS+U2#j`H*$6PKN(4ao z&WSi0gx@pM{0a#}2~yP;;GYI{50zW6(!gk+5i@n7Hz9^|5bQ(of}4`)A)mvoDV zO!zl+vu@U}qY;F65d_)>IN$6?7hBp#Pz}HhrOk~2sDdH?t0+%JJk5IUInU5$!3~{` z%~2qI@YV4a&dotM21hXNA{Z>sEn!g@SmuUmNjkzHbDGQOBF8c-eN2T}5V@a=?AC{^ zI!nf~e&Co+z(MNG*>X%r*YQ?;YB!$IiKnCSVm_9Uc0(nJNRt?sedJGx{9kYV#b5pf z{~yBeR{3TKkBGw?I_RB30XF0-F5r1TSzHa}0#AnYd){(?wb*t?*MhqV_J3G!e}Aq{ zy}F@qDXovNEE3{xN&w+_w;qmjI>h03ABsr0p}*8U7=e#ayj>5)YQ2_Y+Bb}ubq|B1 zBLqkMKn*uKV(QiTA@C83;0IomJllqAFGv0_5e9RH2&61QRN2sf;^QH_<7SO3>gF7A zR6Qp{JJ`+_`;BSU&+d$F65%T&=sp=?`wbHcG7ThBW`6oH!y^d4@#d#@&eziyG$XsB zl`kP!A}BYEiggM~MFv6o8yzG*xRY*IIGoekcv{6!3)cVh@|spts~$Qcg`kDRvZTpj zx^BidKFSqu=EOqw>?qM^A*qm|9ZGKTMp5+}8a>_*FOha&D2FObDEp?LNE(I~pGiBQ zp&n8wcd~df)nYN;(7J5uiave%!TZ$VS{!6%xnWpIrcl>y%Y1*M0zwmf;oqftlb48* zFUM*Vyg44~fskNmhvGtL2S132FsHv8#X+vBhpH9tbsw*R1bNDy$o?(a?Wf>hpp5!tXZ>GFVccmv+<}REvYS22piXsD@I``TE=c^CZ*=7U7AeZy*{GKo zbphBf@>2GyjOw0wNpPWjFZY5QjTNcOFr1eFWj^viXgx@;?&xNuQq8c#JRwRoAfflz z)eGEbSL3tq)*pTQ@#mil18-RVgwojcPs38}BSa`ZDV~4tuiOxtH%u&;G{J=G zn@W`@Jb8Vh5H!-vEEZ_Y%KK*j!g*PzN!!*cQ3t5vqU>u z=q!vgoQ#wJN(?+m-I~z`VM?C!A5@dkFnaDj4g3TF`E`EGojBPPH7vbXqwm$BX+VW`>#qYMYA(0oU{FC8KLZWtaGsEV}ka*UB* zi_c^TDpB!$@2IFsz#k7pXlT)fjsimiKp;v#1Sk~W6tB|(eEzv?(;2#G0#mAHU?@Kl zpI|OU#QF_0f~X?|q|}XAs7ia&Rf0mdzr7h4%C|1)3I)0hhW}Tn8TO9&PrZ2=MWd<3 zE|0KlLOY5=&uQAAf2ci0p;=Du6Kn~!rvQDM2W6^z-)@-jNt4X#9##Q^!~_0yvfR)m z&a*L{J~pPkl_FXV)iDr0Vkuo zl>ek-jSqBlE!}%9on@HyO`k_gavEeFruXl1(wAyh;N!Vn`rZuTVgV4|X0JESsM7bM#kFI)jv7yt%7H2eP zxmwft54-s#{US6h>DEKMuc|;8@i5n;opz<1C2o$$MIO{nE~p3VHm06kPGluvNo(`3S&(?>vJ|aXq{%JrGOvpR;Vo4=pOoboUMc>WAtCr62`;vWN*m8GzLOA2FA*Vk zFTG2{lzY0lUL+1nY(;C777n~NqV&B|3OEQoNiXhb5OOi2RyM6}R)>XI zI(o-UQ`m~|e!U+rM(ZuDnxG&EpY{<}*otsC`3px^b*m4?G8=u4McGD1$p=uqybZd4FJeVvplqbMJ|d=w`Osv0r5O^^J> zql3C;%5Wl9hD{8F7UXi}ZFjO_H;+pW6yD^_ zyQ8KN)zPC1iqqM)+_Q5--}vZI(=jfDU!xZWIPVPH~08%H?Aaon=@d;VN7F)(DZE+yrIl;SEYF60N zVyOUDA;PC(=~J0nMZkhcjFCl*ti052jgdry(0#aUQIC7WFckax=4div?o5vbz1F-Fv!Fh;-u+|J&|)-V<^Kx>H(q>V?YgyDu58F zA?HEt*5zV-epcCRYH6kMr(Pk0fc&~6^Zy7(8CEN}4-?lRKz+kKoEKP2%TET^Gr)a~ ziDPx*prIS$`nP<%UvdOffW3XW-JDTm(0%Ia09rH98#k7a>ph#LrOGF^oZDN zLNf&DlS?{Rj{53LS_h@tLWc7l-N)V~0t5P~dx4iITj#O~lt z+WGooBOBp{SsQ#UbOH(zC$ueU^TQec@BBhu2xM`W|ClFQC8vVlsO@vDc;*0qC#i1e z7Gn|HhB6_1Erahs5V$7=v<;SgQF9S%f|kF(&p-Ce@ahh#&}@`T(qUbcR1I8j%WyqXLTXClVxndNo_f^)3x%DkA{= z$<<6=NNpHi)@3vifP27&jjLeCTe`u6F2hl7Ff@rB!WRe?7?ghQUeo2LA@mBLmz=j) zwXr$sKJ}r_APDV=dwif{pC@BA!)a)ED0akv{=camCx+2{6^B{#>keH(L5Hx=O$V#} z(~rIux!h2q<7?*%{1H$H@7vk$v+ZiU;H?!;>DW`XXu&Wg1d^81SV-T;2Ve8{$0L58FjJ`G9< z1NPlHE$|ypemKw(*P~)}rJ)$*?*mGuc}08XE!x2}(>p z{Cjl?o1xEJgq|4yJI^oH<3T*1b0FY6&q>-7O z4$tA*YBciy9*u-GhQav6K)F;RA;{K+r!KRz_tbocVYOm{D8-x!$v4y6{$I5uXR1UH zawRIMkbNhUUC|bxx!VTmB2$(!hArC(rKJlp!qsA-pd%Pr8Q?rdgQn{RomXD0=4xK4&;{WoYyP~s7gze!>D5kPs+SL(dJoZBU1 zUf(J_^2e9YyeDeaBS%CKD4jPrKlngZ(njyRQP2^LzbZFH7+S=-+s&JQVvG1L%>a`z zyc=jn8)Db8yfciP;Ct^@4MWHu;x)S2nHQ(gGG%oPieb?;7*Z++Lhcb>4M&u0FN+e) zuxJ<%p(lwDd=u}+$L^dT*=n)0(t-o)l7R`)`w*p06pb$yCR!Q_HN6Z6sThC$S;e^4 z_!B_LJ zNVON?i3hQ06`l038W$(yw_25G5IR9IOZ_=@;Fw|EA3hdkv?mn;&Pd^~Rsm0fK&-tF zE8g5L6k2QVfP%zp^YvM=bp3t9biq0-7z&?*_wIZX4wp_RyVp;fw#-vTmXC$_XFN1M zp(_EP!f~{u1vs=Zk?tEPPT}YifC?G`c$hpe-;6>4MbugP_0d#id4`1GV<9-_C2bda zC9tJYa)V@oLR4D0n(eRGTY0EoPb-0h;IEUFyTfuh-tz6U!Mh_mXGhHe8ZLTCK;`3O zd<5m~^yTvp>3UGw!o8+_)y1xM%RJ;Urx)Ow`0rkoxCTS~jroqs#XTPgD^j#!Q5zav zVOLZJ%HVV(NZA)^fkzPFKjlkCM3@ars&tqc0pLRh`V)G_lgVLuD9(AZWPr%hHhzuD=klh%;QXEy`*j3ZZ=sCm{>}aqiQ)6qW@=IbaXx6U-4aRyt9F4 zNJIqwyP=k{grZbIusaZr7XZD?L488Rk1?Q6fU_QIewpMf&c7rnaPQmdWK~f;khC_mbo#HK;e|au<}P z$$U%>JV@P5QuEznt_ojE*Zi1Lz(FX>{F~W!dEiN9+Q=%>NT19vpb*U*x!F<=NDY_v zaU^(<${b0h%1o`q@8igTgHUD@RhM+PjcmO4u?aj#WjSq6J1~dMX^9BAlav;?4>rgT74_?HN^q0Rxoxfy>X8iamA z#~KT?VdI%<;xPfZhdfi{7W~rvqIBVUxn|zb!b=Pn`1EIntO@dI-2)3IBn0oJ;82H_ z{}Apolu`+x%mWWn57L{9@timULzAQ z6}G%ovza}QY3@-F=i`*Jb3pQeYD1&5Vu1p}mecU6Uv)TETW)s5`yB_N(ws+o#Bcd z0R;X-!RI?f^?{?7tnaf%o=v&m#2@vc)id?L|dvzEU3U9+L%#IeQoyS zG$_HIx=x!ti3OE6f_JHy5DCDrU$YV~OaU2bn116CeL-(a!yr`@e!SSqgNvFK90>}@ zB}Z!Owp^0Ipz|~5OW86v9KEF5w_F&ejs#T%mz3cy&uAe1i`nzp;>(6z2VjJvs{(`# z5AZ78oIam?yk1?*A^H~H zrs9%}JDbiY`-+{0d%_e*su%EM`nTeoZs6GMtslb3vig39Ay{dP{fG1S5MrlO#dxF>)?hMI@|wen12Q<+xL zkmqny8#f5h3ORkZo2goS>Dtxioe z2t7v7;-imwACPDxm^uxWC{##D-iBn+1U2=#DnbqfJdH{CSLnaO48w^g_*BFba{!M8 zFW*f41yY5Ov5c^U5DFPdgkVgC)L@KyL#DzS7veE-_?IXZ4wpC-5|XiO-(4N(wAX7n z(%4$IM;K&c(R=NiD64ru*2Z5P<>x)V+`$l$noSS#lCn6F&n% z;Z3JN*8sRdR62cP!~4S3!T*+VGO1JnLh*H{SS*w>%nvAUi8DU$(NXCOYD&7Zj@&(4 zBDxKQDFDu0_=AsT@H7Pf6pyInBRyG)8d4QL7cyW$mHT-hg=55Ay)Dl8V%acSFY6vYORA}j^-l262a6@QmAywbd zG6K}#Tl(p#z&7~SF-mT4FA!J9*2G$^p$J>U?a z-f?kBD}t$isPF1C^gL8bNF4CJH!c=y)rs%!4bK2Kc!M_l_VorMKn$ z812g|ZsYD=j)4NUuPgXE;uS4x5-#puS40fx-XpxyS(cOCJ>nUfyHd@E7A`X+mu?B` zoi{uK+*_^;S(M4xFn^(np8x^br(+%m$@`ey({VnM;$w||dH?SPwYzsc17S_vz9kQH zQ*Go+9{No-`ns1q4uQ~mDwUiv>2{|&1gJi~HfwpmLihM$0+_yh*p8=jx@=j*SoiV) z6tI1Gxku11eK7${?^)L!$f4am>kx|i!&Vl)4OB*e>h0$~Mjq7e@x=r%z5T8ukVCtN zRP-f$?%HqZa##`8?zz@85Lz14=zA1D6M(zFq+`cC8|ZX*9%u(Kb`7a7y55YHnqfrROz#&j@ zgy6w)H|LYGKPI2=XMQeEC>u5<1cbM`f`iuG@Zx75f9~akkYyOy!*ij;f(k79YBO7X zLdRs#+6~=@5=HEc&d(P((okw(tX5 z#xzscthL#a!D>40C>>dDwCe;Ibl@{O9%FQ%_!+=w5e1Eh!LeLGx`-(fn_)#!C2}M$ zQ+qzyy6cBW>)pi_9S5uS&zaO5Bjlk94{EoUJ3O7p;?Oc`9MIt* zS~vJiFM?_dKS)q`6ykvAG>>EmOMAAA3I&87{6)tzt0dLtFV6uTDVBa6CdCF2_=pc$ zUqJ1iAyOx4B` zA}rqzlxCC!g7SappinL5hOBtUJDud@&XSXzmH!+lM0F(u?44S`D0vn8t_*9-HL99s zI5^-V5O3=*`6U{%*DG)h7vN~p(J%x&g77Q-AqOFk9FbZKcaCV@(SQgM1m`{dIR%$b zV%pI*!>!z^^xZ(|L@FR4MINGt8I7~fCUky=UOhil9#RqrN)bi;p735i<~~#u6(R`E zZ*&yVf5C1S;(VbPYhr|N z=KE^9UeQKbIePd1zKXC4H3aadE4{bbFi)ta92^3`*H-f#-D4}8oKIhF4}a#WCwvd! zWB!3F!mzh}G+onbY1w%)jCc!v1qZpG^NX}hTDF4>cS{Qa2LSSQkJKXuhFM<4WCEa% zR;#_cusU2+NMm36PENyq6hOS^t3(L?WUbDPGK60x6ea-oQyzm7g-G{==MVtirN6dx z9Lbh0MWq#f>PA$mm?pkK(H%*8-=UtfR^>XB;6Fy?sDJ@nL*x}-@HCDtpo zcwAknFsq-E!$IkOjA2SAwD9FeWt3qGITDIA5_r(c+Z^+iE`a;A1w0Kpc^yqp=v-uF zRG&IJ0-+|XqFbP4Vb#kjM}v+?eYE0K3H3@79tS0nk7=*s!1*{5p(iY(qq2vz%;TVx zw*%(1vT`rQ>MO$-P#T3Vl+xs5A03uvzP_V;^fg4c15k>j zLM^WcX-;9_-c=$(FZW_u4fgS(tOaws>Xl%hc5@=u>?*6kK6c3(@OEs8>OHH5wsXi<#ob$^b?|A?2SjU8zp}dpiGIj4HO*-Wd>T zsf_a-UZK=p#swHuQVWY7xZy0J)84|0I4Gt3>DFg_CHJDWr(@7coiJV|3~JW_4LY}C zl9~M=Bn(SpS0BiKuBc^4}l32+RGM)Lilrq)o==gfej$Y9A9xJZNP$ z`QDFE>S0r$RdjrhWGJ0LgHDzTs5>G=dZaT()f5i$sFpqogo47ISh%?nF=2#ZTT=X5 z7LA?-jV#`Ilx(oN#HkPsI;qV<16RV5_BIQXz)y9&9~cu7?R9*BK_#<79qZA<3L=4@ zrCPlkyhobKw}of%?fV(RQ9bf`puv*NQ#;v&?BOXQfuF_qZnRQoYxIb34}(e;AJlab zuIdpVjDkXH33In@(3Wrpgj#9~VTe%J)ZP|~I4EVFqt1~~>ESs>K_RtM)NZr(b_#(& zPkmEf%1+nqUD1V>!i@I5X->?p+Bfr=G^U5oQrj-sP^sG6ZBR9P8aww( zpXog5h3Y-F&!Gz>;wF`4x+&3KmgOypjISCJJ@{EWBE`D8$*4Wn2~>KAMleMVX%9V< zz)vL!74xzxX)j3}3JS^pG-x@H1xzaWG+H?jpGh^oJVK^D2J$vT%GZ@9LwmkfEr!%G z2_uriQ|&Di&`NLVD!tuXd5xaz2qTaK*#R2tNWBAkqE3cr?;Us+G*Zscm3X_a@;dw{ zbVR#wPs8d&BBbE%&i?rESKoa4$@hQwT5t{L-K@h(R{C#ZfP9C4{q)~I|L)uGKKkza zZw1?Mo>I=vD4?G*{qxU0{_4x`KL7IjPd^cO!-;D-KF5H6+w)mj!8`ip^UneUWapR9 zKl}FcfBN#HFBH3@Uor~lCqCTYe)rYaUn{ubj5O&LK)}AmZ2pnLF8pm+(3+Eh2;9Tp z{(p}A-KXFDp(hy#g!tzqOZ#WkzCgnw?JT(d`<_DoVtnFHJo|F&=d8c z`dx|qJ;KQG!9~? z7jES5J2S;b`rO==G<;2Y+``y!b{U*OLbIC$M6OMsP`$n)7f*nGka9Mna@(a zr}|Qppz?GythA@kcaf5toXXcd;ln>uB19M^ID2MN;0~d>degRDK1Yh_((C{{w6YfxAHVG zga@WHHzKz&bquWsfXO8jUGn-&1hiYpnbQ&0(9jD1h_86?$`_w+Ky?!1Hk0cj~W%-w@}h| zsO|jsAbPJ7@%e>pO?S0EAi(t@)%mJhIep>sC5SF%(Z~UBLz5BJF=a&t$S$nc}f9=ek~ zqa^DRsD)f9gLZvW1p^S;kkWKeJEycfoFNDQ$SbQwq;<~09)YlOslz7RlrA`I` zoBco+EALej?&gO80F!%p&*lp`T-2?X=ROCI!^l5uWQp4?i~#^9$JGJ@(|OCbTUFj>CQVYGihLXPrkqeR)O^=8$b}LBS=Q*z!bnM1+pM%Hg zl7HwoLrt2Buv5!8TVp809g%uYcW8^8-A~HlAQh80^?=5E zx`jvxwI=TftI5!L;KRvySWRX*q>P6_CMIdJvvJU`%sgO0ggYGWEo#`S%Vcfim!*U! zRRna6*)G5&2*gaumujkI@2#0KpehnYL%Ll;G^%4{&v(n>fbrJy3oO{dZEP1`e_E@7 zC(EkmTIuCLz(*SvmGZIG2CyI!ixO(lEhqZIsMew+!m2Xtvq4HMmT|B`hAweh3?>s{ zkcly~os}xBF#{GvV$AHQ{ZeGb)|iPf$i#*PKjFq&A=TQj5J1QYtBSeIK30idS}ccm zG)^vu$yVc~wBZt21Yk)&H|`wR!E*4DfEkE4t6^!Z%fAJ}bbc_TPba2Y2&S&%h)I^UK(V-H4=pyFbW%56FK+R-!a zdk}d{f$o*+H=P*(f_Y7|AhPV}Hcqke05CZp6oz-p2f}X7ulz&NQtOsqBLd;%7~&u0 zm{+$L^528VF|?g6*QzA$=FI>Alj{-x6Sa|Lf3DjELIwewTiX8Ta*(#$L|9G%-Fu_x zyLa`51AxgRLUcV9H58;Px{XwVAgP0i9o?fi9Z_GBE+X=?q9c9zwXG3`V(|#@WtyrN(_fQ-(ByVz4A%I9t{&Et zzqW>RVPa%K>0Yk18E@5fuC~5eA>%>Nc$8~6v*!q2CXMiYrA!cgtm## zw$I0Mme6uiOInNNV?y(wnBt0dHb(#EZH$(<%2`lKaYavuiK_^LMv5zXl-!$}(-Kz# z1}!ery>DO4XA9Z-=vJoZ6wtXYrt$1)(M9W47e@rR+@B?LhFGvDFyOl~uD<#&kA;rq zO&thLZf9~}hFMOiNl5LTD#2U*g@WGsvV-RF9`mt4nO*IXYE z;D)%{_Fd3KVGfLvtW$93R6*oC4M$&SaDy*$Zpa(`7D|yL^g=26Nr$v^e#^rd>@PbE zo$Z$krJVhn@%2hJDmsSM1CR<_4t77u?rq0XED%a+pXHM@^-Q*=<&(~@{x=!ej(!CK zp^bi(-P{Jh%0#(4as7?tZ315LixLy2(Z8$yRFAzX= z@khn`cB>Zrbc{bBz;&U0u`C9aI;P=30M*5v-gVS5?)Y=?d?sTgu0GON~_7fUG*j%cXO}G4z7?RBGlD=dxK;{veGCOn|q4D2?$f-5%@5(bl zx6~RD;Bq>kb-u-5TDNon0;p{NVL9IQnGf*a3t|zSIUk2JIR<^f`Dgc8V#Ujux~w&qm?90u%@ z@B+=rYPw-WyFw2j@b5%Eb-2}pq+w3BD&R>_xF6ox&3-u0Zu!|$6$^&*_bMtm4N9-m)lzm1+i@s(EP|&yyjUqk_^YAqR#{nG{xZvxkXtN-q zpz*WK^!#iio4JOfl)v&B&3_Kusl%;z`_YmP6jRM-i%$eM<3Qjw7N9c*M1nCC)gr+B zJ%G0YkPna*P(!O+LmfkdXL=f_0qht6pRg>o%|`pJo{u%mUx+X#3gEXk^U1Ttj1FvC z%0UK8`RG6O=_12`eLG{z4z?v_)Zyv;Q-qxNFN=t53%SGSkn@j2gxqsLKlOguuh$DY z>uN3q43mcW=b7^p4?_3zH!o+awVDtxoS2*w3ax;I+{66k^@dv5`XGmYdU-1%XB2`F z3dskXXP1Zld_f0WQQu`+9=&04XFzzh3a=2Oneyp~<5V@0TE%i6#O}f}UW34AB8fC^ zm>tFU!mJ2`%tO4!Pv*-Fm*TRaWN2xEQAkA~7LWJSz3W01zVjdfRK9x3;C!UO8S#$<4dJyIIbQL;ZI3Sf{XE< z4wzb=jkl943e#kN*vf{M#iM|DMf@d@P&}a(L|&1~N!e<&G>GuARB|XN+=~i-8b2S8 z=)PW&(JTqFt`c#j(qeu-8Bi(Wp!80(iH3;|KaSYo?fjey%C&4r{fnVIu3J|DL;Y@4 zUye&NEnSMbBxqF~x~M@W#9lg%2Az}!X{)FdX-|U=1%;Fb;ktp+V8lV`4t_b?6pNHC zUG93!cosD7Cyniz4+U296qZ`@h)(1|>v7V0vAVEuiYzELf(gw> z@ohXm%+@%<1is?Qg*<%}*mEQ*pZn~Rb< z8(}DH-_ilLJ6(|Vwmnjz`=+*?YKB7A(w;q%lzq|y6sqqXQ5}^-8h_~P@Sq*g2tg{n zY4_7i?>=iURY8N!X|!}#PP|!~w{^b;7*tYT^$$kl#e6KAWbJuXAfcE_SU+u(&v~_% zuyP70#Szj^uF@Vypuv_@l3&kPA3QCZEbS$E;z5gQS!$(FQ>Gk>Fx9f*<4~~WC@4_O zWIxM9V2YWe5@}E(S;4&#QH!@*;ZUU&{PR#&cosA$-h-{Yo#X3bz}6J+Rc|F8w5YAB zwLaUfm;d-;uevg(w(8BI2@LfIQQghHl%`rbY%oBky$lGow<~JjtxHq?m!)X0nwmtx zh4xSM)q;jO*bCYv$Q6B9q@LdnbZ*c^r=zK}={mqL}=uBaHTZG**Dwhb}JL&I0 zj)t6OYRj?OFlHIQN@y+RaB$eY&5Oz6d`sI6$5TJHDU7ld`5q8dGz>Zq3mrNRTS!^j zA2&%c4{9er9M)8((Y+`WJ-TBkl*7l)A_)Tjf%uun;a2kGM?(x9RS7s~!IsL|`E9nS z6ZBz=|9LQ51P->`_sho4&S|?FowPL9o6-#xe;~NXsnDQw5}whSlKSX3gV!n|0R;XX z!Iv#|L&M^zK?M0!1v(6*PHB*3s#-s4kVtvUc@YE84p(j&OQb6cE z46m}-cu|uxl+hJA$8wY8Nv0R;YC z|MwaHhyGt(re+xH2;b)=XJSDGR?wkBdbw4b6#)ePtq=-2Mpllb7#4U`3~(5*ktb~HZiYPI!XEZUos1{*uC8h#G?~U!O+7~c%z35Ay z6B7Z{*Xh}e&aY5ckQq9k88iUE}_AsOR?{nhjuvO)8H=_R@M2`R6jF(ObpLUD?005Ki z_9v_5vkKip>Awf@XG}cE`(X?>LS}x|lJ7Xox3Dj*5+wU%Y%AII@&(g$(`2@tX-v@NKIW8|KU- zMJh`sG#|vbdEwVN@0*uhdP`YbcX0-UTC$KI@_5ODwl>LPr`l>qxTUr6`Vh|cGCLuE0>2 zd4UFnwzTA~)b5uT1QyE4>u&W%^m|dvx7%F-L;a`4N&!QMT+Qb@1b~#aH(OrEwVj0} z7NbJKu;vbwP+wJ%kfbpHJXfn8ECZ3@TO~vw;Hj~(TOYQQnVaP1Jr;Ujlc}*07(u5( zgdSCb=_$E#IhQ*hOqJjP24 zeGNg~B<50>2MxJtr-qQGu8p=qGqS!KS~U<1B(68J;S*glTG)6fCUIZ^#g znOLlFjwl#)nTbq_D|5cc_OvA!0OW5^r;2(?6m&|SRe9_d+6!;}HOFLf9OnFn}n zzkW8OZ5hRKPD3UHLMY`th(+i5hgWL3NUQS_4ML9)B>(8JUGM@q5mSb$0Fa7ZAVToY zjuzoh_Ov?X`DU#aR~cqr!q-7akf3loyfZ8KhFSIs-*Z4e32!{3Qj(VZ0`!3%LJvy^&)fCV#t61)MQp$B@&HPelrB47uZgehRYP&Ex+mmo}O*Knws2Au&plpPKQje8+h zXk6pjsO(f&S{Y@eWH9Kw9dvl`+3g>HJ{$Sv`*Oy`FaRA$c~+@Wq5LFMrl}>mes{bW z75zfP5Y`c0$%N`#nJP7uX~%!nT*I*J5m^O=?&I+KoL864_>>I_-%9$}((oxGRTH83 zASm)>$B0^y8w?8#D>e!ow5UdN#bj|$OBSPSL;vOS`VI+=u|e07iVKy z)+T3BEp-2_FU@lf=y!MiS1RM_2+XCLurw@@4BzJpiB(bY?~7#FtP)sIxgEl?8PjFT zLZQu5o&)*=(Dzqv((c(@^+PQsaTy((90#q(N{jw1PUE%IGsopXgyO@XNWGlVHPtmV z=6@k)bu9xGrJm$L4XKWv4wmW?3o3{)GR@sfv^{KOOR_D-1P)p!@Sk&mNPL#kz2Z0z z0{>p(^I9prdB)O`tZD!Toy=!k98CEPT47DI&k_z=calwojAc-#YLFvA;l5OuuP)ZY z7)!6{sEVUO>2yc4<-Bl?|EsTIGo=9fJQSi51O>{W^nl7%{%`e=E0Z-sM$@20`O|Ch zt@P*m@C#GiXq`xc#*?|KZzz8h!EUmqNnQ*Y=-#3ls_( z_i~MIzy9dsPlbx5^g5#AVbFOJbZBCPHW<-*iq(onjrAcpmfmP7S2Ce`5>zkfyarWi zT5^6V6+qzM&G@@3nuih2v$US-5}pN>`$2`u1S-a8duBsfS?c68C?S^U*>rX>J}mZJ zH>?k`qG^kzk_pv2$-avprgD7Jl9Q^oIT92eCWR|H!uR|I`%%P|r43cp$#_TAirW=> zs)^ec-qg17Q@tPAG8cG*c|gL#EJd>Yg?*O#?x>uwE>q&)hfDjB2AduwKhlW|`}KKw zb%&*wUNtKRLN7~`RFyxk$Tg>ujCWLx&ruyF2Y5BdgWB!j%d7obT@GgH@0Bj}oElw@ z@U_#^yfD(i{DM|@O=;2Yx=7w_=|BNt&4b`8dhF9AX^M!kwChWk2^_RC+gNMAb`}b? zX4`Tg^iV(2s%sklCQk~fw)!!#sw%7fS{_8)L&dRCWm<%GvJ1A5G{U<>jm z8F(enLut!Fo>QX_kw2N9@+aCTG^#Lo8>M8zCe%ap#(*_mPJ zBIJ#9#(@6z?uP|+-al}gYmXhXDPaZgwk_; zxM<&RATnF=X=@|Cd*YlY0Nt$+{4ZG;{HtN&p{9ES9`-&#P|_sDbiAR-En&E260#P6 z0t(p}!|@IBH?5k~!mTk}!9x1UZnrr5@Qr4yZ-cLWJp7jLuGVd?Ve{9-<#+CVzAYrK^-h@G&F z{xK~H6Q2>9J;WWNO8pDlKKp=bk6WdOu7I-A?6P>^xC?Rq=jj4G|cuDLDeK;RbVzO!#f zpMUm;?}WcB~H_^i+>TpZelx1$^Q7CzZrnd zl#>0)=R>fW0`>{~{p}}TeI?Z@?L$CUKXKL6}1;g&YK!+;*s%C}#9IYfLi1?=RP zufO_6rt!9rI}GS4vW*s%0kfxEm7_igz=`(m2a}%yBi(gVKXc zscM>~!FpUQBB4j=gU|Inql4J4*IU(_GL)O)^U&OrC}>b_;|H{TeRDRaLw(#R(D;23 zW2W2|DVbbBy;1f2m8cRGs&Ce8oxCq)E#o}NWk-!=EOg&FqC1+r|5P~IvZB_e?aSpT0kuJe4*N&S_E7#Nlb~D8%aad85*sKl z6ZK}*4_}Guhc8k6?JH6J?MqaD_exZM_Y&2AcqOX;@DkPEzY^8ozeM$az7o~{d9&(N z7E}Y}9HQQsbEdMG7)mvj5_##gq){qg<)2I0ex;MZ!rCLcvUnOyH zQ%gFsX&ud8uI{!>IhHoK-Gq(>6&h%8Dit?b=E_Tn00JLzf!#&4j8r(PEiQ5zluqgV zSXw2D@r$NQK==j zzDzY>q5Ck?rSbfVsHOjSTr@GE__kE!KHh17YxiPH%MRs~prtO5Qj!HBZ`E{mexMzBi^Y1vc|=NewyK~(>^IITzY=9J zyBtqm(0!rP_4V#z=k5y9yTB~HLt*62XawWL1%t{V=T{MfmQj467%70?WjNOkZUK+B z$Wp)Nd;x;QDNBT-C5sa!E%TeXLe7D}Z5EjQIH4wp+B9J)Uvhec0DUK*XS7dLABJfu zVH6w~;D7G%YLB1c*nIvj=F8cS1OW0eKcZ+Jjdw3rlS?}EiUTgQh^dS&Yly#=|+ zn#TM0eDX3+LF;nUvX3k`i4{vCL}8;V0cbtN^qfk9{x)hH&g}`^M;1UIJxN3Jjr$dda zxwmVJfkh+@Vy-5l$8IsKFr;fu6d^#vj?e_*V>MB3`q-*g~CqmTK zNc4)VL~^~ZHBteCl&d1>X+l{|W(tdyFz!aE?2n3?vraRrsjEynxeIz!9w zY^2l_0fmk4D$y6zpIz}1?xGc88^yT6Scyge-j)H_QPo8&|G5~EzP2n8yUB6^hIp2f zsrj+-Av{0K7jkJ~pPa0@kj_%Izh1|CZY0;I^-0wV3t?`y)3v#0lf{}&Mx4#00 z`r{bn_)_6`!&F|RNW&!)nh)aJ+~1~1(np6G8aNRl1v4Pj9>!PGLwOsip`j5O$K=jq z`!#tq=+W}Zi@7{^qTQpC2^-&x;Sxh5P5Iv~R*<3KJPzOSJE%6|hSw)Sa0j&ZJLcgS4uY0dK2@2)oR@02+ zE3lfW(5Ct>xB6ER*Ro$}YDLs7PCzKWr4)I2*N7+ZN5WLY){=t(gBve)G zx>v5p+ZB!Bckf@Y%gQX|Ix}?oaezYkSHj*Y9jP**vHi__w4Cq!z4rOQs$tR95wmM# zgn`=TSuE4^#grCp(vhl_BE-;>KN5ff3-w2ZI(Je;Y+E{6b+5Ck!$FPepWN22Bw6urb|Zy;IAo+Uw*B7$J~#q`MX4oI;^aac!?7 zb0RclZraX%I8Yx~mSOF=DdM0eEux*eWn^Hd>+~v5(br%s6ths zT+(Ign^rX(3JS>%s%M9@Bfy|S;}Rh#yDL6RPj=-^ebcHbpg|}3i=##qVeS5MC@4Jk z_i<3O@@z~;htow`<(eZ)2f|$v!W19>@lOGT=#wN$cSUb0nnwN?VWFjE7j=}Z!b12# z66OP!W?SkJ3r$PKa7;51D{|Bh8_kOZ*+(uBA@?X*#|QS;d}?V{9kVZILh@mfq!EbP zViHTOcT6!uLh!y2EEi!|3dI}bJP=~Jb$dQ^vDlv0%esVw;B7t`{%pLXoT!$27#8Na zZ+$+v{P;+QU%=v(S?=_oE}e4L0YU~YM(WnqG0>81NL z#rUO%z&Cf?W7m)^;D+_D3Z6LN`;gN}zfMHmLmnU?`;gPwMs(CYoo^&kX!npO4){K= z(PIA#UrnpsQr+{KKq(c!adK36sX--2LB;2Q-C{PA4V&&cz%#%-aq&-kSTBl@8&-n5 zk5kHwn1a3;hVC(-zwYDOH;xGnGLiMRxbJXMp>VRpxw4xj&$i|CFQN zmZ=lZh%PU9P;>E0Pw5~Wy6r|7Vp)w)$^?++d!q*62N3wT_I@wR*>@A!^RW~R;ZyIW zjFaHJ^5pFEZ$JI&GZA!4yTN_x(HRBk2X0Xdp}+j<%kMt@<`18L`Oz0b!qVL-C2|_1 z?n0`nV<~q^orr?S6DLAjA1K|rvF+-nAIq2ti!mp;u11CKNz^S?(^xGl#l(7=dr<-Z z5b-%O&^*Qa;sG+b`53o|XLB+4jNNrmjgQg$yFb6C0@FViGsMbKZNO}8A$ zhD#s83<<%vlZELiZPe7eYb*oc$LuV?5dYycshddD18@R zT+q>&Lfq0*e~I~y3CS!I1<5iw_sK*83eg9JohmU~20&h7WtNsRxeXn6w=a@%AGt(? zb#Eo>;=@WpHmq_^AeD?X7t&cV;a^#dRr=|ZYcnJSvlQ!}mZ_&tip`mjyq~<{AFH%u zsbh|%od|?j=Fsc$f<}6Zvc8W)Gb9A>CF|T%Wt^que9SoTAoava`STk>4eEZ8lW^AZ zHgHlxt$`u^t6Z7~64vK`;`Id4cv0qk`|>?aIj;ypRRBTpMSln^zZt_YDtGgKGeAf* z9|3tUw;={(N{1mY*W0!l=vbVTbOhoz)j)VoEhOI$;P~1pn86F%DQ)ZRs+Rcx z&JxF*kzpb0Ghz6Evb?&z&stp^Q}jfL-OXLT+pp!YhqW|2u0=pd`I;%bx~I)-qupw} zq1h$b#;{Dx-sDk9hWN>T|AP0AOv@&8Y0RBdRZ^zf7=&%ftC^92}J*6df zd)iaMH(FnfH*##*(mnH^`+zGHG;ReA?t+N0TZW}dzQcfx@bizfqD!u3X$yZuLE|36 zKcoBQd1s^?#;^=5SFA{||GM=TfB6^ue|5plS~bu62s#*a?!d6i$$GJtBUpxARpIMA z?#}}W3b&)ereRdL;U@jL zU>VCR;Q<6b{Ox-70&f{?tKfOqA%^}wLeIbM=t81~`Trvtfd)H}<(wT6H!}L>M&rV z)SIftQd_CV6p&M>ujPWF)=(1$YQEuwI)HpMJd4zq_REHR!SrmR8UIr6Wvj2DJs-=`yDjb$3o2+m(UX>a*;Qj0 z1b${krFGM6g=*X6D%|B7$X70s)8QYPicblmHP~!RV8LT3*)M6`hY)Bh*&POKKTA3LPI`GofS}opc^OD1Wjne!|j&QV<<^%y3d2PO^JqZdZ zr8aWtwXKvQ2)O8t>V{rhZ!~Y^q5PoV%5F+q`4LeFJ^W4&it4k??;uqaipBZO3XTK? zlpv&hkW)5oqa~gLdW_$-EIJzFmna~|_+9Vj#p0UA_yr0YG1VVLv!yZBA7a>%Zno6q z9jgPi+F}(Xg#1w`QMWYzK<$>T?;Hv%EHiRtnW})$Ln@*=LaoAWOGTaoIz~<0ua!Pq z+o(xSgA!^ydPd9tigry~jhDfo6a7Uu%gTmdqrV&nbfjA~-`kdM2?8#>ZVa{KfR41w z8}rNIkhZj&SWrRU=3-u?*tWdwFknXus#Qp%1(5|6#KL|~%bkP?ZL#1vprhTsU-Oia zEXCW}?I1w`tp>N2PA=7HYc&KA_|XDap$uX{AVC48gfAfmY9nSa=pe0fGeJajTUvD( zu%CpQJ2gS*42SJp)!UW@;bpyDGNFo+Ni{{r3-%)A>Xe?QN~k8WqaOnLpAMHo~m7oar!{{bCrl!+`w`-)p%$`{V`PA~2tP zOj}NNAJIK1^Yep>9*fHy%CDKcfePtUFCFjv5pJ{8ELtv+l*DRwO{X1@X}u*92@(&y z6*N&mcL>l)JB5s;EvhY%G)UbcDN4;}U(T+-qc0ka;ja-tISC54g2F`aJhG%>AGjRv zFkn9lY+hwS|D28ZA~6{wmOetMqJYqQ81z5S6kSocmW zOY~o&n~@O$&Q2VsYr2qxj|&vZ!!kBpN=6hk-l9YB_|ieDQ^#lLb2{FPHvZ5iPj!`} z!N45kl1%=CBt!gR{>p@E^-I0A#<15hXB4^-3du+L>y!18PADc93(p$L#T-&*P_RXJ(3Q>_i-HCH*|3}~a z2_^)ekVD+jqjW*@h6>!-^s~x=?>0j{2VSjHq5Edkov&!!_hRwSb;Zn*V21oLgcm)fMn1s=4NP!b48==JzE|Y`}sx<(fzBbqRCiC0}$~D#M`w%_|4iP z&DrWYOArDa0eGht0Ny1_Wr+xZ;ZzQZI_d<_5rmZHF^T`pY)A1Ry*u<;SYvCm)clqKq4wyorR^Q(XYR^D|G%RjWIx!jD_%gn zbyX}>ABzwCb%#IfWG*xuY9c7dWfyTA_P+Syhr?P8D_L?uZdj@5nXvP{Qjd<7S}#ZE zFZ2|&rQ|h8=XiwT%}OXXbQO|FRffYk1m=k8BL{}^L-EOBReIb~)81@0sL*_?rs;!~ zUn^p%YE8n@Vj1HhY;mT(rsHMp) zjj4qogF_#s8T3OZx#k7K$x6zhwJ<0FghR&#^>MCv=;bLPMUERLE(HEq7)bglUVH^% z5O{<^rw4k8&sxyS#)nA{865hkSCAg)m8LHH%M&BWP=1?!$a5q8xuv7v=dus`r$z5x$=C2i0uyyJ?4X-=1PE^S*aqsF;!i7`*4^~`F!@34ys|rzx&pE zB&Q&}Z@B0DKko}C7|wZCWX~wM9}K|#Ah!2Yct0F~`(cIq+X1-0johC;r{i7((QxY2 z#bM>9y~4Gv4gtsBdOlk{KcfR=^s*Dfk{0)=OA9#!CP{)AC5OHJBEKnsa+onhXaXxEfXXg-9>8L!Sn zh;l{4R8(Y0D{~_B9>sTebh{nxzIAab+-exEi4Y~2BcXT_U*>-ZCBtw{{8%bE6ckcg z;h*WGR%$6vR9m?{-Xs&6uV0U!&(4ZE(U6PXhrt>kK)n^I7jj_Bkc%r^f`I(yHQhx_ zcZhR+5&l`;&SY^?z<2|WFd_P&6qSXZVJQRfCDFzav zrsa^(qXby!jrL=CAi1GOn_-S=IxKW^J27lNpq&v3y;E9$NI#x^yjbsM|DraETM9h? zxwlQBpz#(z=TX1{S857l|EmTIFSrHD|x3q{w!&}JD{l!xzyS&;>m`wxuwRE z%PKZOhiFiOJ)h79_FW7>yIw76#r?N##j>oO4I}3@Hy%SH3@9N#qnU{- z?aa0kGNPb?`1*oYBx;Ga_yS2Qd_{HVFbW_+0VyKg^c@U!TUk|hGi_cdV zYi*3B%~2+AfrHjtxz_QL!_t{Nq9~!zy_f5jnaePvTS@26LRmHnU%E#s(t7w3IM{>~ z{w?)Gbd3Iu6Z;z8@Z>)j=- zxxP5N@+z3O;KUAx=5k#ymiTpZtINxnO_6DH|PX1Ynw*y)^^yl2f>wqz&j@kL|FNl(w5qeGFD z#5P5;d9kgmb=G=+!2X!?2j5@vJ_Vov6o9=2UOc^e#Ui=)^Arj|p#T&L(@|H*kg;3F zSVD#*Fw@`SSJYF7*fGOR?KtERoil8e68oS`YdeQh%9s)->>-*2hmsF*5JO#*C>^$pC{8X(T;V17ER1Y+ z2YGOc2FF1{9ap=K8XGrg_-H;A>Svy~0=M{w?K-r7&VGWDHz$Gt{-a7>Fnn=hVi z(XuJI%&OCgrk7E2#!~v{4@qFAzs64?H(!^;h&SXjjBW@b_$4wE-wxkV#CoD2ik;Ey zLa1_jgU>?P(hsM--omA45JAshYP~YCExq`8vC=bCIek$2FIaE9%v9a}G6o$66e5(P zvo`M1dvqgrr}0>~{$2WeV{lA8L9~WHpT1A(z_9#601DWORL;ZV{LUfx;%w{7fnguF zaB^TYRl8+ExTE(VT$+_dt))fXneH3Og?#_>J;>)#u~4_tLjCF4Qz6Zd??D>kU@=r5 zi)$N?Y;6ib{`7tX0Sk-rX<8%gX>d=*PwznzMZ$uVv=<5{MUxJX0lts+;!&|sze;Pz zJsI6O*?bRr3g}q4&(p$n$Husbmh_+RK`zI1nn>6_k4NwKB9didkxKenEYADrYjSA) zI$dEr3hhzA*LaBQ*F?>A-b2kLC|O^hrG>=Vskj&Z$9oXX60tyERtpsMz`geP?g3U?eF&+3czKkEskm0BfPc($}2Fj6H0994;v2BFcbVeI$=SQ@njMaft zBoNRn!WF8Var0e6&Dgapf;VG1h9PXpLp&y1;U^W3pvhSIyxH7a}wDulXJO0B68ZdB66szBUT1P^NcFRaYfQ zl841oz6c>$vD9&jCfsCE*%{HFT)-+>95@T0+(RM2w4bPy=Xn<9G+kJ1rl;mN8n$r1 zY!`Eb2DwLaog-s$NkVXIh)_!?DUrqUDK#one)w~6cfX!D@n;G_Zqljq2loX@Mrf^iS2Or1jJ=|Mr)(F92$YR1Bi&5^ZebXG zO`zjotdKrqcqkztB<47;IYzBOHyOdfA-cj~+*S3f&esv?CL?`X0PX=X!{vY>)KA8y zYAK1Qp=oh;c=Daj$@G7I`MUU|x!-C$e6%6z;{NH~onBK7iQngPTrgie>r9#gG@}Ya zP=&$3tIg4&8l)Q!%7+x{%~;~MFliwSD6_8H$DhEm?S|>KGEABUkbD-7nZB?OQiUUS zoXE=6opHX#0!rpmc$Va{eerp6qL<-ZS_Db$@R;jY_Q{vcx0~=`M%^Lpm6aEKH=|o} zvzF{t3@p!GU!Gkgm@OA1W2R!kB0*wkmf%8jG-{qS)PF_W&KTMBtA@;>F!U$LY}9zT zvnyb8%p6|RpyquByh4D_ak^!fb2|qPMuxp62n!x!G0`d${fL{h!n|o286qPR#$f`K ze23?@o*oj706Tl7zaBhPs5w3GWKl@P#veQ z`V+d^iggL{BtDDqd8r8718i8!`0Rhr=yRmM?!XCR4#Av8!}46?2Or_SqqI7n&mo0W zhs0)Ts|xxVi}8pmZ^83ZZF)Ee?v2P;U**U9%GA0Rh1}d#%>*xrqvvwGye*gRyA}%n&VNJx{cMV;h5zTvpkt1hqJ83oH5+c zOq%1@vK9?q#G}*Mh~nfpWQM22gc(pKvkm2G_h5h!zaWk}QziMP)wQ@nRLv&?6Em)_6=~YxE_;@SLIbSK1f0;S!pe zZKdvDbB*r5cyE;&6R-@ni>3#Vg>1QlWHxK%c2vxv=%b5U9|Ou{SGm1n&Arn+raA~b z-Whr-Tt8q)3nXxv^-hY_wr#&v&EPSf#%}RhilFR2Q7(14-o2Ev8(e1n)Rx^kW>&H} zOFm5cWzHwF_$-4R1a>hLiUu~rAP^6u3XM6gb2(M{(>CLIz5|>tV}Q-vUotoUJGQ!R zKpEr=i&AH7h#RE3hva5On3z;Bu~d3W2KN)$8L``p%#cBI%bk)Dgd-0CneDEUNdAcY zzlfh4<3dYO{9Myr#p^+{1llR3muS^{ucXkqV`5AmqB5@@tSs-_5q2p8P3M~I5>kd_ z#!vR!`;A9!d9*ZR9fDp{70K^2;3f41tm*3^(oM;Ud&Zi*#C0$X|Iz+nAhX+K93v05 zf)oS;o};XD@d{6dsN+c+`P^|cgVuwEVdRhFe0CYK#;ESt_WJ(M_ZyG?d>^5NYC|N5 z=gru$AOJ0Hgv4TBF(jKR%Q)>V1T+~7Ng<8EVxkL%h?ZYPr_NZI4+#_o1FyH5Js67S zsIg)G5bzn(It!q5Wj|RsX1Zp7`eFCkQ~R?&7-sZW3nJMBBs1Q&4`bef(us$B-i-Ka z3nh6Iz-8>Tbh?q!@uKVknAx4S#m|1J=hwD?WX21vqiO$jV}t%H+EB&TN6&N2)yy{19U`wV!4vM@EaXnPq`NbF~0tz|q2x>m+Gtza}m2_Q4x4jC1B zVsAUc_b+GlL791t9&e2iQ;mP-wbe(iAa#nNM}{n%W@MHQ z6h2)7w1W3BE(>2eFM~4g6;oa@@$q|Cj^)%9J)W9*go;BqOwyXx?Fif%B7Z#K$QDxq*SR)T-))~v1K19rD zFqsf`+Y!DPp_g~sn_&+8jOn}&6OsD3Oe~c93L&5o>!QlFprw>gaSOa?H_M<@piGHw z;nYh4!8n8`12PW6`6!WgJy@pw%zr^epwP>|HXppA@8rw}Nu4U5hK zd>X#@2(!mT!_0^*36YW#cPr}6o79@*E0(H^L$BTGh;J3=FV~mG7m(JFJl`igi2aqAD@MYoRnu%H43t@ej{9# zlM+y{D4&OgFwgB!qWOMsup}eCHH1s+L>Jd`urSf!WQCE=>aqqW5581{m)OxCjk}?3 zT$TtPJc|%@Ppc=tT`a46T5zTp6EW(ZNL3`d=8SV9f=IRk!e!EHVY}JEWrcE$E+gnF z1WD5>WG0T9oJu1VTf=45w+GK62zzL9rbL&q&8YOKGzoV94-jA??B z5Si=~ItJ3~$Yhxr%elcG5~DCI?0LU69gXM^)`5!g8aE!l>$Grzpj?8SW(nJp>V$L!mi4s6%QUpP0ze&7m_O7?FduL_#&B*`G8E2!Cl?jw$V-5W}A>Hl~ zb{gBI!etx}PJosPmmp)=Fbeh$y82YfsDT*RE>^cOQ6CO^aR!~dI&^R>kNYM;z>-iq zau05(4~at_8T;=7D3(D$Gy9j~rN{3k*v{*;%TdVIJ_XF_S=Eu^d<$wIHi;S$zAS5(vmDXZ}#14}gFSN#Q8k=40bq2SSW^7i|tD3>X zVBkv{m@-pG0c;sT2m!W*iQp5P5A(nWn+{4XJN@p#LD2kWRSRRV+~=rZop-H{4ED%4 z_bW7_5g2sEf=1cYGdzG8SR_whqu+6xPSW zeaT?|@bdA_tEam{XE|F`F+3wN!&SrZw7WlQj!r1`anKcVHWXtXiN|brEZbz#>r_=! zj-#GpP2n>8ieZ1z>x6Zc)4pRm1H|~;zPC?8`1#tm#$og|BYnDA=L8MJ1#no*!ew~X z$I(gA-sUTV#$j}>fuFklP(}0AfB_2e_crLjj1Yf5d;`SztELY2p5T6_?I1@-Ms{KI zx^KiRRK&4O0f<3ooRfp0nBxkUV@F-%6KgAHV?Scjvg@UaWE zggOU40mb+@$tj)GdF59?jL&VVMJGi^don&?zWTOMF-Lna4cFl2_KNzIpA3fnpB!Z(4if1j&5m*5^8Vt- zyt>jz%;0*+6fJuxJwyR9zN-uRIxtl8)`fvea|EVp5f0B*$#Mk7Y7q|4T6wh{nX9>L zTi7d)A?o0BGYE@y*;wj_1KWiT_a_d+b1jA)33Vq$~^n!_P#`=s!kcDx0TpFi0`t9dI5Xv>b-Ygt5ty-BTKX=0u5E-74 zeLX0W24j}1IA75{ZuazElv$4#O(Ek%31euc6d=>B@}nEQ=J7Dtc+cps{JLObte8Y^ zB8cM5O=7Sjl1*LSrI0WdlicL;njaoxy?7l(TsX_nI$)7tTdF*FyN(sr7H(0*MX8Vz4@;%;+Z6<~h#SAf-)T;Ig zEdk&LI&7(h>xlD~Gk|1D+vm3Wop(4nCfd%t-GQ-~#J1F}zPddoU9x#wY6Qx(Ypnbi z2%f^KioCTq$4VM&B`VK?F^yH>OPy0`DJo2MszYKnJr#xiW54r+1CwJP?LnrJu|0 znaNmt6zDz<6WqlU6P>ubMWI=A@~yFvJOft|l3+pZHHZ2RKf3hJe%nYvvjo??$LM6P zK7}XLSYf#B%Vo?SBs2cnzSKaG>C9hapT62V9(UbeLV}9mGYeKGK?Ma%wyc|YXE3C&leQ?c(? zQ9D%T{nEbIIB51;CwoYjJ{V3KPw2z<>Te-IMXbF=Dv_WRpJlmY5!6D#9;JX$O9fH- zi;4hai%}v4EkOjx%zvdlXwij;jm^&f^zh}hAD(l{nFbpOZRittOtxyt2CZF?3N7dO zlu06k#U$4Pk|$mAR|HkYvI~RAGHEJ#dh?bEcs=3Io z7?)|kGC$MGK!1YqnPN0y?bXLr$mU-8&;zfQqKob&A$?gY$yl<_G|VBNMpj~Q%BFHZ+i77kGX92mNns)q7Ux#@dRmT*DBln$DThO6 z0j}uxj#MycQGuFJ+m zlBL_!v#n>3f22d5$!@y*HWl-+eChrPZxok~AcB%kD$>ikbi#33e*Y|EWm&&Ywvine zj$X%%CkZ**OYfm6MwaonNf}?6iiKCKX@QkI^p}vN zVsS#MCM`*T%W_B|X zQ}S{XBK~KIMwvb5NR~c@&Qch!TT3zRO>jBlXrlD+j6VroWF%+u>N9MO$BY>;ur$WL zD{1fw-R4k-QD^V?lz-Kv3E%7O5yQTt;g^ znekkwKRs?d#(#uf|Bzuy=|!zi3n5XT^qMk}((I@Tf>AFjS-1L=NZgE*yXsvhE~7-) zk;<1yhf~5GoXNlHUf7%-?sDQneg&~%B+sG>WwGnFHyvdP*{hc)fxjb*|~$!;O9<1+^EVp6E7pA z91J6$KbTU({hn<5MqdA_2qb*XcK^JDSMQA~@L_wFI) z0{!;{9k<^Yj1KQTxW^sDhf1>Vc-Sn!HT~9L@VeXi3*Gvn{+h4g7Q|z>-x*-$H98M| z{$p^)J-gHvr<|Iwncb+}zNLjr%o{RN1_lZ&7a*8Hd>OoG4+KzEBt-cWJ)hG8Y^hSB zq*z!hcLIsXhH1@&^^&nh5n!cck@ze{ST|39f;k|aghDK*ZUj8b@OdEpv%$|@WcW_Y zkrCw)z@?NCQLrpGyq6IkjD=k-#sYoRgd3LuGxHVkz_S6y9T_*DF@6e&u-xN@0cFNp z;&GGELsh;gZT2{zUQLx&Kr_4Ukr-TY;6W)`j|IqpIiBe2d*ymzZp9l!SNduS7Uv74 z4D;;9_gkk(ld-bw14h!M8CV$j9vHigFlwNRuPM#)Jse6Tfd|X9zw&8yrJbUNj4&r3 zGZLbdghg7xhJ=~}Y(0Cp{f%gs8Gbsyta$l@Mq+|>@%7%$j?C%4VL*U<-y?-`CHy>Dm&Af~vBM*vMTG)h^l zv!%j|Ok@_za4j4dvsPfU2shnZBm#|b3HFSx;&2k|9xM~1HvO_EB6>5HE*wUZR0Rn$ z;cfRYl@v!yhVa=Fh0Rzaa!?6giOlptc@w;gme)Ws;T%_0Okz8L=`BtyCHhoQ3$(z2*s_)(5w^%6zqC z#IHESazP{k3zO8yvq5{>>+HaIim`V&8u7p@g($IP%Mro@XCZ#&l<2BOce;}Hn&E9b z%+iX9C|IDc-OHgsJw%k02=(veOIAg!$YZZsazvGIqa!zo=dD%U1+#(#sN zS<{eAxz3bWcGa<+qQB<&oNsjoW z%A6b;D8-T3;hT>m*f2d$bxy~VwqDHIlJKVPb`F6hKZoDQ;s&4(PH&zbr~&XX6RmPK zOas7}cR=S|M*O_6x6TKXhnJ?mL+;)&CP{!83$K)^=`2v33QTKcX z+W*5$+P4sly8>Ja_)CbKkt4wq*#lwhHH-bz2ywx|(n3a(gb1E-nBf`%JN2=y#@6XjFu?5jB-+uHlnev9DMC1)JiZp}kyfXG{9ZZ7Mp)zey(&wGY+rdcQ;J#={ z88c1!?R!wJ#bipU+;5#4{2EgPX~uD>7E=JuQG3G92yhZn!!)ug+TMxjDcc`YdzEC^!E?j&0*LE zG9m*RM5s+7GNEnbwCv8B^=oP2Htqv6t1Tvc0PHBFcr#W9Z84L5OF}dAucDV|7V>g{ zxE1vDlpz0kx>FNj3dJ9>cqt~9>x&3O&yz}o%2-v1084~Y(=m^RC8|XLIGox%#KbnG zrHr-02rn&A$inj6iQcDuzLYE(OQ{i7S{9#y<@hXm_gUw7Fgi&|^5fFlj^tojzKmpf zzWewMmN}jdl5II-$tOZgYbNGlneIji|2FMR?J(!tmW&0v2rMm*pkPVjno^HFg_l6N zIfSRMyqc06EK6*6*yi{?fUlh8*_{*<%N6&kooDa6SNRMqM_gAs10=3VMpZ1Yt|Ui= zEGOfV9<@YS1P9CVcToq}#WBuys!ILF(_EV2DWzixzltRMNu^V4mo@DFSek4JB9`h( z@8{!Y6&Gt*;A4$BQbS?OTaPPie)493KNzQ zKb&AuFczK8WFfmcVw?6)WF%L{6pde2D&r3ti3zTXuTuwcGXhE&Bj#a1raRA%KKo%- zRq>mG1TYM}&JR5Mfm!_ym@(^MfPjI~nCK!u_w3o`6H$tcDA!MUrYkq{P>TxU_JB=~_#>T51zcZpG= z0(p>3>6Di^zdpC}3>K5v)^;3TvM_IJQ$P%FTN{0w(%HPN&BtT1^T*0Df79*A%+wjH zy>eB^!(r?zbkbd4G4~9A?IM$q+*-_-raK5-{Ru>-JBJLk!v_6FwC0QjclDyiw-Aha z>sSRA9H`Weh_t0BgTzL0##CGYX|_^mW?w-jU5dkd)a@hro+wvNThlLVE&;^&=MDbG z!$$)ApE3+u3{EJFe2I~f4{$V?eVk078zg36-O!!L19{YUKHV4~#$Pif*hC^`9MuZc zpJPnoGB_+|VLd(R#Cy~^{zS~dNX&42xB zwv(2JA2mm#ZZMzB2(Qz*Hyn&^$|cxLUJKt+(G8vU4i4iFalM*!2{S^SL%g&UI`h6G zVR3GSuj2qwTcySmT`nVUMhKLY!=bYP*TVPI@`oVL2rdmllH?khiSLH*{1Nw|HgS2S zn*R#{GS;I)u%rNzfd#o5zWWptXThJbgd1Wc`4uqJ-UwgW)-72uFRK?YHj_uS9xHuW zwXTs%iC;$AUKX)NX5y%$xxVPToXhHH4xI(K9oDx#1`#Vhv_z;6o@ z1H}|;{Lo94w{l4(v0zMd(b9ARik!BUQr1fXV)!$O3qdnN_=3n`1HzzJak+>}ZP9q4 zuHlO(dKqgj7DH8n{p2Gu-?iY^L@tetnWY6u5gJHlyf7H!b}gjp4pS*-tn=Vi&EP@! zxOBqeY4^39AI^qrAsF`(NXML-6D zkg);50FuL^G0_@7w~ccK5l@D3<@Y5IgE7rDeoWC=Df}{J^lt`Umg z4y!67){HK0dvs!Oi;&cxl*e zy~fQ-+v*>=vy!o(XWrJ(5{Vhs%rme0`VYyG;V&dO92T>n99XYMusK|k@Q&x4&Z*uu z#SlPDaAo-VP#sL#Iv(Qx@nQCyYBms>CxORg>mFI+kaLbDD4`0@H(zEVy;ZOkUW}Zv z&&>#;P#zqYX$1)s#_E_p#e<0koZ)HNmo<%mVulODflAV_{bKupz|Yu6H?L}R4~DT< zJ?zM}&XHeZhWNsRnV zEzRqiDZpZqv%}E8gJ{-04Ff#Yal82I9F3>RRGQ!Dtd5Iv{23(mq#=bjj1l^=VFQsrz@h+C=7jNq|UfC zc1{q2cl=U)5Y>@kK@5b_Rtk=}KE{thn)wWOS8n`j2u8d(>I_HZ(7nXJLhOuI#P4dk zeISNkRZg&WsId_%88TXteqG^*NKA2c+-bpFpd*x3Kt}itV`!!nAk$q(Iw-Zhs8<|! z%qO9`j0{l@#ZV?ene>)>+@vx~@@5=4c0d7dh?}H-GaU4K?}1w4GW887?Bi16jMGXE zCMdH+W!jtW`F~Y?KUv_6Ts96T;0<7z*lSwIgqPOyB27zxGO1TuUCyPKHh^W~Yfe2( z`L7*0N@h${97v#JACoCR40GdV9D|j{lK>cPeSFmEz3DU_joX|1JNSF%tGx|?mOKJu zp6lkZ&3$rK`dGY=$uee<39=B8884b=W1fsPganVqVe|{*BdnP=)PIH9%ovOHt43iC zg`qzlBl*8v_4xMmsbS!0X$*$EHa?yV+xiY%IykozXMoG_Ni~R;JBi11m-Ukrfrkwz zy`$q#r8AZ$A}#^OM63ESwJ;HFPvwlvsu*6091>HkYYGaD$4#f$$&^dj86I|26d#Le z)*MZuax!KnNfraeBp2x+@{^vTG@{jJ_(}Y()s_W{;HiL1fmc8buT(^&^ldbG%WPBh zz9@kOW17#$>U@LAm#B`0bufaa^GIf-91?Jv`V<0|@Rd@$+I+84ICz%g3n9Kf%vsSgUY$O43BXt%NeY(cx_H^?%pY!YW)yyx zj74y`%zIn%9^tfXJJ}*L(r^i=1i1uf38bCc<%gW8z6ut%Qwf4oBymmWJxSsSSQ6P9 z-0!{si?;@c%e=BKUiG{0*qkLS#Nu_4AYe(PrJ@IQ_esdHxTT8VS&GZ!zxKM5&V#bp zuZ-0sM$r8shGVKr{NToP6donZahnXXq|s1Jae*mb4rV{EkisV%2ERHUBTNUYN|Vjb zxHamk9dzM5<#;y0&?QKLG1UrD>GR5uf&@W1vlgGjp)mLb0)L^TmkYTWa~FEmiq9Af ze2IQVCS`;X(p@A%H5n_=0^5UO_{#?V@n|#{nV1jXT;#MNUwlybP)wtAkKbPG{{;(g zq7bv{-k~r!t7wPf-UrennnOhl!|*Kojv6EvmEE8)_$uii*Fkp=PUr?P*>-Yf>b~-Q z941i8(LZ22OU|ojRgMS4@E?vRazS|Z4NG#H zHK)PHBo>M}R=_cBO(-83{t=BPXR@hZ=3;n2jDLGP-N$wk9rZ8~Y!loJnh15znG!fC z&FDVs;5ZMO`PV%DZETLoUYE0);z&YLjmJ#aJ*J)Ahc9;zBj&;lNgl?h=O;?VWz`&Bm!ZFjTW!gExiA1@E zlQY1kc?=k{Tn$)uNq?g0=PYqnQE5cxTb(pVYVUWqIa0^P{edf^lK6F{JpRB~DUv9# zU;z?^#UyK!P7k5Bv^uk^{t{ZtXbA3oU6>G#iE7AqIcbciLkj)CC7^G*BV4wO#4JBH zN8eAIL5ix3BO?mWaGrw9GF%ffJZZj;gSWCu47!-u!ZDjH@eWE(Nf$Oo&G8YoOQ8j! z>iJ8YLS`906D3xcy3vJU2uxQ=;DrPk^Rp72$GFUYSMdMT9Q85CA_X($Bn$R)Gq%J^ z=p$HWze;}VTV%IXNi;b^NW|RG(2(w zu!#CJT7srGXa(m17NOB-OtUsY85-JO-=n{U+A_A$)cd-*g-FbCk)G*J8oT&Msw-oT zXWq387KhQ#Pp}<;D7(h4JYbtKzvDMGxPxKnEBwHuOWAjNy+JU+&e-4gAq0<)$%NPZ zr}fGCM+12}C&SzKL1IdE9-mN?q#H+_)@wSnDB8iIqz;uyulhn_qP0H=3z`uq;$uVw zwV+HXYLix!!YmPs)+S>n32}rZQtP6GjLC#IeTCph9YPW+HfKCGeSz9&q*wvW)VGt= ziA)*KPu~;rp~~5V!_+BW>9dl&vt6C4T&l=3r@kFIwUdn*|WYg6QKTN{jYe zhsvb4{K_dWbIw$vs*OoxCSMceNNg;OR7RAf|9;f6Xx+^k#dZJDAEKU{<6TyjPa|@< zL``n>httW6eosb{En1Tfl}WGrC4Ac4@ATsKlQSWzDy9cpPK%4>1Gi%-v>KLag=wVf zd_I_T9^s-<(S#N?jRKgdMN`5Zae)uCXj9UNOeV(FWEmG7S1l-0iiV_jaGrJgQ=!;J zYt(~f+8ciR-EQ_fZGGBG@a8NiR5f59mx)Dh#d7U*7!`NX-s(`9^s--CJpnm$)W?7 za7#pQg#QLN7;%^~`~IT6(Szj@I=eG@O?xu?gZ*IQGK<{-hHRleXp)kw(tc>p7p1hI zOzCV61j2^XAuXrwFU1JuTlPai>%fzlz;EkQh$?RJTwxOpeH6oLVx}?SxC2L$% zu@;mmoq2ah6@~bLFg*DiGaJ zlXy&bLDON4I*9Gg*#6hAdL$Z!p|7jo_nWQP4dw9cOwrwg%z-(zMWQJb#}tDmNO5?t z^?KQ)0+dPbxRNRrka&;ZwK{RoOvbLS!wSlqfMx-1s+W#w8K~9R93V?$ zN!bR+(Wii!`m#@*AkFC>Rip-z>DC2Z>kKdH#sxsEMkSs3v~d7p+l^ z$Yesj>L==}f^bpwI#ee8crryMBSA9r$x;o$h%30lbAlKM+_kqIgm`2`v6z>2{}w=u zzvl3F)dNEKoZWQ|8&DW5X5muo;Ed@~N@0K)|C%WUzQ&QiPJ5%-f76shX^wvz7bO5> zzKhIv)Evs{&e=>z&?p>6XKf`aWWG8NYU7HLUVojalblIMTnGWjWnoSI*lFG06m4rh zO=%oP|A_Kz3)GD6793Pl5Da+TB<{vVkl3Jy6a4Ok5_k)WoR&mMzs>AH{rM~eWWqH= zsB&UQR2iXg`hDH~G?jy5l56@Qoj21Z6!d-D98WVWREWoPmqAA{gb(+zrPpjtb^<>- zXX8*KaIr!(X8M$wD9a%2d?3ytl>jlv(kB=bsLV_%RZ`J2-_xZ*O(e^nqn!|lD5eBt zzNVo^&^e=cToR4L=oc70EI>~5L;{>(7@O<*$!PF% zryq_)^VPM(3R%(v!F((Zi&?lusb7Mr;(RTNk(hyP*AIxzj0TwbY?p;%4z3XlI>+N5 z!y8!U)0M+w7A}b$+I(kczLHp|Bu6+vF2LcBja&{S^@x=2}SlEvF+AJe616x7!ebl1nvw}VvGx0d}Y^uBz7Q}B^^NmvhAoI~=goZTp^9~u` z{v3-Yv55>3nUVbp`@38No6oQCz(O9Hi?ny6HIw;xJg|`GWe02Q<8F8uVm=-ZjCr`1 zCaY+^UTUG3)d>^*}LSbYc-FJ}dR_@WwH@a&aM(6%X;rR&mA7fT1tiXKz z(???_o+I&Zc`DQH=kJ-3)@~_x$jIx;LENLd{#%PKWnK3Nilir{yJLqEN(|F7l z)*Eu3FR|VTjhVu7y`*@1!L?YqG#<0@Xtz7ZSzglx{rS3riLkL$A__3yNV-cfjLjn{ zeTlO|0)D=cl#!T$t^beB9@5Q31L=I$(gS0jb4HEbfha^q8hG=fuYZ7qxWQFd^Wg%7 zac@og-HAGL!^iq|afWLH>2QSn837FzNR_~TieQ;}-9D0J%vh(j0Fu$dG1C?MApMlc z6`bMOScsS_NEa;G^v<`?0@tEs|eUc0V@g+)^ zv6pCJLP7yr!8%2zFli)~z^XxG)?*yZZ#-)rc3aQzm#E2%twdW^1tSX_ATzbAQvE>4 zI!jqgSqYR0zm!5gAM`h{2Tyb4bg?t?QAxx^v6Cb$&|Ueu|7@s?jC;2v*eSC3dihko zi5(M_rukVYLq--NiIk8*fU_QMO-DUCwX5&{z~U8RX%by7BOF5jY5G!VX8%mQ@l zXHGTvgw-Nwe3s*;kV9P_l2AfUU#ynEM`rH3W!$j}GBW-Muvi72096{;L6*Uk-p^#45lBuoJ7*U70=EZf%s z2yYE;b`LQ`mI?R2mMUD##nOEmNJp6tQ_9M?EG$4uDa%J^3D}OXLN}VYJm<;oc1ntj zOG7iH2pL$CP#2U(EG5Nqbm6131Z>e+7bR-Q8Bw$`W1v)Jc;L*>_KaV9((JcRUg2CZ za;yX{RYoSYjH(C-SdOqJ=s42*s|g>SCHN{3{)gS&?MiF%?@Q^hNg9^v%Y;lDh`H`| z;2uyio?sXLPfHUiWMPSZlaR=4qNzk&sXF`5rAd`yV#$7$lC09={&{(FMLaCk7YV79 zqS6(Z<4K?1rXBrH$Z&*;%qoh`@W`RFV`X#MG#ZR9+9i|ioJ4&^LvIo3a9U`ZN@ zy746WsXI9`4UTU0lSd!hOKUq-j4bKzPM1_&VnV)!n2hbs2as)ifa6Qn?OFh#O-8+AV zSJiMCnVETh&F`e$!Hh%pK?zcw#$hvi*kfMxU-t)Z`zh@&r^f^YEQhscI9I1HTpcxD z(%= zWkz5CzbY6AhrvI8J3hpqf6zG6>r(nEu#NAxQg$uFv|6~yaqlbpp#+*p3N$uFVHMbL)|SWin8 zK|-?#H>}*aL4mHL|3UvN+IvRc9t$IiA7C=+*ZlOjOHm_xV|5==SjCWeoV{WmQrM#Q3Y`Yuq{iuSfrGzIdk6 zJL1SgC%A|`<7Si)O_#2kf{9Zbhkv>cUAz}^#%A)n zBytA|?=&9wI+Wa(at-j`LWGPdr31q)nFOYQtrp68Se!2$LP8u8O^B4S>*4@s6G?Hg zST%>@i>2lfYN<|0m9bIf@G_F+Vk{o$(fY zWucKD^ZGI288D%eQVy2pOD;$1$>%$fJeh;SEb2W8{tv^E(K1~`Vs5AsD$1N_1lLI-&qjT9A(-sD*mVv>UU-=HQ zZqS)us#YwT?F<&SS^@{pGF+vy4_l2^kM1{UJi_u&kccTGOj%-Zmx*DS^tyZjK^+}R zvn|S;v3w#?60{bWiLc04o-~m`OR#1vV@ikwt43u?n$>ukcm~EUg@Ov&j7ZK=p{OfKwZoeLC@ROUX3V!-mK08N(kU%GySg({a7!T zV6BRJ!1hMPnn~USi$pP?z9^^guvlM9u{H;-9Le%#G}V$-P_b}<&hW;6iO$M+SS%Ve zyt3KHb+wDul;>}FV2LUW@mY+Z>hu!fsR~*~)m2cjaO4bm#q!@ss4353_V5yFN>H#c z>pypg2Uv=0Y@htOJETQ9QAruc_!vO(@&|{;M63K$iY8f z-RAgp1B2Dx1b@h*kr^8d2Bl6fYgtNgS;@D=@2%-*1fN84i>8yYw{QxzfM)jfeVqSn zjz-Os#=&TCeAJP5SY+%sjwfxLIO9xCF&s0k&`;weOUANp%;KP!p@wnZWO^Al#shf! zbaGmyifim0;{q?C&H)p170wHR@U6}u135`1o7vVYKHu1fsHh>Y2sMX8X%fwL6X z>}&Q91l@=>o{{m?zFWdgkj(h0ec1ki1Zqev8%(7#Otl3lp|!ZoeZ#(C|Aeq5 z*WJT@6RBNI7sqvd>U^?jUKtBB45!671)GJqgxl}5Wl^rM;LMn^Nf$W4Vvf5ww?CQ; z2G}EMQEo-eM_)#%%5sWn!E{0G#}qb;aC5N#7gF`!UKc4L_HZw@nriLsi2_%+p9pvB zU=q~o+(RR7qW^b#+MJdGGxgdK#)Iq}b%#dltqh*bi1_38RdM-)1!J0Z@yiir8lq?! zvwQ}Kc@!EGT@9{#ZqV^M!Ij}pGlt^g59a=84ajsiykBXKt{Tt&R7N#sjDHLhG73y4 zz0FTUB>RB*P82o6qhqL2V#a0i&+HhFyE+hWWbQ|3AT0$Y2^nOHoTm*3n! z(17WW)vp_L63s4vI)48tG?loTKrepL-v@E%i48D=$R8hc>O;<J*PGl zjzx{UvN=%|4x@e$1W5eT>496R_5c({{HP!1Z=6$3g~OE&RK4t zu!JA|75VFy(PtG7qkb}?ZIqD&p3}-O6l0$mb+9TS?aZA0%OElGhoh;4{pb0b6~Qp( z8SRY;4bLg9L1N^O#*>b04Rf|wg~O<4Cb1(ir@RJ^^kn|Gxd5jHfI>mzl;Zc?a^Df`jJ)5g?b&?d?xj1UnHZM zq>vpLtLR+4t`dU}q#3Cgp{HYHWWNV#d)R9TMQ1FA|DgUqg!;cNH&0c#Rv{nM9|^pF zmRSSFR@v@*vi(sY%`4kqJj54EL3F8xKdirykQF0O zr2+>I^Mm@!rATRmfr=06I|6amI(gt}@JE3(Z=JmH5Pw<>7eh_QPe7xqd0g{vw*zvdG+MF36;hzbrDh z%pl05saO`7GaZ6VuHi0=%sB^wOm^aBk-1KN)%CuH&VLt%NMz(S^f1c%HWusaj)D96 zs`qZRv6Zp=>AhY}t-zV}Ot&AAW$d7*<}Oq$gU0CV9H~*Sw>!9=u_wo!j7nsHph)Ix zi^_zb;I_o5JQ-osW#wTw#=k!7wqEx-I>e)1Z}$5G>EcvgTO8C z>qZ@FZX-;+hbyC`aakUOD|-ifk2PUrGmm7J&r9HkUCdwHyGb`wYw;;(U-Q(ry)3qMS_r6-IYd4ZluD&g=e6GE$jS*1> zD=@{`zxsZ71V7_KFZF(4cj!A0kqw^UqGv?wT$oECS}qPCs@HK`JT$8rk=^`$P&D&3 zgEHMZKVGk=0**2UCk80tV^k)*#Lw63(GFHdoIbx@!X`GeJSrUfk*0HTDh0`<^3;gM z#r;8$5hCN}qEiay7G%!zlXbaNu{eiYv~V1-xMACI$l70=!`+JK zIOJS?aSm7Km*{LscLHV-G9$d3DLw((VFxiXp*kS1Ze(*Pc`#1Ez!j)^(8NzNamCwxvT}v2aw^k0biR2yr{-p4?V~2O&aAz30&v21ak3rQ3BU7ErHx) zTa>_cNlUQYR%`oWVF~1t%%UZ5ozD`;8T_IIuHRXL<#q?x=PZF-sa~`MuD@9VIT$WV z;5ypcWbnGvMm9E-n6Wiv?pmM$Mf}@i5b{RCz>GEi# z9a#pAE6s|EZYOsIR|LzpT(M`5Q!^uELAs}34y%Vw19;BLnxlYa$4a6YKyuuB0t_Pq z6ey%Nkn9;kZL#9GZ2-#SeKFxB=UCS)zDNXGLXOUaZS{pxgj#<-i1vap8n0Rn90;-r5+Esm_|Vwjnr{Y`U4` zr65^$w_%oD!LszqVH!EfSgftNDF&mAxVOIl2JXXzPTF554L z?o2$R%fWatbZ2cDUD}Ps(4CoObU7+5hVHE2ZN6(7uF6<>W$-C+a2cmHq+!a)aKlic z%g5hain^Ooeii))eieZ4?Oprl@Rllv)ADaqa!dxpy4wBxuaM=GI)Q1A7QL6M3pWA0 zn$U$@QCKRmYYZu3*{POF>}o$nEc@G1iCtBvh~>O~sl=|1*SU_--EjCHxfsN_n&F06 zfM6QQ-+QrTYy2I}SLueYrE|F<_KL@KfKZTwX0R`{jH0MYI2mg){SVP(k`z z@05lkL41;o2go?6UrC|>xdk|$V_Ns9%)8)xmkx0j=&eX5UulH{%{i zfZm#=GT>L{o`Ng;M#|cMnl*V zxbc(W_`7@e+Jn}(p}S{eFgm>V;ND?xFdk!FNqhPPQFkY*KDs{{JP=6#I1`e3oo(HR z|MD;YBCvix3zl6+I={DfFr|!OL4v9Wv!K;Agatjfw>Rz$CgT9}{!Ew(!9reX?jvsq z_FQTda8*+|wM6kNx?`eJ7)^z5A+iCdb**r@Qu0$iXakE~2?bkcSSHt5 zqnZ4$gWQVIT^bc5{AsifkO@B*rM17;REoFoYVe9wNZHJFi_9Wi6C$Xe!ywfPV{{s^ z#jBtT%eg2W;W6DgtZ?Y7bVMVqIF_0!k;QPZZ=2mol=EXoSc}21AMLjfv~Cjti5TDx>0keID4KDSpn585X*}^KAjOV*-MXkHeFi? z2E9b5J9?dWwM69Dj8bc$x&dMWoIWYH+!e_hQhF&d*5_4%qr)l23DHny8`nG#mK~Xy zMwknQiN|N_+zx|bFWawbw2?|zkPEphj`%0FVq}D~V!)W_lU8Di_03GfG9xhLxi-3c zJQmKT5{JRC=i8leYt$WvBfxA`=z%!k^d0Xr0y_`}UZs4~s5vsMZ@L|s9DTNS?U3pU zi7C#J8;(IM*ae?a*A|0eFSMtv*L7U(5CYFO9QY^<{ZXfRASaWv4O{AU20Pz*hm$gh z0tmXtY*puhFz^~2$xfeeYl+~AiYzaQ-e;leLA=D-18izUbvK)}wh%1&1sZ%)W8!R8 zr>4-sXt<`nEE{uYQ;LNOhukxi`aAI6XPl5}09ME)q(&c%YVGcuZq!a@8@?0}c6|&G z6P&e1)!&kuu^L0We1$=4B{Q6+~o1=Zqn7m6=78q*`7^Y2pBa0P*~Fj)Sp_N$uLll{7=h~-N3R||(gM{8Y}?6UneJ@1-rV76fKRBKKB)@`N7 z|Jgd5fr>}}4-bPZP!*XDQkufste6}4eZSeOsXTm88`ghn(V>Zo_4^dOLd1bnU}?m< zLS)LbN6qn3*mE6rx( zH41I)yCv(h`pduo&!$rg!SX^46hRj{6SH-EhrzHHIOk*cja=BBQ4Q3-u)0Pl5?VDn znf781XoJGgSH1RJ8y`(4QI^r!%#{aMw{T2$)~>1e_Hf4PB=yiTj|2_<@Hs&J#g~gn zW0tmc6}h7lMguUhom<1VZ*fIa%`PGO>X^-#8mPL3Vzr#<;mCGd9-*Gib1?u6_)%~F zWRVpf^|}KK)5*_f*TfOe%k&BU!ZF(Rk@k~?9hz+vBry03J{U`VhH|_I#%M;JY5)fO z3?@&=sPtkhmo3il)*no7u)m#X&1k;quXk!yt+DYzCIzW_dqRbCzIb zamF@IvmS4$<;rk?tRwga6J_f^`dw(YRUL;Gd!ws3fUg&-h-)ZQ+|5{_4yjH^te`7C z1$XBKO5@Qm8dF`+yA-tt|L_n0Ak4#TBa=p{D-?!4tH12ZfX3NoGZunDFa33j#P(CDH>PLjyr#y z(tU42L9^-JLRh)!P#^|V%Ag*_70)KOMxrAM8i^@B9{0L|(6j9e>-QP%68VT-^i$(Z z`+aD()?$F_28apH(JfM)DEwx&vDINP>?*b|rU*;2Rp1Lgqox&7-6Ao?iVEpL6B*zR zZFz>N;(CC@x&YzSEe^wxPn$jfX%3B!c`b7?_~tO(*Z|x z9yq_0bzW}p&$bd_!Ri)_iLP+4#d0=e7%jCSbLCBUG{N`*cM^XM`cc1~%}X$7X#5V1 zOSQ^W<~~``jArY>Ov6Y_vGQ{VYXAo|Jw^(G*?KT=>Vt#2!7=dD0=BLF9jvj|PW29^NVJLy`^I@U=v7VNVH9Vm0RRlj zx}?CZnaGY||k zHcwzLz;v76p>>2VV5V47K)=VXqqHagRvv`K1)Yw1__Hx0Cwe@QLZsk}8q4*FxKZy% zKWOHfk&`66Vo+$V}b;Z=ysM(+kfs{x?%3{eF57 zyWDKQX=2LNMgr^o>EU7MR#%Mry3y0!-i9YeDsDYAU)DAiJchNM=};w5LD4QFlLih% z(pIopxskoQBAnawIP*SVjFiADK6_|MxLwz<4}l@J_Cu#Rq&AMrP;pu%SHrf=&`YN1 z>iy!2?HG z2%-vW?1;wLy6<)N#*^cTWn!@6^M@vnIW}h%K6$$}JJ(d?E3maCt+k@0+*&82fvGcr zQmp9)N_F;V+U>O+RR5tUYE#GsKcgFHx!Nt=h6NRt)ROVtFvdd3$lU zX?&pR_FKIvVqZn&Rk(Ob5(`qSY-v1rsXg7q&rxCE24aKCUj(RFE-j%TgyJIH#t}R> z9rz4gT_AY92O-OF>JY7Da`n#`#aCv;`+aQ}lS=J#zwF@1J1s}mHfSYGsqYFgqb;ko zvD8HZ6*~yYB8FJSjer)0Q(sqra;uilZ^)9*+8iB9u@*48mXC+D21G4Ztj%L-Y=Ujx z-uNE$gtwih9TbMR?X8;S)aC?Qr4<2LrdgYdMkqd3RY=vZ;BO@W?fI> zRa*`Z4Q?IEL6ftGkG5(*>O@U6e1iBEVko=tl}9J0nPLeJry=1#2_Y&HARP_fP6qdS z12rNW`cll|EA2O1Rul1yc09%^qG5(y=bEF|5h7Oe*UsFyV_sxg7^nDbvx$I*4HdAV zVz0GMED>n0TH3ldj`-D4G19XH6wTD_1@t~%arGgS2E)|_?5<$78L6~_f}h&L@FFuh zgyPrR8q4n5XoIm&;|2{NZ<;;0;M5S-0iecfY=9%a39GuI0aPr_=?1{BYa#qg2`}59 zMjbliA4XMVXw)L8Gt>MD=8f^#qlhncuTUJ<7vov|jj?3%sB?n5%WLD4aRa}S#*~jzG8G>wb|4ix>6LI#o`J%@0=sio+_-`DP@8yrxq5AYY)r(u5;?RXRY0l zSvV@zt{rE(zHqJSBaWNws$#a0;IbWM(YIlju`1SKn@J_{@GyRP2b*hK6xRt8 zWk!GXu-?#-)D_)R51cd#!>=;kUf>ir6s4Jl)ppb_4^G@G&NWqFEWlDmVVWWcg;%s} z?m7Iv$LymOmZ0|75Wq5^3qvh@y4ywI^AQPI_*dmi9Io2qnbc_%Sc&l-saYv(XHW|I ztVC43yC((RS*D;&Q2aJ6rfpPa$5KgqQ%Tz$&}9kZ4khR8k7?d7<^0!jIYqSsr`>tu z)ocp5sBI9JUZhl9$`!%gRG35J*w0W2rVq~3`)qUSxH=0_SVx`q6f69q*=4M0aXDl8 zO7M%X;nHK{04u8IAf|QK`j8bC$clmnst?&y`LQO8)L6aVJ{E+8kk9j#sB}T9kgAl} z#our0>&De0NozX7END`rXY|lYLhNA?xHJ0t?`U+@xeu&}Tq+@BMuuTl`bb z9cb&)9gqaBB0G>13vO{9*(Fq@z%Euc_2-)Af)p3LQiux5a80~dgZjZbR&jNcE`b{i zbsI6y3e~H|heJC9dE#>h8&J}GJz%()lojQ%>hn*D3WdJHlDh|`8Oq3@Cm@tDkvj09 z;Y7VbUO74@QB&VL>vMx~^df(KpUyCa(~=oFOJsFI+~O;}s9$3yH>i*S8o?0tPDn{Q zeF}Op(x3GPbsUiB={6eKn~G5|G}@~4vAs!B6nB0g=Gsrh>{*)eV9?iw=B`zqFCv=& z(VR2(OBgJ+H$prMUwmfGjxVUS;-o}4|8OUuM4Gt=TR0WIYN)oTRt;S7$y2=|KwQ@B z9#4A{IHD#wlU~yv)VdQ18eXAM6xz+hzUyFoQ;uPZE+hXv5Sv4 zFdTUf5|lse^hpzSs#*9AaAOBBxbwD;s4`06i|gB(w?@2}zc4QpW4$4aQ4`EEj_YHy z4dTycX7Dy_$Ko|~)9xbtVr|<{)|e9VXkVCAH5yC?IGrn$lX2l3w{w198bkgTD^A;n zK-G}7e%O)4QXwu49K-x|WDros4YSqkA$al6FAW`N%A~Li#dRl*GM!8f$u3&SFmecuV%ZUXms*dl*gdg2QEwZKNF>aY)EBG^Vq3%N^KrdP*U8gSnILkq z!cVDMc?}_pD_f4B_Vsf*hN`@i6~*3D2@-+??G@F38nwkM&OT*m6!l{wlYU3Vvid0` z*!BAOp~BNjoQyE<869>ew5%x?xhnRX9Z6!#3rQ>mCT~Nb%5WB8e~N`k9mXb_YDKzJ z$3|Yazey1S7I!wLW0bD@Gp+1dzMA1fk+0e>DKJCFD@ff|3>Nl{MEsK##Xba8Uwz15 z<50V0gBaJW7~^_>oQzJ%Sm=6p+-r=R?-0aEi4M5$7$pnf;#1l^veJy7@960213FX< zc`keMaF~m4)H3FHrwGHSdLPS4BIQ_ZPPN_V$9*9(tjKuUZ%&OO0;FQ~;j2Am%U|fY zT5U$A^|vE*wqzAl#ICT}l7tcpF_f?N)K?rzNR;QA(?h)>E873O(Qpk?h(#RQ|!&h)u1UOrh7@JcARNQ%_a|^JI(oZJUUooU`i-yq} z4O zB+fYs4Ohf_G98XNsc<)+kYI{$4bhG{OKSoe|G)qDmm1|w9{*nb(;SVOC%?yj?eSoA zqH>5j&65MDVwGpK)VeHEAcIs~HBxQTBHIoVfb%@wYVXluW~uQC+vPX1PD^E#@jM8^ zQ-`B5Sg(PVi~#M#X$ml2#1luIcgj1GoE2t_)vn*QWpp^j$IszyDT|B-Ob5E=b({6u zOd*ii?^;1{A*Smn8RFk$8FB`=py~Kf#aEBIledtcL)a1UP0{jna0~kxx-pSq_yi)* zbE4f=4Cj8O;Q*Kl6tulXBNew$U6dWyKnHf=!hWyWe~pY0;i1l~sR1%pcd-e&huZ*p zC*v+tdyvJ2NA#(t2~fnV``A|L*Y|Y?tNi@!*P8B>=whXifX0A!eEFPv8|7 zcLDFWKXh^GacW=_t**l5sA_c@2>pvIoCuYT{>1cZ!BTMoqJ%~F+h1TcO%HxykIB?% z#D(kidt^NOeGPR_wRzUi%2r)rv#ZRerlg=(W|xlC1tJ@mnUQZi{!qS-uS59gMbmpc z2!vK>O25iJ#v!Jr3`eS{ELWU(l|ch(!=V0l6CG0BmHpA+EnE|XZP95Eq!Z3xA>!J5 z+rgPDgs<{ib5rFD_2{e|$YqVxFwT&=~|E{^oM>IV4yoB1P!(|S`=|r96!(8zg z5i@WoXU;s6G#0w3=*`|)P;)fjK@>O0 zDq>*);rJUhI?7`54QM-Mjxq?Q3jf&7x9=$iH}Phi;;y12MQ>=%-~A5buSu(~Z1NR; zwT_GmI3kNoxUzv)xLc0jyvV&vpUChLi?1ssA#e95LymTM!wRJ{O%M_mP2LH`RE)xE zW9uHh5l9rkQH`6^Bl_4qRl|8jt{hLnS218XMcBVQVhsgHo4FqHnWCEWJr(PO(j3WE zo(fiX?u#Uz&_~B=psfqMy_@@swIUR&E}OyQ*G>V@5W999XvstIFnGz174? zJ)hg5VVopha{OT0aX!SH>4QzxU#m>PvdLvk{B5Loz)Ih%!I?>)n5_P)vBPeF6lW;a zvVo}Gif*Ru23ixn=J8n^-Hc2bX+eUT(Hc$s)r_C*i|-9o6w#O|e%lc8M+Spl@m1|1 zEh+dT0& z89V~5xQp0{{)DdBpyZq+$GG;yu|d%*RN}Ect>bICqVsU`P4U~%`_D8VS!?=B)uuN` zr)s{a*tu4G@(Rb+Rk5e?F@qE!3g!-`c&;Kl%7>ZVQ8K$jboO{z3l;T}p&H1p^ z+!sIbLht{_a6$7Yisi|Y8I*WF(zCn=QsZu@XP`}n&CdL50H^>uE zG1GLkpy;^N>Ts$4HE-qy@$+HErTbu1=RCOTS9mNx7A^1;`3 zms>g+}|@fR>aWzyu5pJx1vNFy#}LT-l#IQ z*is|Q^n?5S?Jvc@>c{!1XZq>ykV=O(R4HtdhUE7p)bPR^UL8b&{h;7fd8Qz6_^z)Uyyy9*GFAgIRnh5cZI`-?2II z6;WZ0jVG($^(ie-ab5Ght397WS0bv2`o7AUBJ`fsE%;48+X{b&of+b!WGrsOMrl}; zlD@~ad|_&*it6UhF`14gJ!^Y4gFz}*9i_%LHpg8+C2dYc+|VhV-`;42C8)o{iY1*f zAFCj8x~B@!G~>=hXaBL6@^-Z!0Dbr2#|0s{6%GzpuYQZ`*I-c1>OZ+5xg?@cwEhV> zjwVO4m46Mc+Cj8@uAi{S)tUW^1PZc}KFx$sb}i-X2j0PHodmHVU_6H7nKsRO}G z&jLcfH}DHKfhLPCQ*o@a@{l=lx(r)&CSp|{vQ+go^Ae(84k%3omKxx=igsSH+{g;& zlOSoZV)dBRlZvU0 zo#5SXn4MV(Q(W7niMf^t(0uPW3Qpq+T)nAmlNGktjc{?$g~ckaGa*5{k(^Y0ou1M= zb#$m6hsIT6a8cHZg+!zkww`H|3}N&sz@c+#kU*wXL9p# z#%HQpCEt=lifW?f)Uuu2#U>8{%2LST#%hKurZO0s(RL6N^BQVy^3b;yp?)FWj2uyjI)(P>743Wll% zue+A%r)IcS=3CLiGTe20FxsZca!|#2OQtFlezRdomZ@Tr z>jsTzlnfC|N(faVYchHjpk!TE6jIND@CLuk4cdb$F2A&U#40nh>AB}x!`>7Vw5epP zuy5YVf;=zekcwNpGyK>FE8$lA+Q#pGr>%v$77&AhGFPH5D~PpiYngXV86^^u%+hs% zSj4cze0_;GB0eA?R`hlOgcuEjgDVw-AqDB^T+J#Jg+3ZVOqh;FgMsI;otN9s`1Uu| zx-MGYa7?N22G~%FF@+fk2kQw;D94jEONW_77n2g9?Fx_Y^pY}Qaocj67%&xPg6&S@ z?Okh)2DG<>6%QEDWRzOPe6T{06e{+NJT__ya#TOl8l4O$a;}gOU8CRPx>g975Gg2J zdNDl0i7fww&c)XF4FzQBiHh&xWXu8at|9V4O6EU!#OylB9y}|L1u4#&u~s$LOH`19 zVLK10qs8#y5IEh93;de9MF*CT}DDmF?h6qf+SmaSoOt(^wY zo1Pq^V+t`ULIF+@Lt?^Tf)t|5kq}>&389QH&C2EK!uDKdfwUsT@z4>W8w&P&H5J$7 zknusOjFiB-K6s1JT@^|}*=n1KIIHH8gsz|~{xK?rP9~|=w;-aK2U0@YraM`2gNvrk zr}ckD6R243s%iouBo?pKS1yGFH2}6DMv&x%0rT0A5D{y7n%{DOe%(A(Qga!Lo*F=y z3J{x#2^WcZw6JV{d0f$343HxHp6LP<-2&ao#<_UJ6~@e4<%vniYpWnH8E~ zbAZ*+4)WrcSf%;QL5x|f!(|{IX_G!>^_Zw}okdJlo6t;!yIIjBd9e3Uiz^&7s1t^1 zF6iT~6QvD@rax)+%KCT4G(A;M*d$B<7uO*W{}6On+j`s+o=kO_G-=M(QwCin7n>1^ z$k+SJ2`f0C8Hpf^wJpoyPG~!zQbHwapPZ}M<92D8#7eiDr3ph@>MLfRMaaAfvtvZ_G3|3S4_LYmiBa%I;2|> zLtVip;EIbc6}lUi|IVWBcm-=87UUf9z95aW7+p)OlXl#0@9g%mQ+~u0j^hA)w+Af{J_gNqTw+LDuL`3;g9iSMqSbwE? zqytnl{lwmlKJNZZ%OmN&@_eoiUyfbe`Vn5JIxV7jgFdr{Fcma|63yf^2=%_{xFJ?? zjy*B8xNy;s#Y@cpR92Cz=aG-*R!G8}D<9#={GQsysXpz%+NMp(G@*ueYNM{&}iz(ILJ z=NUHN^!)~RA6@ChE>MeAVyCZ6!D-MrM~|uM608-QsiigTkj&bXhGi1vrwfvbUdwHn zFx88$Od7{fkUOQi>Wzv!zj}31FVa6g*JUdc{elY> zCrzQ>jIbC+2=wdligo+9Pwi@!e*SsTUslapxMGd}^m$iV;Q9oKmk;C~bH-9IzaExX zgB6!FYLYQ!=PIgHM~tNT7%JU_F6(>S5Wqhj;`+Z)cPJwYDz=^6M!tGmzii6dLA)a( z0zJ^;Q*|laA&shZ5J&xpTmBRytkGE|NEllCpxn3T?lWwgsC^4i+{Sk*^%#Y7ngLa_ z<2EXAt?{EYt;Wek>9%C-hen(hh$qYImI6zlh~sTbjtWa&S}u4l2B}!*(jXewe1~GK z;(THE80*q1P~n}d$c$0ayv|i9v5HlAeKcqArw5kNyecfhyo`*6kx`e&XS`s3ts|#} zV9Ob{G@L9S;S?8`>B+-?qXx3VEJ#@ww2q9LGcQXXjZ|EHg0)x`(WI6YDd(XcDy=Hv zhjzo0Li4JUv5HUN#VS-3?m8C^F>HF*iChBNJ~M``WGMs4;GBak;~0xs%^(ZIyk%sp z;*%YN>URacW5}N`&&$ME#Z}zSr;gUC8;kjC(893jUSszZecqfQBh^GLSaJ2=rd>n` zs0i`eE?=f@h_Tf|Ic4i_5t<-tGo#J^46|b!tVCjy_F;JGb%mjH?kMd5Q9JXG&8h3I zuk!Lvn2z8ses1D6KQ&WB5ONT=>T5J(&xQsN6N_v^gR2RO+nZW|viR6b=KVb#ag%F? z^fVMXxskbwRjmtZaEhBYSc-H)I;feSP{kOj=`L`r{r5X>6Z>fuixIHeIuZOmysA9) zJ#JH0kPsRXU53w#y;P3mM)7?l>LJ?%Qu zFo?odjJWn>k4@d+YW-iElvolSKS6Mc_WKEr3uHmO;&5eQMOBSf#g89@CAS`)gj zXlSmsF(2^Pd~`8G)Z*$EDAZ`C<)R0a7^oBNojW#W~9m5umaVG=Ch2Z8aJSTKtvC_ykO}}W) zZI@vdwV#e)!?wnd!egb)2+gW8tU(j%MrjH;5n@zmg2nJ&NdEYP-m4tW*FW z?F~lU^j1g36qGq}G!0?EmQFwwx9$P`9(`Ba#($^=Ubu8MAJN*fC}WlhkB+e^7#L8X zq2Ew4eRNWFW?dUld|#*Q9%Rd^FlV-G;?e-3F*yG}ZExBg*NvnJ_jK7>xrh=aO7eDH ztE<~7S(_L2+cQVjV(V>DVu@6_W_xv#WRl7f$;{3qCDEVy2jJW5IcMhY)i0SRA`k%L zUL<&xQu%|$%)IxB01yZS0uceXln^6myJf+Hxe0V+-4&wXdoqE*oWUpGvZVXwH~U+- zj42;J-bPyRI$Ej(EtZ?R$LMJRqd8A7*R~dtLT}gUDO4brv~R(`0G){G!dE<{>Zsrb z*YRsm#19D?f~j!`%=>8y6zU;t*At>-6aO-a(6P<_==qjCfB5QXPsP9|!{O}?-d4LB z-8kCV9cFcGi*BU5{qVXDn}Nc~Hd#=NFBPtc{S&liA&|<>wL)%}_8&|~Oj)JmG2HRT zz1L(I67&o~YnH5;$^`+8<|!rNP`p+o5wP5E?j_KYr=49r&!#M3bn7KL3#X;&n^*bG zCL!9>VK%vTFOJ zVBG}XF+Qk(zlj3y(1dl;0hNm!FoEj#)fzADxDH^OtCmAw>IgNZq#&;0wYrE%iv-Jk zd2h0OR9`&mZFg~jypL+(kf_fCE(SvfPaRdtW3 zV|srapi>^jQnN!?xXv_Sv}8}=-Pwe*RdyVEizOLH$b^yMf+H*PQ4%Ho4K2UJ_x}Wm zqZQ$v(xtAs7~ndxr_^=Wu=BXhsFm2MVdLVsY8A!xP_87&sK$z-l1+xC;ou1M$1+@; zTa4&F4UOk(_i$P1Mn%8$_rm--wTX%*IJNDg0C%cZ3PTcCf=P~w2#G6;v9|HSHH*O+ zB1g`RZ0YI3W~E8gtCKojR9}OQj-1-zjDv2swhb(tndnOD&-~BLU0Ht1gr%LP2YnBD9Fi@fd-FCLr!U^!QpbZ9xh1*fyxPvBQLO zOEsdolRT;odUB*v-;Pa7FQU1Va-2fQn8|0geXyIbmEmjRQ~7OklALQ`0tfd;#0JUv zKvG^b^QEv9sW@ea(SHf_dxMQNNJ_fbI$xtmSt2+bOWRq{6m95wM0eg(r(_dIuv++N zb)5%0g&`gN zAmSm)%xbV{MLdCX7udUThbt%F*YG*18h=TJuc!6RvPYH$Gq5OtO;i*yf~)0k|M7pu z{+55J(54B_5IE|Ar|t?W8b(ZswUkvQdNNj1B}@uvCe>h6E%)|c3=l$t{y^vBS=>LL^_R8i{3hWP4CXFA zrfVe@DewtBLxmJZG6IiVJAp-l<4@P9YDIW&T_#fOF5wJravf&Ht3_T( zgX{!YcL~i6XO2>5G&$5@b+(78p5fz3+26vq78@-7Z%Pb}7gV-E4l>*`YIp-r(9L&(gjWXJutj?#-j;vlS5t@{YNZxd z>K4h_q~3Z2bR_}x?GfZGmE8LMzpnkmfBFad&wZ9)DT557x-(sC|HtIBiF7)&XVOq| z=k7~0*3iaunx0R2%%^!ieQ%sa{Cd7;$_2R%Np3JEX1cbh6xMPWQwr`hxg|lbf~%hv zu8W2jx~1MfZkT!Y-a3U8Z6M)3U%^M(>T=ofJy=NVI|Fe_C>!AMQp)4MQ+462iY=T{ zzNJiA8gBMav`I?k=v>MXu4-$jk;01i8s5P%j-0Muzw%9U&MBDt?AZ|Kut?5@CPqp8 z+tvL!XOr$bt)bN7EQ;U0 z;&++eKB*zPdHw?PR_^s))DyhRw+xBmu#8sO}7h zsPQd^4hHc|fI<0F)F!lD-NI)oZ`F8EEO!&7)sjHt*C^|c6Kg4*DW(%yLWo3VHaxo| zT#JD(1dCXvf-{Fwp=Of-DpgSKf>_hI(4vI|C zy1{~RHaykA)rBJp>ogKlFqd_0<7@j=7PS!(EfSaEfTNk-puS&%WlU9PuwxkPfO>Xy zZK+@y8<`~^S%$Fya0z0nAMY|Ya*V_eX4*)g_AZtgyPQTctL zS2sxM8I0=$9Ohz-Aa4Pbt8;v%$wIf=)Eh!c*~8L$csQjvbowc_etQ=GQ$*&$D~PkSet9 zC{hYX;S(AxAOz5~Mb18xm<61~@b|6PCLO=wA*1L3!osTqq9%+~oTobvpvyE_MHeW{ z2YQRumnGjqhi1roAgoH9T*n{D69U2Y*K^H!iZX>vU$@YdIg%d9UI@cfn0!`s6^31Zwc16E(1KIdDJN z!hM5~gmpR+^ot@G;JYMEXSdS5SxSOs8YW+%VNe#s(RhD%-!`kDa$~b3J|fL!j$k~T zzKv1YbNkK(Yq%5EJk!!bJV|%~izM8mF+C!DOfcbP(}!$$G6c%MoYNNtQ#!minLJM| zjHCPjl|_3$NQQHBTi^zbw_oEOR`Oy>M30`AFA zFOYFLzyVMfWd=a`zxV%V_0RuW{rA89$Nxs}?jj8He^#R|D#&7rCUp*9zra}$O;gR6 zsyNJ%Pg+h=+nVa)`eY9qHGp3b@r&=n!Ob@}Ru8CZG5Tufu(~sT2@&|y0Yd%MxZ=Uz zMG1!fCibwL6OPI{w1}84oM!OzsO}32zT6yC4=cXo3H?yjpM-dh_qju6rE)~>9H*eN z)I5SOb~N0$f?5=4zjhFn+)z9>`+&<&_>*;3lT6X?k|}>NJv%B)N2Qs*o{&rck-0V= za<8^PnS|1Hw!&%QJ%?u;^(KE8p!dIKG zjc5?vX=3n4Id>=dTTFirf|`y-VR_Up%GILG;^H2NNIrFPoZ`ouHhIAn8W*IAHhBW- zP7&p3htKnGVKnSA*dmT){DN}2{EP!~99WoaNaLa$mjT=p(w zd*bf?-mCs-ut$bLr4_xo!;gW*x;azmYaP}wefM{Fe&ZqB9Jm2iI#GdWQ_Y0PVpe<)TGlE59+dcb4IrGB5>C8+LqcNzYG zGfkwM#`&7g3rJQ$ft;Vi1;BRL3Jw63kk`HLOQ=2VsyZ63`|%WvykK_X$(=*f1FiPu zIR~tQNinB}2NrsjH`CAIzQbX@ZDPTjbwHsSS4|j{Md|I_6r9wFu6`Y{(7^V|o)Svw;%pTK$1y^V6z^r%xNJImW(O*N8azUmj=^Bct ztLOI?BvPA!-6TRnecwq5`2>t_yTZN`={|t~$j*AQv8TMQ- zaJ!@;DbVg!FR3n%K47}wWKKBI^A^+Lg{hIW9&;pZeL%w0V4kq=lM^56?^8mK76?PC zg-tKp_LLN(xLvJ$0~4Wg*ikdV18%!U0O4Tdp- z*9wnaB0in zzcT|`aHj@MbFhvuXUc|C;_ADq1497>q80T0X50)AOUJfwt>jnV8Tu_sSB-RcC2wnY zen9sf8?3@;aaB{4zq(tT@K$)-j>eBtnrfXZ69U;8gld@nsYNrAbyZW?P z@g@-%hiYag8JzYVhWUbAsEp^Z8Ath+&Vi`>41a9T;!oK*5lo2){|!Iyl>9S}LeF#8 z?DlryZkZ;UEZ0E^nv#*>9l^@6frL{IuK+3d32sBZ_uEVXe}$_mFcM9IsR8d>>wa2b zz$mbE2OmTjiJY=K1W3WTI~tMZ1rsJJ!R(&IcM`mv5B#6?>ey#g3bMMW;FI%vIu9Ea z1aTj*+?hZ(+03c)Cs(9I#?SMI1{%gX>N{3^cHA@wAk~nUrE- z536b=jgwOP@ZH(l<(9%Pu!}nz+kL;6H_a>T)s-0Dv@PTN=M%gd-P53}m-`x81;Lkr zgaL(PqJ3SL6Bxe2SV7ap1)?*;`PzgEp^qn@rD^N5E&|uCR@*d8=o&VO5`Sf)t&eRT zP#T_vLVN|cLwWSo6grtBAR-~Bgt+> zK1AIkt=buk$EZ7PT2rL=6^wo33X-n$R6LG5;c4+IH2f>7URu&Z31NUg~K+tDfNc@%$06+Hv zgNv+^r2qH!@K`s52FkUuAvg=t$0!*mQK*z7-(BP;~d$M5IXipNv6~XYsn8CF9 z7fZBe$~@|H4-kH+6F4Q^W=R^M`t|x1_JiT36}}K;614mH$F;Q;E;xDzBr}TQJiqG0 zbG#Q0XGbYdEj)NR_fsC&eMB7j%ZJ42XN}H_{N83Cm+heX>!f~qOizt(U%iU5L*pw$ zj(NK>7;Rs@aaD(CB2PJN_X)9ekEu@RsgId4jx(gYGo*M|*juI@)*_>SB6E}Q-DP5s zFfilDGw0_fL5Z!5_?*)iv(PH{@wi^l?<|D_*HzeRf zBS!M+Qo6uw3=vWWZ}nzpciYNtVL3RG2LtMsh=CPPXL;MKwx2hckO1T1sE^z`5@Iu< zexk>x6yB7n1`+q$8k0X^U0xw3NT$9E3Dprc5yUy;`nm6+h^(jx*xcKHFtw;%}9kZKXO#H6CyHBfGWMu08mgE1mw z2p*H=0=VrC&0Q3#06GzPcI#LtbY4L1XZ!Ao%8s&TKy;% zGl{RwVak+U7D_1xtT~WMg1nt^{z$CFtj%^s1Jo^2M?CekQYLr;j8*Wn1M&_Npb0FT ztY#$tgZ{N|?fqAU&6J8ey(4nYZ__kv2QO48tI<+Rvzv=m8cB?i_!g`lJXCvPo%oG)eWbg4tSOLu(m5(K_R4$b|2 zc%Gs>;Os{J4sE<~YvV>5_?&X~Z1P-FU9xw8Y94CzwItzwANT_=lGqY>sl`~IAqs7ln6n%tKvZw&hbsvl{$8yoy64v_910YC^g5xN|I2;R?S~TW91G;`0$KZ+g6yEX&(zBR!IYiptNG{|@9n z#y2CBhuQ3mU-VGXgccuI7VEe+a^L!YTNtnK_4QC|lA`L1u}3IC`UIch%6{rKGo38a3BW(*c$b6g89PU5v&A(w(M5E+v3@Ge>7Q{b+}$ ztuKWA*3W-xDDICB4eXc5<>TA~HufbMW-T5HEr!>jvqSWL%1U7+5>~K)A>?1X-!~~m za~A?jv@qOFQvyIA#TGi_!NF)Fzs+mmAj%6u2G^Z?NaR+TS~^oM_4g=f8udpc@30es zA&e*#5@l250`euFk}G9mlb5tB z^!Y(&i!Uchg`&mwzsQ4P5+kuVclAANvTzg1MP-DNxVdt$-+-GTY2gLPa?${G*U$~4 z0S_37DXP%zbk`{vkdtv?NaLD0&xpS)g%(@PVi{u*VZ&Qti7$$ahjJI5qS9=?_lnq& z@7P%+n;Ip%j|<=p)xsiQrpid}JZ+@03+ateBL)8_HrdtFxQ}xakTF5O_t=3wCM%wWD@Z@oICp?%7Cb>N(mGi_X~lz zM|!(U;7a5zAWlZWfd5VeQW^>-PSMxs_Ij11!p3qEVF7V7YE6I|Ux*)vepv2r!1Nky zQJ%P`SE1~NSK8DmWDO!d1gm1V2^C4FiBD2 zk6doMRz(!npIA!|un1S)gcTV!s{zbi@jXuTWg`gFfXqEll9-~mtF7*CALRdEB}7b?`1hD zOppR61`dZPv4512XAg-!+b2Zd-&)@gg~FEoXi-Q(-Mk;i=l4JwVd%ulE8 zEbf;P-yJBXTiOMMnFvb^)n2Gmlb0hK$(J~VA^P$S^~7Btc+Sp}duu2fA!UJ9`4nQU z%S*@!@++Vgxm~mi-4T8A6Hb~H&z*r4MbPG$848jzsBrl5%5L8aj=V^6VyUVW6-Qo? z2DBsGizJ2I($OBW`_is2xOJmzhC(znD3&P^3Qc_Zp+aQe{$OLUBfGTKgCQN@`H6=| z#A}n4yTY=dU zXm3h3C`ECYQElOkruU`64W!cHh|on6!SJxNPp1R#NH;~&*weX}_L_-QrL|~TdNW83 z$<6&6L#NvMf)8Em4EA;opX10Bu00I4X;(pbZQfRjh3&CoY0FN8FuAl%1u=;eKEM12 zJa^*Xk_f!Hm#AuckUvg*+a9z?=t2G>?ZIO^-QD%guIaJql$Zx{#~(2wtH|T>rB%g+ zM#L^_sA5Gj_$PL>7F0SWEesWXPiB#Rf}_S8f?8v$TBVDFkc&V{64a1=j|6PfTZM%> zvmXf%?xR3TK>519#Ak$&q0N|~RoE1&QrgD~h$(Pof8Q566c{XI7#ITNrY!9Aw!0gL zbpEp6p@0xOM1?(;(xEr$Mc;!BI6D7Bwj){BgB_%D;!!N1ayim5zSzK$EOeui3^^PW zVB;a&+@rxZ0zkJVgN++^+|M`Db%iEHsmo7Pg>z>f_1?hb*nwB4yK^{(i2mvlRDv48>Tp$VgEQ6WeaPZ`OeYv-x_ z3pzg=T2io1q9XtmQVxc)zt_fEM0fd-(10bq39sPh0mRGutk^J97KS*-M(VJgGzE`w z3myWbyP!basuR()G0I;@xU8MRWM4nP-;a9Sv4DB+`^;5HY{^Mrj(A+^X-@UNmK|z)+cy& zl8q0-Cj9wzcW9IH z3ad+f%mu-#JKre@s$0^vTux-oPV}=H8&ouni~yh7W>w>}qx~ix4p#|~L6YUELBgFC z0fmhg>0+F+yiu6}WMZKr$6t-?yhq+r5~=dj?|l#(E59s{Nu=)Ii^r6NiO;o>7qkLR zVDazXjl37|Bb9ceexG*ZM>#R1sGiN9y`uO}?@t63-Yq@@A%vcz6gM*M)L1~z1+^v8 zjJvWn_BpW3?pdF_H=aDW`|Pd>pCP)4F@k+AK~8*rS7#1Y+5J@uM&{lRa|yV+WSOI% ze34o)8iNKJyrh!%hMTq;9x6!Qu4@pFiS3YA>{RQ3$zZ&KPED?ROpTF(8^55`6EKH> zFMo&SSgs-3tTv@6z87HXf-o|Y@geu{;vx-H?N7OR$B}7*bJiG+G%7gV2RlrVV*vc^ z2J(Ur5uF9Uw4Fq8mA#r_UpQrq2JnP^jRA!GVdbwcynH~A1$2v#f^lc_ z#!l}H_O?~Wq~dV&o(3=Kbchgc{vmuWFuPKF>paTnL#45wVnQXKf_*{j9A9rxzlSZ4 z>N?-|4hM*6m{`&0Hf}Gk!adj+g>$Gm1~(_~Dm(B*V{>U8TZJ8qIJQF3vK*58U2@WV zXLA#&70{kLdg#2O+gWfjOIfxX*#dlpJ(>zaa7685zaV2{@!WYTS4IZtGSTrT&O8-B zxxceMc!QcX>xXs*6k4y8{mV)-MRFg0&xj=LhKAp~870(0+9#7zKsUn_m!%j1uL4Rq zTLGw`hl}kCU^ZWHUWw7aD7j%8Sa87?X(^UFzU)!apBHMBv;)$4+(LbM6gzmHphCJi zPdDk+nLr+LV_I2o_LW;nK<kkOYq!jLQk5t6q@yJbu;pm zYnX1{Q%()NQ-K2;m)K%^pC|ePr@+fUQkO17=v;>u!fMI`hrDzyGJ+)GVI? znVD7)iD(^(sTJn8++PJ*c>bJ0pI>>-z|Wskhn~O!*x$k#g`rbe0}}Tt=i||5rR9;_ zuUEmi4~eC?2(r@oRw;T|3ZD|~GfLaX-C0wpott?A4*}6#T=oqN8TAt6$IBq5-cZLO zm7>Bynz(qeCrgSLCn#8`!4L{a?vfIGvi?_OTUM)jBEfxlY_~glSqo<_v@9wXdP^xX0^~-K zH(|2Schp8Ih{j&D0U{>6RzpHJVioaihwccptu0JQ?N)w0(5_**i}&DQuFx#~0hdgM za4lF)`-mdXNlhWtMq91dQCJW+yG)>|5si8IrWvYUFw-+ft^vX!2xE7^35hfvm+$=L z`O2NOA90wbH=IznF8L%rq{{QjD4Y@y0Y{pB0C2QHe%W^dOz($gQtNnClOQA<+ykw83p~4EROZ_&xqv~lU-r_8eMprKIQJv zEs%_}j$-R^fZFq(i4+SKO@b_gg(&pRY!|i=L3&ra&){I=&VUvTZYg_LHWbsHCbCK6KiKV$txema%o@F;&BWX8!ZN--EqUN6_A2T4RQeR;T zh-6vjIf+nnO74NI&Ef&1T68ve!Wn@tY-y5$O1C`k2F9JG`7f9nxuE8Wy@6wzS@0n1G)gg2@u{J@Pwva* z0djEws3+p9N-fnUh3@wD24ki46$Wc1|CVZwvj$%b&s6R-Q;H1v`vL|Sx%}(aQXXkUpXwO7EmB}b4r1&4qUv{+sUfs77H$^Ae`+F zUiN!xYg;_(Q6iA`=ntf+h%e`iEx^wX`cqIkV1|)jPB9QRsR}#2D=& zy9#I9{!5mF@v9BgID{7kXN6XO6?_%3HT1TZb&KRq!~H^-)x)b#WG#>f*ac-qzo57Z zgapUUKcIu>Cqqgup#mH!DZVH4J&+O{H~$3I+bGzsOloO&jI>j}m>#uw={`CitesBd z7B-y8U7dvKK3-ncoc>BYdpJx=jjqePWJ+{~SgCr*-b`(7(+>rXGRkr?Cfo+`N5qdB zf{?HC%n!;+!i7Omr*~1+X;QV~GUp8pCd2Eg;Z_i)C%;J8j!5Q5hfix1!Q;Xt*HJ}MR1$1|gitAGe zX`gS$G|^WVYd~tFScX~zS=4ay3{CLxd|rDQ;S{JH3ePj@e{cbJ%gtZj(~vc(Aox-# z^LF#Dr=II5`26X>-Lm$+Ix2v>6XNNUl4Kv%I|_17w;p4QY(4TVZuh7`wR0b!)xJBAeJw~qFm|*>Z8?D{P@K9YC3TAM0 zy7k`lHaOS`7PxxeJeE5PN&w|4v5w6I5df{@$P6c6omm=N*!cc6-zbkkRXQn{vWJ2a zbZWtFW>07q-;OrISf|p|!ua8r1F;0h32rJg^LUtYkUQQbZkkqzNhqyrbx3z>RRV*! zKVet)kTrtd^&~6KkwkVql_bJHD3!!4QI9WCC8g`P$lj#%1P%JJ!dwVOX>Qaf0lJGn zp;S7tMaO`kRi%1J`1tyL@bR^d3>uaJEc0=e+5Z}*8bn7*0hkdhNPf~4mW33H3bqF1 z>MqVlD1Qe7A%wqqN5bDEZMRqx37@7G`@lWZ)WVrvXlkfto`SgJ3Ws)`q+fazY+=9) zJF`5vK)4U(UjUycVAK6rqiy_Ffrt@ zf*}mSpF{)*_sJ7EL4Ig!z9-c%X7=`yYvxmx)nd0!?}B|V9x0HUdHmR3Sbquy%;?M; zegV^+g`;a}8olQ!LyZ;J9_Gqx3 z91G9v9iaRYlqKEMX8N}f3UdVY6w#f2jE{AK!vSkA{1Jd;C&AtBf2m}hfvC*tv(1&K5V9CMw{{Y4 z(cIE~?7GlY5N}W>Iil{7g~5(%p~WIcSU{7Yuo@DJEf1+k5_j+E!Sn7e)aw{yU`F-G zRR~)g8P7o{BIwTPn6PgUkDO}qjt7->5xz%Rudzww;#IW99G3@e-xT%}6Ng1{+$Eth z{t{(7cMg0-@gNN6QAL5KBgU&Eo+uhR)3(A6L-nJT#XO|@6qh>g?QenFAzWpc>Leo% zP`DIX6hsrPKRdu(f1ADMsN}T+(}8`zsj_L2#)=>j-^&aIyDmZ@8iH?Q7tGyrcDXhWqxbm22YwZ`hI78u!|@?d#F>8g(!&)i>CqU&OPxAP^okz4dccXuIPSJAGH&p zuzQST^GZJgx|2$j8~Tw%s!Em84o8ddkrT?|S>i1&+rVAAv1myN*UdcPBAD?;2V#TW zDdeoBSx9>lDkewg9;xiNFp?BXhki1!J4;bgq@z*tSgBzqTvCXXo8~%ED5oFAP^eGl zMPPB$bmSzcrE`Igb!7Bxj|K-d6<&~tBREI^-Kp;*I$9sc0t@vHJ*b}N&b9Y678zjo z+q<5c-nCs_iv@P|1yYX%{;vPM_`8nV^BVkJzg?kV5$Y&lm>{SX3LVH$s)$5^@c}Z_Og3()l zFGg?u;(pU$^ww=0b-lrXGi)SSb9?(inTi(MsL!0Q|6c5Uos-P3Z%cJ@j!{fG#Jc9y z;RfxyYa#Uo!}kbvqG;~;U5|^2`s+vx+1|KUaev%dhsU(n+Y7l9scvs^GNOnzeF`C& zfG^41OuO>5{dDCKyQqL2Sk-K=Q*k;Rb(`TToSGihFEvzLpWwgYVxFEB`U=LE9~h+R zcX5D;I`(9z8a~>D6?&Lj2h~8`+&!V&fkYfB)caF5EQ=ouNUh?qn zGPvTO;96JOezb_gxGbYN0wIjqUYdScZos-Tfg_~^KB9ULjtY`z9!xV{(;F)pV0ZSu zhAC5@2sLmMMOf52?IJq3<2ueC)0kN2FRsyw>y-J;Y?hO51$t$Lk*Uv^Es1In~M~mqF2t*Ut zEvyJFYkfu891e!w`<7eHr>bE;F(_6Fx$f)_P+_lLhxHxUn}F_?R^*ooH#>qZ zTri$4nEO)Oikm8WBf9nmo}0aX7*+gC{m9eKnri>!=nxjguJvOZO76=)d44!RAmyn- z`PY$OYY=A6HY8f|8>QA6b^AO&M494LDl8I45LTydK!Je!_^D9$svL)FiHSwx5Uq&d zN}?cOl$1?p@$^>20G1tULb`D6v^9 z9WthpY5#>JHb>&mREY?kc~U zJeEXq3>Wg%>sNdZ8NUr{38Jyv|Cu8T*jD_<+5i+HgMz}m+B`@=<3x-_feMkL( za?|_$y;uFwV2^y4)t~9gM7q$Lrt2)2f-u8U>~(i-e;33x(*p^JTV%HUNw2uTP%IGC zj)Pj`w!~|1HLm=+t7`eWe7O{|L*+OZ`i7{TB5IN?V1~AE6rO3AB2em)T$m#Pm>MBP z5=77RLEMmeI|&L9kq-7f7+EZfJW@-VLyV}yiK)nKc02V{!wm^|?hmr({$bP|zTnsus-_Cb!Z1+H3tYeHi^qeZ3&IfM5=SU5!3P7K8&~Wh zN`a}clHi?`A&b|!iIxjf2yzUBM8LTLbmxW{f`UE?G~?pRlAF6O=M-pheByIK1 z06se=4~-px7B1`BlEcKCpc;2FBUJYXFL5umX=B055f{@5$Ky=YW8!q0+w4DLRE4I- zlB64=LQG07UWa*C9Ct=T4$`QHIb7L@`HccOBfdB=rB<+MgTol+f-i3A1<1l7+(y5s zp6bnnXT7k~eT*<&pe$|A7Pft{8i~iCgl3<&n?XgH0NrP6*uVKpM^;2>N%@583*w27f`cf~s@iFaU_p7sNd|R=D!n3q+NcB% zWkDoi{W)%x+J7NM;=;%y@tYF8tnKxVBOfp&J4Zk2;M3U8DWeBNx-r#se_;pPru#jj zl#-ASDP@d1{2)*{V>*yGgj@A?V}D@raAS3f&y}oM+E3v*zCxvz9bE`73%aGQWfCa& zCC;h%B1kOTAngqnayj7#C~c@08*FtxzKxj}ZthAoUqJ)4;3-9Q|K#rjOL>ElIElHB zh&kF$b;lchq}}gPXx?UL{SezLGgd9~3lB!9C%1luo2#>9GB_@=@^0=st9KthtnLfx z>U$T0x4S6%ChlJ;1Oy&m6_Kn3ptF9wa&A>*gZ(+9)u*tWZ{1V)X}%r#&fnG*D; z%`w1aqyl*B2Yuu@*A}CKE>v4RSQN2paSf2BJ5|FA6wsZ=Ss88F8Tb}k5qce)%wN<} zIWg=FJ73+ndBccFVXKi?Vm_57Ah^$0?ypq9x?PbH|J#53Z@Ntv1*vSmd6Hk-Xp<>O z0>Ry4l3yd1PoJX*E;(*|Fk zqQO4XOosX!1e)Cxs)#Q0F@eaBc|xIO2sgSHFG@hjYAt|Q+y3o4bMfsj?wWA%?QI{N ztW_D%{iH3|aKAW3lv8Cas0qIQl;;p+{>E39gMynT5qa-AqkbR&S1|)$fq}ak0*1T+ zh$3a~vxyq%eP>!c1-ju-Fw3A|rfxCuTA?v`kYnT>K;q)0pCwzafg_AUssx;5D2v2nmhDcPghj@idx-cC> zI%*xrJ@jn_1Ju@7Dzk#sFQv3`5a(#g`c%4RC-5|VgBkppXAM*M z&N}>;I1s6DKUJ@~y8{bDyqkX9uYY4S#uNmB;Jy@s*T1>V?jX9O!pm6Y(@nV-Ru56F znQPQ3^>=RWbu{;~r;g@w1L2m#U2CL?*}Ok4LuY+YZ?77!-TcMf5K4&7T}Hhv%6#HA zK<}>{Z0*0s7DE@rarNrjm1~LQ-+X692?Y0h&jcyTY7Oah)sKBl=h4QCL+0i&XY6s) zeK+5Fd%88b2ZA?)uH6FNr#*iOI){2ZS>@4v_yhs#{?450g|bA=ml3#b=l$D{004aB zuVd0dvgzs@sXbb^$0F4m?@AQ_eo4Fms`sS?1$J~|s{Li0QUuV=`FM`tiC*eXl-Ye^Ux9v>FL^C%iA~f78>g5 zV$<@Bw$K&qwx4^?aY~GYD;U)5mg0=eC_=ZaVxEF7^sPHt0n;8zTz(a76y)Jdsa#JdUO*s2g-7htkr{cA5DvM;GiJBd;6}o^a0@h z!1TXES3e*ZHwFIt+`^|lvY6pu3X86c@ON+D(>1c_Y1tuthn_y-!fmE`vu3=$bypLB z*sl2NcJ=4}XrHe1P0ljoT)kN{BHx}E*^sOn0Cl^9+o-ep0w<*qYf82w z=TCWPsU`roOv8x3FjMz%B1^P3dT_#^03Xaa3geSM$%nRni1KfoE5O2r>{IwZDmpqv z#l^nnq@1SIU#^^0t8rAQZlHdYw(}5$*mJw-Dr7A;&Vcf+PY9h&(*p7Uk7=rP*Wec8S7=KH* zP`RPdnF$zXRg@aa&L_t(-FcdN8qX*b#3)54m;r4gz0Cn-NXGJkKpXI_tfS5{KZ2Ry}4qSq@O{+*6NA zqyGc$ne|)Z8Q%eY76lHjkAMdA7 zisR;2@R8alAtx-=AT_+9sjNnrT9CrKXsVJ*aNNwwla(8gV3bIJjAHPFPR=Jk4IRbt zbdvTQr$aWh(KMyavJ(#a6@a4H8H)1Y{X&k1s4)xvnc*SsSKtE(L#`l;8DD}BNuY2x zMB1AP39K6#Cr^f+vMDdMO*rI&V^suJjk_i)x-j1{qAh$$ihREWRy_uAS^C_tq zKcc#Wtc)IqwOPV#6j+^bisjBeBIJt0yOI)HOCU=pH~ZMFvEAtdgG{Rnp-J&rl}~8s zV`zI8*L_5${z{Fi4;%6lg&RW+{lavN_DJ(|m2MtI01nX`(%*=`mFf~iW^Ty-)U29m zV-)b)zNr?;9Zz)3JZyR-AR{XRmQGyqt9 zkSB3(m5}9-f#diRV0L|O)wkqHLMVXNv{W2e_>4&UoA!wtdvOnh}Iu!Trh)7^!@wxBuXwZH*mNFaz` zbwHTD6u;>?PlnQS$cazkP=;h7D5FHu;Gu?mf{xzDgk~O)7X+n=N_%OK7i6kPQL)^T znD_he!}LaSjS-UnQ8W;gLwk3^O>I`9r)_VF=T66a;Mf?O)%KE=Xz8_4lbIn!RvjTp zmBdy0Tedc$m3{BhWi+)2#exY_>|77!7R9%PjP(QL#_U%7JrRYD60yRV#u|ZUU<-jo zCE6p4=srO(YA8ZTHXLb9rOw?AWktNySBiqQC>jJ=_PX!}0Mdybj5kbcIA|eYG0r<9r)0c`Uzx%MzpzcFcz3DQ+%>P1*U{#;=8! zpdpiH3XD6&#N`7k1Y&FW(r%KcZ64v^P^{EEA4SUTJA+%x_6ME6j*+U&8#L3$EtWZY z(>Jk>q`S&bhKJX`!8U;G;Jq#!c!*GhplwL*fgxDP_DeR<8je(ib+_oCOpnJXPKl1` z65qi$91`YP!nr9bf%pUX#o^(`&iV+qN5H7hD#teV24iT~WboXqxHS`%v*ZbL)FY%Z zOS`aCgax@ty8)RG?LRR*+{J!)V2i63Vh>~umJkbVtVfUv%?d~f^e6(2qko#y$A*W) z{>V}(NL!rIUU>PeOzAO_r2bwJT)yOm=*;7@xNoRz$-d2XD%h<2@YV2gpk%OcN@`t0 z*WuUL>?Klm!?%?jQ%2AWJsJm*-crhpfN&x9aUm@N)f#qjex?^5p{bb4^bpxy{x;gT zw9g4Km{N5tcgB;39TzXVo$)mBRV@#%Fhk;Cg4JLXrVT}2DB-!wa?ZV@nwq}W^lh|w zVR-m+e@NS+>_ll1UhH32+I2Kk@i_c%{ow;pNG*ezP={e$+ZPnHb{JOjX^e!T!ExuQ za0B-06_%mZwUpp29z5t}m-`mlAYYN&Lb@3cKj`@dpQLt99?)BEjPw@lWNl`NXux!{ zOjU2qA+prB2fiTvTQ9l%Zs^(w#ozM%~x&aBTI(hn9CgwJ`Bh4CNsY z?3SK(U&B`ek}E9YX>XqfkmP5@q=mZ} zl1dlNBm`418bSXVA?f@iJjDJAE~p)h;MN9e*VgoTp^?ds#%41{BzNX%C?IoJz-iSA z5A^qB`7}dV@V6XIG9aRwjwMZwY9v6&B2J2yS}etF4EcgaitDydNCbiou0pv5_#G%& z5z0uv1F`u)4CV=4hMZ25f*BTGyP6n$;Y*L@KH+l}v5Z0%u%Qoiu;uHN8`6dKS`6Fx zUTCS}xKkjZAJ9hVI9vytF*6JPUokWJMa7R8?qWt0{P^UjwI?)wC-ByY>Sve+wa{;| z{&hfbS2Ty63v%EF;Bc-Xqsfsnke|f#gKkjEdi`MAPS-+_eR@`#YTn01vOV~lA*Pfz zgotrqqM0)wlV80G%e5*XdN)xB36Pt4ir-T00}+M!08fu9{ZvF-SXnuzN*$6aN->d? zFw`ExWncB4OL>fzWFeR`dl7cp^hbKgjzDra1x4hNgM%)bpwb)ExkQ?SH=YxS5u`$k zk0i~ISnmPpKL6e)$gzc@^sp5VY!f5LaDsI(vRkBr?u{H|%rQaIELwuK1{ov@X+b!P zZmco|MWhndTxAk0TDs+9c8!@qn9Pff-63to?R+ULZ?UPhlSl)mu9mZ-9r6v6-xux+ zHpa}TwrC+GuK5Yt#Bvv&dV_&l2vhICA3m`#VSoQJJAGP^-G4!b38uf&PO;qV(?|H6 z&YJV^VB_2iNw2*BQ^#dGds>u7&F@n3(3nM@B<%;2ozlX%`^G!cb8Hks3RSA$NWTIQ zy)#L=pot1|e>575JZaM#{IG`jXUCvmS2Wnz-`)959?>nX-uX+2&`w!c7^BcU`AzfM zx`hZZfNy&P%Pp+xcPZ656kUN~Hy&c^g8)<`>;(m)Erxd3-|^yJLvsIuM3NT+WDhDh z`E`&_0CHdA-Z8rU3uQ+zTQ=o3;WfsR2S}%#9FxIB^(qWkQyEwh%3TZ9xe=6ydXA{> zLUh!Djr$02u*T10in1xj3U=J1G!(vh z+QKoed!9OsTa<6U_+#~Id_@8{zF;r)>=-e0ol%eCQ5R}ll5$OaJ$??1XErP-CRC<{lB?r;CEGR)v+J`!`tt$x2 zWU3JgM@fj)zWy~r?pH-r*gwfx`b^7mKzBaX<0_}*K%sDuL>zpB1h5|81OrzeXH2$sAXlmWpT z!p>Myurb+a^~}(=sUFkQM#jg-oM`eDWqfeZG!hlCFza~}T74#reeSfQux=DaUy+be zT+fw&lbtrd6 zDW}%&Ih-UR-%5f(a#Y*xJ?cR`IaGI!&Ki3ojtfb7_!a6inVD6vl;Ws2LY4`|&8*`7 zc387i*o>v?6u!>2tKeDJ+3RD%5&$w}_fys}U{Y4TxA*E5&MZtb3afxrgnSK`y6cFh7I}44_!f6y#z#Q&^q*2gBTcz2MI$qo1vZtFjZPZLrSa1kL?c zZ(^r?0a!U0Qt*A;y7PKW;_JD|VUE zvd1>zWo=T5;{-RA<8wlZqUFgU(yWMA5Tl9oESj68Lp`9!ii{V>FG&7SAsgZSuZXZ$ zzGnDZ92EJiO1bgp8>K_$S>BvwSA>GmISP13}+NoNmK)z*9 z_>ywJE5mU~Z$I0K1?8#pV$5%QX|qUXVVIK#vw>+X7XArcCI zH&~9^g<(}bDGc^@{E@cxluUs@!|f`ZwrfkZ%Tq-&U56@?oAY#&;hPsWI~0*QIH=9D z!aOdFUx0EKk%}uphC+q2ftU(Qs6@0jgJoNEE$3&e)bIy^p(aZ1Hu|%Y@P*TIc7Yo# zY7q`|rM(0lv z4tF8R7ru~B<;idd%P-9`^lijwf0JDwzR@X?JF6t`pul~99p$%J6U_LQHiHWa9eq?g zeOSSwl9X~qF|J^KJfzz99fTQ-acE@Mp@KCobJVK^?1u+0aSroRTWcZRB~b6aq*>}; zKxcb$=;zDhf5+V{y&JTv-t&h#I_1*ITgW&Fvq_LV8_aam4aM4 z6z4Y9>yT20T3B-)ufb3roKnFk&RU91AQLXqML%5#%)wiMY}#BO6-KPwM;6k}-Q_RR zzB#MprFa_eozvbZOvWPV1kRlb=hZwTmXxGemn0ytH)~3^#p;zEg*vADbeWThD$T!; z{S9bh^Wp0soKuEIxRo{6|1F&3S!Pl^cls%=O-LW>&5EH+o%|?w>y2^+O zxor;`bt4LEWtoR2totai@{`c4?na^*i8-(|LfS31_()l|7lpU*r)A3P*8troQY=ku z7r5#9cNTRfC_HRZI30ZTV@x=sJ__LpD&(kkms)H41`E{{5@aEU2)Nz%yqDq|(gG%Y z1^h*_mpTu_n8;G}-GtDs7Ts-yJ_m@vF(&ks>7)zMqUGQECihbRF8l+v!y!4RIaw!n0QQ3KS$Xm-P8bOVk^ zc9GArKccH4d!6;(i|(sF(l%3d)WQ=AS5J=sR2@ykb-z}ki2R}`86}O6-z#y<5E2w9 zCoLdqR5+(aQsblCNm7ZAPqPv}l5f-DD(v-i21!E<7YP_P5mGwD zcgO>-1E|!Ythx8RE;U^+g`zZAa307QAa;tvF=?4TF7&KMF7$P~!AG#eB~Oc_kngb3 zk!P~LndFLpn_wO7VRAL6{Tp!H#Wnmyjwh;sgz>j|y=W|=I&kqh4oK*_zPImQdOuLM zSne~vcYrVN_!5zFKf|R>t-lkfp}*%n3+lT!9JKLAaSIFw0m>EMtIdrSZW!GMAuGs6ZH&n(@Jq zGGR=o7KB+8N341?2@cx@OQ=#ptS=7Mxx4{s8%mS0ecZy%HMuq5p@s%`YWxn#U^dx? z`T$WYB<@6g2PM-;vMmz@b5o~Ogz&XtSx(|?q!M6xXx)BFWhnJIk zf@VQNVi+2}iGo=Y6;3nI#o)mrGoLXuCqR+Yu#7;o*i;3Zm+wUmD6T`^Pqh4?kN5|4 z0D)J$ph*WvwpVzb=lcO7$47_RsnBA+r-`5A8Wb#l`35^LnUv_*)Cf8SF~w5aL%j~u z18t^YcvHn8AYtDXe$)#BXeqhuCk4%e4V2A*6B(0|MZ-`p2%}8M?G29`yj1u=7S z!*ZDG)W#X?EA?E=>YEncC%hZutPGG{#!l03BHflo3$IgyhT>r3AaaACUOeP$G4sGN zJD0{&X*31%DEH}T_9Z`IGs*i{wU6Y+vhEq^9SWJ-=VM=jszqhkD z;qKYD?bE3VDp(-+B%V(%V7g1;mS6{_Gz->G5F!tt zZLGuD`FMutQLayR5L;-{Ar;n$vo!`*d6e=ddJzUbYD{jt9HXY&iw<<+n!(Y`yDKtGN z(UMvDEVL^0r_HOWfkAuo@2P6LEYD<1B&V}+ZL&K~iIYPuSB1Gi0m8)`O{~Ez@7g(2 zsLWsAPwVUMOQ8c70TvE+iqI}mZle&RL^kjh<))KZFR{OLgVW&qo8+g&nL>S6+roVj zy{3}@5o$nGs)zR|nBP+Y2Xp*F-jFT`oQ_6~aKv#ZjSVdgrKf*J8QS;O&ESFca=3I*fE5k*AvZmZDJ(@qCX=7;Al%2tHvupG@RdvVr z5jX(r#Pn)GnS`0-qn7k__xTSaq+Zg&0~a`to0_pWpw?J}ocGWBa>&S-B)h;6Z*d6a zLHw9X18RuwlV!oC+ehJlSbIs;eFpefnhRYLc;Wro3pj|n;0#P+mSXN3I#}7XYjBr z=_9(2X1VVMT1-cg73Wu7s!;C49sLtz7PyI{^*&^Obcm~S zY$FR1oPk!pkp|LTyrZA1aQzNdZ)M@16CO};ln*hDkQOFgV1QR1F{zXG(k(!O=gtJ0 zEB-6A`~p#3M>sXt&V?Pcv2##AI%v~;xtlT)&Oo}e-zyy`HctmEoMjd`oGk0~ZPR!m z@9WfL@Z2AM8jLWtv^<^!uic}o`FthKN8Q5#`u;&dpmNOIdY@8kny9zV8}ep3Qzss);>zn7`_TCDqfN)*ccu} zrwNk#_4o95wFX%7OwlF{TygLlD*J>x?#~zo_Fvmt;04c7jfZrMlnFv}SB~a`ogga+ zY^xqVq=Dio1DkLIwQQ*}dTLy?QB0UJwF27I$OO=R{EPz%d>k%rHSQwNF3IoXZ+AjB@kwy-mJ&ZDbocRH`kAFlt^h(st3Rjd@#g}ExJ#DK zz3WjnZF(xtR08OhgpYfHhQB76#_4om0baqhKMITQ5&Z!m6BfYY$z1A6meOe>p7|y! zTIRX|->M$&S+W6^g&lNgl>{3{eTkz}#&MUV2cfC%(pMc69JnJ#?bMULnfz>rDt(&n zEV!$VA}nBZLl;htAtpE^%h6|B0Pay}QZjJtcDa=xo3bu&$d4iQ=RFSVb?Hbr^&8=q}gJLo(0n(jaMlmL;_kVW~ zz6_nf0eAItoPv)dbVAc=lzYDj%UvRaUxNAiKeIiYhC?ipcoOF{h_JYPi$cvdXYc zj|zgBHXHk;qK$*dPu8vGSZ6Y7AdT` zHzw1WmXnIL2x$#AVnH`^IN4@|ClmI7?)pSi;&xR%|Au)k%-uFVpg9XsH-+5T2-((DR63ms1ODe#*U*AFCiU+67UwAlPn@3ZKmnC0eo%~Uz!EM|G4XH`N-06o>yq%#z zj<+7_`%;%lDyVJdZHA;c(-hF12_CLw31pc?w?T|s7qAa2e$#YPBqGL`wDqPvo)m9q z`OzP0D!EM~J-prVhcC(6zn;>4NY+7hpEl8cHU1Ij1p^#7QR2gXAMDT$Gmdy**^GE= z&M-NF5VdvS>=pLD*&gvjkGCl1w!1+|DTa2Ng{p3NG1&yq&2y*V8#u$50$R+bEI;}7 zJ5G5m*Vy4N?l-hKV1m*e;#|dTLy10$WHKD~Gjl6F1Cm#SLjVH>YHQ&CKS^J|8Uq2*?Trki&SjW)+9*#nMJUhixNUPtv->Fa>nKUhA&IAI7)XkX1!}tUAN%5$bH^ z2Ca1sFB!oSI<;4k47pJ(k(cXxfWYr4OcDU&mvJ(fHBh(YTX2AfZGWhO3a z9_-j2Z$q=;n@X_U$7_U1sU(#-Ukr!3EYtJ``2#KSLiA5qo+ddxW10OIM5T^Y8`S7?6KCojWdYDpdi1=tlL%)qF+Z40G_BQEx zcO2PX{1-@wFylo1k8HkNc_J+N?YPTVSKqzjLrcNo6)2sRvz3gnK% zdc@66+>Lxf;D3Sdgll-)zHFlxCeezB?&JG%u^k4|KTWen3F->4ivtwDw=oTFvleCd zL@6LVS9CseSF|?y?_a~8LP{9qSu@hpJaY~4Ha##&Ge$%=%ha(1vd##L9zEfE#87Rs zE6VhH1atFBa5;`QE6H7)8uU978BcRM73DTP-B1p7K#;DHKo7IM$WJ1m%g}6N>NKYh zQ6MC@$iyg0thNp0`Gb3k*6Wp@TNGx$us(ok`j{?x6azJSTiI|NY}P!>g`}IX%r&VJikp3cf0)YsJ$y#f*td%8EjHI1 z0qJdIw613jn7jN0Io<4+Lwp9M4a-J{DS`ZXGL6xGSm!<#tKoQTv(7XGwh8GLo=o&P z4zZ**3SYJn+Q$40NbZEcPKtY(2a*EgjQF&nkX3q&QD4IdxI!0Xt&oz zRywpSg@0{CM36xtT zZwUWgJ1k{w4^i%pYWDV2W2iv5+8kR}$jeiYtV(f=>mz!(1lcx=OG9J~n)_sxz(o_Y z=7-+E$NO)(w2!8dA4r&`!)%0yD60U_}ekau-OP#6Us-5#4?Qy#ONUW7f(@FR?w`X3d*q z4KkSf00}DGFxGui{JNtRD$QJJ6Tpylq}4%DA`b35gkmCqtrtpFQX_>2A7JZy%J49i z{)HCjh+PFl@eYmQmA>Zo^Nb~hkC1;ub4qdYNN|Iw!_-HmfjH3!mm|sS*+=CdyVkUc zI;gLD_)IYFtNU~;sVA3Ddx++c!ZU17`SV(AVmTXMz2v+eOLRvEvQ1uVxpJ>!H-EZ-lUCM%X?~s4+@YKx;*wWsY7g^8U8jV-NY#t zAvrdz3kygC2&sK+(2fsr$oobXG()+~A2tDHBH)r4VXKUAja@<-s1=wqOG{NaZ463%RRt zSCU)ybHMK6GbI06lQSV22VSpU;a)mJwve$FI-XvN0?iQa^FQ~YGm+q$oHEJa zr#ly3K3*fA1cl$W(Bs%sSjlU%d^9Ay4(R580tuL4frM%*y25pD@Y=MvjlJjJi;Y$w zck(AdR*wg-{|oggsVPob!47z{XH&k~tWx||ppqgXB`}WUnx{e}&r_M<4qxO_USUD>d3ykc$HKResdyMS!*xQQM0dq3ky$_7 zhm|$z+TirU+|UL=Na%fyoHS5wfy!PoZ0bKfsRUa$s!WVLBvMB-Y1LUGLc2KB`PfAj z+U;6;d0{g*nOY6coxdvtuv9aJ7}tJ+$kQpMnF0kL&}5>F;^y>hGSZkM8oTgPjt*b- zdv>xFRxQ zwKW?2jPo{7VYNj+#$c{gc}z8830AFo2+wLb6v&dS1sF{=t0R;T@BnH$saaW#bF~x- z`nb@eisUXVV}}X@Ch1s;ET``DG&7obN}3)CM=`MsvM1tw_34OBNyH`a}V@7_*Dav$B5h(F$N@!xPJ)5Ij3 z1fzJ0C+q+QlvS1mpGl$Rg5wq?&*=Mu{thDf_M*~c#f)fVTZF5iX9~0k#r;l=?xc(9 zu1KeqIo%;c)5h z9>|p)=_pUNAlC2@AEelk4OWOW(4vxv1L_~MFixkE0#p)ia3*weu91b^@)5nPXwXN} zd6@?Cg3MhaW1e>Jbn2a2C|K?o9G-N`7dkT1VG%PuIXxZ0a>rypNpwCupvzkfd|^_? z1-VgVU{WlZBH9b``gmhP){eTo0maL&`v5 zdpMZ^1#*|Q1D?pnMiv_kFG5ft$)ABRoN5T~LWC8z1DjAmsHw*0QRDcu#pQ4c7kZ-z z9&&>-rFKa;^ko=p^$g{LQzXi~05o{G^XZFT!Qls`?pEGc6h7E;`~xiP@qBv$tp zjvbB|hZ?9ubz(#VqGG+L0uDX^2iA}BRjXlt6Z-xQ%EUYaNW~Xc!bgG?(w7aD7QTc> zXiv+YXA5aAw;(yf6^rXvMwC>p7n2_B<)Mim{>4{4OLgMX!4MbFQg|(uJww_$irvz3 zU{;(KJr1`jzwEnV0w^4l`U}=MAqV5zXA2x~n{@8k9dH|;Qm#vCkin4gTg zEp~VT9Ebp5HX?k8r;!a+}%dom2EG~{t{YlohFY@#P1dDK-P%&K4>KJBf89i1mu z8VdSQ1}T)m+~3{#O&!V2!#xh{%FhR;H^+W#l(QLvg_`@NpaUnC&#l3^KjMt-6#`MQ zgGW`I>dwkT4utL^lP_FBFJ>7j!qf74)2mykU&pUpOU9wCZeZ_d8-=8tN?^I(RdsT?50`mFeT_3Qu|)RxDTg0g=Kzs$P%VaINF4AkOOt z+y0~`@~;p&u0+qbnKPkLxKe1K*>eZ`8t1o_7Ui)M9s^6tM0=N3x2jVcGJ~@dLM?~(`YmF2fdwy4`ulbSCk3f7D{s#Wc z!2zm`>&7J&vjT}=8sJ@zpQ4yM7f!#TBBUL5Ul~Cv7-otOkwxKrp^(D3)4sAPAFQAi zC+H9vl`?G^+M7q4-SH?oAh=&)EvK#*P#n4&w%;C<5Oih(b9DHkziq?H3Pym8roQF7 zLNTNs)1UDXNp9OOsz<$7C|QGAj+i+#wsd@!-H;SKLE87}HCzVA&CuCdy5~6S6&Q@I z?A5=8#Xza43X}$B@Z8y-@>l)pvnT^nKb9=0<1$^3C1>WI?wG>4hyprxArO7ratKGz z4RG$|giVvJU3HV9x?A4;;D&omD-?U_-<> zwT_Cghz_N0IHRxA{$Rz#zHDs{ocR5}V zU-kI<CRJ}4!rT%)v66qdEIw&4a=-qfs*=R({*uLN{WRfcN1NdZ6eJ9oC`)Cfg# z$Mr7|I;+eg?3&VFa37dyWg-HCN=6buc0JJYcUDn>quT?xH7u4 zH=x~*E%;qn!4xOcnUj#U!HfEC2ib;*;N0Y(msHmj>;`=|)3Yg>(h}uD(~=T7u;Q7n zZ6m79S*J+uxc-HXO$hadotrn_UW;W2c_epn<^Dc_%2*;Quwn*`R4Wa(L|yQ zB=Qr|yxyVgO*9L_Eb}2@t1IQM1jh|cBrr@W( z5HdeNa$hk&x2{2aeV78Bqj69XJIu)~BiWKZB{w5ex2#f}a^{kB0?GYn;poO~Dwcx# zll%MC_k+Pc@Nh#^Kmj;%~5##R^xU?8XS+ z`MLn~9Og%+_r7^=y$2-s|8nnrL%oN4QgItM>K{?@T@6}5SndB0C;NJj5~TR7VXKSm z^bytQ#i2SCJfmo7(r!6k-&#BYE<;7J^Fsz$ZcbZ>qgt-GBIa z?P-pm@21cn*|GiRJKP&0efJ$!0G56vSPg~}G>)OG@Esj-ZDX*QiQY;``a1`azl=W}l+xP&<-4v=ApF2^0{x5Ck9oS}Zzi}v#;p{=! zARs_O;+PB|q^024PU2$6#)AMIu52r|h;13kPGY*~Ug@TL@4ffld+)vI-h21g{+{Q1 z-@Etjl`NeVH-CI$z0!T3+xzZi*47z|3@Wi=;V5>!;JuUBO(5sKEBUIPI;&zT?L?h* zjqw%gtj_Eqyb~&!YwyTn`ighsXE9GBZ~w(Anw<3U*3&9R+q^Z4JJBqfzRb>@sPxD3 z*uUet5#2X+WjKpd(F^mIlXoH~Ysw)f%MBuplcQNIk;{TJC)ac#1Q{8PcC{YXRrPf8 zDyAGPY5RQDHss=#0^TKz3LW*g6mS{BN_B*^Ln~>H9x^Yju|4rdlnjzexiP5^!8MFhHQ>~N6QfbVbRvAo9M^u^ov5qT@iUMa{x^MA;>l>7)b3l}dRhA&>XCzY(ltG%b&@(-DK9Krn7Jo$kH+ z)^J9fl4={GD{O{qye&V8)+W%aGE-=sRmi7m=-2}N!_OnzuB^O?Cnk@$J(O14H+F1M zi`^WQ(wmg6HQU2JV7+?Im|3mcGtIZlNN3bdN6JB!<<^hecQlqJ!j;S_>vh&ud2OS1 zY}Ry@44;?A^vqw7cyX0XDzk*E)wGF5A+&$HjZxQ5RNbm-f>0P zk%^l*EZ0|4$1atw))nZEi5KCEx74GDv{q@eNFA_hILi7_3T6 z6f^d9L9T}-7rA>LNImQyG=VY&Xg=D-c?8YBY#KF|D3&b;5p&#FYd8@GuUnj(^%eclB8$euC zr8Co2^Ou=m%K8GC2}`{gGH}?8i4bNf>^kA5I_Vdud~x|@;o#vo;)14*EyT`t+(und zYU{j3`{gioYy+bmf9=AQ7)l6silY#5s>dEE?5Gm#t>Jj!c!CX6$2J+iU_ii`Iz)L^ zMk45E%hhz8V9wYsafPCM`L@e~qH;XmfhjXSfzhC1F$Wu)r;sNGr!k^5Z)spbp0$d( zd|NnOcU=C$eBD-wrfrz7OQNZW3kowi?g=v047cCn{ct)bTrsldFCT3~KFSzRaTw0U z!%=JuHap_Jd|NViWIZJVepAY#{Iz}l zN*YWZTQ8YsJ4#xRd9dRc+i3i2tldzQ4W)ESD|GSWhN2akNZ%kPNN(!e*R{X1xuc`2 z1*zrsI=dXj1akupcqkc(_(Qk20Y|xS5^Je3jvG>`B=S&D?ZpkLDhtxqvGuKe9N@@A zhq)EBFFVPK7x&cTM*C!kgkPMo$s+BMdh0ngh4%~?n}}xDK^nlgD?c_Mo%M-|7k~ry;DNzo%kiEE z41!P<7zG6Rlp~{-~R;r{za##kgxldhv$nl;vg`JF;STsAM`9hCk0edM- zMBrz`SXBtrs_amyq9$f=EKW9-w{~<$kFFb~8gp54MrDb5uo1Bt=vCQz%ZN{hi-8my z$4=GJJ32xKOyDznny+WTR$47~;J8U85UdiNvLU>(q%(Ew9IU^ab~Kq|&$;_7sef|W zn~|$5m?jy!VnM<>kG?KaW`sG7XKwF>P6Hn`V!|o@0#sW?xXZw8hH-|DU2PIk%<>`+ z`)XVBhWHXHuE|l`XXi3Qxxbdm&cPzD_)TT5DsgXphAxy0gY+#xfhlZH!fGp)GO%9l zjrpZmue86kM|6TjuQIVxL)e+ag?I?9^?-YfbXZ1dG)8j9Ho7!fT`n7GDgwoYw^QsRP;g&*iq-lGTlN#4cqv-b7x*Iz?IM2apb|z@2cR@dX(0F)y zjOXVDD;+ec(z~i8R%Ywi8j7bCkY!duSucesop)8Uf8!w%PCd4|*q4|G+@ zTZtH5nKy}R?;^2vY}HK+0J}Q&C#;NC+?K$lo%`C*M%Wx~1IX|A-%W1H{>I+@sH zfs(iJ>@(Z=v5uO}+zcOdUJsAC8??_cD;u1Zu60jGmAgxA7Bt38!dEw3?T(HW>QucM zMpQ&wS-}_1RCpA9l`5Ias_dXvm8F#`A@+d=CTMXS9+z~8kpl8gv}1v!4eKdBAOF5;W9y)y;?~x4l1>wRm!E8 z9CRLvTU*Cg+?=1>gRlLHZ#DdjdIM|Dw$cmpTa{T1Pt;g&vT1{1u462lU(8b3R~hit z()27I^L6|nvwZR0r4>6WbwqMtOCp)?LiH438nYTJY{)7FDPpWO zTac_dtFu^jx_W|eROuwu$O|xJZ7)^Z-CYOTLh}(d!z=+Xwyc6piJtk)V`?m|(c8bf zw#?3#vewt^?r-mC9cby=-`h8EUE56qoz0<4J+);8lUA?6 z=ykOBhKXNKXhcRVS?jA3>jVA!yPI3C3!*!G>hC5obZgQ?G3?WNj}KxdZTd^X^n1q>fr4G-fpx@o`zy z)Di2>jbu_`@1`uTaX^9 z+0uIA$1_!KKQ&)^Jodc_)3xm?8cc8ceV09R?%0gpS!=*@t`P1V_k<!?R7+O&#m?6;B+DhSq*4=S0odP_LjI?&wRjsExX_5^%W z*8bv-u4Z)W(?jPvI+%$eYkQ?UGBZOh9nHPHK>+HgFU#y%r4{mxXq1oA>saJSo3lDg z^^30F{+_VV)RChDTUMdLJmuOz5L*Y~YuXSU|S~q#AY!aj1ycA4fERoPu zn82u`KJ-n6elP0}*X#G7H@vK~`MS1wo0<%bS^qD@T1HuKxQ?j{YsT6=X@9Cht#Xg} zY`r&{u=Wvt+F=>uGLBdw)Z7 z4+i96vrV91zu!gMd6>7V; z?fU+<{i&@hb&ONf=B&;d)~y3A9c|6~(O9F=Y3~iUF4r+jQOTs$TOEAKsroSa>)32k z!J<`bNS1wq+Psdk?pdk3C2^k9W?_f36mEr`7!M^rfsR8y_YuvK2J%9udKhLEuTTcuN4Q_$M8IxCG% z+l_54{pCxvRf<$CCC{SO(mc4Q87mw6n)kPMq}IugBM$~Pt)9l=zUJP2y=`sb%;s^# zp|fXo8cZDS>q>1(snV#{iaoJq?JqO-+xPc&x5e+Rt|ej3SryF*?OkXyx?0ma5|1M% zcowbJIVMCM=q9w>bfA5IYuAC^J-ro$ub+L5vQ`LZGjDxydIewf_O-T$+h?lmke!nU zjAg5>^`p7VC8$o0qkdFtR%4Y3pLvS*vM;Pgsx;5F0_K~vYMOucclGzS^`P?{s;OG|cFcVByF`^}-!ag=Ol&+2H&?ru&U$~umcEw-$EE!onS=@0kkSLvwLN*!y? zs%SpoBoMYTlr{awkq>;6X*HY!X{(UEk4McjY1K5>_3z)^zh@8jPKLGoapXGBqSew| z$Naq;{hFZE9!IWo_Nsm?U6ZpMK} zxm`zkq6@MEWyj2`?AEAq%p7k~$4TuXZb8D$J&kJC2JaNy&pk2`q*0Z~v#Sc`VnuVB zGG$)OS?h~%lDs?^ReFN)!LWt{Dc@#ITh*LocMu4G&~-55rl?gu7ti(nvLrAS94qP1u>mO*2h_lXXS;a2THs5>T< z-n|ADGfiOKiY`Iq;;!BDh^=zSeGU=p8MlfnswHP{Oh9WUXDYu~<>hii{Q&OlDGzR6 zjBuqpk5V~_w>u^ZR(Y8!wBb3y%Rcny9 zRg^cNQF67ClrO?Crmfr}ToXB*AIXPdi>lx&-z6AUK+d|=Yrqp;WHOR^J$g?}Y(^?t z`-vtlJ33Te<5W2cms9|?QgAS_ZS|JRTcmI$cyjLJH- zn@MNesx6i$Wj(v7`aDujj9a}$bi@uq5Q+2AgLa0k)IxcZ4;!i~&0&F*}(5uRx)Ct-BA z)CP)CrJE+5bG?rzY$k$VgmLSxln!*~D{d3(Hn8j5rJcAYH%Xm9{ic{oJaIcqko9iR zP{w)#aXx|jE2nei%~q9Z-y|c~YPLf2Ruvg*;xOJTz&Bm^8LP_jL+z2JXVd8n=Z0)6 z?d!~2FTk^JH5cPq!Muggmz<}nH8F1W8r-8&5SLL|Hz*Jl^N(lUDlSDUg=zuQ0_nOh zDqdqWJ^NO5(Qt08Jd;M%wzV>;vuw3i^QASoPu#m{K8V|>F=UN`SwX_eFO~0b7He`W zI}->;<)Rp2YurknQrDiGge`9D7um46wnRebOZ~YtWy5?+E9v-RMkLL8H?0tKtP=pg*T*N_FVJZ}ZaS+{x%58~}~=_)B|5ML{1tzoOw zaFBOam)GwRZT9Rnt!LBI8O!~TYd&59tP)oCWIPM!ld5bvsojK#HEVl`R6P^Z%P6*|(ZY^273?G0vFzMQ%YJzn=cNYlja$W~GE{|NSsyXtM)TSGQGr#fwFvj_^Q~#&d{sny z%tlDwwN`1C#Tm6SOY#$VDPDexFCh+!-#m@{ee+gxVWm1ID$$}!g050qwN+G;Zoy&O zZS*Vdd&M+Vkz?|5CF_aBhjKFm!|3dXTUq8~`XRAw#g@BA<)hW8WKG6p6^D!|^Hz2# zo*yX`hX?SsvM`uYXWPSt7K`wZh8yn%c7$WMWBE4k2akMPyzW3AiTwL%CRD#t7&kld{6br0!6KQLsZrmn*+fR( zmly;oswS#6w8g7or}4^Tt8;SMghiFUY!aASD#320lP0p^zJw}=G3;o$YB!elYyg%` z6ejTA)=EQbok^?c>S^LeYl0|l$QXreGRASWFB{8wf6AxW|t`Og`) zQp+)(!_Z);(s-vzlOLCWp=m3*%t~VYEHxcarK>zAMPu0tF2aIzc@oasJb<%q^&0S` z(&%U2S_aR))m&Vd7{FPD!ohG0U&PdZl?C*~rj=O;4Q8>q*H|?&rnTz}m6d>~sV4LpJx+{Uz2)vv`M52rR+)onxXyT5sEiVi?MTIua4;2hIAE?`NTh5m zEQMb%S2oJst@A&O42)YzBy_0+pVTu~R;&3)Ok1^v$pWf?@-_2$s{=gyR&(uSp@jEp z7beh5Rvs$P$Ao=F5$lChCfS(^YKN$vMvX#itXh%9*l0eKFWU!M<%F(nJZ7JsOH5jo zg_A|hcNW8`x%sGptX(U#bh5}z!~@v2pPHVFs)TAqop0PqHWah@Qia{CQQhfUg~79J z^;Q&fV_EJc8_->U1E?vQ60pjviaG2D95S1bWGy?$oDp4|+4D@fX{)-Vn8T9) zM0sr!m7=x7nizMArCjA{l&B=Fk%xTSR)NG2Qhv!53L6kQ^Z}NRR_;v&_?YNuSN+}=A}CFja$VAY0SzO3Ff7CU^{6{ zr{v1c!q1gq2@vzbh-0QF%8~I4F!xvMf8zr(}?!aMehq{XJ27wFhH~aT}}9 z8?SJ6#JuTQ<5q708K3`j(*`ZA+#SAl%( zs6rC2Z6&NSax6D1R5;)pHKPzOoI2sVv@|_f8Y82 z=0zh)i5Rvz3s5JfFBOQY;l0+dVqK?ptEd1_`d%#O#kDOs#p+Y6@4=UV5Z)>N}rX36v< zryu?|i)+4ZE7)*kl)JmjrsASz!3sg zhZph$9TcNi7JX4QMx>q?x8YlQ)Zbm{w`=p(yaWnXcQK!`{}-N0iCXZBY10z(R&mi$ zyAI)pGOB^8(U>{IR;pn}4r`QMd^8_J7SFVmTWOvpz6=UO)WAM*Td`p)6R^@6(z5&- zRVCMI;f$)EU8j#N?lVkGG6YjgQ@N?9^tu%uJ2qDwhn* z$$e|3JErb9cJknKYT4w%*-i4dYH?L-4!8SFjAU40WOmaCtSujE%ueQ;vV-WwWrsqq zHqLH0bfpUGn$=3CYw#8v-z{Z2vNM>Fhs;WKFvfLst`Y<}psA*ibEi`0HtQ3F$BGpu z7+sltx$Gn**Qn%VK0AoX-}0*qw$)Viow_h~w`VXQ&NT0C&)i_Faxf0T#VS|~4|i>- zDN`I#;}>;j;Y|d|Eue_h;Bur%ZRTFojcvW3;_OZR3(4%qygh$-~{$WNBAZ6Y_d#%jC?| zXklVYp*YgCy(#5P6;|(tolG+g`2kpx{5o7)yfj9@mX&2RUh?fOGj?%tQ;B<9{2F?5 zEz9aiJ-(>L*znVFD3>~1Rx=&xLJcl$!QZ}LHFFFVQiI;wM&ZI4#oxYBjaV8D4{+6t zSaG6e*SFAprkESS&dcJAWbYEXX_)@bxG6z5UKw#`k}o74%?Uef{*c
+ + +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/_modules/pybtc/address.html b/docs/build/html/_modules/pybtc/address.html new file mode 100644 index 0000000..8dd34be --- /dev/null +++ b/docs/build/html/_modules/pybtc/address.html @@ -0,0 +1,337 @@ + + + + + + + + pybtc.address — pybtc documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for pybtc.address

+from .tools import *
+
+
+
[docs]class PrivateKey(): + """ + The class for creating private key object. + + :param key: (optional) private key in HEX, bytes string or WIF format. In case no key specified + new random private key will be created. + :param compressed: (optional) if set to True private key corresponding compressed public key, + by default set to True. Recommended use only compressed public key. + :param testnet: (optional) if set to True mean that this private key for testnet Bitcoin network. + + """ + def __init__(self, key=None, compressed=True, testnet=False): + + if key is None: + + #: flag for compressed type of corresponding public key (boolean) + self.compressed = compressed + #: flag for testnet network private key (boolean) + self.testnet = testnet + + #: private key in bytes (bytes) + self.key = create_private_key(wif=False) + #: private key in HEX (string) + self.hex = hexlify(self.key).decode() + #: private key in WIF format (string) + self.wif = private_key_to_wif(self.key, compressed, testnet) + + else: + if isinstance(key, str): + try: + key = unhexlify(key) + except: + pass + if isinstance(key, bytes): + if len(key) != 32: + raise TypeError("private key invalid length") + self.key = key + self.compressed = compressed + self.testnet = testnet + self.hex = hexlify(self.key).decode() + self.wif = private_key_to_wif(self.key, compressed, testnet) + return + assert isinstance(key, str) + self.key = wif_to_private_key(key, hex=False) + self.hex = hexlify(self.key).decode() + self.wif = private_key_to_wif(self.key, compressed, testnet) + if key[0] in (MAINNET_PRIVATE_KEY_UNCOMPRESSED_PREFIX, + TESTNET_PRIVATE_KEY_UNCOMPRESSED_PREFIX): + self.compressed = False + else: + self.compressed = True + if key[0] in (TESTNET_PRIVATE_KEY_UNCOMPRESSED_PREFIX, + TESTNET_PRIVATE_KEY_COMPRESSED_PREFIX): + self.testnet = True + else: + self.testnet = False + + def __str__(self): + return self.wif
+ + +
[docs]class PublicKey(): + """ + The class for public key object. + + :param key: one of this types allowed: + + - private key is instance of ``PrivateKey`` class + - private key HEX encoded string + - private key 32 bytes string + - private key in WIF format + - public key in HEX encoded string + - public key [33/65] bytes string + + In case no key specified with HEX or bytes string you have to provide flag for testnet + and compressed key. WIF format and ``PrivateKey`` instance already contain this flags. + For HEX or bytes public key only testnet flag has the meaning, comressed flag is determined + according to the length of key. + + :param compressed: (optional) if set to True private key corresponding compressed public key, + by default set to True. Recommended use only compressed public key. + :param testnet: (optional) if set to True mean that this private key for testnet Bitcoin network. + + """ + def __init__(self, key, compressed=True, testnet=False): + if isinstance(key, str): + try: + key = unhexlify(key) + except: + if is_wif_valid(key): + key = PrivateKey(key) + + if isinstance(key, bytes): + if len(key) == 32: + key = PrivateKey(key, compressed=compressed, testnet=testnet) + elif is_public_key_valid(key): + public_key = key + self.testnet = testnet + self.compressed = True if len(key) == 33 else False + else: + raise TypeError("key invalid") + + if isinstance(key, PrivateKey): + #: flag for testnet network private key (boolean) + self.testnet = key.testnet + #: flag for compressed type of corresponding public key (boolean) + self.compressed = key.compressed + public_key = private_to_public_key(key.key, + compressed=key.compressed, + hex=False) + #: public key in bytes (bytes) + self.key = public_key + #: public key in HEX (string) + self.hex = hexlify(self.key).decode() + + def __str__(self): + return self.hex
+ + +
[docs]class Address(): + """ + The class for Address object. + + :param key: (optional) one of this types allowed: + + - private key WIF format + - instance of ``PrivateKey`` + - private key HEX encoded string + - instance of ``PublicKey`` + + In case no key specified new Address will be created with random keys. + :param address_type: (optional) P2PKH, PUBKEY, P2WPKH, P2SH_P2WPKH, by default P2WPKH. + :param compressed: (optional) if set to True private key corresponding compressed public key, + by default set to True. Recommended use only compressed public key. + :param testnet: (optional) if set to True mean that this private key for testnet Bitcoin network. + + In case instanse is created from WIF private key, ``PrivateKey`` or ``PublicKey`` compressed and testnet flags + already contain in initial key parameter and will be ignored. + """ + def __init__(self, key=None, + address_type="P2WPKH", testnet=False, compressed=True): + if key is None: + #: instance of ``PrivateKey`` class + self.private_key = PrivateKey(testnet=testnet, + compressed=compressed) + #: instance of ``PublicKey`` class + self.public_key = PublicKey(self.private_key) + #: flag for testnet network address (boolean) + self.testnet = testnet + if isinstance(key, str) or isinstance(key, bytes): + key = PrivateKey(key, testnet=testnet, compressed=compressed) + if isinstance(key, PrivateKey): + self.private_key = key + self.testnet = key.testnet + compressed = key.compressed + self.public_key = PublicKey(self.private_key) + elif isinstance(key, PublicKey): + self.public_key = key + self.testnet = testnet + compressed = key.compressed + if address_type not in ("P2PKH", "PUBKEY", "P2WPKH", "P2SH_P2WPKH"): + raise TypeError("address type invalid") + if not compressed: + if address_type not in ("P2PKH", "PUBKEY", "P2SH"): + raise TypeError("compressed public key invalid") + #: flag for testnet network address (boolean) + self.type = address_type + + if address_type in ("P2WPKH"): + #: version of witness program for SEGWIT address (string) + self.witness_version = 0 + else: + self.witness_version = None + self.compressed = compressed + if address_type == "P2SH_P2WPKH": + #: flag for script hash address (boolean) + self.script_hash = True + #: redeeem script, only for P2SH_P2WPKH (bytes) + self.redeem_script = public_key_to_p2sh_p2wpkh_script(self.public_key.key) + #: redeeem script HEX, only for P2SH_P2WPKH (string) + self.redeem_script_hex = hexlify(self.redeem_script).decode() + #: address hash + self.hash = hash160(self.redeem_script) + self.witness_version = None + else: + self.script_hash = False + self.hash = hash160(self.public_key.key) + #: address hash HEX (string) + self.hash_hex = hexlify(self.hash).decode() + #: address in base58 or bech32 encoding (string) + self.address = hash_to_address(self.hash, + script_hash=self.script_hash, + witness_version=self.witness_version, + testnet=self.testnet) + + def __str__(self): + return self.address
+ + +class ScriptAddress(): + def __init__(self, script, address_type="P2SH", + testnet=False, witness_version=None): + self.witness_version = witness_version + self.testnet = testnet + if isinstance(script, str): + script = unhexlify(script) + self.script = script + self.script_hex = hexlify(self.script).decode() + self.hash = hash160(self.script) + self.script_opcodes = decode_script(self.script) + self.script_opcodes_asm = decode_script(self.script, 1) + self.address = hash_to_address(self.hash, + script_hash=True, + witness_version=self.witness_version, + testnet=self.testnet) + +
+ +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/_modules/pybtc/block.html b/docs/build/html/_modules/pybtc/block.html new file mode 100644 index 0000000..0c995c0 --- /dev/null +++ b/docs/build/html/_modules/pybtc/block.html @@ -0,0 +1,146 @@ + + + + + + + + pybtc.block — pybtc documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for pybtc.block

+from .tools import *
+from .transaction import Transaction
+from struct import pack, unpack
+
+
+
[docs]class Block(dict): + def __init__(self, block): + s = get_stream(block) + self["header"] = s.read(80) + self["hash"] = double_sha256(self["header"]) + self["version"] = unpack("<L", s.read(4)) + self["previousBlockHash"] = s.read(32) + self["merkleRoot"] = s.read(32) + self["time"] = unpack("<L", s.read(4)) + self["bits"] = s.read(4), + self["nonce"] = unpack("<L", s.read(4)) + s.seek(-80, 1) + # self["tx"] = {i: Transaction(s) + # for i in range(var_int_to_int(read_var_int(s)))} + self["weight"] = 0 + self["size"] = 0 + self["strippedSize"] = 0 + self["height"] = 0 + self["difficulty"] = 0 + self["targetDifficulty"] = 0 + self["target"] = 0
+ + +
+ +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/_modules/pybtc/tools.html b/docs/build/html/_modules/pybtc/tools.html new file mode 100644 index 0000000..a04bb64 --- /dev/null +++ b/docs/build/html/_modules/pybtc/tools.html @@ -0,0 +1,1423 @@ + + + + + + + + pybtc.tools — pybtc documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for pybtc.tools

+import time
+import struct
+from secp256k1 import ffi
+from .constants import *
+from .opcodes import *
+from .hash import *
+from .encode import *
+import math
+import io
+
+
+# Key management
+
+
[docs]def create_private_key(compressed=True, testnet=False, wif=True, hex=False): + """ + Create private key + + :param compressed: (optional) Type of public key, by default set to compressed. + Using uncompressed public keys is deprecated in new SEGWIT addresses, + use this option only for backward compatibility. + :param testnet: (optional) flag for testnet network, by default is False. + :param wif: (optional) If set to True return key in WIF format, by default is True. + :param hex: (optional) If set to True return key in HEX format, by default is False. + :return: Private key in wif format (default), hex encoded byte string in case of hex flag or + raw bytes string in case wif and hex flags set to False. + + """ + a = random.SystemRandom().randint(0, MAX_INT_PRIVATE_KEY) + i = int((time.time() % 0.01)*100000) + h = a.to_bytes(32, byteorder="big") + # more entropy from system timer and sha256 derivation + while i: + h = hashlib.sha256(h).digest() + i -= 1 + if not i and int.from_bytes(h, byteorder="big") > MAX_INT_PRIVATE_KEY: + i += 1 + if wif: + return private_key_to_wif(h, compressed=compressed, testnet=testnet) + elif hex: + return hexlify(h).decode() + return h
+ + +
[docs]def private_key_to_wif(h, compressed=True, testnet=False): + """ + Encode private key in HEX or RAW bytes format to WIF format. + + :param h: private key 32 byte string or HEX encoded string. + :param compressed: (optional) flag of public key compressed format, by default set to True. + :param testnet: (optional) flag for testnet network, by default is False. + :return: Private key in WIF format. + """ + # uncompressed: 0x80 + [32-byte secret] + [4 bytes of Hash() of previous 33 bytes], base58 encoded. + # compressed: 0x80 + [32-byte secret] + 0x01 + [4 bytes of Hash() previous 34 bytes], base58 encoded. + if isinstance(h, str): + h = unhexlify(h) + if len(h) != 32 and isinstance(h, bytes): + raise TypeError("private key must be a 32 bytes or hex encoded string") + if testnet: + h = TESTNET_PRIVATE_KEY_BYTE_PREFIX + h + else: + h = MAINNET_PRIVATE_KEY_BYTE_PREFIX + h + if compressed: + h += b'\x01' + h += double_sha256(h)[:4] + return encode_base58(h)
+ + +
[docs]def wif_to_private_key(h, hex=True): + """ + Decode WIF private key to bytes string or HEX encoded string + + :param hex: (optional) if set to True return key in HEX format, by default is True. + :return: Private key HEX encoded string or raw bytes string. + """ + if not is_wif_valid(h): + raise TypeError("invalid wif key") + h = decode_base58(h) + if hex: + return hexlify(h[1:33]).decode() + return h[1:33]
+ + +
[docs]def is_wif_valid(wif): + """ + Check is private key in WIF format string is valid. + + :param wif: private key in WIF format string. + :return: boolean. + """ + if not isinstance(wif, str): + raise TypeError("invalid wif key") + if wif[0] not in PRIVATE_KEY_PREFIX_LIST: + return False + try: + h = decode_base58(wif) + except: + return False + checksum = h[-4:] + if wif[0] in (MAINNET_PRIVATE_KEY_UNCOMPRESSED_PREFIX, + TESTNET_PRIVATE_KEY_UNCOMPRESSED_PREFIX): + if len(h) != 37: + return False + elif len(h) != 38: + return False + if double_sha256(h[:-4])[:4] != checksum: + return False + return True
+ + +
[docs]def private_to_public_key(private_key, compressed=True, hex=True): + """ + Get public key from private key using ECDSA secp256k1 + + :param private_key: private key in WIF, HEX or bytes. + :param compressed: (optional) flag of public key compressed format, by default set to True. + In case private_key in WIF format, this flag is set in accordance with + the key format specified in WIF string. + :param hex: (optional) if set to True return key in HEX format, by default is True. + :return: 33/65 bytes public key in HEX or bytes string. + """ + if not isinstance(private_key, bytes): + if isinstance(private_key, bytearray): + private_key = bytes(private_key) + elif isinstance(private_key, str): + if not is_wif_valid(private_key): + private_key = unhexlify(private_key) + else: + if private_key[0] in (MAINNET_PRIVATE_KEY_UNCOMPRESSED_PREFIX, + TESTNET_PRIVATE_KEY_UNCOMPRESSED_PREFIX): + compressed = False + private_key = wif_to_private_key(private_key, hex=0) + else: + raise TypeError("private key must be a bytes or WIF or hex encoded string") + pubkey_ptr = ffi.new('secp256k1_pubkey *') + r = secp256k1.secp256k1_ec_pubkey_create(ECDSA_CONTEXT_ALL, pubkey_ptr, private_key) + if not r: + raise RuntimeError("secp256k1 error") + len_key = 33 if compressed else 65 + pubkey = ffi.new('char [%d]' % len_key) + outlen = ffi.new('size_t *', len_key) + compflag = EC_COMPRESSED if compressed else EC_UNCOMPRESSED + r = secp256k1.secp256k1_ec_pubkey_serialize(ECDSA_CONTEXT_VERIFY, pubkey, outlen, pubkey_ptr, compflag) + pub = bytes(ffi.buffer(pubkey, len_key)) + if not r: + raise RuntimeError("secp256k1 error") + return hexlify(pub).decode() if hex else pub
+ + +
[docs]def is_public_key_valid(key): + """ + Check public key is valid. + + :param key: public key in HEX or bytes string format. + :return: boolean. + """ + if isinstance(key, str): + key = unhexlify(key) + if len(key) < 33: + return False + if key[0] == 0x04 and len(key) != 65: + return False + elif key[0] == 0x02 or key[0] == 0x03: + if len(key) != 33: + return False + return True
+ + +# Addresses + +
[docs]def hash_to_address(address_hash, testnet=False, script_hash=False, witness_version=0): + """ + Get address from public key/script hash. In case PUBKEY, P2PKH, P2PKH public key/script hash is SHA256+RIPEMD160, + P2WSH script hash is SHA256. + + + :param address_hash: public key hash or script hash in HEX or bytes string format. + :param testnet: (optional) flag for testnet network, by default is False. + :param script_hash: (optional) flag for script hash (P2SH address), by default is False. + :param witness_version: (optional) witness program version, by default is 0, for legacy + address format use None. + :return: address in base58 or bech32 format. + """ + if isinstance(address_hash, str): + address_hash = unhexlify(address_hash) + if not isinstance(address_hash, bytes): + raise TypeError("address hash must be HEX encoded string or bytes") + + if not script_hash: + if witness_version is None: + if len(address_hash) != 20: + raise TypeError("address hash length incorrect") + if testnet: + prefix = TESTNET_ADDRESS_BYTE_PREFIX + else: + prefix = MAINNET_ADDRESS_BYTE_PREFIX + address_hash = prefix + address_hash + address_hash += double_sha256(address_hash)[:4] + return encode_base58(address_hash) + else: + if len(address_hash) not in (20, 32): + raise TypeError("address hash length incorrect") + + if witness_version is None: + if testnet: + prefix = TESTNET_SCRIPT_ADDRESS_BYTE_PREFIX + else: + prefix = MAINNET_SCRIPT_ADDRESS_BYTE_PREFIX + address_hash = prefix + address_hash + address_hash += double_sha256(address_hash)[:4] + return encode_base58(address_hash) + + if testnet: + prefix = TESTNET_SEGWIT_ADDRESS_BYTE_PREFIX + hrp = TESTNET_SEGWIT_ADDRESS_PREFIX + else: + prefix = MAINNET_SEGWIT_ADDRESS_BYTE_PREFIX + hrp = MAINNET_SEGWIT_ADDRESS_PREFIX + + address_hash = witness_version.to_bytes(1, "big") + rebase_8_to_5(address_hash) + checksum = bech32_polymod(prefix + address_hash + b"\x00" * 6) + checksum = rebase_8_to_5(checksum.to_bytes(5, "big"))[2:] + return "%s1%s" % (hrp, rebase_5_to_32(address_hash + checksum).decode())
+ + +
[docs]def public_key_to_address(pubkey, testnet=False, p2sh_p2wpkh=False, witness_version=0): + """ + Get address from public key/script hash. In case PUBKEY, P2PKH, P2PKH public key/script hash is SHA256+RIPEMD160, + P2WSH script hash is SHA256. + + :param pubkey: public key HEX or bytes string format. + :param testnet: (optional) flag for testnet network, by default is False. + :param p2sh_p2wpkh: (optional) flag for P2WPKH inside P2SH address, by default is False. + :param witness_version: (optional) witness program version, by default is 0, for legacy + address format use None. + :return: address in base58 or bech32 format. + """ + if isinstance(pubkey, str): + pubkey = unhexlify(pubkey) + if not isinstance(pubkey, bytes): + raise TypeError("public key invalid") + if p2sh_p2wpkh: + if len(pubkey) != 33: + raise TypeError("public key invalid") + h = hash160(b'\x00\x14' + hash160(pubkey)) + witness_version = None + else: + if witness_version is not None: + if len(pubkey) != 33: + raise TypeError("public key invalid") + h = hash160(pubkey) + return hash_to_address(h, testnet=testnet, + script_hash=p2sh_p2wpkh, + witness_version=witness_version)
+ + +
[docs]def address_to_hash(address, hex=True): + """ + Get address hash from base58 or bech32 address format. + + :param address: address in base58 or bech32 format. + :param hex: (optional) If set to True return key in HEX format, by default is True. + :return: script in HEX or bytes string. + """ + if address[0] in ADDRESS_PREFIX_LIST: + h = decode_base58(address)[1:-4] + elif address[:2] in (MAINNET_SEGWIT_ADDRESS_PREFIX, + TESTNET_SEGWIT_ADDRESS_PREFIX): + address = address.split("1")[1] + h = rebase_5_to_8(rebase_32_to_5(address)[1:-6], False) + else: + return None + return h.hex() if hex else h
+ + +
[docs]def address_type(address, num=False): + """ + Get address type. + + :param address: address in base58 or bech32 format. + :param num: (optional) If set to True return type in numeric format, by default is False. + :return: address type in string or numeric format. + """ + if address[0] in (TESTNET_SCRIPT_ADDRESS_PREFIX, + MAINNET_SCRIPT_ADDRESS_PREFIX): + t = 'P2SH' + elif address[0] in (MAINNET_ADDRESS_PREFIX, + TESTNET_ADDRESS_PREFIX, + TESTNET_ADDRESS_PREFIX_2): + t = 'P2PKH' + elif address[:2] in (MAINNET_SEGWIT_ADDRESS_PREFIX, + TESTNET_SEGWIT_ADDRESS_PREFIX): + if len(address) == 42: + t = 'P2WPKH' + elif len(address) == 62: + t = 'P2WSH' + else: + return SCRIPT_TYPES['NON_STANDARD'] if num else 'UNKNOWN' + else: + return SCRIPT_TYPES['NON_STANDARD'] if num else 'UNKNOWN' + return SCRIPT_TYPES[t] if num else t
+ + +def address_net_type(address): + """ + Get address network type. + + :param address: address in base58 or bech32 format. + :return: address network type in string format or None. + """ + if address[0] in (MAINNET_SCRIPT_ADDRESS_PREFIX, + MAINNET_ADDRESS_PREFIX): + return "mainnet" + elif address[:2] == MAINNET_SEGWIT_ADDRESS_PREFIX: + return "mainnet" + elif address[0] in (TESTNET_SCRIPT_ADDRESS_PREFIX, + TESTNET_ADDRESS_PREFIX, + TESTNET_ADDRESS_PREFIX_2): + return "testnet" + elif address[:2] == TESTNET_SEGWIT_ADDRESS_PREFIX: + return "testnet" + return None + + +
[docs]def address_to_script(address, hex=False): + """ + Get public key script from address. + + :param address: address in base58 or bech32 format. + :param hex: (optional) If set to True return key in HEX format, by default is True. + :return: public key script in HEX or bytes string. + """ + if address[0] in (TESTNET_SCRIPT_ADDRESS_PREFIX, + MAINNET_SCRIPT_ADDRESS_PREFIX): + s = [BYTE_OPCODE["OP_HASH160"], + b'\x14', + address_to_hash(address, hex=False), + BYTE_OPCODE["OP_EQUAL"]] + elif address[0] in (MAINNET_ADDRESS_PREFIX, + TESTNET_ADDRESS_PREFIX, + TESTNET_ADDRESS_PREFIX_2): + s = [BYTE_OPCODE["OP_DUP"], + BYTE_OPCODE["OP_HASH160"], + b'\x14', + address_to_hash(address, hex=False), + BYTE_OPCODE["OP_EQUALVERIFY"], + BYTE_OPCODE["OP_CHECKSIG"]] + elif address[:2] in (TESTNET_SEGWIT_ADDRESS_PREFIX, + MAINNET_SEGWIT_ADDRESS_PREFIX): + h = address_to_hash(address, hex=False) + s = [BYTE_OPCODE["OP_0"], + bytes([len(h)]), + h] + else: + raise TypeError("address invalid") + s = b''.join(s) + return hexlify(s).decode() if hex else s
+ + +def public_key_to_p2sh_p2wpkh_script(pubkey): + if len(pubkey) != 33: + raise TypeError("public key len invalid") + return b'\x00\x14%s' % hash160(pubkey) + + +
[docs]def is_address_valid(address, testnet=False): + """ + Check is address valid. + + :param address: address in base58 or bech32 format. + :param testnet: (optional) flag for testnet network, by default is False. + :return: boolean. + """ + if not address or type(address) != str: + return False + if address[0] in (MAINNET_ADDRESS_PREFIX, + MAINNET_SCRIPT_ADDRESS_PREFIX, + TESTNET_ADDRESS_PREFIX, + TESTNET_ADDRESS_PREFIX_2, + TESTNET_SCRIPT_ADDRESS_PREFIX): + if testnet: + if address[0] not in (TESTNET_ADDRESS_PREFIX, + TESTNET_ADDRESS_PREFIX_2, + TESTNET_SCRIPT_ADDRESS_PREFIX): + return False + else: + if address[0] not in (MAINNET_ADDRESS_PREFIX, + MAINNET_SCRIPT_ADDRESS_PREFIX): + return False + h = decode_base58(address) + if len(h) != 25: + return False + checksum = h[-4:] + if double_sha256(h[:-4])[:4] != checksum: + return False + return True + elif address[:2].lower() in (TESTNET_SEGWIT_ADDRESS_PREFIX, + MAINNET_SEGWIT_ADDRESS_PREFIX): + if len(address) not in (42, 62): + return False + try: + prefix, payload = address.split('1') + except: + return False + upp = True if prefix[0].isupper() else False + for i in payload[1:]: + if upp: + if not i.isupper() or i not in base32charset_upcase: + return False + else: + if i.isupper() or i not in base32charset: + return False + payload = payload.lower() + prefix = prefix.lower() + if testnet: + if prefix != TESTNET_SEGWIT_ADDRESS_PREFIX: + return False + stripped_prefix = TESTNET_SEGWIT_ADDRESS_BYTE_PREFIX + else: + if prefix != MAINNET_SEGWIT_ADDRESS_PREFIX: + return False + stripped_prefix = MAINNET_SEGWIT_ADDRESS_BYTE_PREFIX + d = rebase_32_to_5(payload) + address_hash = d[:-6] + checksum = d[-6:] + checksum2 = bech32_polymod(stripped_prefix + address_hash + b"\x00" * 6) + checksum2 = rebase_8_to_5(checksum2.to_bytes(5, "big"))[2:] + if checksum != checksum2: + return False + return True
+ + +def get_witness_version(address): + address = address.split("1")[1] + h = rebase_32_to_5(address) + return h[0] + + +# Script + +
[docs]def parse_script(script, segwit=True): + """ + Parse script and return script type, script address and required signatures count. + + :param script: script in bytes string or HEX encoded string format. + :param segwit: (optional) If set to True recognize P2WPKH and P2WSH sripts, by default set to True. + + :return: dictionary: + + - nType - numeric script type + - type - script type + - addressHash - address hash in case address recognized + - script - script if no address recognized + - reqSigs - required signatures count + """ + if not script: + return {"nType": 7, "type": "NON_STANDARD", "reqSigs": 0, "script": b""} + if type(script) == str: + try: + script = unhexlify(script) + except: + pass + assert type(script) == bytes + l = len(script) + if segwit: + if l == 22 and script[0] == 0: + return {"nType": 5, "type": "P2WPKH", "reqSigs": 1, "addressHash": script[2:]} + if l == 34 and script[0] == 0: + return {"nType": 6, "type": "P2WSH", "reqSigs": None, "addressHash": script[2:]} + if l == 25 and \ + script[:2] == b"\x76\xa9" and \ + script[-2:] == b"\x88\xac": + return {"nType": 0, "type": "P2PKH", "reqSigs": 1, "addressHash": script[3:-2]} + if l == 23 and \ + script[0] == 169 and \ + script[-1] == 135: + return {"nType": 1, "type": "P2SH", "reqSigs": None, "addressHash": script[2:-1]} + if l == 67 and script[-1] == 172: + return {"nType": 2, "type": "PUBKEY", "reqSigs": 1, "addressHash": hash160(script[1:-1])} + if l == 35 and script[-1] == 172: + return {"nType": 2, "type": "PUBKEY", "reqSigs": 1, "addressHash": hash160(script[1:-1])} + if script[0] == 106 and l > 1 and l <= 82: + if script[1] == l - 2: + return {"nType": 3, "type": "NULL_DATA", "reqSigs": 0, "data": script[2:]} + if script[0] >= 81 and script[0] <= 96: + if script[-1] == 174: + if script[-2] >= 81 and script[-2] <= 96: + if script[-2] >= script[0]: + c, s = 0, 1 + while l - 2 - s > 0: + if script[s] < 0x4c: + s += script[s] + c += 1 + else: + c = 0 + break + s += 1 + if c == script[-2] - 80: + return {"nType": 4, "type": "MULTISIG", "reqSigs": script[0] - 80, "script": script} + + s, m, n, last, req_sigs = 0, 0, 0, 0, 0 + while l - s > 0: + if script[s] >= 81 and script[s] <= 96: + if not n: + n = script[s] - 80 + else: + if m == 0: + n, m = script[s] - 80, 0 + elif n > m: + n, m = script[s] - 80, 0 + elif m == script[s] - 80: + last = 0 if last else 2 + elif script[s] < 0x4c: + s += script[s] + m += 1 + if m > 16: + n, m = 0, 0 + elif script[s] == OPCODE["OP_PUSHDATA1"]: + try: + s += 1 + script[s + 1] + except: + break + elif script[s] == OPCODE["OP_PUSHDATA2"]: + try: + s += 2 + struct.unpack('<H', script[s: s + 2])[0] + except: + break + elif script[s] == OPCODE["OP_PUSHDATA4"]: + try: + s += 4 + struct.unpack('<L', script[s: s + 4])[0] + except: + break + else: + if script[s] == OPCODE["OP_CHECKSIG"]: + req_sigs += 1 + elif script[s] == OPCODE["OP_CHECKSIGVERIFY"]: + req_sigs += 1 + elif script[s] in (OPCODE["OP_CHECKMULTISIG"], OPCODE["OP_CHECKMULTISIGVERIFY"]): + if last: + req_sigs += n + else: + req_sigs += 20 + n, m = 0, 0 + if last: + last -= 1 + s += 1 + return {"nType": 7, "type": "NON_STANDARD", "reqSigs": req_sigs, "script": script}
+ + +
[docs]def decode_script(script, asm=False): + """ + Decode script to ASM format or to human readable OPCODES string. + + :param script: script in bytes string or HEX encoded string format. + :param asm: (optional) If set to True decode to ASM fromat, by default set to False. + :return: script in ASM format string or OPCODES string. + """ + if isinstance(script, str): + try: + script = unhexlify(script) + except: + pass + if not isinstance(script, bytes): + raise TypeError("script invalid") + l = len(script) + s = 0 + result = [] + while l - s > 0: + if script[s] < 0x4c and script[s]: + if asm: + result.append(hexlify(script[s + 1:s + 1 + script[s]]).decode()) + else: + result.append('[%s]' % script[s]) + s += script[s] + 1 + continue + elif script[s] == OPCODE["OP_PUSHDATA1"]: + s += 1 + script[s + 1] + elif script[s] == OPCODE["OP_PUSHDATA2"]: + s += 2 + struct.unpack('<H', script[s: s + 2]) + elif script[s] == OPCODE["OP_PUSHDATA4"]: + s += 4 + struct.unpack('<L', script[s: s + 4]) + result.append(RAW_OPCODE[script[s]]) + s += 1 + return ' '.join(result)
+ + +
[docs]def delete_from_script(script, sub_script): + """ + Decode OPCODE or subscript from script. + + :param script: traget script in bytes or HEX encoded string. + :param sub_script: sub_script which is necessary to remove from target script in bytes or HEX encoded string. + :return: script in bytes or HEX encoded string corresponding to the format of target script. + """ + if not sub_script: + return script + s_hex = False + if isinstance(script, str): + try: + script = unhexlify(script) + s_hex = True + except: + pass + if isinstance(sub_script, str): + try: + sub_script = unhexlify(sub_script) + except: + pass + + if not isinstance(script, bytes): + raise TypeError("script invalid") + if not isinstance(sub_script, bytes): + raise TypeError("sub_script invalid") + + l = len(script) + ls = len(sub_script) + s = 0 + k = 0 + stack = [] + result = [] + while l - s > 0: + if script[s] < 0x4c and script[s]: + stack.append(script[s] + 1) + s += script[s] + 1 + elif script[s] == OPCODE["OP_PUSHDATA1"]: + stack.append(1 + script[s + 1]) + s += 1 + script[s + 1] + elif script[s] == OPCODE["OP_PUSHDATA2"]: + stack.append(2 + struct.unpack('<H', script[s: s + 2])) + s += 2 + struct.unpack('<H', script[s: s + 2]) + elif script[s] == OPCODE["OP_PUSHDATA4"]: + stack.append(4 + struct.unpack('<L', script[s: s + 4])) + s += 4 + struct.unpack('<L', script[s: s + 4]) + else: + stack.append(1) + s += 1 + if s - k >= ls: + if script[k:s][:ls] == sub_script: + if s - k > ls: + result.append(script[k + ls:s]) + t = 0 + while t != s - k: + t += stack.pop(0) + k = s + else: + t = stack.pop(0) + result.append(script[k:k + t]) + k += t + if script[k:s][:ls] == sub_script: + if s - k > ls: + result.append(script[k + ls:s]) + else: + result.append(script[k:k + ls]) + + return b''.join(result) if not s_hex else hexlify(b''.join(result)).decode()
+ + +
[docs]def script_to_hash(script, witness=False, hex=True): + """ + Encode script to hash HASH160 or SHA256 in dependency of the witness. + + :param script: script in bytes or HEX encoded string. + :param witness: (optional) If set to True return SHA256 hash for P2WSH, by default is False. + :param hex: (optional) If set to True return key in HEX format, by default is True. + :param sub_script: sub_script which is necessary to remove from target script in bytes or HEX encoded string. + :return: script in bytes or HEX encoded string corresponding to the format of target script. + """ + if isinstance(script, str): + s = unhexlify(script) + if witness: + return sha256(script, hex) + else: + return hash160(script, hex)
+ + +# Signatures + +
[docs]def verify_signature(sig, pub_key, msg): + """ + Verify signature for message and given public key + + :param sig: signature in bytes or HEX encoded string. + :param pub_key: public key in bytes or HEX encoded string. + :param msg: message in bytes or HEX encoded string. + :return: boolean. + """ + if not isinstance(sig, bytes): + if isinstance(sig, bytearray): + sig = bytes(sig) + elif isinstance(sig, str): + sig = unhexlify(sig) + else: + raise TypeError("signature must be a bytes or hex encoded string") + if not isinstance(pub_key, bytes): + if isinstance(pub_key, bytearray): + pub_key = bytes(pub_key) + elif isinstance(pub_key, str): + pub_key = unhexlify(pub_key) + else: + raise TypeError("public key must be a bytes or hex encoded string") + if not isinstance(msg, bytes): + if isinstance(msg, bytearray): + msg = bytes(msg) + elif isinstance(msg, str): + msg = unhexlify(msg) + else: + raise TypeError("message must be a bytes or hex encoded string") + + raw_sig = ffi.new('secp256k1_ecdsa_signature *') + raw_pubkey = ffi.new('secp256k1_pubkey *') + if not secp256k1.secp256k1_ecdsa_signature_parse_der(ECDSA_CONTEXT_VERIFY, raw_sig, sig, len(sig)): + raise TypeError("signature must be DER encoded") + if not secp256k1.secp256k1_ec_pubkey_parse(ECDSA_CONTEXT_VERIFY, raw_pubkey, pub_key, len(pub_key)): + raise TypeError("public key format error") + result = secp256k1.secp256k1_ecdsa_verify(ECDSA_CONTEXT_VERIFY, raw_sig, msg, raw_pubkey) + return True if result else False
+ + +
[docs]def sign_message(msg, private_key, hex=True): + """ + Sign message + + :param msg: message to sign bytes or HEX encoded string. + :param private_key: private key (bytes, hex encoded string or WIF format) + :param hex: (optional) If set to True return key in HEX format, by default is True. + :return: DER encoded signature in bytes or HEX encoded string. + """ + if isinstance(msg, bytearray): + msg = bytes(msg) + if isinstance(msg, str): + try: + msg = unhexlify(msg) + except: + pass + if not isinstance(msg, bytes): + raise TypeError("message must be a bytes or hex encoded string") + + if isinstance(private_key, bytearray): + private_key = bytes(private_key) + if isinstance(private_key, str): + try: + private_key = unhexlify(private_key) + except: + if is_wif_valid(private_key): + private_key = wif_to_private_key(private_key, hex=False) + if not isinstance(private_key, bytes): + raise TypeError("private key must be a bytes, hex encoded string or in WIF format") + + raw_sig = ffi.new('secp256k1_ecdsa_signature *') + signed = secp256k1.secp256k1_ecdsa_sign(ECDSA_CONTEXT_SIGN, raw_sig, msg, + private_key, ffi.NULL, ffi.NULL) + if not signed: + raise RuntimeError("secp256k1 error") + len_sig = 74 + output = ffi.new('unsigned char[%d]' % len_sig) + outputlen = ffi.new('size_t *', len_sig) + res = secp256k1.secp256k1_ecdsa_signature_serialize_der(ECDSA_CONTEXT_SIGN, + output, outputlen, raw_sig) + if not res: + raise RuntimeError("secp256k1 error") + signature = bytes(ffi.buffer(output, outputlen[0])) + return hexlify(signature).decode() if hex else signature
+ + +
[docs]def is_valid_signature_encoding(sig): + """ + Check is valid signature encoded in DER format + + :param sig: signature in bytes or HEX encoded string. + :return: boolean. + """ + # Format: 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S] [sighash] + # * total-length: 1-byte length descriptor of everything that follows, + # excluding the sighash byte. + # * R-length: 1-byte length descriptor of the R value that follows. + # * R: arbitrary-length big-endian encoded R value. It must use the shortest + # possible encoding for a positive integers (which means no null bytes at + # the start, except a single one when the next byte has its highest bit set). + # * S-length: 1-byte length descriptor of the S value that follows. + # * S: arbitrary-length big-endian encoded S value. The same rules apply. + # * sighash: 1-byte value indicating what data is hashed (not part of the DER + # signature) + length = len(sig) + # Minimum and maximum size constraints. + if (length < 9) or (length > 73): + return False + # A signature is of type 0x30 (compound). + if sig[0] != 0x30: + return False + # Make sure the length covers the entire signature. + if sig[1] != (length - 3): + return False + # Extract the length of the R element. + len_r = sig[3] + # Make sure the length of the S element is still inside the signature. + if (5 + len_r) >= length: + return False + # Extract the length of the S element. + len_s = sig[5 + len_r] + # Verify that the length of the signature matches the sum of the length + # of the elements. + if (len_r + len_s + 7) != length: + return False + # Check whether the R element is an integer. + if sig[2] != 0x02: + return False + # Zero-length integers are not allowed for R. + if len_r == 0: + return False + # Negative numbers are not allowed for R. + if sig[4] & 0x80: + return False + # Null bytes at the start of R are not allowed, unless R would + # otherwise be interpreted as a negative number. + if (len_r > 1) and (sig[4] == 0x00) and (not sig[5] & 0x80): + return False + # Check whether the S element is an integer. + if sig[len_r + 4] != 0x02: + return False + # Zero-length integers are not allowed for S. + if len_s == 0: + return False + # Negative numbers are not allowed for S. + if sig[len_r + 6] & 0x80: + return False + # Null bytes at the start of S are not allowed, unless S would otherwise be + # interpreted as a negative number. + if (len_s > 1) and (sig[len_r + 6] == 0x00) and (not sig[len_r + 7] & 0x80): + return False + return True
+ + +# Hash encoding + +
[docs]def rh2s(raw_hash): + """ + Encode raw transaction hash to HEX string with bytes order change + + :param raw_hash: transaction hash in bytes string. + :return: HEX encoded string. + """ + return hexlify(raw_hash[::-1]).decode()
+ + +
[docs]def s2rh(hash_string): + """ + Decode HEX transaction hash to bytes with byte order change + + :param raw_hash: transaction hash in bytes string. + :return: bytes string. + """ + return unhexlify(hash_string)[::-1]
+ + +def s2rh_step4(hash_string): + h = unhexlify(hash_string) + return reverse_hash(h) + + +
[docs]def reverse_hash(raw_hash): + """ + Reverse hash order + + :param raw_hash: bytes string. + :return: bytes string. + """ + return struct.pack('>IIIIIIII', *struct.unpack('>IIIIIIII', raw_hash)[::-1])[::-1]
+ + +# Merkle root + +
[docs]def merkle_root(tx_hash_list, hex=True): + """ + Calculate merkle root from transaction hash list + + :param tx_hash_list: list of transaction hashes in bytes or HEX encoded string. + :param hex: (optional) If set to True return result in HEX format, by default is True. + :return: merkle root in bytes or HEX encoded string corresponding hex flag. + """ + tx_hash_list = [h if isinstance(h, bytes) else s2rh(h) for h in tx_hash_list] + if len(tx_hash_list) == 1: + return tx_hash_list[0] + while True: + new_hash_list = list() + while tx_hash_list: + h1 = tx_hash_list.pop(0) + try: + h2 = tx_hash_list.pop(0) + except: + h2 = h1 + new_hash_list.append(double_sha256(h1 + h2)) + if len(new_hash_list) > 1: + tx_hash_list = new_hash_list + else: + return new_hash_list[0] if not hex else hexlify(new_hash_list[0]).decode()
+ + +
[docs]def merkle_branches(tx_hash_list, hex=True): + """ + Calculate merkle branches for coinbase transacton + + :param tx_hash_list: list of transaction hashes in bytes or HEX encoded string. + :param hex: (optional) If set to True return result in HEX format, by default is True. + :return: list of merkle branches in bytes or HEX encoded string corresponding hex flag. + """ + tx_hash_list = [h if isinstance(h, bytes) else s2rh(h) for h in tx_hash_list] + branches = [] + if len(tx_hash_list) == 1: + return [] + tx_hash_list.pop(0) + while True: + branches.append(tx_hash_list.pop(0)) + new_hash_list = list() + while tx_hash_list: + h1 = tx_hash_list.pop(0) + try: + h2 = tx_hash_list.pop(0) + except: + h2 = h1 + new_hash_list.append(double_sha256(h1 + h2)) + if len(new_hash_list) > 1: + tx_hash_list = new_hash_list + else: + if new_hash_list: + branches.append(new_hash_list.pop(0)) + return branches if not hex else [hexlify(h).decode() for h in branches]
+ + +
[docs]def merkleroot_from_branches(merkle_branches, coinbase_hash, hex=True): + """ + Calculate merkle root from merkle branches and coinbase transacton hash + + :param merkle_branches: list merkle branches in bytes or HEX encoded string. + :param coinbase_hash: list coinbase transaction hash in bytes or HEX encoded string. + :param hex: (optional) If set to True return result in HEX format, by default is True. + :return: merkle root in bytes or HEX encoded string corresponding hex flag. + """ + merkle_root = coinbase_hash if not isinstance(coinbase_hash, str) else unhexlify(coinbase_hash) + for h in merkle_branches: + if type(h) == str: + h = unhexlify(h) + merkle_root = double_sha256(merkle_root + h) + return merkle_root if not hex else hexlify(merkle_root).decode()
+ + +# Difficulty + + +
[docs]def bits_to_target(bits): + """ + Calculate target from bits + + :param bits: HEX string, bytes string or integer representation of bits. + :return: integer. + """ + if type(bits) == str: + bits = unhexlify(bits) + if type(bits) == bytes: + return int.from_bytes(bits[1:], 'big') * (2 ** (8 * (bits[0] - 3))) + else: + shift = bits >> 24 + target = (bits & 0xffffff) * (1 << (8 * (shift - 3))) + return target
+ + +
[docs]def target_to_difficulty(target): + """ + Calculate difficulty from target + + :param target: integer. + :return: float. + """ + return 0x00000000FFFF0000000000000000000000000000000000000000000000000000 / target
+ + +
[docs]def bits_to_difficulty(bits): + """ + Calculate difficulty from bits + + :param bits: HEX string, bytes string or integer representation of bits. + :return: integer. + """ + return target_to_difficulty(bits_to_target(bits))
+ + +
[docs]def difficulty_to_target(difficulty): + """ + Calculate target from difficulty + + :param target: integer. + :return: float. + """ + return int(0x00000000FFFF0000000000000000000000000000000000000000000000000000 / difficulty)
+ + +# Tools + + +
[docs]def bytes_needed(n): + """ + Calculate bytes needed to convert integer to bytes. + + :param n: integer. + :return: integer. + """ + if n == 0: + return 1 + return math.ceil(n.bit_length()/8)
+ + +
[docs]def int_to_bytes(i, byteorder='big'): + """ + Convert integer to bytes. + + :param n: integer. + :param byteorder: (optional) byte order 'big' or 'little', by default 'big'. + :return: bytes. + """ + return i.to_bytes(bytes_needed(i), byteorder=byteorder, signed=False)
+ + +
[docs]def bytes_to_int(i, byteorder='big'): + """ + Convert bytes to integer. + + :param i: bytes. + :param byteorder: (optional) byte order 'big' or 'little', by default 'big'. + :return: integer. + """ + return int.from_bytes(i, byteorder=byteorder, signed=False)
+ + +# variable integer + +
[docs]def int_to_var_int(i): + """ + Convert integer to variable integer + + :param i: integer. + :return: bytes. + """ + if i < 0xfd: + return struct.pack('<B', i) + if i <= 0xffff: + return b'\xfd' + struct.pack('<H', i) + if i <= 0xffffffff: + return b'\xfe' + struct.pack('<L', i) + return b'\xff' + struct.pack('<Q', i)
+ + +
[docs]def var_int_to_int(data): + """ + Convert variable integer to integer + + :param data: bytes vriable integer. + :return: integer. + """ + if data[0] == 0xfd: + return struct.unpack('<H', data[1:3])[0] + elif data[0] == 0xfe: + return struct.unpack('<L', data[1:5])[0] + elif data[0] == 0xff: + return struct.unpack('<Q', data[1:9])[0] + return data[0]
+ + +
[docs]def var_int_len(n): + """ + Get variable integer length in bytes from integer value + + :param n: integer. + :return: integer. + """ + if n <= 0xfc: + return 1 + if n <= 0xffff: + return 3 + elif n <= 0xffffffff: + return 5 + return 9
+ + +
[docs]def get_var_int_len(bytes): + """ + Get variable integer length in bytes from bytes + + :param bytes: bytes. + :return: integer. + """ + if bytes[0] == 253: + return 3 + elif bytes[0] == 254: + return 5 + elif bytes[0] == 255: + return 9 + return 1
+ + +
[docs]def read_var_int(stream): + """ + Read variable integer from io.BytesIO stream to bytes + + :param stream: io.BytesIO stream. + :return: bytes. + """ + l = stream.read(1) + bytes_length = get_var_int_len(l) + return l + stream.read(bytes_length - 1)
+ + +
[docs]def read_var_list(stream, data_type): + """ + Read variable integer list from io.BytesIO stream to bytes + + :param stream: io.BytesIO stream. + :param data_type: list data type. + :return: list of data_type. + """ + count = var_int_to_int(read_var_int(stream)) + return [data_type.deserialize(stream) for i in range(count)]
+ +# compressed integer + + +
[docs]def int_to_c_int(n, base_bytes=1): + """ + Convert integer to compresed integer + + :param n: integer. + :param base_bytes: len of bytes base from which start compression. + :return: bytes. + """ + if n == 0: + return b'\x00' + else: + l = n.bit_length() + 1 + min_bits = base_bytes * 8 - 1 + if l <= min_bits + 1: + return n.to_bytes(base_bytes, byteorder="big") + prefix = 0 + payload_bytes = math.ceil((l)/8) - base_bytes + extra_bytes = int(math.ceil((l+payload_bytes)/8) - base_bytes) + for i in range(extra_bytes): + prefix += 2 ** i + if l < base_bytes * 8: + l = base_bytes * 8 + prefix = prefix << l + if prefix.bit_length() % 8: + prefix = prefix << 8 - prefix.bit_length() % 8 + n ^= prefix + return n.to_bytes(math.ceil(n.bit_length()/8), byteorder="big")
+ + +
[docs]def c_int_to_int(b, base_bytes=1): + """ + Convert compressed integer bytes to integer + + :param b: compressed integer bytes. + :param base_bytes: len of bytes base from which start compression. + :return: integer. + """ + byte_length = 0 + f = 0 + while True: + v = b[f] + if v == 0xff: + byte_length += 8 + f += 1 + continue + while v & 0b10000000: + byte_length += 1 + v = v << 1 + break + n = int.from_bytes(b[:byte_length+base_bytes], byteorder="big") + if byte_length: + return n & ((1 << (byte_length+base_bytes) * 8 - byte_length) - 1) + return n
+ + +
[docs]def c_int_len(n, base_bytes=1): + """ + Get length of compressed integer from integer value + + :param n: bytes. + :param base_bytes: len of bytes base from which start compression. + :return: integer. + """ + if n == 0: + return 1 + l = n.bit_length() + 1 + min_bits = base_bytes * 8 - 1 + if l <= min_bits + 1: + return 1 + payload_bytes = math.ceil((l)/8) - base_bytes + return int(math.ceil((l+payload_bytes)/8))
+ + +# generic big endian MPI format +def bn_bytes(v, have_ext=False): + ext = 0 + if have_ext: + ext = 1 + return ((v.bit_length() + 7) // 8) + ext + + +def bn2bin(v): + s = bytearray() + i = bn_bytes(v) + while i > 0: + s.append((v >> ((i - 1) * 8)) & 0xff) + i -= 1 + return s + + +def bin2bn(s): + l = 0 + for ch in s: + l = (l << 8) | ch + return l + + +def bn2mpi(v): + have_ext = False + if v.bit_length() > 0: + have_ext = (v.bit_length() & 0x07) == 0 + neg = False + if v < 0: + neg = True + v = -v + s = struct.pack(b">I", bn_bytes(v, have_ext)) + ext = bytearray() + if have_ext: + ext.append(0) + v_bin = bn2bin(v) + if neg: + if have_ext: + ext[0] |= 0x80 + else: + v_bin[0] |= 0x80 + return s + ext + v_bin + + +def mpi2bn(s): + if len(s) < 4: + return None + s_size = bytes(s[:4]) + v_len = struct.unpack(b">I", s_size)[0] + if len(s) != (v_len + 4): + return None + if v_len == 0: + return 0 + v_str = bytearray(s[4:]) + neg = False + i = v_str[0] + if i & 0x80: + neg = True + i &= ~0x80 + v_str[0] = i + v = bin2bn(v_str) + + if neg: + return -v + return v + +# bitcoin-specific little endian format, with implicit size + + +def mpi2vch(s): + r = s[4:] # strip size + # if r: + r = r[::-1] # reverse string, converting BE->LE + # else: r=b'\x00' + return r + + +def bn2vch(v): + return bytes(mpi2vch(bn2mpi(v))) + + +def vch2mpi(s): + r = struct.pack(b">I", len(s)) # size + r += s[::-1] # reverse string, converting LE->BE + return r + + +def vch2bn(s): + return mpi2bn(vch2mpi(s)) + + +def i2b(i): return bn2vch(i) + + +def b2i(b): return vch2bn(b) + + +def get_stream(stream): + if type(stream) != io.BytesIO: + if type(stream) == str: + stream = unhexlify(stream) + if type(stream) == bytes: + stream = io.BytesIO(stream) + else: + raise TypeError + return stream + +
+ +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/_modules/pybtc/transaction.html b/docs/build/html/_modules/pybtc/transaction.html new file mode 100644 index 0000000..1da5271 --- /dev/null +++ b/docs/build/html/_modules/pybtc/transaction.html @@ -0,0 +1,767 @@ + + + + + + + + pybtc.transaction — pybtc documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Source code for pybtc.transaction

+
+from struct import unpack
+import json
+from .tools import *
+from .address import PrivateKey, Address, PublicKey, ScriptAddress
+from binascii import hexlify, unhexlify
+
+
+
[docs]class Transaction(dict): + def __init__(self, raw_tx=None, tx_format="decoded", version=1, lockTime=0, testnet=False): + assert tx_format in ("decoded", "raw") + self["format"] = tx_format + self["testnet"] = testnet + self["segwit"] = False + self["txId"] = None + self["hash"] = None + self["version"] = version + self["size"] = 0 + self["vSize"] = 0 + self["bSize"] = 0 + self["lockTime"] = lockTime + self["vIn"] = dict() + self["vOut"] = dict() + self["rawTx"] = None + self["blockHash"] = None + self["confirmations"] = None + self["time"] = None + self["blockTime"] = None + self["blockIndex"] = None + self["coinbase"] = False + self["fee"] = None + self["data"] = None + self["amount"] = None + if raw_tx is None: + return + self["amount"] = 0 + stream = self.get_stream(raw_tx) + start = stream.tell() + (self["version"],) = unpack('<L', stream.read(4)) + n = read_var_int(stream) + sw = 0 + sw_len = 0 + if n == b'\x00': + sw = 1 + self["flag"] = stream.read(1) + n = read_var_int(stream) + ic = var_int_to_int(n) + for k in range(ic): + self["vIn"][k] = dict() + self["vIn"][k]["txId"] = stream.read(32) + self["vIn"][k]["vOut"] = unpack('<L', stream.read(4))[0] + n = var_int_to_int(read_var_int(stream)) + self["vIn"][k]["scriptSig"] = stream.read(n) + (self["vIn"][k]["sequence"],) = unpack('<L', stream.read(4)) + for k in range(var_int_to_int(read_var_int(stream))): + self["vOut"][k] = dict() + self["vOut"][k]["value"] = unpack('<Q', stream.read(8))[0] + self["amount"] += self["vOut"][k]["value"] + self["vOut"][k]["scriptPubKey"] = stream.read(var_int_to_int(read_var_int(stream))) + s = parse_script(self["vOut"][k]["scriptPubKey"], sw) + self["vOut"][k]["nType"] = s["nType"] + self["vOut"][k]["type"] = s["type"] + if self["data"] is None: + if s["nType"] == 3: + self["data"] = s["data"] + if s["nType"] not in (3, 4, 7): + self["vOut"][k]["addressHash"] = s["addressHash"] + self["vOut"][k]["reqSigs"] = s["reqSigs"] + if sw: + sw = stream.tell() - start + for k in range(ic): + self["vIn"][k]["txInWitness"] = [stream.read(var_int_to_int(read_var_int(stream))) \ + for c in range(var_int_to_int(read_var_int(stream)))] + sw_len = stream.tell() - sw + 2 + self["lockTime"] = unpack('<L', stream.read(4))[0] + end = stream.tell() + stream.seek(start) + b = stream.read(end - start) + self["rawTx"] = b + self["size"] = end - start + self["bSize"] = end - start - sw_len + self["weight"] = self["bSize"] * 3 + self["size"] + self["vSize"] = math.ceil(self["weight"] / 4) + if ic == 1 and \ + self["vIn"][0]["txId"] == b'\x00' * 32 and \ + self["vIn"][0]["vOut"] == 0xffffffff: + self["coinbase"] = True + else: + self["coinbase"] = False + if sw: + self["segwit"] = True + self["hash"] = double_sha256(b) + self["txId"] = double_sha256(b[:4] + b[6:sw] + b[-4:]) + else: + self["segwit"] = False + self["txId"] = double_sha256(b) + self["hash"] = self["txId"] + + def decode(self, testnet=None): + if self["format"] == "decoded": + self.encode() + self["format"] = "decoded" + if testnet is not None: + self["testnet"] = testnet + if type(self["txId"]) == bytes: + self["txId"] = rh2s(self["txId"]) + if "flag" in self: + if type(self["flag"]) == bytes: + self["flag"] = rh2s(self["flag"]) + if type(self["hash"]) == bytes: + self["hash"] = rh2s(self["hash"]) + if type(self["rawTx"]) == bytes: + self["rawTx"] = hexlify(self["rawTx"]).decode() + for i in self["vIn"]: + if type(self["vIn"][i]["txId"]) == bytes: + self["vIn"][i]["txId"] = rh2s(self["vIn"][i]["txId"]) + if type(self["vIn"][i]["scriptSig"]) == bytes: + self["vIn"][i]["scriptSig"] = hexlify(self["vIn"][i]["scriptSig"]).decode() + try: + t = list() + for w in self["vIn"][i]["txInWitness"]: + if type(w) == bytes: + w = hexlify(w).decode() + t.append(w) + self["vIn"][i]["txInWitness"] = t + self["vIn"][i]["txInWitnessAsm"] = [decode_script(ws, 1) for ws in + self["vIn"][i]["txInWitness"]] + self["vIn"][i]["txInWitnessOpcodes"] = [decode_script(ws) for ws in + self["vIn"][i]["txInWitness"]] + except: + pass + try: + if type(self["vIn"][i]["addressHash"]) == bytes: + self["vIn"][i]["addressHash"] = hexlify(self["vIn"][i]["addressHash"]).decode() + sh = True if self["vIn"][i]["nType"] in (1, 5) else False + witness_version = None if self["vIn"][i]["nType"] < 5 else 0 + self["vIn"][i]["address"] = hash_to_address(self["vIn"][i]["addressHash"], + self["testnet"], + sh, + witness_version) + except: + pass + if "scriptPubKey" in self["vIn"][i]: + if type(self["vIn"][i]["scriptPubKey"]) == bytes: + self["vIn"][i]["scriptPubKey"] = hexlify(self["vIn"][i]["scriptPubKey"]).decode() + self["vIn"][i]["scriptPubKeyOpcodes"] = decode_script(self["vIn"][i]["scriptPubKey"]) + self["vIn"][i]["scriptPubKeyAsm"] = decode_script(self["vIn"][i]["scriptPubKey"], 1) + if "redeemScript" in self["vIn"][i]: + if type(self["vIn"][i]["redeemScript"]) == bytes: + self["vIn"][i]["redeemScript"] = hexlify(self["vIn"][i]["redeemScript"]).decode() + self["vIn"][i]["redeemScriptOpcodes"] = decode_script(self["vIn"][i]["redeemScript"]) + self["vIn"][i]["redeemScriptAsm"] = decode_script(self["vIn"][i]["redeemScript"], 1) + if not self["coinbase"]: + if type(self["vIn"][i]["scriptSig"]) == bytes: + self["vIn"][i]["scriptSig"] = hexlify(self["vIn"][i]["scriptSig"]).decode() + self["vIn"][i]["scriptSigOpcodes"] = decode_script(self["vIn"][i]["scriptSig"]) + self["vIn"][i]["scriptSigAsm"] = decode_script(self["vIn"][i]["scriptSig"], 1) + + for i in self["vOut"]: + if type(self["vOut"][i]["scriptPubKey"]) == bytes: + self["vOut"][i]["scriptPubKey"] = hexlify(self["vOut"][i]["scriptPubKey"]).decode() + try: + if type(self["vOut"][i]["addressHash"]) == bytes: + self["vOut"][i]["addressHash"] = hexlify(self["vOut"][i]["addressHash"]).decode() + sh = True if self["vOut"][i]["nType"] in (1, 5) else False + witness_version = None if self["vOut"][i]["nType"] < 5 else 0 + self["vOut"][i]["address"] = hash_to_address(self["vOut"][i]["addressHash"], + self["testnet"], + sh, + witness_version) + except: + pass + self["vOut"][i]["scriptPubKeyOpcodes"] = decode_script(self["vOut"][i]["scriptPubKey"]) + self["vOut"][i]["scriptPubKeyAsm"] = decode_script(self["vOut"][i]["scriptPubKey"], 1) + if "data" in self: + if type(self["data"]) == bytes: + self["data"] = hexlify(self["data"]).decode() + return self + + def encode(self): + if type(self["txId"]) == str: + self["txId"] = s2rh(self["txId"]) + if "flag" in self: + if type(self["flag"]) == str: + self["flag"] = s2rh(self["flag"]) + if type(self["hash"]) == str: + self["hash"] = s2rh(self["hash"]) + if type(self["rawTx"]) == str: + self["rawTx"] = unhexlify(self["rawTx"]) + + for i in self["vIn"]: + if type(self["vIn"][i]["txId"]) == str: + self["vIn"][i]["txId"] = s2rh(self["vIn"][i]["txId"]) + if type(self["vIn"][i]["scriptSig"]) == str: + self["vIn"][i]["scriptSig"] = unhexlify(self["vIn"][i]["scriptSig"]) + try: + t = list() + for w in self["vIn"][i]["txInWitness"]: + if type(w) == str: + w = unhexlify(w) + t.append(w) + self["vIn"][i]["txInWitness"] = t + if "txInWitnessAsm" in self["vIn"][i]: + del self["vIn"][i]["txInWitnessAsm"] + if "txInWitnessOpcodes" in self["vIn"][i]: + del self["vIn"][i]["txInWitnessOpcodes"] + except: + pass + try: + if type(self["vIn"][i]["addressHash"]) == str: + self["vIn"][i]["addressHash"] = unhexlify(self["vIn"][i]["addressHash"]) + if "address" in self["vIn"][i]: + del self["vIn"][i]["address"] + except: + pass + if "scriptSigAsm" in self["vIn"][i]: + del self["vIn"][i]["scriptSigAsm"] + if "scriptSigOpcodes" in self["vIn"][i]: + del self["vIn"][i]["scriptSigOpcodes"] + + for i in self["vOut"]: + if type(self["vOut"][i]["scriptPubKey"]) == str: + self["vOut"][i]["scriptPubKey"] = unhexlify(self["vOut"][i]["scriptPubKey"]) + try: + if type(self["vOut"][i]["addressHash"]) == str: + self["vOut"][i]["addressHash"] = unhexlify(self["vOut"][i]["addressHash"]) + if "address" in self["vOut"][i]: + del self["vOut"][i]["address"] + except: + pass + if "scriptPubKeyOpcodes" in self["vOut"][i]: + del self["vOut"][i]["scriptPubKeyOpcodes"] + if "scriptPubKeyAsm" in self["vOut"][i]: + del self["vOut"][i]["scriptPubKeyAsm"] + + if "data" in self: + if type(self["data"]) == str: + self["data"] = unhexlify(self["data"]) + self["format"] = "raw" + return self + + def get_stream(self, stream): + if type(stream) != io.BytesIO: + if type(stream) == str: + stream = unhexlify(stream) + if type(stream) == bytes: + stream = io.BytesIO(stream) + else: + raise TypeError + return stream + + def serialize(self, segwit=True, hex=True): + chunks = [] + chunks.append(struct.pack('<L', self["version"])) + if segwit and self["segwit"]: + chunks.append(b"\x00\x01") + chunks.append(int_to_var_int(len(self["vIn"]))) + for i in self["vIn"]: + if type(self["vIn"][i]['txId']) == bytes: + chunks.append(self["vIn"][i]['txId']) + else: + chunks.append(s2rh(self["vIn"][i]['txId'])) + chunks.append(struct.pack('<L', self["vIn"][i]['vOut'])) + if type(self["vIn"][i]['scriptSig']) == bytes: + chunks.append(int_to_var_int(len(self["vIn"][i]['scriptSig']))) + chunks.append(self["vIn"][i]['scriptSig']) + else: + chunks.append(int_to_var_int(int(len(self["vIn"][i]['scriptSig']) / 2))) + chunks.append(unhexlify(self["vIn"][i]['scriptSig'])) + chunks.append(struct.pack('<L', self["vIn"][i]['sequence'])) + chunks.append(int_to_var_int(len(self["vOut"]))) + for i in self["vOut"]: + chunks.append(struct.pack('<Q', self["vOut"][i]['value'])) + if type(self["vOut"][i]['scriptPubKey']) == bytes: + chunks.append(int_to_var_int(len(self["vOut"][i]['scriptPubKey']))) + chunks.append(self["vOut"][i]['scriptPubKey']) + else: + chunks.append(int_to_var_int(int(len(self["vOut"][i]['scriptPubKey']) / 2))) + chunks.append(unhexlify(self["vOut"][i]['scriptPubKey'])) + if segwit and self["segwit"]: + for i in self["vIn"]: + chunks.append(int_to_var_int(len(self["vIn"][i]['txInWitness']))) + for w in self["vIn"][i]['txInWitness']: + if type(w) == bytes: + chunks.append(int_to_var_int(len(w))) + chunks.append(w) + else: + chunks.append(int_to_var_int(int(len(w) / 2))) + chunks.append(unhexlify(w)) + chunks.append(struct.pack('<L', self['lockTime'])) + tx = b''.join(chunks) + return tx if not hex else hexlify(tx).decode() + + def json(self): + try: + return json.dumps(self) + except: + pass + return json.dumps(self.decode()) + + def add_input(self, tx_id=None, v_out=0, sequence=0xffffffff, + script_sig=b"", tx_in_witness=None, amount=None, + script_pub_key=None, address=None, private_key=None): + if tx_id is None: + tx_id = b"\x00" * 32 + v_out = 0xffffffff + assert v_out == 0xffffffff and sequence == 0xffffffff + assert not self["vIn"] + if type(tx_id) == str: + tx_id = s2rh(tx_id) + if type(script_sig) == str: + script_sig = unhexlify(script_sig) + assert type(tx_id) == bytes + assert len(tx_id) == 32 + assert type(v_out) == int + assert v_out <= 0xffffffff and v_out >= 0 + assert type(sequence) == int + assert sequence <= 0xffffffff and sequence >= 0 + assert type(script_sig) == bytes + assert len(script_sig) <= 520 + if private_key: + if type(private_key) != PrivateKey: + private_key = PrivateKey(private_key) + if amount: + assert type(amount) == int + assert amount >= 0 and amount <= MAX_AMOUNT + if tx_in_witness: + assert type(tx_in_witness) == list + l = 0 + witness = [] + for w in tx_in_witness: + if type(w) == str: + witness.append(unhexlify(w) if self["format"] == "raw" else w) + else: + witness.append(w if self["format"] == "raw" else unhexlify(w)) + l += 1 + len(w) + if len(w) >= 0x4c: + l += 1 + if len(w) > 0xff: + l += 1 + # witness script limit + assert l <= 10000 + if tx_id == b"\x00" * 32: + assert v_out == 0xffffffff and sequence == 0xffffffff and len(script_sig) <= 100 + self["coinbase"] = True + + # script_pub_key + if script_pub_key: + if type(script_pub_key) == str: + script_pub_key = unhexlify(script_pub_key) + type(script_pub_key) == bytes + if address is not None: + if type(address) == str: + net = True if address_net_type(address) == 'mainnet' else False + assert not net == self["testnet"] + script = address_to_script(address) + elif type(address) in (Address, ScriptAddress): + assert type(address) == Address + script = address_to_script(address.address) + if script_pub_key: + assert script_pub_key == script + else: + script_pub_key = script + + k = len(self["vIn"]) + self["vIn"][k] = dict() + self["vIn"][k]["vOut"] = v_out + self["vIn"][k]["sequence"] = sequence + if self["format"] == "raw": + self["vIn"][k]["txId"] = tx_id + self["vIn"][k]["scriptSig"] = script_sig + if script_pub_key: + self["vIn"][k]["scriptPubKey"] = script_pub_key + else: + self["vIn"][k]["txId"] = rh2s(tx_id) + self["vIn"][k]["scriptSig"] = hexlify(script_sig).decode() + self["vIn"][k]["scriptSigOpcodes"] = decode_script(script_sig) + self["vIn"][k]["scriptSigAsm"] = decode_script(script_sig, 1) + if script_pub_key: + self["vIn"][k]["scriptPubKey"] = hexlify(script_pub_key).decode() + if tx_in_witness: + self["segwit"] = True + self["vIn"][k]["txInWitness"] = witness + if amount: + self["vIn"][k]["value"] = amount + if private_key: + self["vIn"][k].private_key = private_key + self.__refresh__() + return self + + def add_output(self, amount, address=None, script_pub_key=None): + assert address is not None or script_pub_key is not None + assert not (address is None and script_pub_key is None) + assert type(amount) == int + assert amount >= 0 and amount <= MAX_AMOUNT + if script_pub_key: + if type(script_pub_key) == str: + script_pub_key = unhexlify(script_pub_key) + assert type(script_pub_key) == bytes + else: + if type(address) == Address: + address = address.address + script_pub_key = address_to_script(address) + + k = len(self["vOut"]) + self["vOut"][k] = dict() + self["vOut"][k]["value"] = amount + segwit = True if "segwit" in self else False + s = parse_script(script_pub_key, segwit) + self["vOut"][k]["nType"] = s["nType"] + self["vOut"][k]["type"] = s["type"] + + if self["format"] == "raw": + self["vOut"][k]["scriptPubKey"] = script_pub_key + if self["data"] is None: + if s["nType"] == 3: + self["data"] = s["data"] + if s["nType"] not in (3, 4, 7): + self["vOut"][k]["addressHash"] = s["addressHash"] + self["vOut"][k]["reqSigs"] = s["reqSigs"] + else: + self["vOut"][k]["scriptPubKey"] = hexlify(script_pub_key).decode() + if self["data"] is None: + if s["nType"] == 3: + self["data"] = hexlify(s["data"]).decode() + if s["nType"] not in (3, 4, 7): + self["vOut"][k]["addressHash"] = hexlify(s["addressHash"]).decode() + self["vOut"][k]["reqSigs"] = s["reqSigs"] + self["vOut"][k]["scriptPubKeyOpcodes"] = decode_script(script_pub_key) + self["vOut"][k]["scriptPubKeyAsm"] = decode_script(script_pub_key, 1) + sh = True if self["vOut"][k]["nType"] in (1, 5) else False + witness_version = None if self["vOut"][k]["nType"] < 5 else 0 + if "addressHash" in self["vOut"][k]: + self["vOut"][k]["address"] = hash_to_address(self["vOut"][k]["addressHash"], + self["testnet"], + sh, + witness_version) + self.__refresh__() + return self + + def del_output(self, n=None): + if not self["vOut"]: + return self + if n is None: + n = len(self["vOut"]) - 1 + new_out = dict() + c = 0 + for i in range(len(self["vOut"])): + if i != n: + new_out[c] = self["vOut"][i] + c += 1 + self["vOut"] = new_out + self.__refresh__() + return self + + def del_input(self, n): + if not self["vIn"]: + return self + if n is None: + n = len(self["vIn"]) - 1 + new_in = dict() + c = 0 + for i in range(len(self["vIn"])): + if i != n: + new_in[c] = self["vIn"][i] + c += 1 + self["vIn"] = new_in + self.__refresh__() + return self + + def sign_input(self, n, private_key=None, script_pub_key=None, redeem_script=None, sighash_type=SIGHASH_ALL): + if private_key is not None: + if private_key: + if type(private_key) != PrivateKey: + private_key_obj = PrivateKey(private_key) + public_key = PublicKey(private_key_obj).key + private_key = private_key_obj.key + else: + if "privateKey" not in self["vIn"][n]: + return self + private_key = self["vIn"][n].private_key.key + public_key = PublicKey(self["vIn"][n].private_key).key + + if redeem_script: + if type(redeem_script) == str: + redeem_script = unhexlify(redeem_script).decode() + assert type(redeem_script) == bytes + script = redeem_script + else: + script = script_pub_key + + sighash = self.sig_hash_input(n, script_pub_key=script, sighash_type=sighash_type) + if type(sighash) == str: + sighash = s2rh(sighash) + signature = sign_message(sighash, private_key, 0) + bytes([sighash_type]) + if redeem_script: + if self["vIn"][n]["scriptSig"]: + sig_script = self["vIn"][n]["scriptSig"] + if type(sig_script) == str: + sig_script = unhexlify(sig_script).decode() + sig_script = bytes([len(public_key)]) + public_key + sig_script + sig_script = bytes([len(signature)]) + signature + sig_script + else: + sig_script = bytes([len(signature)]) + signature + sig_script += bytes([len(public_key)]) + public_key + if len(redeem_script) <= 0x4b: + sig_script += bytes([len(redeem_script)]) + redeem_script + elif len(redeem_script) <= 0xff: + sig_script = BYTE_OPCODE["OP_PUSHDATA1"] + bytes([len(redeem_script)]) + redeem_script + elif len(redeem_script) <= 0xffff: + sig_script = BYTE_OPCODE["OP_PUSHDATA2"] + bytes([len(redeem_script)]) + redeem_script + else: + sig_script = BYTE_OPCODE["OP_PUSHDATA4"] + bytes([len(redeem_script)]) + redeem_script + else: + sig_script = bytes([len(signature)]) + signature + sig_script += bytes([len(public_key)]) + public_key + if self["format"] == "raw": + self["vIn"][n]["scriptSig"] = sig_script + else: + self["vIn"][n]["scriptSig"] = hexlify(sig_script).decode() + self["vIn"][n]["scriptSigOpcodes"] = decode_script(sig_script) + self["vIn"][n]["scriptSigAsm"] = decode_script(sig_script, 1) + self.__refresh__() + return self + + def sig_hash_input(self, n, script_pub_key=None, sighash_type=SIGHASH_ALL): + # check n + assert n >= 0 + tx_in_count = len(self["vIn"]) + + if n >= tx_in_count: + if self["format"] == "raw": + return b'\x01' + b'\x00' * 31 + else: + return rh2s(b'\x01' + b'\x00' * 31) + + # check script_pub_key for input + if script_pub_key is not None: + script_code = script_pub_key + else: + assert "scriptPubKey" in self["vIn"][n] + script_code = self["vIn"][n]["scriptPubKey"] + if type(script_code) == str: + script_code = unhexlify(script_code) + assert type(script_code) == bytes + + # remove opcode separators + script_code = delete_from_script(script_code, BYTE_OPCODE["OP_CODESEPARATOR"]) + preimage = bytearray() + + if ((sighash_type & 31) == SIGHASH_SINGLE) and (n >= (len(self["vOut"]))): + if self["format"] == "raw": + return b'\x01' + b'\x00' * 31 + else: + return rh2s(b'\x01' + b'\x00' * 31) + + preimage += struct.pack('<L', self["version"]) + preimage += b'\x01' if sighash_type & SIGHASH_ANYONECANPAY else int_to_var_int(tx_in_count) + + for i in self["vIn"]: + # skip all other inputs for SIGHASH_ANYONECANPAY case + if (sighash_type & SIGHASH_ANYONECANPAY) and (n != i): + continue + sequence = self["vIn"][i]["sequence"] + if (sighash_type & 31) == SIGHASH_SINGLE and (n != i): + sequence = 0 + if (sighash_type & 31) == SIGHASH_NONE and (n != i): + sequence = 0 + tx_id = self["vIn"][i]["txId"] + if type(tx_id) == str: + tx_id = s2rh(tx_id) + input = tx_id + struct.pack('<L', self["vIn"][i]["vOut"]) + if n == i: + input += int_to_var_int(len(script_code)) + script_code + input += struct.pack('<L', sequence) + else: + input += b'\x00' + struct.pack('<L', sequence) + preimage += input + + if (sighash_type & 31) == SIGHASH_NONE: + preimage += b'\x00' + else: + if (sighash_type & 31) == SIGHASH_SINGLE: + preimage += int_to_var_int(n + 1) + else: + preimage += int_to_var_int(len(self["vOut"])) + + if (sighash_type & 31) != SIGHASH_NONE: + for i in self["vOut"]: + script_pub_key = self["vOut"][i]["scriptPubKey"] + if type(self["vOut"][i]["scriptPubKey"]) == str: + script_pub_key = unhexlify(script_pub_key) + if i > n and (sighash_type & 31) == SIGHASH_SINGLE: + continue + if (sighash_type & 31) == SIGHASH_SINGLE and (n != i): + preimage += b'\xff' * 8 + b'\x00' + else: + preimage += self["vOut"][i]["value"].to_bytes(8, 'little') + preimage += int_to_var_int(len(script_pub_key)) + script_pub_key + + preimage += self["lockTime"].to_bytes(4, 'little') + preimage += struct.pack(b"<i", sighash_type) + return double_sha256(preimage) if self["format"] == "raw" else rh2s(double_sha256(preimage)) + + def __refresh__(self): + if not self["vOut"] or not self["vIn"]: + return + no_segwit_view = self.serialize(segwit=False, hex=False) + self["txId"] = double_sha256(no_segwit_view) + self["rawTx"] = self.serialize(segwit=True, hex=False) + self["hash"] = double_sha256(self["rawTx"]) + + self["size"] = len(self["rawTx"]) + self["bSize"] = len(no_segwit_view) + self["weight"] = self["bSize"] * 3 + self["size"] + self["vSize"] = math.ceil(self["weight"] / 4) + + if self["format"] != "raw": + self["txId"] = rh2s(self["txId"]) + self["hash"] = rh2s(self["hash"]) + self["rawTx"] = hexlify(self["rawTx"]).decode() + + input_sum = 0 + for i in self["vIn"]: + if "value" in self["vIn"][i]: + input_sum += self["vIn"][i]["value"] + else: + input_sum = None + break + + output_sum = 0 + for i in self["vOut"]: + if "value" in self["vOut"][i]: + output_sum += self["vOut"][i]["value"] + else: + output_sum = None + break + self["amount"] = output_sum + if output_sum and input_sum: + self["fee"] = input_sum - output_sum + else: + self["fee"] = None
+ + + + + + + +
+ +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/_sources/address.rst.txt b/docs/build/html/_sources/address.rst.txt new file mode 100644 index 0000000..fc02023 --- /dev/null +++ b/docs/build/html/_sources/address.rst.txt @@ -0,0 +1,30 @@ +========= +Addresses +========= + +Collection of base classes that implement the work with Bitcoin addresses and address keys. +Supports addresses types PUBKEY, P2PKH, P2SH, P2SH-PWPKH, P2WPKH, P2WSH. + +| +| + +.. autoclass:: pybtc.PrivateKey + :members: + :inherited-members: + +| +| + +.. autoclass:: pybtc.PublicKey + :members: + :inherited-members: + +| +| + +.. autoclass:: pybtc.Address + :members: + :inherited-members: + + + diff --git a/docs/build/html/_sources/block.rst.txt b/docs/build/html/_sources/block.rst.txt new file mode 100644 index 0000000..027e75c --- /dev/null +++ b/docs/build/html/_sources/block.rst.txt @@ -0,0 +1,10 @@ +====== +Blocks +====== + +The class for creating transaction. + + + +.. autoclass:: pybtc.Block + \ No newline at end of file diff --git a/docs/build/html/_sources/classes.rst.txt b/docs/build/html/_sources/classes.rst.txt new file mode 100644 index 0000000..4555cae --- /dev/null +++ b/docs/build/html/_sources/classes.rst.txt @@ -0,0 +1,13 @@ +========= +Reference +========= + +.. toctree:: + :name: mastertoc + :maxdepth: 2 + + address.rst + transaction.rst + block.rst + + diff --git a/docs/build/html/_sources/contributing.rst.txt b/docs/build/html/_sources/contributing.rst.txt new file mode 100644 index 0000000..a7b801b --- /dev/null +++ b/docs/build/html/_sources/contributing.rst.txt @@ -0,0 +1,36 @@ +.. _pybtc-contributing: + +============ +Contributing +============ + +Instructions for contributors +----------------------------- + + +In order to make a clone of the GitHub repo: open the link and press the +"Fork" button on the upper-right menu of the web page. + + +Workflow is pretty straightforward: + + 1. Clone the GitHub + + 2. Make a change + + 3. Make sure all tests passed + + 4. Add a record intp file into ``change.log``. + + 5. Commit changes to own aiohttp clone + + 6. Make pull request from github page for your clone against master branch + + +Tests coverage +-------------- + +We are trying hard to have good test coverage; please don't make it worse. +All tests located in ``tests/`` folder. + + diff --git a/docs/build/html/_sources/examples.rst.txt b/docs/build/html/_sources/examples.rst.txt new file mode 100644 index 0000000..3dc5ae3 --- /dev/null +++ b/docs/build/html/_sources/examples.rst.txt @@ -0,0 +1,118 @@ +======== +Examples +======== + + +Create address +-------------- + +This is example of usage Address class. The address class implements the work with addresses controlled by a private key. +Supports the ability to create P2WPKH, P2PKH, PUBKEY address types and P2SH_P2WPKH as exception for SEGWIT adoption. +It is recommended to use native SEGWIT address type - P2WPKH, which reduces costs of miner fee and expand block capacity. +To create an address, you need to create a class object. Buy default, +will be created P2WPKH address for mainnet. + + + +.. code-block:: bash + + >>> import pybtc + >>> a = pybtc.Address() + >>> a.address + 'bc1q6cxx5t8xkruz3s5khx7923xvsx5ry4c6p74m5s' + >>> a.private_key.wif + 'L5XKGA2xEHcinWEpmyiABS1bqQux8Av5dGVqcpRtVJC3ZCR5sXUe' + >>> + >>> # create P2PKH legacy format + >>> pybtc.Address(address_type="P2PKH").address + '1ChpKurzFhdCULKaNHCc3Ra9KfxM2LRguw' + >>> + >>> # create testnet address + >>> pybtc.Address(address_type="P2PKH", testnet=True).address + 'mpR4hDfu269yxgZtPVYSD21gtpvdxpTmH6' + >>> + >>> # create P2SH_P2WPKH SEGWIT adoption address + >>> pybtc.Address(address_type="P2SH_P2WPKH").address + '3Bqeq3XqL6azMK3BxNyr8vXgXUtoG63J4T' + >>> + + +Get address from key +-------------------- + +In case you already have private or public key you can object from your key. + +.. code-block:: bash + + >>> a = pybtc.Address('L5XKGA2xEHcinWEpmyiABS1bqQux8Av5dGVqcpRtVJC3ZCR5sXUe') + >>> a.address + 'bc1q6cxx5t8xkruz3s5khx7923xvsx5ry4c6p74m5s' + >>> a.public_key.hex + '03b8b44876e1f45be7e42953ea47026c39cc45341344d3ab32701b93de696107af' + >>> + >>> # get address from public key + >>> pub = pybtc.PublicKey('03b8b44876e1f45be7e42953ea47026c39cc45341344d3ab32701b93de696107af') + >>> + >>> pybtc.Address(pub).address + 'bc1q6cxx5t8xkruz3s5khx7923xvsx5ry4c6p74m5s' + >>> + +Pure functions for address +-------------------------- + +Create private key + +.. code-block:: bash + + >>> import pybtc + >>> pybtc.create_private_key() + 'KyvZYvdzWD4JSPFt4wXwjG53as227zT2qiWbMTicZEUSjiwvbEqi' + >>> + >>> pybtc.create_private_key(compressed=False) + '5Jw8DY1uBrd35xup6eD6KLEFa4AJFbX381HWuHvPGirJto9ZTnr' + >>> + >>> pybtc.is_wif_valid('5Jw8DY1uBrd35xup6eD6KLEFa4AJFbX381HWuHvPGirJto9ZTnr') + True + >>> pybtc.is_wif_valid('5Jw8DY1uBrd35xup6eD6KLEFa4AJFbX381**********Jto9ZTnr') + False + >>> + +Get public key from private key + +.. code-block:: bash + + >>> import pybtc + >>> pybtc.private_to_public_key('5Jw8DY1uBrd35xup6eD6KLEFa4AJFbX381HWuHvPGirJto9ZTnr') + '0479f17a94410afd4f27588a192bacada53add0741765092dc0f8e2a29ea1bcd276dbc1ef74c3e0172d9db8047f2a0a5dc2e8e51a13f7f0cc072de906b765e0f7f' + >>> + >>> pybtc.public_key_to_address('0479f17a94410afd4f27588a192bacada53add0741765092dc0f8e2a29ea1bcd276dbc1ef74c3e0172d9db8047f2a0a5dc2e8e51a13f7f0cc072de906b765e0f7f') + >>> + >>> # this is uncompressed public key, so we can't create witness address + >>> # we have to set witness_version to None to get non segwit address + >>> pub = pybtc.private_to_public_key('5Jw8DY1uBrd35xup6eD6KLEFa4AJFbX381HWuHvPGirJto9ZTnr') + >>> pybtc.public_key_to_address(pub, witness_version=None) + '17mXwxxZRmj1nJJzDszZbW9URSAradEuAt' + >>> + +Tools + +.. code-block:: bash + + >>> pybtc.is_address_valid('17mXwxxZRmj1nJJzDszZbW9URSAradEuAt') + True + >>> pybtc.address_type('17mXwxxZRmj1nJJzDszZbW9URSAradEuAt') + 'P2PKH' + >>> pybtc.address_net_type('17mXwxxZRmj1nJJzDszZbW9URSAradEuAt') + 'mainnet' + >>> + + +Create script address +--------------------- + + + + + + + diff --git a/docs/build/html/_sources/functional.rst.txt b/docs/build/html/_sources/functional.rst.txt new file mode 100644 index 0000000..f0d3686 --- /dev/null +++ b/docs/build/html/_sources/functional.rst.txt @@ -0,0 +1,108 @@ + +======================== +Pure functions reference +======================== + +Base function primitives implemented in functional programming paradigm. + + + +Private keys +============ + +.. autofunction:: pybtc.create_private_key +.. autofunction:: pybtc.private_key_to_wif +.. autofunction:: pybtc.wif_to_private_key +.. autofunction:: pybtc.is_wif_valid + + +Public keys +=========== + +.. WARNING:: + Using uncompressed public keys is + `deprecated `_ + in a new SEGWIT address format. + To avoid potential future funds loss, users MUST NOT use uncompressed keys + in version 0 witness programs. Use uncompressed keys only for backward + compatibilitylegacy in legacy address format (PUBKEY, P2PKH). + + +.. autofunction:: pybtc.private_to_public_key +.. autofunction:: pybtc.is_public_key_valid + + +Addresses +========= + +.. autofunction:: pybtc.hash_to_address +.. autofunction:: pybtc.address_to_hash +.. autofunction:: pybtc.public_key_to_address +.. autofunction:: pybtc.address_type +.. autofunction:: pybtc.address_to_script +.. autofunction:: pybtc.is_address_valid + + +Script +====== + +.. autofunction:: pybtc.decode_script +.. autofunction:: pybtc.parse_script +.. autofunction:: pybtc.delete_from_script +.. autofunction:: pybtc.script_to_hash + + +Signatures +========== + +.. autofunction:: pybtc.verify_signature +.. autofunction:: pybtc.sign_message +.. autofunction:: pybtc.is_valid_signature_encoding + + +Hash encoding +============= + +.. autofunction:: pybtc.rh2s +.. autofunction:: pybtc.s2rh +.. autofunction:: pybtc.reverse_hash + + +Merkle root +=========== + +.. autofunction:: pybtc.merkle_root +.. autofunction:: pybtc.merkle_branches +.. autofunction:: pybtc.merkleroot_from_branches + + +Difficulty +========== + +.. autofunction:: pybtc.bits_to_target +.. autofunction:: pybtc.target_to_difficulty +.. autofunction:: pybtc.bits_to_difficulty +.. autofunction:: pybtc.difficulty_to_target + + +Tools +===== + +.. autofunction:: pybtc.bytes_needed +.. autofunction:: pybtc.int_to_bytes +.. autofunction:: pybtc.bytes_to_int +.. autofunction:: pybtc.int_to_var_int +.. autofunction:: pybtc.var_int_to_int +.. autofunction:: pybtc.var_int_len +.. autofunction:: pybtc.get_var_int_len +.. autofunction:: pybtc.read_var_int +.. autofunction:: pybtc.read_var_list +.. autofunction:: pybtc.int_to_c_int +.. autofunction:: pybtc.c_int_to_int +.. autofunction:: pybtc.c_int_len + + + + + + diff --git a/docs/build/html/_sources/index.rst.txt b/docs/build/html/_sources/index.rst.txt new file mode 100644 index 0000000..8ac9e21 --- /dev/null +++ b/docs/build/html/_sources/index.rst.txt @@ -0,0 +1,113 @@ +.. aiohttp documentation master file, created by + sphinx-quickstart on Wed Mar 5 12:35:35 2014. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +================== +Welcome to PYBTC +================== + +Python library for Bitcoin. + +Current version is |release|. + + +.. _GitHub: https://github.com/bitaps-com/pybtc + + +Key Features +============ + + +- Supports addresses types PUBKEY, P2PKH, P2SH, P2SH-PWPKH, P2WPKH, P2WSH. +- Supports BIP32(Hierarchical Deterministic Wallets), BIP39(Mnemonic code generation) +- Supports BIP141(Segregated Witness) +- Transaction constructor +- Mining pool basic primitives + + +.. _aiohttp-installation: + +Quick library Installation +========================== + +.. code-block:: bash + + $ pip install pybtc + + +Getting Started +=============== + +Usage example:: + + import pybtc + a = pybtc.Address() + print(a.address) + print(a.private_key.wif()) + + + + + + +What's new in pybtc 2.0 ? +========================= + +- Mnemonic code generation (BIP39) +- Hierarchical Deterministic Wallets (BIP32) +- Wallet class implemented acording BIP44 +- Imporved transaction deserialization perfomance + + + +Source code +=========== + +The project is hosted on GitHub_ + +Please feel free to file an issue on the `bug tracker +`_ if you have found a bug +or have some suggestion in order to improve the library. + + +Dependencies +============ + +- Python 3.3.3+ +- *secp256k1* + + + +Authors and License +=================== + +The ``pybtc`` package was initially written by `Aleksey Karpov `_ and development continues with contributors. + +Recent contributors: + +- `Aleksey Karpov `_ +- `Aleksey Karybkin `_ + +It's *GPL-3.0* licensed and freely available. + +Feel free to improve this package and send a pull request to GitHub_. + + + + +Table Of Contents +================= + +.. toctree:: + :name: mastertoc + :maxdepth: 2 + + installation.rst + examples.rst + classes.rst + functional.rst + contributing.rst + + + diff --git a/docs/build/html/_sources/installation.rst.txt b/docs/build/html/_sources/installation.rst.txt new file mode 100644 index 0000000..d5c3d9d --- /dev/null +++ b/docs/build/html/_sources/installation.rst.txt @@ -0,0 +1,39 @@ +============ +Installation +============ + +This part of the documentation covers the installation of pybtc library. The first step to using any software package is getting it properly installed. + +Get from pip package +-------------------- + +To install pybtc, simply run this simple command in your terminal of choice: + +.. code-block:: bash + + $ pip install pybtc + + +If you don’t have pip installed, this Python pip `installation guide `_ can guide you through the process. + + +Get the Source Code +------------------- + +You can clone the public repository: + +.. code-block:: bash + + $ git clone git://github.com/bitaps-com/pybtc + +Once you have a copy of the source, you can embed it in your own Python package, or install it into your site-packages easily: + +.. code-block:: bash + + $ cd pybtc + $ python3 setup.py install + + + + + diff --git a/docs/build/html/_sources/transaction.rst.txt b/docs/build/html/_sources/transaction.rst.txt new file mode 100644 index 0000000..ac2360c --- /dev/null +++ b/docs/build/html/_sources/transaction.rst.txt @@ -0,0 +1,11 @@ +============ +Transactions +============ + +The class for creating transaction. + + +.. autoclass:: pybtc.Transaction + :members: + + diff --git a/docs/build/html/_static/ajax-loader.gif b/docs/build/html/_static/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..61faf8cab23993bd3e1560bff0668bd628642330 GIT binary patch literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN literal 0 HcmV?d00001 diff --git a/docs/build/html/_static/alabaster.css b/docs/build/html/_static/alabaster.css new file mode 100644 index 0000000..a6ed612 --- /dev/null +++ b/docs/build/html/_static/alabaster.css @@ -0,0 +1,688 @@ +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: sans-serif; + font-size: 16px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 1100px; + 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: 1100px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: sans-serif; + 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: sans-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: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +/* -- 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: sans-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: sans-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', 'Deja Vu 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 new file mode 100644 index 0000000..19ced10 --- /dev/null +++ b/docs/build/html/_static/basic.css @@ -0,0 +1,665 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + 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 div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + 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, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +div.code-block-caption { + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: relative; + left: 0px; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/build/html/_static/comment-bright.png b/docs/build/html/_static/comment-bright.png new file mode 100644 index 0000000000000000000000000000000000000000..15e27edb12ac25701ac0ac21b97b52bb4e45415e GIT binary patch literal 756 zcmVgfIX78 z$8Pzv({A~p%??+>KickCb#0FM1rYN=mBmQ&Nwp<#JXUhU;{|)}%&s>suq6lXw*~s{ zvHx}3C%<;wE5CH!BR{p5@ml9ws}y)=QN-kL2?#`S5d*6j zk`h<}j1>tD$b?4D^N9w}-k)bxXxFg>+#kme^xx#qg6FI-%iv2U{0h(Y)cs%5a|m%Pn_K3X_bDJ>EH#(Fb73Z zfUt2Q3B>N+ot3qb*DqbTZpFIn4a!#_R-}{?-~Hs=xSS6p&$sZ-k1zDdtqU`Y@`#qL z&zv-~)Q#JCU(dI)Hf;$CEnK=6CK50}q7~wdbI->?E07bJ0R;!GSQTs5Am`#;*WHjvHRvY?&$Lm-vq1a_BzocI^ULXV!lbMd%|^B#fY;XX)n<&R^L z=84u1e_3ziq;Hz-*k5~zwY3*oDKt0;bM@M@@89;@m*4RFgvvM_4;5LB!@OB@^WbVT zjl{t;a8_>od-~P4 m{5|DvB&z#xT;*OnJqG}gk~_7HcNkCr0000W zanA~u9RIXo;n7c96&U)YLgs-FGlx~*_c{Jgvesu1E5(8YEf&5wF=YFPcRe@1=MJmi zag(L*xc2r0(slpcN!vC5CUju;vHJkHc*&70_n2OZsK%O~A=!+YIw z7zLLl7~Z+~RgWOQ=MI6$#0pvpu$Q43 zP@36QAmu6!_9NPM?o<1_!+stoVRRZbW9#SPe!n;#A_6m8f}|xN1;H{`0RoXQ2LM47 zt(g;iZ6|pCb@h2xk&(}S3=EVBUO0e90m2Lp5CB<(SPIaB;n4))3JB87Or#XPOPcum z?<^(g+m9}VNn4Y&B`g8h{t_$+RB1%HKRY6fjtd-<7&EsU;vs0GM(Lmbhi%Gwcfs0FTF}T zL{_M6Go&E0Eg8FuB*(Yn+Z*RVTBE@10eIOb3El^MhO`GabDll(V0&FlJi2k^;q8af zkENdk2}x2)_KVp`5OAwXZM;dG0?M-S)xE1IKDi6BY@5%Or?#aZ9$gcX)dPZ&wA1a< z$rFXHPn|TBf`e?>Are8sKtKrKcjF$i^lp!zkL?C|y^vlHr1HXeVJd;1I~g&Ob-q)& z(fn7s-KI}G{wnKzg_U5G(V%bX6uk zIa+<@>rdmZYd!9Y=C0cuchrbIjuRB_Wq{-RXlic?flu1*_ux}x%(HDH&nT`k^xCeC ziHi1!ChH*sQ6|UqJpTTzX$aw8e(UfcS^f;6yBWd+(1-70zU(rtxtqR%j z-lsH|CKQJXqD{+F7V0OTv8@{~(wp(`oIP^ZykMWgR>&|RsklFMCnOo&Bd{le} zV5F6424Qzl;o2G%oVvmHgRDP9!=rK8fy^!yV8y*4p=??uIRrrr0?>O!(z*g5AvL2!4z0{sq%vhG*Po}`a<6%kTK5TNhtC8}rXNu&h^QH4A&Sk~Autm*s~45(H7+0bi^MraaRVzr05hQ3iK?j` zR#U@^i0WhkIHTg29u~|ypU?sXCQEQgXfObPW;+0YAF;|5XyaMAEM0sQ@4-xCZe=0e z7r$ofiAxn@O5#RodD8rh5D@nKQ;?lcf@tg4o+Wp44aMl~c47azN_(im0N)7OqdPBC zGw;353_o$DqGRDhuhU$Eaj!@m000000NkvXXu0mjfjZ7Z_ literal 0 HcmV?d00001 diff --git a/docs/build/html/_static/custom.css b/docs/build/html/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/docs/build/html/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/docs/build/html/_static/doctools.js b/docs/build/html/_static/doctools.js new file mode 100644 index 0000000..d892892 --- /dev/null +++ b/docs/build/html/_static/doctools.js @@ -0,0 +1,313 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !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 bbox = span.getBBox(); + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + var parentOfText = node.parentNode.parentNode; + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keyup(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box or textarea + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); \ No newline at end of file diff --git a/docs/build/html/_static/documentation_options.js b/docs/build/html/_static/documentation_options.js new file mode 100644 index 0000000..893cd39 --- /dev/null +++ b/docs/build/html/_static/documentation_options.js @@ -0,0 +1,9 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '', + LANGUAGE: 'None', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' +}; \ No newline at end of file diff --git a/docs/build/html/_static/down-pressed.png b/docs/build/html/_static/down-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..5756c8cad8854722893dc70b9eb4bb0400343a39 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFdm2Ln;`PZ^+1>KjR?B@S0W7 z%OS_REiHONoJ6{+Ks@6k3590|7k9F+ddB6!zw3#&!aw#S`x}3V3&=A(a#84O-&F7T z^k3tZB;&iR9siw0|F|E|DAL<8r-F4!1H-;1{e*~yAKZN5f0|Ei6yUmR#Is)EM(Po_ zi`qJR6|P<~+)N+kSDgL7AjdIC_!O7Q?eGb+L+qOjm{~LLinM4NHn7U%HcK%uoMYO5 VJ~8zD2B3o(JYD@<);T3K0RV0%P>BEl literal 0 HcmV?d00001 diff --git a/docs/build/html/_static/down.png b/docs/build/html/_static/down.png new file mode 100644 index 0000000000000000000000000000000000000000..1b3bdad2ceffae91cee61b32f3295f9bbe646e48 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6CVIL!hEy=F?b*7pIY7kW{q%Rg zx!yQ<9v8bmJwa`TQk7YSw}WVQ()mRdQ;TC;* literal 0 HcmV?d00001 diff --git a/docs/build/html/_static/file.png b/docs/build/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/docs/build/html/_static/jquery-3.2.1.js b/docs/build/html/_static/jquery-3.2.1.js new file mode 100644 index 0000000..d2d8ca4 --- /dev/null +++ b/docs/build/html/_static/jquery-3.2.1.js @@ -0,0 +1,10253 @@ +/*! + * jQuery JavaScript Library v3.2.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2017-03-20T18:59Z + */ +( 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 document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + + + + function DOMEval( code, doc ) { + doc = doc || document; + + var script = doc.createElement( "script" ); + + script.text = code; + doc.head.appendChild( script ).parentNode.removeChild( script ); + } +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.2.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); + }, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE <=9 - 11, Edge 12 - 13 + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Simple selector that can be filtered directly, removing non-Elements + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + // Complex selector, compare the two sets, removing non-Elements + qualifier = jQuery.filter( qualifier, elements ); + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( jQuery.isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ jQuery.camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ jQuery.camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( jQuery.camelCase ); + } else { + key = jQuery.camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: jQuery.isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( ">tbody", elem )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rmargin = ( /^margin/ ); + +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + div.style.cssText = + "box-sizing:border-box;" + + "position:relative;display:block;" + + "margin:auto;border:1px;padding:1px;" + + "top:1%;width:50%"; + div.innerHTML = ""; + documentElement.appendChild( container ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = divStyle.marginLeft === "2px"; + boxSizingReliableVal = divStyle.width === "4px"; + + // Support: Android 4.0 - 4.3 only + // Some styles come back with percentage values, even though they shouldn't + div.style.marginRight = "50%"; + pixelMarginRightVal = divStyle.marginRight === "4px"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + + "padding:0;margin-top:1px;position:absolute"; + container.appendChild( div ); + + jQuery.extend( support, { + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelMarginRight: function() { + computeStyleTests(); + return pixelMarginRightVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i, + val = 0; + + // If we already have the right measurement, avoid augmentation + if ( extra === ( isBorderBox ? "border" : "content" ) ) { + i = 4; + + // Otherwise initialize for horizontal or vertical properties + } else { + i = name === "width" ? 1 : 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // At this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + + // At this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // At this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with computed style + var valueIsBorderBox, + styles = getStyles( elem ), + val = curCSS( elem, name, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test( val ) ) { + return val; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && + ( support.boxSizingReliable() || val === elem.style[ name ] ); + + // Fall back to offsetWidth/Height when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + if ( val === "auto" ) { + val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; + } + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + + // Use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + "float": "cssFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + } ) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = extra && getStyles( elem ), + subtract = extra && augmentWidthOrHeight( + elem, + name, + extra, + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ); + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ name ] = value; + value = jQuery.css( elem, name ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = jQuery.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 13 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( jQuery.isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + jQuery.proxy( result.stop, result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( type === "string" ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = value.match( rnothtmlwhite ) || []; + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, isFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + +support.focusin = "onfocusin" in window; + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = jQuery.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = jQuery.isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( jQuery.isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 13 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available, append data to url + if ( s.data ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( jQuery.isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Addresses

+

Collection of base classes that implement the work with Bitcoin addresses and address keys. +Supports addresses types PUBKEY, P2PKH, P2SH, P2SH-PWPKH, P2WPKH, P2WSH.

+
+

+

+
+
+
+class pybtc.PrivateKey(key=None, compressed=True, testnet=False)[source]
+

The class for creating private key object.

+ +++ + + + +
Parameters:
    +
  • key – (optional) private key in HEX, bytes string or WIF format. In case no key specified +new random private key will be created.
  • +
  • compressed – (optional) if set to True private key corresponding compressed public key, +by default set to True. Recommended use only compressed public key.
  • +
  • testnet – (optional) if set to True mean that this private key for testnet Bitcoin network.
  • +
+
+
+
+compressed
+

flag for compressed type of corresponding public key (boolean)

+
+ +
+
+hex
+

private key in HEX (string)

+
+ +
+
+key
+

private key in bytes (bytes)

+
+ +
+
+testnet
+

flag for testnet network private key (boolean)

+
+ +
+
+wif
+

private key in WIF format (string)

+
+ +
+ +
+

+

+
+
+
+class pybtc.PublicKey(key, compressed=True, testnet=False)[source]
+

The class for public key object.

+ +++ + + + +
Parameters:
    +
  • key

    one of this types allowed:

    +
      +
    • private key is instance of PrivateKey class
    • +
    • private key HEX encoded string
    • +
    • private key 32 bytes string
    • +
    • private key in WIF format
    • +
    • public key in HEX encoded string
    • +
    • public key [33/65] bytes string
    • +
    +

    In case no key specified with HEX or bytes string you have to provide flag for testnet +and compressed key. WIF format and PrivateKey instance already contain this flags. +For HEX or bytes public key only testnet flag has the meaning, comressed flag is determined +according to the length of key.

    +
  • +
  • compressed – (optional) if set to True private key corresponding compressed public key, +by default set to True. Recommended use only compressed public key.
  • +
  • testnet – (optional) if set to True mean that this private key for testnet Bitcoin network.
  • +
+
+
+
+compressed
+

flag for compressed type of corresponding public key (boolean)

+
+ +
+
+hex
+

public key in HEX (string)

+
+ +
+
+key
+

public key in bytes (bytes)

+
+ +
+
+testnet
+

flag for testnet network private key (boolean)

+
+ +
+ +
+

+

+
+
+
+class pybtc.Address(key=None, address_type='P2WPKH', testnet=False, compressed=True)[source]
+

The class for Address object.

+ +++ + + + +
Parameters:
    +
  • key

    (optional) one of this types allowed:

    +
      +
    • private key WIF format
    • +
    • instance of PrivateKey
    • +
    • private key HEX encoded string
    • +
    • instance of PublicKey
    • +
    +

    In case no key specified new Address will be created with random keys.

    +
  • +
  • address_type – (optional) P2PKH, PUBKEY, P2WPKH, P2SH_P2WPKH, by default P2WPKH.
  • +
  • compressed – (optional) if set to True private key corresponding compressed public key, +by default set to True. Recommended use only compressed public key.
  • +
  • testnet – (optional) if set to True mean that this private key for testnet Bitcoin network.
  • +
+
+

In case instanse is created from WIF private key, PrivateKey or PublicKey compressed and testnet flags +already contain in initial key parameter and will be ignored.

+
+
+address
+

address in base58 or bech32 encoding (string)

+
+ +
+
+hash
+

address hash

+
+ +
+
+hash_hex
+

address hash HEX (string)

+
+ +
+
+private_key
+

instance of PrivateKey class

+
+ +
+
+public_key
+

instance of PublicKey class

+
+ +
+
+redeem_script
+

redeeem script, only for P2SH_P2WPKH (bytes)

+
+ +
+
+redeem_script_hex
+

redeeem script HEX, only for P2SH_P2WPKH (string)

+
+ +
+
+script_hash
+

flag for script hash address (boolean)

+
+ +
+
+testnet
+

flag for testnet network address (boolean)

+
+ +
+
+type
+

flag for testnet network address (boolean)

+
+ +
+
+witness_version
+

version of witness program for SEGWIT address (string)

+
+ +
+ +
+ + +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/block.html b/docs/build/html/block.html new file mode 100644 index 0000000..91734e8 --- /dev/null +++ b/docs/build/html/block.html @@ -0,0 +1,138 @@ + + + + + + + + Blocks — pybtc documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Blocks

+

The class for creating transaction.

+
+
+class pybtc.Block(block)[source]
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/classes.html b/docs/build/html/classes.html new file mode 100644 index 0000000..fe429aa --- /dev/null +++ b/docs/build/html/classes.html @@ -0,0 +1,137 @@ + + + + + + + + Reference — pybtc documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Reference

+ +
+ + +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/contributing.html b/docs/build/html/contributing.html new file mode 100644 index 0000000..e7ea24e --- /dev/null +++ b/docs/build/html/contributing.html @@ -0,0 +1,148 @@ + + + + + + + + Contributing — pybtc documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Contributing

+
+

Instructions for contributors

+

In order to make a clone of the GitHub repo: open the link and press the +“Fork” button on the upper-right menu of the web page.

+

Workflow is pretty straightforward:

+
+
    +
  1. Clone the GitHub
  2. +
  3. Make a change
  4. +
  5. Make sure all tests passed
  6. +
  7. Add a record intp file into change.log.
  8. +
  9. Commit changes to own aiohttp clone
  10. +
  11. Make pull request from github page for your clone against master branch
  12. +
+
+
+
+

Tests coverage

+

We are trying hard to have good test coverage; please don’t make it worse. +All tests located in tests/ folder.

+
+
+ + +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/examples.html b/docs/build/html/examples.html new file mode 100644 index 0000000..16fa80f --- /dev/null +++ b/docs/build/html/examples.html @@ -0,0 +1,224 @@ + + + + + + + + Examples — pybtc documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Examples

+
+

Create address

+

This is example of usage Address class. The address class implements the work with addresses controlled by a private key. +Supports the ability to create P2WPKH, P2PKH, PUBKEY address types and P2SH_P2WPKH as exception for SEGWIT adoption. +It is recommended to use native SEGWIT address type - P2WPKH, which reduces costs of miner fee and expand block capacity. +To create an address, you need to create a class object. Buy default, +will be created P2WPKH address for mainnet.

+
>>> import pybtc
+>>> a = pybtc.Address()
+>>> a.address
+'bc1q6cxx5t8xkruz3s5khx7923xvsx5ry4c6p74m5s'
+>>> a.private_key.wif
+'L5XKGA2xEHcinWEpmyiABS1bqQux8Av5dGVqcpRtVJC3ZCR5sXUe'
+>>>
+>>> # create P2PKH legacy format
+>>> pybtc.Address(address_type="P2PKH").address
+'1ChpKurzFhdCULKaNHCc3Ra9KfxM2LRguw'
+>>>
+>>> # create testnet address
+>>> pybtc.Address(address_type="P2PKH", testnet=True).address
+'mpR4hDfu269yxgZtPVYSD21gtpvdxpTmH6'
+>>>
+>>> # create P2SH_P2WPKH SEGWIT adoption address
+>>> pybtc.Address(address_type="P2SH_P2WPKH").address
+'3Bqeq3XqL6azMK3BxNyr8vXgXUtoG63J4T'
+>>>
+
+
+
+
+

Get address from key

+

In case you already have private or public key you can object from your key.

+
>>> a = pybtc.Address('L5XKGA2xEHcinWEpmyiABS1bqQux8Av5dGVqcpRtVJC3ZCR5sXUe')
+>>> a.address
+'bc1q6cxx5t8xkruz3s5khx7923xvsx5ry4c6p74m5s'
+>>> a.public_key.hex
+'03b8b44876e1f45be7e42953ea47026c39cc45341344d3ab32701b93de696107af'
+>>>
+>>> # get address from public key
+>>> pub = pybtc.PublicKey('03b8b44876e1f45be7e42953ea47026c39cc45341344d3ab32701b93de696107af')
+>>>
+>>> pybtc.Address(pub).address
+'bc1q6cxx5t8xkruz3s5khx7923xvsx5ry4c6p74m5s'
+>>>
+
+
+
+
+

Pure functions for address

+

Create private key

+
>>> import pybtc
+>>> pybtc.create_private_key()
+'KyvZYvdzWD4JSPFt4wXwjG53as227zT2qiWbMTicZEUSjiwvbEqi'
+>>>
+>>> pybtc.create_private_key(compressed=False)
+'5Jw8DY1uBrd35xup6eD6KLEFa4AJFbX381HWuHvPGirJto9ZTnr'
+>>>
+>>> pybtc.is_wif_valid('5Jw8DY1uBrd35xup6eD6KLEFa4AJFbX381HWuHvPGirJto9ZTnr')
+True
+>>> pybtc.is_wif_valid('5Jw8DY1uBrd35xup6eD6KLEFa4AJFbX381**********Jto9ZTnr')
+False
+>>>
+
+
+

Get public key from private key

+
>>> import pybtc
+>>> pybtc.private_to_public_key('5Jw8DY1uBrd35xup6eD6KLEFa4AJFbX381HWuHvPGirJto9ZTnr')
+'0479f17a94410afd4f27588a192bacada53add0741765092dc0f8e2a29ea1bcd276dbc1ef74c3e0172d9db8047f2a0a5dc2e8e51a13f7f0cc072de906b765e0f7f'
+>>>
+>>> pybtc.public_key_to_address('0479f17a94410afd4f27588a192bacada53add0741765092dc0f8e2a29ea1bcd276dbc1ef74c3e0172d9db8047f2a0a5dc2e8e51a13f7f0cc072de906b765e0f7f')
+>>>
+>>> # this is uncompressed public key, so we can't create witness address
+>>> # we have to set witness_version to None to get non segwit address
+>>> pub = pybtc.private_to_public_key('5Jw8DY1uBrd35xup6eD6KLEFa4AJFbX381HWuHvPGirJto9ZTnr')
+>>> pybtc.public_key_to_address(pub, witness_version=None)
+'17mXwxxZRmj1nJJzDszZbW9URSAradEuAt'
+>>>
+
+
+

Tools

+
>>> pybtc.is_address_valid('17mXwxxZRmj1nJJzDszZbW9URSAradEuAt')
+True
+>>> pybtc.address_type('17mXwxxZRmj1nJJzDszZbW9URSAradEuAt')
+'P2PKH'
+>>> pybtc.address_net_type('17mXwxxZRmj1nJJzDszZbW9URSAradEuAt')
+'mainnet'
+>>>
+
+
+
+
+

Create script address

+
+
+ + +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/functional.html b/docs/build/html/functional.html new file mode 100644 index 0000000..6d8ea1b --- /dev/null +++ b/docs/build/html/functional.html @@ -0,0 +1,979 @@ + + + + + + + + Pure functions reference — pybtc documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Pure functions reference

+

Base function primitives implemented in functional programming paradigm.

+
+

Private keys

+
+
+pybtc.create_private_key(compressed=True, testnet=False, wif=True, hex=False)[source]
+

Create private key

+ +++ + + + + + +
Parameters:
    +
  • compressed – (optional) Type of public key, by default set to compressed. +Using uncompressed public keys is deprecated in new SEGWIT addresses, +use this option only for backward compatibility.
  • +
  • testnet – (optional) flag for testnet network, by default is False.
  • +
  • wif – (optional) If set to True return key in WIF format, by default is True.
  • +
  • hex – (optional) If set to True return key in HEX format, by default is False.
  • +
+
Returns:

Private key in wif format (default), hex encoded byte string in case of hex flag or +raw bytes string in case wif and hex flags set to False.

+
+
+ +
+
+pybtc.private_key_to_wif(h, compressed=True, testnet=False)[source]
+

Encode private key in HEX or RAW bytes format to WIF format.

+ +++ + + + + + +
Parameters:
    +
  • h – private key 32 byte string or HEX encoded string.
  • +
  • compressed – (optional) flag of public key compressed format, by default set to True.
  • +
  • testnet – (optional) flag for testnet network, by default is False.
  • +
+
Returns:

Private key in WIF format.

+
+
+ +
+
+pybtc.wif_to_private_key(h, hex=True)[source]
+

Decode WIF private key to bytes string or HEX encoded string

+ +++ + + + + + +
Parameters:hex – (optional) if set to True return key in HEX format, by default is True.
Returns:Private key HEX encoded string or raw bytes string.
+
+ +
+
+pybtc.is_wif_valid(wif)[source]
+

Check is private key in WIF format string is valid.

+ +++ + + + + + +
Parameters:wif – private key in WIF format string.
Returns:boolean.
+
+ +
+
+

Public keys

+
+

Warning

+

Using uncompressed public keys is +deprecated +in a new SEGWIT address format. +To avoid potential future funds loss, users MUST NOT use uncompressed keys +in version 0 witness programs. Use uncompressed keys only for backward +compatibilitylegacy in legacy address format (PUBKEY, P2PKH).

+
+
+
+pybtc.private_to_public_key(private_key, compressed=True, hex=True)[source]
+

Get public key from private key using ECDSA secp256k1

+ +++ + + + + + +
Parameters:
    +
  • private_key – private key in WIF, HEX or bytes.
  • +
  • compressed – (optional) flag of public key compressed format, by default set to True. +In case private_key in WIF format, this flag is set in accordance with +the key format specified in WIF string.
  • +
  • hex – (optional) if set to True return key in HEX format, by default is True.
  • +
+
Returns:

33/65 bytes public key in HEX or bytes string.

+
+
+ +
+
+pybtc.is_public_key_valid(key)[source]
+

Check public key is valid.

+ +++ + + + + + +
Parameters:key – public key in HEX or bytes string format.
Returns:boolean.
+
+ +
+
+

Addresses

+
+
+pybtc.hash_to_address(address_hash, testnet=False, script_hash=False, witness_version=0)[source]
+

Get address from public key/script hash. In case PUBKEY, P2PKH, P2PKH public key/script hash is SHA256+RIPEMD160, +P2WSH script hash is SHA256.

+ +++ + + + + + +
Parameters:
    +
  • address_hash – public key hash or script hash in HEX or bytes string format.
  • +
  • testnet – (optional) flag for testnet network, by default is False.
  • +
  • script_hash – (optional) flag for script hash (P2SH address), by default is False.
  • +
  • witness_version – (optional) witness program version, by default is 0, for legacy +address format use None.
  • +
+
Returns:

address in base58 or bech32 format.

+
+
+ +
+
+pybtc.address_to_hash(address, hex=True)[source]
+

Get address hash from base58 or bech32 address format.

+ +++ + + + + + +
Parameters:
    +
  • address – address in base58 or bech32 format.
  • +
  • hex – (optional) If set to True return key in HEX format, by default is True.
  • +
+
Returns:

script in HEX or bytes string.

+
+
+ +
+
+pybtc.public_key_to_address(pubkey, testnet=False, p2sh_p2wpkh=False, witness_version=0)[source]
+

Get address from public key/script hash. In case PUBKEY, P2PKH, P2PKH public key/script hash is SHA256+RIPEMD160, +P2WSH script hash is SHA256.

+ +++ + + + + + +
Parameters:
    +
  • pubkey – public key HEX or bytes string format.
  • +
  • testnet – (optional) flag for testnet network, by default is False.
  • +
  • p2sh_p2wpkh – (optional) flag for P2WPKH inside P2SH address, by default is False.
  • +
  • witness_version – (optional) witness program version, by default is 0, for legacy +address format use None.
  • +
+
Returns:

address in base58 or bech32 format.

+
+
+ +
+
+pybtc.address_type(address, num=False)[source]
+

Get address type.

+ +++ + + + + + +
Parameters:
    +
  • address – address in base58 or bech32 format.
  • +
  • num – (optional) If set to True return type in numeric format, by default is False.
  • +
+
Returns:

address type in string or numeric format.

+
+
+ +
+
+pybtc.address_to_script(address, hex=False)[source]
+

Get public key script from address.

+ +++ + + + + + +
Parameters:
    +
  • address – address in base58 or bech32 format.
  • +
  • hex – (optional) If set to True return key in HEX format, by default is True.
  • +
+
Returns:

public key script in HEX or bytes string.

+
+
+ +
+
+pybtc.is_address_valid(address, testnet=False)[source]
+

Check is address valid.

+ +++ + + + + + +
Parameters:
    +
  • address – address in base58 or bech32 format.
  • +
  • testnet – (optional) flag for testnet network, by default is False.
  • +
+
Returns:

boolean.

+
+
+ +
+
+

Script

+
+
+pybtc.decode_script(script, asm=False)[source]
+

Decode script to ASM format or to human readable OPCODES string.

+ +++ + + + + + +
Parameters:
    +
  • script – script in bytes string or HEX encoded string format.
  • +
  • asm – (optional) If set to True decode to ASM fromat, by default set to False.
  • +
+
Returns:

script in ASM format string or OPCODES string.

+
+
+ +
+
+pybtc.parse_script(script, segwit=True)[source]
+

Parse script and return script type, script address and required signatures count.

+ +++ + + + + + +
Parameters:
    +
  • script – script in bytes string or HEX encoded string format.
  • +
  • segwit – (optional) If set to True recognize P2WPKH and P2WSH sripts, by default set to True.
  • +
+
Returns:

dictionary:

+
    +
  • nType - numeric script type
  • +
  • type - script type
  • +
  • addressHash - address hash in case address recognized
  • +
  • script - script if no address recognized
  • +
  • reqSigs - required signatures count
  • +
+

+
+
+ +
+
+pybtc.delete_from_script(script, sub_script)[source]
+

Decode OPCODE or subscript from script.

+ +++ + + + + + +
Parameters:
    +
  • script – traget script in bytes or HEX encoded string.
  • +
  • sub_script – sub_script which is necessary to remove from target script in bytes or HEX encoded string.
  • +
+
Returns:

script in bytes or HEX encoded string corresponding to the format of target script.

+
+
+ +
+
+pybtc.script_to_hash(script, witness=False, hex=True)[source]
+

Encode script to hash HASH160 or SHA256 in dependency of the witness.

+ +++ + + + + + +
Parameters:
    +
  • script – script in bytes or HEX encoded string.
  • +
  • witness – (optional) If set to True return SHA256 hash for P2WSH, by default is False.
  • +
  • hex – (optional) If set to True return key in HEX format, by default is True.
  • +
  • sub_script – sub_script which is necessary to remove from target script in bytes or HEX encoded string.
  • +
+
Returns:

script in bytes or HEX encoded string corresponding to the format of target script.

+
+
+ +
+
+

Signatures

+
+
+pybtc.verify_signature(sig, pub_key, msg)[source]
+

Verify signature for message and given public key

+ +++ + + + + + +
Parameters:
    +
  • sig – signature in bytes or HEX encoded string.
  • +
  • pub_key – public key in bytes or HEX encoded string.
  • +
  • msg – message in bytes or HEX encoded string.
  • +
+
Returns:

boolean.

+
+
+ +
+
+pybtc.sign_message(msg, private_key, hex=True)[source]
+

Sign message

+ +++ + + + + + +
Parameters:
    +
  • msg – message to sign bytes or HEX encoded string.
  • +
  • private_key – private key (bytes, hex encoded string or WIF format)
  • +
  • hex – (optional) If set to True return key in HEX format, by default is True.
  • +
+
Returns:

DER encoded signature in bytes or HEX encoded string.

+
+
+ +
+
+pybtc.is_valid_signature_encoding(sig)[source]
+

Check is valid signature encoded in DER format

+ +++ + + + + + +
Parameters:sig – signature in bytes or HEX encoded string.
Returns:boolean.
+
+ +
+
+

Hash encoding

+
+
+pybtc.rh2s(raw_hash)[source]
+

Encode raw transaction hash to HEX string with bytes order change

+ +++ + + + + + +
Parameters:raw_hash – transaction hash in bytes string.
Returns:HEX encoded string.
+
+ +
+
+pybtc.s2rh(hash_string)[source]
+

Decode HEX transaction hash to bytes with byte order change

+ +++ + + + + + +
Parameters:raw_hash – transaction hash in bytes string.
Returns:bytes string.
+
+ +
+
+pybtc.reverse_hash(raw_hash)[source]
+

Reverse hash order

+ +++ + + + + + +
Parameters:raw_hash – bytes string.
Returns:bytes string.
+
+ +
+
+

Merkle root

+
+
+pybtc.merkle_root(tx_hash_list, hex=True)[source]
+

Calculate merkle root from transaction hash list

+ +++ + + + + + +
Parameters:
    +
  • tx_hash_list – list of transaction hashes in bytes or HEX encoded string.
  • +
  • hex – (optional) If set to True return result in HEX format, by default is True.
  • +
+
Returns:

merkle root in bytes or HEX encoded string corresponding hex flag.

+
+
+ +
+
+pybtc.merkle_branches(tx_hash_list, hex=True)[source]
+

Calculate merkle branches for coinbase transacton

+ +++ + + + + + +
Parameters:
    +
  • tx_hash_list – list of transaction hashes in bytes or HEX encoded string.
  • +
  • hex – (optional) If set to True return result in HEX format, by default is True.
  • +
+
Returns:

list of merkle branches in bytes or HEX encoded string corresponding hex flag.

+
+
+ +
+
+pybtc.merkleroot_from_branches(merkle_branches, coinbase_hash, hex=True)[source]
+

Calculate merkle root from merkle branches and coinbase transacton hash

+ +++ + + + + + +
Parameters:
    +
  • merkle_branches – list merkle branches in bytes or HEX encoded string.
  • +
  • coinbase_hash – list coinbase transaction hash in bytes or HEX encoded string.
  • +
  • hex – (optional) If set to True return result in HEX format, by default is True.
  • +
+
Returns:

merkle root in bytes or HEX encoded string corresponding hex flag.

+
+
+ +
+
+

Difficulty

+
+
+pybtc.bits_to_target(bits)[source]
+

Calculate target from bits

+ +++ + + + + + +
Parameters:bits – HEX string, bytes string or integer representation of bits.
Returns:integer.
+
+ +
+
+pybtc.target_to_difficulty(target)[source]
+

Calculate difficulty from target

+ +++ + + + + + +
Parameters:target – integer.
Returns:float.
+
+ +
+
+pybtc.bits_to_difficulty(bits)[source]
+

Calculate difficulty from bits

+ +++ + + + + + +
Parameters:bits – HEX string, bytes string or integer representation of bits.
Returns:integer.
+
+ +
+
+pybtc.difficulty_to_target(difficulty)[source]
+

Calculate target from difficulty

+ +++ + + + + + +
Parameters:target – integer.
Returns:float.
+
+ +
+
+

Tools

+
+
+pybtc.bytes_needed(n)[source]
+

Calculate bytes needed to convert integer to bytes.

+ +++ + + + + + +
Parameters:n – integer.
Returns:integer.
+
+ +
+
+pybtc.int_to_bytes(i, byteorder='big')[source]
+

Convert integer to bytes.

+ +++ + + + + + +
Parameters:
    +
  • n – integer.
  • +
  • byteorder – (optional) byte order ‘big’ or ‘little’, by default ‘big’.
  • +
+
Returns:

bytes.

+
+
+ +
+
+pybtc.bytes_to_int(i, byteorder='big')[source]
+

Convert bytes to integer.

+ +++ + + + + + +
Parameters:
    +
  • i – bytes.
  • +
  • byteorder – (optional) byte order ‘big’ or ‘little’, by default ‘big’.
  • +
+
Returns:

integer.

+
+
+ +
+
+pybtc.int_to_var_int(i)[source]
+

Convert integer to variable integer

+ +++ + + + + + +
Parameters:i – integer.
Returns:bytes.
+
+ +
+
+pybtc.var_int_to_int(data)[source]
+

Convert variable integer to integer

+ +++ + + + + + +
Parameters:data – bytes vriable integer.
Returns:integer.
+
+ +
+
+pybtc.var_int_len(n)[source]
+

Get variable integer length in bytes from integer value

+ +++ + + + + + +
Parameters:n – integer.
Returns:integer.
+
+ +
+
+pybtc.get_var_int_len(bytes)[source]
+

Get variable integer length in bytes from bytes

+ +++ + + + + + +
Parameters:bytes – bytes.
Returns:integer.
+
+ +
+
+pybtc.read_var_int(stream)[source]
+

Read variable integer from io.BytesIO stream to bytes

+ +++ + + + + + +
Parameters:stream – io.BytesIO stream.
Returns:bytes.
+
+ +
+
+pybtc.read_var_list(stream, data_type)[source]
+

Read variable integer list from io.BytesIO stream to bytes

+ +++ + + + + + +
Parameters:
    +
  • stream – io.BytesIO stream.
  • +
  • data_type – list data type.
  • +
+
Returns:

list of data_type.

+
+
+ +
+
+pybtc.int_to_c_int(n, base_bytes=1)[source]
+

Convert integer to compresed integer

+ +++ + + + + + +
Parameters:
    +
  • n – integer.
  • +
  • base_bytes – len of bytes base from which start compression.
  • +
+
Returns:

bytes.

+
+
+ +
+
+pybtc.c_int_to_int(b, base_bytes=1)[source]
+

Convert compressed integer bytes to integer

+ +++ + + + + + +
Parameters:
    +
  • b – compressed integer bytes.
  • +
  • base_bytes – len of bytes base from which start compression.
  • +
+
Returns:

integer.

+
+
+ +
+
+pybtc.c_int_len(n, base_bytes=1)[source]
+

Get length of compressed integer from integer value

+ +++ + + + + + +
Parameters:
    +
  • n – bytes.
  • +
  • base_bytes – len of bytes base from which start compression.
  • +
+
Returns:

integer.

+
+
+ +
+
+ + +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html new file mode 100644 index 0000000..28c345b --- /dev/null +++ b/docs/build/html/genindex.html @@ -0,0 +1,393 @@ + + + + + + + + + Index — pybtc documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Index

+ +
+ A + | B + | C + | D + | G + | H + | I + | K + | M + | P + | R + | S + | T + | V + | W + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

G

+ + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

K

+ + +
+ +

M

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ + + +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/index.html b/docs/build/html/index.html new file mode 100644 index 0000000..70c0247 --- /dev/null +++ b/docs/build/html/index.html @@ -0,0 +1,226 @@ + + + + + + + + Welcome to PYBTC — pybtc documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Welcome to PYBTC

+

Python library for Bitcoin.

+

Current version is .

+
+

Key Features

+
    +
  • Supports addresses types PUBKEY, P2PKH, P2SH, P2SH-PWPKH, P2WPKH, P2WSH.
  • +
  • Supports BIP32(Hierarchical Deterministic Wallets), BIP39(Mnemonic code generation)
  • +
  • Supports BIP141(Segregated Witness)
  • +
  • Transaction constructor
  • +
  • Mining pool basic primitives
  • +
+
+
+

Quick library Installation

+
$ pip install pybtc
+
+
+
+
+

Getting Started

+

Usage example:

+
import pybtc
+a = pybtc.Address()
+print(a.address)
+print(a.private_key.wif())
+
+
+
+
+

What’s new in pybtc 2.0 ?

+
    +
  • Mnemonic code generation (BIP39)
  • +
  • Hierarchical Deterministic Wallets (BIP32)
  • +
  • Wallet class implemented acording BIP44
  • +
  • Imporved transaction deserialization perfomance
  • +
+
+
+

Source code

+

The project is hosted on GitHub

+

Please feel free to file an issue on the bug tracker if you have found a bug +or have some suggestion in order to improve the library.

+
+
+

Dependencies

+
    +
  • Python 3.3.3+
  • +
  • secp256k1
  • +
+
+
+

Authors and License

+

The pybtc package was initially written by Aleksey Karpov and development continues with contributors.

+

Recent contributors:

+ +

It’s GPL-3.0 licensed and freely available.

+

Feel free to improve this package and send a pull request to GitHub.

+
+ +
+ + +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/installation.html b/docs/build/html/installation.html new file mode 100644 index 0000000..4aac1f0 --- /dev/null +++ b/docs/build/html/installation.html @@ -0,0 +1,150 @@ + + + + + + + + Installation — pybtc documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Installation

+

This part of the documentation covers the installation of pybtc library. The first step to using any software package is getting it properly installed.

+
+

Get from pip package

+

To install pybtc, simply run this simple command in your terminal of choice:

+
$ pip install pybtc
+
+
+

If you don’t have pip installed, this Python pip installation guide can guide you through the process.

+
+
+

Get the Source Code

+

You can clone the public repository:

+
$ git clone git://github.com/bitaps-com/pybtc
+
+
+

Once you have a copy of the source, you can embed it in your own Python package, or install it into your site-packages easily:

+
$ cd pybtc
+$ python3 setup.py install
+
+
+
+
+ + +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..7ecf7813365f1a1e7956521a18e0acacb492f46a GIT binary patch literal 859 zcmV-h1El;TAX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGk#d17>9 z3L_v^WpZ8b#rNMXCQiPX<{x4c-p0x&2HQv5PAtM8A~t=s)U_vaZ%TT4bqNi)KYzh{A*UDbA746H8zffoH3#D zEitcMN>E4wYes_~C>Mhz3+2E%4%k3*kl+l}x@*zs66PI|bGqdV)o8CyliHa}R)Z`q z#$t*+7GkInMkqcmA2ait94ZCJfa^AaXD6UE;;g70G?buR8VPmAoZ&_Q(r^pVtl2_A7OedWzn@&u7s=wDKK^o_C&}J#iofp#C08!rmy7@a literal 0 HcmV?d00001 diff --git a/docs/build/html/search.html b/docs/build/html/search.html new file mode 100644 index 0000000..4825435 --- /dev/null +++ b/docs/build/html/search.html @@ -0,0 +1,133 @@ + + + + + + + + Search — pybtc documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Search

+
+ +

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

+
+

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

+
+ + + +
+ +
+ +
+ +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js new file mode 100644 index 0000000..dc383c8 --- /dev/null +++ b/docs/build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["address","block","classes","contributing","examples","functional","index","installation","transaction"],envversion:53,filenames:["address.rst","block.rst","classes.rst","contributing.rst","examples.rst","functional.rst","index.rst","installation.rst","transaction.rst"],objects:{"pybtc.Address":{address:[0,1,1,""],hash:[0,1,1,""],hash_hex:[0,1,1,""],private_key:[0,1,1,""],public_key:[0,1,1,""],redeem_script:[0,1,1,""],redeem_script_hex:[0,1,1,""],script_hash:[0,1,1,""],testnet:[0,1,1,""],type:[0,1,1,""],witness_version:[0,1,1,""]},"pybtc.PrivateKey":{compressed:[0,1,1,""],hex:[0,1,1,""],key:[0,1,1,""],testnet:[0,1,1,""],wif:[0,1,1,""]},"pybtc.PublicKey":{compressed:[0,1,1,""],hex:[0,1,1,""],key:[0,1,1,""],testnet:[0,1,1,""]},pybtc:{Address:[0,0,1,""],Block:[1,0,1,""],PrivateKey:[0,0,1,""],PublicKey:[0,0,1,""],Transaction:[8,0,1,""],address_to_hash:[5,2,1,""],address_to_script:[5,2,1,""],address_type:[5,2,1,""],bits_to_difficulty:[5,2,1,""],bits_to_target:[5,2,1,""],bytes_needed:[5,2,1,""],bytes_to_int:[5,2,1,""],c_int_len:[5,2,1,""],c_int_to_int:[5,2,1,""],create_private_key:[5,2,1,""],decode_script:[5,2,1,""],delete_from_script:[5,2,1,""],difficulty_to_target:[5,2,1,""],get_var_int_len:[5,2,1,""],hash_to_address:[5,2,1,""],int_to_bytes:[5,2,1,""],int_to_c_int:[5,2,1,""],int_to_var_int:[5,2,1,""],is_address_valid:[5,2,1,""],is_public_key_valid:[5,2,1,""],is_valid_signature_encoding:[5,2,1,""],is_wif_valid:[5,2,1,""],merkle_branches:[5,2,1,""],merkle_root:[5,2,1,""],merkleroot_from_branches:[5,2,1,""],parse_script:[5,2,1,""],private_key_to_wif:[5,2,1,""],private_to_public_key:[5,2,1,""],public_key_to_address:[5,2,1,""],read_var_int:[5,2,1,""],read_var_list:[5,2,1,""],reverse_hash:[5,2,1,""],rh2s:[5,2,1,""],s2rh:[5,2,1,""],script_to_hash:[5,2,1,""],sign_message:[5,2,1,""],target_to_difficulty:[5,2,1,""],var_int_len:[5,2,1,""],var_int_to_int:[5,2,1,""],verify_signature:[5,2,1,""],wif_to_private_key:[5,2,1,""]}},objnames:{"0":["py","class","Python class"],"1":["py","attribute","Python attribute"],"2":["py","function","Python function"]},objtypes:{"0":"py:class","1":"py:attribute","2":"py:function"},terms:{"03b8b44876e1f45be7e42953ea47026c39cc45341344d3ab32701b93de696107af":4,"0479f17a94410afd4f27588a192bacada53add0741765092dc0f8e2a29ea1bcd276dbc1ef74c3e0172d9db8047f2a0a5dc2e8e51a13f7f0cc072de906b765e0f7f":4,"17mxwxxzrmj1njjzdszzbw9ursaradeuat":4,"1chpkurzfhdculkanhcc3ra9kfxm2lrguw":4,"3bqeq3xql6azmk3bxnyr8vxgxutog63j4t":4,"5jw8dy1ubrd35xup6ed6klefa4ajfbx381":4,"5jw8dy1ubrd35xup6ed6klefa4ajfbx381hwuhvpgirjto9ztnr":4,"boolean":[0,5],"byte":[0,5],"case":[0,4,5],"class":[0,1,4,6,8],"default":[0,4,5],"float":5,"function":6,"import":[4,6],"new":[0,5],"public":[0,4,6,7],"return":5,"true":[0,4,5],"try":3,For:0,NOT:5,The:[0,1,4,6,7,8],Use:5,Using:5,abil:4,accord:[0,5],acord:6,add:3,address:[2,6],address_hash:5,address_net_typ:4,address_to_hash:5,address_to_script:5,address_typ:[0,4,5],addresshash:5,adopt:4,against:3,aiohttp:3,aleksei:6,all:3,allow:0,alreadi:[0,4],ani:7,asm:5,avail:6,avoid:5,backward:5,base58:[0,5],base:[0,5],base_byt:5,basic:6,bc1q6cxx5t8xkruz3s5khx7923xvsx5ry4c6p74m5:4,bech32:[0,5],big:5,bip141:6,bip32:6,bip39:6,bip44:6,bit:5,bitap:7,bitcoin:[0,6],bits_to_difficulti:5,bits_to_target:5,block:[2,4,6],branch:[3,5],bug:6,bui:4,button:3,byteord:5,bytes_need:5,bytes_to_int:5,bytesio:5,c_int_len:5,c_int_to_int:5,calcul:5,can:[4,7],capac:4,chang:[3,5],check:5,choic:7,clone:[3,7],coinbas:5,coinbase_hash:5,collect:0,com:7,command:7,commit:3,compat:5,compatibilitylegaci:5,compres:5,compress:[0,4,5],comress:0,constructor:6,contain:0,continu:6,contribut:6,contributor:6,control:4,convert:5,copi:7,correspond:[0,5],cost:4,count:5,cover:7,coverag:6,creat:[0,1,5,6,8],create_private_kei:[4,5],current:6,data:5,data_typ:5,decod:[5,8],decode_script:5,delete_from_script:5,depend:5,deprec:5,der:5,deseri:6,determin:0,determinist:6,develop:6,dictionari:5,difficulti:6,difficulty_to_target:5,document:7,don:[3,7],easili:7,ecdsa:5,emb:7,encod:[0,6],exampl:6,except:4,expand:4,fals:[0,4,5,8],fee:4,feel:6,file:[3,6],first:7,flag:[0,5],folder:3,fork:3,format:[0,4,5],found:6,free:6,freeli:6,from:[0,3,5,6],fromat:5,fund:5,futur:5,gener:6,get:5,get_var_int_len:5,git:7,github:[3,6,7],given:5,good:3,gpl:6,guid:7,hard:3,has:0,hash160:5,hash:[0,6],hash_hex:0,hash_str:5,hash_to_address:5,have:[0,3,4,6,7],hex:[0,4,5],hierarch:6,host:6,human:5,ignor:0,implement:[0,4,5,6],imporv:6,improv:6,initi:[0,6],insid:5,instanc:0,instans:0,instruct:6,int_to_byt:5,int_to_c_int:5,int_to_var_int:5,integ:5,intp:3,is_address_valid:[4,5],is_public_key_valid:5,is_valid_signature_encod:5,is_wif_valid:[4,5],issu:6,jto9ztnr:4,karpov:6,karybkin:6,kei:0,kyvzyvdzwd4jspft4wxwjg53as227zt2qiwbmticzeusjiwvbeqi:4,l5xkga2xehcinwepmyiabs1bqqux8av5dgvqcprtvjc3zcr5sxu:4,legaci:[4,5],len:5,length:[0,5],librari:7,link:3,list:5,littl:5,locat:3,locktim:8,log:3,loss:5,mainnet:4,make:3,master:3,mean:0,menu:3,merkl:6,merkle_branch:5,merkle_root:5,merkleroot_from_branch:5,messag:5,mine:6,miner:4,mnemon:6,mpr4hdfu269yxgztpvysd21gtpvdxptmh6:4,msg:5,must:5,nativ:4,necessari:5,need:[4,5],network:[0,5],non:4,none:[0,4,5,8],ntype:5,num:5,numer:5,object:[0,4],onc:7,one:0,onli:[0,5],opcod:5,open:3,option:[0,5],order:[3,5,6],own:[3,7],p2pkh:[0,4,5,6],p2sh:[0,5,6],p2sh_p2wpkh:[0,4,5],p2wpkh:[0,4,5,6],p2wsh:[0,5,6],packag:6,page:3,paradigm:5,paramet:[0,5],pars:5,parse_script:5,part:7,pass:3,perfom:6,pip:6,pleas:[3,6],pool:6,potenti:5,press:3,pretti:3,primit:[5,6],print:6,privat:[0,4,6],private_kei:[0,4,5,6],private_key_to_wif:5,private_to_public_kei:[4,5],privatekei:0,process:7,program:[0,5],project:6,properli:7,provid:0,pub:4,pub_kei:5,pubkei:[0,4,5,6],public_kei:[0,4],public_key_to_address:[4,5],publickei:[0,4],pull:[3,6],pure:6,pwpkh:[0,6],pybtc:[0,1,4,5,7,8],python3:7,python:[6,7],random:0,raw:5,raw_hash:5,raw_tx:8,read:5,read_var_int:5,read_var_list:5,readabl:5,recent:6,recogn:5,recommend:[0,4],record:3,redeeem:0,redeem_script:0,redeem_script_hex:0,reduc:4,refer:6,remov:5,repo:3,repositori:7,represent:5,reqsig:5,request:[3,6],requir:5,result:5,revers:5,reverse_hash:5,rh2:5,right:3,ripemd160:5,root:6,run:7,s2rh:5,script:[0,6],script_hash:[0,5],script_to_hash:5,secp256k1:[5,6],segreg:6,segwit:[0,4,5],send:6,set:[0,4,5],setup:7,sha256:5,sig:5,sign:5,sign_messag:5,signatur:6,simpl:7,simpli:7,site:7,softwar:7,some:6,sourc:[0,1,5,8],specifi:[0,5],sript:5,start:5,step:7,straightforward:3,stream:5,string:[0,5],sub_script:5,subscript:5,suggest:6,support:[0,4,6],sure:3,target:5,target_to_difficulti:5,termin:7,test:6,testnet:[0,4,5,8],thi:[0,4,5,6,7],through:7,tool:[4,6],tracker:6,traget:5,transact:[1,2,5,6],transacton:5,tx_format:8,tx_hash_list:5,type:[0,4,5,6],uncompress:[4,5],upper:3,usag:[4,6],use:[0,4,5],user:5,using:[5,7],valid:5,valu:5,var_int_len:5,var_int_to_int:5,variabl:5,verifi:5,verify_signatur:5,version:[0,5,6,8],vriabl:5,wallet:6,web:3,which:[4,5],wif:[0,4,5,6],wif_to_private_kei:5,wit:[0,4,5,6],witness_vers:[0,4,5],work:[0,4],workflow:3,wors:3,written:6,you:[0,4,6,7],your:[3,4,7]},titles:["Addresses","Blocks","Reference","Contributing","Examples","Pure functions reference","Welcome to PYBTC","Installation","Transactions"],titleterms:{"function":[4,5],"new":6,"public":5,address:[0,4,5],author:6,block:1,code:[6,7],content:6,contribut:3,contributor:3,coverag:3,creat:4,depend:6,difficulti:5,encod:5,exampl:4,featur:6,from:[4,7],get:[4,6,7],hash:5,instal:[6,7],instruct:3,kei:[4,5,6],librari:6,licens:6,merkl:5,packag:7,pip:7,privat:5,pure:[4,5],pybtc:6,quick:6,refer:[2,5],root:5,script:[4,5],signatur:5,sourc:[6,7],start:6,tabl:6,test:3,tool:5,transact:8,welcom:6,what:6}}) \ No newline at end of file diff --git a/docs/build/html/transaction.html b/docs/build/html/transaction.html new file mode 100644 index 0000000..1cb7eb5 --- /dev/null +++ b/docs/build/html/transaction.html @@ -0,0 +1,138 @@ + + + + + + + + Transactions — pybtc documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Transactions

+

The class for creating transaction.

+
+
+class pybtc.Transaction(raw_tx=None, tx_format='decoded', version=1, lockTime=0, testnet=False)[source]
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + Fork me on GitHub + + + + + + \ No newline at end of file

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 pGExChZe zbP`=eH_=1%68*#t#EryF#65|75%(bmh%7Nk3==tGgcv1mAr2Aa!~`)(+)9*)DdI43 zgqR_2BkoT;fOrsbJMj?Wp~S<9M-Y!99!)%!I7U34cmnYx;>pAv#8Zi<6VD)?MLe5$ zF7Z6#1;h)97ZWcbUPio}cqQ>F;x)u;iPsZvAl^j0nRqMlHsT$`JBfD_?;+ktyr1|W z@gd?P#7Bvb6Q3YHMSPn0Eb%$w3&aqMGAMqdJgyq1A#7V@-!~$X=v6yHe zmJ-W|6~sznHL->`l~_ldPMkrUMVw8XOPoiXPh3E(CoUo`AvO?~5}SxdVheE@v6a|P z>>#cnt|YD^b`f_Yt|qP_t|fL8Ekql!huBB76W0+P#D1cSxSr@C`iOqw0C6L6GjUJi z-o$-~`x04Vh!`dg5+g*OxP=%a#)$$kNfe0^F-;sMjuJD({fPS$4Lv*AcHL-blQOcnk4X;_bvch<6e1Cf-ZDkN5!bLE^*2M~IIRA16LZe2VxC@mb>Y z#21J!5nm?0N_>s@2Jube+r)Q>?-Ac8en{L&{FwL&@iXG*#4m|o5x*gROZ=Yr1Mw%~ z&%|GezY+f+{z?3s_&?&m#0e{ayAUT4rw|K>MZ{ua39*z|POKnS5vz%{#Hqw-#OcJD z#972S#JNO1BJN7ujkr5;4be>O zCR&L$VlT0exCe0^(Mjwlx{2$FUZRh zg?K9QG~yY=Gl^#t&mo>iJfCmeVimE5SWB!UP9x4B&Lqwz&LPetGQVh^@pnVh3?KaV4>n*hSoxxSF^-aV^nIv=FVt9%3)iPTYg&AUcUIqMPU; zdWnAG2I5BICgPsNy@>k|14Nb>B!-C`F+z+Iw-ASjabkj)ByJ^2#1wIuI6}-2w-NUz z9zZ;ZxSe4&tfA(}`yg&mx{pJePPL@dDz7 z#EXfS5HBNMPP~$M74aJ4wZ!X*HxO?k-b}oecpLE!;+@31iT4oiBi>JZkoXYs5#po7 z$B9o6pCUd@e3tke@de_G#FvS$5MLv{PJEO27V#b8yTtd29}ssEKO%lY{FL}P@eATt z#IK3p62BwU&TGw~PVZ^Yk;e-i&9{*U+%al$I#MB*gkWMToakXTGK5KD<=#0p|1 zv6@&zoJy=CPAASF&LYkx&Lz$x&L=J)))N;Imk=9>ONmWHBe8|JjMz$SCw3555LXgc z5xa=H5myt}5Z4mBi58-b*hB0i+KKCk4q`viMO;tx5Pd{Hae%myxS6;oac|;2#C?e@ zF+>a#2Z<3PPuxO`5#vOGm?VlsiI^r16Gw>|;(o;ai3bu7A|6aUgm@V7aN?1~qlm{4 zk0l;QJf3(W@g(9Y#2v)bh^G_JB%Vb)hj=dWeBuSfi-;E!FC|_^yn=Wo@oM5V#OsLH z6K^EmM7)J~EAe*X9mKnccN6a=-bZ|Z_#p9N;v>Yzh>sJWBtAuahWIS;dEyJimxwPD zUnRaqe1rHV@onNe#P^8r6F(&GBz{c%g!mcpbK;l8uZZ6eza@T8{DJrr@n_<%#NUX2 z5dS3pP5dA6U*d$-z+H%wh*O9K#3Eubv4mJkEGJeFtBBRaTH;jVG~#sPOyVr!9O7Ie zL!3`sNUSF=CN3d15|#ns zNK6sa#1Y~saT{?z;sL}1iQ9<>6AvXGMm&OeB=KnCF~l+Aal{jdClXI4oPJ*NJZs-y*(Ee3$qh@dM(A z#E*y{6F((>M*M>KCGl(GH^lFV-xGf%{zUwR_$%>u;vdAnh<_9RA^uC8xCXcjaWZiV zv5;6qG!RROWyEq~C9#TFL#!p%5vLJn5N8r+6Xy`;5gFnF;zHsg;$mV0v60wBY$mo4 zO~h7W8?l49oVb$MN$eu-N?c9cow$~0CR&JAVh^#GXeaJLbP%0H7tu}h5WPe{aRYH9 zaT9S*;$Fmkhyfx?3=+dcju;_EiCc(6#5gfQOcJ*eC1Q#=OdKI*h}($!6AvIBMBGk1 zgm@_NaN-ffqliZnk0p)~k0+i$Jc)QRaR>2K;_1XQh-VScCZ0Unjmve2e%F@m=Ek#1Du&i60R^A%05yocIOtE8^G0Z;9U# ze<1!y{F(R*@i*e{#6O9D5&uX0hd5y^a3XOMaWb)hSV$};8i=LDGGYa>l2}cwAx0n@j%gWPCx9UpZP`-yJidZL%;BW@rL5H}Gw6ZazSO$-qCB?gHh zB1aq~Mu|Leh!`U#hyrmdQ6#2_Y2pZRl(>z!AMpUCjOs7dkPxE zhypMg+qP}nwr$&1V>M~gq_J(=wr$(C`=5O{bLV^A*_nN~tFRhtu?`!s5u33E+prxw zu?u^!7yEGlhj182aSSJL5~pzn=WreuaS2y&71wbCw{RPGaSsph5RdT$&+r^C@d|J7 z7Vq%^pYR!9@eM!l6Tk5Xfujcy1i=s-ArT5;5EkJP0g(_HQ4tL>5EHQx2k{Ue36Tg% zkQB+00;!N1X^{>YkP(@Y1=)}tIgtx_kQez;0EJK(MNteTP!gq42IWv56;TOQP!-it z1GP{abx{uu&=8FS=-#GDfSzhIsRdf1HQJyZ+M^>np$odAJ9?lOdZRD;p+5#-5C&r? zhG7IoViZPW48~#{#$y5|Vlt*+8m40=W?>HIVm=mN5f)=9mSF`}Vl~!a9oAzbHen04 zVmo$V7j|PW_Tc~y;xLZj7>?s4PT>sB;yfqY0X!Ia;C>+Mq4kqXRmjGrFQ1dY~tIqYwJwFATsy z48{-)!*Gnm-x!U5Fc$w}JpRK(Ou`gQ#dOTTEX>AS%)VO zCTzx5Y{L%h#BS`tKJ3Rq9KsPC#c`a#DV)YxoWliN#ARH;HC)F{+`=8)#eF=$BRs}a zJi`mT#B034JG{q7e8Lxe#drL`FZ@QJm;nSvPy|B=ghXhBK{$j*L_|UqL`8JOKrF;Y zT*N~HBt&8)K{6yqN~A&>q(ypUKqh2HR%AmCs}6h(2AKq-_)S(HNs zR77P|K{ZrIP1Hgi)J1(XKqE9pQ#3;hv_xyPK|8cZM|46LbVYacKri%0U-UzN48R}^ z#!w8y2#mxijK&y@#W;+|1Wd$aOu;lv$4tz^9L&XhEWjcx#!@W93arFxtid|0$3|?z z7Hq|K?7%MU#$N2h0UX3(9KkUh$4Q*R8Jxv=T)-t<##LOy4cx?S+`&EE$3r~A6FkLp zyud5G##_9@2Yke5e8D$-$4~si9|VdOKoA5)aD+f8ghp6|Lj*)bWJEzUL`O`-LL9_J zd?Y|3Bt}vsLkgrsYNSCrq(??%LKb92cH}@V-VH80z6h}#vLK&1rc~n3p zR7O=)Lk-kKZPYLvo})JFp}LSr;VGqgZUv_>1WLwj^YCv-tqbVm>LLT~g%KlH}{ z48mXx#W0M(NQ}a0jKNrp!+1=r9K&&(#3`J?S)9iOT*75s#Wmc(P29#E+{1l5#3MYx zQ#{8Dyuxd|#XEe!M|{Q?e8YGA#4r3opf~{pK~Mxo2!ujtghe<+Ktx1F6huRG#6&E_ zL0rT~0wh9WBt z&Der%*p8jpg+17d{WyR_IEh7&l6(>Q~3IFF0Cge$m;>$rhixQ)BGhX;6w$9RHg zc#fBNg*SMM_xONM_>8akh9CHe-}r;TaRUf~UY{-tB$b~$}i~J~nLMV))D25U!iP9*8aww0A zsDvu0it4C=TBwb>sD}njP&;?!59X-$sz0nu_&>sUZ2!k;c z!!QCPF$$wG24gV}<1qmfF&R@Z4bw3bvoHs9F&_)C2#c{4%di3~u^MZz4(qWIo3I62 zu^l_G3%juw`)~jUaTrH%499U2r*H;maUK_N372sd*Kh+jaT|AV5BKp9kMIOf@fbRDUlj!kPhjQ5t)z$S&C1yLA9Pz=RU5~WZEWl)f zM&NIZ!ao>;e=!dKVFD&$GNxi0W?&{}V-DtFJ{DpTmS8ECV+B@WHP&JsHee$*V+*!n zJ9c6h_Fyme;{XofFplCFPT(X?;|$K>JTBrAuHY)J;|6ZwHtymc9^fG!;|ZSOIbPxw z-rz0X;{!h7Grr;*e&8p5;|~HS2p|Z8Avi)J6v7}Z!XpAAAu^&O8e$+OVj~XXAwCi! z5t1M&k|PCDAvMw>9Wo#zG9wGJAvp)iV~7)qcdN}~+Qp*$+05~`po zs-p&Kp*HHG9vYw_8lwrCp*dQj722RJ+M@$Hp)fti^h4z$R?QR&2u# z?8I*D!9MKAK^(#n9K~^*z$u)@S)9WKT*PHu!8KgRP29pA+{Jx7z#}}yQ#`{9yu@p~ z!8^RiM|{E;e8qSCz%Tqppo9SgMo>MqI>00whFY zBtbGHM@pnZ8l**fWI!flMpk4)4&+2`!d0fCHT*g&g!wuZTZQQ{<+{Z&a!V^5jbG*PSyvAF+ z!v}oCXMDjoe8*4x!XE@m6hIIJMR0^bD1=5>ghK>GL}WxkG(<;C#6ldzMSLVcA|ysq zBtr_ML~5i#I;2NNWI`5XMRw#sF62gD#b4-;ff$4#7>eN-fxj^d z|6mOM#W?(j37CY*n2Kqbfti?%Ihcp}ScpYff~8oF6TvoITTF%Ju{5R0({%di|Pu?lOj7VEJAo3I&Mu?;)06T7ho z`>-DeaR^6n6vuG_r*Il)aSj)75tnfV*Ki#-aSL~F7x(c1kMI~z@eD8U60h+F@9-WU z@d;n>72oj#zwjG@k^~SKK@kig5E7vg2H_AM5fKSd5Eao81F;YraS;y*kPwNH1j&#b zDUk|kkQV8Y0hy2)S&c0;NzIWl;_lP!W|;1=Ua;HBk$7 zP#5*l0FBTXP0gy(7)!AXE3gu)u?Fj~9viU-rX8+)-2 z2XGLFaRkS394B!KXK)thaRHZb8CP))H*gcTaR>Ks9}n>ePw*7a@dB^#8gKCqAMg>M z@de-T9Y664e-J2X06`EG!4U$X5E@|-4iOL$kr4&a5FIfQ3vmz^@sR+DkQhmk3@MNj zsRQWVCQX2rO43OgkP(@Y1=)}tIgtx_kQez;0EJK(MNteTP!gq42IWv56;TOQP!-it z1GP{abx{uu&=8H$1kKPKEzt^X&=&2{0iDnpUC|9a&=bAU2mSCD24EltV+e*}I7Z@c zjK)70i+?d5|6w8~VG5>VI%Z%NW@9eqVF4CmF_vH%mSZJWVGY(|JvLwyHe)NcVFz|% zH}+s3_TwN9;Ruf6I8NXcPU9@j;Q}t=GOpknuHzc@lCT3v{=3+h;U=bE$DVAXcR$?{QU>(+DBQ{|RwqiSWU>9~{ zFZSU84&pG5;24hMBu?QB&f+{S;1Vw5Dz4!MZsIoX;2!SdAs*ogp5i%P;1youE#Bb+ zKH@XJ;2XZYyI#qahlh37VogTA&qLqb=H@13IEJx}Y1nqbGWy5BlOS^v6I9!VnC_aE!p;7=?c@ z2LECl{=)=J!emUvG|a$E%*Gtd!+b2nA}qmDEXNA0!fLF=I&8p3Y{nLB!*=Y%F6_Zx z?8gBd!eJc6F`U3joW>cP!+Bi9C0xN(T*nRE!fo8eJv_ieJjN3|!*jgEE4;y5yvGN8 z!e@NNH~hd){Kg*yP7y#51VeCyL@0zoScFFeL_%alMKr`fOvFYU#6x@}L?R?XQY1$T zq(W+>MLJ|aMr1}7WJ7l3L@wk(UgSps6hdJXMKP2>Nt8wzltXz`L?u)~Ra8d})Ix34 zMLje?Lo`McG(&T=L@TsGTeL?9bV6rzMK|<7PxM9~^uu2mfPol{AsB|?7>U0z8vkG{ z{>6Cwhl!YkDVU1sn1NZCjk%bI1z3p1Sb}9(j+I!2HCT)F*nmygjIG#)9oUK8*n@r8 zkApabBRGoVIDu0*jk7q13%H2OxPoiAj+?lJJGhJccz{QEjHh^p7kG)+c!PI%kB|6- zFZhb@_<>*ejX)^_2#lZzh7bse&h>f_2hXhE7#7Kf@~3OX_$_gn1wl*i}_f9MOcibScVl?iPczxby$y$*n}phJIE6Dfi}SdEOSp`yxP}|JiQBk?d$^B>c!Vc-isyKNS9p!Lc!v-8h|lQ40fJ8`)q)3JoNQu-) zgLFubjL3v6$cpU9fn3OqyvT2TD2wu_fJ&&0s;GtK)Xo}`&fmUdZwrGbA=!nkff^O)Jp6G=>=!?J59|JK6LogJ>F#>;M6#l^&{EKn; z4-+s6lQ9+3Fat9&8*?xZ^RW<%umnr794oL2tFadAumKyf8C$Ro+p!b7um^jw9|v#< zhjA3gZ~`ZB8fS10=W!92a0OR!9XD_bw{aKu@Bk0-7*FsF&+!tk@CI-39v|=tpYavn z@B=^b8-EZubpSyS48ai+p%4aP5gri`36T*M(GUYM5gTz35Al%@iI45u^#kr`Q#4cUJsDB>u)|{DZOh7vu3C zCSnq%U@E3#24-P4=3*WeU?CP`36^0wR$>*_U@g{T12$nZwqhH0U?+BC5B6a{4&o4w z;3$sc1Ww^J&f**{;36*L3a;TgZsHd1;4bdt0UqHop5hr^;3Zz;4c_5BKH?L;;48l4 z2Y%r<0;LHcFoGf&LLekUBMibJJR%|zq97`wBL-q2HsT^45+ETGBMFirIZ`4O(jYC; zBLgxaGqNHZav&#iBMYy&_qX8PB zF`A+oTA(FbqYc`jJvyQjx}Yn%qX&ASH~OL<`eOhFVK9bb7)D?uMqxC@U@XRAJSJcw zCSwYwVLE1F7Up0s=3@aCVKJ6s8CGB=R$~p;VLdit6SiP0wqpl&VK??-9}eIk4&w-p z;W$p>6wcr*&f@|u;WDn`8gAewZsQK_;XWSX5uV^Fp5p~x;Wggk9X{YAKI03%;X8if z7yckn+5mzeD1svdLLoH5A{-(hA|fLSq9HnBA{OExF5)8r5+N~?A{kO3B~l{|(jh%E zA``M8E3zX8av?YJA|DE%APS=hilI14q7=%YEXtz-Dxor}q8e(TCTgP&>Y+Xwq7j;) zDVn1NTA?-Cq8&P*BRZoCx}iIIq8Iw0FaAP*48$M|!B7mx2>gvv_y=R~FUH|NOu!^e z##Bth49vuA%)va&$3iT^5-i1XtiUR)##*ey25iJ;Y{52c$4>0R9_+<_9KazQ#!(!@ z37o`foWVJq$31OLKuWactk)XL`GCZLkz@3Y{Wr4#79CTLJ}lJa-={iq()k#Lk46- zW@JG&WJgZqLLTHreiT3<6h=`LLkW~bX_P@Zlt)EWLKRd+b<{vD)J9#@LjyEKV>CfC zG)GIcLL0P2dvri2bVgTnLl5*sZ}dSw{DlD+h`|_wVHl2)_#30~560qOjK_bNh)I}& zshEx#n1$Jxi+Napg;I?~h>LhgfP_elBuIwjNQqQPgS1GG49JAc z$ck*pft<*VJjjRqD2PHRf}$vn5-5ezD2sBafQqP$DyW9)sEJyrgSx1X255xFXo_ZN zftF~EHfV?T=!j0}g0AR}9_WSM=!<^nj{z8j!5E5R7=e)(h0z#;u^5N(n1G3xj47Cg z>6nRGn1i{Pj|EtS#aN1ESb>#TjWt+@_1K6_*n+Ltjvd&A-PntLIDmsVj3YRP<2Z>^ zID@k|j|;ej%eabbxPhCvjXSu9`*?^)c!H;Rju&`^*LaI}_<)c2j4$|x@A!#d_=7+h z0tkYj2#yd4h0q9#aEO42h>R$RhUkciScrqTh>rwFgv3aSWJrOONR2c|hxEvZOvr+) z$c`Myh1|%Cd?EBb0h2HpQ!x!Q zFcY&e2lFr=3$X}GuoTO&0;{kZYq1U+uo0WF1>3M4JFyFUuowGr0EciGM{x`%a1y6+ z2Ip`d7jX$!a23~a1GjJ+cX1C70_dKq%|r8JJi#+O$4k7z8@$DPe84As##em95B$V$ z{6XN10R%xX1V>1OLKuWactk)XL`GCZLkz@3Y{Wr4#79CTLJ}lJa-={iq()k#Lk46- zW@JG&WJgZqLLTHreiT3<6h=`LLkW~bX_P@Zlt)EWLKRd+b<{vD)J9#@LjyEKV>CfC zG)GIcLL0P2dvri2bVgTnLl5*sZ}dSw{DlD+h`|_wVHl2)_#30~560qOjK_bNh)I}& zshEx#n1$Jxi+Napg;I?~h>LhgfP_elBuIwjNQqQPgS1GG49JAc z$ck*pft<*VJjjRqD2PHRf}$vn5-5ezD2sBafQqP$DyW9)sEJyrgSx1X255xFXo_ZN zftF~EHfV?T=!j0}g0AR}9_WSM=!<^nj{z8j!5E5R7=e)(h0z#;u^5N(n1G3xj47Cg z>6nRGn1i{Pj|EtS#aN1ESb>#TjWt+@_1K6_*n+Ltjvd&A-PntLIDmsVj3YRP<2Z>^ zID@k|j|;ej%eabbxPhCvjXSu9`*?^)c!H;Rju&`^*LaI}_<)c2j4$|x@A!#d_=7;1 z0|R$RhUkciScrqTh>rwFgv3aSWJrOONR2c|hxEvZOvr+) z$c`Myh1|%Cd?EBb0h2HpQ!x!Q zFcY&e2lFr=3$X}GuoTO&0;{kZYq1U+uo0WF1>3M4JFyFUuowGr0EciGM{x`%a1y6+ z2Ip`d7jX$!a23~a1GjJ+cX1C7@DPvj1kdmsFYyX*@D}g!0iW<0U-1n;@DsoB2Z6H$ z5Cp*x93c@3VGtJK5do198Bq}pF%T265eM-Q9|@5NNstuDkpiiZ8flRZ8ITc~kpQd7)4PGB~TKjQ3mBu9u-juRZtbxQ3JJ58+B0+4bTvc(FD!V94*lb zZO|6&(E**%8C}s0Jj=~9{*t?CSeMuVmfAE z7G`5E=3xOAVlkFr8J1%uR$&d+Vm&rs6E`(jq-FAQLhpE3zR6 zaw0eKARqFhAPS)filR75pcG1@EXtt*Dxxx~pc<;9CTgJ$>Y_dxpb;9QDVm`LTB0@D zpdH$yBRZiAx}rOJpci_hFZ!WB24D~dV=dVjRX}0w!WIreGSTVBFV=wmM01o0Xj^G%M<0MYu49?;_ zF5nU_<0`J<25#au?%*Eo;~^g537+CPUf>m8<1OCd13uz2zTg|a<0pRM4+3QiAP9mY zI6@#4LL)4~Ap#;IGNK?Fq9Z0^Ar9gqJ`x}i5+f;+Aq7$*HPRp*(jy}>Aq%o1J8~cw zaw9MDp#Tb^Fp8iUilZb-p$y8RJSw0PDx)f@p$2NAHtL`r>Z2hVp$VFzIa;6Bt#-4K~f|~3Zz16q(wSpKt^On7Gy(qo4b(zy)I~isKtnV}6Es6}v_vbkL0hy( z2XsPbbVWDxKu`2WAN0dt7=VEoj3F3?;TVa(F&h71EdIrK{D+B{gejPc>6n38n2ouZ zhXq)O#aM!6SdNugg*8}<_1J(-*o>{%h8@_6-PnVD*pGuagd;eL<2Zp+IE}M7hYPrf z%eaDTxQ?5+g*&*5`*?syc#Nlbh8K8=*LZ_>c#n_xgfIAt@A!dV_>Dk00tk$t2!;>{ ziO>jxa0rixh=eGJis*=eScr|dh=&A7h{Q;OWJr#bNQE>=i}c8VOvsF^$c7xqiQLG8 ze8`W2D1;&?isC4NQYekGD2EEDh{~vfYN(EysD(PHi~4AQMre$tXoePOiPmU?c4&`| z=!7olitgxvUg(X!=!gCofI%3Hp%{h{7>Q9BjWHODaTt#Yn25=kf@zqJnV5w+n2Y&X zfJIo0rC5d)Sc%nGgLPPsjo5@O*oy7gfnC^*z1W8XIEceIf@3(2lQ@MlIE(YRfJ?ZH ztGI?6xQW}igL}A-hj@f1c#7wEfme8qw|IvS_=wN=f^YbapZJA82$VB`AP9=!2!T)t zjj#xZ2#AQth=OQ{j+lsrIEah*NPt90jHF106iA8GNP~1pkBrEKEXa!N$bnqQjl9T* z0w{>WD1u@rj*=*aGAN7ksDMhSjH;-H8mNidsDpZ_kA`T3CTNQ0Xn|H}jkaiq4(N!^ z=z?zOj-Kd+KIn_T&>sUa2tzOw!!ZJXV-)_u82pQI_zx2>36n7u(=Y=wF&lF*5A(4Q zi?9Ssu^cO~3ahae>#zYEu^C&i4coC3yRZj)u^$I;2#0YL$8Z8CaT;fE4(D+Zmv9AF zaUC~s3%79>_wWD@@fc6=4A1crukZ$M@g5)W37_#5-|z!J@f&{-I9C8c5DdW)5}^iB~cn>P!8o$5tUE{RZ$%^Pz$wD7xmBp4bd1)&xVV-NOWKMvv$j^HSc;{;COG|u82F5n_A;|i|f zI&R_??%*!&;{hJwF`nWXUf?BO;|<>7JwDHv;7jATWX=7(yTZ1V~p)s1G8CswvTB8lxp*=dH6S|-) zx}yhrp*Q-XANpee24OIUVi-nXBt~I0#$YVQVLT>aA|_)BreQi}Vix9LF6Lta7GW`# zVi{IoC01h%)?qz1ViUGtE4E_?c40U6Vjm9RAP(aQj^Q{?;uOx{EY9NsF5xn+;u>z? zCT`;n?%_Tj;t`$%Feyl&z=51LPo?L0fme8qw|IvS_=wN=f^YbapZJA82$Uy)AP9=! z2!T)tjj#xZ2#AQth=OQ{j+lsrIEah*NPt90jHF106iA8GNP~1pkBrEKEXa!N$bnqQ zjl9T*0w{>WD1u@rj*=*aGAN7ksDMhSjH;-H8mNidsDpZ_kA`T3CTNQ0Xn|H}jkaiq z4(N!^=z?zOj-Kd+KIn_T&>sUa2tzOw!!ZJXV-)_u82pQI_zx2>36n7u(=a1|fYrE} z=GmBod6T*o8gVi~Tr&LpY41IEE8AiPJcP zb2yKSxP&XXitD(6Teyw8xQ7RLh{t$>XLyd6c!f83i}(0|Pxy?l_=X?&iQo8xz6&UgLsIKgh+%WNQ&f0fmBG1v`B{x$cW6yf^5i+ zoXCYd$cy|afI=vYq9}$ED2dW2gK{X3il~GtsEX>Sfm*1Ix~PW+Xo$vWf@WxrmS}}G zXp8pffKKR)uIPpy=!xFwgMRo6127PSF$BXf93$~JM&loh#lIMj|1c4gFa=XF9WyWs zvoRO*umB6O7)!7W%drxxum)?f9viR;o3Rz!umd}>8+))1`*9G5a0Ewj94BxJr*RhN zZ~+%_8CP%(*KrfKa0hpB9}n;dkMR`G@B%OK8gK9p@9`0z@C9G-9Y633zY!>30D%z{ z!4Lu=5gK6-4&f0Ikq`w@5gjoQ3$YOw@sI!skr+vk49SrasgMR~kscY437L@<*^mP{ zksEoC5BX6Lg-`@VQ5+>u3Z+pNg z4(-tqozMkc(H%X|3%$`7{m>r+FbIP&6vHqABQXl2F$QBX4&yNa6EPW6Fb&f&6SFV} zb1@$aun3E>6w9yzE3q1Dunz075u30DTd^HGunW7f7yEDk2XPoja16(B5~pwmXK@}E za0!=j71wYBH*p(xa1ZzK5RdQ#Pw^Zt@CvW-7Vq!@AMqJq@D1Pb6Tk2Wf$|3s1VIrT zArK0o5ft+dSpN*WJXqGLk{FbZsb8e zva@jK>5_#AHmtG)%`#%)%VZ#e6Kl zA}q#IEW-+{#A>X;I;_V=Y{C|7#dhq#F6_o$?85;Z#917bJi-$^#dEyCE4;>Ayu$~4#AkfLH+;uW{K6juDilBv1VwO!Kq!Pp zScF3aL_}mnK{P~1OvFMQ#6^50Kq4eYQY1qPq(o|@K{}*IMr1-3WJPx5KrZA)UgSdo z6hvVZK`|6ZNt8kvltp<|KqXX0Ra8R_)I@F6K|Rz*Lo`AYG(~f?Kr6IHTeL$5bVO%# zK{s?qPxL|`^u=H3kAWD3AsC9`7=gbr3jbgX{>3=_hY6U3$(V|1n1Pv?jX9Wy`B;cW zSc0Wkjulvi)mV#l*no}Lj4jxP?bwN3*n_>;j{`V_!#Ij#IDwNmjWalh^SFphxPq&= zjvKgz+qjE+cz}m^j3;=8=Xi-%c!Rfij}Q2S&-jXO_<^7JjXwxnIDjAshTsT^PzZyt z2#*Megvf}BXo!KBh>bXihxkZ{L`Z_9NRAXph15ukbjW~=$c!w=hV00RT*!mG$d3Xj zgu*C_Vkm)uY=#4(;hrciY12GswFbu;n5`SYf{=r!Mi}Cmm6EO)>Fcs4=1G6w2b1@GKun>!} z1k11-E3pb|uommF0h_QHTd@s0uoJtn2m7!e2XP2Ta1_UJ0;g~qXK@Y}a1obr1=nyL zH*pJha2NOS0FUq(Pw@;d@Di`_2Ji45AMpua@D<I8Cj7HIgk^%kq7yZ9|che zMNkyQQ39n<8f8%q6;KhCQ3cgd9W_x4bx;@e(EyFm7){X(EzlCJ(FX0%9v#sMUC_upS$+30trg+pz5v{7kqKFl71@ykxsV%qkq-q>5QR|$ z#ZVk2Q3_>H7UfX^l~5T~Q4KXv6SYwX^-v!T(Fje@6wT2BtSGf+HkCAq>JIJR%?x zA|ooIAqHY1HsT;2;v*pvAqkQqIZ_}MQX?(WApiF#44=8TCB$g zY{F)2#Ww7~PVB}W?8AN>#33BPQ5?q!oWg0G#W`HSMO?-eT*GzT#4X&xUEIe5Ji=o< z#WTFXOT5M#yu*8Z#3y{gSA540{K9VpDiT0o1VK;)M+k&MXoN*LL_kDDMifLtbi_m~ z#6eudM*<{7A|ydlBu5IQLTaQ%I%GgbWJVTbLw4juF62R8IXfmK+I zwOEG@*oe*8f^FE2o!Esv*o*x*fI~Qpqd0~WIEm9ZgL62Ki@1ao4b(zy)I~isKtnV}6Es6}v_vbkL0hy(2XsPbbVWDxKu`2W zAM`_i48$M|!B7mx2#msLjKw%iz(h>KWK6+SOven&!fedNJS@OMEXEQn!*Z;|Dy+d; ztj7jy!e(s6HtfJo?8YAK!+spZAsoR`9LEWq!fBkvIb6U+T*eh#!*$%mE!@Ff+{Xhv z!eczeGrYh{yv7^6!+U(hCw#$Ie8&&`!fymB7C>MGK~Mxo2!ujtghe<+Ktx1F6huRG z#6&E_L0rT~0whEtBtcRnM+&4uYNSOvWI#q_Miyj4cH~4ZArwJT6h{e^ zLTQvmIaEMJR7Mq4Lv_?dE!06>)JFp}LSr;VGqgZUv_>1WLwj^YCv-tqbVm>LLT~g% zKMcS?48{-)!*GnmD2%~ajK>80i%IwoQ!owFF%z>e2XiqW3$O@_u@uX&0xPi^Yp@RM zu@RfF1zWKlJFpA8u^0Pr00(gxM{o?saT2F+24`^|7jOxeaTV8a12=IScW@8)@eq&j z1W)lCFYpSl@fPp!0Uz-hU+@jz@e{xB2Z4$Q@E3w07=j}tLLm&oB0M4>5+Wliq9F!i zA~xb69^&I~Bt&8)K{6yqN~A&>q(ypUKqh2HR%AmCVj5;(CT3#}=3zb-ViA^LDVAdeR$(>PVjVVM zBQ|3TwqZMVVi)#cFZSaA4&gA4;uucgBu?WD&fz>R;u5alDz4)OZs9iW;vOF0As*ui zp5ZxO;uYTDE#Bh;KH)RI;v0V8Cw}7(0+$HjF9by}gg{7yMi_)cctk`bL_t(UM-0S5 zY{W%8B*5QDgv3aSWJrOONR2c|hxEvZOvr+)$c`Myh1|%Cd?iB~cn> zP!8o$5tUE{RZ$%^Pz$wD7xmBp4bd1)&8+))1`*9G5a0Ewj94BxJr*RhNZ~+%_8CP%(*KrfKa0hpB9}n;dkMR`G z@B%OK8gK9p@9`0z@C9G-9Y633zY(Zp0D%z%K@l7w5DK9Y7U2*95fK?t5Dn206R{8n zaSjP&;?!59X-$sz0nu_FaQHF z7(*}&!!Z)0Fa~2W9ux2{CgDF!!8AN9!7&`iNu0tNoW*%uz$IM9Rb0aj+{A6%!9Co^Lp;J0JjHXo zz$?7QTfD;ue8gvb!8d%zPyE6k1S%E4UkHL=2#$~lg)j(<@Q8p&h>WO+h8T#6*ocF8 zh>yRK5Q&il$&ef=kqT*$7U_`znUEP-kqtSJ6Sp46IE^znhx53IOSpooxQ-jRh1DgZTsnZi5EQ`>0wEC^VGs`C5fPCP1yKAq%o1J8~cwaw9MDp#c6tArwYY6hjG=L}`>kIh035 zR6-S0MRn9bE!0L`)I$R_L}N5TGc-p_v_c!SMSFBWCv-+vbVCpHL~ry#KlH~y48jl$ z#c+(kD2&EfjKc&>#3W3{6imf*%)l(n#$3$90xZO0EWt7?$4aci8mz^7Y``XL##U^@ z4(!Bk?7=?l$3Yyz5gf&FoWLoZ##x-h1zf~sT){P5$4%VA9o)rzJisG7##21Q3%tZ@ zyumxX$47j^7ktHc{J<~#MxZhQ1V#`9MR0^bD1=5>ghK>GL}WxkG(<;C#6ldzMSLVc zLL@>GBt>$hKq{n0TBJh;WJG3UK{jMZPUJ!!vbuOu)aGg#R!F(=Z(~F$;4r7xS?Ii?A3=u?#D)605NW>#!ahu?btS72B}` zyRaL3u@47u5QlLD$8a1caSCT}7UyvRmv9+ZaSbLvo} zifX8Vny8IBsE7J!h(>6Frf7~9Xoc2ji+1RMj_8ao=!Wj-iC*Y~zUYqu7=*zXieVUm zkr<6J7>Dtgh<`B||6wYoVFqSmHs)X+=3^liVF{LEIaXj5R%0#JVFNZ|GqzwGwqqxD zVGs6VKMvp!4&x|};RH_NG|u20&f_93;R>$eI&R<=ZsRWQ;Q=1vF`nQVp5rB6;SJv6 zJwD(QKI1FC;Rk-=H~t`Sxd8q`Py|B=ghXhBK{$j*L_|UqL`8JOKrF;YT*N~H{Eb9N zjHF106iA8GNP~1pkBrEKEXa!N$bnqQjl9T*0{91oP#8r~3?)z!rBMduP#zUg2~|)P z)lmbrP#bko4-L=|jnM?n&>St%3T@C9?a=|9&>3CP4L#5kz0n8#&>sUa2tzOw!!ZJ* zFdAbq4ihjDlQ0=mFcs4=1G6w2b1@GKun>!}1k11-E3pb|uommF0h_QHTd@s0uoJtn z2m7!e2XP2Ta1_UJ0;g~qXK@Y}a1obr1=nyLH*pJha2NOS0FUq(Pw@;d@Di`_2Ji45 zAMpua@D<eSsgN3Jkq#M<5t)$%*^nJMkqdc{7x_^D1yKk^P!z>c0;NzIWl;_lP!W|;1=Ua; zHBk$7P#5*l0FBTXP0B>4ftZMmIEaV%_!|k47)g)} z$&nJNkOpay9vP4cnUNLQkOMi98+niq`SA}5qA-e}7>c7LN}&wOqC6^~QUC$#yDF=z zq8e(TCTgP&>Y+Xwq7j;)DVn1NTA?-Cq8&P*BRZoCx}iIIq8IuE(4}SH0A17TFB*tJ z7=ob~ju9Az(HM(yn1G3xgvpqKshEx#n1$Jxi+Napg;)=!M?si+&h@ff$S- z7>3~(iBTAXu^5jD_!pD#AEsa$reh{%VGibEJ{DjR7Go)vVFgxVHP&Dq)?*_!VGFim zJ9c0fc4II0;Q$WeFpl6Dj^iXw;SA2=JTBl8F5@b$;RbHvHtyga?&BdI;R&ANIbPru zUgIs^;R8P6Grr&(zT+o;;ST~;3g9mUK`;bINQ6QdghhBnKqN#)R767z#6)bwK|I9A z-$;nWNP=WYj+97+G)Rl|$bd}9jI79p9LR~>$b)>ykAF}Qg;4~>P#h&u3T03hC&g4js@DozVr|&>cO|3w_WR{V@Q8Fc?EI z3?ncSqcH~KFdh@}FDBzZOvN9L&RfEW{!#!BQ;83ar9vti?KPz(#Dw7Hq?I z?8GkY!Cvgg0UW|%9K|u5z)76O8Jxp;T*M_@!Bt$x4cx+Q+{HaSz(YL76FkFnyu>TK z!CSn?2YkY3e8o5Xz)$?f9|W!(z+VW8UjSDh1iITcu0W1 zkqC*A6v>bRDUlj!kPhjQ5t)z$S&C|DX^GqbQ1@1WKYb%Ag#|qarGy z3aX+yYM>Tsqb};90UDw)nxGk)qa|9Q4cekTI-nCeqbs_h2YRA6`k){BV;}}$2!>)f zMqm_1V=TsD0w!V-CSwYwVmfAE7G`5E=3xOAVlkFr8J1%uR$&d+Vm&rs6Eh=G2!bLwLLd}EBP_xp0wN+Zq97WgBPL=Y4&ov{5+ETG zAqkQqIZ_}MQX?(WAp*R1&3724ztm z6;KJ4Q5Drt12s__bx;rW(GZQ$1WnN#EzkxVV-NOWKMvv$j^HSc;{;COG|u82F5n_A;|i|fI&R_??%*!&;{hJwF`nWXUf?BO z;|<>7JwDHv&})ATWX;D1svdLLoH5A{-(hA|fLSq9HnBA{OExF5)8r z5+V_jASsd~1yUh3(jpx)AR{s(3$h_Qav~SYy&_qX8PBF`A+oTA(FbqYc`jJvyQjx}Yn%qX&ASH~OL<24EltV+e*} zI7VU=#$YVQV*>ugB>aadn1<C zVkAW}q(DlfMjE6;dSpZ_ygu*C_Vkm)uY=#4(;hyECdK^TIe7>*Gb zh0z#`ahQOKn1sogf~lB}8JLCHn2UK>fQ49$C0K^#Scz3wgSA+X4cLUu*otk~ft}cm zJ=ll+IEX_yf}=Q&6F7y_IE!<*fQz_{E4YU1xQSc1gS)to2Y7_Xc#3CuftPrVH+YBl z_=r#Vg0J|FANYme2vjqGzzBk%2#yd4h0q9#aEO42h>R$RhUkciScrqTh>rwFh(t(& zq)3hwNQKl$i*(3Q9B zgRvNo3HTS2@E@jN8m40=W?>HIVm=mN5f)=9mSF`}Vl~!a9oAzbHen04Vmo$V7j|PW z_Tc~y;xLZj7>?s4PT>sB;yfH7UfX^l~5T~Q4KXv z6SYwX^-v!T(Fje@6wT2BtLhKTO3m%)m^{#vIJUd@RHwEWuJN#|o^%YOKXNY`{ir#ujYDcI?D1?7?2_ z#{nF|VI0LVoWMz(#u=Q$d0fOLT)|ab#|_-VZQR8@JitRd#uGflbG*bWyun+%#|M1E zXMDvs{J>BA#vcT(9l&1*ieLzVkO+-12#4^9h)9TnsECdjh=tgQi+D(YzmW)ukrc_0 z0x6LiX^;--krA1Y1zC|DIgksvkr(+;0RNy63Zp2Bp#(~zG|HeH%A+DGp$e*^I%=R6 zYNIadp#d7AF`A$mnxiFJp$*!iJvyKhI-@JPp$B@RH~OF-`ePslVF-p|I7VO;Mq@0- zVFD&%5+-8`reZo~U>0U$F6LnY7Gg1$U>TNUC01b#)?z(2U=ucDE4E<=c49a7U?2A5 zAP(UOj^a2@;1o{dEY9HqF5)t-;2N&uCT`&l?&3Zk;1M3bI6@#4LL)4~Ap#;IGNK?Fq9Z0^Ar9gqJ`x}y5+MnaA~{kZ z6;dND(jfyfA~Uie8?qxOav=}$B0mbCAPS)filR75pcG1@EXtt*Dxxx~pc<;9CTgJ$ z>Y_dxpb;9QDVm`LTB0@DpdH$yBRZiAx}rOJpci_hFZy8s24XOVU>JsDBt~Hj#$r4s z;9pF_f0%-4n2wp4g*lju`B;EOSd67uh80+e)mVddSdWd^ge};L?bv}`*p0o|hXXi> z!#ILtIF6Gzg)=yd^SFRZxQwf~h8wtv+qi>!xQ~Z;geQ24=Xilvc#XGshY$FO&-j9G z_>Q0Wg+B;XH-Nto1i=s-ArT5;5EkJP0g(_HQ4tL>5EHQx2k{Uee&)J7fD zLwz(vBQ!x%G)D`xLTj`|J9I!tbVe6+LwEEvF0UNOyTd)n=u@k$n2Yay}2XF|7 zaTLdJ0w-}AXK)VZaS@kr1y^w$H*gELaToXS01xpPPw))S@e;4_25<2mAMgpE@fF|j z13&Q_e-OA{0DmDUf*}M#A~eDv9Ks_aA|VQ*B06Fq7GfhV;voV4Mj|9eQY1qPq(o|@ zK{}*IMr1-3WJPx5KrZA)UgSdo{DVR$jG`!p5-5q%D1&k+kBX>-DyWL;sDWCjjk>6Z z255-JXo6;Fj+SVJHfW3X=zvb>jIQX09_WeQ=!1UfkAWD3AsC9`7=ck3jjUI%Z-P=3p-7V*wUnF_vN(R$wJoV-40}JvL$!wqPr^V+VF&H}+y54&WdT;|Px7 zI8Nde&fqN0;{q<>GOpqpZr~jfch^4K`;bINQ6QdghhBnKqN#)R767z#6)bwK|I9A-$;nWNP=WYj+97+ zG)Rl|$bd}9jI79p9LR~>$b)>ykAF}Qg;4~>P#h&u3T03hC&g4js@DozVr|&>cO|3w_WR{V@Q8Fc?EI3?ncSqcH~KFdh@} zFDBzZOvN9L&RfEW{!#!BQ;83ar9vti?KPz(#Dw7Hq?I?8GkY!Cvgg0UW|% z9K|u5z)76O8Jxp;T*M_@!Bt$x4cx+Q+{HaSz(YL76FkFnyu>TK!CSn?2YkY3e8o5X zz)$?f9|Ud~z+VW8UjSDh1iITcu0W1kqC*A6v>bRDUlj! zkPhjQ5t)z$S&C|DX^GqbQ1@1WKYb%Ag#|qarGy3aX+yYM>Tsqb};9 z0UDw)nxGk)qa|9Q4cekTI-nCeqbs_h2YRA6`k){BV;}}$2!>)fMqm_1V=TsD0w!V- zCSwYwVmfAE7G`5E=3xOAVlkFr8J1%uR$&d+Vm&rs6EBOwwa36dc>QX&=7AT81( z12Q2qvLYLDASZGo5Aq>D{y{+$MiCT4ag;wbU;URMi+ELcl1Or^g&6T7end$At}a0rKS6vuD^ zCvh5Qa1Q5j5tncUS8*LTa0|C_7x(Z05AhgJ@C?uK60h(EZ}A=<@Cl#s72og!Kk*xX z5V%PIe<3J>Ap}AqG{PVp!XqLgAqt`*I$|IeVk0i%Ap!nIA|ysqBtr_ML~5i#I;2NN zWI`5XMRw#sF62gDSfm*1Ix~PW+Xo$vW zf@WxrmS}}GXp8pffKKR)uIPpy=!xFwgMR3bff$4#7>eN-fl(NZu^5L5n21T3j47Ck z>6n38n2ouZhXq)O#aM!6SdNugg*8}<_1J(-*o>{%h8@_6-PnVD*pGuagd;eL<2Zp+ zIE}M7hYPrf%eaDTxQ?5+g*&*5`*?syc#Nlbh8K8=*LZ_>c#n_xgfIAt@A!dV_>DkK z0|<;D2#VkcflvsIun30;h=|CDf@p}2n23cqh>Q40fP_edBuI+nNP$#HjkHLI49JMg z$bxLhj-1GaJjjduD1d?}gd!-4;wXVqD2=ixhYF~O%BX^BsE(Sbg*vE<`e=YgXpE+4 zh8Adv)@XxvXpfHQgf8fc?&yJD=#9SUhXELf!5D&J7>+ghvEKLS#fmG{itm#6}#%Lwx*=gh-4eNQUG{iBw2~v`CK($b`(u zifqV%oXCwl$cOy+2L(|WMNkaIQ4*z424ztm6;KJ4Q5Drt12s__bx;rW(GZQ$1WnN# zEzkxVV-NOWKMvv$j^HSc;{;COG|u82 zF5n_A;|i|fI&R_??%*!&;{hJwF`nWXUf?BO;|<>7JwDHv+W?ATWX; zD1svdLLoH5A{-(hA|fLSq9HnBA{OExF5)8r5+V_jASsd~1yUh3(jpx)AR{s(3$h_Q zav~SYy&_qX8PBF`A+oTA(Fb zqYc`jJvyQjx}Yn%qX&ASH~OL<24EltV+e*}I7VU=#$YVQV*>ugB>aadn1<K@>(26hm>8L@AU(S(HZwR6=D`MK#nwP1Hsm)I)tVL?bjoQ#3~lv_fmN zMLTprM|4IPbVGOaL@)F~U-ZWS48mXx#W0M(NQ}l9jKg?L#J`w~|1cHPFat9&8*?xZ z^RW<%umnr794oL2tFadAumKyf8C$Ro+p!b7um^jw9|v#D1spb zLLxN6ARNLYA|fFQq9QtCAQoaHF5)2p{zf7sMp7h03Zz78q(M5QM@D2q7Gygh7u@=(kO#+D36M$ges_t>ZpNQsExX)hX!bf#%O|OXpWX>g*Ir5 z_UM34=!~xDh92mN-sppV=#POIgdrG;;TVBY7>%(QhY6U7Ntlc&n2PC`fmxW1xtNCq zSct_~f@N5al~{!}Sc~=8fKAwpt=NVg*oocPgMHYKgE)jEIEv#qfm1k*vp9zfxQNTR zf@`>ro4AELxQqLEfJb$cTbyh>nY{-tB$b~$} zi~J~nf+&O{D2n1Jfl?@qvM7fNsEEp_f@-Lany7_3sEhh&fJSJHrf7y1Xo=QngLY_- zj_8Cg=!)*>fnMm1zUYSm7>L0bf?*hrkpXmRIVwO)*~W;*VLT?{Urfe-n2Kqbfti?% zIhcp}ScpYff~8oF6pBQhZivLZWj zAQy5YFY=)P{y`xWMo|<)36w->ltDR^M@3XZ6;wra)IcrNMqSiH12jZqG(j^oM@zIq z8?;4xbU-I`Mptx05A;ND^g%!L$3P6i5Ddj|jKC<2##oHQ1Wd#vOvV&U#dOTTEX>AS z%)VOCTzx5Y{L%h#BS`tKJ3Rq9KsPC#c`a#DV)YxoWliN z#ARH;HC)F{+`=8)#eF=$BRs}aJi`mT#B034JG{q7e8Lxe#drL`FZ@QJwgCi25ClbV zgg_{SMp%SH1Vlt+L_st}M@+;*9K=O@BtSwWLJ}lJa-={iq()k#Lk46-W@JG&WJgZq zLLTHreiT4K6haXcMRAlsDU?Q8ltTqnL}gS#HB?7U)IuH9MSV0tBQ!=+G(!utL~FD` zJG4hfbV3(&MR)W-FZ4!V^uquQ#9$1;Fbu~?jKUa<#du7>znFyoFa^^v9WyZtb1)b4 zu>gy(7)!AXE3gu)u?Fj~9viU-rX8+)-22XGLFaRkS394B!KXK)thaRHZb z8CP))H*gcTaR>Ks9}n>ePw*7a@dB^#8gKCqAMg>M@de-T9Y664e-Nl$0DmC}f+09U zA{4?PEW#rKA|W!OA{t^KCSoHF;vqi%MnWV;5+p-%q(myDL0Y6o24q5JWJNaQKu+XF z9^^xQ{DXohj3Ow8;wXtyD1)*nj|!-S%BYHJsDYZOjXJ1@`e=woXo99_juvQz)@X}% z=zxysj4tSg?&yhL=!3rKj{z8j!5E5R7=e)(jWHO9@tBBzF&Y11DyCruW@0wxU>@dU zAr@f?mSQzlE!JTJHexfjU>mk$Cw5^E_F_K{;1CYuD30L-PU1Aq;2h55A}-+y zuHrgw;1+JA&itNaNT*!^Q z$cF;>2Zc}=MNteTP!gq42IWv56;TOQP!-it1GP{abx{uu&=8H$1kKPKEzt^X&=&2{ z0iDnpUC|9a&=bAU2mR0=12G6gFciZv0;4b*V=)dBFcFh58B;J7(=h|HFdK6*4-2pm zi?IaDupBF~3Tv#+fwuo+vi4Lh(CyRirRupb9;2uE-f$8iFua2jWE4i|6{mvIHx za2+>s3wLlA_wfLa@EA|=3@`8!uki-&@E#xW319FP-|+*#@Ed_T1P~ZO5EQ`?0-+EZ zVG#}y5D}3P14F%b)K5Et>0011%@NstuDkpiiZ8flRZ8ITc~kpkJp z30=??-O&TR&>MZx4+Ag|gE0idFdQQ>3S%%9<1qpMViNwt6imZ(%)~6r!CcJ80xZH} zEX6Xcz)Gyf8mz;5Y{VvP!B%X?4(!5i?8QDDz(E|w5gfyDoWv=d!C9Qg1zf^qT*Woq zz)jr79o)lxJj5eB!BafP3%tT>yu~|wz(;(>7ktBa{KPN(L7bXihxqs#36U5{kPOL@5~+{|X^|cokO`TQ71@vjIguNAkPrFs z4+^3%il7*Zqa;e949cQBDxeZ7qbjPQ25O=<>YyI#qahlh37VogTA&qLqb=H@13IEJ zx}Y1nqbGWy5Bj1%24D~dVT*o8gVi~Tr&LpY41IEE8AiPJcPb2yKSxP&XXitD(6 zTeyw8xQ7RLh{t$>XLyd6c!f83i}(0|Pxy?l_=X?&iQo8xz?}m43qcVKArKOw5eDH9 z9uW}u0Aw4o86S5#HvLgp_Avf|O9}3_f z6hdJXMKP2>Nt8wzltXz`L?u)~Ra8d})Ix34MLje?Lo`McG(&T=L@TsGTeL?9bV6rz zMK|<7PxM9~^h19P#2^g8Pz=WijKXM)#W+mBL`=eDOu#|fOmX`ID5T);(K#uZ${b=<@) z+`(Pk#{)dVV?4z(yueGm#v8oDdwj$ve8E?I#}E9%Zv^TbKwtzxPy|N^ghFV9ML0x2 zL_|guL_>7ML@dNXT*OBLBt#-4K~f|~3Zz16q(wSpKt^On7Gy(qHpcg6F8gd|MBA@6h)R0#cjllZ7^eNY}uEwWo#LYS?3D2k#eilQh)Q4~c{6h%=K#sB^KoOA9u=iWPu`hNev|Nrs-&!e6*?mg#oKIgNa z&-vVQp%?Uq`=KxNgZ?lO2Eky6hM_PFhC?jGLjoj161X4*(jXl&Aq%p>4LL9ZMnNu& zfrnr$jDtsEJWPbgU@|-oQ(!7ghZ!&nX2V>V2lHV8EQCeyG&}=K;aOM)%i#rB0WZQ! zuo_;5HLw<5gLUvaya5~GP1ppR;T_ll@4|bq9o~l>uoFIlU9bl}hJEk}?1uyJIUIy9 z;7d3HU%^p02H(PQ_zu2@Q}6?vhBNRpoP}TDSGWMb!9}3;u>{P$Wkv3dNu} zlz^MyW+)A}Kp7|t<)A!NgxjGqRDr5c4eo;K;DEcKCfozHAsFgFU8oNYpdmDZFbIdH z&jpC*LFaQR@0}u^EU>L+e zEW|+qI3Wp=Aq7$)9Wo#b9t1adU<8bWTo?@x!NV{P9)a;N0Um=%@HjjHQ(+p+fSE8G z=D<975*ENyum~2zGq41nh38;7JP#{iCA4%WjPumRqLw_r284O?I< zya(IheIY011CdPF$x9!>F4zMf!#?-~_6s>F2Sj%GoR<#47jPJkz}IjTzJYJy1bhc4 z;S~G`r{O2~8P35ka2_te?{E?RfIs01`~_Fx8r(2KC<-@1aVQBlK`AH=w?Y}X4az|U zs0fvyGTZ@G;ZC>} z+z0KU19XDU&=tBtB=mq@&>QZDzR(Z)!$24WgCQD*!Y~*Pu@DalkO)cOf)q%DbjXA( z$Obp$zz7%xxiAJEg0V0T9)A9lb__y~5v9{3pc z!6&dE4#4Md5Wavf;Rt*MN8uQJ3&-I*_#RHd4{#dJz|U|Net}=%0{jLS;S&4_m*Fq? z8?Hf-kwQ@@2F0NS+ypm6X}AT-Kv^gU<)I?n4waz_RE27A7gPra+zmD19;gk$PzUNl zeP{p;p%H{ZI5dT3&;ss-me2~?KwD@B?V%%df-cY%xZ77!Gj|4^BvgWN<+$q(KH`!h?_v9>{@_FbYP)7F(03Rc4_um)a**I+%o4jW)2yak)! zZFmQ^!n?2yw!;Uo13rY0U^nc6y|52Hh5hgud=7`;3pgy~q#O}xY`^BEWAF_ehZFEU zoP;0XM>qpN!C5#5zruO=4St79@CRImEATg5g(9Pb8=x562qmB-+zh4Q7PuA4!fj9< zD!}bf397&yPz~;c>QDpjh9I~HYC$lBKwYQ@4ImU6L1PGqCeRF;!@Upzt)Mluh5MjA zbbwCK8M;C@h=d-{3wp!-&=>kae;5dZU@%0(P#6ZoAr|5x0TLkzT#y23kPexU1=-++ z92fzkAQ#5KLogP`!J{x9Cc zk}DL2Vo)4Pz)f&7l!jZN43vd(P#!A6?NAx2Kvk#)cR_V4`Da#fqn1^9DvW@ARK}(;V^s+ zN8wvI4&TE`_yK-|pWtWs1%8F!;CJ`~{)E5aZzwWaxB+g2;&2n(47b3oa2u3^if}tr zfji(%xC?!z`E$^WaH% z3KqiC@C-Z)&%yKX0<44=VKuxAYvEN`53j>UcoR0m+prbhh3)V@?1T?tH|&9Z@Ch7% z&)^Vz0Y~5~I0oOq3HT09!4Gf-eu8uG3tWKT;38at%Wws*!Zj#5Mkod)pd^%n(ohD< zLV2hFm7p?Ig=$b8YCsUwgxU}cb)g=FLPH3HaA*e2Ap%-L8)ysdp#yY=F3=q!p%?Uq zz7PciU?2>JXcz`D5C`#)2uY9vsgMDgkPU7a0V82FjDfK*4#vX-m;{qy3QUFRFau`8 z9C#Au!$MdD&%hFR4wk_SumWC$m*8c11zv^MU_HDJ8{tjZ3~$3$co(+A`>+!}gx#KqaUQRiPSGhZ+zBHK8^HLtUr`q0kV*ARL-ObBKVJ&<5H-0$2o#VF@gSWw0Dpz)DyJt6>eSg>|qVHo!*M1e;+CY=v#G9d^J@*af>` zFYJT;Z~zX%Avg?2;3yn}<8T5_!YMcnXW%THgY$3!F2W_a3|HVPT!W$y3&o%Wl!Q`H z8p=RfC9t71ht?x)PcIt079WLgh5ki2KPb)w1zg&4%$N}=nUPU zJM@HJa6j~g{xAR@fWa^nhCwXEffEwJ1u2jY8So%vLk^69To?@x!&rC}#=~PU37&u{ zFdb&VESL@R;7NE27Q)l;3_J_Z!SnC}ya+GB%kT=k3a`QI@CLjIZ^34G8@9r`upQoq zo$w*-hCQ$kK7j-9861Ky;0SyL$KV?{0pGzX_yNwqPjC)?feY{(T!KH~3j77vpvYLE z7~BXY;U*{zw?J9A4JtrIs0>x0DpZ5&Py>RXCe(&ts0;NV6dFQf2!p234DN*pXbo+k z9kho|&>6ZxcjyVd;C|=}{h&V#f(Kv-429tk3kl$aWN<+mq(c@w2p-6RQIHD{!Nc$f zJPH%xF?bxFfN3xtX2EQj2T#INun?YxXW&_Q4xWb>;6-=|UWQlTRd@|vhd1C&cnjW! zci>%k58j6l;6wNb_Q1#R3498l!RPP=d3#o;En8E%1F;Wj7-72$TM0(Zcja2Gh>Zny_(K?u}=`p^IxL1SnF zO`!$c3$36v+z0KTBXokU&<%P(Pv`^pLqF&b17Q$E!w`sp;SdiAkOaw)3TcoDS>Of_ zjDV3a8pgm_7zg8F0!)I*Fa@T<444UXU@pvu1+WMf!xC5u%V0UIfR(TcR>K-t3+rG# zY=Dih2{ywP*b3WVJM4g+unTs>Uf2iw;Q$@h_d{Rk4+G!<7z{&U7z~G4NB}1!g9}n24Kg7M z+~9$cFbYP)7}>8N2{1 z;3ZfEufQ634c5UMumRqJP4EtEf%jk=d;mM(BiIEW!(R9l_QU6J5Wa-N@HHHTZ{aw6 z4=3SAI1N9;S@;#s!|!kr{)Ef$H(Z4q9uOf_jD%4z1|EWO@CZzRi7*)+hbb@>X249C4Rhd0m=6nK z5j+D+;5k?ZFTe_T30A=?um)a(b?^pkfVW^1yaQX{J=g{xzz+BbcEQK67e0mk@HrfW zFX1qJ4M*WyI1b;#N%#>?!_ROQeueY!J6wc6;WGRUSK)>ULQyCVCE#W#1-C*OC9t71ht?x)PcIt079WLgh5ki2KPb)w1zg&4%$N}=nUPUJM@HJa6j~g z{xAR@fWa^nhCwXEffEwJ1u2jY8So%vLk^69To?@x!&rC}#=~PU37&u{Fdb&VY?uR2 z!hBc=i{Kep0?)xRcmY_Ntb;dT1H1*B;B9yZ-i7zzefR)AgpXhkd<>t! zr|=nk4qw2R@D+Rw-@vzU0=|P&@B^HIpWqz)0vF&nxCDQ|75EFTL6M0n0AU1egSqVG2xz z888#(z+9LQ3t$l}h9$5RmcepZ0V`n@tcEqP7S_Rf*Z>=06KsYpuobq!cGv+sVHfO% zy|54V!vXjl4#Jmk7`}$1@GTsN@8Kl;2&ds^I19hRdH5YJ!k=&%{)Ve?!(&2GC=Mmy zW+(->LK!Fr<>7Xy1b0AHxC^So-4Fz|pf=Qjy3hbZp)rI(Q)mYFLIkviHqZ{*Lnr7A z-Jm=4gkEqz^o9N~03LwBFcgMCEX08m62S#2kPaE}AY?-hjDTDi4G+UucofFNV=xJx zfGIE?X25Ki15d(ySO|;Y8CU|(!7_LOR=`WJ3SNOV@EWXxH(&$21)Ja<*aGjtHuwN` zz(=qPK8C&UDeQ;O;UIhgU&2@LHGBi#!gugJ`~W|~Pw+GR0>8p<@H_kgf5KnzHx!v9 z+yFO1akvR?hFjoPxDCodMYtWRz#VWW+yynj0X5+s2!;@-2lb&LG=gww0?nZXw1igB z7Vd)%&=I;oSBQij&>Q+d6!e3EFbJYy2*ki}h=&A7f@DaAG{}T3aDxX%!YCL655YKi z1SY^lm<*4@RG0=cVHV7Vd9VPUg2nJOEQM!bIXn+5;YC;tFT+}R71qP+uo2#b&G0sC zg?C{)ybn9!L)Z;_U>|$}2jDX}1Yf`r_zI4}H*f;JgH!MWoPnRSM5 zCA5LI&>lKKXXpamArg8)Z|DnAFaQR^V2Flc5Cd@#4^Bt~7o+zYLsHQWd7pd)mGuFws7Ku_oc_d`GE4};(V7y?6KIK)B%I3XEakOt|H1rLG; za$pqX!b9*dJOYoxM0gAyhbLefOov%88|J~2@DwbBr{NiR7M_FW;RSdRUV@k56?he1 zgVzQ5>fbl``%QQY-iCMJU3d@PhY#RG_z3pE$M6Y!3ZKE}@CAGcU%}V#4SWmV!T0b3 z{0Kk6&+rTU3ctbc@CW<}f5G2Si^Z0=L3#P!1}>?N9~ofIHzXaKPPg z57dGXr~~z(0W^Zf&;*)73%D0rL2I}V+CfL?1YMyU^njkw2kwV{&>sfD126=J!f=R% z1aLw!xF8MEAqyS^59Gio$c2aCVR!@{g^BPOJPuF5G?)&vU^dKyC*dhr2v5T^@GLwB z&%+DwBD@4I!z=JAyauns8}KH)1#iPU@GiUu@52Z1A$$aT;A8j%K84TVbNB+jgsZ3mkAa)P#E=7($>P)Q5)92*RNWG=~<@5?Vo9xDPr&N9Y1wArg8(Z|DP2&<_T} zAc%$`5Cg*@9ugo4k|7n+AQQ5{4IUT?qhJg?1moZlm;e)DGCU4bVH(VYSuhvo!2);+ z7Q@r96rP3U@I0)97hyHL3~S+4SP!qmMtBo8!`rYG-i7V(KJ0`KVK?l7eeek!fY0C% zd;v$`D>w$+gf59~Wg;voT&AQ@624Kg7M+~9$cFbc-NLof~=feA1XCd1<} z6{f*Vm<4lT9xQ;TU@<%mOW|2q4$s3%co9~^%di$+h4t_{Y=k#qGrSF3;a%7c@54^` z5O%{J*ax4$0r(6K!544@zJg=$4V-}Q;1v7-XW%C|2fx4t_zf<>A8-Z!f@@G@notaG zgpzO*l!jZNEZhbapdwU;Do_pXgc{(0ns5&ULkQG^`p^&>K{zyl=FkEnpe3|{w$L6r zKxgOz-60ZsL2u{_Q7`}o!eEGoVGsjx5D$rv1SyaT8ITFt;D!+}5=O%q7z^WIJWPN| zFd3%6RG0xXVGhiN`LF;M!D3hfOJNx-hZV3AR>5jm18ZR&tcMM-5jMeQ*aBN&8*GOi zuoHH{ZrBU^U_TsygK!AGgv0PP9EES;ID8K$;YT| zMWHy9fSaKd+zMsjHYf)b;dZD3cfg%+7dYTUJoOK1gc z;Xdd99iagCH7)Knx6rcu0UGNQP8MgG|T*H+WzqjDj)n5R8LI zU;<2pNiZ3nfGIE?X22|%4Rc{0EP$tAF+2@R;aOM?&%;W15mv*?uohm0_3%1ugg0R` zybW97UDyuq!%p}RcEcXn2cN(J_zVug7jOi=f@AOvoPh7(6#M{Z;3qf>=ioeCfQxVm zF2fc08?M3)GlZg097@2=Pzr8^GEff6Lq)h9Dnk{h3e})G)PNwU3AG^@>OwsTg@zCY z;m{14Lj<&hHqaK@LkH*#U7$NeLNDkIeIW`4z(5!b(J%~RAP(Xo5t1MUQXw5O;6ccS z92fz)Fd80)vG6F2hsR(NJONW+I?RCCFbAH5`LGZc!85P~o`YrZ0<3_SU=_RqYv46l z2XDXzcndbcJFo@bgKh8u?0}D87kmtR;ZxWTpTj};5)Q-Ha1_3U z-60ZsLNDk8_d^u)g8?uQ9)Q6x1cpKk42L*~2PY&#GPocW(jWse;X%j-59Gi|7zLwY z3_J{D;SqQgCcs3P1e4(jm;%#aI?RMwFbC$slQ18if`zaco`xl`6rO`+@I1T#E8#_0 z1*_o|SOc%ZYp@<(hYhe1-hxf=HoOB{;a%7U+u;M)0UyFgup9QkUf2hp!hZM+K8Hi_ z1ssMW@HHHTZ{S-v0pGz%I0Zk#Y4{0#hI8->oQDhWJ6wc6;7_;$f5BC_1~<$Sio%Uh z97@7XPzp-JtxyJTgK|&-Dnccw40k|PxD)Pz8sLB+s0p>8HiSSOs0Z~S6dFQf2!kfj z6q-W|h=7*R8rr~p&<;94N9YV)pc{0D9?%ndLm%i1QP3X-z#t(fyu!Y~*P zu@DalkO)cOf)q%DbjXA($Obp$zz7%xxiAJEg0V0T9)yNXUiJ z@DMx<xQvtbU*gC}7DJOztjF+2lH;8}PMmc#R~0#?FH zunJy=S70r?3hQ7!ya5~FO?V47!`rY0w!(X`4c> z!Iy9tzJjme7<>cA;RJjSC*cS95zfF*a2C$NuW%lIgWus2`~jEY3j7UMp~xKJ1}FwM zLJ24dH$y471#X41a2u3|3UE7Af+}zaRD(OAI@Ex>Aqeh)S`Z8&P#5Y!0|JBB2NLg5GdH^o4%V9|po87!1)c6o$cYh=q7a zfJ8_F7oUf2iw;Q$$q&Pz|a>4G4moP#c1wF4TiiXb52t4$YuBL_kYu z18t!_bb!v#1-e5d^n%{d7ouPQ41~cD4Z|P?;vgOpAqi3-6*3?bvcU}_U?hx&F)$X! z!FZSelVCDTfvGS9X2Kkp3-e(CEP}@IU?XgT&9DWw z!Zz3rJ76d5g59te_Q8HQ00-d^9EKxs6pq1hH~}Z&6r6@La2C$NdAI-<;SyYiD{vLA zLD6|aF(?5gp%j#cGEf%ELj|Y=m7ywBgX&NNf}keUhG3`*^&k`)LKuWYGiVMG&=T4} zTWAj*pfhxV?hpyRpf~h|C>Q_(VK79)Fo=OTh=)W-f)q%F49J9RaKi`~38P^QjD>M9 z9wxvfm<&^3D$IbHFbC$sd{_XBU@*24za2%BItY=Nz? z4YtD$*a^E}H|&LdupbV!HoF2F^&1ef6oT!m{; z^hu!@lz@^@3Q9v6C=2DG0#t&^P!*~{b*KSBP!noHFw}*55DE<;48oxqG=~Ui32mS) zw1*DR8M;7sh=g9y8~Q>N41j?!7@}bq#6TRxLn0(W3Zy~?WI{H$VFZkX(J%(a!Z;WY z6JQcdhAA)=X249C19M?MEPzF@7?!|NSO&{s1+0Wsuo~9DT383`VFPT0O|TiZz*g7> z+hGUngk7*3_QF2c4+r2N9D>7e1dhTnI1VS^B%FfNa0br8IXDj&;38at%Wws*!Zj#5 zUnmA8pd^%n(ohDJXcz`D5C`#)2uY9vsgMDgkPU7a0V82FjDfK*4#vX- zm;{qy3QUC=Fcap$T$m3FU=b{aC9o8h!E#suD`6F^hBdGj*1>w%02^TwY=$kc6}G{4 z*a16X7wm?;un+db0XPVU;4mD4qi_t4!wEPEr{FZ4fwOQ9&cg+`2$$e8T!E`_4T>%h zia`k|38kPkl!3BP9x6a3s0>x18dQfG5Ck=$HUvXms0X3Y5W*lFnn81jfR@k(+CqEi z0G*)=bcaaj1-+p!M8N$ALnQQq-q07KU;qq+!4M6@AO_+f9ugr5QXmyFAQQ5|4I^MAjD|5V7RJGNm;jSt zGE9M~Fau`79GDC9VF4_H#jpgH!ZKJ6D_|w8g4M7F*1|ei4;x@3Y=X_O1-8OA*bX~j zC+vdVuow2hemDRJ;Sd~#BXAUs!ErbNC*c&FhBI&$&cS)O02kpBT!t%f6|ORXCe(&ts0;NV6dFPpghMlE4iV52+CW=q4;`R0 zbb;;=3B8~<^o1xG00Ut#M8hzMfjEeVL`Z@ZNQDf@glurb2p9>YVGN9gaWEbxz$BOq zQ(!90fSE7{=E8hf0E=KTEP9xA}?PzkEQ9Z(JKgz8WO?uH<^2Wmkugg{-W2Mr(;8bMIh&>6ZyH;9BD&WsL4OzsgJ3X3!%!Fo!yy*p zApsI030#l@X^;+?kOkS`h8!3HqaYW?z(X(=#=)a79wx$LFc}_)DKHhL!wi@OvtcgG zgZZ!k7Q!NU8lHir@GLBYtk;ks^uNndy#DPiAJC+u=&j%FOmS z>Xs^1Dn2dN?RNCZc8!SjI3u08A$1~3IpilOC`kS8m+W+C+azXYJL0pQu^v}Ok|Rso z!IA3Bb!5h+IO9E`rPTHjS+Uu%>AW7{2+7RyxH2eW&c~ z%-p>P?9G($UpL`;A^KT+M-I}g{~Lgjr|KZZ&`m-nAcUL*jw%OPYa3l z@cfEEkE@1A}7c8ZGX)KT8()VbTBJbNWczIAhORa!5-L$w@IE6d*cVUEkx@FKFHVVR|C%yTd%;|tZPsv!YAtlJ@D$;^>52vV`L z6(WR@8caZ4j-$>1j*%`;vWkNYd~BoO+{_$Da_k5vqtLAE z%n_~xr#VD2N|oPnWcX_t>yTfemc(%Iwoit6^D;I~MjQzYJTpA8k}#@xFer0tqfSbK z@zYsiOTu|0Z7p|7>&xPS#|x|s9QTD84@Nq3k`#oab$=8-&d+aq^@4u&VKzZ%oL~2|WctoWg!fd3}rshC1K->cj;bb%K@U3;=;ai{s z*%Hw#Ox_W1YrUe_hjLCCnakKEMypkf{qsFbb2CXx+1Rf}sJ_;ylIC@ak$uMRz+Ex} zZ`-MdJLvBmh3)A5Mzo}p%yBT1l_9J*vH>!}%rr|6No@bK*KHD^P(5|LvGF~MnRoxW zi&BnjhHE>tElc(0NsUfbN2IO>*<1e4Z@gnYtHLPoT0;d|$RU;l<{e_S(`L!?pZC%?D%4chzZ+-eJBIQ0 z+I}N2Z;~3BZy&uCYPjPQy2`FdXYTOfeu4YFkmo>$**PQee5T~IL6AOmCq+abaOhpQ zK6x3#NY&Pf_X+D0*|ol-PyhCE$s@nR25SEfi|QI<{KGQkroCjFK{IQFEnsPh{{Qr! zcivSi4AS7sFioFBb*L$13aDk|RNr@GDT6~9Ynp|}IxuA*YII0yjHwEe?+{d46Q&(q zv1#hcLro|%P*mesqY!EH;`+R9VdgCT%B;g$#99Yw1trMrqg795>&dwSv~)>QU})LA zQ=3NB$UEI@6a!=4RnH8^_072&NgiMn!BCVd72nCAK*K!01eX`g zf}ls$RulrIWq?SSd1xs&L^?oz%Q5}a*+?ce!V5TDF=L_)1M?bN{IhJ+$D~GC*5<~% z`5o}2tRbJEYwcG`tGA4zFz<&~R6GU+FiVp55vGmttQq;(JKFV#V4e|fuzAfK4~ zjaH4~sBT4=!&XaqSPLuw;#Ql0-vEmP$~oo;Je z;@XDlwp74I{Ns9EW;-(Eb{i8KN!%Rdc288NE(5#uGmez+Jq5LM zj1gXIMpMLTe>)vwm#d)Xu;qn5y^uN4s+s8RZ zy#1&Cw09%`bD~ds$!rZQnJ(LD?|P48c{5Py*2D6@fvxtV97>S<@>cwOjvkYl#hnSa z?4sQex3z|a*fA#7ou1#$^&O3UPW!)Ak<@|=Zz39_f;@iv6oLOrHJ;`HTa$Q!n49S6bgNXGVS?JC!xxwT8Ge@mO|FA$Rn8Fy?v>$Z$#V*SjQN~w+Hd~@Pu#I3C&%ZiOp ztuJ+)-`-ZQJx2>kaK(G{W+*_5r($GnrKJ8OIXy8FyfZdEM0?v?kg3(tLCJEn%9$NB zR5o>oa_1_fMI(E?l5M2Ut1S{TWfbF#aVN)yHEpK4Co=%wo%G?Q+D|)|kf2sQs6X#xeEH!^37{f zbrr9v6wijZNdx0Hlf2Aws1S{X)z zF0RaE^CV};h}djdQ08IGAiqM$KDoo8UXxJj)Opw^vqw5zNy%DrnPYzKq};C2+Bx~X zA>+-gEN4PgUK=Fm9cY3pG0_z-3-xlHC)|rP{tSs)+bj_>z%T zrNS3i@97o21TRTNH(pJi>h`b5Y6+)Qhqd*H{S@mt`P%SznN_O?aGuUp{65J=E>4y zGh&mRvf$BEsuZn3fTeEcMOmO*kM(81lBmC7-jdKR#Ecoh4pOK*wzZq8OeyleIowZQ zbf^u-nc1r^_cVN$ZkjO+^}l89Q~Di_{<3l{Nt#A;FUzI7q&#=Pr5TB5g(}sA*>d}Z zvD00@5XWKpsJd~lEx0wW5aXmx9vPdhtqzctyK$~Gmq!){XkqFJqL1%vli_*IAlTAG z;;+V^w%K*bqX?PBGnf8$v(KyROI;*=Ib-v7hi}LXV{8FSmS0D}-0_g+N6Mmaz}6^h zk%=(YKWp>38I&`9XGe$>Ro3p-sn6O;?*bOCwvCm`avEx>vdna_iAuW6Y;RkpN=0_; zNc%z$VNsjS8ih7$T&Hg1M*L_SGH{NSrQ$JaP9Y>bj3o3p zWjTg3yLC{UD@k92SksX%Ytto7JlUC9x!Uakw~Cj8(6tGBt@o9Jt|q``SfS2nWU?zw z?k$+JD8^tt%@r4_ci3FJx{_qMvt@Cr%h8~$_CGphUpGrbGw@?}@J=)3sv39fx zlsaZ4$SRkko^b>Tozm<*nqG9Xw5fb`gI*FzHVKhqnRVPU(e5{itR=9TRi!-p1}(3t z<+;9>?fQ|Er7@-HEHDP@8o;=4^DfHf^o*j^Ng5?tTcn3%6nuSkPv3R}_0pW2&h{O>>7sXfS*e z$4KRxw#Glg(P&hQMvi)p=1o7#03wLya-k=Ce!5DFIJN4L`O6k zs@~P>zLwuHTJDEP%4$u4v_5Jc*KCt$jHDe=10_94jpEo*t@T$`*_xnIyH!h{Z-rHH zQ5copw?CHCwNyZTeYUk_3EUrBI{HAh%fIPhuF|(Z)vAGUo)Qz)Ex0X9#gg+YUiuv# z)$z;7L@znywLTkUCcEk*R8OCG>mA)VB0PMk&(y1)kICAbdiKe3FLF>@%_e{OWLSq} zXM8H-L~C~0hD}DE$u=qwEg^`cHLoOOdlMZf482J(JiWO%kQB0<%5zUv9~yf6cbC!yUrOyMO* zH)s-}RXsC?l3xF2$$g-c_uE!N_GxRP zBN{Xrsu~KzoMpVqmIiH_y z`lW*x~r1)(bo1Gn-YpH8wie)2d z15`{xEU#(J2pjsYh_Gzr+YYk1M8&Twvh3m$3-++QD={$#Q|}B+RAz8Og1xO0Z6WoqZm^bPY~_7ZCR_E! zE5;eGZyBRaiiN1wEv7^7Ui~@^>KD_lN00h6iTa`BZ*#P#1+15{Y)hN1K2g{=Cxa_- z{X>P`13H|1%1|HWNVh=)Em4z;3<=1RDi&G_WlY)5phgrUJQi=c<1 zMJF@IBmcG~iA=}F$S2N&>)W^FV5((p?da4&PT2VPTA+x?2G%}P#j4;Gl}`l9NLYvE(RX=w zfEHTsRrKCNi*tk{uTi6=J(l2oTS~3`nQa|WS22>am2_1f-f*;%0%|GX>f@i5W_euS#-eDa zTf2;7dfmE~LcckzmIaxUNUDvLv{UyH)qC394m0DnRZ^`R`Q$ue^0jG}P`P;jUTS^dKt@^jM$&jsruPzEJOIKNv9;^ikq?T; zSmv#4JNb{D2+A9bF$GpoFxIn{qwD+EGYX$-!)(X3?cg^pW_{P3Au~==Z)5E*RI?-YJRGOZzLABhCYq^8u zf+0jwzP=Ifro=lu%ocHpgAuYh{57V%ErVUzQ$JttP+Tt=#^5N+T;y!L}b{qX96 zMV3n*wkZ5D*qRx62JfuERX4mE4H?zANiet8^jGymX{X9AKAA27ct5*gZ-N8&p>)`J z4#Dy{FAn|B&rJ_lrK8@^`Cib;O*x}g(tn%l^fQF? zNu!^DK8tD$wF2Iw^1lnE?_5W2{KGEHfP;{Haz2mIjutyh`=B3B zs+9g$s5?uRgM|b&4wATO5u+G#26_*#`sEg~Qd5mC!ozIC3w1)xWSxL&y0t27ucLZh z@YZ0XZiLDVmMn0PD(s!gGM2XJQBxm(FpFkJPI|yqEY`BgXV+xahjugMKT-PRpte3I zaN*NGA?T2;Wu`G+FaP=VZdxjsmB9!>n^|Vk$sU%z($I2+ZIm4SSzz7*V80U33P4^3 z$2$-Ww3DUOc%(E0({XES6>KHf=UHU-dXd+G%?FSDyX|AF*JFAtWs)jDH2-&1Fe%SW zH|n`lhk3{*J`eoUaOxqc7y=@by_Oz1K^jQShym-T2tJx6=Q+3h!Gbt-&+Zs8>yG!iyS8lU888%(sf=RXvQI?3Ke( zA@zg}N|(oVNj$a3^xCQ=Dn%;t6X{n4fP3~ zOA)yY@p;u~g#wO?wY>G&!}oZd?(g5ON6^p!L%jcUI?8|v)veeM-+8e#UxBLZa3w&~x&eizIw;8px%M6zwMJ1NAL+08PA}wl`7LMf6L~$N=Bz?3H_H%w<`vAl<3`SC zx5o8^aYmxZm98}y(y_BL*BRDnGZ3dFT)mwOGc-qZbHex#;+Sx zX`xP1GECpucm0rkbdp!?@m8JdY4VMFTDU_5-Z~~MuP7PY7u2E1sq3QwGkvIW_9QXx z4;i5rF3zgv>IB|1@AwDWx1e(|_R;H%nZLYYzhdW=z^7>B<@KMUvFE>vX5P~(-Ue0T zt+kT0EMb)nZvT@*S#&@(|{1rbFaLqfs0J zj@k1n(}b%3c+)yiCuixb^t94zcO7E|c1RQXtXDJZg*D*@Ogr1sYqrvEB*_A**xayt^Hvz|T}cEKS9+{m|>9nwXc(6J%w6Gjn3r(p)7( zH)y8cStap|cfw>RpZmMM>00oOUf%!%-|Y>{_jWH~NER6JA`^_iede_S76|=C%LfdS zq`vvw(C`jqv>Y^sIo?rtfaz_^)VA+rwyG8Sag(Kmk)fkJ&LB!HwbKW?)OurJt6j;< zy*y`Cck{i?5}%orAxmhD+qs;L zzP68Noylj^Ei2nBpBB*Wqo|aP(9S->!81YlQYho=TD+|hMW%rxqaUBcm*4tyx+S%I zwj=@BBkwKr648~LRt>yqtnOh+a;eX38-+$bgs+{V{R^hNp?m+3LM>lORp4%tiBYa3 zw;VRl>{O>?%oC|#jfG}ri=-EsF+nO>f+8HvWn~2?E`J7Dr*(P0p?*wxOI9ldX~`o0 zhzkmOSRG4_!LA|NJ8F8`HvISN(e;$I-kH|-^=3t&e%$tbIr>+!_#Rl5RTWB_G+7MW ztRYKG^rL0Jr>A}n5 z6)ouq)`&s4wy^lRV$jSU1D@$+%`fH{3ygzt{II4f1%`N&hR7K|daU#rVAk+7Z#HC9 z?7cw+@6$lemegdY7A<6__#iV~{nC^oW~Qm!&aj_Ro=F-W(I8AuRPPCe7aTb)qZ>E7 zx8O}1G*+k4INWjt;1_-3XGZ_}@sML7d`a9lyh=%oL<8S}ry77+j zJD$@F*uoiG#L1I>QuEwG#Wipu$$3lY-ZLS48aP_ylTdyIu!*Gr_UzxIUpJkQ^5(IMy)BIc=bQv5pPcsVh>fh06Xb){_F(1gY$3C;ni|QF zVw>(CG2XwvfK-(12Mru7sZV)RT|9qtmX0uQ^i;IWfCAN(eCkHJe_c@NC2gXmnc?*K z(NB?_&+GV-(3YEAefmdrr2%XlW|+GZq-#jEoj73#$>WZn0!oKF3pIJ@$(;yZj-`Cw@HBL_V9}? zpQ`_d(e<5Ivej~XYMXbz{EN4@Ns*@8-W=wefku$V{kMM+FteJL;;KUSHkz_{EU)*B zLt7>-jVzb6pvwA3iVdu1oM9^|yc@Xv^4%}Ytb4o_s7?lqgK9`@52&*ALw?;z;jZP3 z^9k6AsGD#;53E%)7V;cnci<&+`ZHj(dc}jC+C}x$7p<|dMP5kGkw^7OI>si%%HuQj z42sex7XCYv5E9vZXCSmw^u|^m^5yefH+|AUO#^GQ4&Dg|{Y<4CTF#VNG3`sIwen}4 z9vN=ADz|)?O$$hxB-;~@{F+()c>nmSSxT0gZ8jf}WE{A_1>fFNwJ!D!bb+mg7^-r} z>=NHhEvqNAX0>p`46O^aUiG+rdLKCpGS#mFYR3zWm8ss0gb?q2W>sjTY2q74C~05y z7l&G&q+?E%l23tav;7dk(Y4&_6YAdJ>|v-H>V1z0*y7ChBDyjxUs0NGyP0QathED{ zlj1;TM^>mn{d!XsXrVh!?`ak4V19j}I#{8*J@3KnnIR9Bi_sf=Z;}r+^FvD|wXfb< z20Qfi30gSD8ukQdntUTrjC$Ii7LY!FB(*aqPM@RIdk&*A>kXfFc$zxdQrlO5a-k}2 zf!jAvwmiDjn4aTCoi^7RaFSJTezg1iW^AN=GylPrTD*Lc(=8u7j+d{-kl9cgw`^y6 zrhNCOS{|l7ZC0-Yg*&8{X2$GQ0sF|Dvh~~5<>)*u##rGfQ-$hjxBBt5b23s=Z=uZ7 zF{`zNn2X9y6nLhpNh5%%v@tPw7B z?-C%wh2GZ^Vc%;kd-er5h&ePMb7XcTmFd1Tx7q%Yb!Nt;M!1JYN2JLdj9jsq^~%1v zv5OX*Uue9|kG&(+OGc^`EIGW}(uZnWI~;08!+WyEt6CNFa6eYX-#;pB=}{F!WldIQ zR*2=1N=7);V*A&^1s;nL3oTjm2q^GrMQ~!C0B0qy%NLTU)4GmiHgn4_c>^Eco~-s$ z3%rMlvE;P=;0V1R^e(T|c2XaCVsNi@Q-sSWpwv@-d^a^$Uh0b&wJhfoSlkNmj(7B% z;>HJ?CAdI0qxHxAYGJ60JZ_41)fPxI7}6f#!k9rGNiIWkd5A(TPoQN`pdTXe&`1yR zI>tnLaQR;F>FKA(O5L($QIERmY`fbW@F6Xd2!#n~bF-C#<7jLMo)n_EMU3}}4tZ~TjuH4nilfJdK2E)4! zLR*I+Prh*_<}y>REsqG1ztnTPwC7BwyOVrI{sYtw=6VWpTfUZFhTTc>6k%D*kmMR6 z3yjSVI@lgdB%#ZY+BjGNqiS1ekpPL36h$-W>)BtT_98`BqU~=fSoSb{J7~Wp;%2rO5A}&PFU_PC z2>jGOIYFNp7Com5N(Pk`_WOe5LH`1sMkOC%|d z1tpMolR$|hZ+a6({?0p5R4D!lqU~=chEEs;CWKLu3Y!Y5IgUxtWQr^A781B ztR$WDPCl)}$R}zlu~exe{j`W`#Z&Le7zi+~*AJ!!ZrX%~)+Nyn#pvZLLC#Quf6f{o8s4k$*UzQ zV7AGp>+#0b`T%44M!%Z+kJ>N$$yrK;)|C4ukYxjJLRntZ%0xb47Lah3pd@%R0WGgv zx`hAm}k~O z<2i)?s28HakY&XAwTx`y(=N(dmR_-j ztrkNw-?SoM*oPL&-g0uyo2cl?<9oAmm~HTO(>e0YDU|?xT*La9VtHAMg|?4$L)P8+ zW;x4~ioF|4(_dgxs@2*t-X{(R=%-ccURQehrneSp^}J#^VTrsqvusH#(fudsN|LFw zkaN|B^`xi%q+`EB%i;$8YZ3K+(wNNf24l`*(0!^AIg=jV_stJzs+neUEES`k;wblM z)pdn-Dn?`9!T4aN+Q$sc+nq@rqEpdE3;q{#mOZZPqRRVlW1r5arlYfZhAQ8@6W+)X z?aB1SrZtePk*9SIPmPBEqL%S|Do8wFW)sHBO>duEaAx03$o>VDYNCSmVSl~c}`&inN@Ph!UFB_oC!uC z^2lM2L$!_Cx7bPSk~6dU+>xp#L_RCi?RK#g!6*~z0zQ`4T^_k~muqT|GfBR0-VvhR zS4(%w*Hf}iKO-kCO&>DFn&GJ=ko#M*s7Y* z-)$Vt!>yMtzEAv?r)XQNvRlQMPlc#z7{asV<#RI$dM?RI9IJ1eD(vLRo3Cm+%=5AQu0jv*`1|5tn87h~sf-6wKaPD9JKqByP5 zyxc4c?_G;piIix|tSEqz*@#_Tkro*^?pEFIF7IluxZEXpmrELmo5DchJP0Y!G6fP8 z1^kki01euvEdmtiLja=>4V;GrDcXmked%L^wl7VSpugYwGylKu-X&Lc4P*g{yWgBS zbLN~gXU?2CGlMp~TQ3b}^y2Cxa0CzP60fynkyk9l_TGdhz>EQ&U!LDLtTS1nA_~AuHzS+u(>}-e$>*Z57?V;^RyUd`VJ+$I|un3*llbQ>G zPN>o$j*+PZ_*##3Q<-KuYTt};xt4)@+CO9(489^K;I(dVA9cQgSpaFskOJp|T*z10 zG&4Yfk5mHW6^o+1lH{}7G#U58&kp{^`2K-g$zaDep;{b;n>6DXk_=eBAF!JmK#P0H zeh+tmi+RLZsx9hmKUUKG+6RL#Vr-<@&<&E`ORcK#16w?5F5WL2;mgo4OjEGz;lYDF zJzjNoa6nc*oWK>pLvHN$eH{DbE2uEEn=rf?<)PyoQ4k?AXII3s&^I8>*j>Xc`-*)e z<5+OfJJWANYUu{e?UAlh^5OukpQw~?hR(7D444yPo;IPG6{2KB2^x3q6|O8cft zJCn1G&*Mp($?mDN6WZHScYv>W=lY~?$}QO<+-rD;yJGHTXlUpD?uF@)%OTE=hRYq% ztNMs0N(Zpu;oWpXa*vH0OPK6rp5-%5;!tCPL--D-VfiF>=9_vWmuh6eO;vQNBO$}F zane&EoKEYed*|NJ`XxC;w5r*acxBasSr_i_4%r93#17(%PFo%oJ698mUTZJ0C!`(z zB>JmOq`WA48Y2s7KeWF|FVVsAz1JFj5cBEpAsc46{N^?LSw1)Tl9hO-eOeYMHth&ZgHtC@*bnaG z4SUrTebat}ABKmIgby2g6CP!Os2VYFb@tPerk;DLj?d6#q|JUa8WYK!{<@m!n5svnoKPWBU3WaDw6%saI6VVp7m z3c8L2!Yp(d9#WOW*uhlB@rpPPd^KW_)>qF9^Wr0GMx+vzpnR44exZv`VLkT9f6Jlz=fB zV@A*h@D|1p{pw5+<{!jfT{LYQw~6tZlrT5o#c%17?IfgK|Irx5ZfVS9h2H*uIidq~ zA)|l(F>XfyQVFHQuQlAgIUgU5x^eJl>iFljfqHdvwt+SvwY|B)q4g+bm4Ta}qp%Wt z;}t7Avkr?>zE>Zo8?VNzRQPJWjvqP;nz--f!@>&j-95D-GLy`2hlpC8iE^ki4CP1@ z!zBJ!W}OOB%s`ds`bU1|V0f$26+`FW0wuT)MP0#TApVi^T#T(EAlw9$ir1AY*@Df= zH4k6swdj&(AgZ*Ck%*g9$}mi*7$R~H2_98uK5lyTA+^15`r}Z@sn1=2v<$w0Rr6YRafT|WGl4Io6Fr_BGSQ2%PZK=7+x5B3IBhczY;w?CB|aSUCZ68>F#8Q+lNBf zn{N&-=(ZyD!dQubt`ssrwj)2%$oat=Z&)LWBWZ%Qja)@yg491K%G*K4L;ct(&zaQt{!OO;_LQ^Br{n{Ggv~y&1)-`_k zq%}5^R3RL;Uk*Kwmqg+di1@KnqAD)!a0Jh~{iG7b;255WR3lyN?b*StgM&T4{8t9v z#{PJGdwhGi-`PzKQz#gtV%Pyf*o5zx%cdPa2}qt^zTc(BUB(8R_^nW>uIWs)*gn`@ z-5yW&hWo3K=myrl*rFY-y!^V$64)t3wJ8&|ixRNAtY$^ckdL3YpR6kydSDxZI(uY< zUoB)NE#mjVGG1xHPCo)S$u(gtD zbqIwU_;olbM@FqQH6BuF3ubUABR&KG6TZ1ZV(y&CT|PUvs|hoU2EOqYv}vN=idNzl z3TL&d9%pL3wHkZ6j zG%+)^L}9u(ILgIZjIvA`3FnD{K8EZ|bPK?Pu5!JJ)H#3Y)p${eWX|WPlJJ`GsEFUb zK`t7qi@m67@s_B_W<&MWh|1bEy38K95Ew!%?LQxDsaUV}7V2!91mc|DNkg87HT;^U!-=% z5BZYYOQoQ&5Q$Do6;sL!7n8^QjP#_-IcRdnnSpATg*!QDeb3%kQ|_EM?(jkpXU`B? zH{QHk@aBC$)JmgDaZ_!5XlI25 z(i{aqlp@~C7JPeZBtf3y$SS|YH|4@w@XLpT+3C=68g1>jt;S5r)+0V-xZ&K^<{q+!98_XUaJK5jh+6EAjF<3Caj+Jt-nR~RE0TNX!A7MXnFGJ^3?^z!z7PAoU_trZB><(<@ z7s!Y{`f!hqIS7fAsexv?RDh=@rFCA+5LOs;yfRjl=n?Y#9HXfOg=~c4z_A1pCek?g z4|XIZky()+WOXE$WqF?sCqf2$j!r*i>k&L;lHd#si|Mpq)H z$g*5B!10FM)NIKZa+hmsuA$_*9S4vNg}5Hb4EWZi#z=0h5Q3IHgdlu4 z)Ua6smmp?bjT)Ym(hS&)>}brst5S*!+N+Utyv+ZEJ#OgbY-g186bsc)R1Ldry^8LW zx9i$YW>KLa(ROs1Xp_-w+pJNg56AnM>bIFCj_fPR5+B{T#@QZC$==ZxrYUlNc!ces z&7<)KOm_AnEdB;%IzYiUhl$#!0NNoVZ#X>4&93BxzWnk4v(Af14fppcxAre=;fbsx zn;T@Z1Tk`U%5obfXgt!WlZ=kj33mUJJk6=^ln##u2s00d6VYsH{K|?XU+(N^b&gjQ z`n`=ta|pgoKopfbw)!*t3y@Zr;5&3EgxS zqH4@nrCG~)mh~>FQ}UK!^H-2^OPi>3)R@P2a@34nM5>Vn3J6KgOO4k{M^c|+fD0Ki zoVJ$UyoOtNqZFd1n2)I{Kt0Mt*P$&gD7*dS2!0Z+V^9Vmfl)oS5d)7Tgj-nAx@ViPaQNDu9zhBW|I#I75da^{Gchen!; zYP$Z~B_mI@BGDTFN(C^@WiqMKm>aqTpv!~5lZnIe0HwNnGOz1UlQP&V3JIOa#BS7^ zX4+pzT$jMP=3eDX(|hCX3AXc)5XD%on>jUc=Xiw%#_V0Z$Gy#?C6G)a+@oz=_hKxS z^nWsgWZ2JHj)TcPt;TO>N#K2DE-T#EBtC~nxg{w|#r+St<1RsYrmDVm^`$r8y(-;2 zE8DJ@2KO(giwo=C{b)8wpj$^PRjs0GvM`tyj6@6IZSRV;$@*1~X4T{s>637UeLxaF zhJMi}0qN=1yXe+i+O47kATS+2R%)Y)g|v#(Ksg2*W4gYvhpw@Q6Ytp8g~@O$78~*{ zFJ=Hi7rwrzRWU(evNx?|axx(XG2$>O!C*~MBbJjriUMMfyQ_v(gi4SG8WC6rqDYAo z9Wdp)sKi~ITNX&;sgiN#%;RrA9)A47HlhLWvy%g(k3agsuRZh3+Gp2RzWey&7m@-l zI&gf~%FnI6#q#<*ua#e2`#Q>>n@rm!dqz}Re{|~9=qFC0 z__rJ*TP*(xF9&KpBxnFvPmRU|ukKSAW=pv5^*tfSAMt@ztF#*@UjTT0?`0Wh8 zY1+A!d}CqsO_n^D=8ap~-&`1Nv+UDJmWUPYE{uMWMW3@GPo}cs?<|b|35&m=#dXq^ z!F_LG^qYkHY`(#5rT=na^gAs5yzWDj#c@N}V7|XF`dz}j;208!U-{KvdPaU^T#tTl zVf2TBE`kuHA~$sZabfgd2=koSBip95vj4U)`XedBx`Gu2#LE8X!s!1b^-u~REBmvB z(We&KNvmf;Nh|&I;^+%fn#U@w^rsg`LzaHpOEDu^(Tj_t*ID$rA}DOde|2&64vQh! z82GlbwZ+jbmVG9aF`jCL-&h>|ZK-JF$_m%Y#*3q0l(IAyV`bl29Q`WGempFRt>7Oo zj(&p$f5ClY`~I7YqkqBgpHiRJzW%Gl(ZA8J;`i9sf4eyP9f!qyXkWj-IQkFrRcA~4 z`kxj@|D9idj9)PU+UNhZIQrj?B7Xgo#nGP%FlWk$`I%=&3(t}^oj?u6r=A`C7{4xH z61Gogo*kW$PndY^(`TL?eTJXT#L3o5o_}`q1(ZDKntyhGxjF6db7Qu_=X{dEhmN@g zCCw=X->aE~-`w0nk7afc%*{y!CHZ854~-cBU!SkcI6fA}m)J5>jSnpojL)Ur#i!cX z5?^Lv@uAnOqFik$e-Q&p6q#+rhs+@2@5&0|Tes;$VQKI1scqy?(6VfVZ(1=F&fmUICJb z9O_H<(KOya-_RS2*2dpDH@I^9Hn(=p4Q|K?kZ(8TQb8+G6j+~cPPZqB>udX#oXiub z_AAyN+jyg4ikLz;tvBR@gvol9E-bT^H!y)9MQCF<9q;Yv9UF&_F6&Ee$a2?(+vO$o zU2Y@rV2;maJT10&uzly&JW}v7OY|${^JkiIZ8%uh6&mw9LTb3xV#Gg zB~|N7O2ra#4tS)*;$LZbZuY2s6xphr-G>K4-RKTLCUut z30Mz1w@A-BbMO?)`JD-arxRSaFbnG;G<6n?v`m$r3-B85kDb{WPvI7feTud-p4lpQ zjb~A|d6&Dz-B1jf;F#~>BcA%E5c0*a3ssl09SV`O(a=#%T)>JQV|O+BCUUy?@KKEV zdQ-YREGvAb6daEC_8M9y25NmN45M?1v6}52E=y*RF1s});WdkedK>(g!M=3bs22GS zJbehrM#mmn#IP;`Q-K{pMkJBF^2&0XrGhr@MtN)e*UTJ_LW6>vw37JB&i?l~@nJt}h+BDNXzL>V=w^R^=nN zFCno^9-F>GnVe3a-y{N|*VRfDgjz*X0nw!SpQ+s8P5kMVwd zEiME#Pp|q#DSVw*mJW=8$g7b=TZ2Hpj-0wwwAkwD5{Rl%up|#D#rMnb0aMq@ftRomMuX zHy90A&;4&q;ABsg@g%-lXeZPWJiB@t5OJs;C7F6 zD#6wP8ol}imJ|p_J1RXK<1#n(2em=R@}!Kh z*x8p`jAkpJB2|CkmBe2NeihOOUe$-ukB`j#2kuNW*O@;ZV_IgS%x}*&=Up-DJs~gA zj$|0xo`0WZ5h{{JYLf=GsI7%HXnt@LJ917{`mfdr4p~u$o8-`qt@STonm*LuUJ4u2 zDVkX7zgNIYpsc*G?s49Cq;!fnuP7OP|KPLx~9IVep{t9GRE#$o6>q z0LQW} zX0@bU3~H6MV)bXVV&;CnX5!r7_X}wAjwD`Kf=51 zL4b9VIB>@E=)kqb0OsTId{TSkp98{?NxZ!#F8o5nrmJy?M0GkZ!g>&nvHu2HK9`0v@)H?Vdx8Q zu0OGfadAa2-RSmD$fqLh1L!$3_o07da8VK0(L!f@M>l0$aK7Q@zwy}v55bsZ{6F5+ z_1=8>uaXlsP)-Qx?#bXO1kj#go_GjA%a^i9PHn%t4R+TM$q>%v`xSS^e_K;5aRDo@mYvl;wR~)-b+%Q#Mb7LmKDeSjWm;>g@hqiVj8X^Edh^LLt$`?bk1XYyW6{*Oo<6?(RJSE&|D=;u zf}%%q3DgsaE!3W0W}(V)1QsgIC#?W(qN>JSxge1+cUww@wbXz(-AZl5L-_MZ$<(k5 zMJ=T+$QhD4j)N4N$Y$tyx|3MR4lI2=%A4z7;z&ykA1OBb$v8m=O$Ia z??^Vm$+#jmMW3*vg!e#Bh`dkMRq7pdGtE{MOflRmlhPawX{BD%)zwaOrlH3mTUYM& z&11QAuWO!htsJvmxVS`5Kld0QKU07yu#Rk6(2=OxvCJgamIVH=*U|2x(iFnNaW;7B5ej!!Q)^#58%Oy+}lrt+A zfNj|o6Khy0&Lj88?6^*DX+c?9>jN=$QIfb3GHyEA)gmXUjA^iBU?ePoYg5-doBvSa zd%b)hFZjdgUhH*GxQ@V|Y*>$D9@^o-Od4Xhob#-)NFa{8R4d&AWp{wCXx}HD6Q;q@ zw&{4{P(!c!b&Z_dx#O19Or24?7RN<~BGaW_$o3eb2q^`3#ZH3tj_ZW^O)`T`IIgO; z)HFlZCN^u+_2@V}>TTB%;zA(GA^j<53vq+ynl8E=rnwDu7lM|mb-}ik?KmSQV$Sq^ zb}z_98wedZ`a6<0R|&?2)G=th$+oDxa-tPpAtXO7wKegH%~VujU6H%eC0gt>bQ9eq zSjSI}wM~3ULos?!pnX|G)We7kKh1)m*Ep+|h2=n;)6;@_BxorHxMd|E$cYmZm7?`7 z7m{RbqVsIczNLfYOm&{qcFp9!V4AKrtjerO3QXb!cd1vSpX$DMpzq0FV2#i~&$({G z`A>H;3n5zPy}hQC>*I>rXs%MsK}jxoQ_hb+#5!Fb52|kdPtk7gKG?s*J3#E!in`2q zaM5zOB*YTp(GnaoJ*kZFV9i*_OjC3uLrYc6b9UOpTIumNx0aaij{nX#&hF%(b{fkP z2l>QZx~Jv0m8ab+C$nQOeU`a|S)MCepVO+02)>i!sRkRV?bn(DFP|#vKwb-n*o*pI zBKF1JGPB&!<2JG|LRBw9rQp##39tI)%7lUC6n_V4jlT8}`P70ah{m6#LRN(1?svR^ z)Mji=eQDLBE@jMUcI3D+_tOMTx#!4=ekX%aCev2`%26nQ^Vo*m9(|o>15~6wZ?7*) zihq-AaF}~@zw+4_;X6BV%>(m z9%uzS5{(Y#Er}~o*J_H1l|Q7TmAOUx@4=4cj_8|Wh)R2`%&nP&^kE;_-gJ&-Mueze z<=Q9@K6kqFoIUHJy`)L`W^z3-zTPF2}8{N5dwMJQY_4b3i_oj*=Lr$*st>2mnU2VjH ze7o4o1w#6W_&dk=6^F<6QO=|>xr+jau{Xyf3)A&+xzE^pC3FP9VH^N#fuwMZCzz>*`T?`^)b+^74itIG39J~5Qy6y6KfFjrj|RY2j!d>#!E z0qOTQA)T(8w!fxwoYjmEqIfrdXekuUZY(mBdNY$#Q6{)4@$%r}g}N`$nq&yIeLL5z z1W=*^@dAr>Jr3lg4)h|{7$ya^W}rni5pBe&kQJ_z{iMOb6>>l>i-hfOFlKb+=Qpm5 zuK(P7w<=k)@2LTsO;83dbTMhXLQKNqm8SeF{jq&~u&lB6Ct&bbvgX><5#D8}z6qw( zZcu_-`@Yssr)#28PZu=AV=|0LY0_(t_c7b^C>n-KHlwwav|5qa7yjVc0-i;CQSJ@x zArP(6#DGgwlSi*5&ul27{Qru!DO&<2*u=>9^SlSySr>>+i8zOFchc4=Hk^ z9jFo$DkdbE?b_5CzT?efGQPwgPb`)aRFOkQsXoOdKj^(2d8>eN4`}8SQ~*?$45HmD z@<5IvWw0_@d&fqOyEW69v(i?@t~T4297NjI!t5hq-XW_nyC=A?$GA*2wQ9JG4%g0+ zF)5zqyPK1Jlq}DaEpPflZ$+BGcBL%+L&{VoGAaOnl(!(ti9rgyehbtz>&kmAInm7T zzv5Ra-4q$ypAG*|TMyGjjtSGO)oivsAKk0gqqb6j{kdATRhCT|b8~Rn5|%zTN$j_| zB`PB&4`Q?FI}l8XMv$civ6dBjGNr7d+>}&fbjElK-?v%$7; zYcbF6x}QahEJ&8otX}?RlLq2VU)q2$>G(Lx~r=9kF9CUKV(QzNEazl>?xDgx8y=nUJ%&p3gwCnN2(aorGpJ>* z6-CI8m5X^?Cf-^zY!pjr@BL5(Ag1zgH&n-Xw@v4GNE26LaX&od5%zhR+zrn!Wy(~Y z!Ajzq*`atH5vJ+zN5$=`cT`ZFaA7dz_u5n9Eb#<>hx58T4TB!%0xt*k-|)U`ZlL1{W*V>q7b$?DXjm` zPI{64r*VCez?r+g`{L|2{8|V;*_;xov|XLl)h?w#B<`uUYx5${BmyDr$fJ4HK-?cc zB#%Ay3SsJ^2y+5@cw9)Ud5qc{h4+vTL4{>n<* z^+SpLoQ@Q9!%$Z|I0^BmTf_ePHA(QFT=3ng8z(AvHq$M3Oid>yb!qA8gg)8NWNvvW zm9U(l{UT>=lX&BHoTn8y0w4QXG5}r@PL|f)D_z_iFIO(u+QR{H^`Mw-c*&Pi}!?$6`QNYQ9GC@A~z9s7?^)?Q+J_74+ge&{|_b*x7 ze=x7($ulM}5P@IspVlYxl~n+A>IHEn)BsWP7ppgGcYCtn%#vYP!=<_I)R}1!E#2># ztoz1uO=^xc4c;`V76fgcbz@TYRs2IgGu>?Kit9-RI(r8t1BXcBPGnXx!<$XR4|%=r zEq<~{{Yo^ORjN49tpfpp{^D6S^?DYDfg>4BiHX6V@?eYE3RsC8!DamupHmBv{!y>a zT>=Kx&wB$RJ(5$c&D2N%x4(J#;67h~90Zner4)>rm7d3|_W6-BaOa1@R@3pOM(43(@|nLi0P4N*TswH8z=Z8&Ok{5(UI zi6;Vs>&8twQqc;oVD^47d7lk`#7dogiXb^&d{-eW+VJOWtlcA{uOFd-qP=+tM+(AR z9O=Xb!IGERh?mSBWGZZRD^$^+oQxcq$R_*LNsMf}c9GL{zb;APPbSW{zIp5F#`PO- zU;oahA?Mxzq#tsTpPB10)+P3$&x=B%)Yb}q-oL{E-(`RLvkKBGg zrdu%+e6pM0M%w71b24}A^ga@1i&rdUPqU4f*^4-X=bftHdS1K2-`z(OZGMAT5_vSo zslq73LP>TKnu7!jHm;EBC=I%t?p6{>zn7JFIB~Bc6}1nWt_~6e(vq0n+Fj?%*LM$& z#)AX7uomVK8)ln_2luBH6B3M&0RnzwJXXvH?0g$B0XR1(r)kdDH?Q8f^8S@u*WYj5 zKzHx{cybpGH*k|yf04c-1FRgnQ!Xwyo;H6KHvwbk)JOcyYw!K+yH{6acY7$KFFmxU zp}>_!Xn|t>ksXGCf0!LR4#6ZRd@Hu5)qUub7s;{=jCKxRdGDLo-@E$umG^F3`KIo` z7Ds*(bJs8#A$FSB&bC!V3g;cXsz+cT(42&p639b75edk=y> zsn)0!^1w>L6wM>+Vu)BysoHNd*`Lq?7yDYLjh1Qz@hChNm9q{^Th?K1bd8IMBtv1^ zN-QAKAjW1fP{e~sj5?RQi6LzgpW$m!Zl_F|mAhxh46S<-ZPxTPkXjNMt@W%!8(vtJ zhSs&2nW8r$tA2L(adyi(d9>Rmhtl>7S?)u29d`|PQ#1o-;$hmvH8(q98{EQi5VyNj znqq0B4N6K)HL>Qh7`53qsV0~HD@3O!L?rxyAk-sLQ_xj^_J}94imJ+CGJ@N~*XWrH z-h{8diMN_&DCaB{A->-E!5W;anK^AQQKqWNp|P{GjFrIaaa~Xi6xQNTzj_iP#a+qV z(zx)DvA#h+eEr;Dd2e!fxHn$zW_gLW7)^;~bm=9=(LU9Kp(fOi{w{qG3B+S^-2`SR zl8Iq!>5U1_sHT>y?wzg4@`sWf<4TWzseY8Ky*ervo)pjIrYmcTrQxw)q?H@)%pgs^ zaoN)z^4gh7ZT68mD5-NBN0Tw{8)Va~>CH8AXN|m+pqJLjuQjt&lR_GK-tWAXuFCPQ z%r+5BX`X`y#uyL+!@}kO+ezb%>F(x*i(j_IefO=K+JW#iTeQ}p3bj1_(Hj1?nuZYO z>uGpI&Am!Ta^erPRRV_&DcvD(hRH?lm1^sa0tdM!F97McT9{;!)(VnHYU#JWT2T!` z3{7ShmqSdIuRBNAY-9R>S4`DjaydbE4;C=V5?afU!lYw(vD4xrN$Xs=>1-%*2(A{) zuvR3qV!zFfXf;=>iGpahaJkl<+Ke7Z9{b!}>2VvHZ1MTNtv;kHAs{lwt33^862x<{ zhQy>lDkIHT7K;%PR!m0UW2wyKK`!l{D{_C~I{@SD#)zkCrCSqnbPST7v7g7^emwm6 z^SAJb^K^5Y&!QvyYqCE%+}L>h(GPy@nP=9{tZjbx@y9Qu5PAg0%D314d0DQPOk4SH zt^E|6}cs0rOKSOqfIr>JpnrF2^am9xxDA#vV^Dv1 zYV_P`koA|-z5yzUcN^qqPmk6K`Il12Wa>At4^EH1L$FULV2?lgeMD$DZa+SJ{NTaX>i-4Gh0v`4 literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/examples.doctree b/docs/build/doctrees/examples.doctree new file mode 100644 index 0000000000000000000000000000000000000000..21bc073b5e6eb048a8c276b48417f1e15b1cd487 GIT binary patch literal 10451 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 IW&>^dKjl&-1poj5 literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/functional.doctree b/docs/build/doctrees/functional.doctree new file mode 100644 index 0000000000000000000000000000000000000000..695a060fddc58873fba72d9b90d854ace9aec5e7 GIT binary patch literal 147638 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 avjTz;hcg~Xi#pw)z#;Xqln}wEPyYvu2w)ii literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/installation.doctree b/docs/build/doctrees/installation.doctree new file mode 100644 index 0000000000000000000000000000000000000000..86f153b709e32ca0002c8645b88e6557738ab736 GIT binary patch literal 5501 zcmd5=>xvx572ehE?C$JkblrqlTGYW3k(8aC1m}m5gGq>qF*2KgWkW8eUDI7NRob4e zc2)K6PKbl^BcO#!2&7}9X9yS!ArBDp0Dgqv2gozzJJr*d87pFC2NJ=G>AIa$=X~co z=hTO*f7ZK8{-5i`D$1=)%t5MRZVIYr zYn~SG7GlY*8y;Dy(t5q0ZTT^cPjnr6{B+T!jby&9gke`ykh1uT~ zUI83<#jRxwB5ffqiDj|k)@BMFy46Icyg1B<%xyAjwH)Ra7a_%0WNe_MTaOZE3;o1yTGG<3iXX=;@UYl9V z3|`~MJW<&on+|O>fECT4)NvqNH$Kn?cewFjB_HD6U0jNdHOoZXL?1sC(gc{Yff@x? z@SyUEH(C&>W2oUL+DFr3FFZ)(P%}L}2p(eZNJ3;_EYAX~g51b-9I$j67&WpduqgyZ zM{LXk$Q*NPXpXq3QSAqi z@#^_iBLKcqF83;KK(+l^lQ$o#%0Z>?_X8s*8QiAx6bOM&{Wk|_CKHy%SRG6e%Yo&3 zB2$(SY9gUz#P3%(`0pOt-24z%dGq`?ubi@3S-^+PP9mW?OTuBIqN8@$T)pMpF~e(V zj_OKJooh5(gNR=~3nZ?4I!W#ugbFxtBhws2a7;fFmX32oPvKUF%m{D|(NU^QaprnL zjzxk$8!|m6N+PWNe1^5{*0make*DIW{DX*3KmYKF4Fo$zgaT!C819#D{pr*SmHMgo z=2&2y%a{k>7uIIx{$PN;2iY`Z2T~1qIso?$6JAjgVtw%HdtnfI_`&G*%TFEu6)s^%`K4M zUJ$>2CSF#3`fyJ>#;rm3T+71UJ-3rQa(+d2@IkO<0Vv+2Xk2~&d0bxJvSP$}E&Cn_ z1*>>+ezt@OW@qeKUq<|%!2JieSvw{!9xTr^-gPgY2V)IP&b53I7W`Zse;M06q2|M8 zgS!TE_KDK_2$=pXCAN$}^IxR=+6;8}E)JfR3N=$dBZ*w4BtpskEniv%KSKRgq3@}4 zwRObbAnC8|fOvLxqZIOKD~0UNrI1@cL&y^WM2Sjy8T9!ukx`&|ri`>oPwUihzQv8E z|A6SfpI_68^1ohb3{8JgC%gWwV2sM7)DyqJZunp1!viF@!BAS3nLhpWRZwNi=iJrk zPC@?Jvw~ba5=SDL5x+>!gqmmgZ?taFF#KhRwrptQGZ#t?FUL%*`ZvCGS8=Y_>NalHUVcwCXFZm*J?C&{v2ld=ksG^uVvi^ zBe!n_QC#N!P1FNENxl>qZgWb5m7OYVoO5-fD`DbaUj-948?9UHbCuW!T+lE54-kV3 z8V06mADHDd5aXv?1?(dCAjDh8Z?}_K>)gfhg#%YwoPmDjKa)(|jfs0igv+iM<(j&+ zuvEA>blcTP*{!(^xP)2_bexx|yYVe3_&2pYjSIK-4oh;hX?1Sz9lGwAr>OkEM>ww= zGjw^DO)`9Jm107ieT2`=*=Md3eC=2jh1A{AEW~x7m!1~x%19}jD$84w50>2ywX9|=#uLSfZoLgH-0tm(w%iAl8$6KWBQ2N&F? zU`hSiahLh2gsm*Ixv3U)Tqowkd<=0tv}q}9g%z5!2}ZhBqY|Y{6^~s{rde)7)Iuu8 zs={@1JLZ%uj|~Yo$YhP9WhLb|zILTeyoVxAUiT{3(UoTbNlm;?Z}PmzG?w zJh#!I^Y+6Z_g{wm`H6+i?h@U>z)%7vN_=&_QvD>8*`^Wn89XFxyP&EcPfkw2ZqyJQC_Ns;{CI$sW>C0Y z+CeAMj?i-Sh6o($VR+WR{hjZ@EImDn7R1mq!Ebu)HE<-keV!@FxS4?kIAAr8*M$30B z4CAy>{XvZeJ%M3-od(O_cOGpaWFKwdKkp z@c(3}k{V2Y@Y=#)y}CPhVz-j&H(i-KA4IDyG5hY~S+kiXw*l^`m-X-zhmgawp+To# a9#~Vv-0)UC?A^H;6Kl-^oRTR@)qexOTo$?j literal 0 HcmV?d00001 diff --git a/docs/build/doctrees/transaction.doctree b/docs/build/doctrees/transaction.doctree new file mode 100644 index 0000000000000000000000000000000000000000..eff737fb2b216cc1bf89c2a751b7a735f0ffa6d4 GIT binary patch literal 4701 zcmb_g-EJI76?S6J*yEqE<6tf}j@D?kiW6c_kU)w8zFXzSVvrUuLZED`rn_dU?C!3n ztJ)q5MGF^5u_!KJn+Mc9Vdy=e@2umYRpE`Yhzw=Y`o0UI* zzPsf9Y(G+AVPve2Qx$Pt+BG61JT>Ll<-^~WFUv#Q%h{DyMIQ3fE`cKyGLCYdmM==N zWLGs0ja2E3UvxxQtiC7@ao91^#Jq82H_vjGYUW!guib1fNgwd4M2@hvK{9o_GXnJ9Q9>k=@pr zkm>Z8MNx&Aj!YvyZFu0*|5nL%6?x31OTr-%3Euz_yWarD!J+qGrUx#Z4@-N;eK~G0 zm7+T|B_l(BR2wMndB4OD?F!%=zGl@SPWp5bXo(b?B5$Gdrw#dsfPG-5CqtF;#|LH_ zAR7rYCl4YXqE?~@j}I;Z2SESidyfxd6<(algr7VCFV`mJ=HxkxHGk-GMS8cLUY4fH zAfv5{v0d+Qo!9ztp1Lkv{KdPa&i1BB{7h$z3U)2aIZ%7aT}FQnDQ6X&zkClkdr&tK zm|Z_3j3beNrW*S^wbMfYgWH?lZQz9}s_rVHgOa9FIiC4kJ+^&L-pywrgd`+f%pDZx z4&tz&=PX!MztPBbZ9|LJHss~|8S?8l8M5mPp{h@~;dw044H^M?{{KPT3~(OkGj&Z> z8x2)6=bN;)^Iv~ctEglDN4We4r2J2QZXm;V-%vHRwl|)&wf^P9wDx9YS?g+0+8X}) zVH(!w)n2P;lG-}{_F+17w7Z2tG+ zTTLdr3iHf$MxC*iRbs>8<47e;rlnohCMxX)D14g5GL)vgaSVp#6K+cTQIM#ph`Fvt zeWNR4y})}iD#cf}>tu!y)nuR^^)DFt&u=tx1*-GXt_YLFu5bTio(n(V8tFS_v)PTW z)%doZv7}w&#&*56FwON>{CA@U)6=evi#Yas&R1mE=g{&K-{$7c)3@(XrKY(Q)=S=7 zQ3QGC`?r>sUK81{d|~CV-8u)ivukW^YIN>1RauPP6ocE5&YwWET}_qWJ#NVQA3Muw zU8|OWxhA{W$bklID$TFa8_Q1*mM>Sqpd|<^+uOIL**+>Bktw%qKP+-~F zzG~MrH?-Gb=e|Qbw_C!;xr;LZ*!>xc3+za0S{R;u!9V=z9jPSH7!IT!B5|loT`78)k zLKg!Kk@q}>$J|kZD``aFa0Qd0v3j9eyN7l&=b6e)5Yv)ep5C_Wg2l7Pj=jUD60yQw zROp(iV>=Na6%)woU$H!;<^s8#C7|?>(2$c;$ z*!9M8N~PUrg;BwrWN)J@*{!HZvS0>01lAEGYCBJ{tU}DTqquUR^v_9|=0&6etd`)~ zL4#772hBGfN7)z%Ro*8tn$eq;+F$(>OpDu=naxcZv=)X zh_Z2uG0%=Zee!*TrJs+(1vNyOtJ$yB7^QGkmfVb;8tTtb(KBp>5{Qf_PuJ{y04l*{ zp{lK!`GMcaZ|t|7H8RCoPS*h7mSPkE$ZjjEA5nNa`Z_gi8VETNF+PClN~{Rsn>t~r zr(YE)UyV2Kx@Z3wU^`(|1n-9e+h&OT`m#dCsQ(0b`=ZD&9_R-EcS*0x{RSXWp-jg} zbzT3v)Dd(sYV+;zWW*zspO`;}eh=_R2H6V%|Y zPrU^96H~szm2%BD2UH_~g@!Hxbrbk;>tJvPx&ah}9*J;8bW4AU_SK@&7;|Ju8_ynS z2-A-MU|%Jo|9*J>6eWB90~$}K;&=L5Qt-DITV8B`qWw-$&q?p{k`uh!~b+HJ{48_f;%?Y%`= w)ya}wLuZ(=^>IT$K_Pw`O~(tIHGme`uQCJ+m#lTV31c21E9H + + + + + + Overview: module code — pybtc documentation + + + + + + + + + + + + + + + + + + +