From fec4c9707d5f5a88a052c22fdc92b235fc8dbd27 Mon Sep 17 00:00:00 2001 From: Toon Verwerft Date: Fri, 4 Nov 2022 09:24:34 +0100 Subject: [PATCH] Allow php82 --- .github/workflows/analyzers.yaml | 2 +- .github/workflows/code-style.yaml | 2 +- .github/workflows/functional.yaml | 2 +- .github/workflows/tests.yaml | 2 +- .phive/phars.xml | 8 +- composer.json | 2 +- psalm.xml | 2 - src/Exception/ParallelException.php | 4 +- tests/Unit/Executor/AsyncTaskExecutorTest.php | 4 +- tests/Unit/Scripts/ParallelScriptTest.php | 2 +- tools/infection.phar | Bin 1003608 -> 1025342 bytes tools/php-cs-fixer.phar | Bin 2516436 -> 2684413 bytes tools/phpunit.phar | 150110 ++++++++------- tools/psalm.phar | Bin 11459502 -> 12090660 bytes 14 files changed, 76844 insertions(+), 73296 deletions(-) diff --git a/.github/workflows/analyzers.yaml b/.github/workflows/analyzers.yaml index 1902284..5438b66 100644 --- a/.github/workflows/analyzers.yaml +++ b/.github/workflows/analyzers.yaml @@ -7,7 +7,7 @@ jobs: strategy: matrix: operating-system: [ubuntu-latest] - php-versions: ['7.4', '8.0', '8.1'] + php-versions: ['7.4', '8.0', '8.1', '8.2'] fail-fast: false name: PHP ${{ matrix.php-versions }} @ ${{ matrix.operating-system }} steps: diff --git a/.github/workflows/code-style.yaml b/.github/workflows/code-style.yaml index 9ec2876..78a43af 100644 --- a/.github/workflows/code-style.yaml +++ b/.github/workflows/code-style.yaml @@ -7,7 +7,7 @@ jobs: strategy: matrix: operating-system: [ubuntu-latest] - php-versions: ['7.4', '8.0', '8.1'] + php-versions: ['7.4', '8.0', '8.1', '8.2'] fail-fast: false name: PHP ${{ matrix.php-versions }} @ ${{ matrix.operating-system }} steps: diff --git a/.github/workflows/functional.yaml b/.github/workflows/functional.yaml index 5ae17eb..8180291 100644 --- a/.github/workflows/functional.yaml +++ b/.github/workflows/functional.yaml @@ -7,7 +7,7 @@ jobs: strategy: matrix: operating-system: [ubuntu-latest, windows-latest, macos-latest] - php-versions: ['7.4', '8.0', '8.1'] + php-versions: ['7.4', '8.0', '8.1', '8.2'] fail-fast: false name: PHP ${{ matrix.php-versions }} @ ${{ matrix.operating-system }} steps: diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 49f207a..3af4824 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -7,7 +7,7 @@ jobs: strategy: matrix: operating-system: [ubuntu-latest] - php-versions: ['7.4', '8.0', '8.1'] + php-versions: ['7.4', '8.0', '8.1', '8.2'] fail-fast: false name: PHP ${{ matrix.php-versions }} @ ${{ matrix.operating-system }} steps: diff --git a/.phive/phars.xml b/.phive/phars.xml index cd0e142..696eec2 100644 --- a/.phive/phars.xml +++ b/.phive/phars.xml @@ -1,7 +1,7 @@ - - - - + + + + diff --git a/composer.json b/composer.json index 979b9c5..e45acfc 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,7 @@ } ], "require": { - "php": "^7.4 || ~8.0.0 || ~8.1.0", + "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 ", "composer-plugin-api": "~2.0" }, "require-dev": { diff --git a/psalm.xml b/psalm.xml index e8a8b3a..66c8125 100644 --- a/psalm.xml +++ b/psalm.xml @@ -1,7 +1,5 @@ Bz%12r`@1^n;qX$l8jyQ;g15%6DS z^Ogk4Y^s0+)KXK^YBKwc>^fE9&2i2F!JspPC&|wyD;znbvZk6^v@}wz(YA!$? z|FaSeB}D^S8m};yM~zl!$!#YobUD&Lz~=sG^AIJH10kI+ROnkA z4kp$bdTMH|q;Bt&IMo^HDj9i!G_&h-43tQ2$f&+!R7PHM&Y;9}G;WBne;TN&am{z7 z5;Y7_edV(83KQ-%e;DuD#CWo-F<#N0Yl)EV=^r~QDHK4xm#>s3ja7tkVHG-R zYHeQhZ2BKzj`D{I3R6yD4Z@_d$?s(Aaf%=g8K9-6w&URD5P9Pyg}q!jQK2FK9;-0q z+&TjGo>tqemE1f~bw}%gS&2D`d6_xrms5~`7_d5EW!zysC%M-|g)e8E4#eusQ!9~i zQ_k)<;AA%~QhCA}*_q4p3l%ziJO?Q3u4>j)isND6LAR<2GUOGL6fSa`$qEx`LtT;@ z4-U9FZdQrBb+V!%mpUDsbn&x}Ih&Sa!vW_(!Hjyx>{)z{I|r127R%oFrZL+bXAWot z0JR0D7O>~p4W+{(iH8C3?FajNY-2W&H3fj>%`>Z5dbS@Ys}0(Y^nX&!oU)s6^@jk) zjra%VO7#PnSGEO<%`#)U+4>wK88Ft>pEgH{;lnXjW!Z6tBVcs6{P_-Z&x+xIJOCK1 zzEOjn&+NbfKLOC>-tYEoY9{G$8Z>{K7X6wv%Z%U{_W|Hm_n10+n-R(ZD*+I_`pI#& zIHLsz)BqkQYEFK~qB2@@r9J`1wB#X+TSENj*S+ zmR>PNiSEYHXAF>}vvnw6Wjtzn?klm}V!nhIx!?ya6H28W`VZZ&Jgg z`cM}Ts1LwS6EL(Ab1IrBdY3y;b@hXMm6Z zsj={g8iXuQeb*$mpr1b{+Xq-Zo((&}y7z0u0Y?Fl{N{EJvlf6E02uMlqyXS!%RZ!7 zNRkQZ^$D!FF~)Q^sL_Oz+JmC^&W_v6+NF5JuMo+BUeQ*+G({PuhQKa2C&@D|Co?HI zH`lX6YI1sdc;>)?i5Y!k(lU}Gh9oEDiv(K;wCI5sKvSL{-iz6!IB`iaFkoVRUYlJ{ zCS!*I#$N5grEF0*d$ujvoMROLaPAt-TdZv|JdH{fzQF0|zx$FF|a(gbcuMxER&jYz+u3+_v`BdcCLp#%j(^L{pq962hM|S`BgJ~xlZT%=&)IR z%=iE7Y}=vJ)xf z`nF97D&7|zS$1Kx^OFk0buRZ;s*=uMOAJ*0LE6t zF9W7tELK~OIqBA6UcG8@Y+V@KQ!pfzW%fW_se(TO;Ih(`0nD=}Rn7(A+$&idV?pTz zPKI-H<@y(AfUG?SL;;}0sWOP^_lW1d8xDZc9SycCwRY!PH%rpCX`kFLEf+e0WWM0_ z6<&-5{7#o&j%MlIX)%5VfPhS`d~mBN3+ZmpxmJK{1Mfy|QF3)*50dM#I^8L<*I@KQ ztNw!_Nofhel6JO5L)8*u&BD4GTSX=&LH-xua{ES`d^{Em9KGK9D|6{a1vLYtXC{<6 zvUgowq*XAAvBTD*ZE=I9>|j@_=6e9}?9R3{Hl(Y+bWs!^Q;77D+241tur|glrmMBZ z2U8*+0jBCTdua4m`OMDN%&aSw-$lUd%dH=VY(baS+@%2k`2AbAC5!1oOU)Mm3{Z>j z%D#7wN@zya=pCtYO#oy>Oj9@991G)e708qog@{Upk zf0o&~9*~(!DWZTyg7%TWo|UqSPBf=ifRK?5haX~xbWw;V+uTXrzC&J4!GPqP@XU;q zw0`Kw`J$hbK)~;}C0=Y^f(>G_!JTNW)&@3>L-*cOO0EZzO*lrAPE=q`0At251Alfi z!AER;(qa<^H|Hew$A}u8)Ima_HEj>9G|NrpR#EgE)yjbR!b!;r%6gu_=;NnBx z3G7-twKdHF5K~!b&E~~Z{-dvsJ#ApiV&g-2uFV2~d%MVgm=y2JQ^^o`1>PI4rBt&n zOKfM%K6a2e`Zhp+ZB+GzdBj<09m`o&aWFogrO;g&lj=h88gN|B(s%HUW@YmfL_8U2*dz z6hoRbM*yIuxlxb3_qJpgV$@mPHpUVYrSlm0vDT_l{n^eKf5}~gbnOp3ttxsKLMb+8 z#WAK*Ls1(fz;0&#Dw`#SIGr@N$0%vkY}%zgrt{ zM)QGDlSR(%T=auTW45(5In@jpZoE69ge#ib`mdr*d+QEkUQNweXe(3Z+FF;hSp{sq z`7KpvA->!KyST)@D0`WZJqN~jI(*!uoJH=;AjF<6j3R3e!RR@^mcc@KBi1!akF!Ox z@Dr_cShf#mYaX3kz{}fC!FM(w=s3rj4pstz3+AMAduv~8Lep1 zod5%EHGleWzM-wCE5V6SQ$8Flgz2%&klIXYMF!4*L9LX9b->{+>|{%F$65eBefnSv zyI+s1$LzwjEW&bgGn3HvAW?!Xz?1LQM?L0wi%x6SQb*-`!#s@?KJXyYo&y&HPtRA| z_OKC=RK$XTd{fP%PgxOUH{^gtOkPgfKol@Rn2AM5(|d0O4;3hFk(HiEj<_hM<$J*B zw5)GC(B75ZkD$=wj$!QOrsV*%Wm6(7q-$bt;Q$g(-6<{L;RubOohi26rUk=I(U+wW zG{5j5B&kWr2xZc-^DSsulwsh<`Pi?*GGjKS1qIX*SR1Y1)c~w>VZkk^i@@YLe|i0D z6`Swj#0KNnM6(V~78h0?uE(ou17Okd@$Ux8RPx}d1fDm8X$un2==Bxc=hu8 zNnC4~Ip%%y$?16l!3hxF-rsqJ7c@S3!^kXb(ckuQxWH>74$KInB*THVo!V6LK*ogq zopWzTK5opNP$!I(!*slq)$1HZL!X@qB{;6`2hY`r0%WSHTL7>>^}=+R^t9R-fmV;q zO{!Em`!$3nye|w`ey!Dy#|(;)73{zIz}^dOt`vEMhY#D=Ik>A#$_ycsN?~C31~U&a zcW6SPlBua4dwCJu98ind25GXYV4}DI;$C*>HJMZ3!1`d)qZSOb%dTMs-l5g+I{-XO zUUn3i#-_1+$>}NF{0^iPU%Hy8V)QzQ7-;~VgY&3Lh^!sk5JcX53)lneMjrqNnR9(I zgSDVmDqBKZVd#E9dsgSoD1k<&p?F9zuX{;PSZAo{8i0hSE%aN01Rp+mYXD%rQ^*O> z9Yt!e0fE|l;1!ULa892obkSh$fm8#qxvl*7=@U-zvKh_HdN8s7-J!XXyBU46wiy-5 zH^63S(^hLhgZeDF8LeL!(UQf7wZH+Ethi|{X4A}A`Yjfs%`mvsUSl@f-IU@#6aYTA z-(X!gXVaTnN!Q`<52wq182J6{ZaUO<+Kj#ffR39}GXS_Vv!;|_!vQ!tr_*+p7=YyJ z>|7H)sgo!iAuxDj^!{Advk4tVeF4BN!(-O4x=;s#XBn=o4o?>;p~t=i5Z`RDOmBP1 zYB6BRy_N&OjSG6W2Vr#Hk_!OGmUFWJV9#0xP$nUkp~3n=tjgbwlOeA$pJ$ARCd8Zt z2WXi$&&=cpxKl*I%mRcj={_@Awm&tTY5<6HxL$)hytO~|Q(K_L8C+#>nLYNSu4^Y? znJkl^vqD(pj`~qZ9H0$2(`4CDRgzEkqx9PW@{Ja_NWg(csTAg z(qJ}%0#90|`5b@7eQ>W467Ikp1oWXiDqBE4wp!AO$y}oj? z3SUi&P^tQR#$a9RS=8O{)zh$CAbRXfqpM6JFzS@4oBXvPnuexw2p%D|X$7 zYWQ3jZErLq0utVjGyVW(ggzR^JAI1H0&L%*hr4 zR$%M*4|(Mn<4r{igFOBEhCCkR7;g%4830$UT$RHYi8|htovXoDzvfP!&AW>@4;^;X zi^BK|uR(x=3&Whc+zCSV}=$-ui6U%I!yMY>h=`|Vw}E3s3iCBB*|F1Ca(Gx2LkFdGf&DY z+?&5Sv$7*k9#rR!2dzVR02-%j{DiY9_NdFfg^sDw_?psO>HsPMXn3;kC(hT}gZQEr zSvLCMY|jSlfjjAp!r~T&Oj3Dkp*wjC2acM|aNs>9YBAka+ae-6pYB{PiYkvy)U-px z7V!ummW4Z|9adKFa<88%U)*pbU*H+zOYdG!RL*8@)Hwc%AYzyg@*OktO0crHGzd!XTKF3c*W65(ln+; z_!SIvF`3;TQqY{ua-@Z*A*eWgT*N+F797m}&W;=rPz7N8WEEZ6eFwVG!Gn%Z4Q~xq zIwOdAIW%B99H_?O==s_y5zNV<1J4``TFHHzW=ix(j{dPeEn0X*J2=wrmU7gWkFKas zRTTR*gX`ZK(K_c~#=6!gcc{U@`>bC3q0^)T8^mm^Q@;UUIu6z&a@p=CdGc#I$0+>@@knTVPRTelD3sn-Gg-cC`AGf>&J!eR!a>w>fJE zS11Q<^yRA~6!ubxxOl`X+RX2U(QLPE8>y8D;7pjc2W|~&z{+gg*<@Qf^63pG4LX+5 z6)cG7qOpq_u=V{sz>1M>h_gQ#&eDQwEF8~bZ6bM8@G!-;m6?@N4-e48hS?d{wn^-l z9G;q-1gDv}G#?U&?)O2VprS9+*q*wyb!3pj1sD7E0t=m3N!_}f>w5rt+|Kk@a&_Ze zqw3OxmtpjLBNsDv*P0GPrh}@}=6hza$=2c05zz!-iCgl!X&m^Jc2WMIs@bKS8|{F7DO!zmm>dk)(PsI^b;omMqc2iH)$b;mQR9aKD@F3MGjHS1!nk){q1k z9Uby;0y}IO#nBIfwsHGDj#i>KXIso1Sg|FYbQ=Kr^AVc|LV#@81q*%VYe{o51qLz? z+O~ll!GQ)+o;b$L2D|jeZRiF%MQ{PlF9y0B^;icTKr! zNO8iHs+TWNTzu1EJ-5BLDfNL1z)amOQ}WpxlSnDrfYf>nEM#-*Sv)|<;;acx+10?} zl*g6~NUKokxH#A<0n2Q*4c7-vVtJ0w1i))elYZO>y-iKn31ey`Zo$BU=u&N%;5Mwc zsTRvLrqZqkd_T0ivWY#^rvW=-n$x(e9hP^(jqNp}eHI>)1pM*VWd%k)(p-_0=v$NF z3!6d?+OQ}iJB!7_kj-Go=uQ5r!>797MiV9(Q3Fv5GdAz^v3B77Xs-A>a7I<}&M{!O z4Qnguv3x^Q$zH^207&jW(rY;Q)sER2*zyxfZBd46f(E0fF4+be;9zZb-hfQ*2?O_+ zJPUyNLIXtxWEncXR{MKZ+(|YDWZgyp?zK5sn|Vn#?3QH7a{=!P$4xw#rOXAKwkE7p zqKb}3*EgmI0c&iNhD#inqhD8b zL;V<}?Xq|?8CF>n)<~bM7zw~G1($T#t2&NSnnYQGcjC(;*W6+Y>d+PsAM%{IQdA2r zcmgFaaj7#8oUGpNLKgd~7sH)g1!QA`qe218kzLfIg{~b4h`8S89lQt#;YMSs)V`df zid-mD)UjqRdQOrgF2^x0buY~-hMOL$S7$+dy@agAY=kbIfQ$kj#w(XwvIt#TI@SP2 zLgvKp?4u6tQn8x38K2ByyLCLda#)2Td$_G*Lv?6PN(VrMmAMJ?&04}>mY>B9a3WH_1{pb?-)kvT!I7=kvSj15sQtvX z#nF03E7n8ZjD=}YLBfsRm7sKJ*EG$%TBhZ-%J1XZHk02TMP=aiPJCvY{Jg|Ge%j*- z$SCI_q|D3Gg_u?8rdta)M7IG^`oU|k%;$5&^z3+cPEfX#}3ng zmublDPRvcyQK})zErv#Y{&u@c>~iu@&BMN|N5b|s7XCQ&Y+=>dMed)`+raiU6D!q z1KV!+Af-dd!TsUkST?bMrLfiI&FmEZbog!^i9nn77Zm0F(KX2f9fVr zSv_^iW@oTq&Z+Ac*t6PhlDD{yEP?j7MpU{z+f)TTX^Z}k{ z!qYomp?SK z5U~>Tq7}@k7PW(20B|a&T4;bA}XN0g}HQjkVCx)&H@65bvHRL7ulE{mEAo z+_|LsK-OgTs;8`V4XVM10b|OvA=*r{24&$~zo9QmAOerR~HJt?t^0y`N_!56D$$%MV5> zjO8AM@bFHzP+`n%#Z^GIn50mqj-Q;E3rHMu$5@4dlmXIEkrANT;3zg({xd{Tm&SXI zQqb+?Q5bVK@mi{6602fD#o8Lioi)e5U?s1Nj zTMiy69*CL)=Kgm*C$qA1M)Kwn3fg_dfPH@Zog$U=G5@94V^y~1(nk@o&A_7bRk@yg zVYs3TcMtAHOh3MAhmZhy*>D9dR`}SUZ{WUXvVA_;DU=BruAnQ5SfEp1^)_4HJWN4L zd0T)??j9W^rw>!mx@ZBZ@Xy|BW8_|gfJyOC@MyDP(9~ZR&I|$}cbm-5WA^z*^7)|( zH_1gL(E!kQ*Yf24Y)h$;ylF554X9~5r)0{??itBmLlyqqi$j6cCma3q|Ko+M0!4lK zQ-OjS09=9HTbDN>ePE0-3HQW(W<5KNF{N!x13(PFxI7%4Qdb5?cy!;>- zTwpX%JUe93zXB7t7B^x6BQoOwnIcEOkOn18Vsycbm557cQ*3HT!p37 zNR-k?fYvNPr>)X;+VXy!sFQLPboQonqU_yN;Verz3LQBlS3LY(18yJItDdR+FqXzl z<<~h1YO^nb_J_{b{3IXlr5u}_Bi``hBO$k&?_Qz7M)JEDg()(odXF!P20s4vyc*rH zY(ZB6V;!RRPM5v2#Y1B}J%4LoFi5`Wuhh;mTWG!w#{AbL9j>PNxh$c%6^u=382^yH zKWil43nc|~ju_6`Mb_CN*g?3&rDsl7OU zXz+)#Gt26mf`dA3XwVf1X*+r95ukf*3I|L1 znSJ~4d+hHHoSFQvzar2gH+5hpzXruSDwK~m2B$5$EtM~(DjLa6`U_ro`Z_VW86;XL zh6{>jaI}Br6xC2`dc))YMLfE#JYJSmgFiPUbR{xBNQ5Y;O(kJ2*_|4VD0T zJ$ddPjE%3nGgU!*xswpOf^M_biT!|7!F~-$UA16NB7yCcV4OtJT2q(HW&IS?l3)qz zek`Fk#b$Cp5u5#hSbM?TGIC>3KjFq$z|QXx_n4G;n-U-8$)5b~eo}!>TLJeS7csbZwHfRQ()JzdlGy%Nj?2uscWjvY&K znf)H)*{KRUd0?_Ib^{FTn|NlkQi7daH(5bP)}KH#U;QUNxMp>Rrg0~WOELLjUqzri zrmsM41X2%9y!VJ)7SLBPN85VMN}NrZ^Cn55$6w|DOi~1zrwybF@}~A=YHdi}m>VD5 z<=&X+aY+i=pJ1mJ`_!$9+>@KkpE9f$k7>+6`3X1Nekql=m&^Mo3kqn|e)V3V(SSZe zBX0n&KfOv#u*>2XeWykHjqz;!X8KF6u0>j(#9ThZr#g~`+aVZ}9_r1IL*o>|@`ywQ z&G1WLq{o~V`f^b$fa@lT+Ibnk>!O|&%0;~u?fK+H#1rpsnql=0mV5UW_#JEy{&6C)-7L+J4;O3cNI)fkzehNEXjy}y9oWz6RTZv>T*Sjy9h-P+I#e< zU}EjvMX*NwEN0d_C_fAbwJ&!Tt1SAy)2d7Ms9%Vj-MJc*$xpw&Cy7$$Y98sgC1W}9 z-qNX>lg-wyt)W_uUF9~N#KM44>^-uL8*!>k5S&o%;pqiO<#q`on-Efz+U+$d=$%ll z4H#kgYrfFCqX45z@>+q)JooZCR@3B2+E94MguyZDSj~ZlZm+f?COhJ*@m}7o^;8N@ z`*;x?^q`Udn9juHeTQm^SFtZ|b~P)fbr4pfcYpo799?b9SviJ9|Jm`C&q>Ph_SL3Y z*1GPu37n(^qwvaOdNs+gTJ5Waug{aVT}h{9?W*at+Bf?+c{jXWwaf^87~BRjBSd}_ zCy-Ie*EJ_RuGqfkO~S|8(RNWJrhg2sw9r&RLwDv_Zj;de)h;pH%$O zwwmv?!mLxs$qU<7%P^xXw-%=bYyEWu*pq6RlY`7%kt-CI}a1G94(MB zx1P+{lTDFn6kRP~`CIoqC9|)#u4eX!GkyM$*@IhGGrQNH6=ejrP=ZkrtJY7wiTBPZ z!5h7Cq2<8m#Jf{ewW$9bc1rl}ORH+WYvuW14$IzXBxkk~ofUfI?it-I;?b;?;DHh& zhiUdjkA}$iS}N$`6~O^RCh_egZ=qe~f|eqiF=LnM+}TaKTeYkezZltx7X6Cm0*ohtebW0!^Y+IoEh958Ermb8!=of*cO5ji z{=TOn?;*@{b5nh=6M70SiE(ruaDBe^%zEl;o`;ELJ{Y(TjxU|T6_gi-DRlV4v@Q&~ zleS8v#(>n*P_t6mCeU#a9^!0kAp4TM)WqCWl($uAV*;Z?mb}PDd2}Sc0rVSwYT{Mu zaV$c`C#Amu+%f6kaOEB}KsNA$j}DK8hq?VAmV6`FVHXqD`+ae0g36Ac}uCkj0_f?Up#28vqUR|z~6!d7`xHd zbyhuA8gD1B2@+i!zTAx78E!^8^av6<42E{7u34`!)LsvU*HF9-($u6#j0J^)oge5R z74^Yp0LgItR6>#m2MWo@0epLf@piJ@El^mFZ`f>t-`pmt51I+7Il%t*iS>4r9~sGc zgEMmmU_{P{Dmu=uS@VmWTuf_Rm~t@)D+ zqb*TE+7avk9Pg52dx+E$NO_w)5IE-Dyd+=nS2UI{G!YCNf#eo{Hso=QEwYj_@_5_0 zK{y1Tx|lC(f0qpMZz2rBdpeupvN>h!ivW?azk%78i0In{hCa8Jyf8qx26rxp6Q126 ztzrX&e4J>Ha{fFZBmn1cX)aJf?_mX&WTd-}o_|F@4wLfo+I{n%qCd$`|tcqw${EN^i@HxY2V+SeQ- z>noAJ0i^BYlT+mzUJ5z@Plt29s%CFG%KhCH4deq}%1H2@)Ir!<+iNY3;C@CZ-kvD>n}X-FM*@>S^AX zZYZ8kK$e5#qetQzqGfadjW5R!tQ(}wPqaAseK$CJ4s;g>ipzlg?y9Dx{6O=po8XKe zhMY5#&n|dm#vSRIG|;adKSqI18{*hlK&!Hc2zXsrhkC= zt4nJODZ?Lh1uP3l{41s@V|C?)t z$E1OBuLcTwTd)Xp`)FV{QzebQt{({4=Z;R_B{y|c4CHF%1Eitn#c(|MHIggQz(Plb zrflLUn!7=OQ2%ADm)yodk-KW+@l(F5$uV|{RBjNKqL>=C78s{!+1XBnj~{84BtJrMAC8F68G?TQNtg9(#byQj z0q5MRUl@?S9A_Ia`}E;q0!=8TXf4a!%=AHYe`qAG;}qbrZ!d>hVxqN@Ep3E;__k_Y zpITXRdR;|V&JsThTk6#M`0Toh-W>1}(%}9-+8;1Gk~kz6mdPy_l2#$4mE7N299KL9 zWjwA$Xai-G{KrZd))DwEA7J-Lj(m2EcxP54`!X7;wCL(g&&-Rhs$CK=MKm%8@L|nPv-;ySY9-s43n`7EbhP{a zK?lKP;VK}#lG|w^dNojPSzn+uNJXq~o-~l(7{g=^F%kPF zT_AElHLo4N?m$V_(9#vez*n8v+hvQ-`%J;dLvJnKTb&6#^1u+zoYd%@9~@nM-)H00jK&=hnQ_bm8O$GGW{UaC=D9NjBM^C1e4GPhpBi#zt? zx`VveNTJIcg1+H*fkPxw?ek@sn1 zMF{aJxz&!;>sUy*MB27vYqzaN1iaJy;4fzzh&r_vcx^~pc9tDF=2Lp7wrpvjkR<$s z36(Pfk_~Ont;a2&5v%y-Ajj2!yV(sjU?o2(376vW=!EkpyU5=9kct_SXh2N?9Cu)6 zC~6TXn@A!#eE@vEszyuMUI)O3^u^+60N~u?xt)+nOFrxNf@01ZXD%aRkZhqZnwdWU z{&diBq+D1>^d5Mq{m95+2DDH9q+g#p;vl#t40Rvd?klOLUq`5hpY`5NiM=Xk*8m;L z^+cDQ0pN-`ec?ITJ%2e=Q=x8=m?u6>z>GwP;IkdgKILCH3ipMMp6KFG4Fjim8?FXW zYg@oKKe>6BvC8Y7azMG#R)%91Fv&b4e<1(t0iQP^Z+vg^+0oYqBO%A>DlB+vsRQ(- znKA3}B>;_6H_Oc7RN8{d561r~Xwsc$7iwhQF*liG+z~; zXTEVs?=<1IP(w#pfwvwnbcQL@{Kn1x>+1w<;p-+qIaK$bZ{*Zo zH5K$}?F^xX1q|<=__jC2eT|lgJIb4qu&{ztS+~r|%+CV-(P=G&fh_@J!T#nCmCDiq zI-1~DIAbU(GP|Zi!#W+lBWo4kCI(6IH8Xm&7LXR5&A}ejM=n-?ospVC+m^uH&GcNs z-$1_A5H7$B>v=_)lHd#2Mu_>9kJ_*c{n^=jVMU3V;++Xf11%K_?QR-t2DAMHP7;max4#mMTsIHec;K(V2epJiEDv*^-z`!Jlqc5`YT`7S zd9i5h-ysNZZOV*)g|EW^=fP?9jdF2KMR&g5;J$cOfVHo3y=f;aYQbZRuL@YJvTKS` z-wBX>65^JNIMVe4KEj=yv3&&kl-}~00c75*?+?k#5ioVa#YIbjNR#e>aaP;Vf@8=X zYlu0m2H=+-YW0}(Kokd1-H=yc%npnXK9CHmZQQX1aLmRV8fx7nnOtFFAlV2e86F>azkx8k`1yJ~~pChyh`v{%BZ7 zWF#eK4C>fV7h4aklMWEW!?U`vU-2$<{FFG?6^*cRpQvG z-#XH8(K*BcSM?3gV*ZY1{ie%SdVLGd|>X?gzYTFklBY@eO@AN9;2=Lmizh@^a`q!Ve`)c5YOh9o=`l-XSy$mqXj-l``Q#8H?cKEY*w`#MuU#V$o z0aUeH$C<(;4`g${l8RUhBh^iN1OFg%_>DSlbCAdatT7LE9XI0?RbPk#A8qJu*{2Wd zQ41+fOio-jueG}u0GJ_WQ5pQsznS2o24i=N^dDjLNu$@F=`Ohjj5N^NSqu4Fwo$Fc z<$}-}hVP6#>CDA1sZ!@=t`LJ*FwSc|DktA+vlpKzqp-?F_nckM;y%&I1-^mv*S&Qc zry0w-tHXRgkr#1bN~46;O1;$C&5sff1s>|2II%Jrrbr+g`H|2O_%$PLiHeUywSkTy ztKX;wPJJMXn?T`QbDJylW2DL^0NhA8Dl2t1`9L~5gU;#M-mM@Xs2bvQ{}i&vfjxK| z!TSD7-on#KJMF#Ad0-z@)?uOVHO#^?_`Gcm1Q`77fKzFH^P#FvFhI0ula`UsfASzy zplt!PBhEYbRAWUd?}UK@-^wUZIgl->(lTq4&rdZmzQ`XfSh3|ad?&ooh*?$nn8&3P zXFPIOBIrvYp`bb4OQS|5$pQU2$3t&v0w9|g7o&`oV%Wg9^v($ftWN#%RVk+ZmJ~xa zw@qswhw0}JHc4z<6{RC?U#)I!EmyH>Q}vfsf2YQC`M#FztE5wDw0!i}YfpHv3M=V_ zB_`VD*Z&*?{|8!!C#I*zqz&Nn8=qaFRk#pLExLJ)Cxllesf5{kV{B=Cq+&PTQ0m}( zns|OrO`g&b1GDl9_>97@nvoICsLI$s&6FA7`i3$<4S3DlIe0cF3(Lt#B(elShP~Cp z&fmYnoC`FEg^@R%p8<$GtAOXXZmHNQ1v01Cf0b)mrvC|mttBhbPT)H&Ek#H8oDnqE zf2heuyrR#TY+#_nfMehlVDa{=I><=pad!}uS%7fb%CUSD{Eb!!Rzpzzj=!!Q758`nIGk-|iR21BMOP}T{ z{yQK1)ztUy=NwRGys&HA9AMQoQDO7wl_F=cYgHSui{v@ zBYt74ET@rz7FV-nqj$Q32Ljo_JJf7-0^rD|+oO1@cDv`olI~FC>cYU4#{0(b`K^6N zS9&Jc-~uzdt$qzKHP}2YgF2h)HOXt5?+Z$V>*_4_HkCzu$DG#Wb}Fw5pKeiM!JC=3 zUG@#eO2ro6qD)6MPf6?6aE+$ic4aMYQIcWdJn(G!X{Z~tGsRNtHKhmq5C<$EsC&sx z()|+*oG4${?{8SWZ_;L=35>-0xmj?MbvNh&6npzylMUN&HAdbbH86k<2R$Bgg&l5? z!nn6dyML{iJbmG{HoI`0W_CLmY25tlZBQ=IA_jh&kC$rva9vrd^Y*oL!lMO$W^Yz^#J&}j(>gF;cFC-kx(TkL^s^eftgn{ArYWYRhei|B*DGL=d)hpXhE2w-X4pc}SX#Pa+VvX#L=uZ^}>c;aSWF_DxXNQ{Mn zBatJwD=Dn2?~1K;$$$86zWLUFUZ|8gcUfDifFnJ0F8;ioL6e#1AW|q(V#6*|Ott`P z+gJNcFj}OIn0UPH!03Wk@|f%B6K(NfB8qPMe#+sya*ArMu1Jv;@lIvY$phgSNr(DNGB zVSRG*a^UwFaaU0fOh6~$>Q=YMV|`49(mS=-=?aQV4vfG0{BJT$Sb9s;8CI@OO(SC#>+zR&K z7U90%D&K7y@QCLCteb~s1dWEn$xta(yu|1S-e~V&5YL~ux-{=YZ8J zvziJjQj3nmPe7m0k<=w3847VbSQmb+=+N;%6MszBa=1@GpKCUUA2e5w+6|JZ(w_p+ zq0dYX0&18v5Dpd)>qQ_u6Y*5*#EZhBanp$sbu^FA?YtYUh)lt^-;>_jR5@8 zIb!o)CsiDwR%jsz>G3BH&Uo=8pcc+;zHLngILcZFlo<^paD#;fh}I8$8Zqg*?gu>X zXBYmV#SB~SwC{5}@Y`URQS~{W#UfX+BN_78`WHSgG2-(LLlyWB_4BiV;l|Z^KT!+3 z8qr{H4pV)_E8Y(BTy-2_GY^x$h5=LWoDbVd4^!Wj0!XDvNuSukLyh@KUlJ5o&FAOW zD>Kj*CX|)(V(Fcjb+*7|#gmyXa%z#nQ)+jHBL1-jyshpsE={g1R5;>q?rU1C)+1ji zfS_v|w}(ouesXq^!pJWxDJR(zzr*Aw0%7Utozn7BV^dOclk;-hC+Fs;^CEdjI250H z+UL7Hl3j`vb?ud;@LRjdLohv;i?#PIpik>!TY_p>yQoCOHGBKkvl3wQ(=6x|BYR1!Ai61`Ot zxuJjM;ky`AbT!CpUCvyUWY(O_k&}rpo~&W=A?g4qB&q$bs6Jb@<)||LRR!sP|EdB; z#hYi^QJ@;s_?+rTi|TT!x@mCH0$Wl#q>Su960SmF82+!FA%@IZPf^C>|-`dWwH90Qp$c--b9_B#zlfK=(AdF#Icj zI|5-fl#3^cziN;VzR0_6fBiqgjQAfG(6_EjDmI0=p?9i3d$`P4{xKT3e;xy0T}C#h zQ48oR%8YLukVlSDG?8YDI=2!WXmol+Fg*hSs=Ai+ljaz|@1o7Q3OfHWDHy}&KeBeV z*d-jl6r7+DHBj}_BMs#DqZRd(v(;H(T!@7A_<_4_qw|9 zTV&T_6F9}5A@4y{5SP6Zn6#MvB^Z=(w`iWdXN3t)0ora(O2*9L#7L}Ev#E4=fU*>>HkEu;jvKBYW5pfNXtm!9#>9^ zIkLrc2K+cV+|R$*C9y-h)mii&LyJ+s6K8Kv_;=6v%YVO(XZLnlTEoZbG0B6H`O%O$ zuuztSHWTi5U<-HqN%%EB0+#{#v+@`1Shw9i(tD9|5>Om^^Z5s}-0dwb5rPWg-@?4A z#q8>?#?obhiPzHVzxwZH(|7qxdj#ef_}6`$$zp!zf;#uvWi9mPdYv!@-pk+-Qa0u!9mW2D0N|eAn%) zc#$!S-f7DQ?J(!eo&fjku%oKqowo;O=FDja<$Vb_wy{;MSayCpsht68CyvQ2U=Idc zvBIJ{ta6JE+q}Jwbl#4vAFBx$p<{nJfooI4y%Yq-P!=KRPGZiu_Y_4OGm<{ zdyA3eBibE2Q#qNqA%JDB6l3cDuNu3(cd{2Ws7B0ok|rzOq`}fRYqK+(>v8cTK~e3V zzgI%nYs5S^>cb$to5SaH7veIW0&^=)<+_<#HT;}bF*e_mo!jIl9q}hM!=T9tZ*=Al z{1yOWyGu4AFnB|on|EX`cSP|f$u1^wXhBq7vg*(7i~|HT^e)I7-ssdc*wGuY-wRPw ziM8HjCAkPrNr2cWsg*1E8AV9!+eTA~FPuQ#0R~^)JlGx@=r&TRD0ldcYn@r)--T^H z5G@&3vHmhq3pIeWTg}=m?1r(*$c5{zq#$7={zOZ_2;1f` zxrjJ&y|skr7%0~d2Ac-@G!^z(vrp?xrJrK32Mi{!?st_@0-L*!4y_hmMg&`Fwn(_!F!*P;xuFOqQ5UbJ zYJqL&jVaBe;I%WVuEC<$Qp3LmWVX(o-iLep-D*RoJH%8P4dF(ca^T;RLzcbCm&I#n zO}qiTB6ZHif)>{7-6{kA&=WHRNyfmx@y^*-xR2hg_TqVrKTub7_h$?@425i4O%o2W z&z74EQ3i_y;89LZgG>FDP-rn0+Hppc0sqh@|9D|Ms`EChtA;9d9xkUMg|VIO`K1U5 z>@1@)@F5IV-xkA3>NXQNf9T~mg7sfcJv8jR)a*JhZl_e%nq4R}Gw+f(kgwa3BAqa1 zXAa+az}KmYiJI)!GHRT%z%9+Tq@U&f`n61-9bQI`#BBN5ao#Fw+Ugb~i9Syb{7MIt zV>J9bbHRXhv}Q@mXfEJE$=q|RE;4Dl6}z~UBHa(Y5L>0ehAnlK_6gVEn>pLV_uar! z7iq5%F~x_v9+vS2(1Keri=}k3brmGFJ)iW1ohYM@M&&hd65CLwEj`;uYqOi`6aSQnUPhF%~#C(E<3TepKW5$8cI;#Oh3e>NP}{HC;lDbsX?KBLC>CTut6B zrbC((APVaea9p{P0O$YB3GCMSN`kAg9R#b+BJKY(llz9J)Z~>ziGUBZmGia`gtu

NfYq9{a#`3S`jn{%0RP^LvKMOr<=#{Pj(-h*selZUxZwQ@sn`yK!5bax zPEgKcO_geW#e8-I)0T~^H}(Hw>|dn8>JBrJ@DK+*Hxd3_b2ZROnOqXvw!oIx1P8GF zX~L5PHUeyaP@>He7f`456qtLROliXh(B^~lbeQP^I#am^X+CK})AnFqeLiqvK4tMX z$Th167f*}4m-yh|`BV}dAty?`T1LQ18pDN$Lfx5ou*U*k^*7D)<3Ma}uDUF2Non4D zD)KO);~BBi^a7n<3>o%cAs+Kc$a+X<^T$trsPwLwOFuSPYeF~pkl5zn=+Ra z{|Kr$5As_C?S6e$F;~mFU4C+|a$o;b9MD|>B#+F>@v!btqI{o23H=iWX0wyFP(W#5 z%N%ml2N;;uR=qP!_xdbl4oxpy0@951KXdPy&7mpV2Y??9W@JO}K`d^|dfXrQGqXBx z*X~l*O~@9R-kbyg$&TLJo2i@~2Jh7{+-jijtZ6IcC4LHHR<~GUIBs!-8L)l`oa=m#X@J2TegGGy~jUJfn|U;aR0b%1Cgx`I~gE1RVJO}%tRXOhN{*E8Fg3)sk7+Pu+>TGbbUBqPxzvqM?311x4u2^QtN0VKG`U()uOgZU<3d6I{hEBg}~e}iw@$hSy-emeOVe_X0gPR?mzyD2N0PAdRD=r^m~ z!V>uUOHIULr~}yH(?J{F;rcq8^1N38smi76Hh|WbJYo^g;tO3iW%Ov zcRrazV5>T?G+r(m1(W%~IEm}yIF(AtQ!r!G^fx<{Bxda96bgh4Be4T}{rvCZ5I07H z6;7cF-w6V-ZChbWvHAo^>7X@E{!uVc*&({I7_eiPCzG^I;F@PXcVVj!W$rBQ{`yC2KOtn5~*bll(9U z7?$HzCiZmH=a~YZ;xF5$ifJfde)IX$|*wV^tN!bCL~TH7>!b zgH~k%n>+r;Dyuuho-LlJC*j=%Vq5|iifb=i#nNHO+$I=t78p)Mz+Fo6)r^tVSs)fo z*$+To^Wfw;ycl87AB?ABr)>>xdvtt`s(pAjPJ_)JPt{5n)GDa6XR=6J_<2?sj2cg= zix(S)v=7t&&$f^CA?6ql3IW=q3|*P4Iv|j z>nL*WJ&w|&25=tf__K{Fk#W#^98IMUpi}gZ73zNrCXQYjOB(|0Bb{Qm9N@vmfyrZO z0?!7X_YAr$R4u)r7z-LprmP3=EL)rK6*O)pEf=S;H$X?b+!iKELFR1f81mV35E9%p znEz@L>;=Y9A9@*}XYXw*h0KbcCTeDspip z)$j{0&FSk6!1^W@_K5@>YzVuQg6XOQtx(uDIhDK{O;+` zxi$O+Iwd)=paU*EJX7BRG9 z3j8~5+Inr?#vqG|q5o|$xOs&`Eu?Rqi6RS5AeVMZ>A>?KtH74E8mcE@?M8O^qR8Tt z=~H-?X2cE^H0LE7JgSzEGb@s-nN>iA9aGcz!O9*2Xv_QyX!gaxz^p012Pijqw}u!= z-$h{_2JEj_J*}bKj~EUm{@ylzNbtWLcXhjbiUoW!WD`tJs81j+t@Z!lEng} z$tvTZu}Wxen6P4;40k1X;T0df@Mgv2KI( z*|mHNX>uQOZz$Zbw#zrHfS?3$*QS9E>prT#gyad4+~Gek2>pT6+$}k)!0>wPeIEVP zI^Jg6?7!*!ALGmNY@}AOY9W<3XuN*p^E+_*#?ATPWX7JeVxU{n-wA=*U&z&D4e})E z1vE^^Wiy!9_0^B1e=8he(b9>H#Wx$nZ2Tqco`qN z|HIj1#G0BL=HFi6^{3G8>!bM5b+TvsUFBaE{Af0| z`~8>ATbA@Su{@VERz9)k^sA@)yY{Fv;lumh3*7$=oF8dWwjruU{XPQ%CaHbT%GDWF zb-SaQ;ofU=zD7REW0zOXac%N^w(HHj6qYx$ZSTF~Zg#wtIVwlTeCJQgksi{VYoni^ ztx!Ddc1}yL^YtMueGZt9GMgM`;HEV_F>r87`v?3<7H8C&^mM%b^k z%VGLQmh@_Kz3IeTI@UG!zJIx^W#XNxSLR>2PFn$h1V~>@K*bLY;=J$C?cY7u9;%Ux4}yVjfARHg3B^(!(W1 zXNQrvN#ZyX%5Ccxrp<mrN zxYK}!63F@ac^(ljUNnkqulIQ{xftCHZ@1H^(HmN$qSqK2`oF+%HS|F1oNu{eLkN^Q0eb>LR zz;@9&Bw!)*s+7{W+`F(EB}a*bIHY@U`a?Qz324OEVf)*!lk4I2Wsh7(#7j$cB50ad zT7Tm1tZAdEm@@N?w)~k>e^6ip+IYu~L5tW^UYUAP!j+rPYRs|Mb==g?Af&^f!DaHO z422z8q!LfHo!i$w%{8t7P4l~zjE_D8AtLb+q@)Yb{f-JjH)bvckpSu~iCa#-d_N;p z<`T5%#T1C9IGxaDIWyP|jB7c;r9yWI=6|d??*oRa z7NpwS({9p|%7N$WoerpZRHm{bx?1x=G5t^3-CUW{36>?r zcv85#Ey4Kz1)Cjcf7*d|1z~&(_v$H7R;u>Zk$Q5BRU)M2VE)&ngRBJFD>_iVHlhMQ?okyyf25Gt%<6fEt-?RI|9JQj{rz#Sg6K&jHe2&dA z-$!*TG*9ZJH73yySx%djCq@YyqU*wFYuly|+n0UawJbb5e+k31o@EQDWgRbCUU?Dg z^=$TTIGN4R1#fyGxxZDMfl$eX7B97tT6uuMr*`F#@N@EwBh<~ZZC&$LO- zU7Pe8^B>$Rf8aIQck(u^GSoYFh4Ur0wU7IE)>63tpTYFx9_!oIzm1JeYXUJ4hVS_m zbMUYp3YGR|KR~f6y?G8SF+1xHW+yR|EQ0voYhCnES?GJ5dEe)G`wUG`icO0Wj73=G zcAIxIe|(v|KI?Dnh?gt9!9%8qEpnPSX!jVWO4Y>1e}Q#I1lF=RCS)PcU)j~<99BSW zaMz81{x4UrB+wt zrH16`royTiQjc$%v-$zeR#9)GMi74YuUJb~ z03{dOe`zXJc70arOPi>7$tk{TRo$kD;IX|bEOd8qa%%kFJIewF45`z;lm{Ewoo{Bo z`DWPfr|~-ObhsCSj6EO7RT4fVs~@7LZ-(as`ZH`8|LKa}!Ji2e5CT`THTZvk7$iq##2C~@)Yw)?~yIke|p@wv<9|XtL8PS)Yoh!c?j^$GU2{r z5hp89ziLd|NtcaReHm9|LMUzlzOk*@?fcIkZswLVE;g|xvFXwaB#`c8lG!*V6nzO$ ziQvR$Tsed)!9qLRxC7c&AbAo5WP*Sag5_w`3~SaHXX+h8CM9Mg?MBEffHD}Fj>vZd zf3tbpM$A>p=sq)s=`uC%uWv42B*vH=!c4aFP->ci|1CFJW=PJrP2^;9DmYqua*oQn z*mx}P9s<~-s))F|i&$&1g^1FQw*0#^_wK?IlS`G?Z=1;7^Jl*f3{aRtM*_)TD>X_lv$KoDKLF^eRnzgbbI%k zJHPyRad&~Y^+Z#t#R67t=qZ0~Tm9c{N*Bk@llil;nv~j=ca%ELwAaU!jp_;^U);>E zXSX*-1SNzS6ekHmbTWgl_j1g&oOtj||W7 zISSwd3I!b>&gu^B%isWF_pR#X*foKP{($MxnE&uoK)n7NOPFQP~3 zZZw1|4ThCgl(uic(Hq6UZ41A~f1`e1ss%PSirspAKxMzaNlVE$bZa^b=GaGkRj#() zKZ}AS)J^`+O)D^qQ`4Q}Q{UL-&wZwc)6UI*>dkupyda^rcHU{en!`8?_*5rTJY>oI z?~-_xjO*=NKNB#%jEd?D@D@LcDEufQA0%oyL>rRM)#?$U_?jF0=V#Kbe=_i@id>{jn8_dr&uqrn{}M_{lbaB6T5pWDP>4!it10>cRCRj;9V}*@U^1lD_ED44e*vt{OaG+qJE;snrXzMAHX*Xhl{{^20{ z2-ldNoJQyHGsg^8K*gISBtL)+J#UU_Oi)5%&e0jeQ~>jSc}PAP!`HC@)Z^lo07oMf zGZxHz`ROch=T;CYGfwpAwv) zc}^37Q;H^&B&A%iJP|>I-FNW%C5Dua=7fYAst{K_c#Z;Pe@COysN5ME%j)ULbgXoS zBm}Hcv}jQRVV%rPM_3qm)UW#y`r zcjgfcwld|>I%Tspi!2eaWf7QY^2KQQSR(DSQIDD2JF8UR`4aSSU^V zLpvvi`w<$nn#w{Sbmn4Jr=j931r!Xgf@&#r=r(t!xgwJmV~Xjb$!i5*>{40IVCE*> zcI}(Qf919K=eHkrW57*D(isG5OTS(*HqX*7NtCOOV8WMpF7LdyqopuMPo7v}j@w#W z;O59cYGgQ>)Ky9fm6eZk@TN_fUtU$fSv)Je?0%3!>7%}0oKMbPy`7wYI61vAuRye3 zVp)Pgl%zQ|g5G&9?K&hC4Qm|UGY#h{gE(2%e`3eHh`Igx;EeN9gl*V&+#df&cqf^< zCrd;AABKt*!8U-qxCYf|w4L-}_p|;N&bo)17mac2-J|>NxMx%u!=s^OCUDs4#dRF> zz<=JHi4s8;nahRY((s}LQd&IR-m=|XTB+2F2o`TL{rHh4p_Oq~h3 zfAKcnUyV>*Yr;Sfe7|3D4;B-!rKNo`{lH3E(+`ydd^!m6+%$)m%k}my6pH`7HWCYJ zpv%I-Fgvrew-36|gs7|p)ENglaplr|JXT-VS2vgJ6>6cLCoG0fCk&LJ?6?5F1``nC z@Q^;PN?josmOxqWM?i9+GD*425NU+-e?l+7ps3W7lev%*R#cQ)Hu6Z>e@|c$?ghv< zq1)0%)R_g^GduR`&nwsw+)@fobEml7f;3HerO+D3t#@L{ZvPQP|I#LNoJ1)#@pn_k)6>z}PIn(hxMn@{HH`{-pBf2WHu zPNLbg#iHpE7Kd-)C<$BCA9UyS+h`l|1D#h}Z`w!{e&<(AB{sITwSuABuEMfiLaYWg z4P79SR&`|!&KO4ZEuOJMw9S9-@dd|s68mYG^UXQmxy>2=`snSvUeCccVIDRJx(w`1 zuswJ8Bjw#d`%FUWe7e+@}1mYQFwY|MzCDuF(W3@5i&5cR^a=o@VLc#OsepL@t`U)kDZ@YOaTn_O%_jg1 z|46xbJ`FJ^s81bEd~9$Ul9D7O{>EjLKf*aiEc5KFOucl#a4pwg1)k^nf4n4eJx+mA zx*KdPY9KRkjA$3>dQ8_33@%DBB8g}8_4$r6`S0{RFwv;(S?(PX1th#heSM`afz~$x z``b|XE{&g0vK_Ik+nf`rE-+@&ZQzqkCgzVNpj=pTC!_q&Gf8x^WTmPoAC!`&Sx$7I z@KhTi%AT!~N{oEM1K+7(f8M5YOL)%zR*hL9wCUSnR`jP;WwlfqwSL7ubSU^F_Cst1 zgjGr;*@obX*!S_Hbl7>$h3WbP8#{DRfiO!!Qch8<%qLs2_o6~$P`wT}Md4J_*l$eJ zHm6W=8WgJT6VHMhBdI|F#J@)p56*d z!*5F!FO>=AVyQvPkfQFVUUhXqo7iH-l1RHVi}nlZyA=D#7ddgJj4bi4VNs+Rsfs;H zv?Wm}?z|+6g=R+*D1rCKME2$IYDp!(ej(3 zwpw2-Zq~6Z(VnCee|m~Ip(v~_)vGIge!W(g)7g4{s|v5@R?Tr!(rT`=QkK{Q<#F{_ zu0#>yD3yt4*L;<>fx%Z*^q_rR6fkb%RhW9mX*sV0Gf0ShoH?}nisj?lto@|lpu*h}TjcaqERw)l(O}WTeDKakp>`eb9%$1fKw1hrB z09&6iM|%M~jJC|8;>dnQkHO44qPl&|UCfv2Y`uVLSgBv9%PB15p#`rOp;2RbG&1Z_ z{ee1n?gP_9f36G$I!gkT3`(sT@H{ks{yYrLH~FDCyGg{O@v&xTf zAJJeqfG>`e81H=(Z1@Kyd`Bl}pnQmg5;`kA5TAO#e*mpiU2DQH6n*cn2u!qs!p8RI z=5WHMjDd)-2P+cewGE4DmXA&u{`aM=AJO?amZ$dS=A3iSy~+Kfh=k{HJOw2%0n{?n zkqMvT+3n5Ub?^!an&%k>s39euw>3ztV;f6D&Dd~_M-1}c z)n+3MekBUC>7I-dw;tWvm%t9xn5G5+@*4jyItkGej6x3b~SE#(-!Vb3~_t zWif?>8ig^-yjDtBSs0D7@i9VL9clI za+Z-3rAuZgh{G2Owv6)&I-;stcSS6@7Z)oae`$$_xPyH66yGi;9*_Ot+|h7DTgL8c z+M}XBu;#mGPN;II`~pe&+v?e{iS-D^70UohzkyOXwB0X6z(fybhlHe6X3hCarI*kj z_1aF51FH^oa*uf@P&<)mbK1c=IyfCRYe**HFu~FGMI&JiAD ze|KvrVQdKOo5acncWG+JUij3{e;7eWk87qwgNntiBh@e!h-LSf{;Z|Ty;Nt#6`BR##R zC;8#A%u9qMDZrG30*+mgy6j0E?{4pJe|GOsarqkWKH1B@XV3@SN@atlY>rd=vH#mq@+ zxso_ZsFKENM{O|DUiNsG9anhb`kTCoh0VEHZHE0gn)2f{c?u1FWW6$HVB0N!hIn+QNzS-E)C}S9o;CUb70a;-!Y~j9;QgK=qi%|B z6$AyXxH%U}8~@m&$t9+_B8cy~zwr~{Fwk&fTu~=60p)ZY5(N4lZ z5Pa`fY>eUBq$v`8q7ox`u>=(?XiTiRT-$|SXz%K^B@pr7ZK)9+-Iv=;e{N=WcCT;p zBsUDnGc0l*A$V05R;!`fUiPjof(dSfy!QehKP#azLs^azjMk`K!_X}VjNOfW#=rs6 zb)4=7Wvq0USEWi7kDc0pxQ1AQ87z5PAPfcr2!v!@YrZpsnKxte+u7KL79de7hz+FX z#o?;yFbgpzmJLCvE3_>5e=?vhj1mP0I-Nc=?u!J0=Xok3UJ4~4<2z6?-9d;TmeXNF3p7W|9Y>A>j@fB$={;P>tKqoz6e zP?*PU9;5vLt(R+W+AtJ`zvox@L#2Sk2)A__UAwh(ThZDTwbMRDLQZl3YsSfZLG7yk z_vJ=n}&uHW? z1783)42G8=0_;LIe`a5%@-xG5DHb9-^BAWaGa`H5+rHE7JEy(D`%V`e?0De;bZ~F> zZgA=ij28oiEl>_6E=p{mlYqmFJlz7D%Y~Q-K0xOPbB>=;BMy(6d1IpU3zQxIdp?O# zOGnMG{HK0*(6Q}rup;d1jcq@`Z$&sPfyvPV++X2j>^R+^f7{xdA)CAX2+LI_>vwWl zGwC+Ns_dNFHQ~GGrR#Zb2|7{4bb390m`+g}nO3_U{>->5xNC0t)|j;}IH9^}GE2m{ z%3bWJUVNL~;h?N;xydmL<0%F2CvZW0Cd^7NTaxHmFm);tjo|RP@p&~ZpShLG4k8jt z*!&JlcLDm`f1>yRdRQ`!36r*c>VgIonKC&zho=9KqIR8f{DQ4Y0ygi@z2fO#6>TvjnHVZYKX) zutcIwN|*Kt=0X#=p{(HUeP5@Y5_s{YY^7m!NaOn|f5`a0R(|pMNdk+?@K z0KO!wbjjTSuj2}=@-Nq!VzDVS2N~^)2&Uu@@Wv?mpuG+EP{7d%jsKgm{3SEaK`PFW zJ)*u)OdN(ohcK^^C2Ta25`Y?ObwL@mbok9h*`7*&zcw6hZ_dv40Sh~w8nktm9jL;# z;2_9apI*ACy|xfjl(tae3Jr&GU^8*?YP=eM0hg{84~7A?mo*m;JAdsPYfszA_B+2~ zc7--cZ%9~)Po>aiX{xefTLiSLD?ri2o+Q3Fw&k%C&~5+wJ!c;F*q+G)((RWU36VH+ zo^zfvCvV;+vt)0t|7wrCA~&;ulSvRV0{;`5W+a}Fvv{7woTWWjfs5K+hkOb`P6j?p z=QN7Qn~2J{@AR9V&woyFEx!JYQ$HYo#M5a&qnNz;Pj9T=zvC?QdtIC)Bg=`15O@<|wYEaJddG>L&g7Q|7PBq5{lY!R@ffV((98-BVTA}S$7HlrC? zQcnDUXK66bGvy55Rk`t>MK(y zq?}*GC@Bf%z{8wH87GunUSAy?cE!IV!L)}f=QNRTNGM>m8u7I+ACVIhfe3dEqIU+Z zcIViD?Dt8^rXUtT3+#+b$qEs8jmW_%_5F71`e{CiqbEr#0?u1qG8(-!(5iDwy)0PJjERk+N_ZgTgNZ)4D9svs>m&3soJn|msl<`i33TN3D&dw$1B|x^bG-n0L^GI3HHZWk4YeYg(wu-Jc#7T>fPbj~^P!)zh_oAE@Gjyp2#G=j z5zlDku}&AURTT%j4Nfu%Ql5cf#Sa1imq@nq2-k?u8g(C$_(96NEKZ-g!a{>g;(>(` znb0sCgUV1u;f8uM`z07^B8r7{lNgAQF$2PkOoIh(NS;oMKz~W_`vB(QRv^Nv+8=dk8X8C>X6Oazp#0dJ+&1hrq6Xc#!`GKvL3j} z2#h@)A(4?(UrYQO%~?8SE#>K>1r2i`YsGzBpjHAJ6e_Onmf!C5=9intUbogT95ytk zh*Tugv2%xPTb;kj>IWlmtzoqu<9;r)8|b#4nKpF_GC=0A<`mHmi&1iND(d9t#edwU zBxfp&u8}}TTPNo-%oL25QC$$gdKCLPApx{gHSQ&_mH!fxf~o6j5eNQCA))6fgcKx7 zl(tw>6Sy8fYG3QnD}zQIxNDFyVg+H4qSoTwuj*Xt-LCyBl@YLog}w+4Mie?l(H}sr z!tR1%l@CR@boMS`&~GxG3J6US2!Gp{CSWNn(VtW^0WAo}$BQ7&IdlR@NwzEjR~UQs zO)|~G5LT`x&|)wJ=`f^kI&Y!Pb0Q(6Y-t>4rhqjJqG%vhnkW$Yd&W>`luAEB>6)0H zV`=Suty;-(x1_5|6KnobP<3My_Nd_N-x)^Zs`->rHo)*DU7@4dw61ZWZ-1;cY#U!z z`+gz24p2MaRoT|EyI1)rH`|)o_hqksqV4zg@cy{Ek5C=5%vLMhO4$2b1$y5oOf~@m z(pA}x*YR$0=dz>?DX-k4b>_4QjSA3)@$yAXZ-S#K$_nf1JUdh$IYV`E0=3I%T_Ama z!0sE2$phJx1|dSV?(SOKhJW)Tajx{wg!62c#!F7_&LgPp1AmZCb3FeYK6)&{IR1k0 zFKWS^rhtCGFqwvlpqwHL*0 zOi_7vW6vNYgejx`6Df~uoO`&A#oeXf2KKEIF9Icel=dBH&ds-!^&9-5ad-%}vTed!%sU-F@ZuEJJv1jke9oJ&W_uFJ_zKhdcod2ca4fQS%{cKE}(_ z6rxe7v$xN+o_~PbHL%$g#72@0F3)mpH)`Am{eXHn6oXRrLB0bipE8}U_9*t4v4~4X z)xeU!G6#RdTT%0F_XV~wD3G)bgbphx7vRx?!ZKoyVCTHu!f!_tmU**Qhy3;%Mn^FJ z(SoM!APPp{!(vTOiP-9N$%pfco8i^y>)_)2{orOe`hVl|=ZoRsQ-{1Y#Uro9J+RY_ zL5HUP!G1vhT|A}|iUKu@uW>if#j)0jGpD92cVa@->q3*E!__8b-p1QyDT_W)lj(6T zLb+&nirBj{eylmFG9oyt2uHJ?XFkQ?-MRxOo`fS!byPsf8*8DOE@|O+!cEaGaI~&G z$Lbiz&VN|zh+RFwTBkM%V848~o~^Iyv2iBi_3IUL56uaLQ^`w*{L2Zwrq;_N>}XuT zw{?>Dwc=`XK%(@vz8LxvrO!3TO-(3|%IVEjMq{jVnvK;=e%ZiGUZ8rH>JV1eMzS}P zNlXlA0`7^s%QD(5nOjA86ZhEhq^u$8ibjW#X@B7c-l6znWBjfRfui+W2Ar+jj6#>H zHn3h-i!td!r;{M^Kfn_W(YR5RRhV3YpdITKlHh;Ubjzyv{{eWAy4Lll7)3=smmoGX zDlf2MAHr|6Cc$o^dPlwx@lW=|$PB1VB>k=oj2mu5U8}Wy==aN_NR?5QJ*u1r>oVq6 z;(ux$1KX<}z1(@Zx2i7u_Kj3{s7|r1<3vr=+3D7u+NfFT&9k!9vMgygV0w}jNHwz{ zvvk$sv88#|Iztl9ACuFpSzYBleOx8r*@YuQKC zw%a(dVPdwyyhx0d&|ckk-Pi zgp}d!q{Pt^bec;YS}4!{B&wzk3R;+#hoV=p> z9M;eKezOp*3ySeVx7S511~@bvC5BT@{c@)&^Yz{OP4j8>i8a|3j$)pjm4A0&brm(v z$Q`;_qYwLD);H0rtu2$e{#A#q@-kc~sk)C53~U$i#re5D9m5AzAFhgWXn0w}QqkKI zWvC5tdn!J;?OcNbyCX;FT7PMaKc_ngg9o;aK-IwMB3{Hz%kDVhLv`A!u>*F$tpW+d zR7XtM@1s@Q%n3O-6vYRKV}I_wzPxdHY{>+o-a(Am$S0aVS*X8$Rs=bGUIaP(krBkM zt>;D%^WKE_DmHAt!GY3Ua}CDD=zIi~UmPyjNTC`f;&x~q({_fN6|2#Tec$_D{GR#R zixd38cN|jueYB#je}D~ZC>w#+ksbvqq% z(SdV?Nvb5w_u?q5yZbmVF)7&Y;we)hpry&gD1y_**e_Ye}5qItR-BwGMs0-K%0r@v_F%o$gbu5hy<B(#`aS++W?^dEdSg?-I@?aM~O8dT?+6ErtP?$Q*k* zy}vH4Y&W}eT4iex{Gp-8j{Sm?5d)S4Tp&TY2pKZ%@cIg^KV3U@S+Ztof_%$pR8pG0 zEyiQZZ9#<~I<(HNkvqG}Se%&TZxMVn(sPj+aw_;s_J1oVI=@C~4Jcx4a4P~DdI%NIG)_b^65VtcBAG%dMw zy5WCcdVgW9tyOVLp|mIGe7Ba2?&5W97z~FXV(bB$sBo!P57FlO>So|RMqwNY;O-p4 z1o*9CC~=}kzcV2@CQMcyZw-%PA<&db;0dP2w}JGEIZ3bt)DaSM-LzK&<`)&Uq{Ksk zVxA-sLyLu%0V_{h?ge5Bx-PnGSnIMgUAc#Jb${fVh~7AZMb4g`%C;U%H-CNY4!T=` zoTuYforHr_ob7R)z$uj~ zmVZFKuaQQ*;ZMnobTIC0GFwbv-xe?T@2HQ=Jf`Cj9d>gxF3g(Y6mY420W`4E+i+O^ zL0yzrTB5ekqkV#;jTv)}x0ab5X(n>UML`pru<@w!A*;Ij{D5=VSo9BM0j8p4+ZjKt zl21zmF%ZS?`4l-6x)lUPPpyBjy;x8Xihs9-vdzx61Di}pCe$0r{%_V`E zyx*IbT;1A*6~bg1yv-EI`=DoGKBU)+^UJezMB0)Emrg)0<2EAW*=1;WAcQJ2@8x60 zYH?SVyOKn0OVD80%k)^i+Hq_cToKKPcOm1lju;d}E<4r%^J>Bl&3v#ehFOV97JtDg zMlw=YcEBfp0#_hfVh*mifoy$LEAoRgGG!NFYhc}KLq#5zkaWm`%b4~Fbt|FnAtev| zRGT{akwH_n!wdAMH}w{I-4-Xf1ye!BA7fR zkehRU_ax_6c4-+iLW8$L0>3WwyjYC!<@Drim`qSx^x%>y=v7!IXgoQg41bLnlezGo z-wBe-do-{=<4W5cG#K(c`Ke%Sdt(S(7HHTT<6&5b1d<@-J?ntzbxKZ|#i%+g=DCtQ zD~u$ChU+a4`1nu8TO(Yl6kNYFsW`SH_!rLbBon!ZieS^qA%mgHA?~3CCkPKIMWs^I zCFOx0YJJCFQfSKdXsP_*vVUH}FWQ1@_gXZ(n(`{+af?O2R#I!OrE>IHw`oQZ`<+&K zt&4ItBRl~35$n@)XQrXgM;l&djD<-Li5OV_;saMw(eSvOgA`WL(e9)4zd^ah^}nNR z*gKt+QE%EX5Xay1DGrI&i4+iMds>02?Ix9nO=zvAY0DJ3!GNV;M}PL2mQH;4Il*BG z3lwG^knQvTe!l#DgX?UOd7hw4rZbu_xHrouGryHD@A~h1(VbjoQZp4ju;t4B-ASQQ zQ7-Vx^OBTm4Y$&WsrTChJ2J&r6dAN_tmaZ&)mOP5izGFgubA60Pbp7eW<-KE9O5`B z5|{-2QX{OL3yO2wY=8M^2NFLfoPB9e#w!?I~4nlt>i74-L0D~3jiJ%VFe zm6UIYoe0PE52oZBTGboCa5x0g>lVMxl&uI{UN$84gX3u@QggI%V=?1`5ZD3B@_7RC1F|4?~{*` zX%G@Yn=F$Gfr>R0Xiz3}Q(RC1Be3&9mjr(uzNrxx1+-;$_uFT3pC+2oRI?_HwyWq@ zrcH|Wtwhe-v47j}8$N63vej2Bj5%2kS~*rt{{WtE%UW1vS9G|BK74>qe`}$-O4B`@ zQj<{0S~HmyZ#8Zlb6*^zd_cv;{LmYSwC#TaXFj>m@bg0dvYu%!V1w~3E8*poSVF>H z%2^YaMv7Iu*CYL*u;qDA#;^5`()A~BWG6O^|6w}NOn*XW@g3gA`vc`!TT|OO6n@XI zP&%P@m_VWJz9g9Lwv)*+!$5an_oZesj-!C5iR@ZRfZg)n_egde-RwBw(!H36FvmLg z?;IaVM<0@#q|qS34AUeCG5U2r8_lmj#&_=y-yis&;#m??ocb4dwt$~cF`+CCBEou& zMmP;9MSm+2ie||a&oE&W`E}(;|DF(r(+L>S_^W~73Hcjz{(0E{4SDFGrxH&ufq1AB z`#^lF5eIzbJDtc^zSoFnocL2le6zbNet(7lQ5KNBMUV=@?i=xwq|qW^7{NOhg{TES z5PF_muoPqjX&T(Sj^`ln7*RZ(bi2Zj4stvj@qb9AonCU9w(ztM#AB5<;0uqng#*6u zNLzWviA_%@wjbpzWUO#ja)|5Tes*M!1o23r^)s5XaF8uLR%qG6V`br4Mg*5?`w%l6 zGCW4DIKgSa;PCv$TGB#e#lSF+rA59^ClQ{_) z=zl@Op}<}`51Ct7)hX;~3#P0Z_!CW#+l(m1EDyJYx-SL)Rl6k2SK6p z5p)d^!h;TaFEO`9Ygk4Gizt&-Gl#`u5PAI?$SVWBf0tw%fn8QbfSSPH8ri%NdR78K zz9g_jo@$ntnFU(BN-a$TNZUA*L9e0*_&K77VHu<=TP5d;roa`m8=Rh(6rI$>a&=!0 zuCj29MKo+lR@UbU*S+L_f|a3=hgAL6=`5vess|P>Ici0HwMHVF3n4?4j}J595Go7m z!*IffF$~LfV&=taBOgS!x3LLEa98RSwtX zY!YyArZU`RiBWsZhNZJzGK@s{X3tr4AR!QQ=#IYA-X=3O(6+gMr5R$X>}@`cy;iV7 zUolm4wOqaL?9jTZJGLEx5{)bCr+bT;uHn*{aTW}9=R)j7@v8|)T|``_ll^gI!D#L{7klW7oQerOK+ zS!csqC~P>}M(*k$$|^geE17G?GKK3bCKg8f$68_hoZC}>q1H6nDxunhDj}j=6d(A2 zZj)>+G=&p@*|Zy_y^+YaZRg6~>aC|-A=)NeEhEX?a^pBUK!CGNVD{7A>F|I*P_@7+yL#W>%$OD#eMYf<4g+|^A72lI;|%$@{kvdDEE z^26y>mOtnU7aCn;+SfCryfv5K2oD{9_13-%TJ~ZKu1co2rdzMOmmrG6ZvAH`JAx!K zlQ|63DH+dm?B}u;WZA#o^7TNS!*r`V`^bU6{mt&VPK!%VLvt<%-+|JQi8a)f{8W35 zetTM~@%Q2`^^qF&OW9mwe#Kp=)TCLCP04&Z&A_0$Vuxp0Gvsp$%vnaK${JLETY&XI z7is9^15fSoO>lI(f8sQDwY|3yrELVm>xe}Qd_pD>iP*iaq&y(>HiC)N_(JIJhXKX% z7o%&mXIp^8&CF)LluYgBfuJpJe;^1qqA}FVq^@8#wsCm{1WLt=BLeT%OgkW0` z3~GYlS@ZNFEu~&KY69Y=8^w=*iN@JKp*&u~^@sdJ|IqjwjgK)4!Y~kp_xy?s4s}y> zt034#!9gf)0g36^2AW(*E>#i#yK#_$wCD|Y-0{8lxYgPMEhabOlKhpAJzRyRa6eXDDD8leZk=z!$&)LI=*{|p8%Ph$= zhUxk%PVU6N%PeJ_B9ijOXcWbWF}NyXPTF-KNgm?_r<}q1xnSDYFDb`#E0~P_8-e)b zG~+npcmw085n>B_FQ=IE$FH1{bmwd`|FXdQr${4C?y$2LXZM(Ye$I+?<7^dqZf+H~ zF^OQSpt2NhZc3s>#6v_WdNi0%jeB7QYaxjz3aQjse#jQWbtLZKp?-J*OZa7?$;l7j z)9fBnd=Kj{=^cv6<`dl&(gVLgL^zk6!r-c4Tq^37r!1FJ^$!4eZ6ASbXPu5nB);Cf5s|C5V#<#qr}=Fj+JP zJ2c3tjz{C&o-s&2Mh_9K7MM!@Sjng|??f+!i!{^|0x~BHaMGzt5S zup!8k<1izU@Fd3JI1_ zZEP@_e4Z}V^ttloI#uy?v_c(}Oj=H?X}bG^g<<}Gw>F@J#<=3t!%|sYL{>6)!s+Zc z#$CS1@?6oMhVJEFLxiltQpfsO-rVqPm|zJ9Cn5vVB98kxvQBnmv&p}0pJ_x@Eo?2& z?hIEcR(m=4DNAWnjr>IrR0V{mCkUosj)$WBUIzow@n@HHAOBBe-L6=p9uhmD#aW zjL>8|dA*{KtlhTL*s82;@w!qrCXDw1%1YOuxRaUpnMfLD)>F+p zEn!;2NlxiZX_a9ERB=ejorpLm5Pdcsib`L9G@h82vMN!Gx7>Pyag-e=nC|fAvcDWU zq2X(X^7$GG^S*?cbJcfMZGpcsV5PVD2;HoJtp0( zHx;L+rPa&=D_2WOZ+3}-b8abBIX9X{Lq~Jrq#=4Pew7ac7lF1os}@&53p*QtooTRt zvj%oqAt=HovsMR(S}ARFt5$7tYI!yUJ=39Wers0T3du^*seB`%YGb`z-aLg5oinQ$ z-Tui{PpTu!x)}oDT4mUc%Dpo2L$9N!U8a~q1;Iq0!=A&^2DXq3C8ea8>UN${z3WlW zUpdscqp0-Tt|W5YlY!Yxyj9~UK2f1<%NJ|#bbaJp<3Z2|Nf$u~bCTM*?1`)%UgcXN zMDe#Qbaa~5B(3*vawxx0L-{iB)|}T_XIKN>E*=e9oAzn2R2p3LYVbnu*qL+%7#&9c z1DF2c4qSgH$FujrDhy&8%|6l9J&n!|4$^qX9C-HQBywCo5x)N7Cp20Dg0uY~d~lM* z-A|rZ4($sd^%D2VtHp&2&xvF5nMSc2_!mwDD-OOL5cq_Vd+#Ka#EFx*3({EyH}2A< z(MNhq*JMJB%fZ+Fm2KLmCQO-obTg-kvzc!`zTba1UU=thoK1*~ZbEMpS|&`q9KeFv z?51lSbuHVnO*U{t?=9On(;`L4uIDB$jSIXPHbBD=a$Eo;2a(P_Seijtrv4%U)<}rF zeagT+nw@*jvc=YLj`5R^1EN_N(c7;P4L#Ul)A;s>LASGYjUF-JU$OqISn4i`IRn9h z*b9H~Fc~Q88y1;NCghlGHpJ*7t?YRgr*l{!%3Jn9aI_Bg^J|AhAi{1rM|&!2;G8EQzs0x(ZQj?A_(~YHu=C zAVU=hPBL&;xqOO=Om1^&P+lxj!C;(KUT=R@OiXojsN}&WR2;}oT+w0=m>=KQ0xZAf zles-)3${%*;0Mvl@!bE4c92`xqhblg8?*&cRmvr2GBM&JV3u)hGk(aa@KQsoN~B;G zon`8Ip9{)wBC z7GHI{7U_1K82%H6I$OcN6y~T;I}WYxqiH~dR*VzCdBA(!`|zy1>Xi3upwOQ zzc$4iy%N!QH?cHEPdtz!28@otZQ4Y51h--gj$t=6lgHJ`>6VU=bPe)6EB*sw~pBAWp?0qy~kJ2&o6={j`$ z8zC?%G-#A26I7QBnfA;)9(gpcQRe70K&fPvQj>*RG$XwLt4vihFcm|s)SA44IXJSd zJY8=Y9g^r#M{E(`Z_wVk^oxJ7cah@*!ZJ%zH?@*ym%yrydA4-GCU+@Lxq6rGY{>#C z0?dC|FKEazm5u^mm!@^-8j7tCG>)BHilIl?997PQr2{N-u<`$-K|+Q2$r&LSZhc}9N=pZGkiaWTCV ze{qmT3tG!&5BJSYh#M1!%$dRx>@|?bASLl#ka{;z$kL^|##s+;az~hE>MSj}i-HH@ z(+4v9rw=}eE)sh4+3`|Z=$UE!;@<;dH#vTSIf;LpF(T%)$Os!0`L>#}ZB`clJzder zUHpX1UogVW4(ChGvUPuHihXgO5jHhhRsh+7b;R=nR&oy3mfbJi28Y}bzjEu$-Jg-G z7p4Rdx^!~P)^M|LRbJ$t26s*=CfIfsl?0p8WVKnOM}~o2#xy)^F4tdC(2Qv{N z!gc}PkX-#ThzP`Gcr!eMI8M$XQGxQJNz=Mb_^Ci;n4jWsT2R!u@Ku3HN^Mx_;U0i7P zPsm~`bUvBJ)6)egD5iZm@?M^*pXqS*rx2Acn7jJKk{(lWUYaJP%u41nv$FuAKwZCu zI;UANjuv@OizZ%w39!CVQ&pusdo?*mD9+xREt`6K6J;3Wu+k#8h3^pXj||mGW)ntN zY-wKIYi+6M3V+Bt9;F;cvKh6M3I<*-nYUM6dsBYJWE6v~RUGF0277dG*(|@qjE^UJ zN9}QI&rLATs1DY21~QA_;buSYA{d4-onU@;JYauVvSKxVx|UyoRy`Xv^$p@YM=Z_- z%N(2)9j26Sw;tSmgqF2pi&M**jsHHi#TK*N$Wu38lj>KR9pVb(`?RhHjh|L^<$G4D z`a!~7VNqWS>dqJto`L*RHdqv;K}aJffwJS(_bF7-SObSqFb8{oBrEE`nj|22K8^MD ztM9Lh1-tuyU{XzjE!rP`sJbKGs)bQ@Y$J_p-3>_6O?dHiq6^X*#A7|;aSh_}PQ>Gu zh(~(FqZ-7corp(m(-L9LuxXphdb3!<>dqpH$--N?(OHLstP@h>&wN7{J8 z$gj*TE6bf-zN*_VBGadIiQOEv+(t&EX6RGK2#1eS3)L*n zoGNxJqv}DqBKQ5-0q;A=gm3mvMwM_O5GkX%b8qi1N(Gy(oV7XZ2};)o+B9nvo>z|V zhN%ZxUG^$Z5;L*)s<@D4O-F&jPs8vzSU)#<6EMNA@9w!&5Miw3x>=n0LF{r+7TsJ*(MmIT@%Kp}mVv zTkFn7dT%x=o!P!Z{M}joR?g}vjwk&8bUNBBTS}#iN1jsWcNSW^quf}Gu052q zRx@8v>zM-;=|=ZgsV!fwkX0<@rOMbw57T>pPFrt%oyfj8Uq-=ds?8ZJ((RKj&Pjrr z8T+Lb$nU48grqmxko2dTkfg`*YlBjG^oSBOl>0F+6naqXDnl}ICK+Wh)4ONHYnHREq;HdyP3bUT#<%04lF z0M8X;C(S{&-k0MV*3~M`eT>TOtK%#2X;^t0Ri4IL2KN`qe$Kt1zelv&Z<8S?(Wt@W zKkGj1*oK$Oe9ZId=5Vr^PVCJ&{F_W{iyeEKgCqIau)#0tFGcA`ncVJMDE~;e&E=J) zx(=Y`22+LqJT))TuwN)}A5t5t+fc55-j5Y=9P=MS)SM&M8CoGr*81$wryWBw%7ak4 zifW${W1`V&mdn6wcE~ZA80ZVjXZDzTI^~#yIZobauKRHcmvqD7Nkz`(l|}`ZPCJSc z{5&hRfo?3lAu8q1P1!gRWj~lTUc}Dp)$Mzli9HvO~UOeC1%Mf@DcP4KADBC%oB>z3zTry=2AQ1HKmu zE=`6|?N%e+x&jrEPJ~`N^EU;5-8+GIC&KI+Zzj$^uQ#ooMCTunOK~z#>r67fv=?ad zPi9_NcR%rliALAtyN1K;jv=b5Q12^aW6jvfRiiR0H_V^ur&sZV%Y1W$i**6OOU?f6zY{6{1!?} z#)YRU4Naw{Ncyh^0rhzEUG>=F>s?s2yZ6W#t za>g*11cXV+o?XxHtO3D7EWtEUBuSlfGZ<9Q_ox%*iBZX96&T!fVjydw9&)7Jc7I!( zG4^Eg@MCrVlLS*jgMbdn*&ttkS0Hy6Vcgdk7ZLeb6PaFwQ4^V7MC5x7(hI2f507&u zS$gDh5hm#F-sE*5BF!^FQnP|*`P;6w+0-UDB>gN0$#f?16>AkX@hSrKlAFWV#8r^2 zCzHdz2KB~zR+>4dX{5K{VpT6Cg@2MIMn!nalPm_84$T)Ae6<1X(wHk#wQ6Qn)bsFn zEeqJIX3p-2R`0msDIE#Akis5#G_4c_7{% zid@?a{o?_-QqcD7x?<)n=F&Tz9}8l02OSBp2XWi}7E{Z^S9%%Lb}Iv7ynl7+UhgLE z_Dd8b^j`LHT2G3Ut_k&bKD9L>kl=lN!r$uff3&(pZ??dqReN-BYd&69J56IsuCDL_ z<%m|1g(^an&Z-#?$!+8A&e=JC0o7YcbK5o)zWZ0eGoDb6ajJ_Y63h4Yhxg#~7n{{)Z!h$2aI*1yjDF8< z=Gpbj==Ryk^U3U0bhC*P9M3NB%@)UJdwW^ZFoygNlQi~%FcrR@b)EP&OmVy<$Xc%O zhnM=RU)Jl+5ZD6mq7ZjqAzP<`INM))NrD(fTW_80{kwfGTxOx422qIoHTL4sAsdp@NWb+;6`YEc6DD-j8`NP8sTQwAhQ@s}^Q8CT@D1Rdx!W3OPVRnP#z;~_= z(Z1`VVzj=SIJ7lCmr;y~Wuj&n$V({q7xI_4VOGWKG- z5s^+1ULQiD05&|H60uyQUYw3{)>iWiqQoH&0`E<@s0YUebcUw*3xnwAF){HKP6##! z-}>upfr%PWP=6pL;PBQ8X<-@SMl7YVu@Pv}@YVwCqSy_63fT;MVaHs)aA`pOwLp(5 zwUK${ZF6j#0ZHEg?ez}Kb1)uzLxo`$|K<-G)ceo^1oJ+`>^g>rI2N^kn21hvjA%&_ zz>B|UnhjV-OP?^s^HYKLoqwjg`~5RQSyTp161Fj`Q-cbL zq=>m&`7}|_ChYynOWx%YFRYjhQ#D%)S(>W2#I2v8M~{GLE~NkyIXQ8~_}{?Qg4EN~ zWgOl7jpK+cV7+6WZ*<#_&>gJ*jFKP?XjoVVVUXVG$%)A8%PYc08y3i+%ODQLZ6Zvh zqi&vsZ-2gIp5TK)dD9Px@ie}Z*Atfe6Y`LYYUO)IXhG+EF#U0K1O?@CvXS_M;Ob19 zR;6fC^2fft-%ve|VlF&-j3+WDXpV@!6^I}#3{Qw})3?o-=wbk_CTt&xcOzbjLz6ZW zMXZda@N0*vBu^a^eFeZmcDfGaOH5!pF`pAUn15m&MuURNMq;)K@pEr{W7?oyY!yO_ zv+p`%=u{#Lv<5732x$;z7#^XMqCaVpE(x0^#>*!∨bUw{(U!k^w;3a>|Z3C$*?l zcik@u10d)rm_!uh#%lpWe4H5k7R<61QKI;mbr{xG(4HZ8+2~Z6pSO0BuA@(=2_vr2 zseks=3(iII?AD5bUf za$5fU9Z*W^#X3N?gXBm8+_qLSC>qxSO@Bi%yR%A`wOPv?q?=wUUSY=U@)I$HYs_6l z&osuD@)uSJpuR+rleKrL)sOmY~JLYC7C88e6G5}_<(t;f+J(8=X)`R;;t5hLG*J%20i zV!*{(+8f?kdG_ElzC$kPIOH6Kw`#%L8kckxJu|5p+qwX&iKk}qwrrQLzzBR-p$#Sl zVtPp$ZQh5!262*p^wz;bD6esyhx%0C?cNB#`BPN)Xh+gIEEc3R@e2wxjs3mm!wFfV z$~Y)+>lMB5?ls;@=ScO!%y+xlVnGyuMqV+JrM>dFBH3bG;5o?7Xlo=%w)hL;Z`N2b z6e|z#U0O=%DvrM9LEx_t-)^v<;svqP48OVc@rHVck@I1f2=)#m6OK~kpeJZXqQED1 zVNhZZdE-2Bmp=9mM}KvY{KKNc76a|7dBp{5PZLJW(P#}Njb$Z^*=g2zh@D#;So47e zJDSH!#8t=YGNTNNw)99JMNf}a$)aoF767Za@!CLM1k2?}KsE+OTOS^3@ej>xj(pdA z*7oJchHe}8EA(_StRjT}uPv(=)B8xfkCy!q_R+<%m8B(D1AknLvm&nvZg1b&r5Ig< zCkulw8KiQCtH@G3u0L@DiL4UNCs%4pTjGE-n|Vb4KcOM*kP{hd8bch3}Mmumov#=f-)CZJ+ z;c%hC0yRMS@I1D#SC_eR<^}M=ZXl~xICpfUh{ELT)rrT)bu!FPuAFw-W>*C^ zbwQ?skV{5&ZS#~osx)wn%7-RPP{gMv<3KN{hT?O3f{i*O?xhv}nP&m|Am>ex_vRLZ9*FB+`IZ7#-jk#B9oA=&`d zsLD!|d^5@BWZXy{FIe(qjGlAbTHx)m=HBbW9)BAl95mY%Q=uGTlVjP3Z$=5W*VgJD zrkV~VnT_l+ic8}o)Xgk!G?mPB4b0SzD|waAw7W%m)yo{^RXGJk`yIG{JY=s$>MlKC z4~17YtvGVNQ;u}97twR=lnF*J@!%}zer@R78Jmso&~E7xdv_SqS{OfWhjB>B_u!t} zz<<6T`cc31UYgJag09tv2v$5(p zk;kT`75}}C<2cU80#bWwF5vjhn>RBr^X`3-7D2#qMxekkL7!CitX|gn&o}e8v)z53 z6*&;G+mP%?#4-pJT*2rw2PrV+()+s%Vt7K?Vau?H@nA&gee$q%%<+^}zcNH|_P+OzxDqaDiD1b>bS zkss;dRsn+(3-6-nZqms-UGZFGn9*Ov^>IA*6PK_FF2SkW@jRw63V0=mPg>yG>t*}V`&%H@rXoVj!Qyv4{)PJ~K$Zp5FJ+fIUUn&#fHK%%Af9bd66#q17xklPq z+l$1dRYPfYn-5eFgZRJpg!`Hg8f&Wdd6Qfa9H)(=0bxL+@8pD{6>4nWF3=;jiU)SU zz#3Wp1FP2*6{Cxl=LmBwWxiZECut zrrzlTV1H+g%I01(rDxvKmQ<3g=f#T04B44@YoOctem^wWT45Dg?~HTs2dz`VO2a@9 zz3*3y5NHY&jCyL43X0&(Lw|eBWxGt8K(f2e?5ZIBcefEslwwWDTy|!eH}CCRCcCqh z6++7v*-C}*#-_O6oWYQ#o8F3;0g2=N9O}SjE zjs*L_*=p8DryX$rPX*8P_~K==F%wD2hiYk%c{(eyvGf!BkPY?$r=-sZ(`(}~MUND*gT59@*upl}=S_i>fYb6^~~A`B}+)0fi%v zN6Yr&6J1eDkDD+MzPDx%4`l*>mdQ@TFc60Cc?utpN+m=pDVd$~gq@fQm_>I;3|-7U27&WBY~N{-aK((AmpP2XQ!x$5(Q8ba;H= zx)tLU!fD#3BQ%++#FY@0$!&$cU1c-|G0w#Jk!pVejc|*34WY^6AZ0?k?v;#1usO9% zw6i>8YSlMDSKTe}9iah#Kd29_3i)v{t|;5bOU_%Z%wLms^*l)d?F(9VF|R1*nzgHD z*`ZM-*$z)B-xOQwjUcO!wi-&a(=Bf|W#sBcfa1&@QdFCBmXcQB?qSNr-N1EU;45Yb zAqd@{fd84jFnK3ume);6%wB~&XzJ}e*V{VJ#*XS{ra`3BzK!`v2TSj(e;74NbLv{y z78t`xRP5+lT8-3{J4BX#67{4aXzIN%R`0(c*aD+3lZEhgvMOt7mDH5`1{g9?9&f)< zWwdZle$~DKx8WcTasrod7Y}uR z3Is+vwuS08l5%3K`R_ZVXi1hSMQ*aDMg3se5_xXlcMi#;-(RQmwAYJi1U#i4kUz8N zCYzlncfTC{`pUUTqBP;ahP__Kn;tr6nMlHf`p!j2IsXfP$r&vZ-b1v1z{@9KJV@dz z%9ILE&L(eTE@&8nub=YXzdeGV!@WIqeUow;M*9oO)Ze{BbxB#UpaKZa6@f=~f|Zn^ z@v%qaKR|qf*iRTAK1TleGM7S52xW{e?Y>bQ1Cgfn@EFbiL#K09(%{ZyaGRMiu zX<6!zzTR7 z$<^$?(TITzsTXEGj9@W_f3ko<1hJ5L{;9fN6pyfuRYVLc$;pyM;Dg^fx4>K*JEpNL&Q%-x6`=)Nwe0=Vhzf5GCL>yd z*sk$u8T#Up6h+TO5NFUtB^7O^+%T2E?Gt5Ur5I?jboBs#%WRj{nb)7M65HmHG`U=z zT(}E3^2MTIKsj)0&`D*R-Q{Ym)-zk*?k0Fr7}A{LEnYB4L);nq&+kTI$yfQY%ERaP zqp+mik5#b^qBKl=uq|2PrS-Ws~Xn)Q?`8w$xKRX{b6H!8i-U4nS|I@q2>*N)^kWl?0tu zp#Osl&1=;2Q(_ELU=Vxo)6s#gJpYDFsObEjNT9*IqGJA|(?G+q4H5JpH%0g53Ho(M zFxTgi;~G`I6|9eFjf|5-Xx*F5t3n-aqfB^j9-+#AsJ)V0N8u})Ki*P$JEDSaSosFe z|G{hq%mv00W?SW0lEmRs+r|+CAk%2p zaF>E74#-Ci(uT7zEX+_~0QL3kl@|1VC7;V|Q8%dWyCRVYE(IJ<@i<*sgj-AxI6uJc zqI2ngetds9c1M?2lOylVk8|8ivb7eJhkduV*(*YtCMu&v9hI|Q5W$<)T+W-W7nEu z6Z?(IQ_5)6K{o@*3VTNqrmoo#E;Vl0IHIY4!`(GL>z#9B19c-lCR(ob?CU%;jghCc z2*f<`i!s!^`gD^+r)rLDa*W$u7^Q2Te`?H^nz8kt9lb~cN&Dai!A++#lq8n z@u*jgCp1geDcv9?9kp+I(!}PHEW5kJ!HSACwLyubq2tK!L#(gr#Y#TDsKMpqCimsX zl=@{{b90pvVu*OVApDn+gld>uQ9Wy6B>V3i7Y3=ZeGq1o z=`_=Y$jc-}t+bg2CQ974d13OZ>M&fs_-b9V54Bj^ZsRr(efL+efPuAv_@T{z7ATV1 zh1X5G0X9vrS!^HbB2c8UO++RIUc51i{Ci1CN=S*aNT=%uOR_l^&YU?j;;+9In_@7? zAk7m7Xv77>skj&W0{HaD@%exxTi`{K0=oYww-0jtfj*__Pp7}UPfy|W=l9DivVv4# zO3nuZ$pNh-F^>qIikxO}Zhq~56JE|Al<6cDUx15Cri^~0>~ZNl&9kHszycL6C|TjP zWJ&ueTmz>$)Yls+3Mm3*FLpr0a$XcUPL0irCrG8f`77ax=xoG(91qWn;QV1bidLzYMF>wuo}r{nb0QPPSq zSx2e*44g`qg38&JvVC>=gts`n0NqMn(4ETF8eVSVu;VH#^Tg*_hV{Qmu9L@)Ql)~n z!%Db{x{A^b$@e#fUV5BZM(63`NwHd`?GooEdMm6vMv8DbM;By`2@L)nAoVF2-X#Li z@-5_shN*cxk5m~>z-XA%OdMw-3=w(*4T!{<3F1pMgeHN;S?R4>G{l}tjx%zw4$*My zm*4*cCx4NCHe0XGW2+m#rLuY$2n|IaMH%bzK@Bgj^W6Qt-o9Wm6{G)!p-#RJD}|^% zl8Hi8AICl+nvY_f5XCVp6QVDQS&rCw44VY`8^9nTdO}zu%AWwHh)4Td*Euzy4vb)-eSjolJy7m1eYYSxyZQwUnd z(|_&dE%Z-2JF7>`Mfdbzx3t9_5Kq00&`q0#)v33~IU#65a@yIxEU_L)X(d5D>Dk+v zz`R?-XpGL#j^fM@P$r2*nRgOviI%5oRZTB*HKy-5=JqPV_Lk?ciOi-h!@3rjHmX>lHKI4YGxLSL)T^pupPyGcs>4 zc}El)r8k*n)%}RTx8Ua4b8Ipi+YZ^dsOF^?V0csR2MJ!Gk;7z@8Q)NuXLpaduv@LN z?%%r;vdJu`Yb{!+N_EB0{lX5-RRF5zk$;OP>=9)kBqPmG7^S$e>#Bj8I_uy-1N~+Q zDtvnD(n5<`X7BNKQ&el_j3s*)R*lfsTXd4Dlkr2>CY1C1PNw>HCG&PV#D>ujto0t> zoSm&0-B!!yB&!C^QI}&UjZW7>X>h(jCj0|H-6Is@yJKPMdb>?X_6ZX(p+2;>M1Q9f zY+rLz@YOfvAb8k%t+8YG9hKRK7*(W+zH3xz33;@v&Xz~-(7TiJ(3-5rO^|ikc-ek8 zZM1tpM{lW{vQ=BH7O!0?Guf;!vlR4+lSR&MVOi&r+?zMwR8ST3i*vTZvY$fc^jONu z4%8Q#mO~whvgov)`>=X>Oh^iJ6_?Wn{Os3r`4w)E(^wjdo%Ld)+DZ~QlF!bkd~qupQZIkDpn}= z1&`*Qzze$`5I<3wfqQ9$a|Kh{3InqLfGccT{Tu591bp;pYX{XQII=$s;^|1Qg-4i3 z4RffJFfR7J^@Nqt5}X%4zErSVVxWJhZ6aY!t!>bH{_)xo1rtor4D!!0@7WFP`!lIW zIp$#T7dSMEXGQYwluQE0VBSYpFErnypJe9wc0^e=UEHJpL2ZZRpZLK}<%4$_O&1RR zcPY_1y)wuvPXRxMx)mlM|0l$k|7A`o2z?-%6dOF7=S67ypIE0+4`F2>ifMmJeS@?{ z;{Di8_fcv0O1+q!R=_9zLA&Xq-@o~|f!R*Xw)YeRo#^T0`5Wv~x0_dek6FgPH|#H+ zQrk)cF%W&vSImRZ?W4AWxQbvE+z0CqER<|^VguP^nM~S>^xw_)j(A%`Aj6Pz=A6Ua z+_m#oh#HlZgpdU$qj<(|Erx&F^I(xn9*`5nQ!3Lf93$y8A@2*`mpy@xZqXO9QrK=inyKe)AL~Oq z7uq;!A%z$MOry0&FyM;O)d9+XI1}#z(rII5je@|E)1#x?1P+>flgxh@@~%P0+21E5 z6rAA^I)v;0>Fd;OHFk%PBRO!mgn(9OX@9!*`qachy$O3Btg}u)<-Pryu+-89{E4jI z5M_ORoUY%e(L5)=+*s)m>o0qf4W=F@MGA)&NITK8vItAV^EA?gUDMOx5Z+pR0F_fg zPlGTNzV}zW!w!(>K{tOBGh`$#S=_}ePEXd5u9VRP+NLd2V)oyq49QrAneRg3z4v|J z`}%l@RHhJ07|n@h;2EnqwXv-fGvSRNAVCUd6rl{_r?S|T+ei6D>FxM_LdR@;H^EDh zGHSULc$KLY(T3>&q0$UCbY=KiCJe7_VS~%+f6@OaUROmbMTLLovQSbmVex{Cr0!j- ze8F>8tCa_U*G$V#vdLM1>e-C}mp(9{Zv=HH&3D8yz!wUGk!l4t-Q_0d6w*>O?m!$< zDQbI5YQ6s=`VHbim5Y(hxVfGkk`VTZ_h;#wib3K_Y=cqSo_v@B(VA2zvaGI--dt#A zOD+0(+o#vTUC)2E%+95-HLvk}AEF4}KY|Wu50qG%frq<0bBOKHKcQ@3SHxz{mmb9n zBe_d>K7?TiI3;<#2hmBDt8h#2xhaPLf*xg~WpGW-{2=&EI1ikB=k9cxYFRABj^sRX zAG~getK&(JENO3gkA48Hkxfs-Fbsz8`4v9wuu5=%4hes?3+R+vQL7O@G@z_9FE>NLroU=!uTTKf)2-(WwGfb?@g?M zWSHO|U5S6S)ZYefChYlb>lb>#2&ACN7}dAQP%7WwN_1U+CUJ!@2}Vc5=NqjmPCq5Nkx&Oa0p3B)k_>j z zJAHp5V2(NkhV-b%`CkErBU?>vARlt|2xr% zk;=cYoG*V`;7OEVIO3r7#0e?P_zF@NaCMvHexfiVDTH&8 zwc(~1@!WU_(o1}n(k}%I%x9%~%(`n8f~!kh_reX}6t(1wXSKH}zYhMm)Nh>~Vkd)T zlS;QlUO-mkCHY6FyHXqQgwe=~Rlz7z2nIdBiW1tI7vo#}(WRgiENM%;ymGojztVrh zU|-jBB{dhET`jgfadbchKE8?mu`%}Cl3f#SCUST0_{tLY`8J@fybtz^Yk+X)vfN@d z&s}ZNhOsp6Hp*v&I3&ym;Z98c}umFjJeP(2mzuMtnUbG}RO z+Nnb4x4>(axbgtcoOGKG&Z%#d#V&tsD@?h2A6J@lLj+vo{Shm*`K$hiNr=a|f| z&agws%6oVtLZPurYy{?}C-Ox81D%pxYr-%ThVSz$axw4&MK&FbI_Ihg^F~D6c2kfv zJ=H*)l;lMA!T$Tw`Y|R`J9CjkIp@4N&)aj~&sG^B5%7d*pjCrfa9rSf2Bv>^UF#Cb zQZO0gKo?Io4efHE-Z;N$-*tE!+P9rxEMwp(lnkb;Y|69&9lQu5Q0Xoq)|6-*GAR`f zU@Q$XiGm?S-BYbUFHKYgCre);Ow|X|82H9D>_V5sLb8N9Y-6Ys1BpW=rJG1;@=2&W zx$57e<=IS&wfmx6xfGrHv(bNKzVPSs*?90gAJHDIWQA&FTW-TdaOzahh1kjhof^Q+ ze00lQ8CJfE^T7?_qxHI&&D7>}N;YE+P$cTDQ}D}+;B%I8^#`=anvSf9=b^Sx-FkntV&Q!v7YNe_yPDa>UA`9LvUA-P9qe3nlSh@JAepOVye!6C8`R0G zG?H>1GiJ@n!~OawpJUv7b%%aCb7Hxmn59zj44eaFU}&>!^I~}>Q;G9?|2A?Kb~k`) zLNzy#{Dp~qGH_F9`N0Wc&>f}Vlp1G2R&A3~MB7-!17phWyUN;VBy{Z5(XllWuAF)P} z$d%v}9H)H1)$V^&K5>7vS_Gl*h^GyI3iw<8Tef9it&%-&!Y~kqcmIkT7{b8NLZzxH zpteKXp%p{bg&^dZ3$beK$R7w)@!#ttpgA@kqU{2}iUCnSe`iv4aEyB;-QK9Cu7qo6)_7Hnfl-ZCZTv7qvo-wdv zcv3=mM5VXgfGdk~W+3`Y2Kgr7E7N>QEdte=uA#NqWu;Dj8R)}!5+3x`Wi`}SCF~h3 z?su`^3=)4Qi(6niWlDNd$87Nbne8I8G>})zrrdM}M}1yE9q{HPc8rPA_@U_%z4%~j zReCJbhC3J*AI^s#sn1KJby|XSLY#{i=!0_!wayOzi4v_KYc|jXeLTsv)fnvz=H(HC zGW+5;&e85xY=Rt}TYq0HezWC^pe%*pv|nnf)%t(kRC9T)If@x1S}pdPD$>msZ$o|n zrIKAw!Y~+x@B1s>3lbo~3k4Iii3Es5E+k-3Z@*cx>_ zPSkQz&U%hYk%%KsuRNaU4{9)~TQ9PnLXrqYCHU5?g-yL?_AT>yq)MbtQr`smB;ZG8 zv>P^CO^ulPH(=T?L95pp)cgIXcH_B!4^@B2C%awptHUmqf`QjWKP65rss+oj^~O{o zI;kGWDgP`%?X>N?+Js!<{fZF4REyyv+LApR3;ByXAF7W2qQwq*!E%`d!3J$z z{w`{CGZ-%cY5Hr(0mtgOTie&OPT`>*Hm)DIF(8%85j9m6nX^ME@#LP2YNfBght2Nhm_{ zt=g`u{B!X@>AUfV3p&Q}`-^xkGNgZ+6(YXfl($4Gl<^Oym@Z`CIF&jD7|(N2NQ{aU zf@zbI|{hHK-WP;HURk}uXjjmD+5$(?JpjkI#7+GOy zO{Uu7YRwsa4n9d5!?L2<{l{w0UsLEc3hg-RHPRcV{8@*_WZ$2|9%P@ju78=st~U)7 z8f9HIn8o3*1S4Ud9!%i!&j5cNhnZ1D=my+|$Die>uZr!~$WX2aL>Z^{=~QE`53WE{yo{>PEk$@khb_ec{aRBN!CXD=qj!AO6GvoFfN=#K`s zbAAJzk4;MhK@5iP`4u^MXpg!T#8E`O=tX++v`}WV*>+%?873L1NdLRjt>Q^o%psRN zc|YzR(k=n?Ory_?3$+}`HujNN?=P1Q#P3;?C&tZ7*>`386c0pK&CQA$Zmw7Ds|-vQ zqO|K>TKlY=+xMWsVs?K3MgM&K#ouDjZa(_0{@B&9p3K1z#E)1TsN(Y&<%d8%7)!6% z{zn%+0qdmFje&3|GPOh&<9xyw^HlLd>R#gQ%oLO9+4?k@tz@a?YOS-Bn{G!q!WX5G zF>3=c425_93Jo2SvAqOJuO-l_w}e2Uli~0=y2N11#*(3>MJc7Zt5GfNc!HB z9(U=SlscmICL^p^va{05M?!wOUAKx%Ku*RY^e-h0<@6lit-WjRH@3lMyU`tuXvIa+ zhjTiZ%$W6?V<$1|?nE);J|3}Es_-J?Z*!g<9T^W(BxdMHFppD!8J59?ek-GtO!EjhVliYfj*B;3 zqxGu<(Z9dw+seJDi~0hMjXev(Fc60K`xQ4hw4=6ySVeHMi*#}dls3KEK%0b10*d(G z?Z@CGc*DW*zV|$blkF@(L$a@!Fmj%i^re4Va>sR?fv$fBa<-C$Ru5-$$^XxyYT9f*XN6s zuxdc|N+awZ<50);-o0pjQC%%{h1KO!Zft`(7-!|S^IJuXB%ckN;7D#->j)vQ+qD>BvMO>cBa$E`uJG~3IP8JE6o#!D8kt`IUGkkWN!P#{D(VByzkP1xa zDQD=xnf*8D5pC`gDE>lq{?E`a2O7mF-T|eNPfNrw5XJBL6myWJd+?xLL0tc!UfhGS zAb5WYENMF32HHu;OhA$S?zW90d+2HBFqfJ6y_c8UhtLM4YP6k+2n9=YR(A3gknb** zYel9<4#pzvUQ%DB{geN+_OiTQ*%HgEmEKT;R-7ljZNt_?#;89WJMmF(_T(eJ`5MW zj{kxxhF=@C4(gzO0G(1>Yr-%Te$TJSgAeV44_h4!I~`61g{_m$`BW%rJhg$EmRx^C z8UFXBm(9z{P|riiNzQl4*FHVxNsiDGXi5ZNODe&r3e_$L*}Jn{#K{_DPAK4TqSujL zy<}TT@14gEb-;P(1XCUZRV?GdEXij?ND#q-Nv1O4BBbRlz+k%KnE)?aLQpJKYxw@5 zJCGEJD@NynY@q0_z|=kmk;#it<)VL>agt&aqLkRn_?uQFO3Mex+I$VcuvNg95(l>k zp)Z6@<$`U90!)M;JKW-jh@@K$=qP0r$C{T3<1nNdHx!yGs{v$}po+VwmP(jx_m4+# zuSsX$s0LhtDBN3@J+fjxHxU~hLKAE?xgqkzj(vnHip2(Ybl>i?awDr#`+R@CC;>_f ze&Kid{b{=0(YrSf=l)qU%>$eVgnAaE*&t~bpp?kS7V8sSx$$c3Itj{B|>FVC8;#&n*UyklKdix zwq&Otstopn?2joRW5g^PMes)3{ z_O{nu8WEAK?Nu@bFGzn52qn);8u4L(IbXl1FX?yzl)=$L%qR#d@~?kgZPEqQAe}M% z2=TufJZUrsbD132-5scZVZNkaF%$NHOaAPu*YJFT1LVd&LhDVYq7gg^APbJ{Lkw#C z-$3#Sqj})FGMNY$XljhEjNxoNF`ePnz_OgbjsH*|ov@W^6|R$Bk#%f2W78U68qVm} zOhly2J|7eAFJP1=u7-bGGOReQ@n7a(b~`l^{t3x=E&rZi5iuwevSuGnZj4NQh8N4F z;chl_aBXaIm=eSp1M?rTfCP)Exh2yQ*!?8=KHinms^IM;yok#Oxkt?U38%q6lW6R_-TpcLGEJi*vJ8ErpX^wsU*)J=9V!kT2tji3`-LhzZ*gOOX_^EB_O;H>B#l@$pXX zH+^*vB3HpiG}%#N>e?kQTlU(jdbi3Iv{Ap`N5AH+DLAz#_INj3tDtHeu@!Np>-0Qs zb;)O$QO!L1*RFrdzbSZ3Z75Gwuq?5HgBS=2qj@Bt#Ub#z-SUdmLAGGgR$veW9FF#0 zW}u@9TQym$PSfpPPRyAzn+`r0Q_FCMx6`R17Y62~Gkib3x|IL4S&%tc3KkQuP&`vl z*K%cPc`k8gxgnVeF~~O1p-Ho1l}aE-RM)O%a#<_u=m3Ac2aTub&0V{y;;nYlDI%vl z^A1n*V%O{J@Z5Tb_9 zYC}&O{jx`)E{pddBeA45HnL>X4T7oIJ;_io=d~)q4;rE?`T9WJ##6|oZpvjvJTMxY zNvH9-{a{}X@V!1sJuC^hjcagB)|Mgdj;mo6B6 zb~T5USoJ=n9eF_}OAMpSm2FDr>A9emxAt#bE`JSZ6CNKC>&x-8}*Vd{^zcjuBrBh8$0x=N1_gBop!)_u61QWxGo5)2k zhJ*1!2`Ob(8h6{KA4FpK?{>R{uYh6W9A~C)-g`5B%=Ja#t1OT^p(GtI^_UrphJFYuoH7|9-XauU z#s*-oE{S|@k360n(&<2V3V9xlIAC$qKMkZKPV2>#7IoMb%AHMaB$Z5uC^# zQ&7df*9nhco_%-`Mb6~j<2&QK`)rgE(g&U}1=Q211jiWX8R+oJ4~S$F&>7=E<0mue znc+h^)nVE_n+@X_kb#gap#>=|tW&kBp)f;` zeNCgkD3dQj?aGvxGK8ZVCjy|A$tH?I%JdS!%Y@^Yr_!1kj^4lI{X%}po39Fvgs!*N zpJ}*DvN*_-0GmRd#8DbIFj{|+_PJ-y&`xd7An4pUFR8ceFts<^o*!(g#ejMj(e5aE zHH}Q+YdQwmO?B;ZTh;fs-14OWjgnNFBq@a#B~Wp8=(im%H=+}S6>aaFg%Il~OOp2; z%nurd;Q_z>x@y(cv19rJ6{pJ0(51}f4;-+wl+1hgnBN!AFRY@?Rri0E9X%588A;Et zw~YK$EZdH+?89E07Gy!b0bP$lO9L?wh41+lL#ecdMbuUhR}m~qdt0>L7D}3(bc5L> zBokYa{&zPi)Z$!*nR&eV-ouk?9b*j&%{{_6kXM4%^zAS_UQbG9c!$Apfv{f0ZWFi9 zb}z)u^lm1mIK7?KOCx_#kg}$(T32x&(3gzGfbbR#sSaQE0$mc6c`KvIa(L$w>)^aH zB#)<6>+OzjG?q*%!!`6!A;5=my=~gRDvf}9Lem7O|NFBa27S4>(MmudPJKJQliqeq z^ToAll1)x(wlI|aP;qJts89c4XuaAdgbCb3KrOTL(La?(ir#;K!Ck(N>+>+<(cDJe zfUyLL9D&+CcVZu0gux}uTNIz5Bq#zEfJ3H&YEfm?sQ9Cr6mV6X;glKSzz*yerH(;M z!$1&)@AE6>&_fDdG%bj+2$q)iAcE&W*-j>QA(>rvXG)9s-%Ugi#e?Ep1|IKye7AS; z5CIyd&LzeoYw~}jJ3U9vi_2*R;(E@}5#w%S{obDM!-?psyq;0X<$P9erDakdq+SNe zq2v0|G@7nM>YXa53c&I&<`1S$^y95gOg6?(oUPLeybP#z^!SE{7r^17?K@A{n!M96 zt4mr8E1dKLam<#%M5lOz$Kadl$CYc2PKb;8U$!{mufcx>{#B&);`5>SEWN@Tty9fT z0x=N2_bKMEhb57Nf{6ja2+`odX!N?trgUea$!^=UQvxx(y9HbW2rC$SX)>MfZ!*2T zGgHG@hN9pWA$DY?pp+H{UGK8dWr~;R3>OIL$d_Y38R)qXSFM}2XkqKRojj==1xc-v zp;k^8n7n^@GM*l_Ejba|E@R%E0Dtzx6@6U~a}<76enaOA>ef-bFUnl2MbIyeRv0)c zCnGEj+T_*hiACoIJebL);su1b&O!C??GaV z{O4qW$ZQ8&)BABD1>|0>O+uQA04M7O#s4nZSWACya;;88Q|X%htq$lN@VGqa)DgE7 zOGOZsVFOmRq4tUz(1Dqj*`AgO+p4J3*}(Q7-5N{HehuWXHJ;755_oigr>!tVxLde@ zv(r{ieo~z^fr_R!b@(UJP2*o2RbBOhyIo7RWS?!1PfG(q48`yBDROHIUUVx+*CPH` zD6W6B-dtIxX|@i`&J2@`D5c-M(@?XH44TeVd?osmIH12GVV@A(yT=wVA0 z)K(DJDq0jp+-$v5cx7F*wHvEq+qUhBZQHgrZB$sXZM$OINyQbOeEZ+$KR4%c zU5z!LvBq4Z_uksu!c6|wE6uN#BbX)CW+X@5_hdPIGht}rPBSCCGw3GQPdkaupcLhfll6-MZv&lB0 zu0RIVx>ID7D}=#(fV|2YS$j2XFu@GS5GEpJs*+Hl$di7Dcp!A(x?IxEr!6Zd9UzSQ z1ao}aQx&GiqSPTVVrPk|Kc)vJhC}?4y8uxlh4}|Ld!BGr*m34YC7VlV&cXMmQCFY7Ctr6LrAO+I4Y_63mgbFYG07>1u(TrU7;s zc=1(HGa2OaPNN54Te{w)i_=3{%g~MV+H1y@pYV$ix=X8u9-*8k2Cqg!7B8bK7$FBA zF#iHaWlJe4in9U?pLclu)4dTpow4lkE4IA2cq`)AWh|Qi*6NPqgz`MeYKk*_`$VjR zMx(u`nXGkT96%u3U&3L+iU*|2lA6v5jdJ_O=3&Ps?c$)-F*Q(Zq?c7NQ!zG(VSDSf zr_h)=O46GZ+k~JA?r#sW0tOwRz%X^yKp-20YTU>p$1XN1*8ZxdUOXBR^NnaP^$H~X zN|Mk55hEGcL4kH1O?+0MpXNi}m%5F4b;^uU^}L#fDr6i4BJQ`ySZ znO(3(wk--rMD)7S5{mN6>Ye#mXt11efuAB0ktwp~Reo^|uJcVde7k3|cYTXmQrt!% zvO}MK^+HgP#2Mms0eXwZbceiB#9l@y3Y)lHn-PdiE;av7#?;fqm5~ufB!1tNgvgRp z+PtXGW6tO$mQ}B%RV!O7MO-x4(RXotpC1UDn-C{J9Rp2vWpKU@gDq?O`mD#86}a)c(^{@+lziDNH^@^h#N4v9a-crW@g{u@CDhtaCnWZ{xL#ecLUXiB;#jT z97doZ!o26 z>Lq*>067XOEFj>?UaS(Gsj+&Gz)XZz*N5`KN`DB)H8B1`w0Qp%#nkjD`#!WJ@B28| z47z$+zAub4?-|AN#cE_{c;-E?o`D)~Vl2iDetBHHeVxkBOn!AhY#z)xlU`T5wJfqr z{se6T)Rk@5zob=P1Vm9$yA!Cdmj7e>T+NgYjI1^9qX|ruPu!H9wA69Q=_rtA$E9F* z6j!s_HQL_L^Ln+A^R}B5m9oD0Zo#^O+wFHbW;SFIKTtfDYTV(7q2 zy&D9EPq!3WH=2*&@uTfL57pBwP8X}Gy1KD{6x!XHDMn}#W!)6fsdKDGbUoJ)>dTx) z{qJTjfg3*Y7hBurCx#0BRs!hrSB*6515Q}NuD~rXqR}TsDzxZkA&je=tY?w~8Q~l> zDDXR62h&iE-oP9uA|LPtJe~9r7B?WGi;S88+U(TZK&jG71NJZW#$(&18)FRH!sg}7 zk&{2$yNfGJ*1uT%FzaHyZ^*4aBF&fXD!v(*E9%<|sOTCJ7$9v{B*m_85w>{1^I2av*?)tIRr-I&$mu}H?7`0092vKA zc78r^k(AH}Ci&9hYmnSvZ25&Z1U$3U3JOnpYbQstp0>6&)U#yD@#V_}Lcl%CzHI8kxQ>Jux3lWh;( zNySm1{?ieR9D7eRLs**9(xDUts{wfwzc1Y$2 z(`Pr!FS*LJw^L<@%W`jgY`3LnqfS6d>KAk&w2jM>D&Dg_9{rWIqbp(ER;Uha6bQ9@-X4W;Xte@8VFddI%4(oj4|HqU1nL+f19M&bXilMrw+=I7{CebAFD<1 z(}qh~Xxk8F66G*J!kH7(}3VVP5qVYIv%L?LX= z87K!$rpHKcDVk>6Y5B|CMld4%w8@NfPbJNNvGuSW`zmlvdx?1Ffz zXqZCAjp7c}fThYp&NTm%PDDn(WLr{A!klRO5g+2ou{Cm^USS~8iCH;e}bOc|Zg81$F zuV0fhtZTEV6bi*bljo$a65KdBnEw((WPX=ypau${1^I1|)oejYS*1A^jnk%YTbWj^ zIdbO=w-nv<&Ba6Pqf1ZffjF;_nf84w=^p=^#4OW-zh)ZjHWM0UpZXSJVSexoCb}F9 zz+}GK9}T}|3nk)Z{!E+GqPK;+W$qHlSz`lv$2$|IG}%AKnvNXnWBu%DuBwQyiBdRU zGG7CnQ{vBe5i-FoQkSb6gduQm_j<-bIJU3%WI~BMdwW*_jUG5nh}igq4p^4IV@#J@ zNGCfM#|*LO?XHhz#9JPrK2Y($J#>eBDlVQ!y~vp_ez!><^e+>ujK%tM;u_o|1g^_x z5T{&%L|m#Urc*um>qN-qyumnANb)+!nyC@Mv6r+PCja?ZwD=tim6QP{5m!cmUW2J`htib3M@r+d(blg zt_vls0?$6=8#f$v?7|VPYPGLXwp16sP$$sgYB8PB@al~%Ad%W6 z!L`Ezrpo)M-?i97sut3`*#d#2EWRPGWk9t{yP7>weeThoH@(5=A(YF5wp&o?Pm}$P zCK*0~RJrgqHH8|23FVZul@$fOYS0M}(j`{=-rb8abn%!QMaH$jzsA`g1p5}S$8;{o zKxjB$y}f!g_G#-R+|*+rvVdMUJv&9-%k@3^Mg17|h?pvs1u`U(a1Uolegm#q@HS<7 z8I#<<_os#5@CHQ6vt+08){?)p^fT^^Nc*X$PK>xvHwW*GMaRxTT5Mbv8v!{mEe|y8?_Sx2c%9vT+nx!T3Ey4@T5#$ zmKv|b{936Wi`G6xJ1@Qfqv*?w7MvN@OKOvQ9Ai1^R)_Sko?U|anw4-R=%vOvL(HiR zBC{Com%)7NOm&TP->|Zr_MP?e{THpd>)mBl&zCLutCt7gbxh|XT$r+A93qWIkkzO^ zY>wYbs!q|0Oe0@0Y^;X%+0Blly2_idc9g*F^0xP6CnR{>k(~e_F#kjs29Jfb#5TtB5`OJY{Cv;I9lld^L=O#u@(i-HaoRhWS9I#vo-;Mp!Iz?o-e(RlCB> zn#i&(k@zpVMUYEKK%Q(UX;Yqretv3d^agJS#dNxoi5ee3K9E>YN7^|^QtG%3zD5hhOptdk0l%7dZc!bj^NMxjvV4p-KrNHRBb4tmwv?d=l4%ct6T^k|&Y z!?;$*m@^D<4p$Fm*H%#gBg$KXEA~P+2R4hIDD&*JmCp*S+308O8F9l)HWIAlDI@mR z2Av~~G30+X6s{=du}7;hEtG_|dIC!R-=@)kP($k6|h4piIQt&t~|nD#agr41ME2U$Q@B2rQxM4sg?LrJ~bG$5olrEDdHvx$Qrd9ssa* zBcq^@^GV{!x%)1x&g{FT(2tfjN!4Mbbn{Z#r+{B?P*VA5y5=*|5H4eOd@;sk9G{>* z6*2i6|1Oz3;7Y!#_XYMW8I*<r|lywJp&Mas_$L=wAC9mM$CI*TEo8EzdMX#N_o zd4L0_JKB5KGhM}5q2Uj~E1ddRs@L@{Qd=k3Opg|hUo@>7Qw(Cd>i}6r}5t&=2C5{xo zZJx}{yCV{8BE3miG#>4PUKKkfUs{zrN2t_hTG6(W)pNq(jyuk`C-ivej*+HP{s;T; zKicjp^n}!b)M_;mPt7$AbsjYVC%cLi=iwhsaRjTTE5G)>dg{CTAhN=(6cK=y^DtZd zHcq^dP>MH>I1RHjLPD-M8Fsgkda!@%c|4i;w^|BwVT0}tlcRde_u-X@-7;U!(A|+& zvqElWbR7!A#(JH8?x^fb6NQxdXLvO8pS0-cBm_MzZaNrxmE$8cGS$Mnye7BuS;3^i z(gD2m1P_271i1^*y*}1xjx164HI*x4I;}O}YEA$jK(DtP{Ham$uz=|AdI9(;b$O%MYLT zzr$<62SsyGw-J?|e_&?Ud3o(V)t$CB+aC?0S1BTcb z7M`D+1@lw|B0TJoYckxNps=IB-r8Wp)q|3K=14+}a2UYPTn)Ai!jeG?+EZKnG0df$ z;WE8l*Mh{%WFqMI#Tfx)UMJ?9excx#m6Dd_0gi{0MO6f=mrvPNP-zh;fgP$+yBPw1 z`L;^DWA~;3FqPe?*|ecky|&TYUW@=38ytqBo|3O?`hSz~uLhGazZ7kvm9CCa?LNG> zEm~E1i1|vIH8T3k0Za-_Y;huX$fs|7G0j9p{a`M<>_OMv6|nnrq(=iO2L78i^`Z#i8rB8t2%=EbBaDd>;p#Wch5z_Vk7e+u$A1zZJj)sm!V@8|I4*kC}Mhp*ZPwViy z-D%Y!!k5;1R36P$VA!K2-IBs^u#_0T&4nUHv9e-R+vc2Vmp)~M^wR1+Q?sf5+O|f? zEVP0^Uir3>;q?^T_EuOaH@=hp*cueVk*1)F-cLiS4TyODBp-QQ2KT9W$))a<67IV^ z{pVPg$C$)a#+AklCFBVcnfX(w-i8#A!>GB>_6x!04qUI)Z7olUeMU;AJ!X5Rwo(*K z*|YtfF_WZ-WI1?l=^+6ypv-ZxRz*hsEI6kMriM*qc7~wCvnGi&ohm87!7(n{ z@jBWU0Za}q74NDO{BdmdT7Q;(kEEBB9j?p$y*+2MXU6}#;XW;DrQy}6cL}dfy%UO4 z+60xxrZjl-B7C?eEIc4ttI^^Ghkq?jGK`fWZALWG@G5#>7yeJRa0w=z3US?N_yFfp zzw*8btlSeM%w9JmI5<4t-vgX6k9L`zYvt|FOkf%rar>VW%-?pRht_RqUSf%ry#vKb4^ckK9)8&fXiq#9^t!JqwBAq{>sL4rJdR@wim>Dh~- zra5cE2Ry7V;p`5kb?Cyt9}*@)l1fVtetpYMO&4MUai@gn{?*n~-*Pd8V_pQR zhz#^Q;URm1NR0l1{A4`R>;xG9P4-E@wg_Kv5u97J2aldv!M>T=SRIZb-Ey;nJ8|$> zBtyuw8n@LA2gb(h0R@Pdq4qLpQqMZ`HMPGCVwW|R@B0Tz-(qjWp+&qb;L7k6I4fyl zg=O-p;$UL&!7}12^T6rs-oi7C=L|L0cyhD|3Ld#=E z&N0?6HZ@#P#!dXPb`g&_`2B%KTr?XQSpPxd>3LC;mF0)6MMa$-&suOcZ)PtF3;>*4 zx-3oml1<1I2V+;s6GD^5|73)HdHrs{ZSY|^?JtYV8|Cz&&x+-%n=5>OgvPiAHVwwv zMFdlRyfVTzD&P{!*%C^bTy<~wZ+j{*3YOe0-jVLGEC~Oq({bW!u0)?a?8v{CP7RdC zfoAOX}+jp$s2Ranxtoban zT9_lq0)d>^jxR%>(8j+hwa`VkLh8t35BX`|`KmVb#p#>!b-@s^i0%KqiW@nm&eV0T zy(?>NvrQCl-hW1C{7mSdB(Z^2DRor%Ok~poo4GwCGOAw@gq?-6rqe9}ez1CGj**6w z8y(Z)4ya&v7`Eh9npGUo(wn96@aVo-9Ee+ovy6DT8EtWcTv-!wVu_EgG^x zxc~D6f4(j@z$K3>7NY^18dWLdl1N*YZs8~5qQ2LLs!nULo7*4qA+&mF`sW5((?#$R zb<2(U<>NNp{pMF2zh)6ZAa@{tr`F9f!0kdWeJj6Q-KA~D#=%8e9OasK8n*l)HG*?( zM7lgVhl<_Hc=H6N29%+dK&nL6M<=~Vl}3D>nPjC^qAqWQ%pKWi9VE(x~^h zAzaVec1r8Em|9dq&tSrh?h`_1-w>RYdYDPY^q6i~Shoe&zm9_FKsc2C9%GysyyxWf z`8ki;7BNE9I-Uh$*oF-YTH+AKU=BL8$S0&wS5P0V?8saNR*n@51$$K|`Uz&ftRKmo zZ$ILps1*g8+20`RK1vpBwflq6&?f!7`FTW8SWkd4JI^%46Sqp=KJ}NQOxxB`M@m%R zh{yZTY8D&O3|0U#zzy|_v#m_*?7l7Fh{}1&y;mH%>eQ(z$UV#o`+V5jQ^g?0eW3Bl zvoSGZN=an)DIbk}W+B;dWZaB8Zj9l`4w9Yt8Lmt{-C@8$cb&pH6-!3UUEapJOQf-_ z^pbk(6IP;9{2uC1f^(kMTcv1TYDZyctxe+CTxV%z-66vkxMunaQ?*?eM)q6&-3pB+ zjoi}cQLs|?-3Aqxda#j15zJNa_a#|b$G*d%7W(H?6~$`PTZ+<}@6Se^%jwChle4vH zdt^Cb>Z?F;!W?w&{*B;k|EP|jBO0#>$lAFldIHM^M+=(4Y>yL;4qUQ;H#? z6EZOQB)5#-lTXvgZ}1d%57s++FBYF#wC6cRb-XeX+{6rYInjs94PCS?vZOag%cmcS z&c|NUxMrC?es(b?2%q$qy|YgL;7yizc#61|&GVWV20~0^eI6t(Uanu=cn|k-!e0p2 z)zsUe0Wa8!@HF1HlS!DYcbuI#*imo@fkU6$?>3Rs2uDuj57vVbCz<|8&(x~SI1;?7 zHdK-d+R2M=MD~ImW(A9`PNUuR=+WZe<_#H&?j`Zhju1 z#$gb?++0QNNk@gMpZ(0=et zv6h-~lRP^_^<}l)nZ&Deh$MKO^k6wBivjN_>4!m?gp@4|> zg3MyQxRT{61-DIgI;1aO1ZhVPMc(Ue6~p}G-ohH}Dql5vn1>DX0nKJQbh~1>q;iI0K?2`2rq$}nBhFre&ekV&`&)XaIljUs*v;diEEGGE9Y<_ zu7DnwV_0p(_OAHtLU$@|7o9hdknc7-R2<*iR3M4XuK#4{!~q6YlaO5hw$J5$p4|**8jypD1IpQQ)c!L(f_S|Je_%X`Qyr?G$SSZ{6nf03QH3$WZbxlQiLe zTSA`Krl+T=bJVYI`{<&Ik(9uy<ZD*ZW7QMr46PtoW0@UNfsBwpecS*ey!IvzNW~k*<0mjrE!B(PHJd z^Ce>aEkM2V_oButpfOZ=(=tQLbLX4Oujx8=hYiWWsaT+v_mt;1#f(ks+uk=9?)mF@ zO0-0BY4dIVwR>BoidxLMI&;RUl6P3Ez}1hDezonm8!2;GFGpoI9+aeqrRH*MI1$TGSgDxJaSda2jhr9z?aM(DWmd%s&H313Z_r#a&il6u2h$ z-?y^1O9TL&z{K*UIOmfPHuNZ`x{Kp|WyC_oi)zYY69UCoFD(wsLTSz{mEqMHHTz-{ zxKflRcZ9kp8!YjaLy!~{eN&f5LN1ltjEORfp&v&(aOuOt{`N4j5cr`*ruxl$oxW<0 z^Xf>U;OqLn)9T4fAko3N((hzpyPx!ic?irl;BP<^ASa6R*>wWq{IQ2cU_En15}Um!)PQ0BF1h}aiH-_gt}S@LN#z$)zGnmyeJn*30O{4|w=MVC)@o#!Nf=kBX6dP zTy~ZQ*PZdMv&twKIdF^~dxpdUrEO<=~r*3ChtTH3FroYPD^>p~dfm+*WaUIwO zdY{v#iJb#w`}uhgqhGeIe(aJn!4fqD9lT+&c98VBGfh_WYYoo~AL2%$*wb0cmN)>yL1vpmNrw{2h+Lk3= zyTiV$?FGLET&F2z-2=ia0Mq=(BiAIkTJW!+J_sw7Gv@Nt_3zA*dRC2)gKWbAx!f{z z;3=H9mAEz_Fgi6nG3*isTKAo6(k-a|jdsU1-}C}V=Ulb(l|3ka!@RRwmAoF()mNAY zUUMra%Mv_A%ZSs1E)kzz`0kEXuoR}IA`Q6Pn=bv_<~ymPAL2+d9>ZSdTE81dYlpe z9a*T^+~zS`+#OPzI+A-|^^Ymd4C#P|=r`#C<8^eoK+XWO+VZDma1qO5p1=B`PrA{+ z`4A;HGp{JE$a0A_Hya`CrNC& z7XPW_J0I$>kUf)%LNrs_1ebgnQWgWv%pUuKh-KcSF{dZu_@i(&CxT~S;cvq^aheC0 ze=#_*?c&!a0Y z@`N$=W=?Sk46vJi3Upw~o5Fl8Whafe3vCZM`w13334tbU?oxeeevgn6!(t02f*khx z4@0%Mm2QegN)CBYl&{Vpq05<(@nVXRucI*XQ-41!J=uH6cI&nK$(vs+P#~%0N8Nlj z{-M600KX6rjUfdJ&v14>wq0p)1Bc1;R_U zw7*#uHR1NL6@jBqB=AJ9J@=++|B=1}=A}qq?HQ{76FRtD>X4Oc-DfzB8@Y<3dzYp4 zJp^a;w;M@a3An}#mCpO_nc*@Wynh&8PF$bOm!R*;rR1mlcTVV0^e zFmD-KFZq&eQ!;`;i#<;9?~*p z-}?KK9WBEuD^?WU{ zZ_i|@*^vc)k`8r=(}3JnurgS-Uu$@T5lP6yEgv(*5^LX1coAZyZYM+As+D#|E}+V; z0W7ZS?jbKy{HXm65+nBbzWlN5w*$$2sKSTcFE|!oq?niid*WfF*Q)I_>KyH9+YYz& z6-%Hg@3_v5+;y&bvl9Zr9kJ;a6t+OVQp~~`Q7ocogyfDgJ3mTE`V&lO9y{#QSK5CC zU4A{03!zqvz(hI&XL{1t58uC&9#b5d96+{A2ZswgAWv0v(GKMPWZ?ZqJuQOH4RwFt zGHz)TFl4a*{Inn>G+5^JG7@phAWxDSI(G_g$pXXTua*oZ^bL%H*UO*O8m{v#gL%lb z)dF_I7>7wNMuEh^AaMNbnyN5~!GH7EpzbPpP;CkFJ!B|di4-&89?^ubComy&8rWu> z6fB;hJvq5#N zKV6vG+`PHwB(#dK1hpJRKzLWBVygG}iHpzFZLo64ZMqq8s;H>LW-g?UE?f{koEjee zGYYXkMs}wWtknx;SfR)+`j#UC5fEUN(6YR%d;NOoNAY-rO*N$p?qb5~7t5L;J!EH>xg!wXr|68sS+MmL-%uOAfY{46O+R{9XtMns zb<_!S@ZdU+ls?vbkCo?()rZuMkRa##ioipa0aH0$6Qhg^k;ztq#UCk}3~nYQ<(BDi zBzHRSKQq)%^_XfDhgg#J1fu`8YhQDXcf9TG%R~Xh$OPAs`fOLzmk>N4Z2kI^5A2s z(+^}oZOb$mCZ4;Fwk1Rq7>|gvzy_@Dv~a>T;*Mk9DOM~^-GD7!0;W; zK5Q{xNE)v>6-MV#;sKJgOS#c%?d#z@gg9z^K!QCFZGHeD^eD?0kZygNvPIYhSdu`+ zI>q~PZMS7(%?HQ^pHYBgZS$Xl+{4hlN#T~7yKgM>!GgS!kDstw3&CS-G*Ljvg|cNP zv?j%UU85&&xvw*1`uX3>h~E!cBubw8hhZ73x`WJ2gtdCfd%y)M6e`)G?Z3yTUOquC zXxqDjA+L^t0soM+&6#&oHy*;UESiJ&(jt!6%$llT^&7ODlN4)b?V3FnB{exB7@S-*HC0q4Ol9zte&O%8!EfZ>5 z74uicIMMKEjydzm1XCOa=oxd-2jl2VR*Q{{Wjwwjr9k6o5Z{ChZ9N zmy}u+X{`NVM-$|2#U+ytHW%V=oy0^o4eq6E4(GG-t(qXWCSIv?IZReGC;q&j46vL1 zsAYN*Ji=djuCJ~y(9xae4Ep~5cV=6F*xy`tkgg?eIz?iJq=h8yHbl7~>Om|wRu_u^BqX|{$VYWjb z*|@ySiSAE@j#%Q}!$8Sw5kryM@?*wnoCn%kWiLY-s?ZR%_M$Kz&GC$f*+{|fBWG`= zPx_M0CMpcuGTfg^qOY5Mu4oAAJwLhoYnL_%fz)y07qqvk?Fi2o=@(BX-_Co#@LVcd3$vd}j@SSb6^Kxv)Vj zuL&=swNDpnVuve7^{c1#A4%YMD-tMQ0z$JJb7GsZ{lI*L%6A;P#i7yLCNfG{(ZmKI zwE5G&9-oUyw*yH)Utjt-*Y)a8S%yvpF?E7VAquG}M-gWOUKnKnS2k4eq7`}p%xYoz zT`6ypt;}}3Q0^>CoKSXgTA`Rt2D)`2g}7;{$SihfJ&GWLm~H)-%_4@v`&e653j42x zbufaR;K(mEdcE4QN^+IY!&0Avj}|Pjj2Y&vJWN4T%gt*MY>uHrT#D2nfvw_TtxOXW zX7K9J5tX_Utush!red2bDGpl+X-Pk{c~e~-$MmYwQwu#3dssRyX!Xayigumi zvzg|krJkVZZ`)SkudXDWu(k{)XSxH%YHFB{NCwN0RoX=5Y2mM*y!Ztq$KOGX35c%u z8a&BX`nu^^MC{X@aqXDu!8L%)>d2vHj>mj;fMV@|GA)tlp|punfbfZ0O~H^mbVO3> zl_#7#j>Jtax)Uy*V9^SXftUf7>zVJnU(TiFkN&3Phh~pKe6?>IU2m2vAN_Qr#w)(h z=x-1?3G)A$o`t{MGhZwLB*I2IsdH%R;Nbk$<=*+69FK2fgCoI<5EVX%b%{msJ#G+3FZgr^rf~`7bLKEiCCA($`x4*=I&k952NFX=lkQHG z01PR2()T`)hC@dBrNLjIeR{!)ujRawoH zY_uWNv8Mtm0E5AE`Exro#7X%`C{HZz>{mBPwaOPY;mas@tT|aQirH!PpS9sKxD{qS zdPvr2%z_Gcl~R@!H2TW}pl@$~zC6?x>hJj2#g(L|-=fF>m~xCuaEA^iEhNh5w49V# z4kY8$iEhJvy*tCzF$j+z#mDdF4z=Q(+*pp}}QY@Fe z)`<-vY`{0QT2RGKo~xpQLW{}x1>EMl(Wieru;724T+PJITN%7L;p{)YqkQc)%;zqJ zroZ7$+~G0+=HYpK*L`X1`QTaw-)02$A_}qey*k&5V3iY#(yJyHb>by0s+R#!1t>wa znXkhRm(qj)ugC0cfs_6H`;-q1+HAN_{1d*uHRRaxv|=}11bQ~;$2MKATvzCGA3-qQ`mYBy48=r>QtOgMV6 zA&OojDr!=UK=;G`;Hq^Oa`L1Aqr>2SJKuybChNYg_+Kjv7&;flt-*<6h$y)^q3OX< zlv?9iEfkIYApPjz74pi`zaSN!THGHrwh)B%KKwn}tUvip34etYHR3Ee+}Gx5KglYi z+I5^;_wY~~k1|bpVj$$tw?GN>*PCxs{S-VOf5(psFA*-OX_uT49G`mutm=e5ng4-) ze3eM|wO@1sU6CqvWLh8O!RWLw^UTuCAbXE=@)A;i&lcS-ddyJHG-1lOZLT)oNOv~} zk(Fn$gde4WI;WQ883spaBLVWL0;p;;&AIDmb(^FH7+hcGoL0g#rcUz3Sr?vlBw+l}vrp}OKlL9H0v7a4vp zxN#&etcCl8qNKj!;z{s*Y8rmhcV}1e71x^JU@xE+a)GS0L&#r~{lJ1}BiE}k$cnUS zP|^=L^ti(N|JhU#r(;+HC^Cx-D4@NDy_|Zl=lnIWg|Ao=3_Bgn!sA;Ly;)Zm+Ic`z z70KRUX2QzDG3(~|J9kgyQh@GH%bxOf$~ZYn*9!&3I1TU^RF+oY*I6btB{pN#5++M` zVRQJZS0Iw#F7*FyYT&Mb;{R@{GWE&DjtVu4{KJk9LRz-kAmF*|Amn#*jd+V57)N7d z(xN1rTh-K3d!;!6M~YY#JXj-eyqil@=1i)CwVnva$Z78SLm=rN3+F?0kvd3MJod)d z+Hs_PXwwFYa^7)xXMdP+Ja2-S-as(Ee#^na$bq}B{6mE2TDTCHKaCdA+)&JLNAR_l z`&JRie4cI}fdS~x-Qq5=Mma(%54z|iCA&S{)wnEoP*7-2ag$}eg&V0Em+T+StAb@Q z4f+P#q9f?$@a_+L$ln4Lz?1Y5`*UrBit>=sM)(EkypuRg^CpKxJfg{T;+hlapd%k`=BM^ENxdjEvqp=y~1 zPHk=>qWd1aBu@U@*JJ-jr+b_gi7yc`LlG0n>44jtj%zD8uP0Iw`xKZGjzko3#ZFK2 zJ_0iSNTlHkBWtvgU}{;Cw@+@euRgHL2_JH3=aAK1?ATt-tRF>jM`N-`pik}J|AG^x z!b`c*RdG1sTV+9%WrYoF5gMSHVZa?5gYV;}B2FPwz0dQb-a)LQyY!~`iDA&i$okg+ z1~=f8+)h*gv!22hk0$ZA9OK|G`1zim09jzfXi;bfwn<$+e&PRw*35nqAt*_ zgZv>QtF4S2QCfj-Igg7@o@Z zPt--`K<0`TxkyvwfJHCx7c*$%iyD@6S2x`!@~zMFV>rC=^ATlkJ$z&_MYNCu5G4Kj zA*>!lj<@rrV*yjrVA~H}BG#l$L;hJOgyLpE73`D=(h}}rZ`>`Kx*jMUy@@LnvXNYF zn^QhN?^rQkDftgnT3OJ9asNqF_zuk*$DCWT^vkrtvWFgLrF^JFohAJDuGMvU%Mhu& zY|ky4f_Rc=t3X5{3<63oA4P{AAUju~;-O$TKLs6NO3I@p!wr-`RElh-ke81fTAC5I zt?Av9p!?h*;tg?9NqG@*Ow1Mo*Uf`EmJ`?ltXIJ)3-O&2^Fyn3AXTCd4m z3#BZ5th*8yemQ0LQf1Ylw!})H9!6ELN2JRGO?8P5#<9V zR=?W)20z7cQhJ>eLwu9$JY$eUwy8Zb@3U)~>qU%tH6nE2T?g#&DoHn{5eH8F9&X;R z0(jfJB;&1g5MQ@T@+@MrR5ayeN-2%y&Boq)AO0ZGWE5A0pO{$!^)7c=xP;7_i87m% zk3MQ^PBdYg8Tiu}Q`FU`%h?!+fX6v)8cX-w*O5gm=68ZH{>ynQg_3jS#dCv;c==?Po|ne1H4mx~ zB|v_)oej+GcY56=I~=sOtA{&G{@+%dYhTCfckpT@fiF8I^5rq0Dfg3WH3tJ}3{Z@T;#@Y*OB1J7Y*WDI{lTB*o;2v!6`OfnWc@e z=Q}-zwtrP}FVDk&20ho=uB$Zk=d$0v*t|Y}FLz6O(q1-+CM;YPLFx9F1K)l1_|DRr zWD3)v4u$Q=Rg)G#{|Ju9qHxL66Mpl$XE@wIwZPs>we!!!x?Ok$vyEL;<|4N2N(RHJ z5X&U|iTj90aD?kGkV}>gQvKi9{C`V~0I6QzmH9rcCCt?7s#;d9Co7nGpBxyoF)7W< z`Y)yIm@MW9ksRWm=!7cQnrj}(7bktkb8>HC#tc9tU7Iy{A=86nZDRS(yihBw*#h7A zeMmiQ-EUEd2War}?89pH^8LA8fyx70eLEBXi@L`%>`(&TDph*V4#J@%?mp8T4YLGEiGpOdVON zOAR4{i#kl`Zh>hR=%_&!?kGj;@x3p=OEMGT6H!%mU9#eMA75IIlME0M^9 zv4ZoB+mwwzdL1OqR^iYcp@>2rfL60R*#ZNfBo5`Jpbl9=iFyW7>NoG?DA~gX z80fr&cl4r-xu*N*0sTq5<>Hkm1=?QED>*U z-TCaPzvrD=!>TY5k5ry`=Y_Gr<$b=W9kftO*L=7P`7KejT8m><C5`b5) zcPsDX?=z-bglg4^|3aQRU+EqbzSE|Fqmzqy!N6hQ2Y%nhESK4kw;iiv@I?^&^%<9h z$ze}Zh|&FAcb<`>{rWa8hhS=Yz}f&)M@GjT`-}C25s?p8Rr|-Z8NRXG^~8pv!#(t| zWY>b}*1*=7^GiP50ePd$^_G${FL2+suW?|7Hr%=H9py@5fmxoN_RneBEn}}7co#&)?RZ#I4kJi<)UA@#+g?dYk z@b0Uinxet@A!p6EEi~)0-vFi~dqc-s^R#D+#l^Rjm^!$xfd=I3dlW;{Vm5I$DNHaY zXLAsl_7i);fhZ@6_?ssZeNA&VSLf=*ya1?PM(0=z8_lZn={Q}T9o8LYAuRnEvZ-fP z-_m-37b?S_c9J2RKPRde8ButJg8bZ={^c6fd=qVuC;IG!Bh4_mmB3Sy7*^sjvmnI7 z_USe=OXn`QVNT-zl)V3mt-pNlUo}HD@sf_!-=ci#`}SJ1{R__4tkALI_AgZ6X@!~% zmfdlp*(l#kXNI2q#ysrb;EKf11TV^J?)~8cqP$1R{!!enBsh`|BzMB`a(~S;J0})3 zaQtkfg*Fy*cS3+$+{$*?^3s<|G2i?{w|qqfyxjw131y!|U`6_+EcYv7 zZQ!SYw8Ut2b^ftolP{$%s*h009N(w(=||9;6j`K$7p zbe^Nje6>^kq=I35!FF07aKfB#xh_V;81FsJStoFfO?e<(I`ISn-%S9Xa|!^N2Weeo z))5T>!!4M3)hbi}ar3*6X}*XVPybmj^(u{&>8XPsu(j%)J@7^;Nix*1PCGg_HDoGN z?VT9`V~f$JG`-E%4ATpQ5=_DZqER|&oIi*IC+yN0C>T&w>K7~?Pqv4_Y;M3=)8T?uCX2o)~4mEmL{ zLfpt7;PL*fR^#3rSfK>Od}fdWUDH)zacvr?QC2!2qpYi;-vwpPKI!!5=d0i7D<#=5 z6lyeOvF$5$-YVpM>{OmrmkO@o1=bN!TmK)X-hsWYwhP;h+1R$x*l29qZftYLHXGZv zlLn2=#pb}m>sR|qw(5@(3OEg~-?7i_a%*~1jBW`w zfIwf+KU)81#rx7g2wk4SNPe}3VTQXtj6-h8&=GY|JS?B_n|6Us4NG}~Dr)Tru$7Ql zg(cIn-c;VpRd9LG&bgWGeDBSLq{9%`28s!>q6~Xl5uqI_`l!zp#t@1n8v2*Q;+8~P zws3{l@2I1<$LDU$S4zLfk6pmziw=x&VB_N?@(UNKu-pYQ8`bfzl~^LNpz$I9E%?-q zVyqPoKD2{S7JL;t%E3|S+@{JF^v`$K32??^AV$li5GtWxRuA?PmFBbm zHkpO?XmCv{+z%h6oI2B2kXa-o#ERbRhfB2Ci*GbICtRHsen#?V#t5|{Dn5YwJM-{- zC}nhcl)#b97ayLNo^k^D)s$XDDE(HZmRNy`L|)d7L<=1^wuVZ>eoJ9WL0$r5Aut#s zjs16&e_hN-*m%hF3Mz{eic<-=;>6_sS+o$(iy~DRLoN$GF*P-f5{)M88F%hv_y{fJ ztQdAYButt`mvi9e3;g*DJR%BTTp71hi$DwE?xnAehZx5lQnUsF+O$GPwrnWm>tzJR8g zRmOXW!uL3H7fhJ}wJ=F*%EJ6iMyj#0#jC(0$i$g3vPnVYme9%%ok1aKjl3kU_QFLO zdqa>XXv<#e)JyaV4W>su#~wIQ*qz}uUSH*zW|ILy0JPOkcuZOG+So#}UCx%tu>}Nm z9EYmZ@~9rnMSDJep;4ipHCh@O!nZl9mupbZZQO+yM;eomDj;keL1|(k#O`G7gwdc4 zub^1d{+jh=OWSigNI$?l`7c-;|H6Is8OVNucu3GwW0RNH)-zgRr@-|#=-?vPr-7Ms z;~A0O1hlyEDd?G<$d1WSR2a*(R}oKv)|cuMd;>XAL#)yW$QskBBY7jn?fA(Ip6 zgnYa-(qw2bRF}B~&DNH3MB!E18mwKH1{agp0KZRlMKQ3SK*O!>%wfaqT8o#u4+vRn zcY$LQTJ<#dtN<27r*o5f1FBKPYO?1(;=_xze%a`ibhue1KlH`uWlrg{0D{0kPz#y* z1H9L)mda1%J>{8n!bb(mA2oFuXTg6ZEjmC3Pw>ChQgF;3?t*dHuQ>{&B~}boRJ62i z0q#kH%ew8#gUN(UKNRFA-|$$o=W(xUod&fvbmy3$Z8yr zb;y#YVCa`-8w0VMG-Hrj6>BWSu~7^&mzxQ}VDAl#rh_o+Q1)`s88N;KX}~Mk`$Mf` ziF{!Hp8EL>u7;cCFSHL&ls_a*Y)PH`AOJ=PPN&<_VSnkLYPQUp!I%JM_lzx>f^DeY6{eCNiD0>Sh)od$=>1Zct|A);Cl zkPX+EQ-WA_(hZrg(lLmikb))+W%{Jtt5v1I6;I%bFw&~$;6r;7&^&cE)XVhSIO`r) zPwOyawf?a3EL`Ou9iPneediIb%}rY_8~jGM-Ky>>QI_!9A$)D$9GLGuXQ4#HOOZam zvMx>Fy!Aqq63=h_bt(;Y2j0IRvwuavY?Y~9lY~WNSY1bGnQjkM;ccXj$rh5|o@l2u zEE7puVK(P)_}r(zx3ol8!{F_}un=YSD~3)b=58K9&KFSFL!u@V)mQH>S3Zk(5edpW z$nJ%~8dykSC(pjw%JE#ARq^qtCD36&&w10Pz) zKjbO>`ikZX0?1GKC#>`DVILTou$SwJpvtRMtWjW~8sadXjnjrJlwep+^|8lL(OBBT zN%lBvho`TZaAV{ry38-5Ti9WmZwFTDk>*+ZCdK4jl3UuXJkCgr3}1-Ds1#|?)I>g2 zi=`y1NO+wwKZrLD0062b#WgZxv7SHcq8q8Li_358ymh0_AX{1HKbGH@c4i^~+&f;h zZ?LT(LX-^Jn3Rxn#pR5i?W9GHSBx|C)6N}*c^mwf4C{RQGvUQzOt#LDz9RJ{az{=U zda{b`ERsS}vZa20t1j_AQa)|}`BE3G<5DknxWMBy^ok~sMlFe(y}_WU!hsNiC69Tm zJQTQPVi$-|HZ3k*uF2wf9oKHDmmo{z*!nn} zy+=V~IbRV_{(`0+0U)Qu z7su&!;<>NRGg%b|OB-(6z~p%T8qLtNpkiu=&o^K9T<{uO3FMY28CRgYlm4&rViq3K zz5c{-f?FwF7Tac<5k7Hf9@i!*KI_;N__vkjhIn?QI^?8s>p1n=qc9iNl4Bt}^jqbp zzdAi`pJOmQLW`@OE$S#sU4~;`p?R7Z<4Fb5l>MnYf_~VGEgAj@HWwVlKq-#ow=l+r z^>7&3BxG}ivNKWr6h|NEDBrz@!!g-`7%lS&wnKtAHhjhg%~7$xD(UJht#c}KKm~fg zM%e1kDQkR>(m6Q06g|02xq=-7fn-2naeIZ{Vs{xiXyerU6Jd&$V!{bJ%l9vM6i2c{ zDbX|e0+Q`uG|7x)c`}q6?R} z8^sBn(DeYh#F>Z_LA747_$iHV&e({5E6@@oJ0a{>OL_1!MFGEKzk;R~WFK>ri)KG-4U$oz5Ix39)4`!GQZiAS}BnwFCcYm9P{hHNF4a*;n{hnR7a;rZ{!MIE5jp zomDRAvU3VtSuy9(7#OlDZx8IFM>*$hcLi-|gzE%NApX3=o4{Mk>So67=UH)%gNMLs z3zYP2%PbNpFY@O(mI8?s#^#S^havj3?liUHe8nNVtu6|>Ylk_jRn5${5&z_SfUN8F z#SeGjOZZK5FRuRTQOYhaV8nS&@c)m%U>);DfxmM?<;&l2Q=9ARg$N&+;)utWV}GXx zyQFYLe>{!F$|N$#?QwvaobBa!PjmOY+-rSzK`t7B|A{OtBkqtfFJ0K}wG{_8D&3Uf z82lVVhn8kg={+SF%{cW8BSAF1r;|=Xm2diH7LmA{EpqwWR$B1e z0GRk-i!5yZC2q@HaiWoIarzyJ9Ygu=ADZ}|gWtMA*mP3T6DvImq^nIK*_Gxh!1nOy z*)smJj>nX`O-|4S_;Jm}W-M2ev!y>#!Lg8Nfo@7#?`*x8ZHfXap0PhoP{Wn6G`)P_ z9j&95;WIt2IY9)QP-Mja(HrX6%_uzx-vi?JpA7!7n~#N|?ouRNrt(W!Mgm6ySz>tWr-be?5*Ig7n=ufouktiEl*#i%DF&;ZmP zFBuFx&d24$RGuHMWboY4wH_-z;@Ov>=0wd5X}KMG58v{vzY*<#Jmj6MXvJBqMcGW@ zO)2o)!RRDWDt5=Z%BLfC>+k?g`gOID$4TWy zh{7a)i5U`du*zZuLipp7U@HO@gJ;FKBgW4~*Ogv8KhHonhTp$K&-#~2vZL|wWRfn= z)W>E~Y&{0u-oW~j)wJukxIu!4`?0UJl zxoRmCQ`BA?Nh(LHlHe?#h)WMVlVkW0YLP&+7Re)2jWBoo?)rhFCzBwhdKzrA}zuux_teK*@_D6t$|7XQ~?aJ@jyI5Y(N`KpbUcT9rYQRsti?VZiUUeoR zd~+h>`fV-Cosz2T9${a`{ov!@xdqW7!o4dub#rKewY?Wh8K$rBXxbKJ!d$`ShNH^U zO1FN-JUWx!&>mp%hrvET$d&|(9__FwRs$_qvBf$@+pv{Q2*&wDys z$RXdqy;s|7AT^6M2LP>10U5_lUMyI0}Ke^`e5FggsZdl%(u zssjw}f-XerIw1)SvaW7^lMVeut1`}3=iOLpKnHt5?m6B)y%e4F#_m9fkRE+O?Cj$$ zlx2GpLC2c(z5e)uFZ@ReM(=t8H12=&*Pw*|hs~sxzR$yA z)8`;5?h2t?TmFAh!OtT##89Z-C)Q7{JgmIk?Tf5(BM=@#-)2U5$lCDQL!j2W!+9an zAu4g8dAx3&&P$(8lkUb3U86YjJr|{Om?1BN`}Z9Yj}!BWbnFJPWy6r|;{={|3C7dx z4YPj(C(w=H0sT{kbI6~a4}z;0 zgX$rODbwCB3sznwj;_XqZ5K|Y@QCq6g7k4!7QC#2V`K81TPEHYLnzXkKVTN=-3UI# z8$p4)f+MkraI;HdN7(H53;lPlJysZJRlz8{MUUx`{ypt!e^uvjj^w@SQkh$Xlms~$ z;ETl?`sK{|N|v1JzB0KXbwye)>To!HFr&t7HuzDyzbg!1awt2FS+*9xh4u@d?&(fv zSG@xa6L@q;P8d)vvJkoR65))jP!yFe(TcVol9zhv9S1S`@QxfE*ik64Q^PkwV~U#P zYJ58R4L6N4QrPJQ5!lWy_v`CgHRpxEELem-_l6V&&9IoudLp-%Q>4AC(gKZMrMdDA zn3aj>cI#^o7CGJGE$k>pYR4e~+eia#T~!3kE}&zF*2(E@q9|duAE^Uj_igL<51%pR zg;YIlNzinaNp(rod^KNKDw}K0fdFT0#4!Gtx>*Y$pKmsdC#D_N{-Y#wk2*|1wO_{^ zN>*yubyQ0* zZYg$@f5VPPzo0C(%6c+qU+|zU17@TYN<(;UNM`N6T`XOt;~*sQv7fvV|9zF| z7u^TDUlXrtMZupy`0=0S&Qm}ZcUDs4OFO1`Rj+=+e`3>jUKHf``q zb1jQO)*2vv5f_WN03#6weG)UORNq3`t(mvua>}YKZ+?tQ!uO8tex}8-OviS-S_>_u zk{aun(V?uU3l;u@+4AQy~OSW=U&{bXS_WIZL`@@g^W7uh#7n*Jf zDKdG|Dqmb(SdoQf^;`du(!*-8zcv1R0o_1Tcf*x;=VV}fuY;>pa zZMd$^t4He2@NL<0XbupKd;eg(*KmPR+eRY!`jzCk&+mOT3qQIW;Ua_+{j1#jNX?E& zRy#y_LJ8o)<^LG!5_4KLqJGa@j(7+y0#HuDZ@mPHy^UYPChrAH_|LH~V_5aV@O# zul~Wd&T-fSGj$qJa;oB&TqL5O;Gl%DGQ!H|jUx~fBolIgH$zVm5Q%ImI0TTQ4Ay~|MhhpD8DJp8I^f3*JK0EiZi?4LIOKhQcQ96;$M z7XWa3_>MvwU!St18&Pseg^ao~#3#1PAuO|Ccws{q$1vUNcY0YD+b2oP znvT-mhMR+Oi2kIOYUtmas3yOON#|ykGhX>UQTH=MSKh@=CJpc%7CUI=tW5tyfIXo_ ziK=25k<70J^w6+|WSUltN#~n0sadF!Bm&c^v@)+--?HN;aCpA4L{xzsbulxgNcc?p z9Z94d2@~N%YN>}@+aQonUrMk#h6lZZtUJtEi5Fm8w|C?fx}gm;&U_wX{|J*OjMd}M z#7rbwZPj!bPHj3sf42_V_{^i-EVtr0kO)(syB|UT#pdUDrQShLRj_xr^PUq7xd5KZ z7H95iNnL`c!*}4UDAIZ(D7v{L-A=9YV~*Ipq%G{T;9piv#c%pD863oYAeH9ao(Xc> zx=k%^Fc)zL$VR>vhx&l{C(H1_rokj*~zto0L>EVgHTu4$-JjJxB?w#5&dsig1~C67;nC8 zHac6w6n+yjHYT=e>vaL*h2l||o+a|_ZvyZ+bZa|#sN`dS>XK*qKplJqPcTc+%y0>w z=V=!%anXb$a;N(JC2UVJa8G~T_q~eIHMZOC>+=M^dPg!)p9hj+7r}r@5`Vx|pj*aQ z-8F0x+`8b5j$XM9%JR(gd*8j}TJG_KHsJ+;H=)E(Mwz=vm@{ zK3^LgIhYR^j`7_{%!M{=eCKWC=qh(ct|X}u%Ed;u`83}^AC+8Q*O8O1YQ7T)h3ujr@JnymI0tT9`4WIRPowDze)9$W8(x%^wI^0lO5 z&tEs&2f(CNqKnq9L{rg`Uyq@PRQ1yIp^0oZ-5DdwJ|DUS0^Z1Mi;?Cevwp5qVVXV* zcePCc+E;i#TO+Vg%j%a)NuP_h7G^REbwEXGR! zo{5MK@iWqDZaLRDb>QOpk6@^zmC{gw{e7P=C{UcDXP^1sUHvmgkE9w|ae9l}ToZjv zhqxMDwN8sAY-+er%gRv2#}mQu3^p!|O*;%`mjKZ;_wWbH^zOu+us9kiPQSE_ z{DU+Wj!NUx#{!z^xT-j{NadPO=M<;G{8q9b*Qbln^vd&a)V926v{g>zw!pIJarw~! zP!Z`}(R^W;m0i@y&0FOC=#gC4srk-n+3K=-`L&0b+7w_tvpWhzya zHr`J`WJ#qXS@z7BrXBXu3Sj|uF{X}Cau6&9M~>|wPe7U^>L1i#IenKoQXdk!Ac?A} zG!=(MQR_+|xYCmjQx(1idaBup$-bmEV3E9n6{^Z3Tn;u=%t zxh<3>Ie5lm%||U`Y8kdv9=^(gmUunOO81ECL&NO?@AdX{&+EtG2cz>E>mlbHvxa#Z zhum*{YkUdAd1kOy8hjy~8l?r=3&~9glR<`NPi{>TTAX{ZONpYEy4Z;^iQF(!z?P+v zInz!Ll|TeDfVbq|y=Zr1;%G$1_1GZ<;>x^Z_CF7z<&}fb6P*I%^Vj)~@7M_7BV0UQ zvO9AujTuAjFP)o8rtp#(ZN??3KM;}W809)o4#9W^=?6cx5Jzhr?%19H~A{| z$7R;!X^sq@3U^J-;psroNgV^4_QO<_XQg1z&28|Zb1?LXdCb`my}n8V5H=a$|KzXV z)!VEr^d*q|&$E61+lbdek%?KJNmBSek8##RyCM0KIm6~+t|x!+ddrp*8A=i}nxC!q z`<3t2*;CJ2r?EbABFOYFs8gJUK$GZku!-&dFTV!&uRzDV8%R9pR znwQzaEKrGj(|c9YBy40rIU{v3hS*{mYbq+<5}d~iOFVCGmP-Y7DXvk77E`)4V1+}l z5@M50$KSj89G0D!QG|g!kWj9AJ6dP9>SJg|yT3jp`)}2p%&k}%e+VXg=#Rp?ZOhU! zG@%%EdDgy@s^k=0w%GQ>mWKV~ccXs!)!M^_^^KEl-CvgulYxl9aa^7C(- z>Wv!-YN&}C?nlJ4ZS0rVe}mT^FPR{HW=Sy;&CnA1Mhy4xmcWZsy)Pa5;y88F+__e_ zxPFTDfX2k@e2E|c29VWOuZP;@+JK}{Ml5(`a2OJK7V#U zbLI_WVC@rgW5EWsk4D2YY>HsH+1y3c+dF|A`AHj__gAb21w=+;Q_!vN^ruOKteLIo zG5xvLK7SZw$Sw%88r0f|;bm1tjMw+M*qFXG7W`iENn_u{k=Q2Z&pG(Q@+afhgMGf7 zt{X_LSC=Ee@kFiYuhgPYj2V%Lwsq^LH zvAr-czmf0FYX6Iteg9`kgS#`D@6#+DKr#g%_W5ffWbCCgV5OY6AQ$@SD|IH}T77|j zrzq__-F}pll~{UYK}fO>iVy*ztD((OQR;;O1e~sO;17<1sfto>pU8Cm`XglEqvEyf zWigN0bh&m(_Y`17+4hQQ-QOIfSVgP)^s@vj{{=jmP-^}_W<rs~WP)DY}gi42|XNIq~$JGJ@QqI|F+wy2^bNY)I-?0@k#!cs+>N{IO0=2uMN!Mo-0X>;J8YOr0BW+Uoi5nl719d+7YjAn zY<Ek zMew5$3=&S4K^9rKt}(_)!Ev@f3eSGyK_|&@G+sQJ6HQ;Ra=kj(Z75>dNMSc$f<=^9 zS!)y1YH|+KVznF~2cJ8n97Nmz21|zW6glZxteZZ{;iunWTW%Lz>b?hPeEYjM0Y!o; zKdN$m2F2DO1b!Y!;Uiz>(i%!I!JjtUzG$2?O|6(7VgTFK_sSd1|A^;o$sXc=URhI~ z2peD=eE990SacB@Mb=EhvhSbnYaz*l5;9Regz1H%MALVf#h6>jJ(~J7KsZL6qmb6Y zQ0D!C85BgG$c`cgXHvrAr9OqWfl(TVzV&T?=W?cmyGD=363TIN8E{SJ)RWzX>ST?>*T&F(;my+c^ z*~4iQ-kpf6Tp@~Eku91Hr1ZSjp-2rJmu^0_s={V{EULXcB4?usSWyk$!|XXfE@I-y z6t>qKXwF!*j<=Q}4gJke5oS!l(sEl1`(779W5!Y#!c-vbnckk~Vx={BPtc*f!Nhk${T%gAMY%41$VPRGa&<)1J*Q5pT-nbkelX}GC&HGff=uUWrJ61^ zxNp|Yua^!Br+%!jz)x?QePc*tlzdv|8`U-F+5mG8XY&?`joJYgw$HA4vVYHROy;6P z1L2G_C!?cNH<|B#tp<_&m&eE1I%WzQWV04*Gq5~de;+gA6vPzt((WPtT%P?z)Slc- zC0uoaCpmQrE=QPnzoOH=*?g-a72Vg>S4iobel@xqwlGoY0=W9pGS}8rA3|DYKEM_= zb*%Te(7#A-$RhcOZAh%yArvcaCq*ane~Vyk-Jbp+>q^Lr*^Wv&eeb;QttIDep_hqZ z#et%n3DrFEd!DNId*%0@@akrdPK+1cW|mhP)OceEI^Q(`{tg(yX<>>ZSM?m8i1a)Q z>lYr+KiB3K0?r;E<41;pCfJUm4ou^o;m>u;<2VqGv5P9m%D6q%Ioo)66+zv`HH5(^ zMuTbbH+ZxQy~r=<(Ic!yJ5W%!H_4*;MHkdcxI?fAn8}0G0V;$4=&=T5zZTV15#i6!EIcJy8+ai;f!|@tZ+Oaty3A0OwMGj2q0EZG z?r(5~x{+N$^a>tVy@bfQ(FNv4O{ziHP+6wQFr6#mMV8^qD#1GrSQ~stT2mL~)+13& zn^DAvRZ{5qxIzwzw460c_-hXsM+PE~#{yWRT^J!oRK)1E$cRaJ38!Ks2+S~d8KP~X z?S@v+K$#H7(Am4Fbn2WGHtm>k+7HeH&OsMCchRNmPV(>pSDn;TQ-^*raJzA0KvGdv zrK$~|*W6n4xrctJy6wREDT`sY zX!W>!YsKB$d1d{WeJwFK#ke*J!nkg+@splMY;QI}hm3QV9;b?{rhWl|tXwYH4rPq7 z0@k|iODgc!jt1{{bwUOL)yV~yozdKylDSP`XGpu9X7-|}4}75wYIgCE3@e0~h#JWZ zkgrCj=1UpD=Htp;NhUVF_h?$*d4Xz7Ab-WP$+{DQ_=*zJUyUa{rxUnX0JSW(=4L}S zyY*+eCFjKu1Y6b^+>Lsl`_HKCdiWEft=u->R;{M_V@Ut!{e<5a2TlX0D)Br4HFSDPMP0Qt|s9y!kljclqyd zAq|YB*&S7uN^uE|=Z8A(PIRy?Uz&6^)*~i_hvZe74t(XX5xWWY((88Sua)FFh5l}< z`{z>Ch>*sloX73;%1Xjt(3UJmHs-nFF}LdReJZ%%5Y3>hrR=D24)-sz>P^X z+o7ulT5**KyyC5k{jAeGcUc@hJ2mS9{k8#FY-`)3wgK5XLp8w91YP`@S(NcJpmI}lJ7f*V6%FLv` zVJ;7izZ`j`aM8wVC)L9)BK8U_5aF>>5bt;?PQsg1vQp~qT}XDvwlGPp0WhqLHZ#~! zOxp|z3Q1MX+s#*^Y-J_;uV&4Ef)lySUFi+-<9J1pbPxnvn0jf9YkwtISH>8M;T9i6 zm%MlPIr1}UF@x)TzQn5n`{pi zTD=c=)wv4#`lqmR`nnZ>jz*&V5bwiO=Ui20_=ashT?I2%fl*+Cquw{eXpdg{7&-Ji zK#4sRe0`zsCD2RNdl>eR^X}kbV>swHWNHzY=$`V5N-lw|aAj=dcMH6ZO$)fSnH+xQ z84c~l53Hf0O{RIfaWPALZHpM=P@O06YMK|)0FDUVzPwlp^j=7yiH?oVn$5wAVNRjn zm0Xs55#Z*t0hF#{D7Y30*e+v2R3c|32>Z}~*{qzLsM#*puS-n)lAm1_AQGH% z&qaWl_;K;1Q=u1Sw$xMIcq6~Kc_vvNfr$Tp9xUCwrIDVUbpwl@gPoyJBB$^X*jT`h%R_QnVRN3eyOCflua+X48 z_rUwx(}z0;D(Ym9d<5M!A6jYs8%XB48*{9n99?g``)oq8f-e-s`7>nvbw7ak(vvo z?*vvVgrOX`%*D-Aq_Iu@M!6j&s45tU564l?-}l%%rv40RiCMfMtL72yF6_rnx=6xG z*0Rw_q_pEEtAs~N5Jc4Q%`_@e&i%pvDj-%7Y7~ckhE4jnArUGCKvSuVehsQFoIYk_;T4z~JMxT;|WEkHt z;_rxHhq}tg)9MdY;?b6KqrK6?OM$0u-nFaRvxdj6Zx&+Y#8pkEs--XOP_EBB;e7Jy zc~-)p#YB@`hHzAe1z%K_cT?oh2=N)~viXf{ek@sD7yLyHf&{6`M*J{b1* z5(RWCszL-co+!Eko5w6iWs*~lvTA3=*NM{yKd%wLX45#)PEE^zk=h8x!hi#w6^8`- zVPck%-5Ob!h_>>IsV#asarbN~Jx=;1#h6#%KJUh^v2%KvLgh$f%G8q|^ejko?GXAb z5FFjDK!Oi;RdRFq1InG1zJkQwny^nR)2tc&oCA zH@Qtig-QHOIg*I_xl+b(GOoxtofpeU@Wgs4NaXcotV324%>4j^agi8Zd-7RXw{yUFA3h6bYYIcIypLdV*BtC z?Cgxey7QAjrpQQz`NZ*jTPG&s7zda(FKboi5s#|UKHtU=ui&Z0;C>5jHMoN;ZLWHQ zHYfhyQjC%&Jnb=MxND>xP>C6d#&HElA)~M?nVIYpF7mjw>{hwTE#`Pg${pam>72va z-bOnImXB>APHw1UIa(HbUjVWw=%za;g;+t1?%-m6o1VTEjwP+oVa~rAa%uVf-V;of zwQnF`8#WV9>U1r*BpwZmq|i_Cto|D%d@%_UxKIRU1Gio>lRS$qfLMmEU)jO~88}Eh zOV@uuJ3()PuF{t>G?3u_jxAf5FPJVKbklvbC7weR?Lg$NIsbAjm7+6|eA#9oxDx{S@i#tZCoCw(hmmgp)-T+;oa&k0-Fgkgg+F~&0jHp%{U8J{e^G*dS480-O;?ohpEG%){*3=GS|=c zk&9DRTL@REwx`c)le^Vr*9Saq)Mwl9mpW#!kIUdazxCb$8(Y0TTvN-Q$m{W3e**IY zR0D^s@-Ll9<2JtygAU*%aL2-G`!F<^)${DQJH9<`zZ?1dK-?sln${9F7URy$bxNI4 zBdPQ4j9exk*dwOiZ+w#fh5B@7??W;CYTv7SB#5oXk6zfEcR-dWqY){7u}Everj>WSXQ}I(W!)p-fh=%#;fH z9L8RtuB4aT;tOvtb#h9XhDI|-p=_Afvivgx%KlG)4gx;l$~73}sNdV^m`Wj#0h`S3Xk3M6P^Va558d{+EMOsoBOqUj+7F2quLwr3S9^34=^`vs8 zyHUizs+Mufkj<@k-A&)wPFwALa)KpGS*yttzI(kFTgH1=mTmx;NOQ^UqJ)X13j`=U zW@S>kD|91qkxOla{{jT)P{vPBaG_tnaTia)kpun50xA1VyY) z#j#90E|GG$&u$rd6ODhkVdHf5=ue&w%T90O*eWb$pAY7J^B6H9(12KRNPe1qs<*KCW} zHas`ZO{tq+_r?gRF4_>rfV#We3BGCI+~+yNmUUd4OfKSwLlG*hS^|$Lbr4dGJ#&Ld zI!Yw6+}#H4md}xWvLC)*Pq7HTUk8FYy?6!cR6n!1W5XyUb1V18ZtTC*6q#Tyb4sXi zQs_^7Z+YWyW|XKUyY7sD9Nper zE1L{WesE1f^%mxFA=;B@w)DjC{ODfmvEL(807${H-6Lyc9@1mpR;@rl;!$7$z9jfx zVAgic5B94U7tDchK5l#*{7GT*!0Wt0MI$T`zdUyu2<@FyCHI`DjkC~8fL#>{zsGBq)zQev9b$+B zqR@>@<|)e=k1;`9WY||hDQ^t2a|ASGyTA~6Nv2>~DX!xo8h@|CI4T0bdL84yiu&g{EN zRl%H>Xq>m(Lr>MbbQ%67mC^=UkEYlqqH2x*0iV89O7zM_T*|K?45-qQWZGpv3KW$X zk+9V=AIP<=ysNv55P-7JDSaFB3oZ)Rq%i80uYC9Le8S`1EAjg+ad-gv|3GiaBi8L> zLeaTM;zFS+$lR3vHCvS~6^EtgvGG_EwXvfp_}zT50;a6Qi4F8TCM(fX7{iZS7+OCf zC4}-I^3unu5c;$B79XN1QU8_M(*5x~dqJgw3tsagPjXKO_A8IcG6nyy{ZWSfxU7(fExMS|@al*v`uu+a2< z>cSin-T32wKqJQ_%Z6{NMey=SB6-xr7KF!~9HS?~f>ilLaMmxG#WhVEr*^JI=g@y8 zTCfPEODBQ@slnMYRsOgV;xxBQp38WJ?dV8ZtY_8nY9{V=0e z_O3NKEf_Z;lBbG$->#ZJ$6oS?hfx>iC1~sqm0NyMida?BQ?*Kl<$SfbxeYA-ZibXa zrmMfzy)s&;Bi_MLEffW;aE>#-sU1$QC1Jk^tsG7g&>`;FL$V;EuX-lxc&jFXp*=S3 z$?&-mJ8ZrVF@rX*dewbKFQ4`@;*w^S&dF0%#!%ZBId?jv{t>)lK=xc_RLNvN;TQ&a zGm!MliK#H8|E13TCWtq&tj)BE%LPucSK}HRyr6lii|C4TJh0!$Q z+=@;W$T03%U3_buskpSj3tBSL*u(!9f(M!-QO~&?Bq=xP#WoP(KlJY**F#O)u3lw) z@tV@_terrGCn?r;*Mu`NeCl45-ZO64L}H!wnoiC>rXuF`RKtGEQ5@5vOYR)ZKtUXT zx^JXWe>a}Bhp|B^TPtEc=2w74)MZ`{|FUM;MI3uUY^w!H~D!B`V(X_S;iWV8QK5p1w+JP1h=KQ zT7}w?NKs{eKR%V`!jfcURjc+#>R|MKTkzYH^zD#TK7W%ONyqsq`^(|{-UIKJH;J~Y zII8fUfF`)KolXhAJ0Cs_^_qlkRhTp)V9yIj<7z{_94kp<*eWn7ZFsW$LJ{)9hSj-c zzEZMb0kdMbISUR2CqJqsIw0h{&PZW3)K0sD(aTB0$u|PYX0+vsv`q222q+g-FE!H1%d?9WYD8nr#fdW;E-{( z#p;80ZRbu!!wA28jx7|;kWFuAMd?5on^ddLL(Qx5u&4O+xZn$GpByA20CG@Z+1CLw zzK~_qhho7f*YM59OLeQ}-~I*MfH}^K6`y=(x<=EVTeLRUPt|SrZvzD7~ zgTgW>=dT16#FH#YKUK<~uLD280oq`4352Tc4&|+JFBtBD4PF!T&!i~aTUJvICSg(u zcD7duF!3CRLcM(eneWTm zw>|3K$C|1m_BKz!dFqG?p-!fI$4>KiH*@R)uDyL-G1+W>P=j@xA4D?b`7I6us){N!Kk&3Y$Ts`ZY@)hp(Q|uV#Y!-83%@CtO3^f-aWE?I0s=%0Yn`5>Fb2fh&RLMb~CC-`4oA zLf#hHcld1UA=LjCEORKxAjO)NEsl`ZtRQl=RKZLSXYvapcm9 z2{kBZsue4za}RXRcakre2f-({|BdQTRkt;u;Hj$n1VaOJy-XMak)pSM1i}$l@7g%#*Xl7vQaP1`)4|J}9| zA}AEr-M_EQM%@Zy%la#`NjTP*F)RPtHa%Rco&Kf%q81-xAJg{{smYi^?OAF1&A?Iu z@IQ~ad0Zej2o_@u7acH9FLG<4jG)Y@*n^Tzdk{-YMfJE;JsMAfXtKg`GwiPYoy0tN zMeH575%Jlgh8@|U+k8{ek2iHw2#`FcLa$HM6mxeIPV7cSOh8rV#_Mf4x~+{uz&9a5 zXC2)+5Uob`Ot&4QfB-?S4*v{F> zzy~yO4iqfLcFUWMN*1!ojP?%ShLWx&+RhC@2hB`$&1OCoJsmCfL>3S*$z#N87Sdwd zT`LCYXHTRhylAK6&Q<~GSB@AdTmK|vOp~dU6CVI{XqNVE!?Km3F5%vzk@6ChhfusVK)cV z0hK1mp{!lyg^Z1{%2#NO_thn5+2803C7rZ%e1p!nu@>7}=7(@I)It!zo1L495tqWq zwcsT6vV-m<5_?htOACYSP5Lu+Ra34G zoAXd&o-jI$&`uZr&}>^Z`a@p?N{NwIJ?q=vlLPWm$I-^9B*_|d^DV2zoyU0%(b9D9 z2BVN2)JyaG-yCRIFAfLbEP!WfPq52nfa6-P5NVdI`q%$@>%&{GD#v2}lm6{?>qloMCTbW#WHsGKU$q$6>FwfOn}sPkK036w?G9yukN;d zx-6;w{rK4x#uPp$1WdbOD=cAds9rHNaZ(Z;k`8o`Xr1{0BQk^7n6n48!-nj2=BLsYOI zU*U52Bh#-|j7`;nJ`*W9F&~D{ z8T#VOfVL6jvcaqflsog^L@(|$kB=8$*xl?B$|5?=0}(y@3rR@71et{Pr|d~uLn`_| z6J$1KMulcwT1pYuDgf{k>A(4UNsU8?0nFte*_ah17U@TztOYE@mNnk`WfLVKQ>q@* z9)${oYSAyrTYM%4s!3HhdbFH+@F~VMHE*mmj8>U5cX;u|(?25?+5ZtTWn4u&cir=s zoX0k@1H=7iDOEIk|FVgRBG%ugCgdHr?y3k28S=*#blP9UIL^=N;&|5L>4clpiQTP8 zBbX{zJn1>{OUL2Wl}{Kjx4OTVw_a3m=A@H!8OrF^D&71)RJ{XpWnBYp-ATu`JGO1x zwr$(HJ9av@?T(#}opfy5HgBHy)~&C;e{ibyJgd%LXU;L`>3p-VNG7GjOXT9_{Z47x zB!l^y+=K?ucNazVZkJx^KRk2$`T+ToG z+)uAq%X0=y)p`r}d;Fc7r~qq%{oCFDb^hDo$UeBG5h1ovZ%CZn{U;a3-p->3D}84vc5I-(?yz zRpiL-evAoL*ght8lPZ^n0e$v_cttww;X z+v*C-vWne#3MaJ*r;^TYG=u~Bx48>u=My|n8PTP8R?Ga)0DI}}e9uLL(BAgZ%k=LM zj0*@^eUnxi3CHNT^V@D%){KuJVe3@cDI_Z|_uagX^Fz2Ri;Ty89kz^2%TLP$c;CnK z5jhD!Hal`aZD`dz%*tC2=BWj^cGSLpft(3WA5t&UNzzef-s(T)>eLEQHuYB z+%>+NHT9Ih&aV`A#G)nyAON1jQx=xTZfk=!x-xze8(fDzkZ)`1g~E`TJgj*7Vsvm4 zt?pY~oT4E)BtwvY+&z^-r@58KA+~w3d}ac7oN74XZu5k-p$NFV{BIDuw%lMpre_YH zHJ{jD5C?Ep?N>P;)(v_`f6+v>AGFyymjcgSbI$>Fe0J`f?mX#vG{`E`ZpWvtn0 zAFnsW(jB992^TK|7$Yv*tvMur1t!(CN?1ab@D7l`Quio{Rq93v@jqsG&Pca$c4(sr zQ~hZd>W#h9`NgLNHs4PdkAC<*uGS<(nu3r7%$PDuCxB~XcnxPG@MM9C{GmkYg6`!- zKq|Qwu{mPu-{UQ5`T{ThJytL|SdO;jr?}v0-&E9-Tj?kt$2SJ=w|zM{Rkv_+9wEIX&w2n2So_mW^X5YNCn~4 z%y7RZ?I`l4Zb-@!fUaPCf+=hG>=ZkNGTHjpZmffgB4>_(Ks>PLVd7~s{2fw818+|? zLMtkNCA?V0zQ7APZVS8W&u3I}GbDX%VsUB9opxQFoLaF#w zc&?I(LZ0h)p|e^Acr#Gby$Y)s-gn8qwTLlVTG_NcAT=?^HA>QM$n->Go}=vf^W-ol z$yZEt`~rXl9Q;L~R{9{?Do3IoCB=(i@4)fRCSy(!R$MeMU+5jm4Uyaqdj1*^pmrh}K3uhc{-(ZO6nax? zpwvH8-PR8D4lD#A<^JnDYN^_PvH>~Rpm4hbhJ;1T%m`rFf{HQ~4zN1thV;G9x;RtN zr}=7jS9YxxR*l+c_wbOa(8JL58?s}z%<bCJcW3Z%^~w9%SCeHcG>~si#JR%;>wGhTYZg?9lIl!I==v@Ck1Tv9 zXpPQHO$Q7|ZzBGOcpiGFKtW$Tgqnn_wXE^yNvT8X4dSc z%TAgwU%P1Zoceul`c;;+`l_i3RosLICk`zOa)Zg`;!rIsq-6}tMk5{IfH_%hUZ!aK zH2_Ydu-@;Es@|D9X35PdianhGF zu2)xDr7I+@$8r_r>vZWK8ctXkdPv9ClRSGyq|5~)lKGGNz#%;0ahRIC%5%6vcD%6Uxr!ra8wNdJ$05=A{1Dy&wpqJ z%SKOwGA(mG?ELHu#8H{f^1gphKS$w{v{gF_>Q1U7JnFU@72s@B_K5 z7%2~iX`@IP?>hlr8!U%#khNWOVDB*sw!bgEzmP+WTGV+SHXFZk*hH0%fx*wHC-g4u z{TQv{^^7OAN*e@^itg7)%vdbbM}8jhpCh70iw;4$1=u1w39>#xi{ga-<6Q**544vD z&S$BCw5Udje|OfXII}Fp@kdU?oH*hPXtrDFi_muk=(pp%zHW#gV?VZ%R#5TX2#2)- z#H{xEP%o<^s+`*>9&n)350{#2D?&W_PjB1<$&xrSUIws*YXd8CDw)ulq{TkmUX!#Z zj2kN`T|3=J8a0JjRMV}%qq950CK zrF{MiTn$7i_?3+889v_->GfW83>**9&knv}RtJs;<^BDsHlo9%JsjF7Gm+z6tC;CA*q|}Z1Fi^;FSGc9=&*6tlcj5o^^ zb}hTb5oXPMVkcMnO)>7}t{Le&Sil zub{}vrjJD?UV#;m?NU}@!roDX`w+traU$tXUDgu|=YQkDiBkA<8aCi!3v8oZB>{Yi z!Mq@NhB^%YGM2YCJNc39+lVzzVgpjwp!O3b*R!-bMY1vG zeOTSAmufXa7In=s?-RNC+6rP=Dfc;B&`Y)S9b)lSVbZa`oQnL)(U?X&BB0E=?{;AE z*_41)QY+Fl)Np!PLp?OD96(+=5NI^2y(Ig28R#OJ-E1&7UCG*BFT&}!o_Ucbeac)S z*O&W*h-kvxs;iszsp*e+c<2GU=(Y(L4f`voIK3kIAaA#?AnoG{N;E)Dr{8{J+OEtR zBT_E1nvL-mf?A>;Y@R^n2WCtR#CS-3R%6ZjkLK7O+F#`;c%bh(PAjeJn!u&P>RGBO zN;9In$vcGK*NXZJ-1@a_Xt6BHkTsPTQmD8rt*V{4<xEc@PwdhKJqp}KZk`D zg|-M?9e1}DdfEdSKIuxWBBh9*YbuLWS;si*s63s>%D^iG>M4?c>vGwT;SycA5v%%%N|yA220!0Vik%jEH8JT1XoJ29zuNIo9<%9koDN}{hNEwA?IH}Yf2-Hq&YwSPHT_rBI)41&@T z3J{HQearwvgpHi$_EC6Q7K?~2gto4GS9yb3;V=9xC?D-k)OZXkqLe-lX|%F$IG*sz zc1RU-h#>|b`n#A)SDeDw0LQM1Z0h>K=+9kCJzV4~OMM3?tI*mfKi8<0zZmBy1L#;C zNDl`fe1xjAooi#9`yL2Ip(?-gp)Rf@kn3pSgoR)D?uw-M?L23Ozov7@&rk&C27E%z z?mrOAS2My%IG22?@zii8vHClNC1Er)$PD?s+CIRY!k&Jr+4S8E_tVc^dFFSqq~t3j z5Wai6&iA+$DS$tkcGm%gT>{gyC{8vWH4!MvcLeUIFvVpph28tao1sv5eCXP<)c%eL zX-n|9N$?vMnS@1(de{nOsPrW}#VUvs^_fbs=%~+A-t6<4ONPbB+M?w*Z}cB`ZxItx z-D=P%!%v6qel2s%h%+!o$0J}v?SUmm_!knczLku=Le6t=;V z-0!@6#xSdCk~?4p3@}Cg!_P2;w55}cupEHBoy+0+3K?7en|cb;btsaVK&Vhk)oKjBLNJkY-inhQp<5l zWNBquN8uM3{8Pm<(ZA8Ieh%G0j&f{ousxiN8zC?KN1P{BgXkOnHI8R(^}xyupgWGL1W@1s?*K} z8W3Cv-&u^+SS!qtq!+cnzr9*qswg^^5j0;3c?Iq5__PLgruOMW;%Rajgbw7u^N&7r z(XJY?;3-@bt>c+&-)o3d+3QjA?xQhp&rn$)atgbrC5FL^Iryw0^tROObe6n=wW zV-&@ENEkWAr$pSR2LQ8@ihTX|)a)GZxI0!({6hf|_0KnP@OewwDIN=0H$}>Wbr*(& zA>W#-4nj^S#?Z27%lXmZc02s$g$=a~F+_c&;+(xnsvqf{=C#1S=z!2_!F-65$Yi() zG2)xg4?c^T=HylILmC2BnzE!1#sHd$f2ffHrH}0w z023lF#|i2{qJqPhux#M+1I;B2O@}x%o|q^q5KTo05lz*p0j+9r*SqMxdRf4VHt}+D z$x0=GJRdsjsX_nztYh=`w&Qb3RSpSln2ZG~&rRI1+0ibLy)|q{uolOzkF$5DzQzUM zSfrUWP}tPJ0jT6Rbi-$q=7PCM(y2Ll-c zJRo}>{cmiK_G0iYR(f=5en-mBR!@#p9%&e%ImFidVi}_0>@5-~0u_I1iE(Lo;vr-Y=F4kUX}F%sQ>((Gk7{8H>D> z9F#Nf1^jQ7H+B$XlRMJKwHu6F<i@5WJTaVWD3dPsKS z*nx}v>C9_gt|gTM-Mt1(m~}v=<@5lo3zFN>e+~JCB6~$sL zf5p(B(Rxk?SH(K4!}*FB8k@PRjLsV`9z1`36=L;5FH_NcBXxCx`eBH|ydt_&W)wOA zcyj!Uw3$)w5Vc`Sex%|K7t*de$?g_{UaAsh#s%i(+y;_`A=4n~AfCj%lvQx!R%i zg(-Zu8&6(rx!1`f=uDkO`7iMKEE^V(lH4_#p3%yBXbge{{^%5)R{q8~xBU(Lv5k`i z(W1=Io_{4L5~dnEcDjvZs69pWhYW%OtwVW+a81z@$fE$kkX3x<*L3l{r<+p5(_jy}0%N0M@}@N>vf1wqWHcbtH{AYVb(H8E>Ffv2Ixk zw~YsSq|iOCtNmE}EhD2lGjrU7y!p|7H>gx`eul*KSEo|P&Vo@(JJw!+X<(03@E`98 zIqXG5_nNu=C-3}0&aQMcmzmNfO=|N7mJQ{={#GO=!XwEnuwtjiD#pvUNJ(3q%yaa% zg7nYM_C%b>tq!7v)~OIv_;7$8%(J1kTA!AIamhPW=HVRUeJ;(y7UVHX6`b-zfPo*Z z(7CoUI-om#_L@)5XVtaL3cg_asB(Ex4{K(a(k_Rp(MmHHhH>jhwyFf-Ng zg*((PpSZujA43|~!dw&#=i<=IK@U2_OyQpbWyd*C7DM}Cf zG@1_}RX6->FH~KX>UG?2IwGh2Qe@U&r9B_}X z5mDUMG+z=R86nKj$zYU(3W#`_BR%OaSpDhARnw49sERlFx5&X$gxdL#+MqYNcBJ04qC^d23DCeDivOC zWDpcMwBo=9(z#t{gzjTeqoeJZyE|^)hezh+R`EQBv-BGii^E2T?^`7THI%y`*Yr=} z|Gb2aMWFS*sARtgxv<12bMJiO0EftTOs~Sb^PTq}dfhwgKe{ln6~_v@X$Fn-aA3Vq zz=A;%(epQiL~WFdv3D_CnH!T(_pADpoLU3T?;)%osoit0I}3=_t=~|gK84PV)apIP z82ZjiqmU=jfe^k%G zwV4bgvv4;s$(5netAaPWHT8G(MKg$qv8fi6d7D3UkDn@3;WvnS;*}yjV#6H95a$d* zHD5y?*1lR}7f?$3j=MNR0zhrstZB5*pXg}vsHxCm+8R*!rm0?ZH*vsHA95|ZD@>@-o~P0WIR2i7)osG(&@=6bDoq0SDsH%nWxvofrdNd&X&2s`4S|T zTPZN`H24y~f8J*E(KIvbQK&qVwHZ*4xNwj{KLRBbnYVZnt zeyQIEzREp(o=Y)p(8lOOMn_&e2;v&`T4yUW0w+j++t<6>e}UcfzIL7=9GHKr9ww`o zL^-V5>bfovYBnfF1JH1%um|H<4;dTs1WqsyD{K>P;p*M=4OBzdV5?4qC21uNopQhR zylgsnn4Pg!e*r`ArCXeP$%^E54i^h*0-AKpm+93L&4+-H|TQQ{S3U zPWa=e*xN;u+SCZ{=CzMQV=c$nQj(&R#P6pq(hzRfM+E%wI@6i?_Ft|j%IH~25A7N9&3!F^AfgHwXwu$1!)0d|RI^YRMxz>X9(j!T zE!!pN%*k^lvi!ZIkX6trV%cV4Mzep#edIueOK0~0Fy`_+?e;~ipiP>Nf$UYH)R@H^-vESY^b`RRfTw;(2K%!J5FKb2h#=K=%}0g6_RGBOirv7Zus^P=6fX;wpbYDb_Z`U+N$0~(N<*fLM@8AbkpnC- zw@;Gvq@G=G-ZbSMZ_Zl0ZEzARE6XO62E8Pr?CvL}dlpi(Frf0F$+N!AbKBX_&YpxC zYBqW{#UH(_-z?U-N*>#Aij(~SaNcT>*@*b!-NQ!7=X4EAqHMaRmF{$|h3_?Z=BgA&+(bkmC z7;69((g}GI4$MQr3kSt)*_3y7I@)R5ep9jp!p6^@%Q6+Eb7z{HMfM|{D6^^e1i~w3 z<``juMO+NWtFRr9#8?iD5OT(hiLF~q&R@K-{PyS&W-|kx71{zeaRgC$27qQ{l*yFW zEl;A|RAuHMK1J5b6SD=4SVz$b7(=tFkKb$Q$FKe&%Z{2PRS~;56bvi)$Rn{-1lxow z&o>;#!4~;k%eL#*Waq_;+>@F$`v8%F>Hq6nv9cB zp12YJCL1YKIuP$>G(HTfq_ z$2mCu5K}1_s$l&;D_#Z6oc@U49`A@2g^2Hu7TfT#KP{;}Ie~n*;w&)vRr8X}Sjf*a}_$iWeXIMy65WC$m70OIRDwdF^qCxj2$3J=EkE2UtNsje}vf4kW146(--A3 zAO2m9mJXGd1P(AIYpCKd2am&mB1fY_)PhthK7oR;J6w*497vJA2ea*Q=f*UI2d<2C zkxHP1aVrJOVsd7&NJ~$cvy@cJhF_=~Wp6pxcNL*Efq;>opp_C+2xcMs^%Cg&|8rABG-;5WdQ@kXUa_*)p?>+Sb1pkg5J5k z7oW05`MY;Jq!*}lW-Be^Xhn~b@>!Si5EnAd@}9xti-6;MYE4A20CY9&AE@2@D6Z68 zFgEp@2Y7S3i;V`}R0EeO@Tw;AmqGa9i2_glq+%UX8v%!f3!Lb#WOb6M-owr^${WU- zc`;SBQb0(;D0>Q@sDt8?vqAc~9%+w@Xsyq`>7M1wf-c>622eblex^{ThSmahm%Ims zUGZ36*nPY`J2FKwQIjU;p`LHoiM8a5pYc>`Aa0@nMm$drj^6+9eqWmU4n(#%OF ztlp*a?P+b)LTJ6U{I28Yd_3Blz(`gwN3NdfJX`;%l$PIkMiS`_&b|F9~@td%2)r8{O68> zSKF|IKp2nkM%2cS1mvgZ(=|tvKOlc7uJ(z&T-+71oFpBXm9-u~4PRJEx za;{4oM6HS4G&IP%R(IFN?*0$^)(?EyIR*;msP$)@O6U~i7DL=a(4r`eV}JCMeRy*J zMY1AygiVU3L)*`^qo`^LclxpdgB+TLJNPm`1UH=}eOF(!u!_mbD-E_`IgsvNHynB2>^fMH3iJ?(SsE32b{5@DO@izCDy>!4W1D z4ddbXtVVcUrYCtadJDEWdU+m4SYWBOt=KUBJe1S$eR8x0U)cn>oy=M74QHuX%bM~Zkg0~vDXjF* z&w6}SvbTiN%dkbn~$&Q z^8crGp3;;iX|}&;JuP zM$Z~5CM0bEkkxEk)NA!m1}%d}DGFC|&vSNYZOu&E1!||krHnHJr6I@uOwczbh8H&N zMGC^8E+{i@3Av5``f*|hRE(82vi1(U9Z?wZp)9J~aVc;z^ zd~wlB>T_vjJU@p4wkD%#$O`2=&f>?R%`gw?yr36elS3EtIPdYBk^IHq@Zo8+K{#8P zHytdLek&EjgP0n}o`cVbTGg|lO~HA!g6rXK*EJxWgAIbO94E~HMW8XisobSbEWhj7 zNVf0yB<276Wv@1HN(ARI#8_}uJWJZHz8DLwCbGgVz!z7ajQ--&%hOMYfBKlUTP4)h z${Dz}Nq9W+dORN2Yhe#2Q(D_23p=aBXtXqbS&JCuQ+MFww?Xqb9Wv@Vc@_|b&lC_5 z`_W1W5N}}BfILU#iZ|7T7R`h{a-&Kzusn1w&el{5gX)@t%}6nJnZq)U1pI34dC1-X zjnsr%<<=AUy=OEGxpQc^VFFFxzPf3FRyQx{AcjSO!SNQIbxy5E@m}gOPxvkpQOEUE zR4WVh%`r0Vhsa+7*(ZD+xW9&uiD^1UcWk`VdXT}Kf!TOM?5<`rx`7Hx7Sq#+dw30x ztLnWVkt(KsM$gx+JY$cW&sqGT$tJ81K5Gd-JQ-=38Mjl$HFI>KF1`}RVf-kKa2ZD$ zFag&Bx@H?q>C^QUox#VNK(<6ET@XP26r|Z3@#_|EBkUo-QsSM{3)y!1%O2U)2)1qa zk>M8s5T?oo5FoEXB;@+IKH#>Iq(@mctAho(p%3wVUqkXVjXi@dQZf1(Ai=%+{}oOQ zCP#v?;l`R6G}IG*Gz&6&byxJ|*E2b&k0#@QF8K7jDQYh!qci$C1yH=bFQp#0RWyV1 zOOhC z{l*bhO-`9Zg7FvjH>$E(G=%Yh^F4fnLm)-eChtE#=X*!66hX_3YDn+?*YY~3vmWm%ETNwH@5zorSuJBSk(tecS@0H&E{Xl>`c(e3j9`P%Y&NwJ`+Myw zgXTZ$Rh)QHTL8IWS=)ujH-M@`SW}lF`*?V|L>mJmNtVX=Dvm7YYxsiaffF^$J`crK z7e=I*qyVRrlYh657Lzb2$s1eeY(oG5_cJ%jZ91N}tTc~t>0|E$+??YeKllbgI=Q>A zLDEBw3rx;ir2D({DE0lWC3i+_O~MQwOyK~PwwgDN9RFdMGe$xvNp{)(8ub0}09}gj z+`p*#Xhpu7gLB0YhgxfB@eFOXLzT_jT~FUTHI*Dz*^&GgYYZVV<2iV=lHss`vsSSg za!CVa5~t=+Mn=of~F+kkte6rHkShEe?lFa@_ouLy1bykPz@e9BRRWi@1CPHtn3q%6^}KDK=XySArWL>xb#hi3NJpaKYd=`zk7S| zeYkHTnxHverHwO^#XYbiy&R6;!6WT9K_~}F#87QTs(k(T%Z_aS&Iz9Y^|+?8LMynw zwU;VfnYgN5wCShmO8EXdw|<>zv_Nf&6bBd{po8`yg~{|9=@|YmI5(rF_B$yuD0be$ z0~f#p#ZQHp6IRGQt@MxLBLYI@82nqs*Ll3eT!Py?#}%L8etZt} z$c}K@>BDrX=4j)|?L37p@#PPD<%#;TixD--5CUqJ*Z1`N=sIE9N=*##O|bWd+WzWB zpst}v!4Jlb6zU^as{2VSbzHN$N`O7c;Kx|g=+f)MHsUvUcIH`{CaT2f7Pkz0oIu2} zq-jaWq1CaoK`j_JU6N^kX$VWt1&IV`)1m1ANe{?}EW!oF_8r~DJGm?7^DuEJkoaY7V2is1IxDyvc4)cxY1~m z=8SYp;%KtA=YX2ie)t2@M>1TqMvNY^Qye>sc$2E#aM<@%!efSR%FqS z=%kP!V6N--jvo*R35Xswa{xGmmgE&TUaoL%8yDe~xLO$F4R1q(Pc~ zKRo-GR|8(6o4rvY0oG6Sg>3J4#U0yQZ==#cg(@fpD(1%mJeTlNX6IbS&enuH33L0+ znrx1pUTbbsGmV)Catm)B7nTsjG2DZDeeL=u0)4zrN%W^9Kjo@0nQ=v+8b&#_p%pgu znHM6S=KE?LksfmHOUpK(BctjTaDn8$jv!uee1Eq(k+SS=9_ce5p@%$ZB^v6eFcz

}XR?3CId-V^b{{I7*$aoznS#s=9BK|8pzN!EarB1fcp7rx?qr&toV+OD;d4s+_e zDt46xG;(RlMe@Q*!Abf+WZe&d+H;4H1i=ePTrHiC5O_l{h#u=S!vLe6pXVmSfZ2i)9kBV3Wf%$~(vW zx`|&7=k2DS1%TKoPh0<|W?s}-3&mJ9#QJ&xy%!$Vlz5y;Dt5SKjBrkZLen}L?K7JA zt57$);#5v?d~%fO@^5}IcwK9dos!i9ipr}bsOGJQcmfbG2WRn(HEk6vy~ucPTlTNe zA>yCtS_{LTAdTKY|&=5&j*0{H;4{H`F@TK62n0zDa#C z!%7XJ7e+@co18=E&hq0yObPeqs>QdfM%^QJtYrVTrUcq|fGpWGi&-B-mb#BEC?tF< zkKKbVVi34(9Nb`g9U`P%t!za34oT!;>=9DZa0*pjS+Q7qh155?tvay4^P$&@q;QUg zGQRzo17~l9tirx3UyK=fI_mrvHnq-yUd~uX3L%QTG-p01CfDjG4DJD z6U$o45Q}xk`3Tpdn^hZ8bf{-gyw$Q1PmYF8;X5EbcAI&tPc_ES{-ZUqQH0*T$NFp5 zi<#zO#qdvbM?i1(B=7v($jvDk5k)Ne48aHHY{McKtr#U2HHg#-hfFEVnZ~-gk?nU>G2)+ zo6gW+^P(=j?Ke8bIb;!5oK~(dp9ZfJ+R7@&e?z9zjO#5i$TefmytXBaUnN-&E4<+h zRy*PlDs6@{g5t-f6;C8ukA{z8L+`rMVTGf;n`1~h zz!hoTt{M=SgOR9sBlco zUEhtE(=5j3e0P#dmDdLM)%Q9&cO4_e%1!v}QB044F17*uDk~Ul1Oid3Z zyvxuLd8eE~y+5!Y-@f=;k*G{a{$H{Sz%Z|Ui)sb6zs+OL+nAugjt_~cZf|DUjxeL& z6hk}a^-^BNyK3w>!)pnS=lS5ZE6ocy=inb(D2;-H@+!zXqQ}avRuUK4`7sZHcB`16IGl9!~GWh@tw z`vIii>lWRI%dsV21Mz)dz@h=*z89ko&b}cgL%e#&X5;OB@6QWDwsY-hQTBtPrC^}1 z)-Eh)&*a#Jnt|UlAsSRnCJUn|*2!do)9U{cMkXCH`j6xcaaf2V#wtmQ$D+7plJT@m zhW`2952;T!@T~HESZ!&Coq!1dxqOJsx8t!K`h9@s4F8%DM~kWdlk*&~_5N*(mbrCG zxli;8U!^AZUvHuFRpYEDRCP4(cRryoItX|VIJI{8cky|1z9x-jhKUPurqa)>b-7(% zB+`;9#ALRcjz{x@iHp@TE7|0vZZI*z@29_6JPx(LKimu~ld7l&uqA@DzMk!mFJ9h9 z)TR_HV%mZgXkZRts(}D5x)nR9n2xjBkk0XD8y_6I#Ysu(cGp5O1?ZG1%yy$|&zYoA zI)$);G8UlZS_A0lq>_!vx?WVPbY#DhzN={~^G371Cd6G~37}@ijaI1Q8m%;xag~#| zitD?eyM&mcx}e!Oo-WDSAb-HLr40Y@4JI=*CQKQpiusHzX_h#>a1;5yg3{mn``+kep#bv6oH3q75s>0k?n z{o+ziybyH4Bc{iL&)-?-j<4g=g$)9FYxxW+@4#zwr|hQc^@o@r);iieQoG>c0NW6G zCmsLkb}HlZ>BbenUzP5efBSh9u}h=@Q+2#^;Hx6gLVbUO3_GPr8|zq&X=iczk^%MW zf&}LzU7k)&+esY!^F8cCk~{SD=fe-trHBD{;%(D5dD@Jh@S}Qg_d^F^I6h7O+Gm*= zq=!nGRRiAg0ev|D$maq%}Dl}6O|YnMan!v)3fhDEXHqg%_bRok5fh{bc6dr z>Q2^a5FhCsez<~X)fRMJ2U=@ctobT`V*S+WRgPL}a9`Q)AnX-W9;I@)N3U%B8$BJpPbq^F3#zuiSJPN;Ad!|F_w9KmhTa({FB)L z+$bd8BVWQ`Y7CDL(kdAvR-un`ovidJ-^R}U<|pua!ca#gU4IMqcw>|4o7UKsMf+~I z-jcj^Z0R1&?sTQlzzaXA7y`tAxH-5RLDgVNRBSn=JiRqvpiTPCBw*4ACk)`&z1=80 z`j3p<&yL&@ifYvUWhL+x>8%d?*a_{Kfuxeg35EKsTQ{peWo@}nK%0r{cu;$Lf|bVK zVFiZ2q5P|e@xZo!=9Opn4>_Ex`~brjWNXFc_28K??!r~(fmNr`O?%_gdz~iH)(1zH z7IH4O>Nm>VYV6N1m&=mskij@&)z7yP=)-{^6*`a^t+SUjehSL3eEOvA))Cv_eeFc8 z8j)!@5_YKbk;Ig``YC1f5m5S!prW6x9R|D|`TNxMTDy0S-FV5n=MsAJBIXn76%^Gs zi7WjE_m>XBa*ZXph{brHe`e@5WJ7 z!lAGbia&jdWSchTAQG5EEryMAIf46@$GC3G#Lz7DhL$SRno3yj(m<zy>u5OC)FDERT4E(xiAcbj=Ns2-3??(h|Ye)bJ*a*Fp`11CyNv`!09qJA|Y$+i)d zPdTofg6t``m8gF6ISGx_gHn8I^G7lYd~uD&Fo+6Pnm6P6rk?XMLNXd5Lh|7k013UQ z@asev0+Zo%fWY`W=)R-|!-CYCOOF<$^i}!&n*}YhORc(SIU)si@@*fzhyYN4sp6AN zVmu$oS@xkloL2_N?a%0T4K=u(;B>xv-(*Qg0IJw0H;-HCH`_l{RXjBhLh}w<AznWe$g4eTl=6sBcqNEpLhstGhl!HF1|wqI zVN}2&5RGvfe~m}lrZ676Rs={u@PB^4hYl;#1<&Y4jyAeOBXw%%QRhlrV_hQbz#dwy z*%P%@%XouCms(xd_SPIj6|4@humo9ZQ{AHtSCszFlBCJJw>9%o`vh;UUaxvRb0mn9fRVg5RC7=g=H=$@u z{*dfSG3z<)Qki(ZQ^eqIeU_~LG^PcnN4+^{%df$)+CJ5zgRHIKQO6CePb}pK8>qtP znl|C``pr~a6jQ~PkB;`PZ@O3f$w(sSgw5$Yi2`(x4Jdn;{SZ^wqdy?^T8p#ueCiO? zIpG-wK@=FdJofjBBo1le6w%?38OQLnE zSzu<^>|TMCV_DxkL+=xc5AqM#KU6#p=YUi<#h3YGmW{%{SgTQ*5TLkL`VJh z^T_+Wt3P)a7eJsl{!c?4?cc=Tm|%V{U}D20^rt#`FD%kyW#?RwK#`JK~I^D zFK-&w(dfIWWV!AJK-%XW_b9bGxPSLjPRsw7FHJw4&4mSjbD_;@X8fvo`}o~eGWz1^ zz?lDs{FQI_IQDc4_CJTqK}?Una3!ZotP&B$=xv9Bk;FTi%dL@tDMjLfjA>U_=cIa; zv`zhuNnogX9&S!G>y5X~Zjs~o=m_**^Y)uJbNXilWTqqp>uHSyM`2yhO(1Nt%k&@6 zi<$HFD_7Pp@r;}}c`=y6-*{6w`Dxo~$wLoMkS90a$NH{}^Bd2t5)X=lK=pr~`^LPT z9k|(aK`qTk|h(Kk$kcX+MJo!ljm`UjF1*{&OlueB8lWTF$Tv!V&0VZ%iUKuRW_Bc ziN{MKJsxg#DQuHWX(KL14{J)9n_08G5J>6eHeV^)hQoFR8IRh(HW(^zQO8WC<2lhM zG}P*-#_~@1IsCoCII9wIu3U(ehJ-g%mC*m>A-`TCJVH0ag-?o4m=9HJM zscFZn578~dD==>?m@Z^@!l1x`F_p7;bTr!mE<}V)|E1rjlB_YkDRopRiCeZz!qAMp8@2M!lX z@U5P{Le8{QF9m6vyUjx+KK{~7Fjb!-mPMSsOdtq>VLJ6`S+iiq$8;U1s4)@KD5o$m zlg|MGR9*0Rl+dY~`~W325KgU7oJxx;1=vnuF?OXS7@4><-(UemfyPrW6jVzX22QT8 z=?iPo?&_elw-}+!)K;yzDH1~OyB-TepEDWBDF?X8uxN1}!N0Jl9Q4Y!g?tH8n(bZ_ zLQ0o0kIm@J*iU#>C$s zJgE@V+$w+= ztIvAe3opcN95RCm=QG{~e3xBr3Qoh~y?->8IaZmQiA_Xs+;vhhP2d52KFPG~QT9rG z&>nt%F77W1tNrD3Wc^0Sj#7M9K0pGpOxLqvxF|&Ue1O7%@?ia_GvvYQ zypJuWhrFNV)J=HDa!0WGY|yb#>9U}7JGDmEZ^B7iN28Uaqphw3?#Q&x?(g{Grm_86 z<@+?;XDc1e>lS7hoCk#*3R&Z9`Sf$mh0envvePGb0~t@|brdS?T#fsWbD zJ8~a?cRyJP6I*n(2#{2@}KsU_seYqeSlkc{rP*+;fo`M+*liS{4LJLybpYB z37d3*U>f#--d_1Aik*UKrrX-%KWrioj6b z7LI!ve+&-j!BdUI4T>u^bj8QMPmpxFp8}gw+n!Ioh8|W>Cp;&;~ zm7yeuIauzP4?Uehzel8G<79X@Cto&p`)ReNIMAe=wV!Y2;P-uM(`a=ogh7Y|m;=<_U%L?@H+PrD_aygSv)(XSP7K*DSwIuk0DaUe zMqK^jSFYWs6}5YrKfYrTkAn%8c*;#32Th^#IV^^979RYAgYIor4-Z^wO{9rm31_g0 zvg-&Kb{6@WGQywOO@Qp~#03N+*GX(qi<0YwR8pCTFJ$1*K4@HDMnrWw8rPtaxhCWc+O7NWTG=u#-u}M=49L3It~)&IbbW)#s;vf|GUf- z)S~ieP_|?$-z66H{g)l2%vngtoxO|;gF*emhrIS)phZG|Q}r%^Dv@nUIZ1;>6Q ztqGkM@FOl7=I)~U4M1!^T%*I{LzM;De+ti=M7NSm4zK1x0WGcqky@p&L`On%iO{Y` zKP<0K)7ja2M>hzrHKtZ63^V%H_gR$8qj7=Wt%Ht3c=y^10fk<^{;Z14SjkOrct&^Q zSUE(gRdpyM&VNhMJFVLYgv<{6w#ZWH%(cAZ)o+e#2!>Oz5nx<@vU4mdk0n^;RcQhf z`^cqQHQ=(T_o-`HI0quw#1RN-SQ^e{Ss1+ax2j^iY0aVLkNhVLr{Ty#Y+|<}zG25a z(NQ4RX>}K_oxCW1DUoFT3bc^H68_yI$FlaR5tp0(8Z<@|CPl~JWAhyR$b5&6W0e#% z34(_S4c9tV4}fIjjFtJXXld@LZ>mNIU+yFINow(s=I0rv72aMUn`LngA@O&G-vv4J z#z~2>)yL)jiYpP?#S7qF@WdF_47qk2} zCcceu?puma(%8lc0ox<%CPivE31M*<$3%acQ4KR$=|nW{NT>ElJZf+W63TB7MCE7J z(13CNvPOiBaQhJ9mnDwBM3ifI_6fy8g|IHB2K~@Yf~*mxi(}jZmCw{aez=4#1sqaiWfW?n}!l@ReQFRp&|D8=8iPr>|9&twqZA)k!lGeIMYMQ~bs! z@$Tgdu1XMQoQx+b@t_A+o9v|1Q@bm7O`59A2Y{~?Rl4*q^X1jI)0ZVu#)xr8H6Gq7 z+1j->^S-4qE*XvYz&f&g_KA2~>oWuVs8iD(*OM2S+jT1TUXVz+>Zm&vwd-KbQkd1y zwT-ZA*%jGYwa{#?U5$XWOUo3;$Qg7B3gM7|sBD?i^*G{H^Sd6+uNh+UYhDI@1ne0CDZw;mpsHzy-D-=)3!y04p)5S6c`zDt zrBUg7@sYAzF$dBitsz@$7d686HpqNc1JGg-_dasqmgOX~3}Fp)?ae~hOQMk;Bs86p zS!&1c{T5<5Yuz~yaw_z}bDb`Q% zteP1t7JS05nx-ErI8aDtPVR{?+Cfya6734?weT#5rf+j7(TMFYFs^BuB(mKy0sO2! zjlY*I5N$!4UJ*?{8!X6dK`ZU@H_xqc`C4m-Hn~Wi%IsI~G2k61?j>SY0|FUaYH>C_ z`M|5y1CCz)@jL>=B!_9`YH`d8mGMzCbMl8xW^bHEEf_9lD1Q22r`(Y>p4Rph2G>m6 zURUVAsS$jdhkZg}-eQ<+{V}v`K!MUg#(hz-{$3U}=w=vPB&w|SbHVjNQkCpwqMJGB zM)O}MedOZGErm45=TgI}PhQ}KsXT7QT+9w1{I#Ed23*oXzZ zzD>hQRtlTbzSrx8Axf0 zH}~2nb=Wkli6eX^TQL@{Ra?bxuwjJ2(Qa+#Fp~kPGlttOg?4V^J8^A-@~riZ*ja_O zqO}y1ZN(TBpK}e_Myn+-0Ak$kY^;8Vt{tQ4#);Om!%0fhLPT@@v)~8K$RQpm7CEbDOa( z-*KVH^>h`?@pU+CIq%?Hs}oXpr-obeU7#}K(yMFc_tsu8hhiX~m%otNGiq1GtSJAs?3aoU za0`+c=_dO(rPiR0reeLWkXy<`=(66@l&mszr?UAR)xbMf=PEyPag!1lGg~8Mgh31p z_=(@*iPayW2Vo!M@adF;?ji+@2%pXC&5(%z2YaLn%U2oJ0kqB3vlAh`^J66YGfiRE ziyp+ANRhi?*6^`TgxF$pW3UkiF2?7m3gC_)ZkcDe@D$#Z#Fe-x0Q zDFK4j!k^?+=2eKpQ~yoVG6f~KKiY0PG_iMKfbyk&$3-T$DQAWw+4Y6a%J zZ!*>j=nwqmMcg^;_UMMkQUmJ51RLYQGD@Pt4_6Cf3w%xynEg}Ds4Sj ztZArQ0HUMS$2hC%y;5yl!#BSlTlRESmzXq^PHKv+rvn%>7!PgHCsLAUB5C=V)L2!p!877Dd?mfvZ_olshTxwUeYa zGx5SMDzyhf9XVu`d@nnyXFx0Ng_EHOlRl-hYgY8iQ^N^5tf8`jRyOW9z&!2D!o>Fg z3=313*fP#(lMT|YL%&Q4k1QZJ5Sub*vTYq}mKcN^Y~`qGARe@-aV|b2+kGClm?$O+ zp>wl4{H6=%@9Ssqg62R5$(O(>Ib} z!f`BN_qWjm8ZZ2jTY3Q>^z}ibCfYOLH6MyfNc*`zgIyt><)~k>2(Sm#+ z2@LsGRj+L`qAXQqX=)*X~T*F*uh_%d_z>kxxlv$upI`FdlYOeYM5aC73x!Nl z+&9y_a$9-Gcdk~l(U;l;mt?YED0C}v;e#nN&ovbrU+V-bB5EQKW~dTb;(}7HTl_i& z4>n5Ar3rJq4mv7P&ttoUzW-nWE2?|{bCa-U=!_<6m(}0thE(PgoED1#L#zAAhFDB> zCO0jB`%Ohp`Xf%+n6TrFxpDSMbbH$=?^5){yvx3WH^ogUorh{{)RE5KI)jk+Npq4Y z5?O+ZOfc-SxoJy(NlvLxuXgPiKFNN%4ueV2SQ*B4g(!4Ft0QW`m;<~QQ{m$XcuZ_2 z=C0pYQeVL<)Ku|U)UI~aTp+j3B%1Xox7;A@+R$z5@0}0|>?j2JS$B+Bg#&#F^C0j6#Z ztNfet9-~ur|9sb4Qw{Ke1xjt!gY_USLFqaUQR$nEFgn{>F83$oq$;(&6h>z(*ZCKX z4ZL#+-yu3=pCQ~4S5BS;4R(nK(JL_iy=_VFL!u!%lBNB{jxBVFHB9qH3Ppts#G7=h z7&HL*!O$9=8_(CHcuS}F&jW4)Z_#lBtYOuCy$<{XEEnu#4=ezM0pnk*5sw><*?0Gd zwxFmhR%PR->e?Hrx1r#=$;)s4KER)GsWJa+JPX7(Ld@!o1E+C|u>jy!b>kl&RHW}) zL+9EIDWr0}aOQwAgI|7=is<-gvzp^;F4i)&92GlqM+Jnwe( z1q>ykBNDKiegSB}BymSFGc)#(FQeZavY~K_;;2M3{9=c!`TmjQV}H(nxy@#+e|g=) zhr~}iQFm{xE0L;aCuouCO(nQ204%V`%Ws}f1pT+^i+HQpXznQ2wtb#%7Z96o*xSNgK|X>#PD?I zq#&Ui6e6t%IG}wiGLBuhaoZfy%rq(y?Z2Z&(gLFz`lKIKse@G*wjs|-q#Ef*DMTzT z9k9t{3nNp3=E?&{yH%#TEo_#ytg9*2W%<~7+5jY)qj4?Pen9`C%M`2K_xiA3eG!B2 zilrUB*a;MSUjQ99DpBTQ+if7|aHW8djJNnY|K)X#t%>Q&uM(n9iSVnMISU1BE18Y) zS--K`e~KuM0WmBvlA6E2dDN;yokSVveg)Ab8)skdNG%cBl^ixA;P#5hAzn}Kkni2Q zZvsvr&~qWQ7Vo0wnu3Px-wABW;5#_P9xKtGjzH|LS7+0Y8D})@9S^zwgRmT=CP;NU z`P#pgpl&s7mE9PW7DsRHMlY)^lObqbtykU%E!hA2j7So7Im9kh+F}hj&D13H zj~Qz;2OqZ7LNTMIudIjk!9aEIzVmC~0>ni`H7d^U|0ctsC{}$q{)7zg>wQC1dU~LZKBEe2`)Bi9B5y1ZXR7z4Jw*KSEn$KfP7u3 zvpt4YGqU4r^^3n;x28^k&vjxzm_K{;W`PAN3o;TtTHCu^a6F?hKT~KPcVDgeg-4*r z-Z8>eL5!gI0ZnmjW5-bVW&&9rV9;hE5qQIU=tPRF#~ZWpiaxl40U!mTe#+jqD^UZ9 z-|5#ZoK62_^fUe=7xI_}VYd1e>pqj4r23Po-+lX`2(cu&@Ol}Qx zUImLEFfJN+LKH^eK8t`or2G8XM;JZ1EQM4N>I5?75|y=H*V?Ow1>o?|QE*x)MD!RcnMyj4@8iNm z5xWfJ18~)?z_6t)S8fiozLc83({J}bzOE79ULU8_VIM*oF<9tw^$qmcYB{Pv{$lh* zOh;(bJ{YU4`T?TQEtGj%0jN%`qS8{%qU6qWkt!EB$L{J`W@J4X#MLVx>|9^$iIT)+ z@;d2H18iswr2K2QkK&J6b1^6w1xis?{EoLO6CRq;d&I2A@-o3U+gls4=o^jKXc=#9 ztR_@owAezTW_{9#L@+C$uK7aStEzB6a<)8a8%$BKfX}d9G_Q3LKz^ma0 z`u=N2&YT)`(G5)=X2j}-!3lT$?-Q05jg7}3KEVPXE{^N6sg;q@YAlHBE{iNwdAIEu zTPiff!?;LC8L9Y3RBo0|Q<9rtjRz==4-GSk3E-pXdAV`$XUD?j9sY~G`>2Y=H%fQ{S{ z_}N>ncc4M{$#v>w9z453t;0hTztXodX%I7u3`z5K7ABz{Ah!<^7Pa?+;_2ivOr_VI zlm-Kzmk{npAWHkI_AnDssPxtD6q3=uYty@Yq+mdJ=g3`msSy1JLu;K)74(E zM)EwaK|g#`sek_ZCGF`+*SZ3nd19P_?+B#L~Y-)t7Dz_h9{;Cf?2(zcxJZk1;3l}O& zGjZp++l}fMfzNN5&u@)sjps9bJs z|F*y2rT-&E`j1%99XyZWv!IcnAH8nUDD@kXo`Po@^}tL5{GWZF zj9Gx%1U5|VVuxhZW*H*y@#G3BChFl1_M|WMOB$wXeO5=dm3oxAU!Jrtz*e@fBBV3V zl__tUx(*cd3#-{F;V&ye#H5sgbLg4Zw~Vv^^zxWiW8rw<$}W`R#3B1c*_7EMi!Rw5 zQ_ydPSu16?4<*ntT2v)s4q&y;6Bd8SCJC!nk^Wy3u!GNZjkDOnw$SN_^2tSNYLKL_$m-@9CJqNN^wgH>ECUi z39WeSlB-o;^PR8^!)k@mu}TD{Q8@R_P|zR}lb)stS(PfOuxg=mY^iY5%sE zS*G>etnvdq2A|K<*w=*@()d4Q`*OZd8ld<_h#Mj(Y~OCcc{p@R0brSojS+y?_^|!t z^^Phw^ZEkBMgrwG3^BQF#Fzda2WWJK9EUO1`|<5^I$0i~So^wqL~cYH)?|KQYQ~Ve zz;3!k5kDWli>8BsIEWi!2|i1#XDgTYY?U58T0sv za4;}LT@>*0c`_cU4$-409L3wODF_~jy&qvg`+?Mw zgM)*Z$jwf0+jl1T*M7=w@E!1`c=nygFtq$9LiaqJ16siZ-a~`fmJk4H(Mkf=JcY!G zt&=N@Ajd#qboG7VVC~`Lc&aimX#EL}EXAFRTj17K^cn1HPYG2(xCT8(e7NDyUo7V9 zcTsA(0$iRHB=_JEWie<|7kH2!1{)N4b_h9U{{jObKqzkK{yxd%)By1$P6Y8B{9CX( zUG!YAY&W-y)wyQyxeP!B;mz9%#8@O*Xc=;`jv|a>+qtdT^c=dY?xMK#oYH zsll543$=a>%SBpD9{Io&&f(7!rBCU3A*f&?3?vK}xraQYuiV0oDR=vfi~Jfo9Xda* zdNi7QUfH2bKvhXMo92;98|r47?n~x)jkWS~wSZVuPl*We{|dE~Z2f9VZl>8(J+1_RXOYc5YxB znu7j{e(_!1p*rB?%BnqT$BPQ26SY33#Ym7~^iYU10NOe*e}rW228n}KW+aUzg^s(; zEoLaCefsG{Ik(JmYBVOLy;Rx@j+gp zo!YvhSKNc^W-WBpUsyIc04e~F{g04pjq2#VG>an@6H;HfD{vQ`@zyLnOX}Sboo6zi zPv-LS-Dw~9)ubtl2GhmH0C@HlHnwrIr;6_NHEEw=CuvHZ3_xe%jF!#TuRK$>tp`~> zej`4<>H?rC-&fX*!qo5S>UFr`lDF{6B=q|=UY98(r!A;9hdH#bF+@j%rp*a0)k&=_9n?E({y`yhRq z`lC{V2D095^a|ji*f!vRx8H!R%rlv=XtaaFRfGbinh($EF;;T0@1_r@ zPEicFrE&WPVPz#;P}=%AIh*s-Yw{ITA|SQrnrtdGCp%@ESQ*`e<#1amq8hLFjQ{dw}vDYS=z z0THN!5sr++Y{%3gnSNNQ4tk@Es+u1y^|a*%eH!|LhM4L^FJomazvL8FoakwaKQ0UT zqWRXK(558b_}#BlWy#P7eUUq`Rpyu;#IdaUy{cZTKRrWimr4cG@oFz9Sy` zwnD|V9EW@C_O`t1Ssh=$Sm=V0T$eS(Lqrd)*ku30NnwuN^g30E!N`z~Z>h~Ln(Pa< z2wdd2yF>Dp?_7+d|8Pk-@hLT~kDfn*7nCh37{!YCQ#4mUJahKQeji$&>l*_wzQ5%z z-z0Rg%IS_DB8>RF#-BPyK5&gz&U1`D<{$=A223L3-X3h8se8eWDaD@3u!Jog!@4HE zpTu_grw zgte;rKhps;|F`<~MH+Cd7MqI_=<^TYn^Doi%Z#>gsr?MxhU4|bBR4=nMC|%-?wBN`Oy&8LNUDl zF8o;D7rA&bTu_|)6L|>$YZX*+mA$K3AmZeU0+*nY7s0U{hA9WRhDrkakYTYIWwxO? z6Q?!y#s8`zn_vX-;12uDbvbj!ftn?19P@xx%_I*5&$!OZQFG^20>|7Ocl zlTG;392AEVZ%}_GA0Wq<#14U4fTFfb1JxS!E6BA$4`^yLB8dmEO-q<-{6rrb_6ReyIT5$MSn{y}mq&A#HI&;bTVOpYacJ+O9W5sf< zn12Vk_mODBlYPX2c3cv4xgY8%ustp_G2w~v+iK?F96;4-)t{N55ZW#U$x2Y zoh_G7`5YzW)*=yi+T{rCet|YooZ{cm$D=xoNbQtK;Yw4tEdtPRGk`^HMs=s^wo|H8 zB^tFD=ih5v&G6iCD}If1rtuWJ3GnamwaLc+&HTdpJ~aV&rIh23|jlm{iysgP9nQ>G1`uQa(v)Lto zS}Ufjm16X@Aw+p}(6{HK)UD%f+YGq^aRd%`j3V0RN(pp#J>L|Et}Xi2_g*xwEFb(u z|M`sa-o1{kzpyqLv?Fk-Z{3Wha$cG^ea_G=B34=C(6C?>1*zR(j7dg!sk^M$^5bc@ zvO)ls&`}fjMiY|mjehJK5}QyW^nH1Ai`;2srp>tDZF|83{iE@v7T(Nsm(ColY;x#D zJ6L#M&Z8`3pFZD-mUCt|HMx5;>i=I9_`yLZ zCrHs~t;9>CCIl>a92M5klBcQ-^X@o)9m6E|qefQbuB}`JFp^+dAm(~>t8UM&4;Su-?AjI9DFEy?i z6GKF~obHrFQ89G$#=N6OW~HT0qFAS6sYuMIHR~N>sy!KNCevr~0s0uL<U3V_*gAdm z^YMk6DHGF_m4pjGC3&m$Oy(OD_YpQHVK+jc3VU(glhZ^NVAG^Zr9r?$XDIH+UTUnu zN`p-EmvH1EL1RoQb86s62V*vX+HO8rP~6zvl^O51-X(%HJ7qoL8J?Sv;-61(z_oColv{N_GVIBA?p^%li| z%=t?5f*S8dHpj)q++Phb0-IZx`i|TcOy9P8&)o4aW%Eeah}u9(WuLzQ;NwHJB6W_} zFKRX224$1|6ZToITd>k(&ZPrvYta??S1Z2q~4}I*&)*jbH12gE)5#QK-58u2+(P0iHweHK4 zp!|yXQUxQrqfps_Jw=xQH!>PvO{MJ^v78@;AAt!*n`s%(KkIgM6aPo ztXiHL))!)A$+>V>PHSvnRX*H!H9zv6R6`d%ax~}N^NQ?zKk3lvWS%U(VKDys0@HqQ zD4*gmXVZfeB0zrIS46w#DrtBG7mFJT)j4NDL{Mbo zGLm-df;4(V8|{27q?LN-Z>jMNT$72PVfIGU>fg5w27QplD)1S^HuJrB*SQW)FKsh$ zVq3Eyn~-s>nN0mn`@qwu@Yi2bS;f>;qFMp8PwE{V8u2my*SYzP1g`?Q`HQ}uZ@B@oHz|4F!*&iVnjAz zSH2!c_iWTB8vVY$jOpHK!m{F%Z?iA|XQrN9PvJBXH)Afmw$Y{RY>dc*VTZ_`-L!KYNJB1{F-M=T>XdPT!0KoJ@q@RHeOT8%ifOA#l z9dUjNzE90*;K+CoWmy_=p{y1m9fSlbfV3lRAairHdcFO|E>P9up6#6oR7GXy!$8|8 zYrx!H?5CzrDYP~T>N3%C4QozE=9W!MI^h*RiFK5QY8caJVrewpdl^TJ|D|3|GlGXe zzN9HOsjJ?ERTB4QO5`oGx}w@M)P!AR6Y;3tBhqCm?N^+`?_8fI@@UVi&nk#zfN|0E zYyOHSt-oZfII8^0;u5bd+c>*oYd>0PbBVLW*H9&pV_+*2lFXrk2v>=)S{mNFe1ClZ zwOS$4+J=Y|#A^6AiX}@Q7>XMt=}!$Zxblybkj6D4NC*o;--1j^FWqa5mS9B>sbyc| z-2D+|fN{GnRht8NOL_~`N*FsG06iUjG--igd#l0p*5%QvZP3@#v2#0Q_2~Y=MKFCU zIg}qf_Hfez&4OA4{X-Dp!Q0zblZK^1V=zYCB_)g!S`UL$VKf8Gp3Q?A_pGKxwWLCb zDHfvR4uAD?j?g9>Y)_yzzOL%V>B7@2&JBp%&d-PTqiWjxym9T4*4}-9L^f$s`F_mg z#OFPxOk|&@SRRPp2S*B=`d69!n5HDDBFALkq@Ch><`;0ShVBpl0xjUIo=Y@VV)mLN z9Rcf@%l?!sH*kcO#}OY19DyEx1B^VmGF%V)%J3c{=c(}vK3~EX5JdfA6u}YZ6gky?4*M)AbZP_V`8FiY#p85~A zyRmrw47gFtrE_Di129RlKSfNH0+?QdZ5&sSlGX_NtGf(aQOd`9! zsHu60T|B=)x~v)4AW0sGOmX90&S0CCp|Mc3{R~?o`wo}E&!H-IeYs40>*_j2m1T*G zjFe5>c^h6%cY(4`-QP9Y2yUU?riN z5vp;%Tl(rZsof5ky)iSXfEe+v==ry0vZYPOVw|6r$GXDL5HVlR>!Inch|Q|bXj!q= z|Gc?BG?vcWm1g&cRQXKhSN|4$lK#Wd`MH(l*PB;(`?)eO`Y-WMA)GBnny(tf z;3qW@hKd{J{DiA3TV6R`*yO0G9)xSp{rxJ-c_-ST8E-oi|`)n z@wcz8E5@v59IeqNSy{wbJFlW6aiNKJ@t)3I1&8}wi*xNUV;t$Ul9*A{DBSKKI-A|# zF0#p@IFGJb7xS9mzxd|pB$<{hQ6Zv91Y!C< zDninj`Y=H1s;9@T-Cj&>2r?6U6}bsZeaw>1xp#I+Ghp5RT`pa| zexjuS*dDsYw1s-C>6eIl5FhVU&AUb%r>M_Db&xT}+h_^IO5HNrby|w5A)|#)gDz}M zsTrF_RMyJpIKyJKpw8{COZx;C-bq!Fz^%!i)G>Wd=;|2cQMR)WW%xkdQ$AKv&}Mlb zcYk~@tYb$ydODEj{^Wd9iog>NL0<{rZlS3Ci*74wYmC5UK%vE zD{ysO?uLRc+e_aZ0x*b8br|39>xSpsj^~-{8C`C9h}?huA&4ovrH36Rb=FdREJq@n zaI#7m)89PuWIK<-JgiT*uagk`qldF(D2PmPvK@kT$s(}K0ZD{ zl51WG2+JY1q1Xf4h5ep2s>ee)joz0)q30D8}U? zDBO5*eE?4G>XgL8GWtsR?XtJzC5>kH-2Xmpo{zk3Dx?O7eVrIY=K#G2lg-0#IDP?0 z!D|hUnEcBnpPzP4(OC*$w@7$&Tu~RVX%MlsP9DZAH1%(yJjycH1;@-_ zkng~2M|vkenY<3{&m*-vpwt1cNn*mGa=0i1MpbV{UTtf3h=GUISLlA16j1B$SP55f zY6!IkD}yyyr^lIuA_1u5;n_5CeckL0b^z)jKXqTcvKsJqmV) z0r|;X)>0~!CQspIJfF9DUB0(q%kwOinD9f6tt#L}Pf?WF1iR6Q*MtWP<)(K*;ODfHnV#shMeXN08g$4(8Kovd99J4-)l|o1V1RRE;&C685H_36)WiZg@QoFWh(4#zMm-Mr33&XzDD3DwhPZ=ow#$=Cd8TB3zOd>pPurPA|_%ZK1P9q9vr? z{5Wn#(wbbjv5@m9RNj9gSf8|T_Q1gcX)vaZ#sS@)M%CuU9vK0}UN|a%WIjV8WvlYC z%Q#-96TXl%g-iA`Wd@J_nVfQpW;F8hRyM=}#A0VpQh?D{B=*e`ndKUE?lWz@iq6(n zs=;pTJ}~@4lFZ4EH&%Lb^=DUd7onhIZtT&otNSnT_15uU;~)-!P#-++0Xp>MXc{hU z2Y}5%>NWrVmkk-yz%ceUHLoK!re8HS;0lgT9zZIQhY z$9Cu!&qr`gzWcxx;Jy9eQA22fSO&e}j(Qi-$6+j$3DX|JyGa!(r>-J#F{ud06%sdJ zP5fa8N~$$ga%Xayer4{ksd6c_YP)BD*a67Nji#LHW|krxEge^7s3N+`BodHeM9gq{ zo^e$N?#Z7dgwk`&epQz9b!34MJjUK6yU)oAHAx*Pz9t@TOpGc^+{bI@7KNBZx$yKf zg?wwE)$&FEu(T%{dQgi@c4Hp_kf8dTH8e*dp;LaCtMD1b2J7RyeCg#a%bX|1wE%lu zzsTq(7U(AW0&7FIv{PA%8U*W}el;H7nZK=DdFd^u60N%67Z)e?mQf1Wmi~;r>k+*4 zy*$OV6f*|fErV(9?a{x}yOic7d%m(3x0iFhqpsv_+AKTN|5@9q(WcEbEoM~(Q_ZA| zP8hi?^9ie1k3{xBms7nrzhI`SDg$guen22|^%=o~IySJLuLTvQ&n+s1m%?3(zFJPE zc=kjT#F+)9fA+H5)96(u?G2i;r#YYepX5I{Uq@KlgbLe5t-M`S=3@-#Kd$o2`ODsM zdQL!$JqTBy8a_BeYQ-Vj$(Laf#YMSCZunlqV5sg zRK*-D#O@U}@33`fc4R%j$N-447kq({#CnVjMrJCk@0&E&EE;L%I3>ySdZM}2sXN6g zr;-?u)Dldubf%-+gFFj^;0fG=0YFuMq>@{4EBJ6i9o{Z(4?L3MA)Cj#4%`yr|0!%1 z1gqFf>0`x77RTfcan{W3M`#Q-cqQhntDo|UCQ7P3ZTwj{@I~31+XZ|)H$7k4GB$U5 zy(apM?EqXwYj=?56H?c2;NDSx?2^tQ6i+6h|P$-4jbx`FPdWDp{zCRxhSv$`5N|5~QB&%piltL&tpwZX543)xk z^o#7qkY>stP8P~>KMu<_*exV9aFl{0dyC_LSqd1ZNEZ>{0LE^7k(|O^%SCO7@a=y7 z>nBqr!z2lxY@2#N1Jnjl6k5KlnXA68j zzP?_0>K{2SCN6nXiWe_pN7t^lH0t;4!{634gFX5_OEn=gDW&oCI_f%eL}yZb=QjyCu@&R0JT*<46K^8n77W%vO3z6Q8KMO zlDUtb@gBy^(hjnd6Q>LJZBoazquhL4RI`ei2hx}2Lm*R~W|NHuopTIi zJKAU``K#>j9WSaH%W`4i`^YP~XCLBTYyFEJYnlm3hj4|CrP$%9L+yfxKyF*cA#6() zCDc)uAM#oAmR%|tX6#(LG$^iSx^hKX23I1W@?5}k+nmBjS$4=hx^bHzab>7dX)s)8 zjNIXk!INuh`ork;NKeqkbU|#0ZUlo=iXpH?7Z&`+(o!T?$7iJ7r9uUEA#t%dJHzid zlD2Lu{u&chhbO*Ns$V6h&AN^Q-6+iAOy~tI%jx^Bp=%mm4EQ)*I2{)pCS5Xu>cI-| zdu!nQlgdajlpKRgPHIcbjz8-fjZ9BQ3x*T&fUdoRiP{VYUh_f{%Pj2r7?!?qV%?18 z!QQhe2qC3fJy<5E^h!o4oT#i{5n%O+#N`vCaPnICR{Tg_&|88M%m3&}zoqiSS`|J~Ssln;g@p|Ml{@fH>I(>x z%?n6E@Le;29%srdPAVDxqzuPyPBiOCUiTeZv-$0ljEWV0a%9f7b>^?SE(4||4`+MF z+AN~cQU!9AC~6g&rd2hd`E#x@=7ZLrM6vry_fkxGniW$mat!6IU2_e@90n8MXwluY z_x}bR-Ty!6Sp64ts^oPj{tG&I|2yd9n1z*bIf677bI*GvDL6f zI+6aKp3l3!BVZj-ZNbKbDxUMkIcrw*As!w$2q$%p2)~Oj>dh*0iqu#zzinRvP;@H) z4znDKIl(Z_svd;h#_GlU9xUbGJ#Jt@)_Q`PGdFWpSRi0`;2)UY2i}LsL3%mGY$lZ@wKi9pxY#5`78p} zsT0Bwvg+1-87yM)=sX;($|@;}{kKx*>W?U6EqZF!X#Fm(j&atpbLelnFsd4ZIjSG| z>}QWbzlfJe{m+*Cb8_Mcqy_2K^;~B<;U&1Cc>Hup>YSWFwuZb(P6?%Mfm+NKw-vee)uGsn zl<&mC!ZZ6mZnJv50r47X@NZA2=QUxfs{9X%7OCf_;1D&!zr@f1lq-D&I^Se`AYrP6 zKR4{Bwwg*7q=pDI$WH+3Tds^K(H2+4tF>pc-z@UNOrOkvWDb+G2jiYJocdlRMID~s zeSo6WkKv9&t_TY^Lv}p<_rGNCw&3rS@2=!~m2?jctWx*D=epb8gEw_8AbXhfI;m39jo-nOakEs`R3z2?%*=7fg-C1BzhMi1NIt0emI-7@BJz@XpgMzrrU;~_M!+^Ivn znVIF(h?X@NRZ7|#a8`23?#sz+!~P2yT_W{Puj}6T^X&KI{;+?-T4T&Jjv4~C;%OC^n7~9!?2~zF z;w&6()Vs{XqdR@7b~$Zfs1DlvWK)THtCXG)7n8Hx2mZ_DK7s-^2MyGVO^XmlX)`2-Po3GpkOP z!0nfvS@_AfAWbusq1)4tE-uo?zK;G;iI|o#`L3A}j zs#qi*L9@L5E!$P|v_x{=!D6*g*nrTqJ(Z-_6(8Du`D*qOj^?P6#I3!voXLe zyoJrmsLoWf`BMyx%r3cwhr9z+=HCwp8NGb{Meb@`$c&XvWvm+-#myw)w+)_5^1zGa zD^zoHyjt;6R;va;Q5XGBO2cCLBUvy9oioKF65?4s*1Y#@7^C_CX|^q)&&a%#8Y$W2 z)z6A#CZjDj(*twT_s6FGyr?KhchI?#-NqQT6x#GZjwy<%8@`Z0#M?rzDdMjm;(0ua z?oGKTNF1q^cLsh1tV?RjE)6VZ4cqf6Zt^_q^szk3vA+@lB8GH3=Wgql;nYNzt?U#& zgMVjZ=lksk^{TV793l=`A;hme{3ROyrPEPU#qg{DitT^$4Tg`1>kgE2S5$P%I(BE7 z>9=xxP=9&&^%^@2kzUWp(Iv-sQgCR<(YPw~9c533daMeYR@0)=iC)1MAJ6r7pDeAh zVgdA09&enzD;5{*p)*2KmK|7bA%igSL{s}rtStw}id4R@xbljc(O`8i{z9u2WUII^ zlLz6hG2NOw@yTHC@jL48Rs5wE?OL%QU3G?Y^p~O_8h)+cFRF&3gk_e$J9BXruj*Vj zfVX2nc#8zBjU#DFCZL*AkNLjB#(s1X7=H&!>jmlKd82zE*+`R!6H|^Y<=NtxwZ^C& zHUCs*>*g;wWKQ0%B6Hp^pLnp|vmtz!B81WCu3mL8EHzmD$+glLNq10h?g2eUAd|_B zQ!J(^d5Ht7#&2U&%FB(AIc~XLV#NUY1QW}EDoSsm5=>Uuj@%VIL?G~5trX}f;%KxJ z`|i0fLJ=}{)&079)$YagbK_znWeXeGRaJuNby=2-)a3QwlSd=0baaz;#Y= z8x|}oa&!(bZgjH|kOV`z9={2vYRycyf62k>;3l+Rmp(nmmAYE^l+pDod$YT~hj~J> zMX!HyL?w3)>4{iGa4up%>;~BWE^unyF3WgSAmbET>SB%iEI4Qal(_vIcI#Z42pRR} z9&;~59}*O@3tQc?%@l=n*3e7pK4H$eUNNp=-Xo=|8`|lKqWR|;vxRnZ&A!%Cr?rKz zklGe!ln{S#>glL;bvIcvyoGs7_0s9u2`ef0b1nTzfa72+^JL>o3k;x>G~0{WDt0Y5 z=lt@?c}1BH8B2WDkF+#h#!e0) zF*mnP2mq8fr1^)O=_bIDJ7Ru|?j(6pUg;ib`1RqXS$bDUGN+s%*Ypzhtpi~M@7C1W zUDMK;F6`tkCn2HAho0sA0%lcbEV9sfh^BKaJuG7?DtZkC%h)A>^t>zAz@W|1D=bM> z_vrzYj~A3W48D{#CuK4Ek$F&$YD6xgkcx;Yj3PmpE|{Y`1uS6sty?aacpJaJS9>1# zdgA>R_!2NH;Y)V&6lKkd&YTG^Nh~|0H{Kc;+2WBa$39y9E#IE`2$IkeYP(oreea)+1xP+SzmvzH_( zGqsSFVV9+S0`B6>(wj|CkLM(d8V<(4mX%%9fFjO4S}ad^LDFn2^0&Ux&-<5t{hTaQ z`pjt4q?%u9xjiju`sX$uTJSbESKQeb-b9hbDv?xn2RjeTeI#z97^L4Qunh~HZB&YF z$8LQ{fm_9EBW3H|LX1eb`!UAu9Cv2bNUH@np+b<#0asL6X{ljz#Y-pjEVGBiPS$*j zs+Ocz0(;gB^!_4&Z^I}W*54yc$0+9^9>4VIomoV}^FD?|tzbXqux= z=V2BSF7!$`X)>py+(zOUUuz?_vI_(wlOP`YL77cC=NOCF6UmOqS2=yxNwa7vn(%Of zp$Y5+n#8voQ5Bsep-ak2n|C`ivJyASa~q74{?wq4__&RcXJGE)R6OOB*9X8+DG_lH zJ%0r<7}Kt7{-T0cd~|)&E{l@# zpZxo*uX~@IE?SIOj^}Wju(zup?hV{39u5Waj-n(Iqz)F`H+vwDN*{^Z`~#PPw(kV$ zR4obx0UiB)Lfb)FgC~E`oFTom-+k>N$T>S5AHPa0!%mkBeJ#oGgT&-)z2h9}Q~v!H zFTEyR4)K}|r>%0{_qBm4ukBIx2UM1qu3v0m)1ymCD^lT)%>tXAzz!Q8^5Ww`b`O&- z_RvwH9ix}+kKW5h-b-8qy4CN%c_6!2b@3H+EY*B=|haL?sqemMOr^?L;lXt~v#{A}OG3H2sdd zrIuk)s58o=_ciT)eka^Z+NtsH3-Jr!3-NEt7zynUKkPOpQN0}%=di})E)QoK9jeG+ zL@>-UFM8=rN={rS*-t-|yhK0n!v${74K{4Wd9O_{fsxt+_1V z!Jq`(fG0@@&|LNaxDEO&K6s@~ScHx_Q_aYqm8(-54#yVwh(xq8wU_ER51ZNisJ*CH zF7In$?|?>dEe|C7uD9rlPbltLm83mKkA)4h%9m0S+FVlZX7Daqw;Dm3t|XIpnpXcXbGhz+Mk+S!Lv1*g<`y$^W_0+VL7O0BG) z(mD8fWJ@$&6-_2!%~A??IANl6v7(;y35E0($g!ml<=?AGu zm*{*_pVZ+@0EX@#T0cM?ww|Bq&i;8ijvl=*eV=EpjXN`E{{E%)=cj8iH}XIHIg^$M z-bgP4VLa#U6EdGd9`Ldr{FP!|M0K1Fou#b8uip8cE6VNEiPRd$8(yj@UgB=&3P6GQ z;y>QbE)Y+E{`UyMLMU&W7H;{Y#2z(FM{5G8$asfzsDL5&@<7Q?p}QnrgR5(`=DFc{ zXX9d*$JiZKj1yOXwnR5ma)_kdGH`9f#)(fJv*TZe&!C0w; zJ}tAf0e^5982@T;o}oZJe6&Cx1lP!?Fki%)5xrRCzQjou+XoLMg=b<$N4~~=8rR&fi&oO|S4Lc>6Uy}7=-#2=+x7fRtvAdCa4Jl;_caN|Y zK6|$l^Y-Nj?`jX?#RjadDW_Kr*grY(0NFJ-8|g5dE%PujOqndxoI!WLxu4I@Nk6gS zi}6kzl(d9Y@uDGCGM^;meoNodvw6ARFx<_bfc@4mN~gqV^nZ$mPJ8XkoAF+MgP9E3=^B>1PHGs+X5|QRHxEOC--qAft&gD?tkxAj zPo!HudH5^~@DZZ!d-C*!_t^XKJA7hJu@z(d?j%6q?17S};tcyzfX{{}7@_FHkDxL?ab`lM*lwtYcqH9?o^Gj4`l368}ln;+(Su=6^6t3gm+9T8g%H4nJyKph{PCE!@a8^v$!qIR%v^!w0v>~f z#_~~{oxp5j1f(%w!77A;Ga(->e~bOv=+|k>J8Vd-bsF?#n#-k$>^eOD=Y>A$+i++m z?ey0uLAT`^Elc3R?5JuUAp1ByJvR(ZJVjWl=#iM6yu|}+o^!7mE8h8i-Fqv~p8zMZ zJ(Nj4+Hj$y3<F~!24n`HqsQ#%BW#ENA ze%w!O5r8p5+(@x{&JZ2JX<@xppNhaR$;sHpDD;1GOD!^^z^*gj8>+2(cys#EF}&&C ztr^mRFC4Q!L)wI_P~#3eTyo*Yz6JckY@WJCf0pJWXaB>Hvm=j5{E?!8a;vN%lPK59 z?cugZ_HMd*UFnr@!QhKYSAAEix`})r=z9+6+J0StS(dM!;P9?pm+0r~oS)&nSr%>h z-;)xG?ZqF@sO>D+vFyJU58teHdY(;pvY)|zkTYPHUvyeWJRJ&f_->d>`NlV8tCyjD(sE-UUUT`Az_P-n%%JhRZ!;ZZ^qKS%{e zLGV6Jz)Edf?YAe^`WAK6a)O1ePfSH?L9)FGWefDBKs-frSFe0E23Hb)lG+)SNq`vM zre=s6X0Ifrg!;7)-0!!vFQ~5zbj3F&UN^5ywxKTcP37|hw4ZccO9c-BCYYM!7MMlP z&t!_2yuDqtq}wQE@PTL%uzqQ|`X?}vWP4>BHaCLEA1!yh{1k1UJ3?hO-``I>ApC_a z{u#4D$f95~MG<$|%|upBj@!l>Wn7HM!k4u_Nc0PR+X?nJ1nz~}~<^J?e4>&P2`bl#0&2U$}je2~rL=JD*##9r-qK{FYP3 zI55tU5T$d$RnRNe%(Pt~CfR4qVCQW08~-hh!RHJ-|NQdRBMv3M6w^wF`oHL2;Zae% z@7G>xEt(DryQgr4KQcy8kDLI8vn-^>dJ1tV@52Vvjc)|OwX-X8ysT)T z@8q`)XWny$`&8<@M?+<=7hk6NIl@cNA0lOIO}vEYk;sMR$Dg`h5m|SG%5le;etE$+ zb3-nlyL>abhMU@c)SbhX{0DVC)*d6TM{x(Y9QeOm4&x0uGeF6GVq)@l%_-EAmC>`u zyxib_P|cW{H}P*dTPTUTRCH&%4hVA*q;{q zwz<>j_wdf|+rME@5cz+TOKTTFFP<9q$M#}nUi#U&sn4+?1Zp)&I+AJV56d&XF<8DVwpr4?anrOtm^R zTY2)1ls3Fs9+KM<3AM_nfrPXbx*XE^9$`Fm6o@8!=nD)}I$+26U=v%4`=s^rR!*Z9 z$bakkF?`L+6778gDXgI_7VWBm$aX&1hxBtFvr?8QY-O1ny0O6^<+$fau05lgrQGOE zwO(o$yNK*iiJ~pa9XLFyFwQ;DMqp{r{n^_!ts?BST@qgJQ?%yr^ikdy-6hG&b*g(1qhewHs3-b%s2Xxb+X_hRmVWoyz*TKy(yskx$vdS)dKXsq6FS-QO-4$RUJ(sgkH~jQ2V(yTuAQK}2DbJeEKoBaFx(4R z8UIY%{(#t!Z^M8E7LUmY2i;eq=%)>_(_1=JMLG5(wM*2hYcesXk`EM53^HeA>GR&S z$a=L+t{FIKd?O1|CV35PZViDTn zj2w609&cwd2VA7PfS0>l6Heo?!Qq{gU7N2NPnn*g>2mJm%@*vRl_)%5H#E*+;^@NM zq%O|oI+pQT&m|&5{5c1jbtex!PaM#nbBz3-CZ^cpe-Z}_J%f1Czq32I@RGvHW%4Xe z_sFQprExN%Dv~QMeIRM5HYj@~iIMb`lJMzH)>&>@4H&FWw;TO-kn8FO;z@TnA0)+` zr57)HWYN=1J`NlE@g4{76JDkv_3kbBsLvm>fXLs_>4EE1$!Xb@UnK*EC_#?#LJ-`} zC4Z;;>MgYGMxmWT>MXm%%?cOEaRi(mVcVH_{}y5q*;&IDyIb7Z!F9C3>rz9q&dZE8 ztQ6Ey;3o=hfwy2lh;X3uQoDv)e!OpkMvD;HW>&AP_5rf5*Zqr`a!xq7mZJqk8ec$b`aWmoj4uL0CsIphF>+~EsvoR3@NLWcoIH^<%|CcigGU&H-I0-wP8M|XNx2WtFY!yW^H zN?C!mW?0PvDVoIAz7emf-;?QW>$FmcfK1AStkx@2&8bV%1LkjM-zLGdItHGk2B@b9 z1~9Y;`;VpLEyj&v)x6oKp>nD_^nK$QuguymO8$+Ho6v|FN(f9+qZpA4=)UE>^mYQLIr2YguP-QfXewB}f6Z-rLJ%db#c@d(=gD~> zO0&-cGpL03-KkQ0ib;X()G{Q{vgKU6zu?kR7?7v6zh$C3bmxeoTc0yyO%pO6YVm3g z8%0w-j0cirGRyM*z$)6){lb+MjHdLq-RZ$+v2Pgp9b99)STa5It2W#O+M6lh?5=7i zZ-(Ai0za{Y(+N8I@wu-{Z(JS2PL&-x{@r4jB}~Cof{aGCh9BIHL}IZ(8oCF*J|oWj z_f+E5?k}H|sG?g55fI8TFbI3a~$9hSW>RJ*trd2Mxd z@=n=Lcjwg?CHuvb0Ma#7YIRRu03cc$4^zKeDTaO*TL`Q3{%rLEGLm%;^lym3+U+?u zv^gm>rP!0wL>3KLY4j}b(0LZiAqOS9Sn$L}KZOj+?o0Dq_y76YQ+W`fF-oR=HjF>!&C{A1XbQ`os>z6JIxO_4dr87+#UwIIV||6k~2>MwNSw^6q! zwncP=rAMP;AD*zx#>R<4i89_7q@1=8CqjcD8%`|u+*!q6hEf`uYvfjDVQJ-2yj9}s z0mYD{=hdqeVKfYhU;!g72GWzE@l@5E#4wm0D_wLQzOCe>82fHan8*7ZSl!Q7%Su@& z2Ixzo*G!U*&m-|bm5U+GX3US2yMY7l>KO&PjoH&ERED&*xj6ZUqCL0{`b3Y!G5Qbd z)3O0AyA9xSzTuA^0Db8)r^XN&H0h;vi6 zT$5;}#v>Mb6T-O1j2(^u1T-240GQIYVVRhrQD^c)h9=uqE$jxK_zVuQ)zA|m7(%l( z=@9*g)vd3rpOcqRk)FCiM^Ah-QAdoP3qt>zUik;%_g4{mKD`i+au+0L#r+FIIdR~ug$got+`~#iTXtl-)BCB*8ZoV@#G34p4^VI6Rr6Ji6g?)jVq^rLsI>eLx>c1-ok zGPwtAnl$=&Jq+I`{MG1EyMJ;}z5z3wnODR6c8pV#^EAB1GAi98EO3BucwJ-&$O@Rm zy()++tbbi*#Cm!W|3Ojzhg>^TwGVn_z{|?qjaNgqa^p(Xp>1RK24g!}Cz@e|meN6! zuGqw8mwW)+N4uyH%GDu80j>*&{CW)YFL60uPv7Sov{u9U zV$X)Y9IR*Gk&bxF%7iJX#G>I>y>G(oV4OlW9)Njg6I5D^Y;svcUpn_IS&#L${pB|0 zrr~9uvoqm6`)H~H3xj;k^dYKumCbvyVs?0Ms$>0py_vmT05%=dz{zYp|672^be(nI zPO7-u2PfXV7=p=BwmDdLpOQwE4{z6}OjA|be!65|`|QTxmUO==;VSkN`#Jkw#j>Zt z8rcsSAbcn0yci@`2p%?<3k>6icb82A8Zk-vXQ7%N>g!cW6Z_GlRAUjBk zQgm(MmwFI60We?;4+G4+;6N{=`V^M+x%X(Q)W|-X`$_g^b58N&USf@d0CEn4{75kr z+x*d|Dldk0!pQdH1tZwj_$H|5<6pN>ab7~Cwq92%_SqBD^^Byn zQTiX=AFB=m<)l*GHipIKF)6MHB!cNBFn8+}Y8fS8fdoqb+Sxn|3s`X{p}(kjmu zsz=wWTYnTn13UPChOB>0AxfOA^ZslQ+d7RgosAgmkoA0k<1yXpC>eVdeG)kk{}wv_(}1V*9q|7X4i5Z3K=}U`96U#h5~dA(oLyvH zO<9O>n26l$%IEj@XV(0^qoi)~A0(-j+`g}MOaw-bvPDsAH-v8&zmQHL%Z-{Vw?M(U3 zp#~sBJ!d8`41 zUV&Uncjo%|g_n)n5P{Zm!o58@>W@Eud<%`>5eVxuVSC|X*$m3I)P_N;nHF5sdu;;4JCQy1{ zPb;KDAz~iy1pgdc7MLZVmT0xO@I_;LAB%lL@uKF>^sDW4!@UhV{!ttSbNAcJf2HzTPup<=W)M7(ggYHqd|sMc*P>@BvE?`H z^6}o{g7^8m`|$Wjz{U>wBh0ReSw*VEq_03t;roA9PpxCbj=yYc*_e1_y9z;^nA^Wv zpq+oTKy|vXsODT7)zT*QXcf}YUe;>PN&l#Uwh%NoyRkx2sc6P7DdHH0p0Eh3Dv(sL zB-v*=h}SpY>m7SiH*(MCu|M?HZmR_5MHK+@y^4i0^2l>Qno)RoVSjXZH)w z;LuIV#$pfg;Z5ev@j^~c@~}~N-j;CA|ETvsO9#8o95|!?aF0Pv4WF(Aik6E@U(tLC zvW|0DiVIYHI%`QT_lqcC?^^A@?L5fcF>9;aGr+(w`CcwoZe5i0Lt#v=@Ef171G zY*H9}@@K}kjZ2;l$bHd+>7(^Qpt}A!VF)iv!s&&ZV-|i-_%gJxQBtN9eLLo$N+h+g zY8bRhX?;6CbrFog%!O0{6quunC9qavH7J%FlY4@i1gXLp=&cc<#mLpPdg480JAVL? z;cOfT=XZ*?&xwV3cgV!Dbp^!T7`PpNDol|~-&sU|9wh6Sg$DhO9aGemgZ^=+;Ix#`)`@?0s#B}aob zwAj(|AbiXsU3;5C=IRzYrJu4KimGGdnCuDsmPhrX{qxTa52+m!&&wZYf*wPC9jb4= z26f(M*LQAx*i7UD9^+q;lEJxF<|W5FMVt-JN8ijRl^q8y`b;pggbJs!rln)M&3q2N z^ff1qTFp5{*lK$6xN80G^?7cxa!w#1IjgZbH!Ww*EHr~fV-m&9gr#nPr#wucm+EMw zYr^uO@ZqUM<6F@WcND=bj|pcPdny9fRg(s}1YH9vwey8DK$l9n3MjEH-FWRwUI(Ik z|3N1p;c^88Rn6c{QPE@!3@dGn`m_wHaM`5mZHY!bUYCO(&U=%>8ZVtk(}$#o(}!>T zcV}aRtgT`N5J~IzA4|?Fgz?%uXd!|>aU)tGk><42Hqg~3nY4yH9W>>ce;DAP|nl@ zzhfO7e;Y3ARW7uPIO(p9`2ESN2w?mNt!+I_E%{DQrG|!435$%h3j@Cmx&hsyY!~z) zadnA131V>C@f>yxlKkLhjq0KWh}E+i;QB&Bo9b(#=~u(N&UxiV1852aN`pHQ z{-LE}-@4&Sp~F;puTN`8aP_?kr7qXwM}B+dPLEcFQGJ!o$vX>hOH;nC8zFoEWtR@o zAV~i#)MbhodQ;BS=@Yswk6J}@5Z>f;vnB2u_Fro{I7J3 z9+Zxu5q~6{mP7KACGfGj_KnH5`N-OC;jpjp2`Y zo2Cu{vmi5kpDDb2!ouVEH0&mjv9^Is3OjRgAdBg)Q5jjm(RX2;(qreB7N`B2v=HG9 zFWLBUMPmdy8@}L%=y9i2OG%C%7DFGB#Z8YezG_c(^m+6O zWs6gi$tHreYjm1SKLGnP>sMR&2iN)As(X0fF z-&A6)O#oY3o|mCK>4YD$&-)c~GIR!oxFA@zzMKyMRKQuqbopaNM7=m8rNsxyDFQ?x z!G)LCa~RM(u-?Tz!m1cuxH|qe)=?WSiI3zT!pB~vh2)=PzpZOzn)>y+JV%_+aRa4e zbc`I4j0Y=A!FdxR6eLjs(kI8`0TTk3fl0cq*7-y@1L$Q+MFVl7GWfynrdolV20;KRLp6?={`%cc6 zb0;Q{Mh+mNsV%TeedsqD4z?KCC5b27f>U#ea7ngMB%q0Cwd(bFcyOBjJTdrm-{*9` zm>1inNZ8FWNU$kE93xE;&$;FHd`1@T5@nop=LEz!SRBte+6_;;i`WZVC8zgh%HfTU zjOe=Wl|SY#!@avJ@#Xt{SwHm^5xY+Bq0ne@2e*Pw{CSPZ_S;Weepk_WDxGJ z+-6bo`{sL>o43}bYB!)05wuBAU|AjaioYpS%yq5(C)=bs|hS(ne&FS3rDfVSYET5!FB1<9LQu1U)-HjYk#^L-Zz11WYF zc`NF)s|0-mDn4JX2a_5S2zU9DEQV=3Iwh`1As)<|yrAQaWE>mq4_zj(kQQ2TnCHxq z-@$K&$6)jy(?mf%&f8RG39P^Zt}LTj{erbam5xB>)vv@J>6zkKB97M06=`J7fGccd zrx0k8b^l|hXAxii+Pfbros~t2?+;BX|J8k*YS*=vIfxXT{Nl{7~4?Iz1Y{8cO>Gt zCVuRHcUe1)UwP;;KYD8w-&Rz%16MpS+h^_<_q6R&QWA*)dODojgJtZ8Ws(~ zPk-V{CtyRJWidVsWu|f$Z4t!Z#!);0tem}qo>pq6zfrKec~r^hxhlM?1p0Ab#Y4=| z5qsxkk)Ka3vk2hoy0GQ60VTe`YSWC)hA*-``dm=UCxV&-LD+gu|-R(_}mLb_)9{Nq1tdHt-HHa5ON}>DR+mU4CWi;#M)=*+ML*#f zNx0`sPyYjVZLrJ^1Vw3@|05@T6YL|)4Nn3z|M2HuOhlN1GOcmR{nPH<<)1i))lcP_ zn0k^u!gGnRAJ}43$5I_PBj&t6r%tNVk@gzQ*#b*{bn!`OVvDUC8o*S;LXR6Uez)if zbo#SMv^Hz{mp_t2JnNwA?Upz_$kkF-Wh^nW9K*QZOUw$_L;<2ly-BLj5!IC!nOZHi zgSo((fIJEo#I z?&a(+A((v;&Dd`|f3=Xs(q|0er1?xl9rbkKMdIP!6i6GiS~j&0hLUtJCF$%;Ikt69-6ak= zvdWiNAOlVaJB=`xa4lk|y99Mypr0EOeL|EF{l1*;UqAQs74dZ{wew#;x2e4VNk{3r zZa1BMK)WjCb>ClJCQPfL1t^m@U-P5YA|B0b{Sdl2t*F(cq59weQFcU>U zHfyueh3)5^;C^3p<$b+w+skdcONoE7hfspg$9%FwdcW@VUJkt)N#feVBZBwOweL{Q zzY!tVFgllgsz#OU`XgA}sTC8t;^or%WwLWz%O@@r{fTieQMr5Qsy$r zAe0*PcVcy@yRUJr2_~_BUyLC5L@U5Cr`Hn363cR@D=4sB(Dvx@jpAYU{&jIXtZ{#u zQ**@n_}j{0a?BBPUA+qX_%4yykJszR@7$++i10pj&|3zm01I!SCz>F0PYhm$b2&KWg=3XTT z%=rEfFth(JFmvyZ{nr!3%FnV2m5<1zVzx|MG(DA1d|n?fQCxGQ4D*4cAn|QzU~JlZ zke|9u9OL_kpK96${voKu(Q~1_zu1*|ul@s_s!+=h2RwH-@uM`=J>gKbml9&L*6vbUPW$y9Js zHAP9CG@mxg&0pyB0?{r@$wOLi1vTShZi~K~Wx$@H7hta_;F9wF^bl?h#faL@w3<`A zarW|8d&LAM-aUFevg#=SW9`=TH60nN@ny-fum``xc9p#<>7WA{Y#vz@x7Vd`dW?+9 z1mF8j{_dRhE=xCWeL-cd;PnoW3|#d{lgoP+b zY>VMipDqZsL6Up`PwofDnp1GJ2(E}}xXNzXH`^C+jR|V(%$@h+*+O)(Q|*WS zgmi=8LmoL!p&xL{1FEpE%LNpY;gJWd-`DFF_$T$(i4i&)8{g73(W>IO#7lj)gMP(> z%jw)-v~uFpM9LArRwOq}2MY;&>*oUi!t<3^qLLg^ebk{}?u59*$0D*Tkbh_s)?1ZW( zBu42Ap+CT=SX@F?JNw)aB=vAd_twLNoafT?rjh0=jOZEOeWez|yz}D8LR83d@PwDA)+3rmTU(1%MWM_Jrjclp>N`+iqWisN+BJ{JV~M~L}j87iZFV#_4Xrk4;_Mz zo((${c?}Ebtv|6o7}RdNT*%rd?Y7=;G2574JsEOt<5TnD3ivQ`&521(`Z3u|Q5S1y z1Likuqu!3L_1Ox z%GeUxdhzWITQZo2Pp7D0D6%EC#n|QRl*mjbhA&l6NV9OS0*Lj_&tDu+GixR1zB5O* zrx5Yh*0DMl7tI`c&77&nE7X6mgvU}r0bFhI$BTnGg>__T&FUv^FkEWLMoXs25K~gh zKAO-LZ^>%E>BAuhXNU1J6;x`(5glA&0W`?Mj{gc0{RF2zP#_7#cvZ_N1@C}8e zW9P7(=QHx3$^Ol`8>DZ;Nf5S>OVOAED^Xrz=|h_8E6b^N(~Vm$na{1l7&`*`0<@>%QYc>Kj#3iPP2n`=Znu$eJ7+yl1ub%Jl2(A znG$Yrv7eFNjfsC)wo9SN-G)tl0or^YucjhkKZ{Ati%w4X#(vId`LHNUz#+i4_0iRw zZuOhmQsM@P?aIUaYnu!x+3F0KY6lK^3cn-BH-)-+F zjoYt}`Cd_XB0UvCgN}K8FeXUKiO0Pz>(~91BQBPH!dwid(#OZbbKt7VcHrLm;a5mo zg}+Zy>}(7KGj+tV)2x<#sYs8Yv;%6LTjZ@ZbxK5mBgdxY8He=M$X5^YT@#F8GP{QT z%gtyqWSc#iRGg+TwZ>6+tJS%oab+(UWcdd%#5nH$UhXT~9O#4H)+oJ>#h&Pw^tE>j zR7YaY_%7?T8qM}(+W-<6ke#lOOM|eQoYtcejqKWSs`PDdA~OYob^0c>i5GK_ubLCT zbOeS-t0B?8fXW>Tl$^sfH}$$!Uo~TBohKz>p{lROQ(&D!2}C9|kr_y+X%tok6@$Z=yx-R^TRx-|Q%!1EhE9}(maq>^P4FrksC zGtVBvl?Jvhf0;u`X<%h1gj{vB>&+e$cBEcvpKTl5mft;m&B($YF0ZCL{cFz{NCxd0 zuu$&SiCm?r?DWKMm#Iz<5+j;hpDmzbC^#GQ(dxI7d^O1(C^9X&3riBVeR>Sh*|}Hz z(Tt$IAwC6vo2x*LZIgI6*FbRYU-ie)%P2s??n#v;X5$sr!eebcBi2tt(znGr`m%>F zkThd&BN9YKXp{=K52`;vTL!59VEB*v<1rHR_)Bb|3#k6E&@COh@{dl>P~lr5wsGjP zc(mt*J=bQN|5PuhVI4U|V&PB8d6!AxrccYy{%zyM)fW&PEi1a;0fo&efHJA2A?RZ= zR2UhW8Kw*-{Y|x@F7PhJ5e80eV}qcoGj=S{-LKWV(RlKA-me%X;qTR59?bFhbeSB$t3!0deQo?9zzlw^l;Jgz$ z$3qF%edeFs%*~D)gvHX4avZ`E-K>ApdEsj+Q;a!R(I!dN0P*?_)zkil$c(f~+W#JXObTs^t| z9?8@AZ|4+cVEo^Cr;_!r9>=c-sDF-;ZpMJ!mUP*!;oi`X6DZ7zA5=y;)_oNAJ)W6l zKmJ#1e)r?!Id~+B|2(enH&SfaR02~H69zAsEHOBPRs!{NeF^dpopwdxSN*>?9CVRo zVw?frLyy*v`<>o1`!%_Cfe6mS$R-1P6cEBME!4iQ0jp30IObeCAw_Uqcn?d4-?kqM zJ^Y95G&GR>r0nd5&R21Qbls z%$aZu^aktQeNX53r$-XAbilSItH1Mua1bzbUVRQh?XGVomG7Af(^)Jva$w(#Syj^9 z!#nnRcxmL{EtOEEWfq?x42?>olK6FD&HZ_J(;=ao!v;U5IXifszT@n_+}?gnaQ@N7AYm=N1y>za zwwJNm^0Ok=tP~1a7i=jZO(fEF*#@%e1q4{_@mvkXjFgNG!5xl~4xpY5bt44UdeGxz zA~d7FJgi}l__7&n<1V*u~$$}vMkryP^E5VTq-|v)f$YA3EdPnWc0!b0d0`EDi zy9cl4&v9j|#p(t+KbKP*9Jnw-*^gtWM%+L{+@*wv#QOMYwC_M`i+QMm}VLNzVS1nSI%OoIo~G zL@~RzJdVio@@l97KuKpr;JJoD3&|&sVX?g`fxE`k`+~r2qL{XwSrrNTu0?zqotD9i z54VYyZwd`??pQr#F9eE+fefw%C(meNa%!)3Ujh2xndWR@rrCkYW%}7s+8+g4^c`3@ z&5<4Y>)tv3n~kfaT8_)<;8X7+A?*t~f)YMt4ks#^y>AyrLGMCp?3tUqRa@&`$(-*p+xT2cQ-Dc;f$8 zp1I=|8*>(rll@sdU^1dwEehKxMO27|4D&W43I!oT5NZgc(EWSkfT%ySAwS+#XYGMT z^z(0P*5-eL%rBh(g3P@-uEO5L9mrQ%GZu{@x_tojcf=iav|mzffOy8Qg^+0~tPLdn zY)CtIO~wJhwj}*u({_Je-f`*KaiUACd%XWGCnV&cH}=fg)S>j^Gd?JB0q3Fb;+Qd~;OT z_<)94#IfvC7h8@pZ6ZM;{5UgZSEb{ky?cxH`)cibiT8r@6Y^Jw{_F|kgd+;)K||}Y z4C!&;pC>%OIRHX2BJ^r9@%7x&Uk}L9)@7oblxKp-f<{g8g-jC^6jTFPzWqdTs`45I zR>S`eZ)l0FaXZ3+{{6V9n|(N|Gt^FR%sK1o~(snx*9-6r4e9;t1Af zfV%#!1*MizL_y)vBzeotPWMT=&2H&rN&)~{Q~^Uo9B){Jl{E|fY5K@38dyiJ0F;^D zQ^fle{I+ubRok=>bu2eI3reCYvO*v3ys*kA?rz1Q1FO`X4^$U6#loEh#F4IT^ z-Nr#hg77zT11Rsq%8RP_rez&sfxH)M^=UzG)U4lD?Sf9LM^13F?LQyYZBF4Aesczz z$f-dUd02bj%~o?USSgQC?S?9!B}h13^PL-F^HXZO42DMYqr?V(Uqp4f88(D?wkJjRABzmYNG_cO;rAG zzzaYIO)MWMRuMo|qKi%_Qj}8erwP;538s1PO}|MCwCZ#pY^$|X#SZkmvgES5%;cVJ zUo@N3jYt6#UX3#mW7GccN}`y+2ggqozzRdSL=g&VYL?uxuz zPYCK-P~SZ-Bb^HNZ8m>01~fE_RSN%c{^F^kakr7iM}mGF0<$d$;)P_oNTdWXoGUt1 z5)$iZgFGWrG4Ggk!y2O^s(mjed&$(IN!N8oqtg~lTC7bj$bqM5t9>ZwJ+;Ot+(s<& z8*d0(*BexYB5n4a#-DYE=0Ge0s4yK28Rg8(&YJ*uvfz(ri}oiCIo_D<0w#)W16FOg zaN;X3VFe^^(GG9*dnh_XOn3lL{VPrhZLd5r$R7ZI`YJPJ$?jy4@D|+kcj{PYdpf~G z>!%i#3P}VFr1{#5C*RLf`t?}BJ$;|~8=bTc28>Q*(LCSD ziO|{a3oWGV4MkWPv>Atq=|bJFN8ajQH~;JlM7N&26O&ewe+k)^e+k(adpxyMkd$8_ z)>5>+Xx_Zf`MIZZ}lF|iyComvn7C+_(bayn9IN=cRY;Yjog#q0iKrPb(M~+&P`9A^K z`c{A0danD`3GFRhf3ZOr4GIbgA}X5J4?qwpQAvh18l4+RRAG78=>Z~RF#_{~3T-Fx zzmP1XRN*%yi3WOTP7HEwl6SN%+Wa0ybf8IVe;nGi(_^(&0|<(l^7N5zpc?OLrSbHv z?C>fP;YW*{oCf5dRC;6NXgl-UwX;HesAKGps`S~ZKBzugef3BUk;!y1i3m6>XWbdv+z+1AQhBLoebTXjSTYZ5 zeF>c`m`2`R2Lga1lg|IM8qNKi;v1$C8cmAQJewt!=hi66T!-sBh$E0Thw+MMPfK($ z&a*a4bPt@GFj+~G=g@Yx34sTiZlD1mUhCHX%yS$&Q4{zqdzm7l|ACT!z1J!375~-W z6)AEDhqcg4b@l(Nzk6Hc3*>FcbbF$LKPGXv1SmO1--iVN*>m+!V7|trAR9?j+j*eM z-%y+9x^zub-Y^Yha27HeVu`+GhL!ka@ zgcp)?ph>kazil3be$$?C)Uhhx&Az234gPyuFV=9z;Rb5Zv< zdTOJsPq@-=T~KL5`VZ9f=@c+>!1Mm;S8rDgouCrPZMv`qHUumY-eG;v!QP&s&8th> z@HJDqY8WQh$B5Q@;3O#V$$*ff;6rvlA*|usUZ~0Um-$6@hCfdzri(#6BN%%=IfKx!L!kn{7cUumE?*wgPUI9`};0q%@4@Izw4*hzduIT>j12l{Xtzu z6m)Wa5gI&b$#M(w%}1=PR1g|V``)@U8n;j!Rn;&@vc)K*J7a1cqC+XgbJ@+r^8(`G zVlp&U{V<%r6q8xfC~NXT0kx4Y6>f%YB;tjsC+KvMLg2)|0wIn6Sci=}IDbd|lyK?b z$JF6XUQH2V}{BZ(F}i5`a=w`t(#J^7rRq!;o%mkj0E*PbKDt&xyx`^f`_uy+ z3(*dFp?Tt!CmBX#^@fzSba(k8T>T7GWL{eOO1NYx8*gn(cOFdO(K{cO`a%vE)Xn*S zQruHusGaBl+~#8C;ga@m(p~{#)Tw{!P?^oY$?DhI_@w63eC^zcv{A>x`q!;C3Or|U zkJ{_~3^lTi5^;(~{^#X0>18|J$ooyP$R}>mCWH-`U6dB+oyiS-)&25jIM@7g&V77> z4^7WdfNVbzXdHJ-qdx2y*SwAkaC4$)hA%jF>eB%{Ud$3F@}qVU{t$I*8}%|zzbU-I zI?mMz=fE*nDfCePRVSN)8%k|`qj?kqd~`vi_wXP6PjsKk9%W%+?Xg6h>G*+;lIFgv zItgO?`$%ArH`MCqQO6qi@oB5F7&F`6@2?*_B+;bm;3AEuE|tOuizr@~x0cP?NAtBx z8T^2JB~wW#eAP51YZ6(6)&-O&Di7t^enw=b6cm}<(Oa_5paj~iUIa5| zl@ET;K7i>^pjv$T?`7)Pk@%fGYp!#T5v1Iz`Nk%{@&G@bEXa7+v7yTpw#vBZ~*)ozdC z!V;8<)Q{#2D!w^xZ5h=?54W9N<}-dgZ`M=DwWAzqj+ywVWb0k@8DESQG}@EstC(!> zBk6JJ>v?gfE{(WBHi*^WMV6d7pXZjWX!7sudc^chSvhIWP6r0RfPFE*(V`!~tP;Q< zm^hV6O{#OZ43<_|Op`4L0EYniO|9&-n7opCA=Uz>8Vnr5gy{}p*|7Js#C_N8ap`$j zx4Wb)3P}J7%a#Gxuo@THUQ7m8d&oLL6CN!`#U**1S#T00ARL}Gdi8rb(Qk|H6nqYH zK`|=Vq6?Z-RUw$%1Hv@reY7N+5C9d%I)@_lS@8=TCBLt^46Wd%KDRY5CJJ6@(la-v zjg17?NCb>|`id)`c#egGONHvHtLf*r;aP<2Xp1as{1NAd!j~ti_EO~n`0ET~jyNxI zBRG_i!{p=XuFkvsZ+ztUX%g6nwi4Oo0_*EL6i~L=j`&&dQMNb8i&hiFO@PlJUSN6L z5%s_nWDtNj_k+Sv0CSne{`eVl!+sTQoKT+f!72pyh|hmOxU5_rL&7Sr(NW#07AupV zeo?Wr5{%ImS?*#sP=tIcS3ixWcF3Q`dq}lfO#)mVT86+Q8oGG}`N?Q}=c%hJV)acq zC6LV^(J6bp|0y5wy%LM#0YI1fU8xMXT2#jVnlre+WjHXcRTLm1cthw|s+6haOeFVp z*B?w-D%m#$JuHoyH80^g6*lP?L8USBo0e;t{XYFst=3?BD@QL!-wlb;o0D=CEBq>X zGWl8$Lu|qe12;Cz#dqh7tJr*Gw9drn?NIh_lJIRL`*%1#&DgaQVL%}j(dr1tFJYx< zGUFB_u}0fR7SRvKbIed!45J?UEUm>DLmBXPv@qXWjUY@?NXl7h3gHso^1;N;uu6=a z3sVB8t`ZgQYL?>P&W$2hKU1PiQQCAeK$wEFqL2?P2fe%7+g#8H(fNAmdl|@PomaJ= z&#RhUeT^Qe9j1qA!T=IhI@1(f?&jIeCK^eX(6hL6x<&(n-C*Z#q}{?jKZ~Bty=XbK zI%wC;v@FZ^ci~a?`aVM*^=e&<9G*+APO0YB9wL>f{wJUbeExw6O(`;XbvxGua94Wz z$8d1)0s#roQQf{IU~?^L6tGg>1(Y7bZF%9XKaSC(=jQtTa;HS!MkH+voEU#*H?q8o{QPT`#sC?i6n?11OPqq92A?^jEh1@_NL6t#Pc3*0MfME7Wx4cNRwyA`~#!TEfzBCng=srAs z67L?MuSHA1{HmihN)nR!=psz-(Ze3uht?8AFIoSQPmw^8i|*&t>@uJA&Iw17@P3vph-dE=+&i!;;)vsK}rdnKct9X~GM@lydFKX0M|#6><);PLzEPv21d)8J%Q#MjoZ2btd1 zuOosqr|_0#^{)JO>x83c#wAqO1DkdWr4FQ2d6H#`8__e||C1X)(I6SLdSF$KckPtB zd6ab;9_qEXQV=`(7IT`Dms3xhffI^jeY3XCT{P4Vn$*V~VUC^}RJlJJ6to$NOe7os zX)IKI=&o7BVjm?Y4H7rNRvcQx5y<_g8eJILuI=M1xpnM30wb_N>oIgW|L!b;&;6f! z`p@BL@k~#Fk|_Xq{M5}M5-q}X&LVsixqhAOVL>~qNRAt;v$_BiO$h)p}=15^sVKq3G9LO%Gx6q8z9su+7S^zHw6suCq`ai+~n@XQ**Ve?4 zUlW$Q-HMA#>A4BHG|5za3EY}8s*Rjx!1G5afalF}3c7aG9Z9 zX3R^P{LDX|hfb)69OhHPC8y-b&qF^MlH1UW*RBn!ym&Pa`taD~YQXp&_80CQq2#~k zOaQ=-cp~Kg_4gMC4N`oeN98&OO~W5;AZWIH?46Y^=(4O#n<2V<^*!;q&K*6|uSg{^ z4FrZg_x^=FSv%D&8G2p`NUVY+l){)gXOpOO^vh;r{OtS$Er3q~FA|Yy%+$SVSkaVn z*7+@uJcRN(F&QiQz#nWEz_^P_neHCJ#?{GMAU#f(o*<^1C_RHpw?C(MgECqL!ntEM z1AbSdcaH9z7>t~vw&=OV5QYK-7i>(RQO99SRIYB{4$MHq+!!OM{b8HJd-A3lCd^D9 zSEJ5vIn4Av)T>;`*>H}3|9(Hy#NQY~0&E*{zy%Z4!Zua8X`UV)S}`Ga`%^r z3al#;!-2^oAX*LpI*ho}&*~bJeqr$r?y@AE)l8{97~Y-CBF(PJnY-BiJ*{?)YqrYO zzzzNvAs_M5W2C@(yFT}#H|OSEZoj9h_hGRN@q@R&O1uh_rmArQ>Q;x}Ked8Gfq(uG zMx4?+KOg2Q`>O#in8wCFr#A1_4Cs6lI|o&D z;N|XVQXaUkXOPDd2@`p2=sf7ks3 z=T*M412C3d6HiljJ)WLkk?r^|zA*eoi)cfvr}3J-U8%XpbCL0!c1U zBg8%$sxCsNfUcnUi9hMr(yw16^xbi!*GefLLf(Bpp>I|xuSPc?yj{4&f#owj-(S$}ht zcTyF5MRal(JeIJo8|A61X3Q(ni&vyk5rC1fse5-{rDML}D!$PuJ@s6e`4q~mb1a@gn& z^5(ye_T|z3DyAtK+lu9Bs*nh|mUqtnkJ znd?8cau<1bE8Sjs6H?Wh81+IE=c;IK{rUUnI>jX?k3kJ0Z&_=P+l_*N|{7bE&vyt)jKS%q2SZO(OGIwe=Yw40GSv1t7G$^U1 z`?>Jch*fyQahuK-4Va4in;gCGx=RuufI^F~J9O_v`IQm#zNojSuG(=U;1im=~}M`)~p~RJRpp@)O0# zFI$=(PUXF=&jEX75hakH#gji5(`_1TCRV2h*RQwkWy{NTd`u2zN2_{-!OR@Pygb;V znNiMcV!fSqI7fwy(afY9yZU%*=PjDMh24%7vH z6E4!&vVVB<$BsmrWYstHX``_m$k=$v+qM4rGuMg(g9DoPK=ni_en(Ad%;J$kRTeto zpHt41{PPjcj8EBJO)v=Uzi6?eYsL`f2RrRwh~xH^!XVnIP52r(4`~RV9~3i@V&>}q z+@&`uDOWxL9?aK(3w*1|`n`hKNY@f>bM4A*RBbO%t*vS+0kGi=s>_f8@SQQ!~k5y7F>(;W7vJ`G2ygd(nVnz4pE6k#;w#c z21vS>%(3-KxRIQK#uma1oO0{PHLQ30{z!6ICei@TBJI}x#!56c&OmqKY+RBd*p(em zjN&2Apx%3qphlZ=SdQivDA@LY#$OAX*?i)wg|c>{csduo>DNUl2fhh%vw1wzOHkX* z;D((72XK`;$o{Za)-i( zVeX8g*un_*e+3_QSbx-m?1f8YS%HA2L!5K zhRjX)9u+snMbA=D=%b(0BdcHyFr^O3a|Sa+vl5DjmLX{nedkqLvB{do#pmuTlFK5rd)aO=fM zp?&$VS;Z=m#1D0Ak!E3nxW&+55B1t)+FYtY7#SO>&zLqKhLa3rW&+5iXDgvtuDuIs zV&Zra?@1tDH1W6VnI-PQ$FO#i&zL&F(9K_K-TGP%9`#!6NMcg&d^;2^nr;G*{6P+U z43x48Q56Cq%R>xde~IM02XOA%9t-d}bxy>4AN<|dYUX+AUBNx_X*FryMl6kg>DObr zMz8={MbY_l_TEm>!hi2c!E?NJY zkad7J*x%^xFwfp6VM@h_wBqObM%#=tpp51T%|Vlwl^GbunyBG4TEa2evhs@QkLw zT{OC_!wlwZhch5_<~@CSW~`+UD3q(eto#}$?16%IP=>CyC*?FnyP?$xv$zqPRW5QC z*O4Lh9B$8ehi63M5khkO9s1IHLUzRq(gFzOi~?uxJx1$j3Anms*FGv5S30!{ zBc;kwWrn@L3=BHh_Jih%RVT^2_4W9>M`w3VoEeAFqP)S*@fR&Pu^BJ8Kc79EfJ|Kj zpJD_zSg`WtK|-(A#GF$?X%m&V6Jrngy_sk^mE0B;tSJeHQP_IVIz6S|XGp@KB!3u7 zoYrgi8du%;)8sZC3eqH7sg=ML_AuX~AGuXr& zdBZfCT*6UTmA7Q?Q)k{;WF_e>cz*b2Eu(O9NvYixK8a`RIhH87ZCZ()+0|6n`!P?U z;uo@IR@<@AWK#+O=;v?|Q+|t2?je`*%;|BkK4*dGaa4+i-qJ%%hmcb~_`&v~Rrib4*PXn6aAhzeDUZ8Ff+y#2lr? ze!ScBCwG(qDofakm6;n1HHp*bDV7g!^VuJW!vl19m!9s}R%R{!-9w|#gtim2Z zMx}Ht<8-EvX-f3>6~l+QE9&DL@zA&%)vI_47n6Me+QyqN{-s_lkFwdHJtD4nLytK3 z@|q{;^Y0pqC$mW9Qr_Cuu)$GKFbs8eDPL044s(SZ+qlzLri=7toBG5FOumt25ACi$ z2w8Zp&u*26y;k_uq}-@x&FcgZTl7Z?i;nu{X3578tZTJ%MD0-$6DAv515xLCPu>nj ze+47}T#x4y7U}3z4jvWtwK4)R1(q(pKakZM*BVFY`-@uIyabOtM@ifcp-A~OCTQ&6 zq39RM6JrJ_|Bf@vAbIL~0|ae^l59|`u+4|mSHAJ@%*+j0xr(_0S}Q5~EeKNQ1nLEc zRrP>IOLV{4+P1oZ81>dB_k!{gB6Xbt|L@y?R*=}cI7pU^1XD}knl2|!v-Me8PLC~N z5;3sWD%r)p)U7%#3fNU8{15jYPbpl=6twfuaz+-z;ELl695TzAum5K7GrR2a_v!~q zK5i&a|KU0$KL2qYrwsqN4l*)U2*Vd_m+?>aM(kUVt7n(JF-&lW)tiEiCBScz*9mTsW|T?`Vf9x z776(qn6dWbv}v!aPjon(Z#cIqR=E<&w=LQsV9 zrB%cQlSLC}=Zt%WYn283)Xv#of|xeKRWWk>!&;7+Zf{{z#EdT}h)5I`yjeEh#_HW+ z=kX_}-vz^zLJUK@THSH?!W~RG7&VlZY8r9<(><4S9BHi4+i7-eoML8?kB56V=ddbk z$b$SRR^`I?S?^#K&#YX^dK^z?I-^m3aBHgjxIYV#FgZA1# z<~Xc0)ysCzWwPX@#$#QkkjkLl0uLwT*BBPKN<)?2YWzWo+D`9-dGVvfT=luP?0M>w zSrEYDHD;uO(e89Zz_EU(pA77E*;M$qq4A;tuT17{rMwg-qlP-cKF3G)JyYhNjc3Nz z_&U=bP31p1D(q;qEC z|K6Ii5oT}iJkA1gW1%#PC{AU5QHb521V=~ftpq`ai&`Gmi8h`#Akl_}lJhjU&i@|u zj_ZiNsDIK;t!BZbAgdlAUJ;avpbhc_D2ZG}jO(PV93ddcyQDNWVmO#w31K5a5L$G36 zYQO@n^@YgZ9&#mKRpqAwCBH7r`HDTHdbhi6eves`PWMDPRFRQW7aA1&67q*9p;=Vb zrx*KFXxsvs@_44#Oo<}45Bwi~U!re|?FJ+Fqb{}dppWd)p{vsD%k_`;%tKbG397{4 zzsCH7h{{AXSU0o4^i2A|0ga_#1iktC44sgF17{}RxN0euu}7SrD?A*M9)V%6ZhJnC zTNw)r;6Mz_D0Ha$VU?KNeo8R0IQ6MCJg@3|@?|hAhfY5)`u8`a>e5!1c)(J;j!kDoCi2 zaR+;ZZCO};f(*d;zC0z%oS%gsgyvh3*lgMgNs}=QS4m45hDg|80Y3`eHw(1!@l@0b zb{VCKqkYwqB0K}LOa3M{s48*mXtID8D}%X z(cd}rrs^7ZV2?iPi{wDL9!B~)q1XyvLvi#0QQ8&Y9QwYtQOv-0+2{%W&1ZgK5zSVd zn$7it-e1hi0+6eZk~#TQtRKF041bIW*|Cw(-M(qsIae;~HN2et0adMf1JtSiQ-cvg zLVg8{ks_@ED5q@_D(go^kA+EJk!K`MLX&J^)t3LbX-uvO3F4rcCUU-id-J_{&^@Z*t1e0jaLNov4YmHGjN!a@tcH#tCBfBP9cQYP9P7#kn%`V;*0 zLW=B>Z&40Tx|V53JUT&+INLaA!CdF4$*pl}hJ#5Kn zoz(5ep2z7R6%U=Gj)_OZflQ}}KU%W2pz^0ZdE*Z=9}z(T1gLHlXi~RMaC$O+O`CQe zuDs6D#Lb|PyfcWeNK-OlsG!uw$!r^D!{k2!vMLj(QK&x!cJnnduKOeFpfStvvqI#` zR4&d?N6IUdtVq=m@Gox3*k(AmM0zB%2jPiZ_Ag~BApr}1NNlNv4DTa_mngKpM0axniPc*FK@Qi0PcK-nIolpjh-Nin zG#B^^wOMyAmqR6dt#H?s3y*h`Q}=#1*|x5s#Gj0lZNaN;0gZ~O%;B|6J1imsj6~fU zHNCC%NgBSy4|w)JQ@afqh3$lX>NTOXLTlY# zLKkGaySww~agi7FpD6P}j!ASbL?*FAFETgHbzTbQbP_~14dbCiH+t;;SppD$))G+u z^Zfb=!#{H1K{<}ZENuM~eca3_B9W$j1fJ+!SkW>B4!u0P$-usKq)kYrS6>U1fN^ye z%K@S6ErBYQrakE(9pSZNe05Zpd>2-@7kQ>K8m-d>zAtQ6ih*bjSCEGbdS;F8giF-O z)zJ|>VTlIWx=%vKhO4$!G!(E-&g=>s%R{EOjqn%JPy@qF&|Bg9wCzNz1}5*x{CcbK zkpi}!ukK@ulu>!c@<185Qt9IQu_r`z=>Sg@fRpu-qA`cT+PVf_s9feDqgv`PJd;~89CDA>(<(QA||98`skhY z+6kUbG^$g(j#r8DeJWs~LPfvgQc+bO+Ry<>TWJkshCNqQIx`VDby3aK36CeN-|*Xe zI{`>hMi$6B{bpxtg!~$h!p&putudB^Jyrc~_+jaxAWdSWvYB_eXfGJcmd2a58(Dp!!2&YYU+>#zbFS4Af9l)UTdP%^*F4{)@=WgP=I$mRInR_tG>V(z ziw?OqS4U>>Q^wg@@sCxmJF?KauYtdwg=!(<3&;I})&JM6Xp)-g8XA=@tpaBZ0eiu= z2A(ql5X*N@47^K9>)!;EP})h2Npvn*{H z?w(e#uJytzcaJVVA{w$^#z$~+mzx>3KXM#i?TE&?>j2@$-9JYm13B7$q<*%CZj$Ye zJ&7=YBC~Yer1IhC6bF_~#^NMd3!i=SzGYkmc&v)aJ#4rQVioBBzKD&aVn296P8&#M zJq2FiH(<l8(mCup06fWFU;C-k%-qK?8w~h(%Lx`}>=1 zz${ccLhnk2N5wCMRN+lfyO`%(08lW!?7^S%Gj$S=?5B_ASOo&@o}f$_g3Zm%r~bG6 z8JPwIsz|0>jLl-h9i3l$x_88heSu@sRxJgbB|UftxASkO{?L4Yrhp#Ea2XXSuS^(Q zRu0_QYyp}Xu{LoNn`*Ke&Vu7d5|af0j2Fu@DGKNa^sh=n(z7=gM&Oep;(R|EmZl~^KQ@AXAvg=P>x&} zPfswHWu{)$QN3R%)pSZyT$q2PrZ}rvmO|~JD%!xhSzwl$c-;zdXvx#qkm>k^a)p_# zT8YX#xPJ)y><63c{}313F<2a4A-}v1nhL$$pGM?|ezLx+mMB^iG!Kh*WzT7>=b4WP zEtvO4H02(I7#f`m8t(kt3$j82K$n&|C^>V}$=796{5!1vib4IX%2xTuj_;W^FDz)j5{=F5oO7h6oVQQ=D?e27^ z$LQa0)v7lC1cFcC$F3SNxlvPjs5BZ9Gi;NIc4tM2Hs#b{NEVwis$@N&G3Z~>8e$Q( z-ZIHFQJu4&ukY*~bG3qV9&&>irzv$1y(w;+GsP-Q)N}nJ8FREE*_8NCKj19fao&CE zMedTo@;2^@z{(lZ^IR%O{FyjK#vygL1d)ck2uq-29CK;M23y|E@o5p(P$0uqyA$in zPqDnR3*XlCVMqwhDN#UX@#!oH#r8XeQdu2xiYM`&%rc|v8!qWzIG+h*n6@NrMu@r3 z!^LY6t#RFUa`Il7@aeOaFH-)}MMvGf*CLkd-{mqbf2)R2ZtUktXrf zISM>+)ITWA!WT?@E+zZV6--;VYyH${)T+%Bb;<>nnlP@4d>a6Z?)e}&FO^;!R&itE zrv+2v3)sfKYlB%LMAhn(xZAOGNuBfo{r!*MwtPzM2GP4xBrD24CRI6>#mjxrMBreJ ze+udqUQNaC#n^yHCn4j7Or5w8T!2b&(<+Tss0Aj?cwSc8(qa<}1~G*|h!pD#kxTuB z?WcWDg;ZW249WonaNu$VM_(UVuBlL;?mkNl-lSthG%{5Mw3G|-@ivYTcaR;I|3i+DB0s@kVXcjV-KD^UfUxz1k| z?MA|Hd-=EY&DpT!b_Y#_Nlilr8!t8zmXL=Dqo2AqwO#-Y4q#k)47DJ#3%HIZ-B2`q zA|FJKqe)8tf|}HV!KV)w#YcTe^3sOgWlVq7F(PYF|6pQ=jBASo?_qQ9_j>K6-{RBp zseB!xS_yQ?-&X$;R=IF^i9ba8UkVjcxgz8Rkgfi`;C|3Rj4(pgDJ2g&Xfm!Lyiki!I(RaRg~l~RSH?2> zphhgM{}N`5DIK z9qkFsWcKXL!&)xJ_4}p%6-ziZ2%-i+p($hJ2fL}zB=ewy=7ywl6^qgsVpHJ$2^T?v zP4(D2qD)#WuxBbR@fVpXFVsyYzB&9Zg%yj$gkzHqQyTSFsjOA8Ere!Epw}5UBW3Md zU7iR5EeI$U&L5ySQM>w3lvl)uWBeUp0*+2mU}W_%xxgm9-FNUAB*@M6*ZJIxH zCJl0H(B|IwWQd_cnvhP0)b|3EA}13`h)3 zl=7Y6RDGKttduky7*lDZviOnYr91SdfKf!~0<|Sq*?yQ?u$Mm)h)G0fl~+4Iaf4&C=6?R^4_nV*ZEa+YZ8Rjb+(5UJ5D8(yB5ocQqXRvpbf9&c zCS|w}Sc6Xfk!T~{2nPVp$o2C6akM4cpMN)Lyx_KkJNGeXL=}52SdZ+|WGZBhkDwar zC>8JeCWJ?Du0&pe#rhFJ^0uCCgvF-N)2Y=Q(U(EQpl`|l6ABE~8GhPk;@1F9;b2;L zAb!kDNltK$Bb&tFyd`~89L3fln%(Yb)Vjs60PcS-Cun(x>l zJqd`8nFFE~2hszOkqmD+U+n`y|sjDY2=Jqd-a#beRhFQKn zg;2d+1%|&s+>Z?@;TrcH9{v7)49y8_ZROl6{Q0iZCTrs!9ql8SJ;0CQQX+Fhc4EJi zQZX#sW?WelAEOUw6ufSs5H0#FVZYXYs@xNgQ7f3YOxf60C@WqzB+$_QG5TVLLDaOG zAa?(f*sww~S;IHtFpU1hkHlqUKdm+|6`hGjG6I#vlR;R6Vj@l_n0`V*Y_yx~uxv!b zM20!2yEp+CW!uqgl@)O;)n@F~?d_y9Q6IhW3pY;fRo@waopFbnoh{;w47Z2z!Ek9< zc+pL()n3D#4IidqQpC=&aa-wGoF%ka1KeK=815_q5A(4WQ!XZ!ofoiym^olX+; zT*!-2{o6TU+-QIOl(+M~APHn924ayohSG#u-sXs(8svz8ozCq33u2+^@SLJ$4aLF% zp^0#n_d7YP&%3dL*OjZntJF>cdm&u`{@Xfj)B4TF_jT)DlggGPV?kX;Q7*5jqFHbH zrVTegOIL$9 zmkT7Xkp73R$_3I@6(B&f=7zLN{v*Udm^u|`hm|&k^#DW_H)B+ed-;X`yDgN|*hUR8 z5o+7&$u(gfUKwzYJO+m+Mhx1Ff#f_QQZsDq$Bz1W*blx#VkcyZJYxskS;ioPxCg-X z>0rG}h~!QDRn1KyspZ~gw>?zX;UPnbRNhUg1=z^dr802z4Em5O>JC9UM+Jqvyfn7@M2R`^?hvUD$V?uMn zJmcLe(gopcl_I=HPIi9J>?gp0v%-Q9fgE0+&Qfmngj$tjpH5uny@~Iv9-jkP8?=sW zSNdao{H&*8!;Mw$+&oK(+2|ppkVEn7qg2vDx26kCb@jSuRfNAkT9KK;%vB2BFWZ1 z^=wF6X>G3C$WJ71Q%&xYPf^IkPkF#Lu&ixj!A;mqL+q1|pMxjUY1^ODowQP-&+Bl< zyNdnb1$uKWEZT_d?CH6@Vw8WF)4M`t9nYQXYI}16pZJra`NPJiYUNoECNRnWL)be8 zR~mKgy0O(UJ4wg3ZQHhOXT`Q{+vwQpIO*6)$4!P z8&)&pKN;?94;uBX4$VsOjM6i!VVIH4J-F*m=ZWsl)g&8w;jN*%LaJ^02<0RR0lwoH4R5l|rg7J{t? zvN%fl#|iT;8Wh<=kc~cM^E2{0{UUKHoEayI%R^*o39ROkw2-@kaj$kuYE+U)Al<+134S8LOd1qX5iP5FTfLj2zCkxQ@Wk1zuIFd)!`Y2Rg81#d9Bh7_WMe zCi~@*QVR9!c`o(a&l7Ygl`Q)MQKfCNus7PX{hmFiog)dBWk0VrZyl;}j<^JVuE6!; zBT_nbSjpawl7%X;Z0y7BXM8~6*Ou`c2I!((2a&rHu>^PjS?nZz;` zqK>I)Op9neQc7(0eEE()g;SNo7`-OdmD)VfZAP!Ck=4`(CjHnDp7Ar|Ad%lPfkkhS zOMQf$Pz9BRK4t>M+l@0oZRXomIT0WJQFw67M5!;L!vz@1-I)!qq zO`Js!355u+9ru*TY)k(De<3wg&k~dRC77AP^#^BmzCqAW_0n50_|F$r{CJMBglW2H zt`ri!02~ZwWZ)lvMiLm&sD-j19=H1jj=%PR9B0rt!q}>1{huGd4e?tj zitUeE`H=FU&33i^TlL(66_;_g6iQY@1z56gJ(&)E&aKgeSM1ptR;@_33UUG+)0DF` zf=|j5$BUq3_U;?0k`ad<$@l0Hou{-Glz*_cIKQ|r>K3mH8-J4TxH(KF>3 zztKDf07Mn7N-?R`AVMgSQ^Apyyra?an*&t`;@%4iq5$SskvxluRq zu;p44^s}iiQH@oRWTA&5B&^1#p?P!uQ*ywg!h>gK46x=sg&D;%v}CaZ>UHQPMG^yD z9|VrYiL)42x%x=RhsgnYk+Ay_flW+4Az|15icY;jC4`vuRnANNgpQ;1 zlhm4o%kh0&sXsGrA40=87LF1+5ogd=j0iQwik_2&B0Al?w9A+adMaLj*}8rUAY{XN z+5REbe*Zh~QDTVM5pB$@V&!~9zHfylNrzI=vOf_G&IT86qdS|{zq@Q=c*e$h;A-=) zLl@4G59o=miZ2(T;;y^G1}eFKXv-JRwFb+gCrm_N4?^I5};A`FY zg6NnZ$AWtoj{2C{%#z5Qp$~_?lj^Tq`jwpV|5hEPkblB`N-_NLi%MafPfR|AE^=M+ zzpY+9l({QiqXY_>`ZiEQghDk*i?NxRJvP;Rm#ac0cvr0U_q9dfB4)eWp7Hc)yUPKv zeO>{!Nh$@IHC?uN4+S2+DI6&bAD5%3y*RwOy>)ndz$QcPuFC@Leq09Vnx@>r3b<;G zVi*IL-n`P%_#;f(m))%pn6WYA9QLEzdh}?;ACUY#jGVA@SM&K_zWjeh`pdtXAOEX) zH73AX`ED;|4`86}c9vl>Eh21xHPLyzspIeu!hzEi@^8NmhlSwOE~?7u`Xyu$qbh|t z>IBC$@Krk3sV(HS@3PS~Ga)a-DToo8E!T0Fr376Esc+tr1c;~*b zUl{6N)ryW&yB-I|i=54%AWF|Qko09JY*)A}d<#Bbu@tOs>jQscPQZrZG32iaeCyDK z*J@n}C|wf?%gs&axSn46&p8_Q?;KV6-{+{!|El>!vzD0oJSN`g_eli|_0c;MvWxrw z)Ep`1-#JOl;a4qu0ZgJX7q6mqlKl4= zMFO?(Lm%rvwNVx168(+TlBgv`q?}TR-CcS7{k;;PL3>2>!c<}Xx0S~dap!fwbn~(s z+TkPJ2o_j#)TQ&k#^pQb7!!2pz(}73z=X2N#pG^G^ZRuFR5sRFKHbUH`MhK+<}H@E z*6vHM28FcmvnP*x_K0pqjp)p!`B(DVj(4}!t&;Fmr*n3$wjL6LRK+RlAz-3kYg`mU zZ=eXDqf2i|tbbqsj(Z0hMl^LUPBbBmEJ+FEMzs~TBm_Mb=vjHVo4Y<)J_4W$$bb~D zUpehTZ@B`v&QIxHkXcm!AYNNKigM4sSI9XAsT?%=%3eKHJ8lx2(fTWd11vimuc2H9 zpb#A3_tO5<9ElBC(0O-#6_?w#nQo@%ay#NdW=j3qlq6D#k4RBu4dg#9Hcj5)k8iAg zlJlT}e}XjR(IEGNn2^Q-09$2Gq?AXkPO?>@(jOgW^IAoP-!RHdg-IaC=uZM6!-Xbi zCSES_7+iT>y2bV;n#AL(CCsRriiy_ZOroK=v9sgvMKxO=m0`65htLi_xmBrcZXGMw3>z@?u7mQtzRf4TOB62hSK|I+V>_4uW;Y&G@w}!V7Jd zq06$2(PO2Gms7#!m;B6T{Br#}eh-v$Fie{!(tk;-#k?gYuL)#O8Lpc3obN6An z1&4PJvQ$L}C@Tb@`>)h15+h4lQt4=8Pb{#}Y~hY>CX|E*0=HqDs1->`2vcKD&N*;G4bQs{SY`#>ge2QfFTdsLMVH$S#6Y6) z!_nM*l9e=V)=-lvpQ$R942pZvTih}MV)}#WC|XY3im_=HG^z_PN2i>5%jF>_99|SmFox#Ts!INlP1 zO%$n;AN8_+N~G*qV9HQF^Ke%_DtxL4Nsq0Vg~Ho)3o%1*amv7UD7sK za=cSdapWR@J~5OZ zoB};}W4ig`zq~Lg5|7C@4o`>o&-?oPJuv2cF!L*>axNWCKlHp$!gq9^2pvBECclOC zyc{cJJ2hC??}rYUXOXkQ7JF!DSpCZJ!;LWDVU0Rjd<=Z0ir$Hgr%!@ng&8cF9Tm!% zBf7O5bf4vIr5@gfueiRMiZVH7hkMGKCD#Y!=ze@n?g`*b;gh{Rq-?+Bop%s_4WG)9 zZ)}YCvgRSA&$QlWzDtuZaBVjayF|KtG^4Qqz8>uynDjr`3F=0J?@kB_?#}hFUt^#a zoIYNBnJ=afgLQE!7QO{%b*69(DLL>d!A*Y3Rx%JUzx!=vQ$qX7 zXrkQjHu^4=FFUp!-lp9Zn%%FBZW9+s;WC}3%zLw=km<(l%z9V)!-is8|a!E$Y+CjqVS=QyEHHLna z<2GmV6?iZC?nuZ_38{}zevfSJL^A3ik{}>8nfMO%tL=Ta)fsP}G3nff%YZU96)OH) zDg%J;t>Z+EV>kL#%98c=!fTcHDRc9o>ezfSy4kzu7~}6_t*1D^H6h37_p>9Qp*Nk^ zo9P^qhbBiWqPruACBDXxKU8uC(Z!2LOk*wf$*{1Fb7aaJ72oXn5*><`@~0@i4Zdb4 zp9+Jd2|Nt^lPB)gg`zT{pH!toF{Lley?nPwv*K3!iOnPoCjA+^Z;POoDH=QjXUs{@ zvA~|@RB^ikxox~JDunqSK^z%ijFsGKvCeAFC* zG(YO6ZST$x%H*2_Ie_6o22^H9JZ+N%SgaW?411k5imH&hQdHfU0PmmcHVf^?PA|W9 zbN&hqkPqXJ1}{RU-t9wyLUJDA3BjeewE z!IlTSd=<>;3d3Oi)owHdZaO@d&v?_BK}mP4``;f*o=+B?1CB-h)pGGcO*!F+Eo#^& z7%4=Z(`Q zZX{R4e-e|=#2fO~YL@f>srF|1k#t$!X52`q?uH44Jw$5JoUB&g8@`$-@n496Cfeop z=%0FD-KzlVMtYvp!Gt32PQ&4N7p^DxK)e)5)-~2GA@^r7=x%reCll z8Ku2_B|hwC6HJ?koU>4|Pdx7$6KHAeytl90g>46{m=4eVr72JV?ZfOM?71j0(EQs% zlrc(QUJeBfc9$-`-e_Bc3}oU9#?nY1bO7UcT@VziM;xN%FwtMDkgbqj1>&v3ME1K= zP>>#j@#IEeIUczs%bq&;|*4)HMIkU;_X7sKj6(9=}aBvqN(8&w-{d~$X^ z;t2x|YvR7w$W(kYRuJ3HU~0vD5z}l}Z$c;ziI-b4yPfCBg(dEjy1+C>4J)6Pd%it+ zNq9--^g|abGPQ12rn(y1_c?iC zt&)cpu*WdU6xDa+RFONI+O@}M#dJuE?h`dbjAP|&_-ZJx5r9tF5S0zCcb6>8-xhfl zL_7POfxpn*jcwo20lz)NB_2~0EcbyPX_!DFr66u7A^6dbm+`Wl~v>7>Kjjsog?$U&}$=JEz z+hl}%WXYE%%H6fxuh)Y3OznQd*-Sut$&@6sEqPnmbfA&?=wv`*4q}1{7dk2D7S-zA!@#raSzREoIVf?ptTxsL-oPgw3z6Gem#n98EXQf zMY9kLIeC|H^;FQ>Dz6>-qj&_)%8y%%sMNzLsH}#zWu!GX+~(3Bp;+&w0?$B-!+ETW zPAyzb__a(RW8n~nvS~Quk%7LZwdEyDkw^wS6>rWOG-v911@%fN>8zU9lj=Zk!nXc? zR^T@JNGm8&zWx^y0in>!aSjYUQBSuQ{RhO8!q*&P>HRe60fGX}wkYVulS zRt6G9J84HU^(<(d{huzhL{B7&s>F&+@g zvzZjupFB~vlf@M66*>i`OUcwc-=UYT1T$&l1I|t#MdfnClXaADq*CRPB{*2_q;mD* zhbM7f*E)21S*|1OW=ANj&2bYplD5Uqy8Vb&6P^{8cqNEB$h49qlR#2z=MW_A5J4)T z0G9!ln4oc+j^84xFf|LNShBS_`U6v?G)oD0Gn~2PUeW|#Gnb}$6-iDpzgN%!(xJ6e z{UH;2t)Fp7SLgzGN0xUPslaX=z^rm- z?^q(%>Ko9`g1U@sF&VTXnyJA9-8p6-0eleyD-CGpIWP;hRScM)?;nuvO|uvhFvi24 zz0yh3KeLlW#~inY;fprVo-NG@M7GN*o6fkyews3(Y)J;(>hwVU@PT7&8*r_7+>ypA zAbCkz5p|5tIufDg}zz*q2}y&l zoZ^{5C)N@%v8Rc3O>52sRLd+jnDnAsM zn!O}bR!XU&!#LQG;#Ddw3Eg#4J*+-+jL;NkSoHD;suE?n0!}+I^$ZGtVis*}g0@KD z{)0v9Z{-3}vZpY#4TzMu_v15K>u%O(YvMTCPD)?m+FkI9t7u%I4q8m%3i%j(5*GG3 zP;@2n@~0*UbsA!CAlK@9csnGGlBtt$e4@pHHf%B3Bl{1(R#&blV`7Pkzqqal(+f&J zo^!_*;m_h^>q${vBg&QlCNU=E#O<5{qY>;`ElM!V;>}AP8zIClvUt;*HE0vJ%zQ8e z;!ZK9uPOW4ofiaD7r#CS7BTQD2kK>UcmlKbWASg(+~tHg85k!nbR~rk*y^QXiJVXA zLKI!@5ScEPrK?d&#W8}CLk+7a$;MFj(YS-E6sX>lb3w{~!w8E5grODns-bpfBu(ZT za1&|&zL1N_L>_73)gV5maV3>zuNr$~nymlKwR=rRRXfpr)~v!Hml&sGaD|Y=r1^n< zhZR=$WBt429W`{a^2Gc1Sc4)(%CETv~o_5RVF*A1o4c^`` zmtebPR{av19d>vQ2+RJ3HHw>6@9jWl;Au%mg~kj%^R?mAK=*KkC4I>p$K2pIh%=Wc+^f?{qN8)X+q;y8Ck;f%G)2 zXWnU0_|eb4`~Z3KIuTNr<32L>5}+vu?2Tyn-^v&Iacm;q$bI<#{WxRz_nivHgwTCV zd-vE-L*C920UMGvXV&S62Ipj9TW5I;@)U7S z={jH}d?+{kn;N`0?72C5PW5~0QJj^QoP@dqJAN{^HeO1hq)oRazAJmWKnrVlip*>5l+_^oK%5DQ+`={L55hv|CDZ5$CxH69ruLus!S znt(QyNZqX)p7g~#+sid#$WZjBktHs19Ts+#m$AmkF{N+*5S`IUeB%+|0D@cgkyN^c zEj$5nj!&g^P2TQ>g!k_U^T!A8F!B5Z<=|?DSE1^s4Ud~P+4|OO7)Ie!@Osr$?e|C~ ztsBImgz$w~*tuKy4s#3w5)i%;$4Bq%^)gpZW#G#i-3~G?Q?(-5aStiG1XtJ1EJ`?$ z7}VFRpTs0U@?Po?S4X3y(q+jZ9J_kLRTLl=2yh_*@yRS`a5$5V!pFB;R9&iq1!H;0 z<`!jY*?ZV=*!E=CpalsrnqN^591JJ$q42q&!Ik>y+Hcf0uCgyu)FOnJ zL-bRiGk#C#8PzvZM?A6(_Oqf>wtL(8WNYjiC)5JE%fhQP!2NAw`No$OM|V5-=?xG( zVaUrJz;+=;g|7;a>{v=!Q2?r6M-x)DMf-+OLy7ed=Byl11vXIh-mpTf9GE^YoXfRB*PJ{H)MWOF!O<9S!Q+H}|x~@xIm_u>472Ox@*C<3tQJxCd*?ymA zeZN5CPU-*N5C2E{(Q2KSLThi+UB3lU)g!+oM&;ZK5p}kmbze#s6a~iukP_R-VynUA zu~RGjS^!!#KcV|%IO!B+vWRH=Qp9xa!}gh^_}c^wNbPI^KO@R`M}`lBB$^i#NmN-; zeRFx>%|w*$*wi-YiA(Dejbp54s`0nH1KTYh>s>ZHr+0y_sETiF9p8}7Xy!dKyNjiZ zqy8A%ZSV;2kZ5=j<6w>hV#zIzhr!AbXbH53YK61aLUE4Z*P&o!zxYX%z%@nzt5`G^7lJ{|H7Li$K!@7oLcls2gqi`QYR#IURi~0uRIpd-UsZ z{E@Q{zmqkCEejeo<7paR41*Pdxw62=fDkKnLhRN;eWW5IcTNClcAn@?hpl%zXxVu! zX9_P`aJe%p6Bpj!SI4xMoNV)Uq0s< z<%P&oX1BvwFoQm{N>bquH@6Y;3M9YaZ$7C7Ogw+|0Uv%T{o57*u7mH@5FavSXb z6B9uA+)@=4n9IXCxhPXk|7qVfaI34$69R=ky0;AuefzTi04GkqyqV*Zf7@hdPLjD4 z94Sdu+E-BuuZ0-A$jSnDDEEf!8Fl3wFeL#0jfsdW`GfWtxaQ!kzj|z+hlh{*RUEj; zvlKl8hMeE^Trhr9>*I4lpGs9H0a`Ya$h>{*;z%z_UT`tJ1{JEI!$K zrKod?91Yw6f&651`*We{Pz07oc8}(K*X;1bF(dJp{+4+I9!9(@aZ}V*j(~5iB@GeN z(9HWRF1(#Zu)`+~xOVG!+EIA}+=IzWnZtA(qVR#vk41RwG-X&%qh)^F#O_XZ3mZ`~ zk&o;8A$j7{?h_RM35sDTs(f?Pv%GQvUG?M&C42|VrfIh0vokkWmfEBI*qx97Mb~xJ zxS!7q+cY=G7r>=*ppX{;8~_75=6{kRr1hv6Zy}&+x`a;@jAAoEGVXFMPMh^_->m#8 zC6EL~kL>R2(l^6520Lp;536M|Ss{GWq9kUWW=^Aoy#3-gXceiwfNu0sN}X)Yg8pRn z+WU4(dujYMq{VxLQ&xt;o2M3rTezRNdp@W|i5CT&b5^cD!dAKlqnrGK(?34pfParM zf8uVBzfj2L zD^^>aa~GQRUO^cRap6a7zfSxj)z4qobHK#aRfDQtQc$~QuQhT`+91?yF?3%Def*{G zMW~gI?P>cjI!ZYmyKMpvv z$Kvl2Vc*Y|twt}glvUKBN@;A~V3oP% zyCy_9z&4eBxp3n|BVNrH)9w-+xSZalin{0nxvslI3xmFcU)C^EIAF*A+&0+D#kNyI zYH>;?mp1D6=5ytXg5$8Wt{RuiS^BwjdI50)1pwj%E?OcFO8AiEwfi=|ZOpzs`w_l* z`T73LpuVqzjvE_7yh}m)fk0I1c>D2A z0zeJ=lK&;*!6=&$_p5z4gNu?}{->gUFR3rz>U{DUkl)~ zIElWAP0LRo?j6sI&2|Dy<1+K*EZ*aP4VYyfluJ>>(i8p8Z4jpz@I5BsW8mi9b~nWe z!iY6=Zv&ToeF3oq&Qom@>G5#^Fz{Vb%Y-P87{!qag)!KcJsck81>_qiVxk2oa`OX# zs3<5cJ~-sA?+^1|T9M%4g9{SEaQws-Ixt4$@-lF^YfurV7^(h#S1MzZtXOl+CP2qN z??tu3+PDL}X?3aI zn0>b24^qD?aGzf{ovk_BEgee-TmcYT9vDHIFb)&+r+y+@2_QdyqZ3LmS4pkTH6ig| zH5mFW?Aq16UkGqD<%Q+8^-}RwzzLrTtF)yh!4Q#!5H`}sp&;fJrII_q-A{J^c64gi ztm3k2z-GqgB=-HX8@}bDTdyUmAE*a3>x`2$JIl|b`rt0Su0T6KLdrC)fzoTbu0^`wi~VEW6Dex- z_4}2bc`3sOBA@Ihv`b{K1{l9zFJBiyT$@}!hDY{w%bTZox(GiwwX8#*RVrDYK)enA zB!Y%cl1m=kG|Yhr6g165Ub%Q?R+<0w)IyijGDHO4+@sNWfYil{ zHK?1!C7eQSe+vD!{#JS?KRAK1IsBL8wM}y9hF0)4YBa5(t0KIu18N#|(0nPJEBl&M z;v1$%Z&UjIPkE{H5nsFV=Q}wnAMu7}%`Nm-rd2%y^zQ1e=!SBF5H(nX-8@1IQSx+3 z0dP8H1eb4ccveAvbF7{d+6UQsW^c(U+V<`-=r=BLiIk_v%f|k>^!qx}MG*w1rIj9z z%}yGyw~&wAGd~op#k&0p$yjO^P9=x~kJEg!F^ise4G+@G1;7aa94<9nurDd~sPC<& zQ@Qed<%phYwFyEV%ga92ylkJ~J*sxVaoK;iXK8TS3OQ|04Tq=1p>b$RO7n>}O;HC7frLzmYV#|01d3^w zq*dMAs(ePCV^=?7s&pPJRtc{cePRSBkCiuh=O{a_{bUZsDtB%&I*AtCr0ROcRpu=# znbBQw5RQW}EzQcD6cq^Rhb}UWoNPdUqU4j5vv--q(1&Hdrbq!uRh(AGh{jD>fp6uD)3MEh{T7h+~6%;p0(< zoyX=Yr5A7EqEuLt`@a(Gj)+mcQ^-03=Pg8p9g~sE2iG^qRFA|j#c#Nc!Zu{^7_- zGffZ&Q))iwq7bT1&-K%?snjNo`V;^=@(o4Qi&Fu2pVEsEZ)r&g%xZ^M(ZY{X=LrYj z1R^X5vreAKu}~LMv3^5n zF947aSl_NOLlE&rFG{Vp%V$@7x@bMfgkk4$B>UqQl9UL}{a~$~PQxOS!BnLvcc16c zb&|KDk)`Y3v$_5b^yNt?@IqE)?#?&Qi^AjlFkPa2M{EmyCRLW8Dc$u9r8LVqTm`Ba z>IZr?#iDvq+R9TdaxME)`SSL(z@ntp)d3NXD1w(HXwEzN^c#&KV5m^m&n|-tEtwg1 zGnDd(^(6b8WkEU_h3hys`?;q+$65LcW3_Jn%IXxa1`a|*oZThz5{@x@wn~>DbH0c{ z%jO4R5;QD5CTII~$;b>)Ro8+#Xc%>Ufk+jXgC|xB&D> zS?+*kY9YJ{=pP?K+wLr>o%!A=kF67Wi}VyXkI}f-gTL82L*!eb9}sgBXQhGK$C3j-jjg^XqXgR?lq{pcvG;b=PUAR!%)m&d}dST7e5w*EA>4TkVnec zi192@C7JbkoqksU*ZBZ!G!;ywE#N8TGGPq*i~2~-qdA4ZeMRQ;0$qAx`!-!R$oB%& znOmoqFQhgCmSpFd@3FyBM-y$`5Q4Y`elCu&iu!pv*u&5)loy*$i@Fn4)jgRKFY&vQ zRrz^kW}{BqKHxIttNS9JEp9KH`75M$rsLK%7u{ai*hT*BY4u_-wMQBH8ZeF3jH`6O zO=@(psjhD{t0tO5AH`ALa`_eF=A?yC_TCTe3zn;D_wVcG-v&QnLRLe|GE{Pz^7iPI zx|J);Pprs--%|B3FD>u}Q zLONz($9?dTdqt5SFaZW{Y=F}4hi31H17x0j_XC2>mkzwgLkN>>N*w*eG@a5R2Wc~( zn4>cBUsUp_nVgIIJ^c)pSR4GrwK(0HJD6^RbU<8%er#`!S-LLXl953ytiF#=HUXIx zIir{r;)Xqobq+kyXKbKLY2sKjF)v|Y13e><+|Gxz%*`{C2RKTUG-fm{GfSFchLxS? zHwXfL*dl%P-MN@*6@l%3|L+ps%83c2MEiyvfkfqr1kM<8jP&BB#iXfF8L+ZUx&WK$Xb|RD7iZ-kqh^in+=*rbk`>QLHAO)I z$k@lKwMPK^=-!U5DkPKQ`3Q5XVNADyjs1Q^Td~iecy~PQT1+2T3Y@o8n7xJ4I;%nZ zWfi1!uUVb&-o(M6*LBUPw#82VF3u}tZ;GMn=0!q^;O!@W5N50&AY(69*YDi} zSq+Vu9t}9VaH3eV@6wL(7~aagI`PayV(YXUMXT2R)aeK?Bhyahod5yxLu#jKnBN99cXZ4YSil0`t^7M4fDjNPxJk&Tns z6jVUAL=P`mWC>RiQ`JPar+$#XDF776Oa8}*|L?bvoTfm_KuKi^sLkoWe&cQom#jV5 zY@5gDX(G^Oz1{K1MW0-m3nJWKz2$q_JaAd$nM~(0frXnu6gJG23eEnRjeoiKb`wCA zS2*1X99K$z z{1)ozuRme0H!;>`@nq?vtC}UCZ|U@6d-cuCcQKh4H34eDXRhdZJ2TzJC4M z7-tp}>qic*V}wJmvtGIlkf>j=k@c6uy#RBOB5&DED~S^sGD)HuRi&#c9fEjZ!__Rc zhs8IKw6E<>V?og-Bh&qBH&Z%7eh5`BWr$qhc*#!L3jv^3Gb_`yzQxNalMS#zhb*-k zQpD4C0!ZkMnm6P8or`JA6}Br9aV#SmKA&%`_=VWGm>+0xqZNiiJOo2f@y^#eR4SQ`HXSA;gjUD%r+EKX%Yf{?8yR6Codx%!6j_aU;F&|9{x zRS26O^|dk}2vFVJZiQ__XK?j)2UDU-qyhG~yDr1S*WsUe;{QmmBte5w!-b`^c8p2t zSR|oxxgRR$9qGTbfa&$0yP1m?LBV3}@o-(=M;HIAtImhGJ2CljgvjC2M7qfO-{qU+3=w?#&?L`gf?__|$WzQ1xxPQ@we@}~*QP>h@ z+a4*C1Lydc0}4u7Vb=<8|7XcKA=uSzjK2El+x?GkIe||077M~@LWXgVl>ks92m)Xy zW#=axVbFkm&RfFM3GLg(@>279_vkZzG9is){28R03(zBiDW|7D?oY`{Jr*n#G|Hmp z3l*h&td^~(B|5|f@SM-8bk^8zI(O|hA!r&$r~&6s1WkkcHAg&q>PziKBIB;yZZ6DZ zSEw-U&jVfbwzu2%R_^Xa0Jnup_7-hA=j(X1yIlA^6LWr+9H6Qqu*yl98o@r|fLaju zZ|F_IjQsKI#Xb;Y^GKm#QNHtfu(zTFZb~c)?i;8O9xNo7b>nT$(~xNwT8}JVl)7}K zQOVikKh~CMJ?uP$C@7W@AEk>y=Sz2aYyzpX(9>fJ=oFJf3uH*arss-U z6DQ-3$2QpbHR_K$l-+;M6c9YL%r-63XD_%5srl2vdYG?k%576)VHH%n4aP?B13g@5 zEr2M>pBu^_y=wS4bTDRc48VVbipI5?l^Y^=Rixy%lY`EGlsu(b&(~e@+He&j@Lmx> zx6gIw*m0Rl(lpB`IVE~KOya#doWNZ*!q)BEbA(l|V7gNv<7*njg74$VCj9N*?qVTl ze{g)bl!1bhr0{YBJ2sYwRxyv^lxvr6YUI=!OL*rQGi+%cRa;CR=a9wW}s2PCPgWt9->0YaXk z74}>!kD97~o*8jb7Yj%O_4k2PLa^g}`TC_}npi}N@;#cr9ha4!X6ZIWqI|Iu5rAlO zfy*NH-4(EV46{&tR4FW}bf(4imlM<_95ZcUHgL!jCj}pT+X6Eeo(z*mr4IjhAm+8C zeh^EY#yLv1h%%Oyve~f1P1u4WHagdlrSPm~)~%zE-RS56)8E;QMn0p55+cO0T|0Se zECizUt6>{6Z91TK_JX(orz=%D6g^szUu|#NWD~G5h#7hjBN^1_?Y3ikv1z}ftDA=y z_HlLcy8mwBvHHbS5e#&sh;+o?``2rjAg*d{^Q?+p!wv+PJ6Vl{C-Jz6Vk@wWEf*<` z3(n)JL~GhAM)NXV6`RQP6akiBx^E2?7I{{^P4ckhW7UD6B(-w>_>9fxP=!hVSn7WI zaX^C9isiA-$w)UGE31<#O-k*EQ%_Ch?b^3*Pn^Z#{Pz!N3KMnoQ3n>gYC)Q$r62F`ZbPJB)oYqd4#lod}EKICuyHP{&fAjE{$1**PSu z3~P%(Q*6z9Y=Ha%Cwk8JO9CP&lg&wHgy-02>7B^$gdM}pi5rha z2;@Hr{1P)o&;_rQxOic5Qg)k`B#P%N9vt2<7KTzb6y(6&MxGHe8W2K^e*cCsCEf_h zWI_ln<@@!NDBd*(AUsfRC_bw&2^s`hya89~f=i$l7K;f{Eo?of5T>q$We*QF2Qm-p z6nfwbya zmd6}f9Rdp(taCML-Tpf`HD6Vxqn+L1uXp=O---W;dlrR8u>RYhsx{zl8_$PzoEqfu z&Dzn6S1D=Xx`FGaSJdr{_+%Z%onbnF790m^&SNk0DJ4CR7MvSYGkuK~oQ&av7hYWX zj_pMYVY`~w&_6AN^57Wehyg?I6(%^tITl{xnox*d7Xal?-_fJ1kCaYF2mS+4`@fU| zz<=k-3AosWTPG!zf(E~Zbt(l%R$G8_30SNK)0}^R(#S9V4Jmk2?e>Bfk@qB?9hX_Y z-bbw_NtjGvtBBsDq|q*+^++qa@vG{H&XHAxgux_dyK>1L8|)u5zOTOf;?kb&gx9xIgL#p+C);ee=>&j=k5c z+kWUZAbnD$P8lG|!|@Dn#pSY?3OPUxRWEUul-*AWrV3V`J78J{&r!icVRuJK5tHyo zWgHTwQ8t}TcAeCMnZ(bgk`C>H_*21=dQ;^HX7Tmi>)=$_6a;XQAdf|KQz`mghjab% zao~CEIUt5{PdpKhQZ$Xqvqc+dvBBy`kQrnSZ@%aN?a>6|SD7km+}i|k`n=iY$c{Y- z|8+Z1i#IGv^!HA*Z+!RAloNLcp*}n~x@)4s2jJnfcIg3qzzrm0aj%lr+57Z>?~8;A zL*s{GdgWg>#RAxfmTN?9o?3$%@4bpB4PIsNmI`i2B2WCWA?+|8T9al_dIUX;tTRm=2pcXgYjMZqyjuwo%CSarzRn!q9aQW0<68zd+b3P9Rl2E5DWd z5Y`PKkl0+A^`C2j%^V76%d^X|QP*3KvZss12~)qm%>!6tP4o*Q#CCgJp!!3+G=2QTns&G2{bc>yj1lLFn!Tf>t1C`s$eeI>T;u< zRv?WZLmFtp7nZusuk+1oixyA&l@2N%#2BEo%Q{x>Q!eIV?8+BE$^SG_yYe*7YI zkly<61ET^v`w<0JmJ?KFG}5-54tPj5C%2H!|E9C_k3c)t?Y+;v?r`}|M^e*kcz z^(3lWL*CgiKZP-r2#uVv0QKg#`!dh_ZxUnq3hySo_PL%rf)Ib9=RCd&y%FWm2$uwLv0Hc z3(>Dq?{^3nVp!p$r~om#>jmhW@Mvg9AXrOfA+==<&ma|U04;AC%dDrFG&2~ixPn@(W@F8o}13x{`;ZV7R0r(!9{rG(@p zNCkDrn_my88N||>caC}AuZQF)K@BR%7FHeY8%T)_&)Ui=S6bM%D9CxO)Gc1rAj`{# z=AZ37dGK}lWyO2O0O3>B`h6VO974l690Tf(egKzd3Ec{%lb{XjNiv6Ebh7jMP>c5PY++8fA~iRv;>W*Z{rnvWt+5$pK_awXJPC z*_zr=x+E^78UAX$JE*#~B7xd$hu027>N!7JBQ?0sl+Ba#wp?Te0WmtHQf5~B*;eyI z(20B3O{H^&1^}GSWYdb5%!iqoMz^8wo6C_C#!u405_Q$dKhN1j%*|g6@Z=Da`k>?N z1~~F@`t28)Y?rxl=wQb&9Ht`vpt=8JpOqy;$ApX3My)g^PA5+gg~K9NZC#KyOara) z?n%3}`zN1m3q(=Gb-NAj!JUnn&2(vVqQU|sB~Xp#P=^TOjTo~q(?tG!=|o2rLR(52 zg(-fc%{0AtIAxCOTk6dlVXMi_7eh70SDOcsD;xHhWI=$PaE)8g$zdAM zrTnGg8E$^R)*9e~=`eFpWnVGiRi%Ed{)E+}kSdPhwpbbJp-rDmlO`Dl3s)@llA;L! zhG(jf&GSTp!Uu>^I)swGN5ucGO5fU!)|An;GkHMdoZ|9 zdtETXQK}l3{0yxCtz98bj7{rRc?`gA($B)7w%k7CvHS?XeAT_7BRN zt!k`16RY?w;jhT4Av z*#F!y+=whgi2u`Y4QotM)}&5`V^{wRC1>z7e4Z!*(5%-Ti|m+q%W6zkfmNvspDVuO zybibY8nh5$7;GufE`V|=tD;M*j9{C9YF0!twy7{!|NR)PzIio+F&+frdA>t1_maTY zs{(J3pwhsHQCS3Pr2u4V>3e7cLKci!ljsS!Xo|{xr4~J-fsg2bbV*mz{0@ehzenXn zvf$dFg>ed#`{*I!@C0{ef~xRYyl6%Iwrcgs_cl0BN~OP0RsiJ?Bf7>E&$cquW1rQp ze6pf^nDaza8F6r0w;cVV7#*T+FgMke+FhvLx2KCS$!z2N@tCEuF?@Eij+~`ESz@Dg zJyf*r@qxOOG)p5`K?L1BM78rF`jrx_4Cl&#kn3FS$Zp7FR@{Tr3#WHC-ZTE$@{b9Z z_7%cMiRP?nCBP66*yH7ii-6y9y&0eLB(xw2)1CyskAdDunsuV5L>ar;LR^1>f#a(B z@?md&fZx1Lk<_pnEjPlQid72YF4A>cG7+wPA>{Z~Hqt3{i?Pz&2%?sdL>4Tpu|)uh z*}JyvBKnmbrS^F+yM^lXVVCsESJ=e`f>ARS68A8D2;df1EH4_Xj1qGL8w^i}Z9xzE zSi5_S_)EM88gYVJdh_@1_p$Q;%zZG{>K%Bg%2Q*|ne&V(Jm7WS1vUq_`wp)c0X2NO zL^@Mr;M^9Afc67ct-77V20O~{~Cm) zG*Kn}C?MgBKdFgM%dUB$mj5KQd*zsG>-L#e$28;@;~&)@5YjT3=aKqm74k?!^xs?~ zsf(Eg51)LwrjH#K!Z|;WPTDnYzkUCBrN)hdFqu~VruQf7OjVqt!iDOJa<)-MvW{1k zfzc>vt+XzGUuWrjB@uR2#p`2Jp<04%My2yr{1R|3<}Oz%jI+fw0@s16Z(FAUCnH6_ z`Gb+Iu_odr`MY#iv8y?Vr<0?gezV!AQ=~AB^Gy)8B^9(ti?Sm!AVIpQglRu7-0h{v%o_v$ScG>_vPxDK`{h=$YOvm&#LJbkJ3qpM&6mU!I3bkq6Ju z9bAACdKaBYbNM`pb) z>GAv+my92@wI;>&i?fFZtXSNXEyA3kBAhN0ouQG;lKbB6kPJGGt6+34tT$Yh#^E(v znWBXZL4u(8;xzVjcuHn z-&*fJ>)re8gAeB)c)rYMjB#JMudCKzhSIfq1$CcHS^4RM5x9J=lfWEzm1IE{uhYxr zm1CQ8l-)|81wWQ?M8Kho{i(UJIRDEzNtw#YYfkXfar-8f3b|SK%&cq*%~L0MC2MN3 z)TwAvG5^k2X9F`Y8D^$IYeW!15T5z?Iay-dJ19JWkGe>1^`ZasIQ~8eTXKgSIVDK= zhurYIxE>v`h&MO-bJrz%@Cc|xZDR?*Vg*=JManj%j7=7@;_@hWZx+nqR-W>NqzWSQ zQ=y-GAq#6D!u8M(EX@8*Kr-kxcsEG#j&4;ZmKU_aWHG&e=U&+?HEL%q|2gH57>yTe zM;D--C2%hu=-`cW7%%`4Zdr@~^kIA+=D!gx3KFU*V!|hq6x(a(OL8_}^*4=DMyDWX z>7tkVUZYvIcrTM_Q&|~Td^#EU$C@ln6t@Yax!^p?ki)uiPz}#j_ z86~{s*Z%RShxI2p_MK|6zEXed9z>Rh?t8o6#1&->6sOOGa)x`JyieQXA}a7$wZDSL^8^`V8@ykDR%HqSivB=D zCX9yd;lo4ETXiP$KFK&uF6iUmv=ZE9=9kqUB?iOPb1M8l53~mwq3>oMrpMV(pNwro zQ=g3fA}J7-7)&{2jUqiz?DP3jBR0qBAI3rU>C;dS!fAFDm!9G(BXxASxAu_S@`6u9=#`qR%fqE0qZh# ztw>W7!yD|zXb`Ct)zchE92}SYa0dH#asF#{uLQBJ=3s%?1dedvj>-*+aTM~~EvPUS z!)T0H$52I$Kw-uoHh+a~gH~E^@zvm~9q_Wz{rgxKFvpdz*$oP(fG*AOu2W=P<(hT| zult?yh~y3oQ*Yb%jvZp}(^@X61#v?DusM=eY^3JTn`zRefEm(6H?`Crx%^TU9JeK# zpFjw1d{6ij@_92!PX-3Fbr1f(`ggbl!w3ZREGw z>kz>{%qOS2NacVAd=A7)0-vx31GiiE%jBi&;GTut0y+rhw9RJB9o**q`=L8 z)!v)Av8=@GQ!{IYFyWP4q$tS)b^k&-qkI%QPjf|ZteptZXC7&5MaOtGQX;sd9(cCH z#7!*u(2@QnFHug@NxJlFcT4TKVmQQ2mgYU%X0MRJdV7Cn5*f+@R|}ttAw- z`6(>C3W;3ZL#VDSY-e;8-w%6VATR`o43w=slp0o&i^sBXiVbGwacsqjdlYaXa2S(F zoyk_bU+o3D5ce2@B4w~h-ll$L%d>c!9yg*C)Afe29`5Uxx}YM*T^RN@!P%5BiY2}c z!;|8kUi9O`d!hkk_wj(N?J;=5a~1#A@25o}ouuxCe^D1zbD-zY(E+RTIefnelsU1- zX}p=q%_#H2uQJElr53}!AKg-_tgfT4v{YL0FdN(ff03{N=2ihawHMz6zX&<(x{lb7 z!E}Kqu1CN0VEZ<@BMa9aF)l5eaY{E6euMQmMiHH_d+VQ19L{DkQsoQ_$dgz^*6m z`jaYUqW?N_%)ZpN!EjOG@vjJ<)FmvGi;T)d#}*c~z<0$+b<|Iu5c$e7Hk-_7tq*F$ z5W#-_WlfIxh>Dtvlc>Q=RfHf;z+i)riZB2cB4{+P+AGo(X&mbp9UUs!V)4gP-Nq0Y zcO)@>2@byZUpLFe<6x_fE@F~>;zU;n(G!h=wfQOK=wN)4A-QEmAkhgEU(4A1Lhl-I zrR%~+55ro+SKCA9SKdG<_TaJc!vfnEe_jhMv=|OZcuma zmZ`&g)*Z_FH2PlXXUL(GDsM#Ohhtv;EUav+-H!dY`X>^33B1?xUW7l3XnyxB z|1N9=ei125U$>7T)cm`#HO=9l#@1u)qI`10i2rJARRSAZN89hT$<0Du8(Uk4rnq!2 ztEv0i>Vb?Z&N?7X^oCW)*o`Vz&$@WT5zEv%kydlG$#1(rc$s-GCtZc>sdrY=Z z!OG@xu(CM^2RHc}fcFXb_LF4>)`@*^7iHB9q^{h4LKo1Kk%cR5A{IgtBJ~MoE@6Mf z8{j@nBmIdO&WCB6+u^jFsjstB1@?U{IZMS1f#r``D-+=N_YMWdT0-fSEZ<;(Jtno# z!6k@JhZ{w5@(6{(P*|HX9;A5MA_eleZR;bl#{8ve=hu8)zk#;yq2U)z8`YDocfIMd zTy8B$Hr)!R%;|6YP&;RIx$r)53hfHBXU`qXRGipY@8`jAAnwVBZa|wK<9NE&>qs`A zl0OFo%-J(yDU>D-%175tl2`jqO1?HfN*G4gxYS94E?w2B?9(i&6)pL}vI9x_(;!Nl z5rts^!@s9Jfaz(TGfte-jqpW8p3<-=K`OR-)^b)`=<>T_U4S=#8v>z;4gGU~WzZ{0bkU$J|{ws++ zZe^B@Tdd{hIv*&$?uVdmPdMZ(sW1cR@aFI2te6A7B!{kiTik4WTSGVZeevCVmC_Nz;5T|_a=#MJsNKpQ;uS` za~hx%Or4co`D@nqU)WB_L$OZYEX$kPQwpv(eJ1kY;z^fvy7$ne#Ee^}Q-s3)5!gCN zL5B;s$_Ky8Us{Ic-R1L%?P%1>V?nV2Fg|YP+Si+GaO(J%at9N6@ z`8P7Nss2d_;41ST;I8l%S@URVE{Wk$rqL3n^dbEb@}0sYGeE4$#kvPD`BRpZuDk5c zz_DZY$*Gtj!952p6sjca6Td((J-E%GrV!ZV7gAYmkcz*Q610Wxy&6EK<0-KYY=md4 z{6e%Tt(h^V=qC2K4k5hKA;eVjJrb+hF|V)QJRo>@7h>~2#KKk9M>BN0 z2BX>V2J>1a2(Nm(M!$dI9_sep9aOE#lI+sI@=x=F=FNm9vlU?w(8L?WDTLzMG<<5= zWK}gQ%39wjY^?EeBFN@oZ~z5YzH`kP3*39d8qH2|vWorqdNfJGwzUd;>@LPBIo2nx za1n+q`*Hs8F1Va1hqn}Nh}{* z2c7(cPv3XQ*_h4{Nt>|J`zH|}i58=IQ{YU?=3dOWSJ*P%=zDg>&Qs2qLE zNLNXRRmQ8y#t_7$bA;z_AF;UO3$<^V<8Rr%8Ae-hO*5z36iZW~q6rr#+hrOcL(=xJ zP$LdH_DDsqQ(CwjMd#fS&)KLHp74Ql_ z=o0r-Lg1+Ag_~Cb(r@Buf}RzEP=)u)eQTbK%1=Wt-u<`B2O+WS-ZWi$R z+O)f9944sUAsMvum=u=!rmq!F_<~lIj3Lu)`r5__*pwxefP`vdvQg!rmd-e-Z-iGr zVOFzOtow;=de@KKwWc|08-}m$m;T*0oNJfi>Pj6B+qj*KkpzH#6?WMmrZmJ;dOWE2 zjOpGhpFXQ7M5{r1VMU>QRZ9DSi!|DCYtWu2n-B?>gGYFi`Y~!f0=wFV$@)-Pcm!or z7!>?!MO&B=_iy7*A=w2x8|KZMgi=3D`!hj@UX%NoF!5wzn8uuTKkSk}D%hylZ1Fa( z92;Ic3N)sM!2yvM3%2)M4a5-vTZK5{)StnUL9eG>uv=1g5o{Sosl|I7J!rqv`zQrI zG#df__4bT4^8Y+EwbkU+fs?Wv`feM&XTjB|za+oBeO8%j+s>kT(qbMgI{_b>A9=bX z3KVNGH81+?o(eoo=Rao-fZbVPQdr{Y^NJS>D%IWZAX!6ddSy&6 z6+R_9fn79dWr4nGh~!Qx#mmf#S1xt_(VciL6s90xhn!elM5cT*L*F&zTrI-uwz(^QG<%xm?n&> zmJJ*%2nmriyMG{*JhYbrOY_`9S~vuEG9Ac~2bBU|I*WeQST#$|LtP>NOqLU9e&ar& zFRzn@q9s@>J+2PEG7iB!{Of-ld1n5OnZ--X+ZT!vf0h&HX(o# z0QUv|M~^US5yjhA^#R(^isq6$K2)B>H3(4_ltd#8Kv40jKESCmF8<8F@J-)J+qy`< z`0l(XSx!NQ6vq9!IU3SyY|M!PTf;ab(o_RA{1w=5?~1Ykdc zBgL&UT(rZtKv|$r>FCq)s;UGO9Tp=Pq{pUw$Z>mVoQYj`LH?W&IH&I%V|!3L9R~sl zqkjPjFZFQ3%4;#T4G>6}^QaOl`=t{V4$qf=CX_Qhf5j2nDG_pSAD9&VwLg5T#s6(v zxGYHDLawp}*WWX(XF^k_b;M9o(=mTTH3$L;;3o3kPSZrXcikXg3`7#8eO)j~m1=@L zNt7=t7t^hzUmq*BasT^?#|qI@EZ&^-gSC(D5=BS-t{&`~2tn`GT7E?Ndg8bI{eGkr zt;6Y<@a+u~Hh(WqOsT@Bih1YP!Sf#DqmxB=-36s3ORrK*3N`!`kjfW+(K~iXE78W; zmPv_h>B$>vJwu2|&5Dg|->+?)Q;u$(oP#M5TD45PvC!Qp-(^!9;m{&hpN@iX52F@qvt z`ktAyb`^+>`%i!az65dzsU`Md2Nf+yB*$iQXfpPV*CtuM*CyFEe8)zGtkW}iVjJ6< zrK9uhxxC?H1*yp#7!)(c^zj~V+zwhB{cO*2(katNWHdfy9#k^E7{cFrRH|KVHk#B^ zV_`X!`)9ws6ojg|n=+Tf%D;3UgMCy2Z3o}3;hr|~07SaPUx*pvC)fKwht1_T<^KxO zT35+=eOnuTqDA`1;m+vJgd_0HbjV0k>icIO`P6qkn?I&63UVs)>EE)rM!p{TyrP>c zoCrk>DLxv#N*o#!k_6kAzM_}Bzf3gtpC%RLN`1)1j`~AV=`8oe#VU|6bmk`Du=Y@_ zz`NcI;L1z1<=_g}OEWrOgJh5vq;bcl>$LPDP;qZ#>d0Ks0S`R5#`79_$K@+{q@`Nt z$Q;*cml2YDXSrl#OI%`mjdbDB<88&pqX9D6x0`eUI0EPneMsOvd0+ zf%oPNp)@vE#kjhwuatovdEFG3KC!}C0(w=R(Dv zcT%HCnMfZ?$Ob}+eOkL7TDU@=S>{dE?rVaaUs(f4U~hO%_u#FAnZYQ=`0+fzP>d}K zBFF{Af9`n@L0-`-wm_YVWLHW4=qSYCbGCH^SA%|^{6@gf-7ZJvkcV*OXR;jU6k3|6Ng>o^H{MX&)Q@(*i?MdJt_|4w{d8*0^@m@!zjeakrfKd3naT+* z;eyAt;Uj8&J#`)gHi#sF;A~jz8!U5@2eGOfRSHkF?XslrUvIAz%?GQ+cG-Ao!j;Kz zaLeVKFCWm#nS0i4(yp6P>AFU~X&Y-9=|{l%zVq+EVXx8wF7Deqs4A`9m;oeDf9u zU-|b3ndS|c?uA>qarUiVc3<^VA9=61aXzcjHl=hO9DMu!!lY@&_zo(U-WuBTJ@6)7 zNydhN<=-@uzi_Uf^3NaaB!UDemN{{&s^s6;kP=$zj671az}A6UmskvWC8sT46ZVX= z7Pm3tjD4V%$}m`3-WN^7gv$Y`e!^4^m;KDGEdr>320Aq^|=NG-zkpvnR;uGppiNT6Z5SDkyFN=Olxz>Q*E zt)q5KF6e+9JI(t_&*qnKLShHvifTX+%y+J*m(iucU!pLi^q}V*tT~!X+Cq-lW!T-v z)y#@gJrwl(1eZVIryO*gaiW=-nto5;ia3Ark~BQJb>~>qkRAp^>`omtK>b3?f$H9< z=+Gu{K5NQ36Hc4jI^TYXCmuP`KbTj;m2H|Ar<&EY$)5Lk)X>zFPsv%)*fM zgQe+7Jr?Bhmd<9>>P&4N_EhIyIpT)SJ@_6OoBUF{TDsc*F@QJS_S_YBH6V9gj|V@D z#HXawmf77B>~As^u9z#)0cW;p2_$o@(QKSuWq)s);MU|@11cw$}R zZ_!C!$y|0wT@&*5@&~2=Mh^-92R%g6@AOI!ec*Vdhgklhhamo;heoo!d|xEJp#Jj_ zM+d=jZJuIpK7b%IAPO3Wi0^-VZfS;6KVK|ol8}!FDq5qEXu_LrJBdB^Tz7}loWPwQ zEHeCpG;_ZJ^$|thdJF%82TE&9AqV!50{9DyL~83hCH{iHbGtXOHNhh`)Yb2*I;L4^ zjiF46e-y`~E zTSc~>DwOyR29YE(XbU;gxmi2oF(q!{levUuO~>nq<~|6-u~fsUrqw!Lg;RzvWsHFfo--(_X!_0ua0?I@~t z!c8`}HqliR#BojY%7=VCjLifyA%VdznedFz)zIEZ+(rB3S;doRn(1BGDlXEimf}Aa zv`8XvSAkF?omhFr=?8bDFSNmw#Bt2(NO9GuQVoE?G%$IIi`7VMCK>k@k))R7gZ0nK z^!NC!jN+c!Ur6NBcx#04j`KH|Tl`8o&CvTas9qSxyTDi$(CmtcGyd7P;Yik~}PETpnvkVco3q|9$$v=JH&irSQWD~Q%Enw6Z-11R1jMaC} z5I{UT`*Tsn)s-vPFQHRN(=zO2ui|>_km^`^dGWRti#iOu9P%7eso01)T^Y(twEdn) zz74yx#Ok}))pMQyhiZY)(9M<)=*5z!N7Fi?V_Ga5 zkyfh?jK)V^vf>nyhmjv`QOnNJJ}X$5lrUVZQ*k&=Z(jqzzI|q4-?)5{TO}QOpMc;u zmcvvE8;*+Y+A@$kV?Glg5Xj*iDi%#aWQ(kxKtoW!w1sC6AlXa$$LJd&iA9?PeEl1w zW<4HIbSj8}Y}&?n)%T^r?lEIRqV!wq`k0R?CvaKL=gKPAVlPttxN56M@@0%sgFw!Jo=L!?3Y?`3_*i` z!kG}2bOL9(1{XZ5$rYUWTIFK9azi(7RS@cm5y~r^4L<&MxN_M@_$p}L#Gt90p_=0+ zi@VHNF7vBp>fzzk=d4`lL}D%*b1dFf|Mk!DDi#6%Qj4$=kiH&G#;Xd}=QFg5?~qUT z|4S^g9Kx+N{U2fxs1=2=8Dz5UQM4k}DuPAO#_&l zT}1a2)Xph~Ugbd}E6W!yDdNu&$wrD4BH%Q@^Vh;y4MsD;3Bj&F7}!DHm9DIuDN}U~ zbiUv^cm054GrRS(ytp@i`arIP`U6MyVwS9!{l-Q*C&6|Mc8Gy@7r`VKWd_&Ix(YLF zfc-`TTjj`)JUYhn)E^`e(|QhFZT7S#_;~F{iOa#DHVA55XuY5|_|oq7RpZ+kEa}_u zSu@Z){NZ%IQz0`4*j)92rNPSnh><5uG)bD0Ic(s19f8C|R4?tOUt?GuJDt?8b1<@R z<(XJNg)f(R-0!lb@M6bFBu)G<=ewbMISswRW%D`!uJJ9e&i-ovOz1+Ge#AZ9d2bzO zH$Z-tideBjxQsR{WkkcIDcZ0gVzxt2<+*WGmAeoKs2h=sy=>Ol@Dw2kz=%tNOzs4We=E46tNpmM^I!Rq%2 z=b}hbVBw1}prd?gMi|1NF;ZjBRusVd_PQin`(n-43 z#oFbk5F^)4re_HN{pu)5NmKaSSKh83K+4B z&K`IXs2G1Ef8xlnn zrEyM2dBKq1LH$GYgS-Ndl_CW}7Yse6tRb(}#Nta^b+=U3hxd+KB0fjFYZrVjCWZEd z;qSZgd=7XCgJ>xV%MXVnpmUmRi13FI1V2Y0JT5QLuGHL1f; zYLih5W$HYv+t;+ z^PMfinvn6w(pqtrISC{S#C`vP9?!S|;1yWg9RR13dDlQSrkFIDUpOs)KS+m395 zgcA^9w)|kDQ6X}$#Ig-_LkKfV}PG#mtCdPBIXkeRAk+KnjHj422y#KBtuYYi`GUl@7 zPvK9TEB;`=Ex2AmQ860PNT@$B^qI=6dm7ULx^2B?jWiMw8%p^plFG*G-ICYC2rxhc zr^gWQVt8TDl8O49=Vb7q!@cf4UT+F&#xms;L}BikzF)ixT~#)06||n_Yz$fnw02-^ z9k9g(F9P_JTm{_;y+a$UBuhfdt|wAC)cH{B@blVg?5wxu2B*b%!@*u!v`S2r7v+sj z7>aL=ADm4#(Z%&c=Xu0ov=P&iOe6AH7ipaG`@Lp%HC`>MZ6_0x&2Q=HYru5rBk z!KPhq%A-?syGB#8b-w-GX1VqW2k+6d70~K1^#`zctcg%H_rRBN-mx|!J!)#o)+FuU zIA!=m5&1&@C6CEyC3proVzGU7e}|PWd6@FfU6dQ!PO42?=4WQIh5mRdg_};yH(WuN zHtX^%*=A$76+&{oeTDUsC^b?Bv0j2y0FAyn>DQy~;>AfCJD=1?Irk;=_-)$QJ75QN zio@~cO_9hHi#>e#a#KfrQ+BZavFUqw5NroWcAf+Yp@1yjk%`Q+<5POn=$z2v1G~~~ z?=A9w)h&YCi&IhJJf?Gr5}5f+rT%q_Zs56EL3qWR+kBVXfUV&T@IZJZlPIoxxkE?b^4{5y7+)0FE zFgoV2ww0NyzwueM(Z$lFtDV>Iz7Ii~_?2@(y4iBJWGtf{W?!j2MbN~GZa_ta%wyn*@<9~7&i~6ZT4iK+oyL0?k`LEQRBy7e76mU%DrPNQ zPGCng;bhm_@a$++s-Sz(@LdY+2ST3w?N~SIp{>3zZsp%#vX}6?^DD0(K2@qEm<7FU z1@Gg}2xzyJqUiPj*UuUAs+$ru3hl7Q{C3#dBGv&sY$r)~TmnT1enmAqyn??T&uGMW zd(6T}|5g20zESDt}f}^^l@8AF$IJWi%Np z#cLJrGqZRBu%8zx{zjEWIMzX$9dirM6DE-D^yvLGBOhe%>{X6-e75`c?skM*oykTX z2vb>y)RG@Z;>nZd4gPMr4Wvr2;8sHxbD42ARpuatc~l4c?|x*y~#`SboY_#Jiqw6 zL-^c1iP0j~)=>ogRJOr{opxmp#TWZO>AwGv2$26)fr0}0OFy>^y-9EeRiK?5nwQlx zVM#%m>0Z>fQIJF6c7Bj#z&2nD(|^sSyb4lj z?iX*p&^ap4j>ui39KuS)jmF35>x)r%H0O`hdPk?FPURIw1_lkqQKh- z?LE0>%pun|h+kccoJ=T&H*gmD3h}&my^{3T4*lGllvNV|sz4ZfENDo59W>fEUM4ks zNrLiNcpk=rz(_VvS;Uf>23{!qTdOJNF+(o|`f+0MQ%}>bnU^p8uDfK;Z?vXN*}zbW zCc*zuf%=N{CvzYeAwJT@E5GY>*jDDMiYix+qMJTOJk6ksAEG9ir4V0d#{8hST3;6X z*F?-tz1Fo+$7$RWr9bvzW5ssdEiJ+$7w8|AsaSg_{gbqstK3H_|H0Pdt1$8Ga;^VRAdU-0ZV3a!s4Yz>Q&^-X&lWAcbfpyJAXhBy&HZbfA}_k=Q5N z=~9&G!jn_Ktb^QI2&5-o!@J}RY4dHF7r}Py9UL;4_9|^C@A8u6BgV;VkH{CG0fy-b z#%>}9ZBxGW7`?Q-?Pd>uDVtb^_R9+-doR7WmoLe5i+zjq0QDccu&D9kKVI8qF)M3J z$8rAgmWfa>??Tg4Mi}v0Obh~aZX4<;*;R{=+p1Di zOusxZNVr77IkmaQkdgfeCO)`P zZ>q>oU1vw|kF^ZG;GC(l6-sYn5KJU-Zv2G;^lv?~ruLLq9rdBfk4?|z3-?E7tSLNH^=)+5JEHZjeKBU~+}w+WNTRyT zJVZFevO4euvv!k;I6Ks~BSe@Lu4AMDZqHJG(piqGcFPz5hEu~?*PZ~|;CB}5?vm(Fgd zG4#WlPp~9H0>l;(+&}Vr>MTuufGop;x3J#V+G*5&>OHT!%~2p+^TTUb;!ku)0}c~s zV;4l38|{415HLYAh-R!)%|5D{xsyOJuPZj$i zrFh+tE&|0?a-iHU<;Ri_%Q#y=g`ZmIZ}^;?{AeBM-_k}H!?*i)q@^J#Z76jJ|1WB0oK{Ln>h%1u$awG`}kk=FL7x1E_vK9u% z;BiSgn3L&}gZ-f{G|fW^I33|sAyw!WAg~1^-&|b-EcNe>jVZ9r_hVJyKQZVs#V`7G zyqo{wR>q48wg#JZE7g>uclG&0BbIX=V?6#vy*O?W(n6x3Z~JW$Rjaucu(fK)vp+^0 z=zH??_m3Bb&p-?Xv_N*}pW|}refb>u17TY0*p$7SQni>tuNyh;E9T3aGFEnpgJQYe zUvr5B0E-%zR-51;I(Z`*?2Gvp;gLK>ggc>KJrV)6D@3?%KZ`~SV)#YSgl)<4huAT$ zf!sNPr#v1%s7TrGkG8hQ8aG9~$)cFbbS6*@mSGAkUSDmh;(o7@Wv0HtJr=-xOQat9 z(XApQ)Qh|w;{WOj0sfaer0(B$2N^+pgFqlmsjxSmp?i#pTkTj#L2jI z1n^1CM(DK9>#dUr!)X4uwoqdF=^y64JcqxNKb*8^QO)rwuu##IlI=Kb5)`s<;e>hP zu%-jvM?~VMoI?C|?}o0j>C)X9mr7AdNC83bA#ht2r=}rQbeB#SYFn#YD9qj52<&eml0Q$ z6;fQ7)?+k#v*G##TM(gqkWB4RT3jpe0jxYcnNRb24-$WEvnI@z))0~zY<{z3w0?+q z-^t@shJ@(#SkQ!+T0Lbu)kLzuUTey?wiafu6ZUm&-w&BbBE3=s_b85`e03T=H|K#R zSvo&#&Fc@fJOZDzD*6mY_5GiwvOz{Hj8}DvG7&>Os!Npp=Y1tcl2JnK zb}hqF$&a6p9!LJR!6|gpsC9hA9;0av+q1Qj*ss2#8Tjm~lwN1^IYgNUheiqLk#QP= z_tGTimKjX#Ln?$oG0+@#p#I{He**KJCg){cY;9}&flW> z!q(~qT*lyck4K7O7UJd-?CXfEt#q83(KMeo5xP`huK4ik7(+cIKH}tZY~=`T7~D(i z)zzA3kYEh?q8ogTLPWUhqK8jl`*b$=kSZFC{6>I%Q418IJcUW%xO@=kjIjlUqQ{?ebrE49KKbvBG6)iq%b;}a5GbPhw`CP#dG0( zrstQ;O(e)RB!#iZw`X-zM2>-SDrnq$DyFrXo!aelNCRSHI$w#Mv8WXTb{K?e)dE5a z%+>H0l^KQiy5yQ;yNgg;qHs5nqE=Rcu~ikXR)v7`(ge5ha!rPbpkD9l1@B{Cc2RP$ zuGh};8x6uo4>jg5bmXajrd9o4 zJIlv9oo~d*vWdqTh?oa1AgQaAa*Hv0Mgt%q-)iPq>a&{3D=WI30wlEi{y7wZW+8VX zrSjWn$Bla#@1Guey_!$1gt2;}$kr*+Hhxsx>P5y(j2%~gSx2Gtz$2}^k2{|IyBp($ z?4vUZJm96}Ug!wivteZa01PA_nP>yke(6;tQo(%gZ81nJx4C66Zw4SlmR&_&BE-A;0wC`Ggd!M^qAULaZZ|+Ug!lL zC#jF`^fqBH_=_Fp%N}6E*?@KT1vZ=+_rz}pyYRyR9$(sWPDmr9d85%K ze)-m>4s5Tp1jo4EK2y!=giVwkkOuGDJ6D+)O(6at%4&nAAbb6M1aY>&_DB%}!wLui zg&|_LvHMZtoAt-4fcEak6D>=+Hj%FnA<2Bu?^J4Du0SB zl6sbY<7Rg+ApvoG5x)|{16W4;H;t!scRtQofCw2LL`+{5i;`$WEHCSbM199QNVmbL zl`ebcn}P#8IF+X|RR~Ib zX9C;)^^2^|4I$rpUy|+_q1a5{a&fq_iPlc^uZT;QXGDLUs#|D`qBF~7c%X+abP2~O zB)BOcnnDQ~yqS2@Tpl-A?o2;Yn!u z)Pyr(*@+%$51@=iRMs3mm9w^!v@t99M~x9d=wB?k2xDc`_G-xO%6dU4ub_i`SUh6LEJFy#!tk(QQX%kG31u zS9on__2%rf865BQ#7oI%VEY$U)2An|O-Hic#9^SYNC1Snrm%=wLVP{ATGNebCk^+f zettW;v3a<-I9Jb`!E+bo)Kh0$NA^zK-=x1mNPWil>8$Gkb)O_K%U+XL7b}od-%$-V zu3CLPMJgt?SD?r;DV4;ctU>`bC4Wx2&n2i3$Jj*0&Y786et1L;(Ood-7?SQ-4016> zUaki{2(XBg_R}E_r);{*HDmHP3sE=OM(E=zz4sqza;y{DWhEC{ZZvJ;wm|y0NRt=g zko;%QaD9s_!RqVmf=d492wuw%Us`E{gfFW-N^(n^blC~KQLjB!A%e!4P~9roFmfuo zno+xPCKES~FAr6=)m(TTJie&B5t^kPC()Gu=nhz_5lc$oJJ=;?7DAG9A1Bt|F9WG` zrma2ht8Bg=g*XpcNK--?ZgXW0_fHQIFbNprGw>~kmS)NY`aatA7>Wn#b+yLt%C=T% zB`cc#daPPjHKkS*L|&BaNb}Jff4n$5Khq;;#p~n}f~iZFPez_V$&a|!f-0)^e~FwQ z-UUJzuJXF}F1Br?3}u6&e$X_d;p3TwC=1}Hhfi1KYx`-+DXp+B^sw;Krv5ZD7ahu0 z<|Mi*UF8~SQKpWFNHK@E9}!JklQo6*Jc1*@3>4G#+S()QwomTnOq1Fx<_ftar7+-sgEqQDzZgL?pnHr44~ z>+1(b>?*W~A8JF6({@x-qgcMc7b`j8HL!S+*x1VHeLwvZ7Z3C81Uf-Q_}1kf6Od!c znG`pg+BJ>FZ`~;&OkG2@ee6)l2J8%SSAralYW|H3~gi6u8-zO!sjSS zAAW>t=L<2hM)y-S+%Rrx(3ai&eNL4jbJE@oubEs+3G?) z!}2!``oZNnLYZYAPIYqw579})RKUwRUJ7D+;_iqvnE8**^lA}DS|MvccfAJgD!FL) z-m1rp|DP<}v_#m$~OWqICfgjFIqi*I|mg zUt0_GZC@GtLIe8?WvThr*-XT|a?Oi=^7XE*n9dduU-R|VOV-XtcjL!ts7 z^rQAasa~Dj{f&Wsrmd;xN_;nb)6wZrWRKe5VVUv1&=||m2bSQ3?#@aj+w1P#;vH4| ziY_wlJ9Y>yvB<&1OQcv&qZL_-dGi{- z%%!MhB!2Qw7EbfUiB9pW+ru}?jx(zRKW0RgULM}?4v8!h1fs&0Hzqouz`3g}(21Br z#9_j4jf=6E>sOBo>UbeGi$`HOih+67v~qiQ=c>;+mktjHFjgWDL!y`T7+C=l=*adW zVagLUP&=^Ne)igACny+HNk~p5l>9!lfg+)G`t}Q%2{Y8N35sQr!^9Q8SQH2V<;!%l z-Tir5_^CwUdCHTld1KU_u1P){_Hhm=Hk9JBY=tdC4G4t(Yx>&0dc=V-JR98gBDznP z@AQ@k3q-=T`G)q=6iTh;oh2AO(OaOaKMj)h5P3R1jxI^Ji$Zj8z)-0{BDt1z7{Gz? zuqASU^nocPe!bUh(t2a;z}5|bxS_lIz8bBawYqEAT+E2^ZBZDFL4Ox>boaMDDlQ}e z@~%=e2paS%aALvyKf?t?$zP-V*LIb0ZpD*mnGbN z>4j?H>k2<ePUFI?##VTwC~H!ZYkx1dax%yr@Y0QuvGo$j1FI^SpL4-Rqv1XwE1?3C_+E{ zYb>6SG`Pr@?5)TwL|e4nWe0a_QI+2dTAfR0x~aijBoSOstsB18MxI zeUVQGom0A8XM%ZY9=f58ZVjzv;5r{CFz$~D4KDDesz>Xks?olH!PcbP#(=@QK3eo(HGUU97Sfee# z<5OIaMu%32Qmts_hcNu!aqfPXUKMrI#k8ZJFNS)&sCezMFwHBLw$>1rsLVmVz$X04 zPC~WO0IrEYQ1DfD!|{Xzn}E`l)8m-MrLJN`&LhKIIpSbzI} z=}#UaP0d#SAQUYmCs@?wGz`Pa4XSt+6R%k#@H>HZ=EWqN7ride$DpOdWy(o%00X}e zqfU2WR`FMbWBZ|I$s!l$2h@dG2ADU`xyNy{=gYj9Hw ze^$SS-B;|Umrfyo0d*&oQc#aMnv@?E((J<&Ohtd<_Q(r!CmjP|S99N8SO8aaaJIUQ zdz{0(4O~0DC#dM-<806d&Sn}zMB>qGaVjMR^C6VVpM2eE823AV$!v)nj{HBkdI!e5 z!nIqsF&o=SxU$djL}sjWBK@lz9)Gr6j4M15w-kWFSIpyk16d z;}&{i$oyD+E4naH&xIdl-}zM9oQm|k<>g!uq!m*Ljb#e35vWNJP9|)ZjGBBn>uDTm z&w8A;ga~Ut2Ssigg=%kQ%c)~eYoQEK7KFo7|1gbl9dApY-b5e2Rx}v%^`$ZCuWd=- zw}Hn{(K~-Zy*a3$=b1c4&Q|($xz8gqu_)&!(Rmv=hKB((`8w-iiP<)o>*euLx=;R9*ZJT#rO0 zfNvr%Rn)``whk%hYUwnGa=ny-em8w%>OSg8&-(xCJVJmx$AJf$JzKSPLy0d}Y>g${3+Eu3s6~>Z%E{{;gI4EWrEG z4Lq;Iv(Y--cbYCSJy2kP^9GG1^m3*CM)5_I;?<-8TAR$QzT`X?OnR`K$q~PFPHl`{ z`RRbA!7GAgglsx6QPuVlX zt1q@X#z=0s^J9?TFDm5aC3u1Z$h^BhgfMOsiB`5|&XvECpBHq>Tx5PKI_CxDxVD2{(h7lNr^N6^(;xex6M21;8?4g zBK0i$XL-!S5R~*$wFWI27;m7LN&yuLOMf?C3H0eDDa{$RQusMaR1sOAg+`5#sxAu? zWbC@+PHL)Y#1~N{SmEb5A|U2z1R;4@zVsy*6GN&hn!Uq1N zBQkT(Nsz?3I0tzDB6+V!EXrYpKcivln5L|Wz?@?=dY7@Jq+vR^Mg^f&RkYz#$rGk$nOPBHu0zO^?4YiI48xFV=8)(7t>uof{uitTACPW&eU}piR>F_ApopI+nOILb2^trjo~ON} z-a2JX-tn(lDmwa0gSal4$(5ns|L|)tXPMZ66 zn<+7t^;w$S&Y@|d!Wp*sUcugZVo;pidIf$(H$^Mu$N=~E^9;K!#;RR8s{K0z*sdlE z7AyND;P7|i&olY*cV1h;fui1KjEUj5U|4$bPx~iUoi2!pBJXddqb1X6Uym~2nZp+& z;cV>k(1=W|Fkz2%@nZW_CZpcf;ot=SUJ zcbz9MRP~yh1G1BFuAz`3vJ>-=bQMwIa8S7|$fWHtDrl;^ z1Sh4HisePG$=P%J5ufpWC8-{#A**SF7yXH{=4<`uVB)Ws>3@J5q%`7M%5DB&N@Z|J zeykDWSn*E1N3m{kqE^w-N@Dg@ihz-p1=~tYbcEbi4><-2jxUe^Fl(bH2kv2F28ThH z9{%NpF#L{iWA@_n-YK*{*a?M3em^rim|Vkh2{0&E+M3ss_l?#=fOS0tCW zL(;2fM$h&e+ThAZMPb*O{%ol!eL83 z++-8lDD-lqA2XBs7USPw@}_g1{i6P!>W75w>Yp(=vTL{MYsD0o*Rw_9 zLlG9qRk42z3~xxk;pb=E#t}@c8*IE>179GR_F2`RM50^*t;@e`{+srR^%51iB%1x@ zbC)^O3X4i(hra;DzW5|pA#Cte)aM$fSZ{)zkvO^A>~-y;t?uk`0ml3l3r}`jfLOFX zQWQpH)Dxy-@!E#lHlBf3@cF)*G?v70V|C5y0qOR%l_d##Ln@rm zISY*5SuV%>(kr@xn_5uK5nMZ(#niDDav8#!C^=&?KdVXjICbc4l=} zdC5s6L@BVK%vte&c%3Jo7fDtCuinEMUm2*wNERX%KYN1`18IA*_iUaLIQT}?t%4(( z<|4<>b_uzagomGHu5oPpgoEB6*@y}Ys=Ww8a$>p&Ld8Aqo;WQkV1=m~;JM585%OswrE7kVV9cfL14`U!IY=V*cSy|+)krQGfS=d9Tc?eh(3 z>;6zaT$|T#FHa86uzO-V9S1wOD>l_-!MvVHkxYpwMXsOlFi``$Xr%QY^hLe#36$`?vBY?cAMHF~+T+)`Pz?9V-=l z-MOUqpj%L^RD1Li@b*3f;EmtHusD}xK2JLz1t|3VGDpn$5M!CBGVf;#`)-2}u&*L# zt~dq%Jy%qNz?sn{t@h=`8)$bMRtQ{EDr>;EqA_>fP<>@E<`9y?AsOhBDLnJ~*c_B5 zSnAZ&?F*5kqsgGp!E>~s*S^_p^~G=A`#kc3zf@(+_o|O=wQ`XN_}mwgFVOR|oHyve zTrAa0{!&IDha%-?OKN<^ zMkH=+6nrGu<(EnrH?TV5&h9u(E&y}1x%&31G+C5^DWapLQ=o=dalsx%c|un`9c6S8FI`pKPx}0b7ljN6D=I>Ct&X{^QJT?O`P?6srB}F~H<60?UB9YT_z`>5*LHl9jP?0%G z_nO71TSQoH)oo0-dH|CZ(jVoN*ny=NKibPO5aY^^yXo%1&27YzC6T}!#3JDF9-x%t zS|+jpK5isA%{OgRK=#RogO17%jz1PF_7+XCu7muWem-EDlOcnnvzemv6367-UMEUV zy@o-7JyL^Y2P9XPfgn=~2p|7&b?K1t>Y1+;m_}A(8a*pyy&cV+72jPmsKEhuA?J2J zlc0TWg~Lwm!aW@(c9oP`)>yD!{HbQLV#5b8IZZt%|JV^wN4CyTJ1^mUi$q`K?8EDU zqla7t{Z_v=9J={-uG#FqbczfDQ%`1W*LAnFcC1s3nP`~W50u-F73&e{YAj>^$DOJP&%WP6Y6^fk zEhC#tvKZ?dONXfFy;FzEtx5PX*<_jGNq-2*#(jy7VfjnV0l^nkqrvqU7f-DYC(!rz zs<%7#)ob($YbNW8%Uv6pXfODwfK+PPr$627T>C$@khHb0Drd8%pf8FSFVQ|`_-Tqf z4pa9t{Ct&q2LtIX{$*%EJLyDPRBoKLRY~RC>INH$&non5T_X8II(XJGge!6!UqE&X z7;3O+tnw$}GtS4%oc1Fh%PbQ~u@RiVMjj@RktftGA&<*T-4;z!8DPUTh3%j6|~iSxVhNHz;u}K zQc38aGd=m854$&J`{|WMB}1!2-K&n`nR~RV43v7XUw611?#yqnr6^+c3>ie*P~I!) ze~l?nc`IHOGamxO0+bWk9v(+&C+v(7~K?OJhWxeIY$BV^_m36soXp`KsVh0O9 zQ)80Qtm!-vf!>O~4=pZ(G`Qs+RDF>@mFYd{7Ys0z4G-N7aFs_5rYP6vW6`Z9&#()J z9w^$J3`bk5n+(MKD2USqT8_WNtw6pZ|62JOA*Z@bXsh@z)zrr1!r|A{jFwKEv2Jf+ zZ8#$9UZp93B&EWkKMlZfPA8IC8fv)oqvZt$4cb@w0AJryJt5O+3HsN9IhAifxCQIK zo%^>ceMbcURo%L}qQLmVySIQtL98Ku95m5Zy8)9?2^L%2x64F~63?DR&S!&_r8e~= zf~<;3P5vpkG*a|`&5X&j<*q{ux$Xg55K4!#1kun(-(+t0mr^IwL*vt15PR*@Ik{&X z4Z!jhn&T z+c;|0BxPf9ucX@{p^fzQu}6a{4$wovz(x`l3x+>cL&aQ_kwx#y1y40gKNi9V(4Hwc zh2**wJeD2gA2@Qjvv!dPNkuTXguu`!Q_4jV39zU`lr!=;bVFLF8CD^sKgqO0P>#NP z6cY=R*_|3#pt?U{VT_))x(_XQdDrcBzvd*`L?mLYvTNh$R3rr1n+SP>Pea#$HQ@x> zW{M196=SI|QPo^%t9Abf=>-qG_n(?5J>vL9Dbf+PH)TCpX>)Ng?0~`0k7_- zCteN}lj!kJ?yC4@Vu%8nU`xE$b|Ez=1%PFprFAK22xA<1*|Ol*Sp@IK6vyAK112Iy zkuz5IXY29Bub~TU3!}y^{0x8+sc`ySy_dim&=l&$BdTh_-Fm|eTbnN7kxG^^nSQF0 zcvAe?--*VQeX%`+%vh}U({;uMH45v;+M2ItP1k8xQd#fySP%dr!2Pe=K{&)kTNfoL zj8!mQPZAP?IU+K}VI7jhJ(1daEZMg$ccgB35T3=aW(p9vc-?T%**GDu2&#pGA614F z&tStavs;8aIgLG_ROS`R0yVz6r^p1f{lasCeyeo1VYvPPy6&K9zZ&*wc=nGwpqFe? z_s-+V4zcL=REG+d3boJE9sb6gSagB26+Als{iT|Lqa|wYen@*j3Lj@H_Gs%R@t48= zBuuCJUJRfx z1=LtMGPny_uob`URPx}v93}c)YP*ZkmL77J8!$gWySr1U1=cVBk&K7^aLqMl8>+X~ zzA-e~=4yN(tDAkhDK!|w5q`*0E{X-cQw~LA)Frs;sW|BSbQ5^|`nlIwv@b1xbCHux zB%KksF0`5C7HRcpv>8V2d{-7KJcl~l=a^sZ_RtEhwC&D(3o4QB%t4`Q4)LQFU@gsZ zdJ2o5lYvt2Z>BgMu6=C>b)|hbAP1h?5L!S8hU3%F`&tbnbV%8Z<{y4EGV`f}!q!E+Z!_l;n5UqqD$r ze<$(FJ4Gy$LhbguYjG*sEHNeZM3JmSiXDo3h~l`hv6VfRM@)GO65Hy>z{p!;K(Rz+ zM`vUqW2QiqC7(s~7qZCjFCDY4K!Z-I|+66+2{b7~(6EY%bB> ztdjig4AT3`w!u^txIw5ms+;fM^q@`O45Rr*&FGLw7R-D_aGNC!V#?2QP6ZK=w)9)0 z8YrATnEetTA%}^1#J?*2OL3Y6eorlv`eIShltKkCo$MRJlhtjBUHc&U`*QBj*P#Xn z8Md)*_;+<}L$KSgl9_O4rKdTPkrFI}nTr+8eNhwg8; zGG1P-UWi#7@=7UMTq5M`! zp7Y_jizeXDM6|X7>*tuBM$-%!#7}&mb*$51O7E}ur~NKTEQrWWOE%WN!ReJ+?)HAS!`5^33F5jwA#_$}uDc2kRi|q8 zQ@j8>SRz(_m4SV@*~)T#BG=`Qxl4bAppOy!%g_~lbdI3YnJ+2^0u)3`@pU}{g(QY0 zKQ<)B$@GwIZqRlegn}e7%043Bcy=t%%V?!&y(sQveX6jY6pe1FuX z;suA2l4v{-2A{m|JX&}5$#X$N1P}6>zYfb?PLg60Z(N|xt$Q7$C6fzLfgZ?f@kK{! zH~g~>xMfy{ZpCH_d;LBisdD_z9r3i@g@CEpRg(d9DToFMr5R08xZ;|7m8IJ4v8(RI zx_(V}y8Yd{QH79iv4vgW(TsmX4bQrAxDzLYzf{~w4EZP`L3`G=1+o6p-hQ0)5h50e zMjh?^;?ptgH52S73Og&f{clhnSb^saaWlk0JF_)dFU3oNHK)ul(i$PdNs2k;X}rb3 zvDc%(VX`?-0UGlMU$}CiUgi>c8V_=ZBq@r5`+C#dLv%QDHHe6V21&oK!JFSEHMT@j8WKA3Cv+>P4X8xlS(cHAh< z*=Qmze{43#UTC-KOdjUF>)>6)V6awK2mM0;KAoY&RfDXlJxp`N>M$4bI-?@Jg7$|f zzij9PkN!Rdbr?=4bp^c659kywS@3vJO3s+op4Phrq3vo}G{=TZ1qedvpTs&hwMdUx zR~L@HE+1{%FseLqxG*K}^c{>2%zWjkDY`mza*e`s{8jPVT@ z2u8cggyDwXAomMbE0 z)JC)X>5hS`2kWz$ad*=Omu^@ED^xen28uxvRa^gjT2;CjftkkO6A}HzB&}v8%&%18 z4$Skc2&FxTfieprYSe`-(rYchACutZfOSz9aWtRMHPOYq!uQ`+MfPf6O!4{uoFvIn z4D;~(4s@zY+|5$X!SUDb3DdUUS|m+{pP){wQScEySkaK1+ zqBpToPMrMISa;uO?Jd;c8Rm#1Es$j3U>e>0Q$MQhVQ-TFr#p1PZfJ4ir`=y~4ggOR z6j==}<8|1maC<#HjEtW#nZ6aq50bBlXiTw?ju4EB<{ff%`L=%?EE0dme1nRP)BQ^- z54pVk?8E_O-+*r7DzS*AejGaQbx>&X%M#lnaW?at@atu9-Nrc0;RDxH#$)D7s38Z6 zQsD7#*t@=MYACf9;vTwcM&Eo70NHFC+@i7RZL#U|8^b`fI|nwANAs=h4?Gm=#??YB zu9F$6fpj1WMu#T)b6B!qm4Z{yDpj;fM?qCI^BoEf=j@52JU^_fJ-ooBoJ-A`96W8q zr#mhwO|>CGRgoQOg&|L|?=EJ!IRuJdZM!SR-<33RhDsJ_5;&f~lGUbQcW87>Vk zUl{n*xttgq^09katLX^`I2+(ddpk)h+Nd&2bz>$d>XGO>vE*cK_pp)$7NrK`@G?Cg zzM7}To!fmU@S=+{AsWpKL)H*s6K`7!iq5Br@(#n|f)S{&Evo}5m2NR|?UQAQU|M{wsD9 zAzQBAz5-e>o2(!JMZ<%jk8LrRDH-a_o`{Je#5IK>o>hJCl!nLG%9`@7G`^`1i@Bb@ zdU|+hJk(S#wNFc_3?;4W*XUS(49)#8u+JAm9A0)HEG$niR*pqPoB>6!nz-dZdgxFM zPidMc^0_C%LiW%5sqkYfOjW#Dj(KhRwk*>A*B9ikw!h~Akp$;~bp55ESBM4m|7?@8 z^$iOnioZfbQOf!Xs>7?CNGHk8VU#(|Wh^Qgi8nzc^#VCrkO^+Qt4I$cp`5kVmwb=e z-aiVRFk~S5aRT=Ykw!2Q(8ZAs=sqaYV~s%%@`ruk`4)1NCjd{Cvl6{`M(o4wg0#K8 zm$#A60B|NSS-A^^Q|!5^uYfV)i&3jByMi<1iO46buX#YTc%ISz_-rRP1f9ZU=+m@+ z@y>Q^464WKhm)+vdO^|RM=6>1d7KR!sz}TWTq0|4{4^|iKNo#0n`6MQ;B{+miZX7A z|2o{ayvnZPSrdvOFO-Yr%K4ktD3W%&N6{$s48YW^JN+ceh#o7vqv2&iJEdOiuzyds{S$XKxIrrciI&1dT;5LYdpv3C zlqt)WKDGFQZlVae1MiJN-bE{k)vuAJHW5#~1(C8sJo0STz3l@w4HYl-QlxqPE-}A*r zl{6~LQ`3}jZ0+)+-EE815pKwb_&$!0kJ6y3MZ;psKdeLFVk(i%OQzI#yN7Om@BwsT zS@MGKc(8pSMIn3Y&)_$lGzaghlrfz-%^@OXTA9#INP1iNq z-zsWDl;3op3mGdYH8XS}h)Z+uxB*4|!snz37^!*TJk>0a7pn6beM0@^pGry>fP#Q* z%v!bHaOp7{w&NSNMEo7hO&B5@DEN~q?VAW3d9wJ@>m`qr6nXcq`q_lQv0%LWmha<6 zeAn;4-$LrQ10^tW#$_CY3s+c$r=#5LRHgx}lq#E`GO{^rt}o6C-h@Gv}YD zf|bKB8la8QSx5w}ekxxkOuiLP9;8ty@3RyRu_EcQFgxDn@-oG86f0lDK_6po!Z1-t z&B5;eW+6O*zDV4MjNbF)nL3Qhr9Y0>V| ze!+Dts6O61Szj>>(Q6l9L*8Zf2VZQ-+C^Jf=@W23C$LYePR=DhZ4f~%e%uRH6^g^q zI?>_1Hy&xS)!ST9;&FC4pv&o&CQ6>)vsOPzpipLZ1EoZo^96|I*TroO+glI-qs7Q{ zXju#Ri5Ro)Y(<{ehO_&+uEYW9G(4Y_1oWYBH1m~AOBMaOKWzI`v}Nrgrmr0+SFm!@ z;`5L9zZ%J}CRV;_15e9VWBI9&XaYio#gZ%>8S1sBp%KxC2D*5UoL=TL$w;#Biy6l zPy$mrO8LdIx^O?2xyw_?@=TO9D)Ode=BVs9;{s_d>4~LDQ`oCs%hFji%UQ$URkrM& ziO5XR@HG?Gi3Ri^e1xSAulnppa!9`1mF>!-_+`j%cNuDun1VYC^gEsjulr%`Zq3zv zFvn?;aRpL`lR`GJ72#h9@cQ67RTQ*&q$mr|TB-n;#9&x6TK<)mx%$-vQ=Wz6RXwJH zZuI%B7gf~Hs8uEpCRuvT>|U>G@!WI^x-|<`6t2NsHcCrb){M0?O1i{H?o5@)o~!v! zE)n{W1ZxZn$yI$wZY`weOkm1qKNXS>p-W* z(yN8Wt{?vIO9$`yut-XAJoZNEUDAiT{&mG`pp?~4)%cv)+R&db_Tu(sR4;@IaWhXi z`n@OVtZN7|lXadhV#vcML(Ig|(q-2&ukuIbZ}r_yTPx1}nl+6z-6AlrI^S$f$X$s? z`2hAz@jd;@|7qZWe3A^N=+tE@j*>zUTkOz2@WHdhD0N`(9pPK zpwA(Xx!kmJkqf}48u}BZ*qs})U2{R0j+83v&TEG_dzSVcboT=*VnZ}&AKWD7 z<1t9CXha=(I8W}q-0p0XD1;GxKe0ez=pou~4-U|m5#uWIr^rdidV1`7*-eU)WPaj5 zSPqS#q2m%Z4_BH|He#R}#8^hUQ>c6hEm(V(?Oy62MqUeiIdpAbyNHe;A=_dM7~E<* zb*UThM+}C>DP+H4Uil83Z)PX>%%;2YYOgHc)2httb0TESe0AUr$05d{IcK|ZhcOl( zf2&OKbrljzU1>_QPIB4Z6Fh2xXI58&)$h=l`~~WXQ?gXxRRP02liI zP=YmR*9`Rrqt@+B>TnS^myOtH;I;(}epjZv=00YVXKs@VQmA!3LI0lcHI0tkfXZo? z?jTS+HAHL%($Fu%93+=Xl9#*z-BHt78r`mGx=<;}&?S=L9j0iN6?9=B9MUJnI?&J; zyiZe-b5P{#7>+@%kw}BtPun$r8tx?bXeSCiQ9iv{I7OaGOil;gREvLVb-0tWW_Rjk z8DthV{8*NS_8mkJ!eEAm?sjShwl;)SQZPaM$dD2j4Lo~w&v8xgp|p*J!+cn9=>{IC z02D2U_dkr6af9gie_!%jK`;5WB1D%SAU5pD+0hTF;?fptDF~GhSQH8Hjqah_d27C~ zJMk-+OzJfvhkf~KD%v%lAxY13;?QB9WOOW)81;A5H?%9SUEFxOaAN_l$J<{9PFttQ zA%QbL{sCpO-xfCRT|qz@p*)0SoHjeT)&04Q9TVd#Kk{{nJEie1#aFL9!~@MwxAr_N z(JG%nj9BMQxaVS%ov_~Sy46eZQdkb}*0c)TXf7gZ9FP-tFckhmJPKM~O8k3O5eO%g zIf_M3h=I)R=OAMX5H`U~q*QE-HX2N|{ZY)+W&@GsRQH&E21V>Rh7T#-bT?b>fXlSl z3zJjN?XfV-`WC$l{RK+?UlzCodDK6_3^;vJlG-liP(KlwKe}8`!k$S}0qC;%vL1pS z+jb#<_>2H#M|SRFytc2C6&r#7Bu5cY&;Xdk>mA#Ml)nwyf&xA&xX~zBv7Ts$r|owX z5g;tIzBmXA-Hwzk5*2S&1}oND%$+RAi22#fo|<@%dm&1zKvbei%A|ET6|O0g4wLh1 zCqRIIMiKaUWD1I;%62=w7~Z)g%9g262RgQ~TvdTALq8Lui~~T5?sl?b$FW`}ARhx! zvFs@%qCm2*7eAm5XVf0tO!M1OVBMo8krS3b%hF+(vm&`a`w0Yb41#RS)1R@>k^BLq zZ@Or%3{bE>3^T*1NL!B;w>h`8X@*15BA5!>W_sCQAOhKhEkE^WK1*X~r)_>X{@ACL zPb!6_r$@{8nyh^B>y9&jPOmK|9FUYdIWT`M4m5LS$qtPt=GH}e39Q=v%rUeY1LNiWp+$7u}*xwbu0ilUKvMvh9VH7I|aJ-*+u6c#aKdLCjq_NQtQL<(oh z2@7M2W;}fn7vd6sf__ha1wBFh@2McvY@Crqht!gysZ?Pw;yoip2l1}YZithjfqwICVz4RaOiL@E1f5JtIB3Qts;!P(3Z;J3};o>Zb|C5=y~ zM~C_oSxgEhsEbvTJO8%2I0g!y-B3-M17Kw>A{|DD&iW|a^&Ho`7uCB>@x8Zlre$5` zW?Ni}OPnhnLOMV><+hE$c;j0Z=?eFXwpbXSt)H@C-ruw`TjHGFCt9(iMtn2eKkXXQ zAaB4r3aTMi&eG$BQMdnpP=x<`D*mk%;o8zPMaeDU*EPUjH4%h{)7k$s75|3fQm5;Z zb0Whf5v^_@Rr#-sOvC2TEF<5}_ZnYh8q!tDIOxeZMP%h!u4~|WY4!26C8W`QX(v&` z&?XgQhlzDw0@JNXgT-Cw33h3g=_Cr8G>rk}fJj}YhOiEVv@!d`UDt>WKwdunRM54u z>9%?y^{SJk`s*i>V6gR6Plj(bl^kOh1R2S6P}e{*b<7z&=+b)|;X#diKhvbCebgd{ zZ-N>P8lbGYuTIfXRO>BUBxj`HnsIw23y2xOo*u}QjqD0qF~(s`vW?XLqR3=G=o_8f z*aGhK2{X?JXEjP?K&CZI^&>_L1p`w`>(}xRgzg69BN)lTfz1|8Sp2-K^?xWvzW#s}rjltAx!RjPh&&g?Vhj^y421>Z8(!rRT~} z5SQ-XY5{=w@{iS=$p6nzgch5b=m901dk5r=aWmtw0`(dAd8VCa)IQ!AfZ!2-`SNle z$<f4OwhAxKsjTLiMJ#HA&Tx6s7lA^b?Zi;orFj>2Itp$Uqa0@Dro!1+kCHijV`M< z!#k5?`O?|a{CFJ=5A45iI?YMYR)Vce7eyKr7LBm@2oe0HBE7N{r{cXj;3jSTl=h5_ zlpB)~6cFS`I&+-MliQLO*sJWS%ff_79Bg4j{ zuF&aC+VXy(pI7XbS^f%vy!qo^ugAP^ru<9dFz8Qm7Hj5;0(Io-@Y|mF;-Z}V+uuKl z(eX07Wjr8%8RB5<;5V=pcBfTk7q;$~Wj$6;;@n7|N}?Ke0K=o|ozP_sS~DIQ)k5px zF%8wJIO}zbn1?@o>|_`2`mNC4AEo$*LVYHh(7lo9XeKtwDQ4{RDI{S`Sy}%>?y^%O z&kF7t-b+OU!atFf89|~QhJO`dZ}M(9XaA$bZ4| zG8E*0_4Z0-;7xF(#vn#^#aVu;A=@BS`>oLZ;<_R`0kEEy`Myw^j2WvoNsuoV_7Ok48( zMHk`T3*huR-g-=2-1At*I|D)21w#hF#2+O(GikZQnO6ZP^+-i%0SAx|S+YO9+HsIO}tB zqk7CwTMR172-qI)L|Yz-X50-SZ2WlU-jL!Q`=kmWWVXWFdXuR1E%yv zAmhw86cD&lB+CI5BVVg0Y%DzifroOF%KxUwK??*=^QCj!kyR0>2iI371{<|NSNqp1 z<+Wu+`2Rm>05_fYw{(_K!kQ4%uH6swp_18n1pzHwMI zSLapyJ!ue!;whXyFPzH%_oR^rV$8^$y8h2eBL{5>bke|Kh8D661)SX1+rO$bG2O`Y z@O70x&Rx4D4`)&U2AM0imJAUjH6ra)q@{xRlYazmi9pI3jBVoRFH4{xdCKvgEa8S- zGxrN$MFI`&g^T64fHyI$~GfbK6U-vUPdN>>aS9f1s3fWSHV?l}#^kz!J zn}dbvHJlFOGFuHV8Z}1jZhdND&&6>cJ9Qb>g|I=Gk{piAt^^Rd{HnSNNfi!rM{SDJ znYDm<*q!_@#`u~hJQTHHCvkSB2)#)!R#ioUo4Sq-aFnry_;=8F8E~O^VPFAefiZ9^`mLPxD!QzqFtFP<;myPeSV=q9Q84$6AoLU zn;!%89H|bY%_B-ZJPqx`wR?JK9oq83_hqhL6Nk!oE|n$oCKma%THIbopnt?}8CGh3 z18!LsI#njT1K}tO4uftIYqLP6e<>a7P3SlL?8TRx-$2VGNLXOPa0U_<3{unxc^?a* z2q7?lh5!sS1ZY?Nxf9Wl;qnwN9Xm6>T*_~^K*x+ctjSbd1vnpl%Ay$$SjgB7JCJOO z%5JGgcOiAGNVK4=)?f)%X(iUtoaiyRg}hL&Yq6TaqLH%x>22SR<${mSEby0bwE)h? zp<8ZXL??{fgOHnkf}!n=DKXcY=&K}}-P%3q35L_Ja~2oV^3(ka zVV0N?N+kBAqn{9F6VT1 zU(nBm-0ZJ&B^G~EFx9#)+al^$BJ-G!X1o3YN;#WTp$t7#;vc1OlMChshNQw{ZM6x& z7&iVc2K#Ia-lNrb`Xl;9${YV_(d#<~POrv&1hwdQO-(-&o(k6q5g!?19AHG!B+Lw3 zXxw&B#h))LDr=Pzy^?Oc@n6X0FjmxodIK^_fpHqeFU`p6SyuVviwy7^L>J&U4Z*3VV&^?~U2yk0;zbNW6~a!T6(IlhaH~ z6J`th*68~7`QqgC+|?~}Xd#4KO|0EL$#|2*iKaYizO6Diqj46xx?$Hy_8qlU-E=_z zq$V#^Q8Y`q!0G`#l%lbyKsp>?3e@jjL+MTmxE~iqCC8uAnJo_QX_FH6>2K5jqz?b` zAU&*M>=wU5D&`>3rt87FHdhQ01~#ssO|&BLwUF;7=5A^^utqjdEpN)|V}U{!vr9L= zOOammjuJJ@CmIZfli~tNLwM;*(|xvDD|@MW(c^)P>$XXv8f)-WO+k&ninMWKWc`aavs2vCX52of zi;smBe}^s&FK-VkO;+u2c%UNeTzN;5gWCg3k6@a2YAS`>Zt!Gdr(RF#a=8O za6ild9*i{jlcNTyS@S?7L08)I^>^AC9ikUfWioMP_;98_`!^%>{8&>;emI#~BVb5! z^1rjB6jmD)UJ>xT3x2&%3H^b^b%rK&EJrh>L)$MJ8sx=R1Neh4ON-~r>Llsk3f9!4 zZj2}z4wi{lxbAF7k zBXl}~uSa)kuAVt;JLxTpqr`hBN$C-d3m>SyVcG4?&{lDJ@woZp99c42Cw=g)q4N`A zV_#c$WSxo~6~LgsL)*Rp{t!NvU&jxrP*Tpp{&c!hEh8*kI;Yu^5koWKj`)CRCW-RO zZec!GT3>c-Uvd5CmKRpVaJa$l5?Ku9ISaaQrDzF{@B1Aetm9?RnLj;AxtoD#`PUvL z6H7$naZA&?C!Kwcn7HklrB$>S`>*U;B@1Rjmff``6TspbN297OC?ED05A2x8O&>p0 z{E<@Dl7_Y@OzLZWBU&PC#QNQ=maOd*W1z*=)={Bsh6)t)>MKnbkHF*2x~`VE5ha0n zfTI+7Kt)4gZHx=00-@hcI?^Wum4E@*nKaF)iM!OT!Rw>9YM5*O3xEsug|1gad9n|c z)|a*tc%%P*TfB!89EYPu?Jpr&XAz?r8V7U)30aBQP z+?3lB%{rAHZIUIj0VR`k&U&0x25Rgoqn1W<`;)M_ zP>|S)xl|$>J)%5QF?!OZJ&DD{-Rhx3=KcW39+6^{qc7Sdg+YOb?&(2kKXCO)$&)$nO0zRTByzwQ6z&m))RR5p^ z$TL?tZ#)%iN^~1~sbRHZ-=oYT*emyUR60Zd5)7@mcsGmnW>38}{)LVDu_u)I=$Bd# z8`z_4OQ*(q8)LBL?n|s(1kB?jidu8*%Xs7|?R)f*D)?Beh%I>_6KPrBq1Js34eNoo zZAkM`Qr@X8-J)p|Me~Vz!&+kG(8mgEV8*slt6(!W-Z{9ZrI=ZcWDoiV_@>BZ4B6ld zE6GKf8-=1{Wz9MHjj4x6I}r4<)P#snr!ghYtmr_1??{?NWrJz6fwdU)sjXpd-YQ=l zzIlPITDn2}9D%<@6X5fdP|B#3)Fr^lckcd@b!#Dd#=uZX%;Ts*YC3p0IkRjHptHLp zaF>+6$l#o7g()#HwIwB8b~w2aWePN^{%7|$ReeRiN{;5zDVuKKV#T9cF<-vW#)ldt zt|e+8?7=E|1Iu0qXc( z_Ma>=1w2BA+niD#A~5L*P!0(gDW_^udop2ZplzpcC)Y0hsir;P((>yZVc4uT$8VEF zlP@zgb>&=T9jMRGs#XvjGQY;(5hB#qZlKqOH13`cP?ezcSsqC50M@|+={O_~BOa%QSRCRybN(&-Bvl+hcE2o8+bSn{kbq*-zC z`v8hu8e^K19s(hX9slCU{KFth=x02HX)l_y1vZKu?&eYQ`P7681uuK!-%w(sHge*V zVaK{1hXElkL5(&a?EovKPQzEVSm@reYt$_a`okE?(gNXF$(yi)ACV_Ksn%d>MK_Aw z^8l-jTG#2am|eAcAGO}d?77`;49sULv`f35Xj#HX z{^&M!H04%zpv~01Axg&l@mQ^>S+}hQ)|P_pxh2#N8Cg-`heS2fB{-oyI}c?UkpgYAttH8N>IuIdCkU3=bX`^h%*HgA$_SS+E(+@l$2mHf72O%fh0zu(*?zZ6XSS-7DgNCRcv{^F3Q#XhYjFk8 z2g?{=tM9R>wd=)K?cO-nV{|^RE@== z0La;6vxTq?Ta63#;anQ#I3gnExr{xKffhszGK8X@7gIDEqD;(<)pJLNh*6$KL;t!b z|0Qb~_!ZtlwLh`h?pp`rZU0y>#S3Osx;+DB;aslsnx()o<3I^GSmpag6@j_pK&o+k z_$99cpPEXmabW4c%(7h;iAHN3#)HC}H+PK2iXcp3XNgFQhcwA3pa4ZwYGVtlA?rXg zi*ft=^MQjA%^J}m7Dl$v-5_><&TSajA`@CUz!iNO*`8oJudbW{&e1lt=bYv~+iucD z(09ul>a;VjFdngp-6K#BeKb>v%rszjD8D7h!jYo|_Le-ERx@Vq8^V>GVo25f{aZI= z(S|9N;ddO3UudMY>*D#SawJmJf!7%0sjzlVd<#gdW3wVxbn5vS>%rnBRo#;f{w@bi z0M;IrjM6psXLGex3ROL%z#ymbxO%b5nauQZb&_-`XuW%CtF4Ft0L&@00bLAkwv}Zx zfj<8O{#D9E$#Jsg;FAaP0F7r~ZYUO5nagIwO~-0psdLp75qDL1DT&Te)IK@(+n8C| zK;w%EaYS+-u2)g8Dx{QkVXn6Y8Kg5KU{^{fTW$l9!<*@x@}!Q`a7Py%qmX1!YzTIK zw~G_#u^)Ox(T(DV7l`owRuYM%RT<4FshIk@4B08D0s{jjy(8wtGsqWFCZzI-;r|eJ zj_sLs;g$_5wr$(CZQHh;CsxI_tx8g{ZQEwWcG7vzxw^mhZ`gaSz4pE490RsLI+7`F6<)yo)vd za+V%@4Y4PzzL8Sl#vCJ6DW~NpOzowBXW4!zD(j<_30q+J!V1_0Yjh{%u+EsxDIKD z8g_XNRzZO!p@l0KnUQgWi8r!T=^b3`vsRE9j0IM(OIG}y+Dg)A!VN>uBxCgRvlt@? zb};vP1X0-woKiyvd=3>WnrMjcSAr|AJl-7M1{P|8=nHTfay+3m4q=lGu~s;E+gERZ z4YN)q?~TE~JJmJMd7#hu6XwW^p~#+%9i_GX2J&K2(Wm8l0vcVP(XrqWKRI0{F9;w5 zL#c4q$}^HT8?Q^*k?A!Enty6Ys*{1Oc8x?V+Y~E=iY1Dm3O<9KOop^)=3|3r(ITzi z{Vf}*>Ds?6HdL+ONMZg zO}9w{qm7*^ETLkY5#9&>{k0$gk+VFULdqcPZX2|nUmhI% zGfW|A>-xYKQzfcI!T>iK9>fzJg+v8u-={LsphSnx;Nnyx&OTZGJK>hG+72xK>N_r} z3lNxFE=^HuftJ;^8M36s5AQ&ybvQTmhqzJLY(Z))sd)M9E47-xDeW(rOrmXUB1r&~ ze%0lD%c?OtgNiG2?x0l z6@sfLZ6JY{MNS9>8QK_{Jf{DjBwO_#^(2@5!!L;r#SH-iiWBKUVe> z0Df#@e$Ok$_SsVUplp3w=Z|44FFhdD1ewRjgi1c6y?`gKD2-J&bkidlMOAM z(U6vU^w%_RnruR4JV{GLxdPn=U@vgO`9z*ZIIc%ts%Ikwixw*+LSP4A&|p51RIZhu z(ho<$;IZZez+fY*=!?#?A)R1D#qA>!BVtEB$5lG31~p2|n>ij)f4D0vdHo!Um;_92 zLaYfVC6^An{XE39i>>Ku*;#O&*vWjH(a**9sGZFD;!c_F8K<0csr>QGll5MLx(pt@oB!&YAaQcT!>>kye`lV1eHCbdC5P{>#Ckni{uC;- z4~v_Jbr&wcSVb-A9lB}((FdzoI7Q-l!g7@ePFb5ffg(YsRQxUVr6Gc?F}m%)|T|z3B^GG6MTblC`y*dng`c& z{q>fAV^CvKqvAUW4|;_av*$Nn+P3hL@3#@Ov=Nj3a9>SaW_pzpZ8+fGBK5o061N3@ z*LM6Zx#L+i>yyNP04kpHx9AnyZ!nuR%jdFT%0@B)P(u9qb{DeP9kSnG&{I1(_Yc=l z3{Xct*ng%hFMwG9H<$8V0O74$GA1dG+M`k7P3*D{V=STR8@$@Q$JD3wIu?2{igl?WsZ1b*gFs>|p|C9<(il|I) zMNR#abV{t%g}PGvet330vsw0V_Gcy={bi8dQy52nQH$?#4Q?yK|xc0^}A+LxV17UUD?6C93-L0=mmHxq*X2H|gAj zDiqKe*C5j8*X+EVz*qo7wLDoguZ26kgU1v}9Px+KuA(lg66u`00YTA|vM|E&+F|%i zwl*=sxyF1mYeZbVOIGtmv7BrwP9+Ka;TP4QWICT8gkM=C`SIle+VQI@SO0y;jF)E; z#ElU4j#9;qt57jDquuxs+-(JlOuM$YXa_)OK?hA{xXHjL^bvO{b~z)bgr<%Yzw=N z2sdx$i&GyzCwl;uR>P2aHfhfdRXa&mzkzKIRhHtI=Jbqm7=Qlb>aWx)4f;IToDe|m z(4Jwvh4yp^vauj3)=2H{8$&p-vE>V|l5Q7s3Tm1mipEYAJ-i*zpuZ@pZFgL_V zpu|bNnyR4Qy$wHZLUen2mo8&FH5-s)R1Hx$_glDJV2$wVETCfVcXh;UmGlfHlxpSp zDBD9^qNhnt`i#44@ShkyBEo+PCjYXBg{?afOj;3%tHJb@b0p#6!?LgDn+v%axCcOO zcgR3&wc%qKq}cg#B&F;TJrN1ATn@SLu_0$w(rEc7H|l^>qn6{D2ri-sWy=66j=sp$ zAIDj`*qse#(Wxfnb(hH!jdq{qhMcq<-&WqpQA;;2LEU>rY~?&ka`%wcd@$eC*l!0; zUUjh8_gf4|<_8P0q6h}%0U<_Tme1$@rQNBZZ+k@VUy)BZohvy_Dz%4a}Mb)`k2bTM_fyV6P{Qd6&;&45b6&z`13-G4Y*QRCm- zbb^9To>)onlx`$d(C_HnlUrI?u3RgR-Cs8Z&gL`uTt91K?cX-$H8lRgFrpM|a=q2S zT;czfdj|C0vs!R$=op^*Eb5GMFOH_MHX$BIqdgt67d~zd^qAR{6A7SQY8A6E?pQh| zngn?~l9@WX$QR7}aiCo6lH%GL@^+70a&u+g?W3zqnnr={*b& zI&~k4Kf^lU8F^ph$K;tF{rLBsfGm*HP3zPzYj!_pkH1lI=}-S|^lgGt;P%9oZ5?T9Q550nnzCE4YWrY*= zvg0ZN5GSPlH4J4?G&|ciZ>QL}5=0IijN}~Yg<$HrIf;l;YjAAxTtk!{h2@ltp(jSv z#J-6xvLd>U!W^m#Zjwe$}P{}zFr;I{Ok$C}q!tOIAh`3it#Ea|)bv3U zyzbt4^hYpd9v)NJxc~{m=}fwV0&F)}7Sg@N4&%mlPcDMM?j79zYMNOZ!v|h2+6a`P zrH_W<9n=Nq4oW6%B5sMB^DuUG^Fy zYKuOkLzn{CJt3Ckkuewdx$_`SY#JJL%M5{gJx)x?R|?^^JaKY#um|7aAOMBQX!h6( z^g5$?V7)$?fj1zxeO43!gKQaffMl(eF0e<#45E)eYIqznqSWe>t#wD-&@_+Kpm&|W zpO!AMS;GYprFw&oGQzT9P8Gr#Ya<2JTqIteIN$ON(kf7xZC0HVhQt1P`>OL@l#4s| z!`cD4H%SEZBe~J3P*4Z|YG4bU3?q<~`FuyI_mOl;=qGhfxgoQCAw|<28U(rgT`{0` ziC5XE&oPm-il9pk@5*qBqsX^v46_p{Ck(m>cWn<^mr5C@{DIGs0P@~X#y<`y;%MPS z%|x$*07HWSH)DpdW4B92K^1dQN|e7Nfv0T`ORh_L$-bdFrg`H~9%amPR+e?HP*=2- zs&%moF#=bW^OaR5E|0;&q0My`4DTLM5@z#hQ4(7+(3a<7HlX7s(*I)v^>XAMC+<84Y9~x5a`@{4qG#e4vYu{x3vq1vnUI+iZrIT ztc7cKuXJXwY^k&s3Ah}kkA$n3D9kvN!7Lj>6z0+w_$@s#p(-tinbaRw9<~4GSubkk0L*>WKl^>Q!qe!|( z%U`Fn1ps~^4p)UIm*+4DQj^dnT&Z2DV0`Ix175iytt)>pwFRIL%|>&cL%dJ{=ygn! zQt*R8%d0qE_~lRF!}|8EltNTiNUltntBTjXTLhc|`dKffVyl2-QH#Xt)v+gpd?-va z9g7(E_nxWwsr8-#lM!{rw(EamaT&Z-bilK%L{f`n7j8!p)vRP~J}+8^Z)~S(p1gi) zFptsNYIcA8LG3_KU>H441$3}*Y$^ouKAU{flOVqXl?%v4d`87>9+(;%YlSQNFCG6N zxQkcOETU`2ISK*(K-ug%o0{RfQ7kubv>0G};@r+@yej)-C_VZbbehX6*z%N~z0!;5q zg?&1cH6Yfn;b89lg}-Ns?U48Fd*Dc>o~jgENhKIr59K1P{cBUM@cXZ6J(n-nV@qmP zdKMC^KD95lwSwrwJO0((k`GxgUt*~-H_)CpJH77UobGmU6ZqHkeuGdwA26T1dC5?{ zz-()nDq;ZWrjQ1m>r24%5Udlt^Vy?ZUayN9n6SsQ+W%@LfQ`mb(3FoHZAHQny~@K8 zmj=n7VR{m!v^RL~o7Y-X94DaJnT@rBwEQ{s)RCy~HmL2=eiH|?&3ow?0aC;Jjq8$3 zmoZKB3|>d}VCB~}*FI-SpKH^4-T4i)q^YB_A&v_8NuRAkc#zIu3JY^vImwC;%4P(n z_Z2g$xTQC_+Fq-!t3B-ta(_JME=?uU?oe8(2oTQZzCY*ijdXsJ>!jfK-+BBlPIWv@|8Z9_qU8S^qw3>OpuH=zf}h!StQ_^;|1-rV@E) z5b^<7=*S+<<6PLT-!);s-Nr!&C-kXFRT7j3$DruvKyuuY(YLkYW$_M!$AnwxVMYj{ zR`$9jg=ji;D4L8+Sd=zUoHj;Lrt6M;-4Uer)s<#4QJ6B690@S%?ke`q#Ky$Qg+%r_ zjM0MhsGsxb-oMr9m}!VlYdq@%#&{D!J%{iR zTgy48ivLL8)Xz?8)FkcDj!@uQCn7lnqcEH@GvvQ!qgC;H78w`EULb1v9!!SXJSGVbJ3*1s)TMHj%!-- z2dN0}AX~CBHzb*IV{R`M30gFS7`Geo4{P5!F;95?FVh)V`%>8f#x?x6L7W9eAw5@G zQ_;s>OI$H^NSz+qqUh`3h9#f0@$ewp#0CS{P z&Me^-=0T);E*>o6Z&vTZl(431iI5{LqA_=195K+*vF9JvwnALcdZ)@j(JOo_)8SD| zMT>(tVFV!u!!jakRzGPi&fOU^MPXdxNc;3${Fr3Oxx%F(R*seeL4>9Vh|Mr_QrjXN zATilXLmqS@_dWI4lW~oF+449*g}~64PiAC+c=jRMFWFMojp67JNU6KMT&fu0?B8R* znq^9?cjvFdV$eH};r<#r&5uP*_qscm6;u9vzZWLTomPdCaA zTnx{+A6}~-+&PKM>&^yLi9fFA~*r+l02qnjKLbr9IT z-5XBa(+85bL`=}#L~b#@`!%#EI@2`oHaZ@-`tQ6KwUj5&@{2(Mww$NtjoI9t{1Ebz zs00}3?&E4kmUn6r4gM?H5AEDj(eJN`uJUgX-YHOHKFV9`%#}{GRDwvKiVXQ>&@TeW} zcU#Qhq0VDFP69wJwpXlvi#o=)Y7Hp4w81qy7L&r*u}T>?8`YG86sB=Tge!X8ePw#6 zajM9sb*w|Tw9Y8aN*({*A5w;yRIl8|YFeSn8y=McDgH0!gn8|imA&NX3$+%nGKBD} zW_lY-)ofgh9xT3Ud8lR0m}PmL@9fv7SUDLk%pV-5G&jH=GUWXt3@fvnmTQSxzT;6@ z&I^T88Q)YTBeMjj^&FBUNC}?f&FQ1q;sxQ;?)js8orNBs=w;I8Yzl%K)PjO6g=FQ_+NQ~x94{x`HIaV8g*l3rT0DJ%e^I#_ zu8-P$uBHv15|#Eji4eoc2oroc>gE{nRhokr zCR+rJ>Vrjwcrp%Wrf)?2TuVWTP`R?1w{55z)A&ItXI#og;a~^3Ug4Um6Q98?2Sn^j z7afR~@o?Jv+u(j+>ax%9)GV-95-bGv#BHcMBD1TZ&-z~dvz>QSw87D>H#B+kLFf3u+ ztZG&j(E;Q)=%Kh%aH$NHN*ai#{{;^}Xys-^m;^6fF*tUIBmvw$x-DqdHg4uRu&L7* zgulNnhzezcecykH3WJc796oNwQ}Y5$9SMc+k8E3v?XR}n4(Bhf5oLD}RmKZa8ssWt zi!o=aTKz)MsF@>}+UzVJq)O$+YG{w>zSIkw>p`r11-{GuqoXho^0u?|f_0ifq3VooKWqET}>8kOs zn3i+UH%{%3POZ4dS|~e z@Yy0+L~0$jV#@jdPFwK&lJPug-|2q4<#|T)fBf`#il3~T_>5oGNC(`qKp!}Wyp8#H zL~JAFZHy3QyxtF})0kuC=yq~JZFxpQ3CJ>JgL8gghJ`q}vg7LI#8O;C6zz@e{&T&v z=T&a8U`ntl$RKc(rJxBvZqvvT3Z4fXtXngVqF?OQTbb-DIt{B~|Z*U}(XiH_`HH+ZqVmduNOBTsqk zBg=3ON(h7?K~RP2etI=#G&4eUp;a|fAQuxbDEFh_Z!Zs5FSt%w`XCuz9D&XEKg9)F z#q7oJ%nc)gCRRm3IPNh?~09yhyezQ+CSL#Q446~)PD)oDEid4=^zZ@cJT%B z4NG>w3HE~E?Hw#R$238Q_`oCt0iLmX84tlc28E|Lg0{HqLK)=T1Djj{gN4F1nqr|a zY+bP9?tuyS3@io4N4$Q3@2GF}5#p1rS^Ok*GJGD>U&}YTT1;h16WZknUpl*-i8o6t zj87Rj`vBB^OI!LZUc1`JZ@nc4O3YwxNRDRQ5cDSCE7nZ=8&|%o!mp>HJQ*-s zzAH=&5G6$QEKTGTlU_cSKATWds_N%17)>g`d7ECQ>R-pc##t2!vowSfu+z<&$J5c` zDP=90_Wm(S!H1ezFk?6hQ96~jdr;hfuK)<74S5o*J@WmM37R{WB14On%^-O|_WNXe zqZT_N<0Eq1cHVtotVKr28;&=nu{0K@z8;u}^N}FFPqpvXkz)Rend&xzVyrU!fV$y2 z=9mzCQeG|LB~f3ogqDjopR{4A;@LqRlvh0_edt6Dy}*Dq)`uD|3Y0Cz!5~c<3qCFZ43mtr>p8KrGJXxlgX?vb_olp&a5T)dMS}S{}oss5i@h2xpbGlR{9zVyX zLI_n?S0PkoBD0~Y5XLN@q+!m`7^V5H=RC8f9`%)P3_!k;bf^0}mot;;jR29yGKB9w z?q5UQW((x332J_}D&R}2z_KPk=MSI`r`w`jOHjN$k%G1=t+;{4;!@fjr$1#H3TPwj zycqCsJD9a&ljCW!On&#%fR@Jx)5Pj!-cg`nz6K@>Bh}&k*Ae;PzPzl1Vk2=4S{j5< z<*f3!*D8)gu0PL7O}kRFaRCuhpkJX@6Nz47@9r0!BgoZmSI)1(2b1(s!vZjDm`*Hq z4K&{=&3UO|FAmYQ`g>f=7P(qt?^wT)RAN@ymn3!ZFGHos+1_8!?$QY7!mgE7r0HJ5 z(X2-bnI)ht1tl|bR^HQ^VlDeY_$h(`Pg}xw$|PTZ#zLgORYcd9>F;{mpSjs*?>njl zD8(^(>8W*BiwIx)Rl!=SEKmSAT9w&d9Xl-KnJfInbE7CXK-0pi_YO2y7STe>zou~k zq_bbBPfI49#7WCmg}88&j5c8NI;|s)K))_da;;F;kRzksLu%=2Pg`X?4@C*2Z znt`RgD|;Mmj4ucc3C#^u7(>S>9O%o1yECkD=tml6`ghRWZQ`Og3JD+xFY6+`-^iNa z?M0l2Dvjo?UZq4jXK7TF1<-7Fq|&UN{bxr{sbLtyH2Y%Ij1pKT%*2JS4{5sVH9& z$cj=`im9BB)y}4Asq-;r3Q(gwbGx&8;;L8=MY3#Aa{w>NG*sPqD|lh#CSKp+Kn6>; zSlwo|v}$Sdr_&U;xlhD`NCHf6FR;qtXtDJ`UORrp`#^l}P7P4NJ*ON92R88>{qI*E z*CteSklOEb(BMlo1ROM8@VLdpm&apAxF z)Mao>oJ@#n5Fd@M;c5!ivtqR{xN{<&fR3T35_UQORA%VtRthBhGNE{!5lQ8 z?$Ve6U_*TIvpn7IIDmV2S8S}1MtefT@P9KJAKcI4wFTtbTW=&kMXl6KPW>v=IW5eW zexr$9zYt)4e0J%@lB5vr?z4(QR-d77!;)=A*MFuOlWZMuR~SFfiEMFkq#4jOE6!m! zol;wZ*N5NPRlD`VP<^j`vm|}s`TY?tC>nl41N3o|j7l*Q7l9g(9 zn!2Z)CQlt~vBIIxJ*VYk9S})+dR8k!5M}l4YeAqQ8eom9YrmTNlTb2HRL~+na3HeK z)y{G`8?4@w@@Ip*I>}?}=azgy67lQGfJqgMhf=&Y%;eSAgd?(b<^=8zIxK8O$Vqv3J5Lp; zXJPh)UPgU|`eXTiZ7oLC)*8=cL|u1KhC;V%sAdbUL^aFq(+$a!`t=(WrcLn-U4Z=2 z`5(o6{G!>)OQxSTVjd6a&6`PSZ|a(f0CX{*wBF&3AoVHU<6C&y$Wh5(jV^mBz$TWn zc7fr+*P{A#@xLnAP>gb=GnC_$eg2+8LX%1Tl4)6%@J||lXD8z1zpt$Js-DGz}C;YY(4EpI77LU*LS4V67VnX!u zilM(uR-c@swn=$oTB?ZL=BK=y0hy|HFI)^M6g&O;_t6#eUdd2?N9zT~`@amX zrP`XfWT$JSt~3KJPkrQbbw2&G!HJ!d>v8wYSf7pWjS7>`i=z6W z=U#!uuJ9AYaTAK&&su88b6E{gK?BINl$^=-jZK-uj<9JN)xcvoH5SbR0bQ7?``Yw# zAWlTsqB@XY)bo>WId6qDjOt4`4cc6e*i8uzs-9)s(K&1-ZaP|q@ItQQ-+_KHynUs# ziu0C&IOdx!GFrPaz2z`hNfbBb#4^}m?r#;5yBdgfRUH;?Pw|f~1Jvx4A_94gl7GQQ zn+Qn|oa97T*~wtBe#ps~0Ol4jQQy}uOne!n5v4-=NwA>=L|03raAe=(JxLG^{NrTd zH@bz%J8Kxv`S?sVsYhhj>;OV>kWo!VYaG`urHHG`pzx|qP1oze)U`Vv^j!nkdm}>x zzhmr}@SEqaudmmmHujYmUUHSR7?hY=wiL zD|3G|5EarAfPN@CF8*=RG4@0B}-y+tX5^<5(e+m?yTi)M8^v%<%n)2t6O=ghCeuinHu2aaAYU zJ4DKVUL@X>8n9M_px@+=I-Og+tSUbz+~UY-Rxjw;Qkd_$-piSj7x{md5(EaY^JN71IBYO%Jj*e-W^fYdGVp?D{8#^93zs^N!K z7|kP6WRx6n>S)y*Jy}Tl@)N(0txK#RRF5#QQ{mWiA#7ZVw6>FuJUVAlymRN`Q0ZA#zhv z&}7Ak%b|a^ku`_0pvIVNi(XZG>QaEtXsdaG*tCu+aM*4c}hPhI-`C6zqfM|tcvxoa|M9^H_(aqVkuH~1g zzdjT=8)d+OpLd6m=2>7@MrapiLEhZx-&xvyLvQ$O(7kalP^Rcuc`{g;2H@(8cA{x4 zzO!y_-*@n3@@MhOW{RXxjq)*A7It&G9W*TNDPZpdoAU^tkaZJ?4=*L%_Oa0cNB`i|lVr)1uzNv9#@?{z3&0PRc=_Pjmn( zM`6FOeIX9_s`eeOPHUWCmPb_aTfglvq6T|Qxg*D0mpb0zb9t6d>h{9+Qagl|iJYf8 z0N0(J@+fpb@H1zm=rP#r^F!q~a8_JakNqpg@Jw;G%{kx}nG_u8<(n{IX5{#!QP6!q z922=p=IA8t^BKdt`tpx*UCTN^ZL0o1u5iHKXD)G3>^ihCnovDuM3PDV;JH??9sMD4 zO~kc59`0sO9-#hC13?j`nLHj_3Kkt;f|i$S%7uloD=V=Nmssgu!Bb{F#kbFzb&{^c zKJmD%2U%oRra)Q`8w_x4J%ih!N)Lk$AT5U9)ZBcM{IY>*)wIxN(-m8c!{j}d6feXjP^+^v1B8FYRqq>|D0rOc>N7O?{73O1{Ga)u7Nj0QThiw7YDkXQe ziq)*Jg-*D?eZM(Q((JaV)eza&kwo>gg~pD$$OL$zREE5zx|by5cS4VdRW+XAZaKMf zjD^R>SUXM<6{C+XGCDWg>A$VFWZdmE4qe46luL}Z1Xp(XChZ(0<4Bw6@L?B{j-wXC zgY2~})U_dDVPrckDg21>t|I`ybL2Ex!3$tJ=K^>oCbkHG$*>dQ!B=jNy*D;zM6C}H z82slMailH=y9xa)4gY>ERS;(YiV88Oy%V~;C6ICBXutBeZ9Be)Ht%(-6v(3c{(B6f z*Y9Xt%@THC^-=kR-uJU61;rb7aLrPyq-sdtTbd_~X;(OqCD1Ml^z2bYSiZJe>`}8Ga8=A z2*7A+I615dAm{1@a)5vB(A0MG%tR>mL2M(jw&AJrAMdy*guu9%WC)_@D<`=wzRrGI zGNq9RvV{4XK+Yw|q>3bL3WDz2%Y5N`n5IFXf<+8gyz)f~A6$^zP5ioGbe3H`cRdY= zAYz>N1VWYFvyTe8AGZScSdh4ZC!7_$UM=4&rJ$0nilw`;5CBc5JvE_iBQRmm^Bu+e z)GxXa!e6q~9&jg4qiebxu_)64R6Po-qM&dn>lCQ0O8QVYpu>l`e1>#Xzo8}-q61XK&1u>wtb(Zq9m@uy*@Hfr@ zkVkcP{XYo8_kg6W&eI0b5{m<4K3vtJ7c>2!r`TX#I^put2jN0^W2zFbDpy&lfc|7G zURG?d%rIoD{7sh(A18bV=WVwEAFSYuiVCWPsjJeQ+6}HX;XQuc4I$bmZ`45S+FO=- zd%PwCv>`ev5LN2c+6K^K@PIQ=brlhcENj~JC+S1748XD7gLz9xJ=1jQDnj zyAH4oncd@xkd$iP2yDZ=E$v3h8t;Uf-GJ(2j&X*WP^P)b^qD#hGVuz2sXYEde;9~> zz@RF+a9bVZY%z>Mt&W2`M>V`>^Pd0P2c^{;!K*{%(Z&;2-_YdcO9Pgc`W{Cz_N5bQV@~X6NNdE~=SsIgqYJpD^p>LlHRc<*Vamz8hz;+90 zPLz0^hQK7LGBqtprPqHlWMGizNx#WXeJedj|4EG{0qqzmjpvDOeEemamB+e+V+P-8 zEd+v_Xoa7Y9x8Z%f}7qUCw~jABar^#PaE&mP6JHJjW+@pFm*50{11?tE)io)(y3DAdK zy|8Z?=i{&7{eyEW9!qEz&}IkBHSSdr0~YrRvDO&Do?xh6Y19Vx_5Tp6e-^3VI#TvC z$;?ZxS3|f)A0~iuW?XouJwS=(SKlm+aOk2sv+qW;vMXT9W7drY#JqX_jSy++`9c%| zxcv@$LJP^NUBMnTYVlI)@v6q{-74cse!Ei6))dZQsWVCB==`@V(`Vvualow2Eu6 z{qBG5v-26OZzC*i8iXA(%RP`Wv87%l_opyKQoCp=ndopvPLH)p;&E&h;O5I?!ZghB z_d-m46jy^;r_fDd_!&TXpG&t04yR`%EICAmwhOh~pY>29a{y)#vwnjNccTqct;7wp zMnJR{N&HH@o5$`eg7=j~`K!9d#7kLDoQUntL%kq5Kv1e)5BG;jBS*v;JTBAtlT$1$ zR%kM!$Gt~PN|;ihhm-ID41`y2V6?KeEO_m(7K_}vg}v`xz9^F81^#4I7sdF0WRMR+ z_6&9dkXHdbfNbI2j1f8sC1EpFK2r~F0hAA|Bn`x;n#|I8HC4@M?nZy(Z!+-oj-q?K zSMVCu|687GP4bi^d#Xb#rqUBENmjC=DW~JriqbtPZ88U3j1r*!xKC#yb(E#op!*S& zjCWkF+eS`~->tY9iYO(>%f%yNma^9-`BN?D8EWK7&+sx6nL{q-x8$}iWchw_fgl+NY|509OlrR(|REt`&2thafTb_!Bw zBFR^s95Vn&7$kTNp6|)U-EivX3mEzeAci=mn$gHUYpx*ln(j(!Mkj2?Y}U%RcaamsPGrrSu+$YjT+O1UnS9( z)^Y?izPOgI*ofnu(%O5KMc6A%+texu{!MKhTT*~T*x|J$#*S93CvwnlX8aFKcM6W8 zFQWJ$=mR&Y1=NTo_&wL)(N$$T8gHi(-M>2s#RoCstlDK{lDfY6{kQVe;R=;C{}_T5 zSbLspEu$OW!THA-W)51q@^jJP51P9V#2a<(3@e9VAo)PkhLy(@(R`Q*Kf{%i+I5%L zrQZSI(lNOk-TrYHEnh5B`x5*JSq$PvP`|k_TG4ltJc?a~J0Di3<(K6(#R0%E@p3Z% zd!V9uQY`-816357Xn}rpi+H~|w-m<4RvnKH-2C^|v4|8~>a>%^v0v_5RhF?9W3!+p zRIsn*m}Gv)ILPG-YeYJ-O=Bp~Az&<6r;I-D6d~a6jqxv{u#=(}B{N9UrYM8i`L5gh z>-Ekd5AR^{LrkXQ3*e2G3JaM0uVilDN+H$1NE5}#G*>w_M_aLGdC~9G(VLLM^wCIU z1jR?H)DH6--oo1d#5P>dq(Nq~D@!~R0}#j#0>Umq+?W zrW#uo16JykueTxpxV+t&ReZ-k>65tJ2`oqpS$KR8$Rbsv5zMk`p1mBX;XGR zjc|!9)+_!5!z$)@LwH@mL>()(YZy(+JT?Q2h}(}e_M?U(ER9kHi*nFZA?7r84Or2% zc_>O+$lixSV}L)VWn@$tumHYU$IUYzDTNvDBB+Y^A8Zox4>qaR5hBLjIm=vh9=xU$ zw!rgI?repn$>PHPfzg}W_xn*)H zUJwKhOR5_LjT%_x=DfTJJ%g81{6xmG&wQZ`Ee@UNKI^}j2pWW1|53^jp~ zh^Fxq_{KUp4qjMF0%uq)gmCaAqC-Q9n;}cSRcRQ{Q2Ah+q)vJdSq7TYUKDY@_&DaK z9U%khtQd$YCUmRTpHNjhlB@5vJEcE{@!B#9OO9iL$)+#4C^k|DHo5ofK7%lKpeP9r{gQUZM)X58U0 z)}rk87$3R*Q0n*NEpggcl+qGq3xtF&NW4k(@plF2*nXPvBi?5Ub@UBHq24HkjCT4( zyMhu4pyyQmu!CRYckbBoHlU%w6tb#Bjp|a{#XvUHmqxYQ)yKNM7a9NNm)_6b1IqOC zGxv(-qPQ-M)QDDG1&NMvX;iQ25SVCAv2kjToD})vYxnqTL$|LR_UgTz(bnyzGol&U zfR1m3Icg(i^X7_aKP`d9QrNc}BC07cXpT|^;MtJ&Vrt7Ahmxl+`qBqPBdh9hv*N*tPt(6O+~@P0`=M&qW@Z~^sQx>@lVoyT*oBY zSVIeW)xzI9ZJ%_W=<25&AQzxgQb0Qb@?(q_NlU4PJmmW!p_BvYp}?{?*Njc?ZMcda z8r`-_=`3@a4tx@T*<_sB zha2aR#?uLLd0=a9Nl+8JME=n*!*dMATacB}f`$IfKq&<=V-5tEhC0TJ5JL0-$x(8V zfg+T<;%$?Ka8wRZ_KLzI0X&|Jy80VP77rV3qy@^YOj_1K!Lx08@#DZHk4mRp-M(6) z1JN1w?&tKl=Q9EZ7xy`MhlbW>5Y(U3k+>Yp6JC$TP!?FhjV-Go6cYIRzrV3X^3b~1 zYQi+bf{Q$T$b$U@N18zWRgGE!>Q+w>61K3!Qd0Zb|{Ny*}$mYLwJS^@M;2#F15tx*Wpf)=vkP>%<%ITlWb zsG6!k-{xhuOWJYSqwyst3n9~S051_28FTUmTg0;5ln17Mpr#23W zRYjuEJdPw$CM{o;?18;U;`H!}(xAv{pcMXZNl1A=7`HIaAi>Cxb7dqmPH}Av<+;ctAg$D{P=|fztOh z&Rb#qmHgUwkQJh$>RVZBODk{qCY^nlg_~HzTC*?=JHlGk6FYb;u|P&ZBf~PQY4%9B zEq}i~2a89iC`JDA^8U5Vv-Aj@KjH$GTgVXmD5a#O&?=-e3YHEq)n*RNHe^~ax%?_) zCTm-K`#tDvw5k=mVpn4XaCm@L!Y$s1m5ZI5p?JT7W6hKl#AU-Sv7?)Zkq1>DKZS;> z0BCJJ2R-9@9PZOROkEua=VCI9m&47v7?;yav`cC=I>Emov%f&@Ns{*Br;L03M!1E&9-mFyNdI7~x>J|wohe*5ywa$VboR1!E64pFColu=)5={7NLi43{GQ2-+Mdv_F^XG~ShGpy&wV*PjG8 zogm0HkiEBW_J1VHCm?XA+}KZ{a^I6fIOMwAnA7VAngC*aIihA<03^9^hQvOKGX|>YnRNabc3b`u+@qiTpv8iJxf=H-DWV;ew_FmDHNJs2w++!X7pBNXauk1V#8H zD)X&7gZb|`NS2-bUfE;mw_QcmxeIv{I(I;in@{!yAr8@ zvM~+|NPm-d+n}Res^JaIUVuOfC`C9sFse!8dk*UILm@$Ti!@w2j%AAV8+jZn916lK zTkhR3_PaIo0b5l#FC4pgLc#)aWh(_SLJ975yJUUZtz82Q^R)W7>tnTz561%HFgzUoN2tpg<|2k&|_6WXfl45V)_ zAoS(GgJK#TO)1kN8y>a-lPf_4EKHW`wkh2nub;Rcd1kQ4204b-Owg(swMdwxlA4Ij zG&Bg+yjJ3>GBLHG#vc>4y>yFN!429DQkZJ;@RCD1B+a!o3#@ZAJKnJ;dUxr*UOGA6 zIDcun{+or|nSsQR;_;3<=oW#5L)}m=bhu+RZ4nC@-C)Ll9Nb}Z?Q6KY9JL>;E;rVi zEz)dktR_IQ1_1A7l9)f9+xfnQ&uZHJW1*b7|1j|V({n2EWj~ayS&aJaZJaLtMwb)= zoZ*}^Q1JMBGvBI)eYoq=b$E7X!Ew$#Nq=mC?O)*6r4Bt(-jO$y6MNvO+V1aC7s+ZyTI+rH91~IA6Zd628geRqzYdRo`#ZFc5yvU*T0nO`z>G zHYC)tPTHgi5SkEW;w2(--An6{*pcn5>rnr9&Q7{!X}TZm0g;zj=kwitcb`9hIDg6J zndeP`B~$_NwNadz$SgC^#|OdC6Ep>#Q3fRXn5UC`b}DZedwcl)h#kV=yQA=vh=Ca{ zMfe@GIalbvkm^@>Ca*!!8HArN1vf*_%QcWV7tWVZrRXwBX*RrXXEGP2Zp)Q|Eo;mZ zh~S26qiZ`n%@R35G(2&O zp@%Hcnz)I5gG?$@w#57G5&RI>H8nsiOT>({Svlk4aFfRrVwxw$Mcno}S%14-t@p_> z5qXl7ZuunPY}4E*Vp8CdoEg8VgznC?fs0pwuwUEEx$cdshcR;lo{DolCLRc%*WbZ_ zQ6U9qG~u`4Z&z95Ts4AE>?FVs$e=`7gT!Ovmz8e1xp!RjGpIP)Pl3smAa(x@=GDEp zVdb*q8BC_BJ&CG#h)SyNP(t6#$$`M)rCQVv|qv4fqb-GQ|3xX!-Z5vlxmTifSzYEqQ zs)7Vm;8@ffx#)JmMPpBUBP;!WXaA?)e-noN;Kaef6#{DS^A37wRDX!m<%RVNx+IKg zqM?GtQO7B|Uw{e7h#dTrVHLN>4ao7$4Q)VDsjQI-g54?xIj5RT0Puma5%1>OA$`(m z9`0a0+OT|i{7$P&oZ;@7L%pJ=dYzv?!iu;T+_0;S9Mrm6xq&ZKsdcK}Xa??{I$l&c z>v-EO2^$1E=A7^z|%sg+>6NT?-6-30__kr0=s&8l*pX=9PvkuSTgQ2!m|y8Qvbu)8T|-s^ zkL2D%;zCFuG({yJB5Ie_*5%z-{u+_H_X88^^O z-Zs8!)j7O9XF1o@`R1!IlENk9fJ0aP(;~Kt=;ChSR-yxW&6fQ&c1@hB3*CVq zDFtoK^4%ZK;r8#!#a&7or4J@K(dogaW-F*h$$vKZ1&vb6ZrVT;-OpFt1q-`sCBV>B z7>r7ksx(zMkQGMOcydif_|D*bQM3z;6E@Miz`M@GO{E zFty;L1vd@Y`#q~Raun6BLNn#KHKoaPZhz=HPB{aqOmy}-6t^85Dg-^jKI4^+Y+z1-Z6cx{l$Ezi*CJ3Ln| zI8ICb5FAk5y&%)otztPYESE5J;T?>IX zO#5Qze$>k@c9*IBZeK~H?F;*REPQ=ujvaU3TAN*SwW^+d4_sAWCk4P=AX?3e0g|gPp%hvqbRFRLPCtR+8(?34Dv4Q=I18k3s>vnX7{1RRVV}cJ zTC~|%*t)8{|7Yvll^4zh{zXE#{;CBJxlyMDFMwGW>Z6FiskIkYNX1Ly=YL}@X}kp5 z9k;NQ72K}ZV3OyA_){DC#1UHY^MvouWyJ&!g|O-D<7 z--aDKvH&WiE}Zmkys7(#?0*z3v;i)*gbs{z+dA*)X^+=1E5NN@fA?$ehSa5A-1v!n zYr-_m#;O)jbHh=aA3CUE?bd0JIU(n>*?Ckg3qnT;bI&MvX(3h_j^8>;Kmy&uH?jnp(Nea-CP{7GkRV=FIOspxr9A8i9 z7{*tV__@r08Yas49e=cWR5t!wsIT}ztU!?^#GeI!1u2w?5UMobtSYzhIAzLZkG8x2 z&Hk>ewj-pNE3slJsOV7R8_6Kf7>8sDCZVD>w9rh2&5; z1dflQ4*eo*msD&;4E#Uot|vA$g|%0}i=e~^h0mBfX#S#8vwzNs($JFDKS$>rpp!mR zwcw2IJD<32+viYG6P(=V&hF^s9=DtJyxuwE0hnaPN&e6Ul`S&#GZ`CKM2wjWsI+JWl}YM@RGD@9#| zfk3TB);8oWv%8eV6#n#w+AzDj^DxjIH@il5in-f((R_ z;20lq^EpUw5(Op$%wIH)M%KfvXZ{JZP<-{J_J7Wlg7RliA5+mkGz+|}w5TNMf|kBg-E z8>NyVt(&~{{)4*6FwKFS5FQ6XesDYs7~N1Zou=I&W2)`mD!5&lyF0UWyEAlBAQ=JX zGk?@erVdV9Q4x0^AsudrsOnHsQ!(wsY5cY`Rym}Wit+4V@2RuYQKr2@inc>Wq>tWx znyXPp2|AX1lPi`UR#2C}y-C7ANmXJy&K{_9(=CwqQDg%$TaW@##`ueqOsh`CsGVCw z2u~Y|XoWq)O(HHLvrJP#`zQDU2L38 zL9EgXXDwPP5=TS}GRHAwx%JYzy**oKsm@CWeaOx;)F&0yl~1*h$!J9JveUUzy?^d2 zvPoV|`T5K(rQg#-&oGjox%G!8&v&?x7|o{v4o<(sAQRgc$sXC|A zqkRC55X)+IWmh1tvgtHC>yAVU!2V*G6OoPx7jZsr|9* zdO;(zGPSdG%@lJg=sr~&Ps^m8z8@56*Y-j?1y_YlsITdgu#ad zRyXWqp9{_?&c3f;cTRDyV}0K})+>4b4`#K>c8JZCmaqURar(}Ze?6z8RDT{V7Pb!N zZ57yO9NDG5+;*qsn95Q6H24N}k-<&^F%X9DeToSe;6kEcVq}d*qhg|jC>Rf$kkXxn z#?m&OsVp(PJG1E3x%4pKKlx@_+{8^(szT#*Lg*1EYk0}~h;)6{A1kl7NKqSvepGj{>QfSI!zB)+|q*{Yec> zLe1Fg!xa#^`h@-l+DgbddGNS9b$dlobYI_}x@sE0i3NljOsEicnt#OPPpQhu`Zcg@ zO#_&3ED4ld1uK*u0te{an)V9R0quQgoq{I_3HBi;HJi*9-ZIqIu|Ob%WZRj93^~fU zlw?)6A1KjL@*Az~K^@c)b&k6V!axuJ`~8Y5wbVoqqKJxOTCuP=2mPh?JMy9>e%0zs&iYsYq(H1Rolvsg`Zj4Y@z5i=pI<;DjZkbj z31Oth3Zp)fsRQHxba=xDzQtEdwcFk{rpS3h&^u#ETR&Kue1!Ae$?w2 z)bRUY;BmSH6;lS}@y}#AN#?(aC&qrb{OKjTgv%daj{o8_U^*0hd=E5X;5eN3B9RQ48KLz*f@kbhFS^>*Faq2pkVLC+3X+_~*;_#R=z^uS1BYBy|!)FGEJQ_n?V!-bl`To zd4PVrI^b(v|K_Cav>dyvA&Mx%U9XBns@GK0dTO!DmUg7xsT{nt$?<%@ep9a*bLr!A zQhzF)KAD-d=7Yw!Yk|AN)!aKjx6fZO?x>x2@noe-J9XaMY1_ALAsRck#Cl;FbE%Yc zU2RlT+>3k|Ielj)@Z?~NhJqqgrG3c!s}apEAQ$i;9~NTOZpEcbDKpv_)N;k?_d~8> z4l+~=-%(mYEt})xp1_?e3+MUB$2Ko3Du45gR10cbN`rZ!`_Fmht_FnU1$o-gpP_}b|AF&1Vb zEy{{-Wu{ElouHD`O?xl0)}OYKy%fmQD+ zZjGFapWlf z&br@XU~j?6IfzNFFQBjvdyEASe0Vk~#uiA{H zLhBybBjdD6$oHoyPm3_qnc@^i+E&z*1Inq;Du2wJZ>fd418b0kZ1b3l4aBJ0*A&aO zl`IV6eQw~6i-u=WyZ4gkgMU&$qxSjtRn6x^ZDleU|B5{5G>#qQMD}!fkD@j14Zx3P z_(1PCMi&TiL8AfW0E06%`3-c5R#PpopK7CAc1xD5IrVnbrCay8E*+{r-)gNiNCOG| zCM2U+yN6M0kIIej3-M`p`-t9qtsUN?r-I!;yP8haAh0fA<8Ud!6MuUKy;f^$8bK8O zzQ1A$5>|-N)D(&v6>TFexF+J6*!6i~A7h2fBxJtZ_z z?wh2o+O(0ra8=Zd%33QCgPOTq*SU;mScdteTSW~t;yg$tm~a7@%#fRxsn(i;ZDP55 z)LlhQ61IoI#2EoG>~PUZ2%Vt+uGvKWK{_y80+bdE`Nm-I61!_B`)wON!GVM_4~&RT z5Lg{OE^f85M1Njiz|5&bm0hpXWGs{Q^WQ7)P`7p4sD(0qnmY9Bt#i27mwCzKUk_mxia*%;^ujoT-tP zXeUDWFx|GN4Vu2i9H4gF@W@P^yjhZ`qMvxnCXEW_RtM>+dU*cC8p4nNNpSO0A6@s{ zPNGb0T`erzVT0q>yRBJwwUuuzo$q&Y$9PBpwVH{*2w0gzwYd?_&LXDhDkt!ojia!V z>0dUE7=Jv!{<_Z`2e(Yfc^Uia(YMp~)U2Jg^B1jEVNcsI5dEHC;YpQ}NK`F@NmE&} z4F&>^uh(?S==Qq!TbXWkBvui^;GU9jX~)uYdR6?z27Ed$XUM$qbm~N+#dH*b|NM z_e%dvj?@%19YJzE5nmx!+8%gbVSs%4^7&Z61SB4~-!H_yq8T8>^(D3A0}snKhMdV1 zX2?@>UQ%s9d%rz`UtSCaXCy0R2}g2wSvD$1q{EgeC4|G=A@$X4BFfVm^+-vJRX+yQ zxqpY$fJ+U@fN+aPLjfgqRe<|CB{qpj^4~HhW$P!DS*7QL0n!9w*XXvQ#}0V{xTx&Ve2N9P z{HRc$Vah7UOBHPnP+j0ZjLWt9fjC#H(0}*{qNRW%u$Rq?Rp~N?#;`G2-gM(%1?YL; z_j(x@;D>}7(vjG9*kCIeH3(|?6lxPsFn&2bWkNSb_Ky|?8KQN8Kh}`>4QBTRa}FXU z67IJ#aaE754op(m_>`xhpFISd8ro^88#bC)tQi?&5vK8yH%#%C24bps+8zdh1b=lG z&W@I~xJwJkZEx9CFXbA_XL_@H+q242VR{b2_+dB3ftv*VM$0@S!K3Xfyzko zxHrke19=qxNELV#JuR+1Bd}D+4?_|~5%K%JLurG!8^1k}cC6J_#^^#hgKD$t)fK$Z z^_8c$CBLf;({|jH9OZgiWB6aEKYvtle#_2gdN&pzM@Siyep}*t&o;tu`nTQKJ@@Za z6wsEanY6Jc_uuV@>wp&C!utc&Ro`pdFc5zCUvUi?wjpWg+QCTH6j~@Nv}G(C>w}q5 zoO2>(OGc90q$B_PB-w5p*XfV-VazWUr%!kH-F-TJI>{E96fxqv#M1KO6-YEXGJt&Vp|!)w$64J1%|&XZ#ig znPYI1CSNh*LX8|Jmk4prEFOpuWEG|)8*SSoo-@_7iYfKXiaY?0;jUAe137=tM zeKzxR?Ps!*3e(_{M?`U9O@G&1o$Fj?P2Wlr)0j~4&~j+(Pe_b`%migBelmf{Dvdc? z=~AT`XPTal%4R6a-`|~`WQoaLljBc1_<_@u-xHyNFGMZAE1KBF$k9rW5-zl}rEXo- z#^*CE<}OV%}TGhuxocwH%n!-z1>XhafvkKR@|*avq| z8T!jK8Cd4~dgb~>F6&n6iRlA+J`Bs!HmK4VypqADmV3uVHT@dUd;(Q27&P&lTCBJH z2DSUyEr^EMYIY9TFLas*1K6y)>^>+ z*o=G69sIOhg21rp4ydblq@LiXt826G_aKN#BC*E7>cdWMuYVxn!x#?!Nk@t+qGKW4 zTwOxN5G*I#ntiz9!XO9(U9zHG3nF2P$iOw1Gd3}XRRe?aJ@MR553J$g@zMi`sQL|k zeWPk4yHJ2xZEkp@hP6xe#(`9Y>W}BB48V53u1u@WUMWl8-yvFC*arq$yya_MDPdbB z4Y-+2rJ7zmIe*^Bdn`4n^Lp@sFJT|u_4;$IZR zgDiLnl-YFJ2HT`26LppS?zY{vc=6y|GECmQ_nXu6uI_{=NHypPV$V)1&Uw?3Umhlz zFxZmsP!Z&Jp(+jvV|n2{O;09DZLoo!)O&ce1wCj(PlMexGKwz&eRW~oXa(pT zZXnu+{rZ?V@?2TdpBog%+Au_(`^XuLJ((gIw|1sO$^X$V7L_Apa;qB6&1*bZ&h{Zm zHn~PzYkz-mHgdue0}opw4+6Bj(opzc`)QD^{jk-{@%=KfWv4&qtifT4r zfq&(6t-N1h`m|f9rXA7_$2Hb?(ZH`!R}LAf4NR7~o-BvXCpCkd5|kO{p(sfRXZCp* zqQk#*^Wc9S+=p&2*COxQeCph)=@C`+PF0Dhy=#zGz#D2Ea?22`z{>5>m?5m!{5yhcqRx}=uDQCttO@Eblyld6gW%%1uQS(UF+U^;*$^;5Y7T9DkSnTNh+d>fT7^Y(8A@Y#v8Te zX+R~!VcCg-2Tq~mdko|mKSD}ul6jqjTQf`8|53XOJt zY}suE{L=al4Pup>U~kTMx9nvrn2Bcs3zM(4vrfAf|Iio7uGvz;C=84U3wCzE$M@|| z^HX}3?9^`1H@#Hbj@mE~ea~0;0f`{N-dCzZmnvn07HM~hN~%6=R*`WgU~OW%w!=az z{=Ft4<}*UBu0Pz6Yq-9>3HvMoqA6!#0800yiGSzvt!-Jk0@UT1;0k2u=9;G*$6+_c zNx4t>c9C{?|W zqQAi?<3F&}p{q>g>eaRq%5aLvQWbJzEHubIQyQl!Nb9GC%p>wqN(my|{Er5`UccLS zA0zkP^#kwAFnV%*bcbHTziaUJuV6Va$LS94y{_j6{lPQ3>!3QVu;+xE8G~4!TezfI zZ=!!u(|_=XzSrHUXMb#^1d!jgUfX3WB%NXnt6l{CCvWgIFzPR_F3v8tLr!!1b7P^U2w+G;${ zW~2?|ped*E4v|Ch4=jY^yusX?QKglwAWa-+ui=~9rQ2)WqJLaQBap%S!RjZM*?u|E z!B)p?ZfrN2s4n4qP9>OqsJB`%OwHj4^_NZNudjQ!w>k=RKr`UEUNvFm^u56{XZGfY zw749r1{}RXw{RI224t_)p!yV8%;kC2fOEV`5D6u3&dh?=H_!=}fXM{eMH;M7ZGH2b z&8`WoC#tdGi+>HOg`FA!VQidYbc6{`Rpo<)wXl8xwO8M7+At7) z&tKsOCV~VHTRUkgYZ0xAx~W@HyX~b^$T$aBO`OPfXwlUFeRdMSNgP6(j+YSI_v^dw z&X=!)Xc;+<2gJu5kSipoL{8;80&)7W({~sSKtz}Tntxu!!7N^!htGt3I{I=!Mxe<%!teZbkou{3R#*bk)ME?O zlIGFNXCMlhnGgNk;d(!cCegR)Rwl9}bP?tpuTe{lY?pdnRis+f7Ent((r7a^X}ihM0(m*e zn6nM0%D!o_ptY7My|bDAGYYv8g-~I*nSW@qooj$2>MJn2`KUS_ODau}bc16#S2Gw$ z7H(p=yPY4B5&%yd8)LaFY$&BySXfqXI9*VN{jyxn+qXb_|L`h2(|~g@=9_$iV=?@4 z+=YNEBQ0j6TY$DULs`c*>SQlEn_?aekXx?rbU{gQ3M<&EuJgep;RsXz7Ia$y=6@w2 z?;3#7Z0g*dnDe&VzE}czL~;oTlCBOO%9J4)BI>EE()l_$5b;p8{NMzA5bbW>W-bgK zN_A-|McYWKismq6ZFfh;Aa_U23QQ}Uu~09oKUuCjCYzSsfstD8xm~D6NtiAjS`l4T zk5)QrniRCOsC-W~aNB(gshz``N`Lv9ETpz_crCT|k^_4~E7f9Eit>uHxLJr60F?bc3hLNwN0h*sY1fVp0<_xx-y!)7tgY$*6Z0>8HDsSNyq2 zW)p*GFU~*hSZ$BuHW2>KuW(PCNTh6~cCS(eWh=U6bt_%3sO+g92tp=Iz<+lkj%;Ta zTJ3-DI0@thC%~554^{I8Vvoo3@;sBVfBHFEMXlBXynqTImQ;dyYNoak$o_YBuNBfY z$cTDCX7A(mJYN37H=g(X^^fnoYqvK_W`836Da@0#g|^I6-yv~943>5 z3PHCsp9Km;&os5BQDvO1qkn)eARRrr`(Tc?Q%{wwDBCnx&}hH?1r^?*6c^hQ_1^N( zXUka7!?zPP+_3=0Td81;f5QccvQ_EW`MSnD79QwK?SjKAz)o|lMlz-JX~Z z5tu1HOE6!VA5$M(83`6DKb;y!fldcn%^ThN6Xt9F7ZvD$l(7HlwR{%RfFQS}B$*ej zzgq+!+~$!gAe!*ulC;%2`juhIO>>dppD}C)^X^x}25Ec6@pHF5i6H2+i8ZDGeAZyl zN=H?x}Z8pi+>=k>sG%2qE2gkuK5DVv^?_%oe2o@}Qf!FH11v<~Q}tyWB4-K5zh z{c{PJpr>ZmknPz>IZpsGb7Fn{-bA(dk`H6(niz z28$ef@`3*rD_u|~K{u`4?&$sK)5rS%~s91z&dwWus((PujsfYg64fX|#OZw-K45fAr zNfTsb_F8uGb{k8@*E$iFZ9C;65|99tPV)9=*{~y`?hK)IhQVhMr%6MZ>XyLVw!U{}6u;4iB$P9*ptVU`{DZ z|I@}mn>KxB&XQ;-z3R&AsqBLeyIktD)DR($s7m@YzpMZ*EN{9oS&2 z(3ws;$pNx6Et9a$wVJ~yQcG(YZkSZk+HGASwk~Jixccn8mpCPcXJ6H1#-MII(12YH zjDE1DDSsBmP&V+n9KaeFO{O}e{%$Ws@E|YImci$P5?;U9WNTIr^F^mtvC=jv%d|Jy zPKTwXsoXc1?2s@Hg4Ze~c3sNye`+Q86A9soxOMkAmRr1!u{xO?(HEkG`$Pwo_`9f* zH*e*eZ^>YXheQl{D488-ZV_*{~PNr4JWpJBJjiq&0i*<5!L3N8)zm~hdm)|S`9)FH+^{%bn;mok3 zkV|5VVBROCVo>h%E@#iJe*le-K}*9x5QXpiEB4TXg@qv6E#iMS8x`zDI>(v!zW3(l&hNZZHJT0>^;rcrd89_pz^H zyKsABF0!k+$uPT|mw#(&(1>+ZzF?3Q5BhhqF~X3AE@BL)RM;8x|q#|NrJ7m|K03XwCYxH4wGbF z^5)HC4i3$eVeAp55`++2N11dZH#2Da+ewdUk)t(2B8*ObKK7I2Vk+fMXMb0Au(P+z z&vc5?WrgOqXn);+!u^+mo_maWi;#L6VW1%Q(;hV0LsUvY|N@6?6ltW@~41yUyR+;?DnpWVTpmXnpc2`tL zw6QM(gsCYGXblP9oge9XvM$R4k08g zRZ)Gh;~BsA=Gl`^!(vl--U=vB6%b#eViXhH6`=3l1(7Gx9CVRVAjx-=KbiGcxux{| z;NvYFz~IAeJQW#GWKzTn&^S>x|5>VE@i!?lwttR1&uAc-5oHd^7>5M5Orws<$Ujjh z_QZUr5%Tz6(iEjCw;t4pDVrkIZYFUejaWr(s(G40tRUq@iknL@T_`3ni@c19loRWK z)}&R$p@xcJ@z@}+4JNL-2CN~;oegGGS z^MHg^E$3oZm4N!dFnpyjYG_vsR_>i?=YRC_6v?E0QgmZG1$Y*Q7j7oiq0w z4Z3gZJ{j`3yrjPpf355jI&PGFzM`S7{||&=Za6aAtfk(Ow1KfR#y@&n*Ag7x;eX!y z1C>;5Yuhjo{_bBPN``I7)@|uv*vUp3QW|K}Kmz?DFp6_d#2i^W$z8kP|2`>p?7WW6 z7~9;-bI)^ka`(GjNyk}0oH7LBDUCeVk$#h)dY}Bz5o`@gvKUBopRecn@-};oR9Ahkv8~4D)sNo1vzCrJ#O= z4y%+9(@~|!W3IQX%XZx6JY4`f8;6)n=JS-tq|T`8&uy5;5ZN1PX`@}WEq^C2mZY^d zfI{E#6edis4(&Gio~bj|C*(^mSbCagI;>29PlC!6mfSGYW;U>BSS>-1ga(X3>I^NC z5v4(BZ->Pj_hFIjV);Wk4T~*_vQ73f(ABEg!IK_w-LQ7@gm|wTUZD zWZ?Rw*Xxmw{vOy_K)Sy^o_|ZJwFg0(v4#EeuHLDuHnC4XblZgPt&~@my1q7c*ZRs- z%!M#YJgPAV-#5Ox<_DYL`i+F5QCgq42|~hO4YihDarOS&VgJX6Vcs4Xg3eKpZnryl z8qbE~nX@^RTQ~?mbB+*Y!klb(b3D1itq$(ym`>50Svu7SZ2gQ(N`F9VPIH{*3)tgm zKu(Q8P#5z|<>S>TY!f#}dr{b4or40w<|$b5mDI8eMYY5Hg=x67!6zNOxO{Rq30nRc z%$AM&kHhJtKPXqNZi=1$cHGT0=>Ppef}rH!RaH;tS~+$~3+E3dj>!tbKoCUl{S|ZY zV2+vyViX~Qn7hY7n176&*f{AKW^qCMceB*-Rq?3((cUe<4V9J-#nJ~yD%9a)(H~Yx z4lH~0Rw@+rCH7713iDQKoo+LgV!Fwyl3P@P3|Ck5;p~R}%eY5%GTc&^0}uyv?Pw^O z0!ckLMI?Pg2VW3FY-}_s(MFzJq8Z!i4R>PkMCS*Zh@F^G4u3!R167VO3&JoEM)&&_ zH#jJ`Xcfd-1Qk&bC&z-+^IC&x5|Rrl;(xa)g5L5C@A0_F)SVo_kx3Vxu^q%KlD*s< zhpg90!4x$IR}kZV73)K+X7)6cLqV(W$Sn4yVU zcW{g!mcj#`y;WUn+b|S;_pi_()HWo8Eg6htS!qf`3u6Sbx4HybxsJtT$&=(Zq2#|$ zvJ=Nv;}*)8o}Bx6?mb7!x63@uJ#P(!VF@TuT2i7{dViOLntlo=9>*D|91}pR+aimL z%}i_w`8@nOB10H{8AW$I0ivnk(JxSXE=~NCkiRFMS13S9!AmE?QsUhzp-h9EoO5L$ zH&A)r>@=qgmOG^(GoO47GP>Ck$PYeisDC@Xs9M1mNTG4e4&8|0N~6W?Vzsu4bb0i~ivn%~q=D%2Ct(4Z7D!5QZ3 zAC$wapv-u@XAhZ^OZtd4pv!V+s7EkKVQng1XJs^+B3>{yse+4`QF1~Y+fpUNe1m$r z$<_%-A00~P7M_;)N^VqbOpXcG8lrJ!FS}I$?SG*O3VJ%FYVe(^8P+7Vd<9({!?2NS zj|5#vj-rMxg8Q!QhrWwyQWx9TU#)4(lA@*@gO<0EZwK)SqduBWP0mpw=;FdHXx#S? z)*iJ4);)6>dyys2x` zXQ-~{7@iJTDC9^?A{D1H6(h3zary1tsy*G1xx?5VT>aQDdmBU<cM~1*UpQ>BCa)0iZbMC#jcja42 zNCv!M70@${mEf4*z63qJJa>s?JJ2QLK$AzaOU>&{eQE&c&h>a3$Q(EdCAUuo zS$%N{G5R0;J(E)53<9ZDu9hY( z1gBit3f;usI!?kM@_*@+jx1VXC?t%Ipnmjl06}J_u*NZ7F8nB2EjI_-SiOT>DSgVi z_rv-R@lD1&2>o8fTof>n(B*Bw0PTgLg`PDO`DF65q6^w6?IzmyuaUdhAFl&*(O%hQHhU<4S0!Exqt3WYT??E?F=bU@v*H_sh^Sn6_h9#gtX-SEm>Qx5n;(0jqI9`IvFab1umoH~| zdM$nu^5X2(IXQ!~m*??>CqOh6JpPbtY#)Z6m#Yr(Z)uW%jK`FLvd^Oh<|)kIQx0m_ z4Wd|5$m-rR>wlw|Lsj$*aF9JPZWq}tmTFUf`Pe(v7H}`|1K77QCT96nZ;&rMGY@#i zz*f>b{VP?}k}*lSkYFn+$|_&`Z>fT-cpVAGz;0~wM@PVWP<@ zIAx#N%YWAks!lIUX3@pt=5Ye{3A3T~9pNO^uwe5V-R-2-?$su@IM+!(V8f<1c-cvF zh_VR>re4=tJ1yrIbntcCI4uYzPzfqHTNME?j}Vp;8{00+FR!{6ZshlDs8 zD++9m5-FC=b|@&W)KHcG*52Ct1HD#Ey<>PLT+pT4v28o)*tTsO9otTx*jC53ZQHhO zbnImEo|*5={N8`}ReM*}TI&|H%lL5~-BWvy0+Bkd&P$?HrnOsdIcnfoYN@o$mj zod)IXSSE&a=Vmjdn&~sOaasX4G%JDWV~GO*1xeZ0vjhhqcAk*Y&2kHU7B|ABrrBe! z-TfZ}vz6>1az1xnm3s*4I*t`Kf8a4bI`x02!t8}(n(J>{Ht)~z+HmPpShA4WbnK>ae z+g=o^kU7tqX-lDoaZ+xffe9;14$AZcn;PO#cNlQ@RQtD)%=6fX{N>wLlqXq1a^#dt z>6`yBBygsQGUw96AF*9F2l@Tc_2z(FYi9b*0j$!b@x9g}@b*i9b=>eBc7W!ZZPGAt zqN3ipjZu`@evbMo*K~k^A}LfDHTqw>;xRY@*t(8^LxSD& zGBTQ~kOOyiS1caDgYC>8h~|wiof?0lIn+N1`Pgjzjw9tOyK6c)(3(-med^+}EVwsE zRd+8b{V5GT(wDWW50|JeABJtRe9hmAS#KlO2nH9{S^QP%KV~Y9|IAdie*O}EZ?zfd zzb{=tC?w{txiGACE`?Ds8(Ese#|s6OY&MC%yM?8eb(;YR!wBIt_|s_3BjJ#ZrTb5{GIUwXW)w|Ap*xaiBrUyS&<_QANLOf9sf|}c6wmC|B(fy zL*eU?rKg9+ACN+iGVML_<|)l@Wjeqq5jlUsxfZa2cB?mmHLnd52RvLULXg8a=Y)8I zO92v2Ul0I9JzyC7+!E~py`9++4EJ?^MR5}1`l?W+(Fc+!x13I{JiVkD_0rb;PTK*v zcwgV2$;??_tYI+a2E%L&;ly!Goi_Q;5N*&m&@FdUZq87GS_vkT%@A;(5RuU@l11?3 z&{J36KR)tAC1ZN1lfT0M8j>%$j{`81Z_%(I$J78(3oj_gPbue*rD#o(k@nG0oWCTP zy$#JPN_S0~%2TVfL@3QFTHn3@h9APj?$$v!N|J(<&&`SE3pUaHZD3#ow(8r})7|Jo zBqk4>Ed|NH->MAf&>jxRuh6lM@*zn{W8h#S=LtW+_RN`PRlT4h)*Pgv0cFYw4Itry zYT5v(O7)O%^;A{*GAsL$m5e95k|WrfNO?$7dXIA8|ycI_LSD}W$GXPjb3 z7Un}k2F9GZdfvD)CT+jE?mHE)ca$V@_tGDlw0%=AVg4a-nNmWk8vEIL7QuG@hA}_5 zL&8(HEt*_*-TP4fVwtrn-uA78fk|GQW9I^}$yRP}$ZJ|imvMn_n{$zw@9_}_rd(8E z8!A|p)+qmV9GW0Xl9R$0FJN!BE8pA5iylb0IX4d>19{@W@-E9tPO0dk8Hr~PQ00 zOKu)FF3c^jS+aed-N)U}`Lm;4!7e87rHhcof+hUA}&%kAcv4p|MHM zca0&Z9Z8wOkV)&AP*dU3H38P|fL&z5m>~%o2QN)VYAuqBb(IE~uSts%vt(C+8 zQ(tt3dmV4PJ&)G|leP)E#wdXJqmQ*Mk>=StDh>AO&kH!BhZ4%JYO$VSY-u^Tf$lS3 zWz@J$2l@sfPT~DQ3sH#A*}M$6)o#RVT*;e{kI!%2THUzXiYbi`gaHG&x9b)Ts1S-g ztpt9G6PAz-k*xio1ps5q8l1Y(Gq3H$vNFV-qfn&H0WC_0=EB z!W;X~npZ4L8HgH?SKy`}gVMg(e=Ez>#5e{>p_(=+RS6DVy>;P;aaPHS?0ra1(_hb* zx;xzh3b8+G_(zy#fP*7wlXu-(mWS(c+F!h!?pO?m0!C5(2haeLWJqsT#S6@%wT-9T zzD`J!%U8(6ST4`Sd#A6%cYgfuk7@qlgPiR)5;kFdu*^1$%&CC3_Yw@t57HN=)O<`9 zY%StRmIkI>sJ$wRcnpN|WmcGO%gQY+Y?U-?-5?!H#pL@ofGL&cJ!c}cZx?=!{BVyh zpc{8f#TbOGu6FFMJ9|#}4w2so6KCd0m6hw-ytAaAUNEf1s*J(0rtOB3uKr~27kehP z#q!8L6C&xzP&;Tkiqpl^Y*y$;UA>$KBNAq45@ZKA<6ru9*Nzy|%&PFn-^Z|NDC z&VZ6x>{{MbfDb-3$e6xf_@9?}D7%dn!9VB>^q^D-lzZo62#=`Y!f9mg2RY!g^vkh^ zyCvank1Iou1b@~4CT85e*b1$=!I;_aXc1>P&YcTM$NMvRS@6OlLn6`e2Jhl0#mqiT zthFH=QiFg@)g%kxxk}J3%x0o#(A%e*ts5Jip{=V=0{}uw&)>wyti3yA1vX<6^OGOx zmPn)9wTDng>bf5=`z9dK-nuj}(ApqT_N;6f>yT3pGoyvHNa;W~0*r(DU-*-n}f|CO1S4VQ?Y7GllAhqiJLBFBpJCorQyFZxqzJaF4CS0*-u zqp?4cX5%1j_O1Ucq2ZVT>E~9!q37@^YK(&k;4?3Q^$Mbpe7hI?#T>?}ksqqC`0t-g zXcetm!&mDv_szfh0hpaLgf8xX%=VV zfWtpT2vf27k=Z@DiqHdVW0F(4yOJ4~szaBk>^O3`BuiD)uz%ADn=gL3Zngp#RFDS^ z#9e=gg!(?Mt}<%@w!ehKmwmazIE(68t-Gq$H&~Vum9CBh#T9SALLoQ;)Ov*D9U~8P zylO+6Z27F`HKbLQ%~f2di*#i71(GjS0PQmEJ<|3{AiL<``CO4UmSlAmtLp3iof@HomZv2dF6q55}h5;vMZ|Y4#?clE!rWMC!>O89t@5 zG4@b~3Uaqk!=p$JQW{f{dC5`;`y$(Bns{_k^-2+VAywetc1=rBJ9B-8mb%IZ++A`K zpM@8UDRu21Y9y-fN{s;wTJbLmz(5K-=Kf$`itfIlMi=Xr9w=tH$eIqB(m_$(+*{9$ z0=sn5;izWh6n)C5)919RI{O;AQ)XDuPXX*#g2FCOUN;fZ1Ds9aq8Eyo3QEkL%azzY zzHxWM4b;$edtm9sMb_xQ!JsE9{8)Chr;Xa5z9EriQv!NQkdT;1<`QxN8$r^vqcnh5 zL!5+3d(@gbQ%?Q}3n4XQ>7s<8DUIlV6dpp?5(!w*CAD9L;YlJd6S7YsicPSK#XQ*b zBd1RoHDXMgC}qB=e&-+PZ+gOnxHuWn8Qi5^b~K>j?Do{`$%UUDQUSfL*jUzUDAK1UH#5fl=NSt(O4s6C$t=>LYxUXTymt4#%j zXZ$@-GtPc(vlKpB^Ij!#{&at10d4AJ=;SS%BecUYJALo(yn$nLPC*jnd(b&l;uG~p z?1OKc9X$-#vLyP|e?$4pwiruWd)o69c?*>t-CpVv+pZv&CxhbH-#~h#l1vP-2uxUp zVrbg!pa6qw}o)nk%tT{ z%MmMx@MhCcV$M`&u;#|&bIhLdiw8Fya04pzc6e zyE?<=2|jLUbl@e0xwFq;CwsW{Pn#JIYCOkm`1oHAq+2u6pWLtjmMGZi+|*$8IQVK40PINNR694<2U(TYx%C*c`l?ua zgnR%hhqKk>6mrSTNpi78%Ym668Ccp$j>>@|DR46sT_wNXHm8ZuMhdGu2snPbi20_a zxa?R9on`^rOIZc4bH1Fb>;)V8VwktGg(|)49-&EP!*WC5zt#-4&j9N(iH$O8J;g#< z3N{!}$kK@5!g#SHp;y1I`n(TA^u4Xg>3AhVXKVgQ?8S1DnbyF}jhTGU6rpsOfEBdL zMbetl?h@|$Qoj(3N$W5qXELbgVltMr4 z!QJLTsL=dP@$l+a!&8&?7TE-=c0>rol&Kr=MzTB6KH8|I?5SuOJZ|HU(==ul%Z7+g zx0o~9rJ{AxwJxjXJN|0+(@0x#-@G^>nVX8><_M^lkI^qj>Vaz~HnzdR!j zuS)Do4i-9DQO=brCrmc&e!UNvmwpB;?UbGGv=U^eWWa1lKMfkLo?gnm@tKXq`s#Gw!)iAa(&p!eg@Z4bvYP+cbo2j#1#uh=sW&1Z*PqA{} zyDfB$E#nGtF(xpeIz-Q^qq&dsnuySt9OCZ;3u1vI16I^xDmU{?E5N>aCy5QkD(5MLY(PoW&3NT@5I>s; zTnT;ng`kHAu8dEzB=c`q<6r7jpq-)RzXsG68X?X*o&rRp0T>*}BG|tTut&J!x)dP| zI14_`7xt2Mxd_o7-%d?>|gciqvDe)RI8=2YK9r!xndlNkS|;^fvXfgoLqCe6#dka64Y=p%Mz6v>NG8b=as|9X_FKj=uf z0cyoeJO(pn{SYGt5$GI6Iq{_0OU8jfYqu4b|yz74u5&L~AOm?wJ`3vc8zIhKGt zFS3|}f14bZ&+HYz`dDabUP1OtvL5`KS}?=^o0!r!K1qrBCm^kV(SAM*ayZMgG>tu+ z>%Dq?8F!r}Q`)WTn!AE+gtnsT+~Jgw@izqC1Mvo(vafYvBWvyR>%U?i%aefcy`Y2r zBnMJo+7J&x22XQ7=^RwZui{^!iT!0j!jZ$S(}F%+iMecmp)nIc4S=W*0JGDU9M%um@$8JSu~ws!#p#E5dC(&uw(H_?HWr z!~AzPL%Kj3MeXfsI@B0Vi$t#yrbduXAo`PGURn6%hNNgpa4rKvQ5Ir6;INgo|Bf3{ zlc_mq=5!1IcmJ0~2(PlD6%KgClpg`h^R2{*?+I7Jmxjd&( zp=9bb=|l{L!f$D~ZEi{KNWCLqNFd<6j$BPAaJfp&3XFPnD>&EvTXLZ{6zcN5iO)fr zLWyQvhFxE2{@XB8Qg}KT{26gxsSy#w{6~fa0#gh?LFB5-8Q1v>QLazo)AL24h%=_0 zR3Yhb^9kOhX7itL{J;BMm5NMy+Srs>%v8!XtkPWxds=Lfroezvi+wps57v0Mb3zK5 zKvUUxaYt5{)#3HQ<7U>=0cn?+DfjGO`sjkI)-Yi|+yY8XTibJ?zN z%Z>#?&HIj6pxjM8z=AK)M89E`;Dx0ZiLOkANs|-R-$N3A7Y*DnXjfrjbofe-!2I7_ zE>2}(f7`3EX@#wsB*SKU)YK=XGp6`JP#Swindrd%MR{4b$^hYp92_@u))hh2!AiFKgBG} zEb|tF%o}!G>xn-*n_SZwOx~Ht6CWu!*uW49)j@2^<)Lc}y@h#%!RM zgwv^r{1u=BWE4u52A69FekUYzS$d{+FWw{iXcP8_?G!6nxHlW6Lw&FgBz2TIpYw~ ze+%OQs{(8i1Y-z&N2*!B2+n@mqQe~`DH4((U~T{q2uSGIyt>h7M{zo4SM*aS=2o&X5zaU+sOB{9{YmS(vGw}tNRTIqA>Tj3{*cvh z*4eHdH$C`(f{l0G#?Lo*2%y%JYJPzb2r>qe{Mtj6&&2@kxe&(%qluHucsT`B)<;!I zSWo^PtGk`XB{Nf|;*$#!i3%Gn0T&f9t(F)bjiqMB?3h*!;L{*YC)o7jtQrRk5jy)z zkFL$P-0i;P^*R<`e#tp(x0+H-*CK0|kw0;!VB}2durqDt()W5iwG_%9{@8$^T1g-f za*VV_e042o>QF($fN}O7c~0%3SYnE(@id~210M{1q7*X&8ea(VFRIY1sGHe(^yp?Cxfo1-f8tIsP&69uz}QhuWgEE?Dms+6(@V;^v@f#`MV z>VI$vdZL)BhC>UCaAL9l#2f?IWo?cM;s3plUiqzl>xX^%hQWD6EbCOYH%_X-@xofq z*IW4T;tcAXCFf$PV%s&Qt4K?QMc(cdwp6u6gj6 z*@DN?Ny*}JwsIg=_wv}j_#A8Dx?9LAOE#@Z73!?Pdi8}yvhTRD15?#@6%Pw zDzodzJ7Nq^h$Z}o)c@opDmKA7t7?cSy+~N-55}63D~b4zvOz3r&(iS|g+D|EU(MS7UrINv;Ge{l6P0e@Q(ND9Qp?zAMg7d=opBYU%8 ze@{}!6fG6U58nSfhn(|Xa3o{TE?$z#FN~R`@;`!ujxPQvlF>%WJ6jUHG24 zg*n$=2Pjzx)K$Q}{dgPCu z+8jcg3v+7yCkhdbi|xD*zt|Ak8XJkWoS6DQGQt_wBYKlzGhkHOWG)`h6F$`}RiwL2b%wV6QW zBs>v~8IUGNGmK|(T<;yKl{WSV;FKpbh1g>DN@kghMddRQ7we{lr$@a*pJ^ReXq!JF z-Kzug{+D|~N~6!X@|R^35^|&&$SAo>-eFL7nHDwHB9HQXIrJ$)==$CtCrTgO;OA9B zsvu*uThqprkB3Aesj)q&WU|!Y2a(10fOTdqA${G^Q$FIaTc|CDAow60K!l)CN2xT% zu+1Y;oh5mDof{Q@_-z@EtFbLRd-#QF3;T!dY0F8!g2%MawmI&IF~K>(rD|f;D%W{! znv=SGVRXGRMJUB^U2SNIlkDhNI`3Ztd1Uxmbak4(k{sAp6Ja_awRyNvH42`_H^H$J zgn#hlXO0MQn7~wIBZp$)fH@f8kZS#uLhc_{+OQtZThvL>s?TdWQ}s#i15I#K0Dks1 zw!gyIp?u8=ZM*j@MOUqO%oxslip&vj)y3I{&&&;yJ0eiR-09e8`gRN6k;Gy{p12nxz5v&a!*`aUl6=) z$tuZOk%2kTfp8CWK6`nwHngD``IpDR6Wv`l?sN8NJ}fi{(nQhBX_p}$yXDCY+@3MS;ONG#zSK$D}2c5Xpim z_kyYwVoZ%c>FAE_e8`eF$t@n}yzjYG0DwQ+IThyph(b_X>RW%cC9U^rIm!7~sMo7y z99aMmTgc&OR5>JZ{v_4Hyfk&45t45FVr%;VWW>Gf{Wiw>KnIX&41%iTW3&PhaVOsNXl%@)Djz_7!4Ub+Dvo{M#!$rLnHFqHyu z^`Yp&?6}l@) z!D0nRdnMYXQvXQA1|<(>V<6z)qQ|FLxZODP07vTd!a>N#IfV<@h3%~LgdJB?w|OSn ztY0-5*Ob-fx=@jcuRdiOO1mds_DujtS>_hag;zP_gyd4^=C7_(MpEqFgc^Wuxx!IP z=haF1VVKkN{2I!$qFiKS)t3F+S0PKLL}Y^F<|320SBv%6(pN(dNw>gKPzhr-hG#qETVX+tLz?7dJHXx z=zSNv9+TeFqc$e{bus@_bJiLU8p{-IC72u@-kxR zsiQ+yF%pvN2RQ${osl*{-O(J?^!sg{sPHfgwfhbyQYA{9bD>G7zDc0eRFE~VgV9bX z(*y%0-q4kAlYuvawqfiwn65yzj)WShv04!O7d+X@m-zZvsZvufk(gqnaWc<#`U zQCsEc(a85j8;mzhShFThnzjPoXWB@MnB!$rnvA!d`;#hb4!X(g2G(e8_Cd*8y3&e^ zSnA;nvUnDA0pSY5Tp!-Y9{Z)vEWOmf>Ww!uYPaw=AtxRM;MMQS*CpveM9J+agr~eM z1%Tx{4L_vEqgQOx4%)1}`@OdBjO~;{Kd)t-Gp8tn2nSJClf?Z5l&ti>tNuz&D*|nE z2w(CkaxPI<>f30G@^i!9@3Tr1J6v#GE7Vy) zV03}*1x1m-&L=(&{>wa4w4t3H31M&^JM*b)wwNR|deP{8+=lM=(5Kh~j0aIoldAU5 z7z5RJrsf|hc>+{y1`#I0fyOwj$Wzaw&%}!2+i9_of4_AjvGFiNHq&X*xyZjpM+o=*>OZh2YIX z5j#2&!=aKpzrchDN)Wb8xHo|q&;5qPBrjr#qu1{SO{4R25*+dO+X7v zg%2DEHc4qGQKAq@+P2K++#%aHrOaS8M%o-A4<0og!w1O+O|%fD(v6f@9V+2$$1(M6 znOIooT!>)j0b4fDjl7+@t?qqs_A4}k8$!kP z>o1d835`6xHm#217G9FI#J34{a({x6+GEl5x zUYu%0_V(}SsL}^26h+WwJept6F~SBb6k`?=6^{)4?I&gg@`eBM|w5r|g_Ahpa-;T%0c*a8Ul{=+qnK@mu7F!I$m z-gzOG~K8D%(-2$=K~)$gp_Rs@1QMVWg;GUbH_=<@D{+lc^IMj;$=l0lIDy z%#i9)gsTPxh!bF-ilJZ-NJs{&Tv$O!_6CoAh#-_VSt?63=}#HHk5_>h3kf1Tkh$fj z5@bS0Q6%(_Lf~!AfS@)2@1t1_+~xSu=rhBv$Fh{f(xuX~`y?|T-ptu!oIs%Wq2D!K zmGYWWa@iwW#`;JkzVy^(>`5=#pe9XaC4tJyG&?38$pi4SdJc@yo={}G55%rGmQj!5 z5g9IKyssGkFw1p5NUKg##CSwP2d4K?LUyEaHXJcoFN{GdNtG(~%j01_X>r?LyUOB& zvuo{dj1_w5W)+2?z>Zv^=68~9GoU(WdxOc4%QCwdF!MPWJ>6rN|HM zS3-R{zXaeQb@4nYK+<6gYlm@*G$GGsrXRr0qsJ4Z~*Yvb3Ec8APucn1yzTGhjATnpSw!#iv8Eqrbf@Anj`e*q8{7df;=^0l55v}wftpq z;_z-<_}ur{Ob|R`=#ks<;qu3IN&xC6+q@>A=l>Aw!F~w#Ue>Ye&_-x|i9%grBSMlZ zHn5G75^M%P1bej|m+i@~(;WO=Kp#tKZ>lI%NMZ7r6HnzGbR{;Yr)bm_XSD7-#WS%M z#zq1(9h-?$9d9D0S;o4>R30#c8plJVGS0*bspXzqj8SE`gG}JyH`cb_z4tk|@G8YS zb)IS3EAa@;2wpkjqRNjeU`peENXGw!3A88)Z5S*p)yaR;GTf2@%v&HL%2~Q>3OHR& zxCK~lcg!d(4!qGYA{KcB6su!reqiBNe+l?8?t@KadxzjbR89gssxiaufjU2n=IX-^ zK=e82a_2mDV*}Tqd>poFAa)S8Ksa7pIXVfI?SsX~{v}MC_G+b|*$1A&lPTMwGf=!$ zNQ1(l0o!5GpP&W;wC-?LQyt}lLZts>4>;`|oQls3)E;&-_I4e9Vx+!#L%@s=O78B3 zGcKb2?t8s+8|kz4!xLoJ1wioh2DtqmzMFDfx*W0qc{A zgBucTDkD#VuY8M~RDd(Ht`Lu+94ci4YI{e^5?GU#vR}=U?=_gG41%SOz`w%s@MeaR zos6;UtcT0r3SfNFVS$qf3Kt_$Z>}-$r#}C|C3dMQs}yt%K)PDoUU~Oj-4Sotp)Zp@ z#-cSKp)p?r>>d{fHxInTgNbupO)e}a?u;r_k95murH)kgUg;KqU7}UZ>-HLVlV7Nq zRy?&ds!6F@8_^nA3U{IWRi7<@RJAI|E;7!W8k=;$>ubEC-s+dnRUZ9t9yFFLaBpMu z*%THw4b}a_a^HG`AH3%+Zznn z+TxRn?-Bvkz&PuA=eNbk%+WS2NKg#Z;$`CSl#+b2<>}|yX5arxsnC^uOsDr_DUQ$9 zQfx3sj1-;+=roX9Xt+TuB`WOatLWA6%_u-d3OS6|aGop_>5^~eu#j@=%>q0O3aD_Lv z#_{BVvSM9?zapu9TM*qhwf4M5*v8;*k;?V>jNuG{+^T_2yxUBJu>a6CSj2y8gQS5c z?~0jD1i*7-dhGLH5}*hj5DlqQJK;;2W3?Cp!0a15*01mo=-vx51ixKp=?@iTf8Xpx zu+gP)OiYMzxkoK192jiT`W6WJ^nV!(AnPZ!z8q0FFqn z7J8MPpz9&^G5D3^Di3bvI>b9hr_&&#vOIDSQ>Js56ZnR+!kHN5bl^3TAh(L9Ot<*} zkab)_NWqga$s#?-0x4OFG9|KF1gcrKZh`pLH=Xm)1UU-}~pea59BdB=uOFlr_~ncSJUxE$sE zJQkDq+hPP#hF+|sV<)HMenkGU{HYUwt09UMR>R_0%)GUjTfGflM{x>Ln$ASHw#Y*x z>p`1?<;DJCKNiB^4M^LL08TwtD%3a81TI#tx>&uB0#?GD<3*xlijc@?h1sFDPJ9p0 z&I5v(KqOe6v;ZnAkB8A6%w8%%O|!E01(qw-q9q&h)^R{w|ACr$S)Y?E3CshOlZtr{ zR}Gp3NkEo;4uofW!pH;5VII~@H65Ct<4k0rH()NfRW$aBJsPuJigyIy&LFXO%5cqPk%9* zR=g8YT!nfmdoOv#_&kpHeosUKwNVg|DCpvEfY4_H(y?&rUDmVWvBtNrz`U$weNPn-d zODfk}N(obGbo3_>+GrJzl46Xetf&3`Is`%oe1>{wTWP^6ih;$Ys1Qf1l%jKvR;<`4 z|9Jp1mLnnD%XLphZ?O786}6+=))m9BzkOoDtOq4dc0}L2U4s>2P@rOGt%?&!2uMZ@ zhmH?c941R8Lv$cVtE0Hy`uAmu3hxcTT`%Z%3X2)`HJAT!5{$X<$>Yx0aWU9eb|0_- zh)2C}@nU(tO;0x;yT}(^KEl0jI+nZK7Q6|1CVevSWeISM)&ReD%^wiw-n}kxuC1Z+y<*5GHN8Ga*!P`evTH#PJ%4h~oIb_GQ`lY8XsF~R}eP4a4 z#af10o>H&`4L?!aL?i^)RDGHRRmJ#uvDKv}{(KN#lOxcu(+>Gtu@{PG>E-lt`wBGO za@zT+{25dbhfy|Ux|m0AH_#RvP^n9yBU?bbwZ|GBtRj&y0|AkN*f2dzKC7f{2>?otv-<%wBM$G}lwkJ%gQxj` zIWx&4#{vt6>f+>hdK$hLc#hd>o9(~Z-o`q&K%dG8&N9nRJ8|>Lm_!~10HZopBhtuH zAs^0B32s%b!6$nAbL|25;S|B}!@b`sg?S#7Q(~{0vu;6fiV7;yY?W}pDz=g24;s=e zQHXEP>JJj=#BVHMx5N$<#~(T|l$gW)X<$piUZVg}mOP&!0qXZgiXus7oV?BTD+<&_L@fDVq!oI61OXp&I3? zEk_-`^7cj{q<#hnaN!M^gsJuIkX8#+Y*h<*w93GG!un0{Fj@bg$o>A>6QE>fT{P5R zStIJ(q6{P>mM(sXPpS0;93~&XjqYijk1=~s-=}#z5M$TI`(V~ArC{s`G74hnxAESAK}AKyf9%`1wBWFIryCGdWu z#1GBneJ;jCsF@rq+ld+gm1?tueJx<$82K=xfXGnX+xya0yL7(Wo1#V-!uK5D68;Vo zM}L>??pHSXyN`>W7i#Q?3Xp4@wWRq8+@x$3xgdc0nXM0SpiCxRHC(DDjMlW+x&~<{ zb{;|y6Xt4@1Yb{Mh+P+b-^n6nV;Qo=7T&P{g|k zMOJ;8N5IXlR7i#r4YQlHG`tI6Rd};}InIQ4czNS#Kf+R)0*y5#o>3HAk=aQV-Q^G? zG7eb@^@{+IH=FrO!z4jG?v2F|6y=txu+(ICVN|I0FJK*TY!R|*jpjx&$}>f&P-3lU z?rMli`I|V6)n7)?&bewgpcdT^0Ch+;XfQ#m*ca_Nda{18bi`5|yrK%(2OD!9m{o{a zB-zgL#93#V2c7142=Ag=P9rWB(fFfg$Fhgi?h{z15rhj;=dvV zV}lRS1;{%$ITH;%Q;5{vD~l0`Jd%`Z>+Nkvau?X-ijz>y`F8OFZ!{;AMjv(v^7k#z z$Y3lTF6H&aVz&jpa$|VuV!)YU4X}7S?4G{Zo)Bw-2-^4fc*u3P%Z|B6;Iz2)4`)eh zn_YYW52^qECR^o_;(0Al5U8rgFo2H*3M^5?Ac$b{#b$HJV2pK%wb1*G&Pjo6Mx!ir z7>{*XqSy5!?@4xh&5p?ZsDrlwkg9;r&(_$~8lQMJ&@8K)#2k_F#QfHg_ z>EmGu#ud7RUf;dN2zt_-Nw7*QS>DfNXK22Rk{eBd*ss6mgkM{nW7n`FI{(S++c>>X&G5-F&)$n}JK|{Wk`S zfrCKwB=l=(@>KFshbZzQDu8TVUwu1FuJ66N2s6-NzQ((fWGFc8DT@+=g^&YGE3xtc zHR~S(bg!!>N{ubVwNawP3$yva5G+t*F8rQXlxBjrCa>Z zQ!2ox#+)WL86?)O6%XJjhMw?_Q)w8}Ujo`Qnl!XCZRJ)v&)w2ceiP4Nxtht+n1UC| zFdyIr9uIeBjox7`w!TTPLNW{qw56)x7DlneJ)1sVJ12<8U&sVlz$6crxq%$k|YvpI>5s&3q(r4SbpEhh$A^{>ICy^s)P(&qJlC=l+mP z?oG_w5OXH53(M(%H(K57(yP(^Wmi;DWO@v}kDcs<2ayKYCGA-=<5_DZ7yfR-GZkM( zN`ziFX4tfJvjBiZ)a>k|r}`Yab}v0>>x@L34KP98|cj{UR9cwiGBv(HrbDl7jU6bqe!WY~b^xq&SL$fR*!(>B)`D ze%fCTGHRm3nhE9-S{~qX8y<>*$|NPZVRgKRbrYU91R{}+s)}Pr^_DTV2FM4xPIp>P zl|WG_F$0U44W;3_oZ${{{gm30039FeKAu0BW>QTgkbuVGP|2U zvRX4j#UxXd-MdbJ@s@`cNondF@Y`54?H-guE@?;vQi;`YJWYk6Cw=6v8@sGIT`-xo zWKEh-d^!zox>tfxk}2nKky>4z;%JgL6sdGPV=|YvnC+PM2foje@ z{V|`WWU#37t4v+xkp7O%^0(XyErnh>V?rQhWRk%_G*VNRhDI_Xo<{sBK#kgHhd`k` zincp%u`OY$_;~^39@8y5Ovoxsuy@vzi^7s~ZGFq_z&{^*{atOBXpmdUmMNqs5oBPK za5<~hWhgs_iQ>)tGu5ooDvqPtOWC{}cqL=b>a8y4vWExrQ_)T1!nVDaPq=CF(7hQQ zO1T9KS0V8Wdzs!AVU^4n;BOoL)(gJ~QmI!NEeJ}KIe;>QtS-V04Xd~apG#4!3?}JIenjq!XI?z3~kr12b|GxA=u*e=H;bR9%OZ7 zcRI-pz4y&f#OxEACvBB;deqnAHMSm>UAV5$yE$2^yI;i=Wk!w!pbIGF7X?DV3Q1tY*9!WZk5vNS@JlG===r`J~4sUv!4S$9dWZ{l$HWr>hNyWgnkN zr3A3_W_aDd|529#U{xCbn-_Mi-)BfC0umF?ipM}I9Wg2U*Fe&8^_pUW0W;k(Xg)ze z$zv`3yPJekJ4uA~Tn$h+>9x1zgb+*d{l(WY)5t3q6CS(MF8E)T%Ud_b-@ zVIoP&TQceHnqUVM$|rU6zFpz*8j1IG!_*{%DWa7~0^GA~*<>;wJll+akE1k1gdrY! zpbcf_ynuQT-yBFR8M90!zG-z%xwo6TJ}w#9rcR4ocaH=uWTGTT+%)Der8$v}P@WL3 zrQHOsCs1?80Gb`zGsg={haUsyZ~F(EEqq;X_m0;NBpSmKK30hKDVY!X97MQ4?1dsIGWZJLkanHe-_fClqm<{OC1 zl>t7$bR(-C7lI2(squqWV#mdi4}2rLM_N7$b$kx&c!d>V=WEV@Fu4^{5 z9Y5I&TEvi`46S1&$pQHK?zv*%EYAHsyipbZ~2H_qt+H z*}bA+ z32dq19t^E&s1gL_YFN3hu~7mF|BNmo-Ebtz;6`xHQQ&wKOywf6jw>g>=)_WI;&cEP zfrzI>p}y2VbT_btsI`M)gV4P(aq#AF^frQ6LUZe4>tl%C!b;fyFTS@4z`QwZV)GH_GJ2iNFVDB!09GVNXE>z zj{R!g(gXt@7yWp-&jDtSG2t>TxD0Izw=W&T*5*;~1?^p+;?JC*uzY#I!9h^z00Z9@ zR3O-P#N7?5XT6G34Itl;*LH9S=NC_m=GwfNip!a?KBAiY_Pl9PnISWgQYK|(2K7Vj z+gn4Gh0y__hl3a*`?W`LD{@o#A=S$FE4A6f=(f3i(joN?9kklL2AkvDbU zIuiEye_jP~+Y60>Z>pyQI6)J^Xe_}IuJ@tJ6h z0sm`&XUOuY?at9l?_aG{TW`}a6n@XIu&SaY(y9R)5=z^l!3sm#*fd&!)Krmwo1UZw z$Bt~L+ocrekw9#i6ycRjQ&3&UDf9u=*I=P^cn7-RMt_i; zI>ZX7U$RCcLF)J~E6~i>{L} zK{-Jyv?iaJxh$sVLP$exTV2Z|EXz4$AdDvAftG|D`CbX&Ys{0{QpM;xSdTz=LQLyObRAJ~k9X*%#9V0O(3*fHr zZ@MQ^0gdOx+at4chQtSdI;J_y2H3l>Vj2@s2i2qvPwx6#x+)ozwBw5f^X2rfJ=v*Xs=j--k{^kl08IV?|Xa9oAYlWhP1Ap=I++7hKug5>x;@&WB1;IU4!cwpd`pY$u^2mz8A5D`gfs--_mMiQM zu~u43=QpjBT}#7%FcgOG`zy}Hper~*ry!e7a43qKg6_`A$g;C8m?kAT87s2?ZrV;N z&Ot5=ltOskkDRoZ*ZC@sq6Kov3_{zI5u9dJl76IEhBjv$VRrAbxl3>KhV#?z z#ToBn_xx=7pq9uoB4-2WF_uyG`#ofmJIP3YdxND=OoDG@ExfucW2U$h z5^H}DSuQa{MHZ%kou(t9aO{YcdlR%IRQiI}NwPH%eMaC{Zp4}q2KXLq53OwfK$W+f zOTl63ROJA(8Q02>+i`0DZ(dU6)h8-fi&nyR274S_9W1;3vvP{$$5qbKwiD<9Glmtv z!VHo#3f|&>i6$m{5X14o0-b?(thn-S{Dls+Q`An5Adda>D5S(ifJF^9;#*_12~t*M zBYZ6su?EvL5}>{zK$p!8@{%KBOveVmq>t zK52rXUSpWt)8+s7(;$BT{^qvP7qwNy?}rL9_RXj8k# zNXVE=u;$p2ea(s{{(W{5Lr4ieKF%f;N`A-v!d7$sJo#@R5>j>0d{Ukd&e)@R~Wy{8YD zi!F}-e}Y13Ecu-eg~b+XY_%8*?nu5Jh)hOGo?DN|@*+{Gw_essoYb11O;!BQy zyKnQV510mLqI<1!CxpM0IhX)LbY12p?<$y(Pvkn-3KNSZ)=x0VW#(>UE6`NI_Eyw= zR?E~{Rg;UW4Dh)bj+32)d_m%N@n}S(6(VWi`=J4?mSt#Hzlqvm_#JNcy(=ybD?Rn- z#RvXM`hl!YK7?^F)al13u-&6Cq35%IcS?5iSMHz_$EDwLQ5$-DWH!-X%~nls8Zi*P z@2~IyDIg_>HmMXPO(K<2C24^OQuPobu@|>ok&d&P_@gC*#X({*X<-sAtAL9v&Zmu|t0N z>1cE%C!B#$a`Zz@r(B;#QD$mLcezz%itjc}Se8&wNbn~7fSW7<(^g4>H}&BePzm{0 z=b5w29(%Hy6hp|BO)}|D$ZwT z+NqXv%IC~}8ZZ;);C#&(a<(xY0j#XlqN*bufJzowOl9PkmGPf)z{0bCRcV?nazd!q zbWwIHra+PRZqH!hnmuxMj=w;?XY5I4jC%HlCfa+%H#8^HkP`p1v=&12@A;q z4lGB*iZY6Mw~j^aKz@U9_p9Ox`4C*peC)gChUO28t@P+&s}_M*8SG46q@tSLx8;u1 zzD=u%UBB!e5sR)S4!X(g$R4y;wGNz{KJTG|@(8{lclS6;->$xY_cG0@wdb9>qjP!Z zR#4xsUKPzD(~{hcf(5DRUI2VhE4HHoyL`0)gzrmeo_k(MgO^O$`0}{kR(hcR82bPP zc23Y0%4VdwMna84MOmiBOxc$$Kgr*={9g|jY9H%YbgO~nMcnvMT1@Sl zI8>Qt+)jl}$bK$=X=PRejK|xNT`%|oEOdSo3BRE*+orLQdu=dK4K_L3&`uEdRhLLN z+hQ@9IMnt{3m5Q{6I}JMxN!~m36tX*>z)JQ?44Vc16P=)xgjnRzM?f)%htElU*c>_ zGx#4Yya^4mMh2C8o0udDBo){g{NKknJ2FMt>YDnCVcwDVJkK4Eq<{UbSv5hBLsnu2DB^;V zOf1Bv0e<;5z6feu0dH^yXmQAxLZ%e^H(6W>k%EnG_1+Int zx>`fls$sL($R*~&2Fqy81)5#Y7FTyS4yidVAmt4swJ02u)O*380WA8466%YfAT=(L z%ns-19@gSdQi2g$YXue5f}?a~a?%@8gW{{k?tu$`QZKD|#v%AOK=LE8K4SqR)*VU# zny_9{x+_0XTB1n~a`C@`JyA}?#^*una`S;c1B3il7skLM9b@}clI%sv#X{$XwV8-s zlTYI1koa*YF4kCMHEOHRM63w^;k_FKT@DG^nRJLiP4Vg4nc#p^GrT&xF?P<5;#;ro zOAxYurc}Z4C`MD$2wc`28q8!W=SF@mS5FIE@-BdqF4g$MqcisKsIVA#GT5$;Wx!}a zP3?EZGu%M#?01PVL7}yUNgrAKI??Y*1^Hd;wi^>(8jlT!HX6`;w zVOREImu6(`Uxd8xIfyw7eTy&&LFcl^Nw;-%x$4e^Cg6}s)FCYoP&8Qq&P(Yz zV^EN_?e*Vz@J{U%w+*VvZjT#DSl} zXk%YDC2-i3NJ%5 zARj|7?I>2qNccFGc6aYez-YIBN4y4(yb#gEaJE?=)NM!Fkt~nV8K0iz%H`pI_EG*& z(wV0CJ$jos%j*KWV`Qn`gX$4D!(ye5(<5$kfth;Ynf>Q=wbFc&ul#+%p479y9d@Pk zjLQ~ID$!4Wy8o9Ta^vmS)`{OQ?QD0ubcjq(QofyyBm>yL8@e(7XX7;-;}^BI!GE<> zT~FIE6n)RH@G7Jx(vob0NfS+fJE@Ebq_R!WmuZZK{B@`kZ@`yUS2 zKJ33gNKZu$47n8POcn*G^aSf_ZYrojpeE_R(&OEF#GXd+D~j-PTqiBP zK()FA<-X6MkqW1VSD971r+2)JIySScIJ?inV!@=aE{381zZC?nf-Y)z_ORqSoa{0u zzzVAO-&RLC@$?f7|V5p9KTdq(bT zcwOovjjIZxrOkDrq!HPXtfXrW%M_u*nD(Fgq<6i4&WC2%@s&lNag88A`NI|^WF-{^ zWW(3n`W}SPQ*QTv)03+IHd|45X+yhRkA_8hv_YJSAN0ez7um0J5_ip;#9cqPz5cT| zJnQYVJv}=p?I^j$E{dmTDSfz5{b%MooGjgk9|V5{-Fd$O#Tr?2+DQ7{ze1CBEmDQ} z*i5Qs@Hj4P<1rNi6yWS`A(j$S16u1^b<2r2lm9+nUsCIT!otpG^AMnq@4nl=T}0dH z;J`t)XT?aBPX$|x3K5d>?DEvpG0hR>B?yJZ{WIc)=uIW1;tg@kG#++!gYfs1I?G8 zlx=qfnz3v$Lzvvepp(yGd~aTb4=A=a$fV1I(6;E=h7dm@s%k7huPo0_Jd1?!p7$pR zCmz99q36L)^Xmz*0%Bex!WX8*A_?B_GXLm(L3ToampLVSfB$#+7;B)3$9ojhfIdM{7?aDy^&Au*d_B{cdVUjbMu*hp`g?G&>swX*V_4et@Xi$=;E~6+Vi3H zrdQpu05?tI2lwHn04I~tgn^qR0dalQi{mhU5y)BpWAA!7x|=buGk_T;pV^OhCkyyR6BIuuh=*i#L)UbJf}%xY#fh0*XQ$S(j1>52rO)X} zbwTM`#a7_B!A4RQ`Y3|%aTk01@RpDWcaD!;dFg25l5Mg&a>HYK-}RfGW+(A~u@`Q_ zqX-Z#7K@y`h5e@j&vOKFHq=DvcQgFoDk(IT?nXa4I!gDHn}?A0ohp_Nc^6ZF#rq*Wh17(#aIioI<8IObDJRfAU-Imk0+OiK6v3Xw0axLRELv z!17}I+KBCv)Tl$yvX91t%tNZhk#5g-!J*90SpX7YOt=pVj+FX56~9R6G|pUqAJpm4p;oZbQ@SB5Wjy!^RCX(*SsFjqDsn3|QxFkXYo5|} zCY#DoF1?@Sn{ zg;?$EZ#lko4|d5h=nP7=xE1@R1}cVfDMK$cCKvaiHnsvAjn)!>=pGG9<;<$nVGVbY zi7<9Iv>m?+9Yk5Fo=tFBd@mnSaaMZ5Jf~(J?>#HnB($ewHD0uhXyJ#$B)0j|Zpz`T z&tsNauSyRP;Vji(J1-Yw@qHYv5bk-Y2laYZQNGMwGKtZ0v6`5oFsUVUF^_udfg7+$Xck6wdh6IUgFj3& zhK~!{zU=ge7)73CBOh$JDut$-H*x4+yX!Pu@QRgj#+Hi-E{BxTN}-n-s5Fcz0p|uC z(Gy@^Z?x0J6Tk;3*zjD=2atN{grU8b1CbO87I?tM6F;DT1lGWPlfpIG9Jc~|k$uD( z&Zi(3F8QnjNJs8s8jYKeAj>0jR;`GoA+#|!VSGj7H2vPtgquAF$oSthkNikd%da7l z+M;1`wF!GQSDfEf=1)@lNHTUP?_>S6E9Ft5^QdTBv@$ z(28DDD-(Wyq!>3#E?(KN&Ree2Qi?z&l-*jGHIgiu3jtIfRSck|giu~7GaMjvVq6UGWovxVNjwRgzeakh#b&m6Es2ob#|cMk_L6s<2;)&gq6C^7gUb(aAm{RtQ>MP^>uQA(G$7#l@V#4OJY8GrZeflRQM+3N?fyi-16VvOkbBo-p!qBVc z#pG|#lIYg!7SE0+3Xy8FZ91{%^pNV?hR^%i3obYF7FaL`yXNqVpHibYB1QYW}ZRi`TCV zgPT!~uy#rUm(OW2J z0z=`s5YLxfY0VNrtL_^)9UVsmc2UsPoK=5cyD%d z>3q*}BYPCCKejvGlo3i-An9VQC&-NAJMVP$yu|qJ;7_fO!Ait15Qgu0iaG3|Jy_7L zAl6mzAPRaBkA;$*PTN45giNxyNZ;LVyDL&Wc-Xlm-_JMy+&#F?2~iVj=?M~l4qjoX z!rl>YF4IC7*%Ld71l4owx3PV+pNLoa%^Gvcuh->^X$XU|rhK(+OTG}IQATPQjm+>w zHF+7Ro++r_Y3j)YhVq}r@+}5=cz+NFW!iV*r~}VXd)uwYm*r`-lg&gTVR_`ipRNN$(x!b^Glbr;Xaby)lQxMUKFfm?OGc zA=Yg)LXO~_EzlJEsQcjGkO;(F87(opA&G~=3JFUh;C$a6K}oDf0SqYN)I;WQQVD~( zMHhcbuYEgrY{|T0_mNnC)1`&(F&8PMkDNsW&Hh44WIG}wTYe`$BXoznO0*l>MJ5jz zCc>?}lCc6>B`uADJxcjzBw;_G1QC%_pM)X^Mfz1y`#`WyXyMbpZ6?e<=P3W` zHe5_>58`QoG=9Pw(7ixp$-%5wrLk>*d?e#LIq%@eu>ywUs|oafK*hwRYPZHgH;jo9 zc_79pt97~6jmyc+aQfLA>9_jGy6%6J17>D*0y-W2S~uS7U4Z!?$=K->0LByJ zx<5LFn%w=7ZcLvc@4y&NhlBp;8B(Wn_rK@;)HlY%@%v}UJf29c^=C+&^wG~roBYyi z^S;wB|NLn}$HC`+buE7tDKULozjNfdX-z)fpvN4`9d*n%Z-HZurJ7A#qZvI?V@Djb znmFQ?PhsI#tNC#9n9>=~be%rNQT=K&g2}4hv7o3DDv(;ibEwwp_Iyw+JVkMPg-*d{%-(<^ z5ed1CMk3E!(1AOOmz7k9pdQ$;JDo3RqsK=UEt%k&?NTC15vkKPiXcM#ADSGN6mgKV z0P(p;ZFLLMG;ZC9az_8`LY~c%j@C+^*aa>1jy-M>TTqV0Mr*-29E3GXP)Q{U`q9IX z2pK8D?+QqNI9f*n>d7)$UMJ#~@D(q$Li$Yf3f^C^)K6&H+nKuXsPjdgx2kAzVqX~+ z$RnCrKH6#OdGnRRFJ{fx3ZFx>t?=_-V~Z^Pgn4x_%V-y~Qb((G`UApse^9r7T~x{9 zaIlU}n*5|vN#IfjLVC%L^6emq7K3te6(zMTr^u*(?X+4^9&}#1ToecU()>qP8nQar zfl>1%E|vC+O2bSJ=%pG`w`vP|y&jmZ?Qv9Juz9lD%4I0<Kejs-BN51$ zc!0*=lW3AmPx;*QJ{^8J@($tf^O1Yb0`L^&%Is6~(hSQOn<+m?n`vdt;;@3CI+8{;)C5EleW*OoVcKQo`!i zu{5gOZkF$VI69Kr5 z9Q4SkpIR>M&9$dyR302lP?vg&vF&HL>~{Kc2{Sgau$^O;h@fcML1RXIKj#i z3HyCxIXiXDafVl;^WkN0pqI^nerYNf=HMkNrv-0AX1*wBk8;D&g!8b@QC2K}>Kdbi z<0+^VA8x154aH|z%|!!*iy+-DVo4abOBvEEzq8@eX&5}cfx1^?itXDOQF*VB&(VS> z=!wc1QXJ*2J}E=3AW27{mniP(Tp=hBzeuRhuv;k779_9PcE{-r2IGsLquywEebcT3 zs1Z)&!>XhexRTFHh3R*0T~1ej>pc2858<0@Kx=M4$ekv#3|54ao9`n9P*c7%wTwlMkXVV5Y_Ay`V*1l{NO`MTO&{9}`ME<9Kn&eM{ zDhOGTuul|BxmY;JMjy)Mr^=I`;&Qf1pgUV*vP&xN*!NAg_2^~ouO#qk5E%OF_WCuh z+x2mVaQdgg&%;Vjr8CtdRm9kd&UWQt$WBIr!kwE^_v}kx2mn5)oL!o2!1()VG0`lM70fbEj}2r@D;Wk zOpiNy>0&0dn-Q0PYPfIGVBt6_H>&002_?6t4z!dz&2n`?jD>4YAvf7L*S5)fF5_gY z++oe->dL|sm2aMde5Coa2s_7&Ur+$sj?jPo9nU4`9N+OFSziFA9!1Wjs`qQAZSYnN zJ`#_HL_LbA0NtYNIF_k-=Z`!&7*{+XRG#e_$6NSnXUyz>uT`X#I2jr`$7@3ZI+4dw zP5hdR92AfK_p|Y6IhiW+`DgeTjOLk#*CS=t>rRyZayIPFu9TU-W9;&=@eb0A&LG6F zb1?Z7QjfXCsnsZ{%v1v}yj--#djbC zB;X+bBM3JPrbdgZ6=U&EW#Q@Cj~aqM$6Y~i1il@ON8oK`+U?B;H_GzkxUVdg>2y3r z=SYgEiOnDgT4Nhi0YOCZch{ttArPJWk+l#fNB~bhdC5-d5}XW*wJe=9(1}zmU-dlE zZqGkYlv%z0Jj5nflk3r7UibZcU*v7<71a>BauvXb863SZiGaw85Gw@{(?Ies@VMDA z+28qrNH=w4696)lNu)-htwtSc3(bM6K`e{xOnZ&KLklP#GPE--3vECP0KSla zE)WDG6Uaek+7q``NhTfItAX8fDTU~SUJLxNh-!%}{VIYd-WA8s^1|X=*_%feeOXFs z6&fVMP!holb#Dbc!c|BvH28g(3=-)EXD867IX!28q^;of zgIYPl>7mDSge`M<98D}v*9qq2%+UEX)gPE><&yl|Ko8icRD5BZLY*G4P*7vN#xH=% z!)<0gN1VfbgFj_fwq>Q6Rn9X&$vwx@JXzr)MK03&QLfBk6nAQg9FcpIjX>rCDuI4lgbZn3QsdKwK>v2PUn8HkFz!TAO_1 zu3WHq5VI|4ta4%Uk`*AO5lIu__rCTY)l^Myn?Mk~^DE|H$yiFOrcR{_np#ON{R*hUCgIl69xBF4o2*H-psst^S&&9vQ6eV5z0j52(IB=Nq*#g zhUWHq<~t-(G?|bHkKc+kEY|mWC*{Za=Nmc4`KOyzKru>InpO`wO$9~1;}qsie9gLR*PJ4T8Otp1fT=eGm)$#S(7jIbC2 zJU26#C=ItjMUwaxN)cKCK&(h45Epa^fHiVY8SV_c!Lnb~)FDMxZuv|^cV(-{tm=t9 z?=+j=1`H(~;NSC<3COS@iObmSr@OkW0na-O@(QMZ4}wTD2r1DHmNoDOLDsYF_od>a ztBo*F28M_PQ+N;49M{TNm0{Gt^uzba(;fpka*@*!bJgWbEdtH9dJEOgPLX0I67`Jk zc&VLRE329Edzitos|6E%I4EVc)haqsNh6D1BTWTOV8_pdH_E*GTB#bJMoc+a4!{mF zi#wEm1^*YcD&iAX8zEJE)veTy;?}2j5iKjT87$y~1-U-YN9%E?#58DQ4XG?R)Vgt` zj`+V!sjP047X`}`8b&*c-QDljE!|dVoflY2bA?+x?67S`hreukyXmpc@yG<8tO;~- zj?OK31K)7|;`{;4Ty1aTHWL1xU%>|3Mh5JE6utI8Qcy#1a$Fn&lmWViWqG|LT zQgQY}efBfrDk3D}*orneg<7Kc~*}nUK z{^%$cl+0sa{!HlCi24FPO})T&DO^uoo->b5=~pHqk-5TFp%=JR{aS;&KWB@W+xc&M zQ5ZW*y0Z13)TKKVgV!f20*@wt2XPd}(T-z#K8$(17i?&Au`}o1V8;P>!Qunuvp}%u zdB>qjyz79k>?orAas8K?!z}@SemOz? zwtLdyhbzcq z-SG2xVGF81AN~7?z&}vJ6PS-y=3qGK4f@kbcRZP1k2?3=kAu;#yDkOU&nbGtw72vDrw!0x}7UEc*&{lR^C16-~Bed9DL}Gx>qWtPTi_; zHWi`v!1C~247k$+*jLX*dI)XqruInJC+0epcV39!C{M3jk+F;F1x9L^ME_F z*4WEI|GIbcFp{&yp^h1Ut4D%rIyYT42-IRPXx05vC4-TipHxP`tEKAQO}Zl~4f9~* zZPCDeXOi5WM8c{OH@(S!^s0A#ZLnFesO5qWY;EVa9(~vAcgLy09z?lHxz=MZI^%9? z=nS?~)yTWS%}sZN1a2QLaHJ>QQVR$y<5`W7x0CxjW85-Yc~zqx#$B+;!7#OSeh`FJ zgSwx(mk*P!v3+{|8?}uuLEv$ED=~l3k{j6p*(=p{--G|gJ!w6E%x|p(+jh6!yXGjp zeYcGUbxmRH#bDf<{H7JwdP;y=)yQ7IH|cfmq`c!P1{1?$F%{mVz@i1&Kpm$w{-bx7+&F=eI$yI+j+^B8 zq?r)JbHk(1pSyFvEXTFn*creV|FXvMULB5@VV@OZmA(-sH=YV);NO zS^grmYsB7vN|EA$8-D0d%9UWktOJ-qf6(uO8dO$8Fz^r^1f&Mga}pV{QAG~ysS4ka zMs`58N;Uh>bqsKkfFrX*n52cs+z-~Fi!h(4NCYbc(`{_lDKTkB@u?8RfSHF=`Beb( zjz}Qu6ePi-WM*?gP^h(6b|7tzh#MmqSl@R_I&l<#0FGmh?ZKi^-=29W{+!t4vPYO8 zE>)4ELeMlaKAfzB{e&d+3AWvCBBcO3uyzjSI)-+%G;C^<705!O_9Oc`2PFog?{1Z> zD#bW#cu3@wl~G)tB%2{_Qry{B%I>G$c!Kyhkz_jTOm52sPJs4X;*N1h9X5Z4xX59% z#h%T7Ns^v52|Zn$lAj&O@qx+tajW&MI2(GgXb$6<$D9vLuo?3J6d(WmeR3Blt5B$Y zp+zztQ1I}fB9f>~?y$CUEmK1Xm&{qpZ6Lj_)YslyLCw3;iK*oFe}zWZ3H56L(OUKE zcDr+Tw>K7DD{R^aL{_fYOby^oEGJ_#2tpu#eNSyMqXuE@Dxz{lV>fn;i!B9hV5JBM zi`f+NX&N`*r|#a|D5F#WJQ;OQ_ch^+CTpl%7ETV0_k_|)UeJwRB=$2@!&Gz=Z>S2a z1HI+e#;Pruaoa~126m8g??1c~MMifYLz)E1Q;eyTRB99~C^!f3g$%-H1&z~eJjiN) z=%tEA{gtaZRWv)C!QBOmHD*WS^C7RW1yMZ~((wTbE0kVUd@#y%Zv%N`L6Flh;E^Y@OJp%gKsi!s+xSRT6j2RKY#&a9dZp+AWYeSu2sh2ENvgaTW35uB@k7J zEKV&X?v8l~iBshoY^z@$PAb*o)JbZ8w8RWgRwra>R7oh2sSX{k%v+mMWQ@{ZmcT?o zbGapx`l>Cu|!i;O4N-CRc<>a9~tNy zz=Uc$$eK<%#mxH+5^^fwJ9V>vXd=n1_k|Iq%B`pa=2|ib3kum>{WA+iPNi7H1+|Xo zKV!zJ&;=V^!_Y-<9y~Eb!B5PV*S9IWRLvD;TG3@XT-5AIBO=)3dt!m7OQA9X{)_U! zC}Wq;T=uaJH$`dh5}9}u;x7bS*cwG@OnW3A5i?t_JcuJURY^PCrViJT)&Lb8INjZmw+}u=4)Vb{mQ`VG|RmU_o$1XBn zYF8f%F{9+TX7>s9bLwOf)hc@f!iMOu%ji9+53xz9xexN zZL2lXL^YDyon!);3~G_N?{+4cIb~5w*xb-BWU_|CCNpN3{%{%Y%c&fDo6PW-8m=i= zm8@Is%EhRvrRc8Y7L*26IX+3^(?fLEG<8%G^j26U6}5ZfUC-!{45(|t89{#I#*F8X(Q{C zr4kn`!f>a5J4IWqDqBZ4_ouiH_>CfWC-a56OOkHTm^Ah5WcQ%{++=Y+v#|Nu;rgbf z|K_abX4uw$IfS9elv$aI`lt&dyID)N7go8rg%%^VX|Bu5wI&ZG=a=K`m6k)2F0jrQ zlUL^Yx{IwB7i$TSJnOHetEk#|yD#Fqd9vSk3u}3Qn$jHRoBeZga*&NBxAgz-wo01$ zyRU>s%{naxwHpthS&bx3)$ka;qhWl&qPVck{8+7+O2c*HwMM0CRepK#nJGZh2Hob4 zrn5eg1JkP)7Scx_8@n=07rJY6m36t=cbg|kcb?(;%m~iTfF8{Z@MxL|!HZV2_-vS3 zSjC`!Sq`*c#JT(-g?1Uo+IEsFjn`hjs`7E&;(jqQ4)L#vhYie~J*%d%{wwj@!0zpA z%>*HLcQ$W)(fVhe$7^S(XSt=5$yel@J|~}>hsn2@gh{X_2p`*XSar0%zNb;uZ&Z9L zTs8~PN;8Fp>vBk)LqR^dwDv`s#q2iWk@%5+42QZi%^l>Zt;KC;CmNYDf2IP(d=c56 zmnu#6=6ycVs{e{VsZYLY1hRaeCG zRofIvTXB}hHVcqss$y2VyhMI!7fv<}Iln2=P3v3$X!hI-s+9ptXiidf60$H-A+SP! zl#C((zQi4v5*&a3!dXPU9KzI`u?xL!cd}&JzyDUW^n8r7YNvQw&75bWu(wmN*a{MA zO{7GvHu|Lda(MerHHdOOgl)y!*V{>+de1@L;zvOciOg#i^h*(}Oqyf8b7Bz%E44{< zS#W22&lG)i(v&N|>j}5cZF^QFvxb-4C_|}Djj61 zeV3wBf8kOu0%^A$Y)=%l65rXI#Awsz%qC1Fo75aE2i;OHv>Msli}t$W1Jl6{46O7= zNWiY-=|1eLrVP4~^-(FVOyJW+-LEX_s^^NVoGVI`lU(}&SQPF;9(aQ}j>Z#zRKhA= zvMr6t*16Pf^1D8~fnG=y#EPxqA*UtgJ6`P42SB73xUT?9sTMDcD)(ud*OK52SD#(R zlR+u~twPwEsnx1)UFO?vz_qg4+20xEBf4N90ase) z`rGEZSTjkI^m3}XZgK0})!(dtn(giyud=bW0HZR;v7LMQYi7vC>%5Xx9&GM^_a=X2WP**} z^S2+#ssDB#OR6cWx`d5f|Cl(SNJQ}aYGsxvYfhu#q=DuvV@${eE z_V_M~4euuTeF~0dG@br`QHU=9?BXH*%|dDPiJImx8u}7)4M79bB9X zCB5EiAWcFZQW5{%R$bf#&vM{A7b|U?RY8Tr& zp4X;BoaD0tbIPYhxz`P0kVcmW8p@snME^@X2BE`;wjE&{veb2A(Bvd65 zec0Mb6O2w2Qp(DgfL5CnDGK2xSTlBJJ6)rR|2`*Skc4z&D^#oIH|Ktxd+xF0_aA~q zplNe(iNgWuLUQa%TSfth#%rUlQD+Gva9lw4b-0{`{v~^VaNRd&@6O!-ot6 zU?m3IBRHsQY8XPGf2qTLkcHGBMx5Q_IdJW}hSUl;zIP-b>#rF`6~g?~SkI-5#X$YU zoZ&RkRhkYDu`0Ic2umdad?={$M7}83aD;Wk>xo=fMMhitktlAkPlK=tj&c{ z0E9iHmvwApeBz}?7|48&b5MR}Yc+GyYL3jdu_b!7rCdoV`T~4A_kt8oFBGYhtdpKe zRKa3xy9x;ze?!2yG^sNqFi!@TOa7|SKvcP*laqq!^a6`3mdTN=k?{0*og!T+TOMc2 zCs5Yx_3F8-sd~y7%#1OAFjTjD9rvBu}bjl&!CxfAoo<8_#+LJ&N$7V01rHpN#LO z+w0}v9jWWXq#cik<3lH%d>%}jpX{ULo_70Y+aBId3yI^&zbbzx6eoNT9E0K1ZVm6u z@y<+Ehi$mq84SmND);!E{!DT|k}w~e^V7w7(;XcF?=LiejK6x@yu9rkMcAd+*I|@W z!p-Xce?G)3ZKeGH%~xwr+b|UUo?qdiP9zc_Z7^w~gQ=8kM3fdaW!gkgWSra9BDEtw zN~@{=eNNM{;-*kmrqy4n-1t7uxyLu|r_WhGbDRW7iUlB7DnW^g)i?ur^vzG1RlqCFpgnF zr84jH*Uv}O3Nsa*f+`H5!b-o;x%lx%Ky+?ygVd=iLIiAxQ<~I7PY)p9LmsyqG(l?q6c^9r-RHgIfht4K^LlsBFV|P zf5457(DhCA(Z;@T+QwNbeVbD9hmANUoEeE|qFisfqo_S!T`mBV zK5|#6tF*O;hqXonVN;KsK6`V)^HouODtC`9Vy z^pny)kU~4FQ(c+_?d|PVz)I|)Lp0nT` zYujV@xChD-lxu~dUF5!r>~ZAU(RY?8&9hPEOZ5f6FFL<$qPWrg5OKG!*d62d3_Tz~ zMIv*sIRP_YW{-p?fVSSst?iu!20RPeWTlg01-W^a{K*paEjod=DEf9kCR$QOc(O~K>0 z+pYFmaKbTDc(hTV!XM2}?R)$R*zRbSZI1ZD^WgGwUG+(VHwcm+)@$oR>d*lsEnV`R z{XdvG!G(Vsx2`&Cp=xqf=R**if77dGs}t8--~9HP{R(=FZxF2DYqRw-NV7}&Jf^ae z^8Z_`xA=WGFkkB``6N@%-VuI-nmE4zrBh)`24sVC7FnF?0+|@>usCva>C|IOXtm-_cE`SSM920tU{r{AWtkAe<|pR-deQz zX__$&&uCi^$e(_==h7{&n^z&urr*!S6sH&G#ZO(MAlc~RH-=`LG3M-7;Eq7k=5h0i z!iCTGXq}?0qo|$kpnL%}7S1-t7iy_NaWB_ezVKh5RJfDFvcHV`(;E2#gdB{4H$K4# z#dH4fm<^C+(_=WYx|4un^9KR??o# zWBCt{USUj;#a%nStamzEA}u;}e4R-U)?H$xOx8U4HW-xls^M5v^=uYupIm#~q}iZv zq@Ik!EoA-g%^*3W_ubLJ?qXce%@o^sCZnF?f6=6a^8&~GP>M2G zk(#1Cg-uT2WbQNY$H-;)({820JD`={exCcJm3yl3%KKXxGA;-VNxl3fHG0;|d>*q7 z5yMEV+5ac>H1A;FR(nZGKQpps@3m9SOT#b}zvr*WVTT6XK{r8GyWs~zVS=bPD<#Wb zw?LMbSZxZi4TS!{g=mm6!8DKFbN2fKc234J;ZdFu`RGHacb@(R>az z=K^SQk-S}3gAW&vHzJubj4GD1;XzFy?rXq71!?O1~ghQ?| zz6M-39+9K-h^f?EQLoWjI+O~*NIiW3>lE6nOesH|nISLEere$QXwNjxNLy3w_hrZHM=Y*VYPEu!=dDRRw)Ml%lbkFM3!|9!E^ zh~qdADvcKq_ucvKzVFWdbhf%*1;HE$#T-y5B+rOUf8^5&#PBE@1Pm`htS|wToU7%X zT71bL33+$?;e;H+@%xk61xta*EN8Pz(9U8I1WEuRITI3%&&SE+`u6H;a{l?}_vCgw zFve6dk*0tuh*;bKH=E$ zH@z^y9T7d-qzTQg#a+ttWjT7`tm}~e`>uwqkk96KggznxG<9guW|pF`B)?@Ryc(`YHnO}d8n!xD0(-8cCN!kbSN~1l5@5MCrdo4G ze2pPG@K3=(bBb(T*A?xkeBkt<0_&>#ZpoX}kNSP|+R6ECb71O)cWGFaq**ZG`ovwF zkF3?)h3VQV@5Zm~;$^k$MR_~ax$R0qe@`00R~o4N4*ffAUjpk{mNeR@?#ZHaDb~5O z4(r6Au4xW0AK>j5?;bq2#n@wfs=o5b8iJ7oXeG}9@<7=jl<$o)9?oRg~?QyInz6g9U919Dahw{&ZR zbbUHZnBonR;R0cK@0;AOZgnff+4y22#yCEoWOG%ba8j!*#cr4q#ylaEUd1#lc!?Pq zE0rsgSb9|0nlOaL6R$nqwE|7of10pTDqch2LIkN)DamPt;(5kpjRj!qP!$B(J^=R4 zAcXOGEd`L{E?hez!XkG#(>A~k%35;=$4y)^g0CmZAzT7sT}GrWUKbXfw+a-##p)pY zDQnPws1O2{YzCxf%`?`P}p+~*m2y*X$3+IDke@QWS0(}T) z-WaQ25!TvUa7d1h`lD~Ik!ARrj@IU|;AwygZ1#&5+lHwwF#T8kpPQjW{+k)mhOHxq z%=pEA=gWqD0JTveb2A(1F8~@PF?Aw2?|r2r5jQK4Xxb^Qsg=}U@h3lcG#wg z|Gs>XCJyU;fwV}&~F1Vh~`n{PpYXLAqoUExze3Gzdh zP(-eqU=<-zW;1}UUbK5yD0*roMN%>1)ln-d&qsARBN18%7m}oPA*6x=;>CtWY{!?=g2Q6=DEPZ@Qm84GxxO7d7 z&_!|vL}BP!e}C6_Y&DKg?ICpxs?yz*0o0ReSgS7Zx|z^D*Q!~;FWJ2spN(&8PDixx zaUh|}c^S`j!b#8h21y9~e!uZc=vZDQGry!4I@|I`!aoux<-XQddXXGE<1ejKO;5ux z487-91Zjs>+9tt3LX-}PFTsHe94V@@%-tf=v`U<5e-qk&r(L(TYdbapz9e#NzvpM? z`X-&Ggp7eprhz&Jwcr@yA_e20x*kz129q)lG<>r0$WCsPIp=4C%X2<}!Nqy-tRmnj z5*55ao@_iqtN|KXwQ^IYHCu#{kOCB&f6(BRmff^9naA~ds9iy1@sO$FLPrYC?~hqqI4 zrO77d9<+9HYSxD@6PKeg}4a#-&$uf0l@Gz4Llp#yqHQywiy2mVEz8w3X#3 zNo0j#ZW_>PwINpiwHCLUqu9Pez2Ro0tuv{> zuD4=Iz5&HoZExBz5dNND;Z>|n)E8}QCrxA&QHr*x6e^(8rUpf>&gdMWPsd+Q&@n##d}3R~!$|m)*q2ys=BB1a90M;R@ic&p!G&{=7Y?5LT*!5` zT#gnANQ8ZkMKUoIP(&}>oP2fW7)5G&e}H)uhy=nSGZ^@8i%p^_RyGKS%Eru+A3_h? zJY+r*o~cQZI0wr(+b}>;00m{hpN0WeFdW!bWwP5e2;>xH+HVcWA)U;iz(BeJHAW-i z`ebs&F!FiKYt<&!6x5Kk5@(A<8qfeYV{;u!PyvHP3Eoy4q~V9GUGoL3)2M4GfBoG6 zBnpBhYIGa;DAmw$5GAs(A|&+9!5Q(sL60 zueZ8g06D1f_}N(Dw8ASR`_0mJoXV=kqn3W=1wl#XtJBQYUDQQ%d$n=sd)MTi&<6sZ_yd;YFk}>A z*;AH}h`Jc;yyrW62Ni=ga^XH^p7!^bQLQxrbF*Epv~wbjtJSyUImn+b!s>QA=i?G~9mXhodvcw@pg$<%He3(^=UZYp z{M8$^emd2N-uq#=jT{dztgEZ?BwG_AyWAG|S>Jm7L4_jZ2yR8c&amC8px?-!Vz(cO zwc-wd2;+3B0XqrFL=@@W4fXAQ_}<|Z9syuvdSYZ# zC5?{M>L+kIZt4yMXHEf$jlJagmhZiP6K$J)OAR->_BzPKq|QqRpb?##Gm3cad61+i z>QH%vFPO3r-K(UTf3mC}V=ei@VkWKXmHgoX3;Y0`P|Iq=Fc7@!EA|kGedwWe3dN~g zNE&FM&=As|0!CKWi9nH!v`!mJ{=I(0!8V3I_85su?-5v4T59INI@YT zQ?$XgJ7${i(WYD=gwNSN%C?i_Q-~YyZX`VPZb$36j!}?IfAo5Zv8tY9#$u_tf}GV_ zc$Zd2Qb{_pF9vy~S)`-@k!VY>c$>V;rx3uf`W}vZdX}%N*>p8~D%(s#xejjXP9qPT z5DM>l3xfkUl51*%ai&Xa5QZhC$pkr_3Adc6EEYAOowQdEXEc{?Q=ghXEpf`Piww7m z5^!Ab!J>*gf7}KsGa590l&Di2zF%eG{*J$n;g1q^lzl1}dfBueC5h_i?j{rj&|KsP zh1LT95vf%1-3?xyuL zo+mn{c$Q>4TaXrZHv6K&JY@>NR;VfZ+{UO7-X8n_cH`UJu*Rab!xk$QjvaxOJxS#* zCzk4)1Ltg5?gN%Baa0fHp<|k0_79-!-G!s;OGmiC+&Po}iByvGpT_;w6Ci~L`~sCz z!A`?4e+<3%D}3l7mDm9W5@IkU5E2|f69>3dnzGDYBc(}|xUdQB-$~Q0D^&*~m%7gD z^YgQNeOu;b6fIFGZV{LxD+SGIQ=+>$O(v1%1-g<8g!yAtEUML=SqpJCzC0IW9ABKL zPdY0i{$wB%L z9chmz`ij7x(#j7`2x(6s#I~=v3(qRusF}}&(cY;_5c`uO2^>w~`oxq=H=6cPaC4;i zwvkXRloa5IlYg{AGHZ%}eeqKYv(qbx#Xgh36*yE`Pk}|MtOkvr;g;1wzYW%5Nd}a( ze-d);W`1)tJtO62`7SAclTI$AlC)_h72&dGJNe%L4_pv`v~k_o!Wh+SjO?cK7R+u6 z*X|D5KANs@r<`>}CLuqwhD`k@u$=?J1rVG>4&A}Giwv>%{HKDQ*=fd=!wyXw$qZPh zwb4|%S@4)8N4R!EyT~Ep0km((E5;@Je|4n3^{`K2eZl~T7w8vDoA38Uw$V40k3CBR zK@f)f{S{LLl7Nj~1o0F>8!ZfCq0K?q+sxh#%zkh?D+bAb_dd{T(qyW4X5is@?;c_s zmD;0W-65=!bYx^FhluI^a$PE~9j2%a!tOb{IyaBu+nB53W@8F0t~b?-w`hcdf3M!r z@)S#@EP2h)Q&WO%W}crwE;2gwlAt;RT0IT0c~?IQ`iZ$_GGMcx=&ep~eHAaSC~eq( zlC&R`s3s;kjQxBA3pYNueYuPCBxV*YzW(zXZlMl=N2AGWm<}a(9xAIjVL6_UC#4&d z!DTgYCdJdFJK;Rs7 zfeE19mond%$4~MXA#Yai?#T*PZ|~CwL4g=1MfwDk*RM$slp0X?;WNite7;+)G;yR$A7vAp1rgD@JUGjgULPVhTG_9+xQVFM`j$e>X9?E2xf6g8XOj!0p< zQW6urh!H!CI&t-cCS!WJ^`g*bBKf7JQ0_S+NE>YIPfLUg&NSOI&dj-`l)J+U zZ81;44hw~+_Pr`>FD3U1W7L|}Rm4=|?4vO$LW(5{+W6N8zYcfJufXh%dKCFb~3jqIMK@e-tA;a9?}mCmv~2 zG6}uOD|8p|I@kym|9>c4p6h$(MPfkwq(6 z=20wZHmFzg`nIP(#PQ+Lo8$OM9=$w1Z8W;io;Bzhg-caZf2(QuUY|27 zNiVjPj8dz*tPo8VfhvPWbA884TQxFWK`0Ars$@Wdu&@BizSAuEj1hdsX{1)N==>uS zc-&KD%LH*IHQ0TH%$f%?`cX2pi89e~y^>jFlwQNZf2@ns&{!^L6;-lOQCjX~H^*gc z_k!33H8(|T{8dw)47(CEiauOjLO)^U`D>+}l zXr(JjYoU;fKvhUZT3}&Mno=*SdrpTD{vn9~cEiu11E#LCtwR+f9wgaZ*!;GKup zw(kjz|y`j{PszUWOt4--%90G3b8wZWP_ zx*_-7*mr|~JfFnncqo7e2fjTDg&SBTM$T~37o!V{fI%ZKq@lPJA-08{#eNy=@0R49 z)1~V>1N^jmVkp8JRP6KNQYne`xzOp7>)ga0$UNVqXN#&=!|&zXJ~N zOYW6B3Mm-a!{Hah$Y$;Ql(nCM+6u_N9G+AY0#%2S?;geD{)>Ly%z73qlc2LYFQ)ug{`0THyLu!f}IB ze;Rs$QEn2r7Mz5(aSs&8hGmRah*8>;xK8tHqvssG(>N(-wHU@-O=o#(>OC$GUC@$QQ;igZub_Kt)6#cz3QrLA!Du*d!xKg)9&lT=Re`b z)e^h73LU(B{_5rNtHU?P4Q?7=ZgW$y1(`Z1b2^n%JI~Wiw>bT7ORn^?Snprdf0>!5 zAX>=jt*qkv*YN9VE^IIOt)m$dc-z}O} zMJ?O(_U&7mqG6U8|Jgt(A{j3=84%YSQiqz4Y)p;QS!xQM%I@_0O%bDrSQ#$lDacxM zt1Eiagz+O82HMR4`E>2ErE&(ivMO6ox90SgW;5L8*^K>nJDtsEyWW8?&Gt5O{$m#0>EJU>5#F7O@YGo4 z8qbHvO)87iI*~J-q3=C9JAGV7d#;OY{rlq&Q@k_1;|DmVI>zAPKhT>lf4I5G)-(uF zE`5v6&d!<`cz&~Sqif3Kx~rA4qB=M25Z&w#92S~c4!$yr6>e8ua{J!ubz-oea&DO4 zTgnD9jxtJRRN$=fO2fke4R33RB-`CjB>85#ql?>ar_nIP8true)w0m{Ab3wxzs@Q= z8r%=D%sEk7%}Hh|0GKb-f993(=wqu3aGRWf?H2w++VLi^7MgOA9OO|^J+%MFgq-f( zT^RDAfAhq@cA_6Q)LTY_e^ZNE-(|I~LnkM3A@SI1wcG83pNl$U*M9-MSpRS0HWdGz zzrxe#C1^#xTW``-Mo+yvdhOH=L~o}_mkJr@1*`_gvYi$*^?#ooe+)PwA?)B5scJFr z`}@4lbNbsmKIM%@2qeY=kS~>>M2*yfgY3R(bs7xMKypj~jc(G}IGwyt=7juw{_9(E z4(GqT4Q^QkMA3u=pFyf?q2-?w@fZxI{GJ2pG#aVgL-}f~U1Os1Mm{7@An*h-+jj}U zMz(W^#oVW>5OW1$e@}y@`RNd6Gt9y}${@HBlXM15$txE2xlxkuQyPZ{yI>KW1lE)m zr;6fudHNmf|B^a(4lioM~mKO7BvpL%}}?zQGu@9Y{Yoe>C;h#x9VGS>D&X6$S|=QwVL48rUq2Y}7HVV<^`Pqgz53e~$QeeT`1l?7x(b^%TqB|I#%Y z0#AhUTj&CflO!(mNq|ZPLqUXN3A@ahcFBR>@@tMrQpHnMVYeCUD5Z`%fH{wo5d2_p zGZ^*ycc*L3P1;c+K=T#yts0g~11-m*d1!?EfD4$6W>}G_@13wjq2v(-LHHADqZ7TX zt>Ptme~n(fLV4*Q(dYihz9ZG`cG2simx{Wqo|nek?{#IeK(NXl~ye=Or zwkeTG;|Src#5Kw9Z1M!upL!xQuq@kL4j0dogI8nB(!3#-VagmPS%V1X`qpQM=M-Tf z@B%gU?X73dHG%3wgD%vRkCd<8DNJ~oXnAyYe~7ey*P}fho5{(opKBWHj8BWPQVoc0BsnEUp&o*VnY<;kzgtUkp= zwlgS%UK#UtrN2JZmDg^zYFwH@T5)IY;`2jydG#p{QN9*AoleOB<+qg;EbOxi=C(EU ze|K+0Qw9CwwcB^(%iQDOxpI})zOMN-d6c*`J2abK-}zFBMWLRng|?|g zZo{=Nx%usHtm>}zGmi6Hj^P(X3=wKpta@M7;3@Xf@$IGTktNT}D{o>6KsLL$Q!ywd z;Mj-oxT(lmQ#NY4nVk)d`0uK`cJdN!e?-^-SqlT}x8 zwxghPsr!#oZrS?kx1MYYkUKU7f7S;f;GfQ(DrV)sT7VZ|9WSNULv+SGax;h*(j_}} zrr1PYaZ&w^RvU+CL`>C~KmQvcjl#G;qz!t*8$NZCZBN255Xay5Q=Ewjn>>hui86#} zg322uVvLazQn~{cx31{}poZ^mx9NOHyjRz2@9y`%Yqu{~l8_L2%oKvBe~pT`nVDCK z`uxZbh+qk7$vDF7#wK&SyiB*8AGc21yoIfkHXVuuaucP3KA<*N%DvyD>V=M0ax9St zgjkI*6l)eo;e}e-1ce!FIm#?4Ag;02@Q6ygmsc;e`(gwrd3KCrPI&71K&N83Kho4H1_IQl-1uZ>d%d7)$hC8 zxsBqmM``uX)nO$lDC|6rI4rElRf5bA^Ertn>^nB&^!U($B9!M8{F&`1%N>wXr7r_f2ni>0yjYa+ksbc zV|Qyas31%ot4K{Ybi*P64DuuxW8!w?K8T(Bh0;dF|7O^goBF1Jyl|>R3Q8l~UZrl8?mqdA)^BI$XL^RS zcW2cX*Pv$OU3G)R%P9ZXKK`i6He3hP^P)(E@GUtu9WFK+L;gJPqfK&sDqO1uD+1;H5&?J*Q@$>Ww=pbv?gbs5#DW7Uc_RRM9vpKQP26Zv8)wzsv2x zzk5{Wf1_&}N!6<%TneELNegXQ2(aclHApe6se1DrB5abe6|(pf(2h@gYZT~2eE{q` zwXaAuOq3&S>aC228H{guj4aQrDcpf%mcKn~Aa*lxgAOYwdwtg+*O-51oG6if{aY+4L0}g|grddnem02bix+s{+{tAW3fO21;a(1Ay8&f*jb1!7pn)0jKnH`NOs?)=rw|{j8CQDU`vi1 zCSFx=zzLbdO2sONJ-3YW`vrN(DV5lTg+XC{30m4OJJgwvn45OtY=cDu;o&ayWhf-p zejmq%^g~FwGG#<;276X};uub_OiZBdLaMb47mvbR=qDtW<3611w2D>n>JpZVf6#eS zpzygxl-06niXdKJ^KF8((0;sV=K3x+OS@A_E61f3r%!2Y&8W>A6mJ>j9?6E=5hJ@j z*b?Ohz3}Oj(tO)A=Q+B$;I0E?Tuw6W5;7B8k-odxEfzbF1Sa$IopXC1>Y!AK zrYR!Ah$T8BYxxeycNgP@qM}6(g+W+9r*@O72fs7sa&|p8Gn`$`^$S@v;ymehWO<6Y ze(U3>eyzh>K%eoto+iKxb$BbiwciLe}FqdDjD=K zrG6CT2x-$e11yE)$0q6tz((JmQ1p7Jf;0P<8N&@QHntyg7}iBZNs)kX+y9Om!`=G@lPAwNG-|GJ%+gI*y}R;26jYWK(Qvro+iU z#0d;E4aV90j%=^?>KCO~fBkFQI2iuje}z{XEQ6QcU3V~&b|uYPR_KyIGsbZ~jN&MX zZ?>hAk-f!s18u77uj zR*DlM7!HXYe9DqVw!Wp$Vfe@8`*-0bx%~5;|B$XoC?lHsb0XwDe~0})DF5cqHtdO! z&>z!u6|Mc-EQ*(e4=pPb#9n1-e#XX}<8APbYyVU@mje+F6Mvm$!yn_(cPxpmI8N90xg-hu7;&ha^6k*Lh4N?}r8urD zo?*E$?`53+3$Y+#xt=ZJD6FXtf{>=LISVB+mf-y)t!GH(=BbMQ)Ze+>MB?p-MqK;a z*sHePoKKxQ1%MWyE=V0}Be6H)u~6iod;nB^ApW|+1ZYgs<0(l=?N*L(-Rk$z7Y-}SyCaZ62D&agFzlaRgX>* zsU`JSusdLxRAQ76PM{7j4()_s43dl+o4!VJqnQKhq`*7oQtR8*;n=oa0Z>WFk4|KM z)pSq?U3Gb0mr(Swp~RBH;||__SQD2w5)LB)hnHIt4jq5f_G*;_>A^KrtHGSba9MAt z@_pUF>MU=rL04HE+c)+ZC;w$YeLz#V;GNy^?!7ZSgAN==%cR*tqu$7Zgbx$6m|3UM17srw|OJY-&+2EPV?I> zri$+)O}*B6x+)-=AQJ$qKG=Y40Pb97jYx+wD z=8kKk@ci&AWyZ-WdTuzW2K}VD4IRrK9A-S7%M_V)_JT}u*sg_S83N$~<+nP9bS^%dehLaZ-f3iukN_m-by#7lMB` zPNSBB12>t^Zyzag-D{0|-A=PNjNTA-M=JJA3}DZPmv~~JmX}O9w?Z{(FhnR;GCs6< zOUz~*yB4Ct6aB>GN<4!iCG_9zx?&U;mbW-?o>Re{u%#vnT1b8=n*>V5ZKpZ0%~#(R*-+7IZ9hKtwkHpYvd#P{Z8@2V@>CVM+k zJTTOJ-zb;B;RR>^v#(Kzc(S$HjtyQcBvBf!SOw9}xx`5b`+z}KIE`Fd<2TN@B06f( zB>_6q^Ae2LkK%!X0%H~LfREz1Ye z-I+8^leVc37TSmDIp1x*$+9*cN%4{U++3Rr}a8jX`gd(iI*lKO_ zkK&2aHVVN+#- zZ`^Dp1xId@U!*GQpE$@ECnY$2TElm1i0AVE?0~JR4*;JG@>E0eUow;1wM&3db3zb2 z2jD(Zu}5MMd`>)vkXmg-b!&|%1xfE%iTA`5@ov_xOGY8Hye5X#iVA=37A-Z=e&1B` z6H`|}lp-4lB~cnvPk!|eig8V`6IGMB>*HoR?UJ@hy z$2z%a4AVyck<5_Rp?dTkyTVF5;#{Qe`-qC<_}Sm2c4$#Ea$fu~kVZ3a^?q}DQF*md zGuT;GXsqIcO}S9U=`??}l{|vn_KML)amm=pZTr0H!=t!Z2GNVgU_taiOdXtYXSw6G zGjhmbdk8aQr9p*h3#whPi{)W96AB3}pi8zGVLLur0?`n*2S42N1+yCnh4g9YV_jWi zY{*v+?Zn!E@I`-Z=^N6Bhs zb;6msM$((>i3j8_fGmzXfkIGhb{P8&vl&Ed>?f0?@ZmUsxZ@#I(n@b|rT?JiHQwzU zD)R3`fB5q9-LEe2)>^kwYZhH+6%;A>qcWd}7a_7VT zznH8bxhQ|)-;~S;L7Fcnm~@mp?rdaxG7hKG7P)938By-X{0HC^O%d{Im}wJQq_|)( zKK_8$HWRHRCXBWHR~=bT%@1emo2=x(o&e=k+iuf95PkPo3{r#>seqtGLN+N1X@IcnLRTBb zsF|6yMBRVe3q4M9)RIty**BZd?c%doQTp!u!v#IZ^Y<6gm?uaL6FmBX+I&$i{z0hw z=q8nS5@|FPJYkE_^Q?X{#_l2@W6uF_&2h z4krRvmzRPG4mC5_Wu-(9Mf^{w$Fhpcq)I$I*E-jtE`g#fl7b*nBCln3{avbGsqt|D zM-8(wc8;rJ-w>DT2@W45toqZrX(?EI z23tEA@v_pCh8D&MbZ>PCvT_}Z$&x3@ZNtdFPqJgzaq1Svn4XMu?z!h49r?>ekrke| zM#_mo2((d*nw8lWsHY#o$P*+-T@Z?}x+(Ld+|1+?r612epVKou`*a@PiWI3~Qp7({ zo4K<1N2z|se~YZRE09K>S84<*g*LFbS*-3Z7q?NhH$Zr|%~L71@s-RADNvYrp(I7E z9p&{C($bKGn;3ARMfGt-+S$M6ACtfwPivd+z=Az^+2E2VxK|h*D$=CzQ|( z*Ou=puh1|BQF0#D;4TlRjczy7roion zFsb*eZnZ$SSPH?3$(SC0WqL*o&E||_Fw`*&JGE{pG^G*{SKO-{)dqw6q3Y$RuPSQE zcJ0@}G}fd&cgnay6&##)>fInd<;;ia)Yde&4yUJmLVJ9_bo(*WD{RFL&s<@3hMZS$ z+ory9e;7Z2rS?O3H?8mTf4D=R^LA)ZO~1cPn@|_EARP76@mKv12WhUNCuNV{9i+ca zbgSs?Bp$z%0e|b!kXjQ0fsYXXi{~ALVeMZKr-WvsGc;pOs3?ps5gFM zajoY1iDKbUlS$Fl`dym2EUn0%yxoyO)`Rx0# zxbZKg{8zgVU1!7dQo#378>oFXV%-o zL95V@Vq+<;-)}%?2IId0&v*n|LUD{7lvI$v7;@xDG6zRv^cKDud`*&JP4ew>R}qed zB!j!C>4`Uhdw+u}rgp2>YKL~cu>Ut_L7qnaPq33Ke_q*{CpZ-UEAH$S`v8VupxXG{ z@VwLko~LOD36_!?%`j3W=!1Q*PrX-bZ=*&O{m!qrD>(~9PTXy_Qsq~)O`I-L;#h09 zsuV{A z@qNO2nig{cSK&GeIbrkcp;vxA+K@n8Q*fQN^VMkClX#9sBpmzW2xoQ!0`d;;~WxiK-ZB^)=~xL|2W8Y zL8m$h?Jo`RiWuEEf*=m08*Z%Ikv$vTO>V!;MlgVWzpqcePIRrWGMpy(Fu#QaAIW6r z^i+dWm_1XThKmm?5)g(cmay0Y%?xx%X5frw7JpE;QzGlvOf~n$ufo8it1P~F;Zrva zZ}i7(G@e@b<0-~=f~hD`kmtmU`Y{|}v^eNpteBD<2 zWoQw3tDr|-NE{YwB62oFPON*w?B$=S2gZlFM}13~mlYeRn2F9~+7XB7E4xnZ1W7B#e!z8T3jpLg= z$n9ZkCk7ow1b?AXM3(1zA%b1{cJJPH;b*l~CLtrTNJXpY>dpxew9?8fB zD@y*|&$6tC?3+@X;ebY!4}$^dd2nZWg7kd@^1{(4Xb_WflHSVYl$*FxLwEosx5x!^ z4D(^fu1|2ER|RLB;m>LxWw`LkpVVC{@A3xT6lLGIx zkj7zgzo?Z|+$V3}33~W`h(-tNjx6_AT)qS5>ilBkVBtrysOG#pRaZ~H9BW?OdLQ?T z{JAh3_B+`lB$1r(9PSQdJ2SO!)(x@)GAq;jj#OHSheC$CwM;fG;EXyo&QP9*!TYdy zo*^|(xS0{y&V3wVQvQ7S8@KQR4jBV~byC|-!axvx->(=G5?T>N(L_NZYEXGmBgPn6 zLYD0SjqSGC3!sL7ciL*bB+k?9T+W;`vnRcDkunybjD$w;jMbsE6Z@K?Io+Qm~hKTp){n~{zu|zw zoaoIb`P(xX&D!l>N_WZ`J0+M8U1)xTg){KBz7YK%!!xrBovc9N3iy9F@T#;9Rp<}ujOON+^(%qvk zy%0I-S_OoJI8>VV{OOVIFVmHTuG9J|yIJZCv+JdNwFWg;&dPTr zehyK8bm2p;T{K1CPgX*-gs|zxf4`}$sv$Co;7qu7)>Oq-1;SAb*fH9iK#nc(B_Nh> z4|S!1SaEzzYlj$Mf@`*l%V8H=z*PUba=AD&fvF2s(dQUjDck~KZ3g!rMqdHB4HhgO zhiM|oM`Je0WD|l5P&<|Ppq*;sP6KQR0rMHnr3GncG+F%3@gIKiP$0h{e~~IMNz-`x zo_!K0@eQq2U2obj6n)RH@B>nV#LGq}O<`3<8EBifsuJ6zNs*8-H{dq@knOZY6aRg7 zARz%l!$04qbM;mlS@YJ#}DY!KcCw9M1wE7iq>HYPPy<{?vDM8v`V;@BYhyrXN(>!0Ijw$1e*FX}3=P~q9 zVZh{Ps!HqfhLPYAT|Qv5>Y>{+78Qg?rxI7V?Y{i8RN~QwoS9;!aEdxwB#MCj0xmEL zx`*aM#P-J%mAUG=e<)}*i&^rvDRh?tlPHcjyfk1r*CU5w@auE`b~45=Uwo$=?h+a= zELr#MsJ}sJ`^;LU6~J?I<2C$-Q^CO;3a*fJMRFSAC-cy{V$;7{KWS5@~J9VA#X9r$#X@dwh zWQF_-dFoCy)Uk828lzb$(b`PQ^IGN%f=CJGa$Qq`p7W{{^P#d{sX{KdjrR|gQNcEX=xb@kv^8W+}vmbk^B%^ zB1E&038>C)V^5n#c~|DoD)DMV>4~eJo?B}a#UxXKT@!9~mox7zNXOfP^kgAzhKi22 z^?z#Xh>&u0TNa&AR!o5vHq+7~u=)t!X^e8o<@%*38+g$DvUt#69Cyj_SX$d_@_mbX ze<^|Gf3PlT&R$OOl?|vcU9jaZIUAI0zrXt1bwz#wwNy=O8!-^Q@2^n72Q4^<)+v;3 z?2@=OZ3!jN^pp+DSedm&ZS7VcX-x2ck3M#7MKNg)iB5~=&6_t*Gkfx>UA9?vgKPy7 z2~}EhrYpT^QH|f`MJ8a4ss)Cm`fAp5vp8$+e;9i=`f$ufIC_6veiJn^%^Oi(qS7;I z@qZinyPP(b6k8veHn%8Yfkl=Xg`_sZXAqDQHq{#1BDq%zrA{uns60Mg|5MHB-1Y)Y zr>cSyFZR4);IL^SRXH2PBDpuJaiVH2U`4E7N|Eos1osuDpzx;+qs;CzVoz)4E6(=G ze+$$W`^N;-&5W<`hqIRYp2$F35|xvW!4pprh};<%pW2Ie1r-_Fq$O8JlMp=H_)aY^ z?Z}EUYK$2eBwe!4!I*y8|exjO|08r?vNRWzvOGA zIXM|mZ04cR-luK!-LaLs8Ktjn6zi_ff4RWVpuu$+1~F-LP}^6&0KIfGkY@P~XB{AJ z&JRM^EL!enobJf-1l!x$$0M7D2Pd-2--h{@{1$Y)J?WJG-{7lgS8Tgi*G0M&{Wip* zx{(NMNxD_AKa@}?f6hqctLwgOaR3)He+J~! zm)QIL_^W@rs966v+w1|oT6LqpF%^0wX+xC=4Q8Q%e*QR!Y;QAp?K_E6;8Q~ zqa441B5JznERJvJlqfZ@qSe~;^oB#Y(#Lw=Y9m>Yy5`<+16|87Y-gmqpz2!4|EKJYyR zmZc00$A65j2EUG+ld~&yhzzgV*N&GXVdp6fjQu9>#o)`R##4|H|C`HjPIodo9o(MZ zID@NSubsigi8H>uIU8SG1Mi)&vlGRzQVZ}Qjo+*NyAqwb%& zVBciv4Py^=XHp#M+$uES43{ojw0J&DPJE(&mXP>QutDRws5Ph?6MxRbcNj-Ae?H8z ziZJn1OHYXhqNw`pf4Er8bG-$g=6(YhM`;i!0a9i&#}P3=QjeKy0K7@CzZJA^TVoYa z->Us9!P&mtcL1`l2VuVkyuJo({S5%tuYsy3kdh^1{?la(pY9wry#>f>O*|4~3!XUl z%3LXlP+Z9wHAzS!SIor8HNh(@D9k7Hks`P*ujci`6-h~Af33X8IqFG9BCLGI3G3-X zB3$7~&bc;|NTPCwb2cTREVa2};ZgzrE1bYy%^tGQeH;fhv=Gcv5+NIM3SK3RyPjS` zuTtinIAzdMwTSg+$g~rJ=T7J{Z($mHybz}Z(+_(-ROXWV2>r7s@yRO9+<;2hTCNa| z34x0L4x+n0e;q%7fmQM2-))=Pwz*dmzpwIr_1OZ_Q>^Dd?yqG3>XL}twa)vP-Pdex zzwX3L`M>|JX_MW^<*)Mb9J8Wj#8Zu*XF=?;wT{k2Sa92({=+=BY=&e1);Fjv=wetk!FHjjsx%(1Ccx-a_lavT8e6f6m_$Sg0< z5Tb?WfAd0LTPyhE7@ln<@P%3^gO!C|luEJOD(Gwqy;sC$rctbJAsq2tOf9s{Cx*9l z9oNF^{>;b3vS|M0`7<~eyOH@pb#iZ&PJT9r=Q`z^0mK#D`J67=53@zCK`~=IaRAyE z=?rFM3-KgxOnSX_NdP<>F&WS~bPEl+4QSQBe}q8K@U+?JhzB6_Hw1Ee^}g2`dTIBB{RVCoL{0~o9@Y8FM37Ama+)HI;@deC`Fz`vMWv3yW4aZ zf^YM+Z2e)1snekp>Jbd!7^alPA;bdX#|ueTn@T2g1t#j~0)X4+hi1v0qc9bXi77o~Qt1prMs7M954{TVcU zZO6Hg)$6{L);7}UA&MW16Ti9>H2|rm%GQpi364#AIeH3{$`$5-z|qvribi=sDi;+JCGeM&u2*AwX&akNb@^Z=!@*^a53rbk$qhzVM z6!mJcja$obJ@dA0xLf85ek#wsDY;P$2*8%a)O4KFv-6STK(a}I(lUDJ5aPVi`!@tu zwzO@2%d%i9nDQ%gYnwvy;(vSlf1;gY#DU@;xE^GEvC1AFISl?RV5CYIb-I$2pIf8x8(_qr0k z8#M{<2-reIxt8M1as6o_Pt^qf@-kC!R^iX zd^|Ym9Axi~w<-Va6t|o0e^!wS>f-u(m-O{vDyPUCSv^gX)PSvlvbC9c1)ji-$E}Ug z2fO}i+ccE6aqS6Xucdve-Y}?1PHM-hv(KF)pAPP696;p~TCZRCPSSJIro=17tT_0o zO;5@IB_FPDvZ83Wjme!MPCShXIzC4E^=1O(oxh@HH|j=f@=A*Of5USL{6bmfr&ZUN zgJD)%&!kBsD{|5dm;F10X_xQQ&0L^nw8@{W+{KDX`!(adI!pohz%ZsVTHP5?xD9Bw zZTyrEb%?t}kzO1kwY?->AFSFl7X2w*`$VHs>d&Cx{iJEYjb+|V^zBPABy!v+6YB<$ zE_kzO$OfK#)HKlHe^CaqiCP?l^+b}S)sk{1%So~}w=mUl_2sUln1HPdo!tar1x>ls zzLz+g`lND8i`C&-XmU!3lRfA^cj4nlaSS3^tzUcNq8a-CN8VEnSAuof`7gax?`zvI z5dH4I;s&9%AsKA#VARV>TN+vzBhY=TOOTawEGA2yB)1JEfB*X=|ElBGT^VEgWJ`DN z-o1O$my;qZJa3JZ6NM0HqZl+VvQ=kcxdvPjqX3HV5k(@!18jr zx;|ZAMXy0$e{b_timm067gC@w@lr{OTF1+*xOhNX8j^6V%S2wv1mR$n&>Cz?PQ>~f z6L?lKZqL0(59}%wyCVkSgeXO}FrkEIxVCubc@+(F5GChP9b6`yQAkTsbqI-rszeqW zn3%p`PjsfxKo^drQRGx@bhnwd32rxp<9ffURugoKf29yiOvd!=E7NDh&}_jt24fY& zu$SwWLQ^UMafQ9gQEf1|8Oy$%4p~JV*slB9>&A-IV5f{5RKeb9FW)udQ_g&t&uvaS zbvQT}0@~x7TelxGy~2*%c+XX=&XDse+?J_F4zoM3(0&N-=JhQ9hdT7hZ~Fq(@Xau- zL!H%ve{ec<$6wXoZ=@Z?fJzg;+jD>C=#J5!o%sBwjObgphSZ7>2)u{*UtI4X3~T*@ zI3-+TPlk?XSJ!#1jv7#N%VbK9lY0Aec6?m)X?~YxAxq0|z-;$S8>=5Uw?{9X*h?_) z6nx&}(-m?}`ZjKzZ2Xtn?Bn^fUrPC}@*10QF^lt(>l^=#q?+4DSiV`gHx+5zEjcH-f zT^=_Qrl3M+Kp-FYe3kj)TF-?zX`Z!26Pu^4w67*8NNSa~v%m&HkLajt1MgMaS;Cli z|0Sm#fBk|M3QS{ppan#1!lWX!lNf3T-p;{<276;XJma%c3O?~_>A(x5`v9yr_&JYb zsv_Boqaf)Xz`6P-ir2I!<0d?wUDky*Qw&yw=_Zh7V--B1%U8(DWEJrB9l&JD$ zpv^hOX7+8>clH5|kj+lRFc5_Aeu_QxkVtTV76~O31OfyHF8uUVDN3D9YEf@2dksOT zfA5Y{3TmT<;;U!oo7uAqGdDsMC>Oa!h#XrbIpYt5ZhRD{f^v<{k!V_RDoRE90s_`K zcp>MFsV!r%WuBmQK@8Y1QsH3QjS-&$f5J0Xz2%J1wxWIeVs$s&78J=OO>9(GszFKo}UrT7AM%|QynFc5{|fBl>y zOI>O!2vtNuv3u>RP~v2&!88q-L?hzejR$c3{*SlXxSIn|ghqN26AoTu=)%hpuV>Q= ztQ?4)L=xRG4wrb{jR|pHEK4k?Sd?vTd%~bc+ioveOAIICaPZkZM}MyXB9k~#EA%5=A}+iv;+7{h;e+Xb?V>qiegbl!R1d8aqiGA{{PA(PY~ z^sO_3xzv4>XeZ~%m?&DHEh$4tpM0_O*}dK}b}_sfu^|pGM~i30kvXB&f8uUgbyMc% zXx+?IeH(4w7Y}-khGsY>gbPI_R8H1H5WQ$dLnrwpP@U3@Yo<5wO z%Y{9=tuZiZM`#ER*dS>Ke`$zXPC?lbYS)ZrUA4_dLat5N@@t&on9&`d61WD7lAnYy z=)6&&a1*QjM#lh@m$JT-jtP#|86Iq-Nwn^^X|3!Jm_xY*w*<1 zjS&AGr-hOVR3yAuzI)&E-MgH)r4wR-P$@z=^h_Fff6lE#e|0iSgi$qmrvT;ruBr2; zytW&F)A)Q0F~(=(?A{aztgXqWd7u^W6M9Z5aIcoui4fW_Qqfr)bfydCLL&`?rB=KN z8IEi6N`v&QI9x?zw$>5|72|d~Q_2DNeQq}h4XeDuNbUu-yV2Bp_ko!;g)SczFC#fQ zqBw9^OFbLSsjhIxeU%;ARak#3RYaEAa)953aTU&+3TDzHjK~g1-yGFrb4?kwx&t2eK$SMchW*T&Gd z!D3F}8#8}K!1O*7GYo-rTdjx!vLio!iA+j?ux|Wt=--;Iv+9#|1IkP$q@9#s^=ks5%e^i9lGBpB&zzIOXl>hZ;T*NM4%>9lCAtlqRlHJK zFD}PM+7m;_VYqWBqjFKFqsWMhZAh?1K5UV(FGkwg6<>*1kTF1}zd{Lbv+V$D*Aa`&IEq+GWk(QJNT@&p`hf%~xc22`7Brp!v2eF2p~Owd2vt(% zzAlR3n@bn8y0AICaF|x)(Lvw7q5M0AL7o4KMWmh0fQL|es1#O*QKXu-1Uuk;BIfP* zYqXWsepcx`gT@^JCqg*#39Px(foNw!ow|RjC|i&`=hZqG^=C7TI}QB0a%i1n%gQKk z7m#O_Q?Nr$Rt6#XT01n^hF6{!tV96@u|H|2piG8m$0#$IM^khx;l>`)mOPhk>y@*dCzrwPbcKYJ>r@I>LC2=CjYFUPW`}>= zGQ*CYRnF3Lbe2mT^&-F`;v<8R2+9)ot^I!q%Vb?7B$D=As);>3^Fd9*l1Akm6+rXc z?h&|rP93kOh?^A`ibtMXjJWh}+D@v9G4W`|PTW&ys-)P0uHsn;- z3}sYnI}IJRymuJc>u!;o67BtDg!6x5oH#3+)>?Iq9F`|J1}DjgyiNbB*z+#1Ixh5S za8smW0@Uf=I{uN`jSS?N%=2#4h#%bW=@hJpQ0Eq^TfUKW`|FSIhEqJ%2aD-!_~-YV zee*<44CdjlG)ZB2aAr4G@gJtT{H+Tq0dcmG?66G&k8_LfS@6T!O6IB>HYa}wM4hdV z8Uydgw{pcR-tld`675lan(R<5ld@9ZEDiz{=lRp8@$VlYHC^u+jlz((RvJHh`n*<^ znC&N+5VizrHXst+5ZI^CEMOj_*LEYiIfZ5k^dQ}CVBLtR0mKxKPe4K%0q?d z6X1pHtCmpPcYG0-QrRqstW9NQr`O*8P>+`S=&y?}yW1CE_UWj6y5upqDK9AdW%7Bf zPw}{at(Tp%N4naJiYeA6*!p=>_K+<*rK5dGA) z`4&QaNZo*Mi4D3j({Q8Xw%USc712rP9tg_TH+cnqCKTK6SSY`s>H3(_tp8&G% zt2|xN7|K?q@RFnQ(Q7ds;n}=D$D`r+V;#JknY!2Os(hvRVPUy%-M9V)x9|cE83VWF z%nhjmmlVtm(U(BW4cV7($_>(&oXHK&e|3{hZo?oDh4(&1cG+~*v{I#1s?=5QP*v6# zo)Z*25WxAleaCWR8{6F=-Z#U{Lj&(0{^*N>sX_FluqnUVrfLtL?xxi9?(IeGuzP*k z7ezp718=^!V4fGPjQYWv7|*t>e+=tUDeEF8(lJ9#vNa_VLpY77Hn6(1;6pmjY4;`O zZ0&Tq`)QsSmuC=Ln`Tg+YC?ml|HotLm0vhMw+Q!9M)?v-#!_{tD;MRG7Yc@0VPxH( z&=j=H?_ww!$5~9~??QlGix@Ewd~mw$ZS>NQg2I1{keaU$DUXsiA2wM{|@ zkZcGPoC6y9?(+&uap?q8XRL4;sNMaJ3zp zc}c;Ev5=hzaU73)Yu+Ks74j8LAuAM`qmTDve>6p}8I8Ta9@0+$LS!N&46q0pmTEMf z*$H2OEST979HLf;h=ny(yTmRTW-YpMK{G+s?~wANLFVNG3i7-dcQ|S|aUs|O_DK%V9)2&)`WbTe0d-f zn0$T+y4|>-UV^F%@1-hS8|bYC7fAwQhhlU|;eEi}IDnW+95JXV+LzzjXT0|<*cGlD z(t-as<@?ZX2{(PomrCzU?~DW-lSmsYe_e>dT2`*LuvlnuykP9z9%xmW^&jTtjvYa5 z2Xz{iN*MxuUKd1fv`@EM^+w3Hhc>E-P1tJc+>|};qK0=Pbv3z=V8$X$Uh1~eH-&p1 z(V$Eo#_ZILKGn-jGP^B!mR+4&`o*Mtf&3UNTqd(ILrMR@nRkn${z^x+lUwI>PYkS# z;b5gZ5H}Vx?4IQ66{%SbFH~{Mtv7|?;l5~Y~d%&cPMeowu1JR8# zYW@}x4Z4P(`O>^<1P*BoJ^2o#8=d$+mubQcrrmlMDZNSA284Xd|} zybap|w+Fioh5@&MxDAE^M!lWcj^xO7hVT0+>O#QG01}{SjTUPx8L(u*0tCshWcXrw zKrqS3OipoY23b|vhTq+BVm({11;elaVY<%${gGUPu`~FWjh77+mmmIr4&doWofiJ;>DNy$%g{gl z*Sjb8zaLq%y$qePPrs=ce)8LdeCci)@qn~f&*y)0hkpHQms_m;>LMjW z^UD_y`{J+d)qMCsg&#j5vUxF^b-$wHSuLK;d_0WZo4bJrJ-Vamd~ler3uUQPXscj0>#iUXI>eHGHG6j#M2IG4m}MFe zOS+v}{dltwe@OMm&~I&9`)Imly10jlP(;Y&bsScS`DkV~vyQH;lvolt>HgatF0;MV zJqXF}*LHk9vohWL?6T3^7b2huDJhrMnqPbacW~*+&rku#Pu;j!%EXXYuj66wR1G1o zZZ7*$(MP=Yx(z!^H-wzp-TPs~S_pXMwyjiwfLEraf2Rrryt2H`RDpn3wq@C=>Mp|}Qk zr@MvYa-(pJfxb+Qd2z?m*kOJq6jdTSx|-29FUH}*X`)4b-G(`|NBASJsNOTX(tB@? zLuOi`e-Yl*;8i|qo?jo7aeqVHW!T*`sR2O{CINk1wxMsXoAG7%G19yx)#8Ersk^&} z*JvKBGS4``y%1MXC#bi-K!$U*^KQ0^nIO~+4H2`Q{W2zscW@P(yZS?~xQbTzak;#2 zX7j4xSz@#uKA9TsHHH7hH)jr~GS6j8uo(0Y#C9;)5lS`RqEua!i zgnEqh_~6Mpc9BjBN2*eFa0%0PpLEs>k%Z#dWjR)bF(tCAdcrF?<82woOWQqjD#s&N zsU*0R>Dp0RdX(nM8uu|0v=Q=B+xHB}e_=%NqJqSM8|-tunk(x8a4FIIvbSRe#~SdY z2I+mB(a+Z36W7dNHhKzFajY4Z=5kola>=o%i*|7dW`ebkOE3{ULzG}54!bXtKteP! z{jt91gpWl%v?|ACSviH2$X?rVTsl@HQX!G*1-OzcaCN0mYag_ON`*wih?1aue-INd zSF1u0&z$yqn^GvMqjp{+KCkJS^~p*w6SKU~AsC5S z-rBj`Q>e+?JFD)gfJo(NQW#Mq>%EY8=3s<;=i{&o+n6y(*;Y`Uae~5D+{9E~{5JgM_C(vx|e3PfgROCh-+*2?l!pdmQoknz+7-rUyF2P7lS{f5hf5TNOv@cVF zk>Gu|9E*DB(=PMQM^L1g9P4r7AYyRrzF7i-A9iCFt`^TryHy=U^E~uiD3^?IqN#`SkC720Tf9;oGBE~mYVQ(E#AwCk^0BD9BG-yz2*F6KEz49XmUMZF=nU6a@$(Rh zs;r|?G%>u6F2P9HLEa}jl)Gf@Si9#~O7z3R5Tzhv*i%Y1M_O-Je^E7EbG_tluzPNl zSt2R~vZI$TMuK)JnPuwRt@p2Fg|VM25d1KJihW81dQ) zBN@vyv?C=@JaXo3e`QlYC>ohz(wG>HjBB#>%LL8Xo`YBddOp@0bgp~TZI5+-Hlz~N zWb88YsSC;2Wry2bvm`C^oonxG<>#$*34(gdLDamMpx$^iHDi{u%eqH=o0d%)vVvJi zVB!yy5Wykm^KNB6&;4_m*3DSUfE4wNoPo))sQWP#4uqg5f8?A@j(OcZF6;<=Bx{No zRo6I@zny}fa5a+M@7qC<9QDj*UI*Gj$uY0H@>{)5DDJp>>v{tB=l+VJ5=_Lg`ms;m zdKVh-z6f#E-py6J?jNvDgO9>h8Sj64f1xdf6asa)-ADKTT^jNbC)Dne={YsaLlv~NaBUldsb3p4nKQWa|Dq(SQCsXnHA3$4i`#{7?U{T+}*6Q zUPHWSy-*>Op?zAp9at=mZE?-oi$X^slYUe*4BFjYJuzxOp)l0%deGaW;tLw(<*2z7 zvtw!pzuZbaA1oHf(ht{1<$7T;JD?3wJt{0_$6CF8f2+8E&bu$0lGBn^DT38= z98t3;u1IUzeQ)W)990*--kkfQ4nCN=C!h}`#rOVwJ;F*PMa>?2>apAdjp6sNmx-24 zC7PJ_%BLuBm{L>g%E>qPdmSD6t09`3mrk0VedBs>FQe;j^K+JJ_RRYr7Q-+lvs)*r zt;@Q0fA#RSgOv^f@Ig!*GLab0)G{uca!FI1aJ|u{6jYt~+~sANmq~@5UzYLUvs*$d zJYAAff|!`hcGHeHDT2MR@hL^c9#@*Qu!5;qJw;_6*IleSyq0-c52G-pU}jp&J5-gP zn{p^v)Ew_mE$?;D+HOj26NKU&u4lgCs(5}_e~o;2nJita^2AeBdeq{M$%@NdPF)~N z*V|<}F@dUh)>F^QJ^OZq2ejfUdhspVxhyLoU{Qifc_ER#YuFo@fRec$Ntt%F`L@U> zHpLTX#&KA!Oftn2=Nj;%fP4@W?nsm}yeO2d{WevpXI;j}O(_YfN5a zf3a_0E>L>Qn@vRI*mZWt6k9Z0f{D1b)6{m$w(;hi5VJ#;QmAawN+etkX(b3QH(bGf zu`YWXdC8H4Y3S}QuPPm-M5`qcDSyWHVK#HUY8L}*nb)2U@?5~8((5uS$t59?Fga1n zZCFdZRzl)(v6dE3r=DA7KHZjGs|8~?e^Iu539T~$7A3Q;-!Bsk(af0rva#tzDj>4c zvV4jo&UKy4=B`DnHgp7loa^vrWZ9GjMB4qKom>(Sx!;HGd1eDOQpAoyPkJA4%3{z1 zhbg7BQ?roCH_5yeRTlrYl>E82+FeECy6s9nQjqN4ub0are?G+#x0^TlxTSdFf7G@D zX(6cX0@51L+5n~I*Cr5gI8oi*us&~zW(G!IuVZ^_u7{`>gGh^Is|<69C_JB;$` zay5Cvs7uX5)#UN-y}0~zbo;T%gJN=W-FW5hLrD!ohdIFfMpRfy+V;)JGN7h2A1pRIY|Rx_1Ik{uY(!;hEF(4kvsSb11Ta$Wf)wl#iI^6GpW$QF4j6KD)MN<&rB+G7;t?V zwq=Hw<`ferymt`OGcgoZe=Aj+)MbaUdznX39C6#!yow<|t^vR9otZ9d7%T@PAzs`l zK}Y=1@5?a{q}0zb&|M!(3`UnA5O$fB_dIbpQF2lihZ6|D>{4b|uT zhU&ABk}`@HJ;(f}=O`Aek9oEF*h52*7Jxa1^oF%%Njz~EHVIsUf0$5{%0ePxiJ{Bx z%?e{T%0pU*&Qi#4ivL|n6}qH(%q8sT5>OFIoZAGN}-qs!+_KPz~a5`7&um(SbXU75?FTnw&LA6(H##S^s5>m|C- z5)ajH{#AKHnT%b^e|g6+rfN9_YnYcW^Kc2%FYS0#5|5IkdGke+lZ&rlEWt#?dE5&x z;H8KhYI&35j8h*7tYN;V!yzQjxN5pd!@RPcfzTAb`WskJzS;e8@_;ZoxxyQWYH5HZ zN>?5aA|?m#8I)ilcpD9eDWzTzBqiFmcGN4AqGT3kN@d=Qf8jz^pDin&tz%YyJcfZ9 zE^m{6uNPI|gja#$^lh@Y-E4C^LP0R>5C7V~(NZ~qeTwvbkMyR;`03hctFA~qa?rBT zNu)Ryy3HYT{?_4T|S_0$vp!(Hhib-SwFRMhx-W-R1sCY5Ua> za9^74PHt?Be*~>}mAkt%V$Ow2fliAn!j>Ae^w;F*g5_;mIVQBipWr97y2h@`Ab)sb z;gNBFiPKUD>E&G#O_r|D{9NU?V3>V5^F<&y@B6+s%dxX1{Y(k0AMX#3x?E+W>cPj} zevOf!<($cg5)Yg^e)CrQVI~F#ypAV^G)X*i>nLtce~3kW-*hI&f$M)RpW74z-R$jp zU+7#|2?8-pCcVBS#tNhe4*n)cehXxJ=C5zX2xzVh`FNNEDmK?(q8Wv2k>5;b*fvHu zoGBP<4GBmTX_2>V=s(A@zUzqT%xpkVo0L&4$IRjc+eQn zp9>~sTJLQME%Dme85I(#-wt{&tbz9}wYyOiU>`0tgclvd#&3Jeo=2Tv-muTbsTm{5 z4W*!M`eRz-1`g7#Ak=+rFWbtzbmmo(zJ2|_pt84k9U!^ zvi}|&rTVc8(}>|-XbCZbdZE-BY&_w(*w(bi&rhD>QG#U2V5N_ifLP)N1t zV^XH|!jDOXzR1#t2$+;lCRGZn6qQ8Cq@QzzBJsB0<Kz8alWndJ^Wdh~a zWrec-64vl2Qb*jw&(ussr#@dJ)=W{%4w#;<9U9UIFIrDj$!z6OW6zm;`qNfr%DY8X z2Kn_Y$a9}w-7*Q$>h^q6%npBL^~bG9e}(q5(`-{bE@k?dFNbTLZm!a)TvS0g@7(Sk z^r6|D3l0ZLA(Fa4m%R7&6)AQ|yl`T-3K9pd8^T;k*x>Z?5G7QFz}_<#HDD4G~v z*Og!*#B?%>W=7P7I2@_4Z&mFKm>NCGv@;GzDpWJ=C{DHriBxL_rVw^@eYk;df3&R0 z#3hy_a*5LHO?0LZmN)R3BG_hYU+cVAlLsoU-oVn0b*E#Znv7l0ZZ>=lTT!EDHm@#o zjH7IDDk|})`3y^#K49`yg@c0F`e`#YdDOatDTw9u28l;bjEI(CA}SYPWoIwz1r$w; zvQ&Y@BNv+q%5LL|nmv2ds`nNte~5)KMQxRms$*Z=z_5prb$8Ll&C?+z1=j4*WaM%! z=4CaTSoW*x$Y=VYW=RsFr=>qeqZU?NMlM$%iA}?WmiY8ws-+53qvx3O>(+aFRfmkv zFi54pbd~i_TuQX7-uNs3B%U}|Y#h_PZo|tknj38i>Hu}t446}onH_KFf2l3U*2!bW zTH^Wsv?YiMUJ>GW;zEr#%=GOXE@fKlRxyRLA~!OL(Z^JSkBPCe%H$g5MV4h!rkBkq zTT%!u@vzQY*{fSvHQ>|jv^)6_d8As0i)@ktzU>*cw>zSqd8VD`DQzdXA-6cEmnGoXNQ^2IKSDm=A2 zj#TFP`u)kHK!KX`?19ihnbO(GCYiX*&SSzojOsrwvVjydn4+n6Xe}fsKxX*GiL$KQ){pn9rLVC}Bm=eevH#b|YIr^o!JlI;wGYq9- z4V~5^am-boIsUZ0{rso@aFS=Sth>(gtcLMauETsYoBudVH3`gcf9)A9A~^io5x*XC zGkz~b*gKWjbfS2}m$#5+6}tkt6js)-TVs1JEG&W72KWVJe+psc__fe7e{7=!A?OKf zUze?KU{f$kVFAc)-sPt~P&6}s_rhUuXaA5W7PG^iIjrh%Ik<&t*{*y=tqx!(%x6rk zeO6srERKB>%NCj9*nj)|AN*L0FLB(BCtWcqCPxpSX@UMaTbw9GAEZtbtNe=;c9d+R;Nvd-oTN)Qt+ci&aY3!H>&=Ckectfws?k;3Q9 ziqB=8K{a@Rlj?n8YVwGUtx&Wu`!FA-;V+p>F*%Oyf5p%d9UP97d|3rWBLfpsYMv|t zBDM3*amHzRk!Xb9VI8E72MN)xa9a6BmqLp?-|{8LkY33!N*=ood*k28muwOcS<5Lz zLpNbO>KASoutqGiJvjSMt&)H1RN zkqqmJf7R=YB|_J(F;k<5Z%C74Sr_{X;&7tGh9xK(8F<&66F!!7KDb$ei7@(&$nnDU ztYw75l&U;vOf4RGRat?37*T958XPVZ-+T>+DWyKOL}R@E05i3CAlv`24BBPL5~W{< zURGj6D}2~NY~EV#(~WrNU=D!+ohH%f3hU$+V!Nm;;UX)P84qw_LORBhe>tm ztK?-OOPAObN7a#!kLHs&;(Qh8>df>#Y|SGW{ngQ6x6YnJ9%)a9Hx ze~J=jSmw}I*5M*&7kpe*!akaq_2EA=D5w-i9IabXG%)>z&%TvlBt#Ri1Owq$F0pN6 za5z$Owh=`Gqt6FY0h3}SJ5vbD=Ju!%Nxt4H$D*z;(qu|tVeKV@d?={lORY?g!9eJ5 z5>f$?u!Ta$PY^4JUFbSF9FCOobsZeef0P_fBk|11uO*Op=J*T(ie`ongP|y4_=F@= zGRxQKqG)Ec50Nk>v+|o;B%V3(=@J|c6uhhCC-)gv;(-g3p_Wl88kk&DC{u-+99?=* zx6-n1l?CfsN>k<5qr0xmU887Zj=kaC8XOLkRw3Y;!2dg(C_j551v*Y$hs`*Ae@VeS z3P7AnzG6GP`0q>b7ZXY_5q>KSt?(ogqV-EkBt&bM4GEmoFQC+;Z|R;z-4}y_fH#5p zp@vx0cYbjDo{lPf-+{?77zkyJ8HxgPU%L%fO3^ba(ZKM=UJ8La%S~i*4D`hgZ%x~E z?0sqy&)f}q95ek2FHazc0^ zOV)i}m7ZhX7x?~~Ik_|#5-Gqa+Gl>cAjQpQ{ZW)KF$o<_VsZFif=Niey^g9QAB-oa zXPU2*uQJ{r=GaJ`GBf2t6XLz}`ATH*P091a&snT%sfVU>wBrbL$Rz8)i4o23|^ z`O2gj6(}i2LxqNUZQ?^dM$;L%DZrAXUFt!KD9>Tj8g_@G#R<%P&`v2 zTbsTTTIA*A6^aH%8Mm-_+`_8UQ8M)_u0)Kz3cQea_Eb+h%b2lEnT#(A8K+6fD5)6c#>?y%Oh%&a6ulh6)i3hGS3B;7Z z^68uuN~)O5LD9&FshkoF1fR%Bp{Vj{oE(d~GKqu3nc~CVD4H2Q8H1vQS$JK7XJW!% zd?E%#GXr?A(K~chJ$@p-jw90|h3-&Qxe-?2rAsC2#YiFxeS0xVI zu^al~xEOI7jHmK4Ime=Y`=k*u8X0(aeM{~>KmrZ^@P~$%cQiE^-M1!M|yqzh}O!lgmweOA3$@1Y+xzem{x= z!{7DKdo$a19h&f=AJ;PV8w!&rNYxb|n>o~E?z)*7UKDj1Y~RN4jnHZm8q3pr*}wkj zPaAuzd?5dXf;768ziE_0pqi;^yN|~}n^!m-DYi3te+or)b1nMTiZoI$IFVPCy?Q|REK4iG2LEkr=%F;~bSATksbqARJ%-nH|2 z))Y)#V{oNGv))+e#I|kQ*2dnLn~lwr&BpeLZQHhOZ=8*HW8QpU)vbH~bWP86&&*rr zJySLPKHU%E_e-AZdP(c}Q0+#7xj-|-+J}4FIX+skuZoe)Z`|QlF*EF+r`aHY7#VJS zMzs#+@pA`MAkenl`y|LFoNTCJiamg9{X9&)?M%SwdOSkE<;s`yqY6Bc8>BtffxR=_qY4HzR5o>tyDLc>2iwh(SGPirrK z82bhoU`uI$tltLSXJB%>a=>XY zoJhVjKrVILG-v+vm`M(1Ql$H_`DinbTxcEqiSVMrzJ#y3elI|DcFV~pk8QU}#4P*e zur*jD&Y<9xs-{yH7dnVka?#sIm1}pUXHZ@6e!4Iat9iXY>w1YH6^+Uj>L3!K*RA}- zd3p6)u8Zd)+QTzV(po3c%f{qGcdoFCZ7|1>?2|ODD0?5$Az}rD3N=>Ngy|&c^k)1? z5t)EKW#q=xCmFQT`P*^TLl0Ba`;quHo$;Hzhb&COg8MAjnPCtGQYz*JJ-PYc_L|SS zWYp=?Zcj;z5t7z*K7wF)rjel_X)odRAu92WkwLiELRms*i;CF*6q3$sg5#bG3+aFq zPfhreUF~vPpc5AD^mUulp+w8)DX-F)4Z_DD&HRobPJ>x9dYf+O+cK*VG=pKik}^8P zwVJ|IRwz#P&7viWrC8Y9B`{gT+2QBID^^;2($)(mmRC6xR64V7Ubx1C)VD`T2i@|1 zjC1o4PkxO;ad;ZzX*1ZvSs>7E=eRT5|TyARA)0yRr^U zteQtI{=Uf?wJ94qXS1DT6fbajq_${=4!XQUBqxRM$Jf&xm+$Kn!3J^o=v&N!ET+cs zbm4cPw#lZ2Xp$h<*T%p4>EgM}aG-D71dz&ndfWTaXtRSOLb0!IUv*Ky>kp|<#Efi^ z>-GMBbC3(%2#{&UQ6@gGnTilvgy#IiV3Q4$c3RG0QBD3CmePmUWt5c)hYxO?N1CIc zVb414&nj#C2XINZZ#~QdoAcdT!MTPXXUCR-Di6!q-y#bwzv3#?7^2X-tbp212i1iH zfPt9BPWl5Y9FLP|U`V27mhGfDN4oDZA>A}Zf98&5NQbn3DmtAPD1{p%OCeA^`x)eO zZmfpUWxp-DW_f?nk)Baeyj(f#yn#(p zfJZGAiNF>}(2%B*?Jri`?qh9pl@Rf-wr~a2n6N|w$nN;?3B@&)aGAkGTXo$lgqS+CAe)_QIaq`v8B$n8uz z!P0qt`5LA=owDReSjW-5Y1T zc6g(ZOJ9jY3*eK0Kl3fEr?LX{u9h#Y7T%Ee;kT$?Puy%Vh5ns1gi8K6+vTyfQ%%^{b>-4{ z*O;I%5&@UvN8gh1?%4IQX+7C4{WwuuD*Cf9Unjm!w#2IuEDa`8nHf1Fw7=AZ_Q60F z2w2pQ_``8=G)`W{$^!5f5|3tJ^(yE)Ox|f_t|EgcLEsSAuK*kNvq9}_(xyB8nb%{pa%HZUG=0brDS4Z-0p!Xa z3Ao^P40sPh_-XEBjowpb^cK7F^;r$*KPno%zZtXJyuGl0YlP2y;z@9rCvO$UK?G7I z)xZ%mMwcOcBt=YkN-?UcJ_9i6Cx&E7DNJwL;|b?6q2s3H>|{BL2L>!*fhUK@B!yPM zv|b>%vMLJY3Wg5)Oa8UDG)O#;<{b{dt#-;dan7S$^%8`nlI>`kuDwCA10Bh)k}(W# zm3^U6RG(6>1&kH^`Q!2rw^1J~D6HhK!N57O@}D8sSA^)2*w~yS>*pX#qv8FrAIq~j z^~M8}QRkvPFcFn#mW(og%sO8VvYoqD(VwE*^~P&X-(?cx*S2DZuH}cTx0H_dU)EkN zg}pKbr{*rSFZKt(BQ*Qq+BZw?4A=}+zq6mxDGkc2u!=GW1FDkeLCjZdAR8vcNyaqV zKChh=$3Mh>6q&xG03Bga|CAIX;@|^fwpxX5#n30qrNz}z=-FOMbKV!)UlB)%%O4U+ z(I1N};Qko<{1L}n8eV^?(f@K{mq;1dF25t72;$i^TO@ODnYfmt`sVby@bi1;G$sFa z{u%6WzcNh*Ag(ST6lTS3aHuG<^k(uVPpTHAKe zcsA7w^NDcE1%%aCSy1w{pr~yTh6rA@`SXcUkI1Yt^Vt3QEavf%QL%VWphn0}_ zZO&$SBff_X(7fhZqXq?jC8@zg|GKu#L|a>GRLo=b4iRnAHNA-2@oVyhz8liK67aUb zXU5RGLcg2r;34wC0W=0<(CO2$O2i9Xui}XMvjnfI4pQ$T5C1Es)_NY6S5ILsS82$5 zpwqcc;3tMujoE*2E#TH~KzQc3}UKSjumYTdS_#TL@9J8hG*;7LQ6nt&;U; z!N(w0?3TH{a)twkkgT0u5xGa5#sH#^;A{_s_ZWPRwyy9~f_nB6dPK2#r|s+XqK5T2zOG>GTUy z3ggx~R~rgaDO#(tEnn2>Vhj7}imD7wPL(@7WiuWnJjM3f$B~mz`1K#lw}lILCO**} zG{hm2!jPA(%T<)vSR-Xj{vpW?5n+wH*HeFO68-Pl5urQXDUu@Hs4!IOj;-B)%G=Rz zB|v?8ng(@$iXSyP;k7Q_x3Qj&(F!r^3kky*`A(Parn=ttwZp}Vm0U)9o3YxsI@3wp;0o;P)d_^Y`?$ZVJpv>=RJ-4p=a$ehL$h@ zq)+fLmPqqRWAra!7$3+rz0v4rriJMBV5HS5Wx;=%}iiWrlr0qG*2ULdeP7>@YKzsP$y}@&~Hp|7# zQ?fCP{m7Z$QaGZ5rB5q5#2-`T5(l-r zvkBtN%~kLycPq6(7dqj3D;S?b?J=t@4Gp){Z%R1kiw$iAX-ZDFO|Nmloykw1>X zL^W<1=EP2AUt{X;yx_nk()X%Cb3dfYZVmuS^okOw07I=)OfS&nxiFKro73!NFZ&^F zzlbgPC$Z!PkArbSS&Z4^HV2e69deOT+=nH#!slDOb%u0NyR9TKYuYmT?gydd8Ve!&$}>4o1r zDZU&g`XkW9_Mnqm~@Ybtz?Cl-~xda|Gd-1V+$pLX7LKolN4i>fyMe*wRm+ zyh6G$A`qF)YZtkyjtr)0SH`HKuW_e;8%#p}tATb)x)^*Gu9uRG+%>4%6(bu7Y%}G^ zS|5g+ve69HL55c7s0JC+`8v?C3*RMO58hYKhttPH;I7nPRZCJY7?|ZeMteuD)|0Yf z0(et?qL+G83>jSi@U&!msgM6<0xS+v?8*N3ER{&TSZkauqopkpuE`I-!I!d_-C0P| zU#8BfN`3P@0A|bJW4sMo`bD1;R4H1KhSYj$58Fyn&;@P1bpt{dq0T1K_5uK?&mr8P zq%{j2_5=pJL%iMjx=rYFB*=auctdXmh;{M*OTKHhLoVt2fz3p#xJp4^EK^w}r4lXj ztA*l5yuMS9<0OE)-+0}4CTJY-Ha{;gC0o1MAyA-7xB2@v4LiH&PB|N+0QsGs{LfC$ zlc3RzaFT{BEq73U&uE}9q@>|8fv`LLo;5CT6cd2#%J38Q%6Z8zmG9hPRixDwY`U2R z_lKEZ#bfU0Hr2y4gDrIk1ee12e4Qi!MpA#pmXODbro~EkA+-&Egteamqy{)nW9e9`pg(fT4oD@kzhK9+Jdhw1s-ZXtDKxLL_6 z@MbXFB3VSD!G56<*xD%MgMXu!Jw0dSU|{?)B7w~8oabHVzt7b5cZiBxaBAine{!+Y zwsQ?1Q?AmlKO+tn!1?5LDPCak>m9BI6b!_GXzBa~9DryU1p)s-f#>~!_brRQz;_7n zs}FFs<&Ojqofk9}-zWcH#s{wmzVkd77JKcuWhqoGK|~*>AY2-|T%~@>J~xYzZt$qOOkg zwhpN_Bwb|iosQeXo#wE<)o=_lvO@Fi6xr&iqp zY6|~TSw#vKVvh&^Qo6mge%&fyxsZUr5jJ(p&+2Msq?FM%1%cs-LZvG zHbZg+g-j##{E&Ki#kTnoV`)=4{Qk_uxPia1&aBH-LNJbi!HY}DMwgZkz%m0C6k#jqJ+FB_n6!G65?DS ziEIS$z?SfnGOF#^4^=FWPb5eh+u%bl=yv%Av}SOhT$KMPvo(dgtRFnU@oV@p;D$7t zbxSiRX{tnFeRczzibNkQSzmDjAL+=~{5ME@x zp<+}enpII_iS%p?{>=$wMbA4tbG7ZFY7pz)<=smvbiFD4EVc;Lz^4;?!j&4`+V?h3 zP)(*)DD-w@32d4wDA|1i$8!ORA-uu0TtGvJPB02LkR6nu^qKz*_%CP6`K;kuoXSK{ z5a%Ea!r*5rQQKvxY~r+>G5kf(!h99HO)t!m#NJ>y$xAXzO?x{=zqmp-6y*~<)uFhg zNc;CDsXyZTmD(OP{$@XJ0v5h8k6Sxkn+w3+!G3a&F2n1nCyXl!cNC*Kh~F27t=+r_ zLy#nJfb{NqS+_%*Il@88TzK`(>xPQ@$WWtJkFm%pg5IY~rf{!S zY4C~v^H5w5NF$vEcHDPgYDo;iO)8(qG@sL*3_oO$0m4x>SLLTsqjaH!i$Lpd+RHQt zgW>=N^{^i(hsPpe`@hUeWmk-mBn0IeMLs4{;R*MZdlO@)1X^rZf$$J5y-c4ea4i@N zz$!>EF+K3E1xN=(gJ@Z!0dhfrpQ(X6;5RDZYs(`U5C*!1ng}=#-GV{@#DQ!Xzym5m zv?SmH*&$j)aDeI%EfE;NMksJA`ezQ^AsTQIjQJlSf%>Vsq5xOHRmi|$@H`MW3l4Y% zV1dzqz&2M+A0)>kxno;4S#iJ^=h@Vje%-r%BK&01fN|3+w?W zzyMdkJEQ|i+)OS5j)7-B01M#YO8_bu`2)}grhETX zb>0B~U3(c^`|{b^ef|_E&wzPw5F!v8tnmcs0^2=)s)4Tn3~==WU=qA?4;TR7-2s-s zur+U=&<)@#(g6{<#Li z`KKGl8Q>V~{O5Bo@uz@Y@bn2_1blN0m^; zfGx1Y?@!~T-A|LjozMBMw?9`Cp8zU?zi$IV!17z4s?X-5a}$=W(#Hf8;DG2t~p zKlt0~r$2b*(_(ZPFbw{)^l5>+^f|H2;%Dn~%b&l{1P~qEF#ox;={dk`OX4hm7oz3w zBp@HE1!@9t1p#Il2duUv3W+OD(lraLZQb9i#&jvTQZ(ch9)D_bMW4Je$$FUbs}Aq>m4 zx{CTNpi34{Mur860J9vd$`1o6ewMtikR1-UbJX3=K|sf{e-<3Y)~#nA>Y8E8MTPQk zmm)EQo-`CT17FaVK1nd+pTjLjNyghrvmm^@^}TS1%%LQC)@xqiJ;|9pO3ZT zr-sJ(L2h?~(RHs_wMtZrGyYtR#3POTI({kDqf>+l2UVEW`G@!-h4r-74&oMNC~o&J zao-r{XKg=~#$>usNUNlj_HbxY%}^;l zC-7XA%8A4cqudgH-!^qicx^z#bgQz47PqIb_8a^oNZ5pNJNd+HbK6_EUG!=?*e2?z zrpIh&E8$Gh=--hkUG)ZDjs}30U*j2`8)WhHYVaespTd*=+&(Yxg|`$nbK+}y3)`^C zCL<6}tm9?s{75$9pP6+yM|vQm^4RXL4B+)xaWsFR(Do(;cuP3d!`e9P-qXy|WuLte z%#)Fo`max%iPB5h(j!2+=(pgRr^Ym4^1qr_5r91VfH$!V{de9R_1cMA*hH?gO;CcV zs>LzQWMEru#t^fDOu2cQqo{EgB?iALCq(=5$7mq41n45abxLU`WWe`UqtWOn=H={4 zC}XmD%SmalP;Is(HtLjHr! zK-T+W+vwKnJ+DP#7PEwpn*!F8e9KVjUZI>_!n;!?~oI z0!rFA@27dOI$Hj?{8a9f5b{l$*=8AusuG4J zQ!zlEp!=bf5&y3N6L)v=`=jX=d$IvO&yWSsASSf~F=Z-vGqcVWlND;r?IT9E)hyJpWKf2CW2EeoL{Aa{OqoibFHq3u-L4 zo_6i%nr|YaJ-jJyLr}hCoFM+78&BDVx82N8`)WKoCxzPXZ@3WxIwPq^p~1x{1UZDn z=40jq?25)?y^$mhW8+N`A(eYCkD50h@i}3}%e}-ye59*Q(6_OQWRT6RPnr#f9x|pL zU^$TCXc8C?vEEAi`~{aYl)J85EMz*P@}1$tfw)x@*V-|LuTys|4pfcyT`u?_wDJK` zP!?O7gAtF;g;q3|F&a=P0Ke(fTgzrJX_)}O5{ia!A3YHfBG)v}r3;DoLzNhTAN`QV zpRp$FaJ}>+?vLgf$GT?4-16m6>)l&yP1tWJv7)ky6Y^UkX%(py(aBqDTA^=>uRmOW zy*#4AKmhu_(o-NkLqPK&aK0Fpa}nWd5KIkn7xKLlQS zMlRJD!5Qf7C@&$kLI`884IjVqS7DQ$tM6Iz5g}c(UB_v$kWMp1=@$EyT zaK97OB`#We%h|}y?N$xfcFeNs*d5nZ)v;o3UH1K&zv}rO5C%FtpN3zgy}5xg!?!KN zG|^mM&&^^J8jzz+MNv3AyMb9RBz`39^Ay@i(d<2Sq3jzDFGhBKf@ntx_NttIwh``8 zYP8S3zuDY1Di^_|riKq|m}_ih=$#vx70`esDC9D7v=!t^qu7sOL`uWOTZ5$Xp2OWP z`E7oOCU#$Nb^t;r)JZ8r=c^?Jze8tjx*jq@fl&>Kw9Tl$t2fbf(Ty%Yo`&FKeQ@Z^9TJ-ot@s-1tmfeTUQ*pz ztPS{L)KT-dj79Ro(=tD#1{<=TrbI?;ppNr$*onu+{Xuc5tO~jhUwD*&yvdVx%%#HS zow!7`n#Ao|!y%>nTXr-f6~P5vSpi!?p>6E3d#=I32t-ai9k-0Qu0u<~s$`d>=_^?G za~}z#4iAjyIP+P9)ja1O4#Yf-BA2VNFPDC)r!nuD_X5igjE{=x*h2z4UpDa&>H>aq z;MOfe7=VoNV6?3un+umm=;1h8xW3@4%1cjf#ZK;R-FwqckzzL!A&@UtRROy(lbNmA zZFK5+@dStcNKF2ruacTOs}Aw^cwdSh7Q<6m#e|6G{1y)Se&j}AM4jrk^!58N3I+v( zWQMr$^-53Ma=4*85lR?iW5mc!)-uSVmyfPZP8~#>$BofITpfl0iL2=Oca>2S)$_%M zTS-)Oxj8G_-CrPr0Bin_{L+?~L+pn67H!K$uJUr~%ojAvK*! z11AQ#nIki&_%S4kHUB5?9>j)}sw379jPXc-;EI;dfSAY35hrEmGhYeEA~kUXCSCvT zmOrStHXc?q(#O}}PcF|xyHzlzf_~~&R|UV7-Um13=3x~G2ODx3f|xAzfgVqVa;FEM ze)k~dnKA0+NNM0qHedhMDUe!wINS-waZkQc{eoH2$pS^H_9%@*IJSL_ZmEVAOb3|spotV0J8^F=F4fms793dDKO z2SOzgg{NTM<&dDpApDII1W+=#fK}C!N;?Gt8uCH|?JT3H5AIMF^b!0$a?bD3NR%0r z%RF*sc1Y{6Y7opQL+$2*$xJ~3(h+GexNNJ~zpgY2-b-4b>H$y?AdK=c?Aj=)QEbJ`O6!Eh~BiK4a$~nSWXj`MqGw4`Cp?JdDJ~QA15knGJ#h>WdOT zf{3Q)Q^7REAk_QmCqG-ClgqoNU~(b;1JCsNp2j=x)Mv<#L4Y0Zrj~A`3Yx7nFMVpo*XvdeA%6; zdzbH)8JP9tl=@tVd7PuwCoxb|L1uXx#p-o96hXHCUBog1w0R2TM<@@BK1AbTpTzlT zwk%g^AaOcep&hfLDPX95=ZWd=nN+SF9=A;cs$)5v4eXuaIrl$)KKM|i((NiH0 z@+D*%&6|WVQx-UQ^drPi)y8iVp0MRcmV%t6D>v~*m4o7F`NjF|FZI<0FoFu}_Ngyg z_;v8YU@a%Wk@QS$NK(ld8RNBEwrONhB>nl)EU*tCkgzH$1t&hszzeoH%0Gy!cDto) zjb^-`idn6(vy*phRpRUef5LQ3!GQJ=jk^iiiyl<4RB^Q>8j^|S!bfEuE1Gu&qi@?; ztuZE?5YVH)-aZZ1<**aM>;urSnjL8TxT(l->RK~8YF9aVBgu*3P3%0HFx-TYwaGrU zmBOzM%02WgOkz_!Y9kR|^#~IsHm6S#-7hApU%v#n*hOB=!y8-3D6S*dC08VI4@AWG zsVug6C@#H^kFA=I!xT)fv4 z6Vvw5fnwh`v5D0eS>@egt#Pl`;7;ZFr@_<-`iB{{`wsE-im%wbd#c~Kxm+?qhtUJG zHuWpG3Y72T%|hH1Ka{JiU&B}&{imUVQ{*GF``=&9d}k6xbOQ3m%H1mKiF=2j^O_y|kb1PuXv;E3 zkYAM77B|hUpBZVf%1}4>$CIYJaz++QzWug5QVWHaq=#9`M)w<#i7CG*hln6MzGIR1W04OAffd2EYv+zQB*P_19L)q0#r!6tlzM|;*TS%ezXOU&UB0YL17VBM#27BwEEsx-9MRe#F4CjZ+>=dY!npa);Q*LkP^%CN zv^ymV*r#K;d;fRWMXUoKm133e|~-?b56bR3Yrs%1W6(v-Vr_A0M&=& zlwCPaZ&`Qy?J$4Me^m+%`_nOK1uD`=sldP+_o5&dyohHHWxz{qwh92(+hd(er%s0? zgdEm3igv^18gsx*HZ^=iPUE zNO7L$5dLJ}n3{s2eZ)6wmdQn=^<`LiSM%1fNqZ&8yuLFW%nT{G3HHQ*7(5~G#tE}VZ14j}y)*Y4*k#`MR(-owJxa03Z!GCj zjB4F}SJOzSs&Tp~wQ>dOT=9X^pl9HuyUdQ{%$F{tKEBD2V5WXKeRUV*glC9#snBPK-# z9J5eN(?)axts)ofh1Jdl1Dm`e{K8iP+8qh`aZ1UL`%7{0@Y(~Vi`dn_Nmjy#%LXlo zk;HLHORI>R*DyOfra_rUH)Sxo0!Mv2Ls~|cPO#(tn$;m#fMEXcocz)vp^~Hsxo(^Q=3Z+8YWJkzbIR^X9Xq-p`cg>5V4vu$a67XGfBKf8-7)i=vBHja zican99`+vBI*1_?`5uv~j(G2wwk|DKxnNJ74s|4?=us(IAyp?HzNvd?MVQYXxVeWW zrT+Du5VrtxnSfEGo3p=cH1gd>)xr=s^JFSKJaEl`)uYN_A>sex66z7<0w@;|!19X8 zx%8LSjjcGSO5$k-a&_3{fiEO@A*)E}Rmxi7pWLY*K}6dk(O%o)I!R~o`pQnX?ztTm z#wvdg3myczq1SFKgVJh=DnqL zm_tq20)z+(%Hpo5uxI$AFnDysyjLpNomtZ8I%`$hl}seDt_85gg|RIHslQHo6-If} zMcnPkw-{SdJ2X|DsqpL$YfoQ6)HEU>&$*gE zDmr}A!Hir@m@Z@xiWpH@*%bnBH8Q4DSGFT+f=1bsz#%Me38$2!pJ@|}E67+9#A;zd zMi(m18cv}CmnRBe#W3d8E*Y`Q={5Um4Q~pG4FG=A-*{p`S_Sr0AC)17owZdW4`j!6 zWO47ioEJnhIFb1q;vXecgQk3)Lm7!|sFTOPx+^Pwu(1SsYsiw{c0BQeUh9Ugr~3$> zL8;!{dggbSnc?@V>N?E`FcaZ zlUy%FzK;nS$;Kca5)*MqY?9}O1VZM~eYITnUO20e!->wbn-t;j06G(cU=`(<8$R|Q+{Y4y zfsU>LW!@DJPD8rmfIUuib0y|2)R01mh_lQGq6miFXqN|n2W$_@nb0MwOPvQ_@OwhM?EUXF{p?|vMp-Ea4c0le z>dH96P_I%MbR2ppo^i(xK)PRZ*cNFtBNC63f2&;CHeg&yzF(1uyot07lmeJORxtDo4;ZnNQXVtbMqxaCupvR=sByD@o8+Wn#o&fb0Ef^tCF$ zdJhApl`wTK0_i=u`pxxD0@SJUeE4UBt1GagW@TcF_a4S^oa*AgC?g zs-Hm5jcInHmPYg9*lce3hd8H1e_&N1?fl999}l|b-y-U-9hTAI_iQjv>*<^sSTqh- z*}@V4dfJxOcG=B;3K0jlT*VRnr-&GV#b}nj+Wcx*pd;w`gie26JJ7jf^`VULM5Nu6 zay*@$Brg3dToMk07{;d3*U8Zfr$IqNYZ<5)!pT}j@q(j~X+&4p7@cPFju^mt)avZl zBN_b;=w6sJ_h7=}#XvWCJBC?abou?%(EKZF5!Qv5n=FNYjGK~(O!v=hg~*p;9`n(A zuU?b4CuWY*2^3F`#GpOhAJopf70OV;l^qy!N*7NFh3(T=OJ@J#E(B}=F69RfS+vi% zTdwm-VuN_qfH#&&j;yjysxtwLQBs0cX%?Y$tJ2{#-!>(Y%t4!geyVZ zS9QbPP4qRD(}&sPw^q2AR0zBM3F~P|I5WTM^B$JJ?-mb;f0!T}!hPEmR?>BdWI=H* zL%6zCs)K~p0F7@QGv_U=WR7QYSW6Z@Rc6tFNCpytx;ztdZ=(-TDKAxz0pX^7oSxNF zr~^=xtoy9@zq<)m`B2m@OHAPBHJ^$4L)Cy8pP=s^R;b@Y&5mUiA#aGsi*dGHAlw^wwX7aEj_ZWlM9gbjbdiHT~i zYwu@AoXE~$@1O)^0y|7xq2aFJ1!J|fxkRR`#)CM?km}Waw-_3NHB;6$aOT&w*79oU zs>p2h=Gd#OQ~Cci4aB<$j7~moZ2~20mCoZ5ZQ-gZWbYal3Zz;3%B-kzet!>OcSz#I zAS^^^jnb(4C&(9w^iddj)RQhnn!~TkJn^{(Y!tFkxfQCmbiJA90E{x{bWg8na zr+hb3gRu}5BVheGKIObKPX23PseE-z1Dk>7&p9lM>W+?1i?TrmQ+Rg##;!hpz{OF+ zItO~sEE7XSq;nhWRxZT;WdwJQNB%%x8&Cy`fM)P?2Eg)2quAZacq z``13D{-Z0!f}x|iB?BE)ct?h-#QFJlZCk&dHf&Ci?()Jhu|eEoSk)o~ig&C$-ph*O z)3?U-{1bplSLve6b0^-X3YbO)x1o2`8-d zn=}lE!|cIZ@K(Y!hB8VX1)U#OQEk@xB4+cWVNi2MVV=9}G>q^al^L#tBToNJ4dyO4 z5HpDYZvR$8(H}$_29Yn~%16^OWX6b@R*?kBcR?@&lc>@X4taY$X+4)?a{6rBoqd~O zzs7lTBYV=x$9Opz-k962N?OV(Tg2wQ2-Y ztkOx=c{+zm_!AQrU)m4?ogwoq#(1&-nkAAWLjkLH!*lM*6;!%RS&*)kgIP{0E!Ne_ zs~2Nc7H=Hx$WHCmA-J#E3h%==g7weBdM`DDl=<`s?_-AazLH*d+bXm;`4 zw~CxNAiLwr^xz^>(MQ>PRfaD3NrGY9obh{C&J(6-X|;G_++j)o ze=C^JMhF%LkTe%VwVR90S!}~7to*nP5W*$JJ>^{{kEEA7tp9}U7nXL=rX~D{oRUD5 z5kB@k-Y*%DhA`J6%9J$7i z{Ot*hu|ZnP^giWbCt^LkwkkT*u&Cyh&ER~{Pr)<%7;aBuX@k~jkTyKke+%r!qLEvtK+ zl@}-fp#!2|u?g%&z8IUytaxR3P{^!aq_uo8r+{!US3Bk(^&-BKBp9`ibOHa-e;*X@ zgkrMiqAPw=XO>)61Mm<-*! zV!IB0$edjzkqmz^`hUpYO)4r~x--50VWk~}S@c4#R)b2Il@f+SwAXV7eEVwj4g*qA zcCWAsGmg3(CyOY9s{ZSZn}<7mo)?Q8%dM=uT_x#$kkW*=7`3}NE&o}c4%sK|MT;_PsG(>>XB9R1KA z0vjfImcb2uwmZBTsHH)->57=Da$ZDTH5!4@RDqTt=zQyEVsew~^8?S&IQ2-a$RxPB z1ll?+kyPvQX*+Bs)CQ#@>RVZyH*)rfD}U0j)h~a}r)(bp)7^eu^X*LxwuqpB#Uj9T ztsNk%V9cF`JLra@rSC4zl0)9qV&8Qy^oP-g$iAL2Q5;J(Ov-5<MzErwNd7L8+ zIfw#K(KreVU3EHY>I^hr17)G}?Dvu$9Ex+9Zl0?{nz9$l<60Z+-cdpK#QkEknc{%U zDCtY4?H`Kmh-^gfU(AWT{!Mw*!14gRujU)vI9UUHn1JS8mT`Wbo1!P;a|+Bjkvp?X zMj&K+4p)&nQkh6SDciao+ z&$4evUk*@`*+!Dl=UPC1aaz(C)!5SbJsOhkUwbZMeq_eC^s*)Fx?i=G+Sz*Up?dFP zZ7dHcuQftfU)GuTotN*P8qUN&XmF}dai-y|)Ak&s5jp0DIZc`ol^g~KKeCrIvHQ$^ ztKU)bz^V7bn;13hVTf6KgzSG3XCp`uqif0M#-wPExa920V|z&OKzlr} z9%td9}d$LW}gHxEBunv8$uYC;O-8&r=7#e33x@ z;W&|-s`n1^TG<7nsDz*dzO!CU+Q``b0WNft+hq6jZsE#8;{ul9 zbC$=%VQ6=#tE(&!`E-&2^&A~P@wm5XB<`%r*-nk9xc469SVdDoqgp6hW>=h1_{k=T zR(PvNtT-g+BcYaO0#ZBOFjtaSgrhK{JF%uJmQ8DYXyWnop+}>~Pc*F;){| zB~|mfc{IJ`B$ynq`%Y(Y_>T%*4(6AxM5zboooVd9=9UuVySM`Exi~?4D;6Rd;>#Q1 z9Pi~+e^hQzwvqpNM~TZ6zhV=P))K`G`WFEd9+58=do$QS(|b%d6>`#ZE%B!Sc5|m6 zQ=g>4pENw5q`|3yp;-5%OX73#dB&%8yKW}oYvIh%V+rONg z+ddo)$G_RKin3`&3Ekvr`%_s7Jq?Q^ZF%)n6_vV^}Q<4uI%PBv4hxh;m0jg)Z3r}lJDqVmnn13IcJ<72Di84cY46CSR z>xK9NWcpBza~a=IRDi9LfbzYbDx8aSB~_j7?px3(&Mn6m&AT&c?cl2RIJC(2s+q|o z1M$aS(a(P6ak#!(&hPvRGWON)ur_{^<}oH11w@>hr((ln8XGFd+SCm7o5lj5tnbX` zALb0hVsb7kCNw-gP~0W1>twAJjs(n%iL}xo9OFAps_H$Q_7mKj50)PuNUcV%j5li< zE<2h%uuVgVjCacfRMa7va(+#&OnMM5Yuvt&Er`hgT!-+DPkyi+j*XLH@sku6rPC|;2p+raA!by9dOq^&9a(XTanW;_#|v*v+un&e zdT^zxi}!o>?a*fk#1cF3T?9_cA>is&4(i;tNgXmoVQkDnph)X)dGGd-Sn_9E0iT%o zuv<)iM>wP-{0{kzRkxSsA%T8wYRAFLu0(Oow{O8?)$#;~)VTt)$jHkWMYXtY<#hVK zv5AN)-79S!+-4^{Zj~2N>PFOVtd#g^k7XrGX!vou3p&|zy0=8n)BRq zE$1k9a}GjY0+Fz6BxB?i`3vq*5w)RtVy*^A+bPR!smU|AtFR=oGv9=qhsMvtV(Cjp z3_6b(3!&z|d!@Upu;p?S^;JY?-~U~CGFLYK!jP>=Un|{3OkLT>UqGlK67@{g$*fr6 zjXwSR3*KxPPvs-6$lD%9Qjg%~iyFww^STJd<|1NL7d#&Tu!8%_vh~na{CVB^2{531 zyJrrk*I&4cviRqDdn?M_=NT6$Jm2^~0E9q$zgATL-S197V_xxTh3}WZfecLn&6f^> z3_St*mrQ~TCkC&0aK`HmmwAE=Q2|Vs%YqD#0^hKgT!Rcye?R+$slS{)(D;D`$r9}_ zTAvsVmi^$w<7k<3rA;(AKNR=rw4*vi8lXT8YyQ4D9LJp#AJqJtCJ}gx3cGFMINhIc z#C8oj*t0+6oD1)dxtqhI`;keOL{~wp4eGIm@Hhc_h0e{t3O>5&Y z5WV|XXdwp&a@w@8BpVhMy6mM;*sDP(@~AOYBvq38!P5V}vK_mzV>f2w#HtU*maKVi zo@U0Q??2Q=1%V)2Fp5w>e+YwR5TvGfjBZ{iD4R%OqFeLGtJh_~QbDsPv~}Z{Fb32@ zjJ13=;Y5Q;xt*c~N`wvm27kz15oj$nrW}aIoERHUm-)o*YqUZU{+({u>HSanLh0A} zw<|h_`Sn%w0YqUUVJNK3tehc6xPd7ukh9Bf+%gn>=+t6CH4qEGwA|ip)J?{>B>9%# zHP}>(lJPQlYsf&kG!RaBA|7xOgRlupKs(Pw%6TTolT6}cdgRVDO;>zbl}6ru>M2}1 zsnRb5PO1MjS`+6In{Xhw6v9PCXsk}eJ(_H!u~{^ilK0ZOT6BuYJ0g{_Q}x~1yST!= z!aQG(<8`HbOe|Rw12}VihJ4F_itjO^ro0e_WUYr-%ThVT0;&Y%p1UQGu>C&Iw7%fW7TQ7AE< zY9LKYl1|6)zpqW&YMqlIessBL(vv3do2TcH$8owyJx`DXbxJ708;Nn~d6{;@aI&J9 z8YYDf-)Ah2>-V7-XMz?ZSQQgd%s58VV%X6}F);^U@|g_>P(=hTcOo;?rhf|q_>gSo zeR+_#5S5ZDq8y2eIMJrl9oh+Bq0YF05rol8mQ1txlUz}H*L&#G9`^40;SVcY9=61t zs@s&s(5W{bz7d5UX z7&~_fPR>NBUdgtEkR45#Ab;w!9a*()sMWc3R3QeygaMyQVQ^It=>;&Al7pWx!4kq@ zbA~g)Jw!FAtp&BC>yx$>vzw&XspW>1c2=|^ExIErGi|M82VnP}$orktD&V-lsqi$F zon)zXK_JCbp~;k}j1PZ>w6_c|h^kq8{{`3qQsre3b28UC1d(wbz%#h~HLkpRbru-?y7{4E_SQka7$Q z0k>Fj3^@U}y=x4c1-Djd3}yniRcH(W0hhC945EL9kIibsKn#TMdI}wKu&;Fj#cn7B zQhE&Sb-}1>ZM@+9LA%=qO5VM8Ow(iMG)R1-(bIDrBY-EzDUxPaH}pTQ3B4LD1&NRVDnOwv!3a#eS?#YQ-l zDdRvMRsUMtM>!wDMeB#=ajP3{c3btAeal@jYp}Yb`x!PgC9ZM3wkVGhzEJ)5MB8d% z%KRe1oyK@vYW{Y+!WDkEqG1eC1-G|e4D14z1zrrYw~t#4b^?FJQcFt%F%Z7zSB%g@ z7VLs<1##Poo;(U(7s_mQ)&{fLkOx|&|J`P@*cJp|2j>t-X6Ad$WPWYdhOvf(LQBA% zw^I0(-xzX>v#ewqJ8}jE!Rjt_b$Gn(UxYX>E@z^k;$l|aOG8R(Dj92o7GCxmIy79M zQdld3NqmL{=%9a823Jsh0aQJB)D7B(y)oFu#EglELC@ds=R5fkK(@e71{E13$QYJ< zuzHW4YPamO+;kZoC5V!3_eMQF5tp89aw@e6{ts41-k-TltjD@q+jlqC;)Y{9M`iyi z=~bG8N!94+6h7{Go~Iu7s~=*?1r-NB>|+2QcR!}4%SeBJz)~LVITb~@@6B1=Z`(Ey zfA?R(0Dh1=JI$637~(oIA%+>&k>z{J(>R z<^xK-OfX$aG2Pc#?5|kbE5b(UM!gTnhV|wwRMdng;XDFpW``c*Gi6+r(4xRX-;88^p|}Xf&;8 z57mFKA=_d)xi>mgTNSOMd;RK_{QEAaknAS3%<}?KD&M_&?bW(Wc_ckW4>9*IrLkBt z3WGa95lI?)8xr;R;Q?^Pnawo1zP=v9Vnds1?=d24kQCVt$aPE6JSHQD z|It2z3m0YnI0D>nA}LbyRKrlL9YwRw9@&2&HW3m6^nwQ`AQH=9Hq#h|1QHthY%Mq} ztbmIe#ve5q8pE6CUA~2BW&cTvKC_AR8tnyPrxN^%G*y|ZFOKfn^Tw-3zuVRPL8p(V6Do|3p2(qo##u?npzbWfOAJ-RQ%L&H-f!)b}?D~H;D zkz!P-p?En-%^z(sq%8U}(I%_X$xw5BYEd;0D*cR`G(98c{}KJaahLhGGQeD?fJ>uK z%J`p0VAH?tFzo2%st3KKtTbHW43~eOKfVMfBe?P$?r#}+Mjv^@jAL%LsOc{+6l)s4 zmvK+inF0rlBe@-7UBb(iJVl>)YwGRdqe=upe<3jczOl1x3zVP>Z%xs?6K(CF~g7qZWQ&_H_6C4s&;?yKKrKb zAA#Ir?;3+ZjtR8%wJ`o&>QY=7#9F6?eU%PG?hzmF73i3(#cr9X{VmcFWNqdO4aeZF zg*9!DU^6(K5o%YbnwF!#d8Kt@Am%vl$1{drQ-I2SX&uhnj?T-}9r zZ}+I&*5q3|+iH+6IUfSJcB+4DGB4MrFpfvJ;4gRAhAUBPaI#Du6|J(2fFVy*zoNak zzb+C;C=w9LFuA<+&mTkh^s4(|Hr*3|w7gceEhC4_TR+>{v9QN!eXO={hEZzwxH3tr z5#^Xo`a4e9<)*rM5laQRTwT;}1(DJo+lI2j$!`}wvT|k`aa6%DOA>#I7_VRQKZ4Q? z+Xjl)OLxXMijg|=G)Cg+^KN(-cEJiQx0D*_vcd+Oz{Yn6jh^FKf=O*72GBzRm1)W>yhyv0E2h z>$Ynf8ve!eYXz?Oj3ptVmvlqn)FcY$4h8NelE@B$k;id# zdCW{?Nos-g%Mo$74OS^BZtU^XGv)GpD% zc~j$T38Y^~9v8N##IVyx(kjTISN{>L6_yEoVGy`G*YAoaz9vgnf>YJT)Xj6j7k>q0 zx3B)LeX=~$7W+w|M#BrizLtvkRbSc_wn~GcmDV(f6N^x0Vb#d z;uTtPrenR&p;(Olxg%)`MNS!z_^V0RX8R@k!`LLcow5j`*>vtWTry!2AXht(Nv7UY zqcf4w?JOt#WrWLT zzpubZd=XC_BA1%DG$7@3T|ZfKjsk6zL{J#Q0JT4=xYLWYyPD8mFsc4M#Pyj_$7$d0Fe(TKLAU$Q_x5jj4yL)jbb+ z8!oV!y2u?B28M+xjYuDdVJ)e$EJ%l?ATbQOEJl^u2X(lHbcikY$<4t5;QW^aTU~uB!Yoq&-5R(*jG!ms_p4`oFTD>(HGe!GkFka5 zCZE&2y=8_u*JjMR?6iyHu-yk;fvVpU-KzbmsZ6L!suVvfMfczAO`IDq zf826|I#~w=g%R4m5MD!KoyF8ry*9dE^C~gq(mU_cOX}^3>9uz=9#u2n3~8I zl^5;E2DxS4Kbn$s{B%|pdeD6xcieaZw=ok8Y!82Z&%sK>Knw=pd!8bP9=Zitv?~a8 zRm6h}K0=|)rs?iLCmm)oqR76xvko2v8CCM#yf?8b;Y=XkVv zfi`~!*s*BD{y(wbN$yiV9Q!ApI0PQy12C5l_Vr9vOH!Y-E5o#(E#Z`e)GmUV zVPc&T+*R&NlP&Jj1t`{%)r=EXFTSn)?y39a{62r2^PKXBdHKd1nFYWs%V6WE)iM-d zqb-x|)OxKASqs?=8ljlPkYg=AQ$xnk7Dez=OUhX+{|hKzRXCe4hb{ZZ@C_IggX4dV z8Ey{D;93MHt0gVpSLep;bZa9HfrS&Hw0DbPt@G|u^tBWm8?U$%ox-Z(oeDqWxl4NZ znUbC!{0t5Xk)LDcakdq*xALqvm#@={_^6a!*XsJZAf~$J_xht}#YO)q(kOD{X)D2XT{&?eCF~aD*QfD>2%r#k~Aa}P{g~Njc@Tc@54Ku!x8{SLaQT*DseQ(J--8`({|H>*N#%q zNTR=IH{|)cz7Tin(4Zo0JW5GVRFG12eJn9x8g<<#Ylf6d_WXJ z9;`tzWshuDFJ|JZM8EI@#ZXO412GW2=U2?3hh#5Bw}P~_iU?W|y!5zG((G)zkYvMb zmRiOC?rbsDLa8^+>CG_jBX4>eHbICIjn#x8+eo#E%eV{J-dw1O@Y-P;v_V)tb#B$I z@0(X+F7xY=$uYkg70)^%O@x0KW|@Et?jpKic?Sy~_nV+eJ22W>y|O6PSk_GG@pLg$ zFj%AKF*cM4gs~$JbI)fLTermnR!D>;6Zm2%s?M8OHy(N?l1clAmVz-9=OPy;fAXj zYlg|RPxlG8F%t}J4}V$fQ{y%e|DL}>q$x>g;CS^haBu^caF;2s0j@V~obfo099(QU zwPo&T@Ba7hN`A_6fRwiR0A#gV{dToa@%qjDcHU@AsqI-IC7p8Qr=L*RI5@e(m1!Vj3w+b`Ud_-HyYMR;ZLs70Qfq6HFPYGJ%dZRj6)c z3LI5(F!`O@>VI)S$NOP3g?>j>3BJn|$~>eqGn#v@Dijv(6;enes zNqm-n7#A_0$6Wj^|2&ReZ%V@<<1}=@-~NHn56pF3I<3gwZ#XWqJR&ZL;4%#xe>Dhv z=JCXH?ZoFUPW$A5Z0=WAj{5xpu5D@7t_Eipzlhas&3|ftcyeN%4$lYX;Jj~sJi0m` zp1%X$9Stuydd4}pI4N-NCfuQWZ*fXmL0P?mr0j}JQwR-Xn|I3mAdkhK*A?5O8Svve zL}heAfW>SYIK+72Ywi|K#!rjiy3zWf3RI^le!ddwMHC^UD&*imWqqQ2Mn5g7TAj0X zx;m6b7JtKvjl2IJPz8tzTfxO|!{F00Foq1WtvfvmXR!~dbnw}xbM(-Tk>r+6d+>P< zS&vT1B+-`#WI~C>G7lu+g7wbSBd^g74oMIai%2{7$SmOG+i0WRBSw~4Ri()r(k`CS zY?BRQWZAsJzCqf+vL{$DvFjM55G9nv#%|Hbjeq>78oN`_w9|6J!0&-S1ij~){4`)Q z8u7P*?+5G}ay9)Url8?l%d=z8;$WthXGduw0DYv*l#I|q92kVsCGp!$aD;`claN>t z`f#~_QapCZKwk;F+an7&c!28wpkR)W@;GE#?_WOzWA}wg5JIx4-f|hn|I&b>o@+8{ zF@NxdWh(KG)ZECTR9}k?#}B72qfxR?msM7bw3Db2{_;WFZsI{r;>S?1WQ+;`7IRH`Vs4iK-UPQZFQN$=rFqsLZR!L7;(0{C~ zT?q>hR3st@mc${FvqT}f-h~*RcrC*6Rc#kB)Och;=|ttKSgE=;DC*!=?fv8f$;RORiWQ?ScQx4hS1M@9z-_j{2*8!VC-ine6s~%>QCThvlBctXwAFYtV zzC9unb%cWqw_I6=DNfGB1L-(0Il;)s{7(B-XJgGU zuDY+F^Od`MWPJ;=bKScO`BGX--&?wi5!aLySqhWFl6-*}!Jhf0doZr z(w#*ivIKw|*QZMyU*i>v%vs|Z>MgpQ`qvP{m}!eIh@#cmg@NtIAHbQmb_@5J#aX&_ zjTpWQ6Q+35%iELWt4P^vYk%o`O^qrGvSb2YZj*yU zV(>7gh5XzKyy;W;@~R-ZC@c$bUEzc3i0Ii_9gxo=f^W1n)^-6N%bP^#JrT+Tp>&dM zn`5O)S3!?J2-YD1S;Jhi!~*8LpD&ciC#ayvU#QCykItU-9z9&K#D7wU*A(lLCrBt| zr~2}RXn0D9YVwrfSfKCX?xTDbI-Jl4k844bsdKy)HxliqVid7&Tq&bPJWsPq4z3(E z&jP2o%Zq{2n6@Udl-&dSquLjktWQZh62V<_tL?UShVyLnJNaTS1z>BaNQrB2Ep|O(#M}O^hJ-Xy<+>WQKFt_V;m3tOc!e+KyzJ&cB0t`)a9B zttLH;t_MqI*Yad5y7w~ak=awc1EDKRH@?@rj{J-_c}E`<8L1&92j0RRwz92z`Gp6g z)}20m3FNqnRp7pwyrJVyCtKv|Wx{m%Q*(gu@yBDw0Ap20b$>xDDLM^wk7v16G*ji{ zR?Gi^Aca9%%}KZ$2uAXMz~l(w>N!pG=JcrYLPPu?oPHLTD;2z{SEYI%lH_j0_wkr~ zCs@jxN|z`ZlZyoHN)uN)>xz_DeVna-ze*$RYvXT~Qr}C%Fc5yvUvcP0S13c>1X)*y zQ$e46@HJ4<^nY3-Z4#PfOl1GN=?}XxpUgwxzPsG_eRo-J^oJ%SM_#c8VP68tDIO}UbOhK}2Al(K}0>K;V!8{=Mk zXP8GY@x2{J;61^Fs~jPLs|e^(^+Y$g6UrH%k*=!3jWh-$NWmz3u4e)Bm{E*MS_!4?WDm3W7io2H^WV#UATe8Uz+W6m+knAmjL} z3py^lBN@@VN0;s&-{BPcK-546j&Q4F(Ti2~3V%q)&AK4v5h<|1RkwMp=k7c$BHL`A zONMNhmv_{h%(I>myOCAPi*MV4XijjCK2A@r2NdMh5ZhmLT?E1Wqz;Qgo8-#Bqc?r% z3zdzr3c@fDK==EKj5=y72vx+QptEbBT(4&hG}n+^r6T^jb#ZfWeLUXV?7}SoG)x^v zHh;6E(UDgA2%NTyc>#i+Q$S)Ln%479!2cIU9Sbe zR7}a7<&K?e_OTs2iylYfpsp9gqp~!~*q?^;q2mvlq`&6&+khv$;0=wD!AiqG5Qgvj z6m#gIfqKwX5YsAD5$}4l5;oIKvY5<<-GA9)k-oc0+LWZU*17Hfvmf8?%pR+}5@MyW zkXFIivDL^iZz|>H*FhvmmdaHU6~wQ;OnkO5--tKi-4sI=-cFZqDv^%0q=m9sDT$WP zI!z-XQcbden(G`ik@yi%Pi6I5vVu`+O&JX%Hb(*Gp1#~Z^hu!+QcuX*5X3PWs(*bw za;r_*jyZwu#AX80TDj>!Fo%!Npr!3(ni+Af-PJ>LweEXby^>8+b$Y$xz#XV=PYP#> zUuyU`fcw4Tk%?98E%k*i;NH!DVV(L})Kjb9;@U6!lXm&7?m!$Ypuw+=UY%aSxzF5+ zU!7IYPunmQzUQxaha3`7v=*2&t$&nBFs2>GiQSs2a*b15#dc;p2sHJ7-?QryCr!tg zPl@06etutGF2B@|b&@udE)>Dl?G z3wqAZKVB5~Y(!F#cAI{RU>Whj?1NY=v@o)JWWb2Nd?%wF>uF((l57V$th>j{!ntwjJ;7pD0$zk z4ExnEN!bmlXj2iZG;mQ@Od!@k@viw4ZwF6)CxEAJR@i3LU;wbp_XKIFl^8*Iu_}kp zyBF`hi{Va6zabE2Q1}sL-hU4XZtXu+WW_+OjhB$^{bw^6=TTgDG_#GCFkiGT+hfj? zzO%Czdx~~t&Bu$8>tzIm)eX!0E^*GiLzKIl|IGqZj(ulb+WfW94{#Qb#-+HoL|ZqY zNPAfr{ury}eTQ55a0K4PR@F7)Qv1lw=~cz#+CFA&Mn8ux{PqA|bbr2;Y@a?KLEnP0 z;$WLQ@{G~O(Us`ml&JG8-S|uNfXkWJihDje=`)i$g}IjI>1F{ZzTCN&)+yq99C>93 zxSIK_LnMc4QZYR=h1%22G2$bJts17!Nz9SwV#RZ@YKT3D?n8sJifE5zft>bB?a}F< z@(~Qu;*&mNq?>R6QbHx5ZHh39%!`2jn#JNwsMA3h(3K}Zi18PtcU+!A3Fu{ zpdb#HA)0#`kWh_kb;O23yYwEY@h@V0)tFxqDPQ;ngta+w4uRwOAjVB$;VN+z1wl^^ zmAC~~;eX|y!xbp%EV_5QE@beKd?3Y}5)V4;4sDxklRuS{+kZ;KKoExS_bFEBMFI-e zRuE$qs|AH#>7|jf-At0jWD@q!1JZXl$2RH7cCM0{;rnO)Odg)nFeStT9x(~jQd$bG zCwiHJ8gy-kAd5kzj02s#nRse~VY1--rgzupJ?P!`-A|Y@r3J$w$RK8j?yK;9hY(*N zi)hAGioS#fe}Bj?p;@F-%$Nq+QJP8Z?8$vF3}CAO=`3m2BnAbmWlu)IIBGcgK6cdFW6kbBZuO7x<1d776cJ1||m7qXmaF zx4^QUmVd~K>^>bm^%eO8g^*2a!axv)@B1s}AQ+)NXe^YZwy2SMXf4=}lMpuBNnD6y z*qxM?;(za&h##r6bKGadAyrascLGUaatvKed0_~vN2?fa&+CnOXcv`NK zG8?TwmFoG|edVKn)n7bgA}wo4BQ)7c5-lQ~rhlOjsV13&^I8iJnoxWTa8;B^t`(>? zS%zU0O(GaTH~h`!lgFpGiuTUX*V%YFoZVO4-*KZqBqOx8=^IaOh>`e2l$NAeuL)W=~;-$8iw>!mAmLqtWKMl4y8!tm1 z*MD7J2ZCLQ##Vz|8fy6ek-oTSmC@b&r|xjWMr_0nom5e8+At7)&#$X2H-eBc7ch$L%ytIV#DAaTgeHNsbj=I+?z`{4`_9SDUADvsMeea5r1Pz z5_w*(5t3X`!=wPB6nR=G{DVqk)Xq_v3v&|VWM4+6S^9(RarLzzh`fXel7bbhHT+^6 zzb6T!425}=VvX87NY160=1Yyga}*RGNJ{gR7^#5qEJbdy8sh&NCcaGW{q?{;S%1Dv z8EuSK0Wfd|fS)MI`%oQ>4B<<8aMdM8@%YrWf(gv#Q5`L+A5pB$#%5yYTi}9W17zeG z#5QUGc5LOcO}ZY88VFA8HP~B-z#YV`6$DlJ2MFp;wmNKdNUYg`&uslL0{eT@>J>q+ z=d-XeZKLPRXLDEgoIIS+ZY$cYqklb0aHQK8Nw-#SDf|L^A$s&?(Y2z{8x=WKvM|4v zWbN}=bPhX;mxbooz7atkf&q-?eP{)$0sEzH>!bt0Wa3m6Cb;umS5=v^d$bpF7`DY6 zI^1$bHT|hGg&nmE&+*-crRW^Kg&|yB6+rv%)F75X@T&e!N6Xh`Hb06w7Jr|+Iv8|$ zZKKRKqa@sj-8vrND z$$rm6kdCu%gZDv>rOkXREW}&vsr0BJ!4u4fSlZr^u|-H-5JUffD@+L=W?)nBBl8yx zL$mlv121?3wN`CU+b|IR-d}NpiX^0gF_<*9wB>cB~ zeSS&PG)Z~WW)&rz@6LD6J$KGwKbl63#+Y~kjtQ6vkEzE;{5~Q{chBlH7@mZ=Y81!bl~li{f`Ie2f4usr0Hokk-~2>2=UI1L%#IL7y* zD2zI*axY97FUe;3u74znVlo-cF!!c)8%Y#U;lrm42O#oD61c{3LgL0l1H_8bn}B)+ zBe|(EWfN%Xrv+^tqq5L;ay0|WNCI6z%cD%gL?}jxJ&K3;W0uj%{d96u>Vx@?%p!ho zYA+USZDkH!q!Q0J9M~H`x7!87unMQkg>vW?+RG#6t8t!6pMNse73WL!=2%olCgToD zLLp;m5EP_d7zD)QWL#4B!x+pa71H+|5YNNH(H*euCM_o*aX`xon#ShPaU6uE_D0|A zUmyB3AU$`8&@DoIV_;jG5>5?MlMckYABVF`X{!({`9jEE{9fh}Yyr0TpNHCKIo?Ig z8kl!o4NaYv0)L86Y2x%0r#_2wCHb{!s{mr52rI^_Ag(CAeqE!rt`=1qREkRe0D4v9 zBAq}Exob!?jRIf`Nli|&{HxMAkU%tSJ;E!M+#Q_^vj1`qplaPiH++FhYZZ5ieALdGde$%|mik=8ZIy?>XIs%gL~V-#1jPFxb99Oj$& zvz|B0fMUYam}RP3L2pJey~UiA=3##J8|VUAylPUxVy3m>Hl*Y7JoTn2`(2qqN?IL4 z((Tu50GEak!QK?I5eGQYr#?G+c85nt2qm^7$3(($%zJ`gwk4?767ua_9Ah>ide7=h z3o&5iCVye$s)Z0%^pB2meu~Fz?W9?z{`yuum8Pai8Mm?{Tth`K+m$8>5zH%!Rgj`_ zp$|x0vgTe3YK(KOHdGWurd8jI^q=xv)DeDbW=F;hO=|UCqqB|>i&fw3^XEt*izq*N zdae!5z*3iptXywr+j?OcrMbL%UspkyOS}E^>VNd&`0C5~Sv4UwRx%9b5k~fzU{}5q z{z)XqXJ>U$=qbJ~7U%!O^8Nhs+ppSap5TR|&l_4v8k;KIR?b;j^xA7q0-+|n9QB&3 zYY|YpPEYiUiqBkzTH|>B>@}mzl{?k^!k=y%Ycb*HjlZQ*%TB{E5WM><7AdM)l>?<9 zA%99h6b^9WP;O0yTxZi-Bu-?nB_8U(<0Q~HEvb)g-uLyPG0z)wSRJ} z?>Tp)>8zP0xrS~aD+0LZMPqLS{eB>Op7XL~0=3;~AZOFT48qWHH&JV(7bN_O@*Q|P zHEHXGZsYs~1adEGYa3s+0(4$>SaHeM^lzxGPA#;N_F!+?8oc&*8E#yk-5c`$3_g);{7vL<4B|PqS|^jZpBvY1I1NeYuhjofA^=j zg;3ihUYn(Zkt`bxPPf38KnL4HU5u=p6M-!oSy~rHzWXG5X>2!RSt(2pK|bI8{+v(B z+xPh^{tMTrZl$(YF1DUi1VAE-+#&;HcMnNCEK_3Qgo8~B$fod`AtjD`J)6+^f;FK)_QdGT~aVfTK9;5K^_I7Xw6C?F0 zBRm>i`Top5$%);w;bl$M?ZsW&7+_N1v&y@feO`V&RiO7D1p4#q>+sWjF$-r4Km2xe zvzRYFoF*6kCf6);cYiUi@R*S!EPqIEJarQawb8B%Fr$6sJeUe|9LjTXb_R!M(Rt2O zPz}G)_W1HXfSJ>GQ9}!=KZ<=q?TtXG1g~KCx75!11vQQ_3&JoIg!lI=-r&%V+6rP7 zp*ZN|;98J0eW`)=H6$-!5&ydl;!VeQ+;NAKdpdxQ^q@Rp7JtNBEf1L;h2uJ}fYnIB zDNXpe#IcQiJ-xKv6uVLvRBX%UPOS=J71!kZQ871XYfN*C;-XXlmW8}Y1Bw4|9qrJO zzy2e511@s09jrzZS&N+*dy>@2l=o`JRk!#Y_n1C%U%>~y%~)G+;y4t3=U1FoXaE5_ zWjecBLFt{DsV&q6sk4^{f>21DVol;ii8F1r)BnD{B*Af<7CKe6c|gQIK9}#D^V!bP zNwkiaH}eY}B)_D=D!n}q?;YpE;qM=vLv;A-N9!wE*$KrqIY;qrU=w0pVwZRG3qF6h zh%TLwP()}_mGCR}l61w!<=}3(@E^ohdYITgFw~O-{vz1J$mLTKw(}JGE{Xx&GmqQ^ zte0SKopB#+hhD5x@~xz}@oxjz6UF$uO%XJm(D&^qK{qzJMG1_-qH)UL)P#Z{B-far zKi4rz)}ik*$=@nc48?oO#kitFZF+x=Y?p^$8nj)P%THO1C{D7;bj6BfgZPr?hsBdR zR1_(>&6P1L`~7|&W--3ypjxEc?ZOn@S!BNlt1$F+3p_y2_7l_*rX(2rY0@=L`p1Rd zlDmpPMV&E(M`IwY)OeEGq7|U&vi}_zf{aP`XO;455&rV3Z?{;t4&T2IP!NB{53L@w z;_j-|+4zS&Xt!FhHy)Q`=_pG1W66eTX9jwj^r$4vmF_bzg<4CNe!H}w2mL`01|8ju z(G*vuS$J$z|8c7a(xjkr7kfNt0O0w*S|>7p?ob>Th>!W zx#_@!f(Lq_mEZReyL$1ZQH0`a9AFWanuL*-r7`!A&&<_DeHbj}gGD7{zN5obU3Re0 zpsN%jQ)4VQb&JW9pr~i*?7@7_)L0fwLm=qRXN?Os1xB?Hdf;In3F?2?k#!}r4~Ns) z^7?8zSx%;x%gOB1@}IMt>DBb}Vo_i8fEXE73OoFS38&ck0LI6Xl6&x>_`fKt^THU~ zP0Y!t4CV;f=WDRi+bmw7lR^@|vZgIDGKGUK|Gb%YnN0hF_^2(_AEf87LySyoB`x zvYj=^IsiKn635VFBp*NMm?~T*<_+AHi^*7|tP*8imb%@I$L4=TF^McZ^E`(blN42F zt0`u>3TUhH!jgd3I9GsQo#lb6N#nuGTB(aWKMjh&m>gpZC?m!Q%1}gb#P-OOvf$7p zSVJ<(nSgJ51r2D1tKJE!=oc-}H99A#L@B{KO`AF{X*6JBwA0&Ee4T~7XX~(5vC5>#^)W$ zNW;E~pVj@cD9FjTex&Bgfp-gt&zv zE5Jmd^Jh16h0Vrb+F&+pR5$;#ti0*Zt|6q|X}Ojxb=`kEQ1LE0OZ5BH{Y}87+}L`6 z83^L9uyRFQbgv9DBkE9riSjPI&EB)vinnYo_s@Ji6pU#498&wOA-{UIPEVoVVwc#B zV}^^~UQv&wZ&N>hz(C#uiYT7^>QET%6&B^9rx>TY8oFY6hSW>k&0yWd*?h@PuI|I> zY55C_@p^w*UB|LgS*f0+^V?;)>cs8xs9bgiS?#xr9AX*Mbk2xiWi zbN|j6`{>y)kIH%b6ok>d9DIGN$X@bB{iAQlnz>Q<~b{;ZHG_vg^ z>i~ay`j!`^glcQP7et9p=tpZr^tJCXraB=`=8Gr_%vEd%VvF1-#~zI zW2C;mN@L`P^J_%sUPLG&G|?&21tXG+yLtU%M0|Xm#x6hS?8ZZD{^Kzx@h`-5@G)@% zVA+u*a3zxCFM@rHmYhHa`9q3>C5i!u>i~a++#YZqlPr#LjZsq$u&w^Fg^x{#wqFn+X};oTwsF!T*W9^MZr?+ z|0?#Fj2p@~CDS2W^y4V}gaafNNE!sn+9^{&U8j*wDOW0Vvr$F=rnll+F7?%l3C4e> zVT4ApLhh1>Ok*qU%eK-5E3z`%<~$8qzNH>*izB+@3~ew}p$lk`9TD4UK_&g}#R z{&1Lwq*u^&Mg=SOp}ps1#n;XWjL^+G9Yr4h&{Z6L2ZFxunppOFXzLPL&|Kh3wMxA$ zYL%AUn>MjZub8By)vN<|cTl$pM{s}e3{XV=%UL+3bcDvcHebs@5-LswmKp2n5mTe(%2JfKNf+2tGJ9Hmj z)sm^_XHK%8u2@rlwn}8$T&;Z=Z-500uaP|30hZ*loKjYz#;%sAbI~y^0P2{M) zWWPJi6>^@@V4YX>f$*av=B>6Q*XuGyG>r*!>4sX!nj23T-wpVbRuC*wK2?YvKC87` zZ2BC&ejTDPif?&6#@&UQfsTJ1-`W{tubPr(*aS7V`EyFXCJLJ{M(adXb#+S}Ib!B# zD9jK0flCwhVvc&HPW?fT;ht)1oxmoWzNk1)42Ci^`~Za}Q)r*nA?)#L5IiqmvXxj} zd6#MTN|Fxc-%1u`qeGEKx>F-DqV+&at8Wor>a#++UZeN|hghhuCf0w*l6hihsxtLq zFq;l$dTg43r@O;sJD6!M%7rOD^7NBMAk@1^?ri0F7PcNtr|cNVfy;<@selzDxD*gs zLga(bkVOFEj?GIB-NWJKWPWjec{V@0Je{9SKF$Am|K;-h^7q+Hv!+bBdqAwxbT@H~ zBfJo&17#k5Q~aJ)kMn<{7}`zD(WdIm5wKN0D~zDuZ(^I%xMMNvF)Y4P>NE=r<^eQE zy8M%pdY+M$!y0^C6YpK(zB&FFx-j^8LSF>F*4(|k-lT79BfvikhErd+6>wjdgJs=& zDV<0NWcTEDeP8U^x}A!AD+W0q-8I8DWa}r18={ZgN}jVc5-oq3|Kx*1{^vmL644cP zW15rXe+CK(uClP2K(4m}nFrt|g5nsO49w$O-KPqciG2%p1<5xd^9k1-vO|+_%!h*`Qq%ydE)))>Dhnj!*E-NS5KzLm$N@6e{ZQt zO%d4I=nh_&~505 zQ0|HPEn3{2pVEk|A3UuY{bx60a$z;WlJC#1+74JV(4#%R$sn!PYEZTEh`;)7t(QH9 z%@=CmuXx##RNoU!vmgKeyRuA>cts|aP~VgkYUt>*g-5d25RdkYc=EreKKakJ;mu=mP694YMf(hJ8i`eT|3mkUO37lkeHsIQZ zonEhJ1q-c~>s2F(f=Kz1tM6|=z9jJ_t@dmLN%bLJlbqqqaOTJ1kp26ce3@@-WMK+% z9!3yMkIQsc-n>QkQM7;Xx1XW|c<}R2!EbPuqAy`Vf{TzWe>iGQhJvan=`#Le{ykycySuVGFXG#fK!8a|;s|Wc%EbZ} zbVyhf;e$Wu8g&(afplcWseha$v`-FMlv%{|1yPuxERLv&zCeF7r@{~TaG?SF;sx+M z4;&sI0@1JZv9ExnEHdDE5g)^3F&arjTyt)p1}&1i#=3OjhWM{yiR;}@CVxxbPK_?iJR03V za*R^=J}zKHP(fD=3_*a)8P%dva&O?8t>P5Wk<$X^33Yzo3j&W?WrzMF)}oql+VrFI!;yRX;u2wD~&UQDLsU(Zn`+4&B9VsWsQ_Mw0~FyOra0ze7C^1&XZy9 z7RbsZ*#ZG6N@%Q;E!82gIk-Yu;*4%MG4Qbqn=@3T9l-o`u~jP32aYD~U1kl+=oL6HT&Tfx zjlePb5kMwY+kcF1-8*?Oul8$>0(!|q4yR#~FGIiC zK^f|f)NR!bsMh?p*-d*ty8Nb#0oT1Fge$wR@^E9%cQ|-JN5SmY_m0nhnRuc-l48Ed~Ede-J1*4lK7@PC8h zhnU)eo`2uJ`{1impjn7jh1RozJWoyTDOzF%dR0ils)af$%R;|nL#;g<)Azi%l5^IU zkP|nSF=uD{1EX!lO4cb3Of{1hy9EX1nEJ-zs_QbK;taj6^dMj)akfAealkghld})! z(+?-7le42=COy5yb`N@-j^HV}gT*^4Apa|VHejv)M)XvNZH2{EtE47{Mv}h0*XG%LKwCa8 zlNC)I>k_Ul1O*zpbR#Y}%Qj(GB-Ldm^M8P{T_^CiWH!@I?~C!#45OqZPfJPL@%MW= z6ZSvgJ=>{`S65rB7TP)OIgeyI=Z-^?A)hXz+W_mI#5yOj<3aJY6~2856WVm!;@gtn zi>kC^#X^rc((p6Xsi?!Sy!qn!s?=wQOau^BjAdM~Kh5CCP`1rsYgL#y)vhHsSAR<> zRkhtBQ+LhjjAY>(!oBZ_td2W&<>y;rXIe`rc$|MZ1uYI{`GIib;{3_{oo5J>eWRYWu%)ep(ibysU+%clEBX9r(08-uA z-Ni_T4Ya2ad54rLk#iKr`L~iL+IQQGqoFK{Sz50>Z(dT`d4oV|6EEzsH?=iZmlPsG(WhYq0Y&n{RT#x6QwH~{b z*RKMw`e68M61z*t%`DnH*q{74tka+Xi|aG-XVP^ zcwt)Gy080`1(4rxT^u)O81zB(C6gKzQCnPl57c!z1sC9kcksoO<5X&B#q^A5z72Ph zr;*Icu(P#0q;5kW4FX`xx+l`sdCux3VbH`ZS>|i0bNh~q+~6+pe*iDA_!Xv3&j+Kw zSR|PhtH{lLNTSCB`ii7fpKke833%Opb?(thr`8~LY7Ijbq3n>WTt`}tTV z9C)yi)z$Wc)!9Asag}a2`)H9AMIeNM9}~KMN;F4#<6-Q*4a6Iq9=O)fs)im;HIG!m z5A(@qyM8?GQON?PZ${r=>Mi)(I1;dtfHPXgFOb zTu6N9lxxmG%xH1x6>P^U5%G+xB8+lf;j&l0Hhgqy5mc3ZhykhA%DH$&!`w&l`SW}a zL3JY)&P$`st+Q_ewFWEHfHHO^)_RdhyHkRy92;C{?l?KBSwVv4Mnw#eF;ax^!Yl4wnQFXZ+}_o~0NU)F*UtB&V~b*wZX3YRh^S+CN@#wUE^xYuO{;9pPHm9d zHgZ>e?pvc5B49@O;Jinm;?dm4tLV)5h%I`-6s^;#W)XpHGvrSloQFQPqMkL(vN3S} zQHhUWRkvBO61Sd%Dskye4q4C2^S{-k7*YxY=V}CM5F1Rho}u5zalK*E2I%>mVq9zv z$Hi5B!{w^gGtT4RfWm^PuqUcVhkb{AK(n$=|mHqb)xuD*lnep_ZuwzV2p73n^qhc{4 zr+4EfD?oAGHgauV7Q-l(0(47)2Om#eB^y>DCxuMYCiH+)>MyE0IJ@}OTsO=&(FW2N zECqAi!r|ISSL#o00*9)mBJXVxINnsq_4QbJtYShTg4wOwovv9%8f8S%@0`kktwX2M z?=%(+ZItmv1{-e&q!pWdKdK!;kX?Qz(zLmgH9$SKsj>3u(yJ)NX7W}zaR3~JaWJVW zbHzI-h@K{Y8hVgMNahr{qEr?7nYs-GaRm4#cf0nq#>`6lVJdpE$UkCfQ8Ebr)Xye8 zL}?sR@}8d(n{(vuoGqKVR%t`E0*@L#bH$W_axsCQS&CES*+=KQxi4DSVbx5ehEuXcLGC$+d|> zevO2hI-htGZ;ysAd`KXHlf(C9~GaAt=a_$~U@v3?kTV8Eh|m(zM1 z()V^Q@H9t$)>;g`1oQGiR+b^PTMk#OLzcE(K@x~U++a#AViEq-Ylqt{0hD5quw>q( zIa9qbaO993MkE-z_SYR%8km+Ao+}hwok-lP*G0_Usnz#d10LV&Yx!f)pV#;KU3}w% zx9q z&RuP*8Axay)!x|<%|mU2DxILWgdi2&AI}&2bG7B}magj1*cKWHB|royu-0}fqPP05 zr{`rq!;wvdyudR%n(+o|`P@&ay?7(7Fj0;GzQmPA%$XbRrY;LRh<4OOo+gmHJa@@i zB&H}GU4^C*-Y3wRWTFe=4EL`;B>woKU`?Jv*!+j)|D-ZKA91h(&;8Vq zu!w0mx%hit=bW5#u>oF`eJ5lD7+)ja`yKTEhV5D#z90AQr(?lw5jPhGD0f?dwSxDH ziXa|(ioxKFYU;LRe|;HC_J=5jYF>u@F)5=KOublfUP2^7;KEr`?I(XbrzhzyxFlWx zY3QK%y9n*q%eeQ@5pXbg>#%?*+#F-O-*4dtmetu(Rc4g&D*>>;4T2Q2hsa&2MP&l{ z6#(xNc72v4`1YKO3D=^pwz%>zx$s=SlI&1qxrf7`eTjn?@EjwcGpg;9zf?le#_yQ$erA z45XG~RwK_@B_rI+OBlX4>lNSO+rj!Rb3EI-C3BC&WQ-EUN5(?|^&Nu4KcCt(4Kwvi zEHz*Th6XStMOwt??d0jo$idF{JR>Xjh5>T_5O`%FrUG+vdm7rjSb&@|QECI6sN?Ol z^bJSn?YqXMnkuIye7jJua%Mm1L zlaJ>0)SBjPs$wBmBg~m^0yBqu!BK#{fp>=)X$SSd*Vj&mOoNo1Z}VRC3lGc3J;@ z>ryBH-<%XGuImU~oyScyhejyK*QbV8_%7!R1oJ`P2IVss`S&{hRa~d~$10=X5=|Bo z!)iI=g~qF&ep?iU*Tipo0+&u{<$$}zbGZYEswz5%9oN!IWF>*LME9}Io4&tAj2WDBF-q(k5B_u@TTGM*Xgw@Zw>WD$+i(_VLjB2_ z2cGyX6qhnq0|XPLV;a;)y(X`~*9t)9*BDjfXCk9Yu&efN>B(a)MQfe8!US_Ou#-u7 zg%w`V9*!DO8VPzlK3%&q#4E^FOtOmo<@nOvHZ~DCWpm8c9gMqlgGd#L-?h71@8NxW z9NLG+MUy2*MQ?(GF~e9a4M*!5F)}F2Fi_m7qLkdJ!mHV)vsH{fOcO#1ivn1|#rm@s z4I`8=oaiZ}n35z)kLQnEto*bp?h=-Y`p>71ArP4>&&j^z!jjE5@X>*{oja?T@&l<3 zd?r|%8U@reaH6u=SFsbXIEObkl;@4&#<-6p7m_@Yebi7oy@T?%UR~yT2qlo|v>KQl zlB;(hi0w`AN$7o_-O)R{9WMwx-DE1&JPbBqq(f@1I;R(GY_rOU;nMr{v{Kh$Fvq4( zP(%7ydB&T!^mwBKp*wf;%jQ^NBO{crRr}F^Gk`Z7e*D$$bLYj9p>k`WeM=D}v^1tM zk&A1cG-p~-^PWz&xpFDO`&zZe$jefUHB{z2V1M!hG61E_;dOJ>{lT!6*igyiv}px! zAiuBmkcnt850W1PP;rx3YnNBiZKqWpE(@j|x(7o|tZkcWdP4ujq?Vc`Qd3S$Ua(F_?I}K_wiXjEUQ= z6Z9915~his=Z&o_z>s$51U9I~bpiv%(Txr~D0BcaBpMG|-#5Orz^_vXcqD+vSz!W^Sb?vhBDPoICf-OSe%WTyhFJ-N!X38=J35zW@{o=>2MefYhcD%HH z#aIL|el!y{c`SKw89Rqb>_HHk7HHX3zuN(~P*8Za zab`byE81-FjJeJ8%2{2~L$!QOtuEP&xn>a^udzP-20KGtFs4pTm?!3E;Xj4bif9o{ zpcf*@Hnj^6WM%ocVU6925wtl%g2)V?L|~U5;rnyl(hv&SVr8o}-3LmI-3_Q4yP#Up z+5ra~xmE3yT{6Fu+PNPK@kIbG9(MvudY&21M1fqFY6D71k~|jt4WT%Z+Yr^z4)IFjSmOGfqA zq_PgfqozA1*8mOtUHD(xW{35ZaXMdnB~;!+n_O?}O3c)Uqc^SmWv77Cd$-ri%Y5^4 zMYg>b-!aH`Rx~~XLlk66^EHQh%-;a=paU3+E63f_7rOVsu9eyWdmas zWfm2Fo0Kr~82^kit*Q6E>OAA0aOe(w+@pCd(G0ImBFF<*m+WPTK%|K&Rfdp`h+BwA zMJ2E>%IwBTAdy$Zh#!8x$r8kVrl1(VYlEn*F&06}LhZ*bh(iWkB4V%w6(CqaH=Zt((e;3gDR+rP?T$n z7VwxtR<-TS=ZFCq5P70bR3z||6XChHbrrHUL_*E-Lu(0REcI0pt|Hown3OFetTRO6 zZT0S1lb~4K)*bS^0G!Y*r>6%-;*lP2v+vD@o`aqPBbreNrO7I7 zcg%8o!}p2ZFTS^TyPL0r^XFW<=fzyP%#V-L+v=+kEHKMU%LtaG zEtc?w$x;)068-uSl(#xMTU%-nX_{vd{REq(rI+nBKTkqPb=YC9UpqrOB5?;wF#C|% zK9jDeWo`UWF8C>&Qcd2;Mxcv@(1(j#R_xYKsvdrHapD0bJg)NQdqZc>N}hJO#N`F2 z(NgvpTmZO9O}M;GgLpTksHdN+*Q7>C?BTv9?pa$mFhK1_#i*KXNT1S&^4$&<{ko-7 zxVJ}`B6pZ1H<7hyB*&LxNP6d&rix*$7aA9}t%*1507I&uiE|lW^>g;R=iffMJS4CQs4E&BV;7>2OE`ZKJQ`ZkE2WfU0ei8dGzL$yTN;2i7X$KBrEI%u2F#5$i2~cyB)iJra_yd> zA`-+Iv@Icv_2?zV(Vm@%SFpMA->#HM_^{En_8Mr@w$BLOb^=ul zPY&l8FNK#YIo zgb8SQ0aU9QK01*{{dc+}*dFEmQ3xF+{wE)HCcrK>_I@T;NkaX@#gbvlDB(RB;Pk=v zE&iA^XHJ8raI`ORPf-~C*YrYmgIeJABa(fX6izRC8}l<^(%@tN<>X|7xt6~llc<{V znoS|qp+dEdNugZzD*2Sr2~nL3!02EFT&_)EHAtkH-cuJuK@;rGKz+3&?G+%Ze#hVt z%wNz%04qa4G!6Yn4jDYi2AgiT2w^?MZ^*(Q3BG==G2hdoF1k2d9vK%5yOaw}zhzE!ma;5wh8V#mj? zGG22Fn+RS-*_iTSd}Dm?>_I>ou{5fz`C5@k{0|NKM%FIU2G3%*$YdHP5WdX`BJM>~ zzU;zoThe8l&-*+*&J=jY&0+`$;!0qrUh!Lj8!4n=<8PptMs_qC348V#7Oli-0qq>j>GP>nh$OuhBv!5h`%}sse76n@0 zYt#1pa$e=k(T44oLq}aOS1!BWHdS@!dZSM^RrAI~+Wh^XF8ji}TI74^R1EIAvC_oA zWJ0iQGq{f}g2KDXq?ajJ{4r*T0p>A-Z6y&;G-MM0nIt4GiADksQvnQDKm!JNX#7>h zZ#6bDROJ2?s*v%q8WQ3`Qn}F%A_WcABv|LS({3iTe*+!4GjYCs1i4huOy)Y~cw>+8 zsRj~wi97P>GLyQERY_yUPE-Sn@%}FvL`Fzd>SLl*fl(L?KrBp!HPkMy+3p=uAEU`D z4w59V;v$8wB-kH?ZDu_9vaNlCQ$Zt}mSt9oL-q9K!ukM(2yRB+b;zs*xv$?)AWGZw zyXJyK$zbe1VlPkjF;B4PE=p+l@-;{i1n5%98sRb63-e?Hvfv$9YLotdU{HkwNfzfX z++3wp@)v=t06L>-7aXdinvzY&r{ysiU5`%gs`)(Gd3hLbig^=VznRQR@1fhA4M+qF*G4CKdY})Loz4lzfo4AaB3Qaq<*T$cEj(;^ zCV6f~plf(vF)(2&q)WF}o5(%C^9di?^h+8->-G9}fSxU`JF2r=`H?FGmrnQGz875? zhQ^d+DDRQv*qxFsWE60t7td6rD}2+qb($A^?a`rKWymEQ2m=La=rDn7L$o4xKI!)87=-l%2GS(pQ^oWR3oJOaC7F)o|5jSOT{2^u(d`9JVXSI@2M zwWeNv;%L(f+X42VN4JTwtZU6rD`xfIH@(Gg^5#u%pC~!Y%lqRGB5?P6|KKDLM#}%_ z3hXc`07n`X;OZFQZ+XEnNUSpI2A~98Hb&X)WmcaG^X-p z{mm84{q?`9UX`kn6EkWJijtBviWOi$m8w+bG~y}^isN$Qk}`A(KSMSNIzQ6+A3*Ir zHM~&*sws@DKo&j$^jUB~1iNceT29Rz9XVM!m+|*zlhax67O6+>aVHedpZaE#$x%*E zYBWKIx#`@sRZ1U=eUKo!#=B!v z1_P8{F_4YT>&NHK(c)V&n9B3h-Q^84f^i8zfK38VQNndgSPcGZ_MP+ zOBN_pjP4tEN-K8?TyOAvj_0EVFfhEIn~^<$@Kol5d1F@Zv6KrK9ffPVOa{cyX+4MJ zIBV*l62fFQGleGn%L<aed--^F*evXDmVg2VVQ*`!2WGV}$iHb+F+OH zxvh>$4=N{!4YHAvDvYTkr5|Murf;qBtFba2{K}#Z8SY6{Q}iDYZ#0z%{G5rwI^w0y zQHsk0FGP*Fco!81Rz&w5*FU+zT19nNzAqcpy?UH=_`=vqtgTfrdzlsd(I!PIAYT+9H83PE3ux_<)?+ zX|@8>Z~|3I2%MtL--JX0{=TSR+nt2UV5ylx7-jV&Fd(OV0D}2Zi3w^hZBV;kO)4GQ z_Cd{wZANBTR2EgP=6nyD1_4&$*L#ahFoou5CKHQHIKA;OU7GXEYST@D|Dfi!4W8}w zj)Jvl3=qz9S-c6EokMz{ddTl@SEFime-{}1wmTxCgrZuy8CTJ#86c<7q$W+83f`^R zaz!^Am`STuf$NMj@=4)}n*V{6B{TlPsO=@C`q4mpk)0L->~IjqS`}I|hjtGyFAh&m z#y>EGZevZDd@foJM*2D>C$M*pUf2QT8nYRk1|6h(ggibNA5gAd9E;M4P5Za2qMyL9 z`mOMR`%e$gVK#MezQF(O%pgte>VP3k#{PS(P|JI+TNHeG9$ zDL|%hW_7R~sCdWm{LqzI**$jmMhKUry=Q!RU|ai{DjWcHS0mYX${2=eE;p|Q3EuqUH=Eh`SYiX>~urC|H4C^Nxu#Q!y=;qtA(X5)2AFpC`FcyIUQM? zN=E(#u&vM|Es<1cT%^RVO5ll9?x zmfbs6TN=qHJb1JP-f~s6EF~Q35g8cGyGg4jBEjI_A)V|h=-Pxy19$S1YomhQ*&7H_x9qFmv(&^TkrsviEa_R2O)`@2} zEXHPF2jIktGR9t&BYeph)e&1I?Cn@V<$&fsBtiq`^?wwbG(xCt`4fNN&ADHrjL{Th zL80!I!ABj_6OO{kFX4C39aHAiH1=X>paujmSeuKM<{DZ#(-IwLgjMDAY|AiZt=3g7 zI};f81`K%k6@+4eQcB9U=7>fdhp%!& zvQif{0+f}B0ZQ+5xJ;W{z9ak2nR0U@i@2(1u$@6L6)T7Dc!rq8R#XkNbq7W}cMebp z0A+CnSope`7gb{D;G`K$Sp^5wjWuyBBl>osHxK+b%DwaWnN5Cp057h|wQt>-dIr^i zg=}DeeA|Ep;%zmxO2>dTEGKBMzlXjI6(ToqzTa^o*K1CZCSkXRkG9bzmzbHjiLHWr zn9k7*!7Q@sqZu!w-F~jaO{8Pn==Cozz(U%*ms)=}9_z(E&kMATdmdRV>=#q|@u{E! z!Wl?SE9Jc84FT7cok0h%ZN_$ibPECbHA`cYRlF9D2DMdn$$&|sD!OQdh}5bkyV+8u zB4g~dxJlj;y<=ZymvVE_Lu$-AYyOeGt3$Nepxg&(t) zyaw|Fxn`h;ZK!2_r&e_MsD5V>qqZ%L0b}>G`W}>7&OZIT%8_S|5?;RtZnYAE68z8$ zM;9U5zq@nG(=6P8q!k!{+T^ibfUgS@X}+8~3CyXu-?HyxHGkD|e}AN&Fe;BA*ezim z?1x&Q=?`J*bgRwLiS9_lpDTv3QL@A1lDBZR8r8_~<~!df__D13WaOozx)$TIr)bu3 zfMNuKGv^kO4YYw>A4!fAN{Vl2jnjr5^zxt_$$BY65ZfH}3n3&|X@Oo8;0yk6eI+ZE zJe}5wKJFus#Bf1hDZD3Uo@udYJh3z51J^y;sRF{Dsa&q#y0w7VeTlLM=4!)9?Sj#Q zmzp;2+M32_8Jcy)&TVw9PeI{`H*vRhSb#hmTg0i2Tux4C0DPb%&2?b5{EopI+3`Om z`=1fCHS%>#QLR3YC0p+= zB$^d2QW1+4Kidqf8TRTqd~ZlUllOV#3JOO3hd$>AZ6^@9BI`6VJga;?W8O!Yr)c&_q-dSqj0IM)B*2!)0rc)3MW1X3vPy zW3xWH^jj-zBguekZN}y&+|oEZCOw5ovn|RS*hn2o7!_#+t!e*Z8 zvc^7;LuUG1veK57{8fHGiF*7841ezIwuftR3k;VCPdLNBeSQ$mlE;HJKA^kxHpzVC zJJJ5{FJR6X{PqS>8{-K*(jbB>KU1rY&1PkazYtP6cxP!2e;(6AZ@(rFedv?C&aW zTkXxVL}%{zDAP2xZwF`13vCB{;lQ>>QIj^`1t71x2w;|@C*Y+d5qjhf`y5~12B%Fq z>(S^1qQRRElP57eC;wL6;U8*DP++>Uc8YtdC&@fb&(>0g2jr%=d`k>UW77$zn%~Em zp7Crzlfa<7%HhF7=kn=-I-sO%#w1F`s`}}6fn@hy_6f51Ju;UPA&STir>SN8i+!4p z6%hGoxu|RdibfW}6QsmFf7XPpi1+?}*AyKb6u#al+%XtQDriu?w3WXUq#|n7w*y!KyrPK>q?E-*3?+5A6nn-ZnLVBWNX{Sg7Y*zid zKv#EZxpCe{7wO7nzX?GoR-OP@Zv3aQHY#MFkRnAks${7|9{n2K+7Lgx3uA*fxhk=g zXl%MP%D0z^7T$WpNSrc^(dG!}v-auPrc6AVK(7OQMK7rQ$IwCeUmyA_D34}uCyA6g zZyzilrGQ!qaL$-+%Q$tIztF(_b&4lqcMxH=Q(;G7fjDidCx~AD1ptJ8`)CyKJ|Vvg zDw0h@xD(}t)5`pM#0X0&j&?zM9<>P87E>D1tx%X5iN7)fQD4Ce!@|EOQQHs`86;v-54E+*tfAJ|A2 zU#Gs?t>1XXBo2I{Kmm9j?(aEYxL3Yovr>#>46PXdnZ?T&_vUO%AEP@BBD*H>#jg^d z*q+4yR@i(uvxv-C$Z5+*cRNOq_F;&Pv6Xjc+LOlUiqloG?cbndOe)5&K5azxU_Rf~ zXYx#zldL44gU5DuILwNX=qE;@62L0?JkE2aj2_E=v|q_L*8$YIG~bMf z1c6F3E#%D7p0p%B(N1$~1||EL6jSh@eY(AW6jq*3-=HvqC?&sAbq0-yDSKoN++-=) z?;BwrRf%F9A^~oT`FLvV8c~?f;G4I{R!^;J0%upTxK1sqqq~LG#!qZxB5((`^F~#V zqi)fq7CpBL-b&F_!M}lum92h~cGS=5AG0-zU$k@WC5dD|{-8n4)<2zJab$#qBOKvc zz>^^qb4lO4_mBp0sv5`i`tLdWPS-q7skL)l$U#8141h?2{$3w(wn$?aj4Qkb^O3d4%GJ(V2y}I=8Vd7Std$Q86r&kdVFjxQm`^bwrnxzxtQ%|M z41maYq(YLX(22)uhC8xaMy2A=QcGvUlr2%jUv`%(8%%-^+9E@8@{=r+9ls_yLyJQg z=M*cnY{leH6QzaA72#VV^Q4fZaM>d_cBs)>&`6arZGI$T7k}pZi*hTg=f-+NH4}Lp zau%RtKXBt2u~z(P-8)T{2)u=w+uI;*55OzkfaEhpeA-Ucxfq-M@YJdeZ6#0YbcJ(E07Vy zubf;%(_chA?!a;ue%}S0b%4zKPszjIZ9cxi zAp;1ZcH|@UUHfC_g{fO3-?HSB)E_J+T*z0vabK-qflfh$PQUc+tZDGjpcB>Lk?)Wr zl!SvUJl~dX-C^-mD50PHq#VG-iWh%_OgM+nk&5pek`Ws1TlcS+ssV`eoz{^f{T$sq z_<=elhq4VZZpdv8Ic#dCa1>(gTo31lfk%#r4ou)+wf>l9@>TKwuX9GwUYCYH=84U=Xw0Ev9BJKJEsek>dQ5>gh zC`#9Kx}bM|YcPd#g9n)ZOJf<1J4wjCWMYq0fV7De^F;9#@cC;z4AeqUjg<|^8qFFv z5Q)1TWy(+zVW`kq*>=o#{FlK(X6-t|13RBaYOwxxn`TBaE|9$$*ka*up7KZo$`!`u#y~Fi3=uvE>km#5y3)C z8R%eG9jH-lxE6reFongIR;yYd2uzy5)N+b2iZhH^B`psf-^Dz=)RI`ns@rO*DF%%+=uHA>E(>DzCeBTjRpGG={S=B0_48%vnc$l4u2Mf~OTLwY zTmejC&RyE6;^<>l)R;x7_)!6<`A(8KfoejczGH(Jl^w8UY$)MiW#(Av*7h+4^Xd(J zR1I9tMsm&D$#+X;W_CT(nfOeOaudJ_K8U%C^O)!! zfzxO-a?^}i)ei$1LhTDN3dI}GlQVDCnmUKu3)em-^K|z+b$#8QRx$STt%nqsKe7hC ztRcsc=jUP>L5TTw<2I;<9q!CT?^xMUl&!A|Bm*vjm|Q9{q)eGIPqir*Blqk%FvHHo z_2{h`D(RqzC#e*~T9EX1njvb5`rr79=XAsCGYUA&KI`XDqvsRe6#hnB+iM!+uq7Iw zd#|kJWx((bv`KV8Q|V&9kGWjCVLVcUq_P6z@g@lgN=<4;;mswPGCN5S1o2p>jLM7M z$pK0w8<<>l+C$*}q}u49AcRV9-Bb9R#UTLbK~cU%onIvxNw_z3`|^$87d?wLj%r=} zP>>iu7>94CvIQ9%u51FQrcM9e7%@JYx}QshUURK(()q}rhghU$bImf2rWc)HGGS;tGq1_mHDG5Kdsf@Yr4<*$7yy#vwd8&fj=|gS)S?0TGP4kU zgMO)bhH;=I0c67&rmM1-qANB}z@#DHS1tTtdmz*ErpJ@hZqvG3Bo2EVS<(umK}4Xq z%($5|TJegWsvTwX*h|yrzG_gsMU1lH-$d!(QJPFy`N}dQjAwE6YD@-%bAoKRT!fN+ z{Dxsj`vA9-UwMMeb zg7Jg7GGRiHDB6toBsf7PB!c$8Me<(fhepor=0%K~Pf>R1zCe z1dyayE>h47Bf50h5JS7_wzT;R+*m5}WVx2d7Fwj=Jh=!=nqDhBA!TfyEW zz|_RiYI>K3Nj3IK^=ytsXtairf(eWk!hjWyxLnDI*h5iCj_MU4>1<)()qy7V+!xyX`l6=d^O+Vjp&V6lU2FN?b8#~03ev$cHI1zVGtE&O!zqyT5N z&Dfgg&Gt%(6>||V)??L#1$na{MOoE4+srz0`1l&a}Q;e z)xytI)^p5!X#VeDGHDkSQ=exR+K$d&%>symx;1>lA{jGJoHzDDbDbCX9X9H1v> z8uhvowFN87S2VcK5vr99{)0ODnWML>BF>?r)$&gQrKyraW~f4-5|K*g9u><8RVo~J zRTie=<=P3Dgt8bV`3M1V6>xpE#nW^DYQiLiBQ}faEQpm?mpZ)va4R{D#ckuuZ6ssv z%R}6%89|sSAU!7TuotL+lf!@7vR~wx%V0N6z^DzqSK5Dr84>-IgN0{4NWLJx=&CN< zEV`*I0(k^JC`^2(a8$&+B&uKE5{QwrjXhhquiTo&EuYOE5XYb)=t1mY1K2U%7eYUQq|$7<&Mw#HOsXfqq|*WlvEzy7+EtiEckA7rOtEst!M0`ym^^kN|CR$JT*I}}%b zbofO6*(=FZGzr)(#`P`I$txsY%qdp%)L+7INv2;AeY9qY!hJ@VN|7TFaNes#5s=S^ z&f#+KI*L|62qRpnv`kBJZCO zlr&9sj7Xp&3cs5l=D>`ZV@wI(_1#oa$9jH85B86*<6iALk~6Du5JoMaW(f!EQ=R?M zMSlw65ErE+OM;!ZMyXmg5YRM*sBNIFS92!C9~K<_1E@qo52{+tMroY`@heA<5W3n#oKa1Gjf}sfYyYTiSBTtZ4WWLF!!*(S ztTpj~A8@tPlY2lBL$gY|fin=d((!)LSc_~H=pFCIWswFnF#tJx5KEMfejmH)gWARE z>xPUwaC;j5O+N8&W)3)E7GL4twKMb+>gL2dq@!$uvL>9r$t|+^W5c&F>eLg}A-`FG zc@N4Ep^;nN6N#K+6ZKl)|q@3*Dor+nk;^MrCGZ`wu9#xp`1B;Ixj&8z&50; zKL*QU^|EGcG!J7as`==z)Uk!?NxXQMfek!m=~>IJX*!c2tdjcfzi2Ig5UJ)4Xr$-W2?;i$GwFeT2;NqLKGq(t;KN5jpPit z%qcRh>h@ZGZ~r#-VfuCT%+35;3QZ1)H>NGV|n;Q^c)DRtYBdfv)(_UVaNOQjB`NW*^nDYq@D0TLzM zOSwHHOX(FUZT{D6G>F3@S!;N&79YxqCmsy35IVKvwi$CIQDfV1>Y_w&@41id3zk}I ztYxClnXSKzsd}IIM=PI{?j^?*C!1L7 zhQ$wM8ds1Zh65XMk^DN~3!n*WmF$=?LOYvou%+1=jlm2yG$G%q+P2xgQ0^X_Bt07C z@-26HT))7kRCOZf`B8m-Sloiy{j~dYMJ{iVr2v%M&2M1B_U4!?q zBk}OHVoNpF{iw`VWO^FCQ+zdbS|}Z(~N86c-_dW!GlaNz-15MgJh~;}x$}87qBVq6fsLw7a41zA3;fM|Nwh8ZJ7WV%p<4J9 zc>b9^yblv6px&F#(4-PZwz&YV^uY6pZI3Ws#l(j}TE~*%-&@)|ZoIno-M?W#-GQt} z@%;SauNYdls$p`SFnvGqiIO5lpUOoN>h?MLi8)vyC zU3i#`a%;@x+H|=JXFeS4ZA%>>(lwQ2iS@f{Ai%~lQ}-<)aR5XAIX&GhC*5SVNA{n_ znz?<3pQHuQARwDGb#?LQ*e3wvogN|Jhoybr>s1Jv3(72Bw)}IpAc3`fRyQ}g;A5>_ zlb-WG0DnM$znhVfKueH^4SJco2{Z{}suWqdC2*^Ohl+SVM8-R%3MyV$lE#n#&VT%< zqt$aSry8Lyjei>iuT%;RfrgMY8IKu5wV)e3|WW9Ajn;j&TF^x);}M1 zU4JkfxCnc8`>Yl)K6m;C^1KEz{V;O3MAMPKCC zV!pVaydoTK?$ddjp=`@)9WMQ{h}ca=j*g1Z!Gw=Y9h63hWYf1^Qc1t4$0HX|-Avrkm04>I#CX2cI3|XpesQwkevXF@vxR5zS(qPZaIc`qd%{BgIb^Xq943ZrhUD%;urWJe{ZTNY;u* zs=KyIE_etLZrI`fq#-^=QY2+p;Gh@LSi!GKn=R6~r@m_*QMDqI34gv*{KU8RjwL7& zU&9!pV#+RcX;rH7Z8i^8qluP`U#&OCZuYn`Tz9R@2PhE!KRgNrx#7BN3c5(^ap(ug zbl22FVhPocL%+yy-5~`Lns4$Q6L~$m#lQ9D2fbqRUnLU!8h=|V+T!_ERR8UN`e;-< zY?K7|mU8zi&lNPamm+kE^F_@O##1SNV0C1BO!?U9AX%_5I3d=@C*eO9c}1+Jm;09s zBY)IdN_*G%3YApRikv_YeD^CloUAT*dB|QMuy-3sav_8S0{1G&?AWJ6#u=Gu!ye)O zJ*}(mZZyH07sqm{x~jFkeP5S#5ExORuZ2X&zBJXoDL&YPly5fgZsZ0xZ*S7C-kJwl zVkOd#)_8J48S>j8X#5h+y&*+U9rD966Mx+{kXm>T59E|7PMUxRLX&$)U*zO$AN&r0 zSKaKjlJM9VNy-{viu@U`LeyBHp#(zTslXkWM(bor!D$Q#YeD6x5vqQ>?mQfwv`alg zth`5x`?A-&N*unSDX3h-Y6T&c%3tp|gGLh%F4wSwIl@V}T|HOi`Mq=2#hs@FqJQs= zC)gthg39tXg4Z)@3`X1?;e_Ns9<((@#O(0^-w5Z#Q+x)&-K??ob~N_<-|WgP$bJiR zgcoPmC???txqpTq4xEJ_q08{2v!&tLA=ffp^jB%^u*fPwvW%mv)?~_k$Q;(1$FYUj zO`5issQ{b5YT745%a(TMlSL24@_%>H76vL2*ajY;m%i*)4>GUcotiQL7cCk5%{HXB z)Q#h3>)1d%naKotqoL|Gj{MrGUxM&7)Wav^yT8cX(52n~#Pi`yTajbVFLHl89!=Wi zkQxr3R{QKyIq9$*2_0L2=6PuoWPe?G-gMSsOnVd~aS znvw!ykgDCEOm21T%y$N&Hs5{s@Z)?B`y4_WsjBha{oe2MtHZ@?v9*=> zbBGsy0KwIpe14tZ{GQ$i!7ndBr>)9?xL#W%@2nF|7U^JAcBOBm|Kqe{+^nh%j?Lc^|+9L1{AmI2Jqe>lg(f%9DWc1Og^l@9E&yk8`*S2AE@`r+<<>j(1%M)1?gt z3!ls?7z0#4Mp-&9NTV;Okso6?whVy)%&4z zko_`9@+=uw?^e}QNz{PM5Z*gLNsz%gOvo91?TN+15lG?;(j(He6FE_u zK|h!QZ8z{S7=M%}4F^^AS2am(1I1~x5tunx0Z7xhNo?(?6yohDR~BpEE;48&r%#Ky zvyiYXHhp3Q*fN*Zx2$=iJroN<`5Hhpw);r{(+FS~N8ssGHSlHdzZ_*S9I`coSybz8 zc2REUhEc;dTZW+2%w-Y(my>&hi6pvKdQ=sJ;Uvq_%zt~_609PLRxclC5R{~Y9q?1V zN}qSA@Im?a4&7Zn8%(}w59T+*5e%`Yq1ElaYUReKX_P`TTb0%EOF=Mk^AIMyhpPHa zUhyp4SLZ*_UXWGq)M>pYP}@mW|3z)7Yo~#tr-mGZ5|?H#!Kpok1)()aIU$o{CG)%u zWd9IhKYxzXJ3S<#1QD(ZDU(q%5U*7I4+tgaqUsBocVZGAv!=FX>)ru-X5dwF)FU>& zYgl?@E;*hCX`T>IXJH8Tsf8A+HM{2QZZXf3f?(=wLWOrUiq3sPY2wCMGNc+~S3ZQ5 z(%@ECUhyXlG^Ed>QJf;u!-;Yv7 z2p2RQ!X)6m3X9F_RSQa4c_M+;)gmLcRWD`5j&3Qqx?UHOJ5q}xugZ_7NxYPUPa=YT z(Pl0DjOOh+C|FwU?FKmWtOiU;mP2dN#qnOOPYd#c#2z8a4uVArTCz$1KVevb1tagowCV(m}mGf8|qq6TW2iiJR z7U0F;xUIR`xRfs-v5I&X1aX=`lMHHVEzOfH75^Yc)?uNwyJ^lGKmWr#Ou^cthkvlO zl8C_h#sgFPHwetgucI0=bkG7<8Ty*h)t>Xl_|M6DXK$SwM*A3#=ou zMDi{u#cqt;wHGxmGJUEY+l}fRXk}X{O!ob35-)8W*$Q@BYMXPGv9C z4Pn-gVHwnCeEXf zuFIkA5_+GR$!j0Q)V4?}23CObQ%p}V84o`lzhEj`e~2g<`C6_;i7~kr_14N_jYasNm`V%f zux-yDu%2g~!;#71(6V9E$vf zf*t3Gc7}3wHk-o)Gq}K${s57dXEeG!WG|!8Yk5+6sg6Mm{MrB-2Y z+At9P&adz^w4@TO)!IoDtet3@t=-yzfL5!7gk0wW?tg+E*$yq*`rqdy20{oB)_el{ zeD~hny|X`m3CCfj!texShzX$KWi)w+M(6yQkPpY7PRKDFe>@p{mz?#;7$$h&a3+<& zlquP)R3cgCjLQ^Nvt*^i^+^!TvL~Mjgo<)DxMEWrP_HFM(FB-UZ2Y&Ubo~{6x{;`yj1E14eN{g?IZW5yTFt~&7(E1(AU|Rx=8E(t`E9?e zLI80&YN(ppYtJkSf?65u>urImAy(ssk191k4}TI2DXI9QKCF9-q&i90o>vVJxK)t`mnB=ipIXQALB2sLw`sZ`R=@J;P03n+s$K*!h~ zl!CH7-ZxMsgXPKOVym&>Pl&-&sfz5Bn{6?UOy+$aF%Kz@rXZ+4LwKZnPbw=5X{BTX zDu0Jq2t2dbGEypMd+OmFOIZGIG?LJL-hOxlqPjpLA?Xwfux!F_%HU(7)jLayr~UhM zWJ?JAMnenC`7yj{U%11&*7emztM3}st~a+;$ARHCWZ|p3Rz*Z{aPQ zZL?eEfv?{?UiKkW(0M80Dm4yYDle6PtyEiU+b|S<_pdkw6WfsNVd-ErO~#fQ%Enls z*~7qK6!|z-XG@+grD4r~pDd@&#cfGpdhyZcbNRlbBVB%~i`w%zsZiB~B7daUrdpcS z7x6&p`|-zfI>zyb^W>`%{FWA2kz_8o(vmQ))x`6RIwdCNn(4JeZiJ0QIq_&ol!BO> zYL^l4K_kx;ByZxeXM2A=u&Xx9l2OPFr=yLdMYetSk%cNN>hkx*?G%!n*aEc;-tID4|!<=!<_8K-AKzPQKLLF`;jb;-6 z7$z}`;PDa8`f#*ItyvPak$lo&o6hp}x<)H1S)p#sPDQly&V@um3)t01d!|4X_>FN~ z%z=wu+QxHo;OLsB3#LZ1oKP*~dNi~CR(sA?p~5o1xR_tZ^Ka?*AAeVIy7+Yyr}NLZ zi>T?zmiQC`A|+V|4%=0>xLDpH)xj~nr^;dbKZ5SuY|yiUUg~1MoBds@v8B{&$4k_9 z+FsGnIiE`ZH3@y<4go9`9u@h|P1+wtHwq-nVkw0T-PIdHa3xRy7a9t3k3is_lm_i3 z16?3AR8SK41O)I7l7BmUvr^<#WOz8QkxkWngCV$y3ELe^XK?7ZozjiB@%{nDS8Z$C zFcALkUvUFdJ2V|*?O>3mgO!eTp9b4L)upJm(rB?IPm4rQk|S z!njs5$H~+_d#<=<`q_+p6}XeinG?oDDYz7IOhe5CZ|nkHYsw=9!9i$Redo6W*wXAi zW+5yxZcYH)60ZCs_mRXIor0^34VVMZ;&{5xaYG{DrbI7m8!jum6N8|@kvFygpD9JP zUmkmMkuZL(X@8<7aC8JgC^C+d2HOPA!LqEemN!=~nL4>3QFJAxkiG#j1@HTkN(xD) zG~81lfcsgJB_I~y!Rw)29P@yg9^;^wxJOFz?4hY@3HHsH-;BWg!UAzJt08Visgw0q z>TSFAvKLY(YdiJQ?ilrQNsD?l(xqNO+?RUB*{_T??0@YOJ-)>pN~>_vtTUS*5-@dF z;H=y@aBSab*KlBV-z6mV>v-{9YTJ}INp&VU1dl}C(RC^$9)lqjXo)Ay23t1M5_xZK zGbB=AF5wjL{1PTocs1XL)u=oOez<@rOEEbRO%;$h7Ed%9XrOf?-d5nFm(2=k*yW1^ zScCw~0e^lkD@~z9?XrQgitkhkjj0oH*B92c`2P}Ju10bH6VdH*#X?9*!X=dSfhcfS zd4M5!>(yd1)8cUyxYYWp3Ch8h;8N9psTcz0yN7?w^g-V-@)p#!h1D zPK^0-EB|6Ct@*c2T3`Z2ZypY9KA-;!aE)?yd9eE{;|AHxU{NMVaJTyj>Sa z{fSPU)K7e4F0jt*bjq%rK#3J}b7~=p1Wmp?}DX z_Uu4u_Qh9cDXR&8Qz0TCSN&&P>83~GEMy!T%0{8|3>;S#G_o>UD!(g#2zfj@LKA3` zJ{GT?gKm)4I%COk_d$L3RE~N$%$i5*%bho#dtewA@qSXC{j&u!6ZFkz{=@~Hl3h!~ zFcgOG^D80@*+4t2!(>mSEO~dJv_jv<3 zyR&@6lJz!Se59SjV;qw$4~|w7kWp&H?W=!wsIA zJG@x6V6lT~T$=Vfs&e}b1mBH6sQ7t}?x4I`C{KRt`-$d%f}0NRAdgMZo1TQ4@cv%+ zK@8TAwO&V2J1sh$Wu*~Qq<@dFWDd@^iA~{xy#cLLO=|)%5WVlOh#;b%&{hjYYm1fA z4+=flTT_;pj+(lgESan*>VI$Ct?R0*s5O^_$$K;JO)|Il!60xP$$Y?oaUkw<=y${Z zgBo*wRlTY4Dpap)^c9ut@B#RYwv|MqnUDtQ$0UIE0Qj)sINW21mgd|LaA9&z{ z#S(gA>ecB*8qhtf(wREMt|07sf)g~%*sT{zZiJFV;CuH6xGCmG%nP9uVPnQ(X)vLd zgbH-k8jj3nQIu)TCP}bRAVtbmC|9^P~NeA9W1{!Fl6 zM`-U@?S(Dz_V~>VJIzCec+!j$rc4m<5Hgu5BN@EItv!wf8a(sM&}9}EcBS9*QZ)LY z?hsb=RLkSSM?79T{kQ++DxMPB2lGd8M@-|!Fl1X=8?ZI;T7Qg~fvjoX8amsTU1OcJ z3}YC{*&(Ky$vzY>%1Qm`szNRk33KNc)mUwF+BgvY&aY7CxY{&0X-lqig-ctSK*JqL z8Ip9SjZ=?e1nBCwlVsYopdVWi*Tmg#i16N7yCE zIgI_wc;(xkNE5Gl$6;kg*!xx`ey~W7~E*|upmZtW?*85S(Kw-Xo7l#Jt}(+ z;Qy5R#DAP}Y`nL8t7nuJV5UzZ0{40i#zJN)I>8q_V!&_TG+KcYkCe(^c^Tp(BCa4k zq~W9Y@K{Gj*1>@R>;4AUI3#ex-V{cu1VHp`n1UI@S7!Pf?Y%(rgp_IvP_GwyE*Zg} zYD<_Cz`!czau9Y{rB!aM&zFR;l&|5i>ibpBe}4|PBn{RLl*zq>_V)Jj?9L>!RI4s% z6Qs#P|3m;SgN$w8BMhyT+)iWhG^P0i3fZ#$E!FrroDd7w@~P)hPTVy@_w0v+txU56 zNVH)er5HnbK5!bq>DGuscldL#$N=V-ob+|&+Hql`B;X15!9Am9_ccEry2_k==tgMW{5 z2G42=mJ64T$gJN>UT|;Hw!!4K9QPek9>}NOl6+Rwu5EgFph9@Ls}=#Nxb2ZX4M@*4 zl2y%i{f*N&f;G)ee$9jSuK16oJ$iRV4cL*0O+upYA-qwerx@t`K_tC1dSw`xx63aT!!tn_Zvz|p}j$rLc{ zGnvev>;wEyjHTL354)dqBY)N#CU%FMs<8pg)Zc^zvf)v^seH`BQ1t|Oq^5)(9jT#^ z;b5RzQOqL!QqM?FesSuJ^qa3BSe=cZhg7H;SHuIDOKRtNT{lDT$6w5IZ1o>o&o91J zuE&%1v+GiEhssdVWaK0~sd1^|)e34l-NqZ|O}Ei;TF37i-P4ScgdXBY z;>w)UnAiNI`k|^9t0H}te%s!9Y1%gY^?-ldE{%1og!H%i+P&7hR?E$aWqL-)9KYa< zH1Vs=iR5eMM^lEv*MGY8K}Nth)1EeM+q!s^87Vr{+?gqNvMF-?Zeth6J1*|N>#Q36Qz}=GDWUAsMla4 z$DysZ?zhhlA;d`_ZqzmsA}@E(J$`&XpT8W>Z|9D~@C^JpCVzn3vtV`;OuzC6LO$+& z-Y0vo_i2Ch&FAcb+`<qf<=O)1&jp zLF$?dE`dlGqkoETDw6sd7{r$!=>khY73D|nx_k`i5RINS?}__HqjlD9eRsS4leXLI z54z3sR2caJa5;g@Z?r?v(CnFuU2B~p)|{_KwlMkOa1ppKInO$ z&}nTQIg&A9m7;1=KW-of_m)B!V$`yc(juo+w~uAaVl8JJQS7JOl*yCjZ6+icZXJ6Y zS3DlCxbmDZt0#meOC5obL=5UIwiJonyHlmstyB#*CgWHHZTy;|!OfBp?>Z@d5Es(hL zx=yR}tDaW8*hQysR^*piM8lsy+HR|PF+|60LxWw@xQpc+T=4P8R&)LzMp_2m2q z#aLZ$+cp$^_pi9=JWIlo4p=&1sB33fnqeCdEWo;_x-e*oj=4ybCQ_@7*8A-vDVA>w z6MwnMHrZ%IQG!{9LJZ5Fieyzh{*Z3N@SE%JUWM2A`rB8FUsy_i3pY4Hi`$eko+Cmz zn~p{W8?xt)a>94&&O<78;(R&^W5gKzy7~i$+}H%X<(Nhc7AHkwU5`GEKzy=1<-#(K zV2rXXCOCSF*Qkg&gBhSaM>{{5mMe=@On*XH7c}G~r67!lPyS?#W1L{hFJa7-Ke3M% zaeO%>v~I#M&Jf?!HpU{p4CkC+X6~UVA~FONKZvK+TEv9~`rz8qms_B6E3uFtvIbwL z1Vn&^Xo%DGsW|^mBfKUQN9JZ=d6AzS^CG9y`rf|28uJZdSMzSn?KI5hae}yrqJKkL zol*yzb~u)W%Ku*|CK2NJp}p0&IG1d>pbuP$m67y^(DLhcSl_L@J3X~b-Id#IJ5{>1 zY^_{u4^6FAzV^<77=qV%YN7*nOT=TI?`kD@UwfC}eIdWTl3#zzuP?n|n0VG{j#0RA zDF_ggVBtr+h1p!=*daB-F-eF_V}AxBmTBXuF)u@w2J7W*Ls~!!QBPUQ{L1xZW6Nwd zgT)%f47;|=&q_Fansy%TNBzH~*Y6k7-BKatTRFX~A$SRm+g>4Y_Kt<5YdwnY@;uG` zN`&6K4TcJFc;PkNcrSo3(VLXsq?7WAxT*-Rek)SS>mcZ69Hv5Ow7}B?nSUF4bW4;J z5oKApFPteUlAeRsm;`;SX^Fo7Ao~;PW@BNg22dO$G?Vj!Lv7$xqy{9e zjsh-#dG78i7Fs<8Zl>eEEoH!xY4_(QtotD+VSjT3o;Z*2XB=LgfmAs1o}Eap^Bmkf03Vu9Mse}wE<_T&1?;%H=jq$M!ZAjI;tZVPx zF2lF#udv{1uA#k63u?3Xri(%+tl`u2zF=Ivz6qoOfv`i8B9U`dP0S;n)Ff@51sl)J zdt~#r>T^f2I)7Z%$EiZw6RB!!I0IGgB%5J9lPa1*BF2b3+|XXCY)>w#?B^C$joW=x zHL*I@fcK++0IgVSZ`(E${qA4E6mBeGPLVDhFgSC9*7MM;Xi_X~gCPzKTB2-rGNqAJ z9%%F5clpv=v6ICp8uNATxldmDx8rn`_IeDjiAZrk(0}}Wwq9h*cgbxK{Cx21o8W*P z{PJe@r%2d&up(CDQbB^!4fwISv@Btbhp#f&djfZH!Kybc- z>dNj%6Y;)ZBB^u zEKnH2n=Ofyg*|}yD>OhRNunfU;Ne9kVd|BGqU$tHLUKXn$}0k5VE!e1U=XMPFa4WQ zPC_-WL<|~MHvgwQk-7{P$=VW%yUtwZN>Zzz}Y`!V4vFOJSv}3PHC*bn+RU-q(c3dM7gkMggW#M?*EF+E|`6dREDyQ z!!n#Xye51}JbRgxCHlh(>k^tXgXZ%BeRmeUM=yp=QTE_g#kYAuwK&jvs`YMaxJ<5i za$^ctR|D+LL<)_cjJ&~Vf?RV0RU5q&2w!6w<3$Xi?M}Nbu*k^>UA`1o5PP$0%;$fw zCE>RJfGNr0iW?U3VxrU3M&x$1Xjax)jy5&TwsQ58cbeY9W&o1KHHQs(;zz z(69iJjXudAa?i%~R3ko;D$pRD2JRHv-9@^SHt)WTS`^RDXH(;yfqbMMipWN``O|h& z)^2YA2wNIIE24d8Zvm)wJ_J{)^Uv|KidSjIZM+;8KQN4to3yVF{mX^MLb`wHRo91k z#T3u1&O+V@gtoTD1`pV3pbG8aDOI=(qC1~Xl-irWfN}LxBW={Hnx`#lwd7@2#Wvi3 zLi_)pR;|=+$4k`<56YdNC-OLtf>y@m&0BN6@BIhWS8H$6FckgXUtz>(9MK`fKte4Y zVx?#sY@N1&kjNByuGcOigH9*o+k7*oA`i(_BMG2GSI5sQfL?w3Y|{rf(k z^9osNH%mfLV@*CW_TkyuzhJ+LGDfulK*Pq+XgS3R$1GAS(*M%MAy zNiCA@$;_mLiF*$W_j7Ti+Z#DofpA1ca%L^hBp7HQZ7*4y74$sc?*T70uR4AZ3l=S5 zAW6xF`iDWDdg`|o&QL8>^hy=YO8IUU1-TPdd2GS#?$3$PX&rwV8|d32P$QZF=&+Zj zvuOU%+Ag2_{n6og^f^44d>n`4@1ybA<~nuVu2i$@=Yi8gZ*+f#1@JucSKD+phqm=hux8ikYOqU99#xQPqt%YW zC1G;{Ym2?Y`@o@u*{8cLN_AW7{T9W)azMS3jh*s=JaJ&R^xMRoQ;Ikz0=5KeRigvx zdZDXhRhwD0D#)Fbyf3+hX8ZGzr`U%tU)HCya6Npy^M-#|jEIcUdR@4x+uGTT&Z1cD zca4H^XSN2t8NSV}+s>3L!8smzdXsu4OU$c{$0W^`|9{@{jjNgn=g#M}UsJmNM%^N= z@xdlt8{tXI_eO7wsHR?XZ*t!mn+E^n&bYa^Rfu(j-CJPI9~bfjtM229&Sf&W{wc4i z=LBbrM>l`6Q}ldGi=UE!;-~(GgyLjcnAUFq#zNl4MX1q0A3RYNcYHB94NJnUGr=C3 z>Q?uaqU)FdkpL42aIKuZ>LCu4FK^K5;UMQ0lDmit4!s7JaLMPMbE_`GzmW0!zymKp zlZg5l`s>w5uTL>q{F*laLP)#Q$!!6c@!e-FrFbt+%doj2Y2WZ~_S~`_$K|-Ps%B zg0BkX#FxeS7_6zVqh6GZDHF-d7d=i@v|hAym}YioFq})ZRtPc~jLI4iO*8U&rkXiq z;az`V114!bE5AA|#gFrY@f57S(uriAd6Ivr>7k$EU_96pty%kX+cpyZU4O;KbxSFg zL_3e08~M??j&IyHjXkoHn~vq-&?F?Xp-7eh{g~GO`|U0W5~QTFa~I7-ra)kKv5#** zAm6-jOIf%#aq5cn7V;?X?f-z^&`bTLkhx$V2=GqJ$xvq_TVM_a&h(nWDtp^54V02hrY@Rd_nJi^h*_G1sq33ELH5M@NW^z&jR)XGcvy8 zksni`3L%AG1kpGYhq&4`8r}()e_RV30{noNom>l10YR7VTni z2!Dx!WR~0tFHVD`4275bD(ctzTD~pBpJiMKFH6z8^%P_0Bf7+OL6&)*6$*+nO)2A4 z6jOF(3CxRZ35!^N0oFqBIV)9*_*>JbHd~dD?h`Mi$+b1GM15&+&7=8sAhchDtW4QXnlvDFJMj145KHu6-%{m_Mv+Kz=X$W=b%d{snIecX z*x%njeShBjq`^#7;MV&n{e_qqj1!|jFnoYd{+OOrvABHg* z;wO;t;(9t3f>6+WE->q{k|g+vJ$Dp=_Ac0SNi>%Qz3KJPmpXK0eSepeazg}nYjC9m zeuvJ}vFAM4x!!Bu>AJzUDY^(H+R5|$#k2LzjY{c%W0Cv|3;LYlq7t%u&Bj-4soJLi zjxV+$G(Z#uwmTL13L-zxMJhrdT;0@n>INfG7~#PQ3Fr@crpI8GC_h!)AgI7YF^^HG zSHI|U37JMirg&^btF-A|Q@QopD~IMg*IdRaBm5z3V+NPPu3HM$3&PVhSmu46h@FZ0 zzIQTzot{kzqIY*&P}()-N=xNZPHRwY8i4-Z6b_wmeO75ZdIAK6Ej=^-K`z%L{lPU( z*_x$W9J<=y-3U`!7_W13vKkNTO25M&N?=;rVN z%atn8>Mb02mSuN7Mobzskm))dc{kXLiy&%qu6SA1 z)rkyOk#ey79H+HaQw@5dji~~2$Tw_%9@B@yr^_ESp&P;tK4)q2Kyfjh3Y$%uDG;fD zlZddBZMe`#JTecahuO(c!3@nepwRkKFlddXhUGO5m%}R zKDPy#o<`h_ibCA0ijNb^twy{6e<{(g(jrnS=cF*dIg{*>qaYBunxGqAVql$r<19@D zJ7WUJ3GxMJfTK(Q9%(d^SbQaU_1gjE)Hbo33++!T0R$0`dK4Q&t*JJ8SQW?+jP1Cb zq0bgUhohPY|Mym~#oi;0CiH~56nrFMAeOm$7;DVu2oUjjt=Vu`xt;q&C<4lA%L<%S zrX1JSSZym;yN&u!8OjZv&z`h@NA6&uvAwZylavlEu(tEI=20z5)3J`;S9wawK&PP` zQ&o666d?J}r^Vdoox2;T5(;!}C3@sZpEN>mj z>s-8ltfhO6T7CL#2ceDt=7*wgIXk&0B1Vzh7XJseurlmva$)#x*Vbn)6Qe_9d%p=u z_hNir-0D!SSA!}w=F>0E4*lmsWd%uZ5@XmzkrGB)v8}b#;hl=PwY`eRJrPnXoZDG_ zaXPCmUi2k|cRoG2y!;*i{QTh(i{%HHtqj9|1a|hCOGQmMMXCv>G#OWE7_`zvr^ut7 z#`XWKJl}(#%o4*J8zG}ZzN0p1U72I0y*)LSEU7=}-U+R9WOdKDrguG+&1b)k;gUeI zr0y<4ozUhw6;G=Rx(84ekap1Ras4&&^O`{>^fAKd8^fnKOMHDz+t$-iT+2yV30#g* z5(|MyE?+)AGcLm3vB{_pZf% z?zVQ4_Rih3D@$~&D=oQ_oHXa=SX!cOUL;XVQcZl_y}$kNPP`M4=yspy{2{Sqa(*)d zU@#cW0MFK&B8}HcQKrS-v-HzComIhCdwb8S{6o4b!7tDD_R19tHoY#%7h&&w_Nht{#KWzHpO=5YARv zbzo-Q%J&{mXqkLS|1&M}C|%uGfYckS6m9Y>IAG71`~kO3TA< z_IQS}y8yix{NdHBV6|B+4x!?YZ{9=IgYN;Oq#ce4&&hI~7A0s7%IY-kUS5UcNq5+f z&qq--dK>oRvv={E?l>Ne;eXxnYoay&+2Lqvc^)7YDd=Lqr1N-{ui|As&+amST*D5A zz394sA0o2k_joky;V;5B-3a|M4u7~Fj6?qS`l)F2deG}e09W|_bdKo*r#9hE=K5=KK}3R#UKh97?OkwRvyc6-7j?%Bj{n%5p#P?S<9C?#?zDHoAkPQGZWQ6aOfSYGEZ+4b zWYUM-J`w(PG&&<{2F->a98N+a{)GM(US3TJ)Mz*z46iY**Q4pEhP@v4ri0OtJ~o+> z7Mos=@t0TQ!4QA>ZV*O&+&}~J+~nKF@GK=Y0qN7JY zw%E&{i%$m_q$5_v|_^l`3c(xNbKEDQ5(VcIe<8pIbRt55ZA&w6z z^Xo;Dt>RyjB1>);oVI}>9UvRz@k7AEPwV2RH-zF1a?!vi=qkO}IUE$z<_URe>Ta`| zRT=1$^K`aIiUj@MNL@n+yj_-lRP=--8@Z=EJgJt|PZ!Ce>gCIIwt(Y-_)qDlw4i<` z|G>ea(wp&AAa%ITHyr~U^J3$FoBfj`FM_a z;7Luw%Rz4h91zL5BcjY6(%A?0(!u`zp_>4|c682r=bw&p?Z4PfsxvU_g#Fz_+C>J~ zEqrAR0(KB-ZbDA)ez+w?7=soI;bV2($d2juH_QiRy$>4pK=mjfu+|JtSsQD*{s$@dY63yUWVEqjKk+O zWCd`F`@&aJf55yrvyiQS7TGG@4j$T{mulC)9)3R@y&bYnU>1_<&#H$bo1O$7VLSl` z5uS5{-2Ae=SD+w59RV@&u4T9h$jGcahc;#ntx9<|Hu{mNL)dsWzu~7~V>{`+O+)tt z9T9cTV?62Gx+gzF;Mc(Pa1{LMm=jJJL10~9FBY14fMe930AE0$zk}z7e_ls5p&j18 zjY3S8<+s&~zRxw=6MK(jb0YLVkSSN^1w65fBNor-KA;rqM8IP4KjR!sCA3V^U<~X2 zic$3=*z~;pM;XC7GMM4IX9S&B9kdwAW^p-7z+(aM z32BvR9m!t!XOJ$+RH6X8A?keltm~CRj|2U0_TlDF$M4zS0gkml!fqJ60{s!7)AmS; zB6&PuV-T^kSN}`)NY+UK*nUXMv;@OtU2we;vYy>x?ZDsT63DqQc@u*>yxzU(l;C68 z30{2*7XMwu1hAP$e?bS+!++U-LB7DBUcMI=DmuP8r-p_DJt^i{rJo7AY`@1G64J5G z7-Ss36gd7$1*(b zQ~ke-x+VKbYES)`RkMe9mVmaFceZ&}Cipp>a`84)Q%uC%Y-dH9e89mf4P8yk_|cWt z?`;3hgJCHQQ)R17s$rOs_TX7hTH={(A$qBpCp=E8O|jB&ObC1FSVvgmmu#xuFY?=D z0XGQD5iTv+f7kd$nJn4TBVL?8*$IA8CX4p3p$Z(x>Bxq&hg=~#7{cAp_+ok)IcZfU zIzUS>_`10H^q8fKxz1d2aAiI!_mK&e>Y#ghcnuT^zltnAiIhe`JLOx zae7Cr@D21ac+>m!dj~cddvJETK8r%Qi9dSVCi`Ej?4vn@WBzM}d1>CDNf(fL?9--o z%h4~SxmlPw$s)8erQ-ym2pd@Dse z=o9ire+AAG*?y{-LU&v>gQMw4Se!eM7R+E?$%ciecDmK@kCNMTp&9upTt~PPl!+Q` ziZ4-~GV{H`x_6l-tMW8h<(wY}R>5eYqAX7|D;IZEeg!6byHBv_fS7Cv>?JlC98~Dt zg9BJ*I_A*-9(3y1&IyaiKoXcglA?vo2nuP6f4KvA9%x!sa;=2@r3AU8NxeLR4mvQu z1Yb5AyQ&Hy!cj}H&Cp(}lTc1H$V}B_aBbxQB>rK1>%JGlI(O=gG7c1Q8@U;s?l+%-u9U8aIYpk|npdNcJUk{ks)*rQoxkf8*wQ z6oq5a)I1fdT*A3Cw=%2Ji=tKaNs7h9RaZ#ntlr49QP;XcLO{2b?I{*&<~cTo@L5%b zC6SCNRtYHljtt}Ah{Uwauo7x$WwEDc*f$2oQxr{%U3L~*ag?1O0{nNtQFN4BHw46} z&QZsWv~~#S-eh~rTO}!ILP_L5e`!x%-pAm#D(lS+&05R`i(3Gz2@--08+w9EN>*<-vls&*dPeySc5%YMC4mpIM|=+TXCZeO02ABnr@Z7asKNpDw>Rx$Ofgh{h* zjQz!?95S*<6Ob%|r}5!oL8|8{k-3g<pe|7D*abRHAvG z<7bo}I)O$Qt>ed@rd+bX9r_CneaSJ{KnZk8y8>!(1?6O3L6RsJhfKA|vXLp55A&c0 z#jUgTig?2LF*@A7ET-f49k8T=<^#T4;V({VfcM3(n=@@?fEfV zBLG@ZbPFCph|hm<<4|A=^|WqrkDL@VLy-U8tM*r`8v3QLYHa3LQVFoWW)!XYrH@l4 zy(dpzQMHPWB^9+afAI@#0Ox*{KDRsNA&ZVa5dgwaTOy^UQKc!_YM>qJ@64F`qK4)- z_0*)IhMEkU|HY}uPc=ev!@kqDubz-tr!SGyc1vYasiOBf6~S9XZd?oVW=oTsQr-E zs5^VsLd}bg&juNkyr18r=0)O7Ud?d_r>u({SY$Al=*r3so0M1N9o*(8vQtX_s@5p7 zQg)>Z%ry}g?fRk8DrBR-pi-(1JgI?coCb9v9ILYvLWJXu$y(%7tdv@y-f%h@tofhe8md1A*m=5;$ zO|pQ!doG+J@96h?{I8uhH;t`u!v;7Ec(})xu``lc^n^a(>5_q6i zGONgRf7E2J^dSI`oKsbDYEM;nLXD3~qs@9!n>P3a4_Ea4;j@}*T`FAe6jR|+rdp6z zh#$yQD8I7h^5U1*s)b<-#;=0EaY>#ypwUT`4M(5=2J0mf#d=Q-AC~B$`9R}r@hM=K zAm4fF(;3@>paew}d>&+bf?$F?1}R}{4+9g_f9CzQ1!2znYf%n9@6WiHVe4tl11|V# z5YDo0f}0=)9Q_^$|FCraYQ%5C@dT0NQ8>w z5RGU=sr?XErpbpo>jrZT7MdbJ+Xhah2oNpwewx(ET4X;a#d(V7Z>Q~HenzUdZeg># zf44>*`|FlvcE93V9a9#fTh7hoP1!lHtx_JRcbNE#X5uKfz$}C#@dhe(;?m)S=x`eaBz~ZZ2V9v7Y zV+NMTtGN|sG`N<%Q??Eay$ z!d#8s?xeJ<{3H2u!?@{2;iMNjU>U|uvPjEW+5j^cIxiP^n5(?32CJET5Cf#PSLHqw zCR?O{YG5?<{cvk;`>Db$q_!isfU3kTIfCJAG>XFR5Z;^NGVSqX&$3lgJi_6X=ZiF1 zX-BaH1MHFujtxd@lL!oV3&_^eMEQLNJan5h+-)LTm!V7x7=P(uA8z->P-bi}Hl?`~ zA9M0<2h;hl7L{gco4>RHWAjWf%%9tUu{oz0=JPgSY|bf$`K%Qfi*t%$zGwr+=A2@f zXRSzM@fyjvnYj2P4KOwbh{Cv8=4Kd!14Ll1=s7k!z}OrhHe{Zy3ox}h`X@ZhHAF#U zM#>xdycNo5n14u=|KQn`RMp@ac$ilb<^SE8GB$+@Wzw93Nj&I>!zr8&J>6#3oH%L- z=0fy{vF89NI6t|egF$bxzX)HXS=5KM)V3V*swStpFqw;Dy>DXy9NM>qmnJYPX=b78(v) zbO0HYy2BRn4T$UvL#LMHsfK8yTBb@bz}(g~8mwlE&773;3g3_m1qgr+6yKrgh`bFb z0uYr5uk`dBxPlUY(Hx6PuLpfH9TET?=+o(t2Y--S50!vVw{>%SNr}!9f+so$vM$L{ zoQ%GhMFo#ZFX5IPcU-!Z%84Gi!53Xa5oQJR4CVKDzzy zbbnTdZ~st;Lw_Hi_$^)j1kbVERW0~1Ta`GvbvON#;T_bSdtO-;RldkSqTHTC zbjoB0Qtt%c5n}?O$Q^G8`&9kDKL~Bz6g{f%pq;<%x->#J8%#E9bhN0btmeB-EX4Vp zPqex2y@{$JggJ`msnM}>B-Hu26Wk`V4}V|{^?_F4|J*p&@_L&*q>DxP35L_f4u-EE z_7heNr)R55nSSt9#(qCM)pw|(j~tt!oKTLa$LHhG<#r6OZBYTu?Q}VsP}w;zH${2_&xwOsGN?v?RIS-gDugHY0pHtFcF=Gk0M11F7k^g- zE)TR7T)Y(Y@O5+f#qpQy5I)%xvR%Jw! z)rxR9xfxGK`vto^5!I+tOIr(pE7GBo@L$(SR`)fB2~eH%5I*)h$P5;ZhOcc?7=HKw z)gCBw*o}s>_ib@DxfqS7F06^uD}SsoR3@9cJekdBkokGGjPtuY;BP>_ojL{r?PtsL z6rH55E-&fTopCtqb+0C2pWd#m0&b-!;I~*jWDSo{UlXJe>dqdBA5TwFwj`v;G%1Ni zFIV%?nwQ=*{(%FOGXN|oSX40lP-VZQxEloJ|h^#58j1f-QvDH4CsA^B7ONeYHs<7 z`l(L%gvE%^cym~;fhKnRoPYdoeFrD|-iuc?#ard>sMAbdo8ryAr5tnvohIixZ;ju> ziZYMcVNUeeYIquoP+BD(7~!Os8V{a^-2)WsvR`Hd>)sA}I8=>O4VS=;!MVc)<~6Kb z>E{eBoGh>n@(Xe;h*b1XGuNAF5>s-QecG(A9@Z~0d6=yZAy^fSa(|&724kgGAG7Kq z-&Apqq8O!0eaBmLf)V6<$pBPY24o)k#vbZ2D=eIa$ymt0M8Rdb38&fv_on4Lg8JTUiwi~beY_P zRRW9x{S;-Z^hVq(82FX$TFIYh3yFMxu=UvpD*1j^h}2OeC-!r=jnql3MgTw;=ClPs zZq5+^F2m`?sPBhh1R%#cDSJVl0$AFY-8Ln<)4pwB!+(GdcDY7ZA<3IM<7s>mj>G<_ zXP#T|QSbCQ<02Ogy?#E!W09?G;o@C1StY#ous-+f;7{-_KKZa{9d}#t(CMgaYz+@5 zhte6)LKQmmhj}aS+c3O8%sJK`C*O#HAbKjA!L{3Iv5O&i>T1FVa>0n2G&?dj%6P9r zOz(nDt$&G{Ij*jwdZGqwpqK4<@B>Gc&F(T4=|oA=AA~Y7%P9u>Di=$2mx&+SXS1IqwmlS)np=Bm*OuT z##T+%0%b!rnd9wcCe>J~$#$e{s3wz}Qz$DlLTa0{shUg!C6<+G;j~aq)npndT*+fq zqJI{ushZ3nRRf$!Dr+^FWUv0ZgS~1h@zO}8)OxAlHYj5;lqA)+J4n@3;-!&Fsr7P{ zs;R_FlIlBIDp*Nmhia%vQUUZN&1!3?Ns<6=6bZBoHIMxWZb?Z=I>h+p6iAw%)ylOv z)}`=vNf5@IR^yVMrSY{NiJ-Y`+vr9}MSuTeN7xhqpSOwu%OPD{S%C9Of4CmOV>pG- zu(Y87GoSz1VS#Zua4bBit&`!SPP{z7MHGxh^Xr&{6bpHpJrMC)TulUqB`(2!m*_eH zf0Yq>NW&@ZDMuag>|492jm&ZPc+`K=6n5-LQb^P?2nA(pnpo2 zHz@V#7#e!{(i?x*&w|3NeT~8$^{mZW@P%wSYXK7yQ<-)kL=!qmbE3psPeNQ;C{Km2 z5)dkzof5AsQzx`4{N%3{p%LUaNb3^1jdCjqm^PVOo+yiAJ1nOxJG?(+&QuhKjO$jj zTOOZCyY)Oi1;Fu^CfDQ;U8}Ty#D8oH=LztvN{N`1-4?Q&2)o=ZTT0ev6CtE=`Iaq| zn8I0GW&Am#7+97wV%>fW8!VKHnt#@m=nE95wt`{M)>*ic(a z^KI5t^4)R1pqiz#wz(8mtxh z1WAtmCGi|7Ic-)puG|ek+Y-lI`sR6L>jI02Y0L)P_(BD5qa zc!K%`>;QW%;cqa(r|Gc2#eXR&K{NUvJZ=PEB3=w63>eRaYpHgyRK3tRnLW{d{R5R zd=jgsZlSJtt)U^?x~e?5vVw(auA0(0dNSNoT&^u&$$Zn{+QaCkZ|_2@u`jJJ=n-Or zW+;ka^4C>3jC&Hijphy4DftuLrl#RT{a**om&%t#E@NF+dxb7n+&??F#`D z<3LF6s-Fg*S&l_19ix>}RB_WysUp3;^d_#^78`Ds+_spZ=(&YK1+?_++1~#FrBz#R zn=ll9=U2EW8$`-w>qVKCrB$15-PCQWsz}q+RLF&s#0nT@n}4WL#DCv$FbPo7JuD9a z+240A-?{MVB3UGs#c2dGp*|4rYZ^VJ^Q-vT_m59Locbqla&|hjECGK~CJ^9Vf4lcQ z(j!hEx$Ezg&wKdd46W8&&?utf3kzWq|3sT)L>_8{v)ei#gGaRjl z!QX>SL-kL%MvE=W~uoEfd&E7wWHysnCk*nn&N^uT}8SphkPWCGi(yMkk(Ak zUeq{M7|tts!87>dC~)nK>FW%QRpZG>H^Rg6UVp%&Wao5K%Q3Tyyz;SorJ|K>(9Ajz zw}2>K!9-9Nq5!`ZOyyhJEzygr97>(bQ~)l8&(BQiXm(rTa5+(?9V+V^1@tDdJEXyL z$}zfSbDs4%(Je{>m@&T9{y&SjEm?K-zfvibQ)f~ObT>GqZE6VlVr<$+#TuyRfAeB^ zGk;u;vy}VV26<780Lx%)_RgkEdU%#!RGdW1;=DuN4F-b_nJSSsdoe<_{3s}_m*iD~ zMebBCAPhYX)q)~2Bgf}&-`nj{?gi;+G$OWL4ks_`IkEAxpvm~Kcct6`48I6b{|iv5 z;QO1*`U`bcZExE)5dQ98!F>n>WNY$i7=JKq-6-i~aivI&r0f_2COD~52TSe3cCi&0 z`rCJuEb*u;fM4#7$9sA1czey(9eenEJa+r@^A~pP@aM2+=UvCnhrhZ#6FK|1{q*T+ z{{aQ;zUx(|?Z*!3^WPm>)Md@SXWRYzp8A2kVW&f|dhY(|j_hH(_h&z!y7%nyaDQB| zYj%G)?{1jeJ)IbSx;=^?P<#J{op#$}f1lS4Q9M39cQ@?%cColRK7H7onQL8X^m=ji z+&y|us7y9F1gh04^DL~m#6JVSH^M-mdi~{i@?A1Hl6omJE?aG0i0=MJ##J6ds*O-C zup0rAXmj195?XHhxFe&sFuEFp`F}a_u4H3djI@FpJ=KP7{)t+Pr zq&Vk2FchyyG$;@pOA{pM>BVWGq)^b7u974X9KPBj?mP(BrEt*WBpBd$`X&*}xnIai zO_Crq`lCT%{xeCTO{9)^WPoSo+#r@ANF+D$B`;*$k{YgsqYf(WW`B3gEf6h0FD!T? zN%K>T=v`DVhkK8lSZYUVQZy=aLMtLsvuX#{fNKm z4|uK#9G6n3e!Rz#z^>!!@YPGP<2-ZY9m9*U!mZF#+TpB0?r9v){)F+a6^#WEN+R(? zNMf-O3svpN$&yQ7mVc^7;1D0!VQXn&cr=g-S5^_>7;q%${5s!ha-ymwRJbjP?6O8Q z?r82PGF2m`73e&i`esDJFR z!2*MUTxYaW`AcDr?~{L)YEW&~7`Z{*`}c%I+e^Jckky=5e19VERFF zKlgsv+tU$5;1j`Z!VZ6wpBizmH~H-#&6e>Z`LASk1Aoyy_V%A)l&HZ!yl?*Gf#tfm z_x|)vGkz%GWR(;LcG4^9-V*^W<2&&0AWK8Ax+x&7>x2DOx_-v_!h+TG3ts= zQDn*0rU3cj4|^g($+d^y^ZxMamABd~7KcdiPp6ki^zb<(l=j0@N^`tigDi*L!APA% zowM^`G=J_4deO-+42N%nUUd8}dea$2!x8$gGkQ&>Cbk_6Cl&1>rVKz8`vB(ADqTg( zbe>!%5OayPKj?-Ry#RxypQGWROCAJoIwAfr3Vylhj{@;?*(w~q?sq#O#4COMRrwCd zWTsDCS@L6Vj5j2!FzHAbcbr20iwudpg7)dgQ;ir~NSC z$Y4AC0Dn25RKbVrBm6(;bWerH{A(}hhMf^dCw}dW@qd%iJ3@MA(mmxUPx^yS7?NKm zr=uZZ?_wNq?t@N`GXFXp9#b*HZX*o`UJSaE z{(o@5nvEy4$0ipe^6-4rACQOd`a#$u9n`1o#&7$RQVznmZiiCd3r;#0;e;bRhNAkJ zh+{PBFiC`A=Qw2jI6JX9|j!XS*H}p#Tgn; zIanqU8&qr!{Lz9Nl2zDA_g8lp2!IpY_ju@nK@V?K%PWPW)mWEp5x+TaG7Z1sT)e1&Bet&br zo$;^OoEy!-Y!PR1kwEz9X*-NVKy7xI29Au@=$DI5*gxq*)!Y`GB#Q^+zfFP{;3l5k zM`pU^r;c!~4e4PT z&C=yEW`v5)s13dU*hf+z-XUbN2oOC7EAY`HpZtzjWO1@U?_ua(k|RJ~yjY|k;ZVE< z8So!_G4~}84iA|po34>rh!MK@ip zlLhiy=;{}I0vU@Mhz$-7wV9SU@^&`|J0up|JRlK4y?=}s(3kQ8dw>7Qk2xq8;0OL) zvYJCPs=R-6^m89BipRlOzdM9$NoAc*`I_B=*&ToBV1NJ6nH&E%-+vU7@&D;J<8lAR zZX6!NHAK+cjlErXKz)QP;_t-;T1jtmsbg}iV)bJKlX8*Mj^N*pjwbKUgJ>`uopr)X z6RzTZ4Vog=aXsgg9f6A{he!ce$AWo$lZE~aQd7jR7e!^oJ!%3f64*s=M#7xKxGkqQ z9$0YrQ)NIU%s}ZJxPSdwz++II!GyA66m!X!)VD@IpM(m=!FgxYnG8pG)NEGk3|uFl z;4)Fu2mA2BGdrY|=)#{BeIT?nCLvit7ZYrU9@(Fly6RsHejW_p4!9E7ndEC9s9|_& zkE$f1I6&Hj+z5&rO61$wf0qQLx_6{E>@QcVr08SOfmFkVN`E?AmDn}jBsh0GSVU&l ztU_rni7KI3R9C0jrsJwYRm)~)bVyR>-x?^A`9)`$+4a#Jhp^ZHINGrVcuKsiDjOh9 z!{jwM2S4_{64wu!nd*$aGNe{d12Tl}6g;<#E+z@14gEXT5LD}ZGi{(NBL03W9bKT zbLW02!KmU#+v?4GpjQ0JY6W3hxAiSQtIsv8pJ!X&M1NfkKAMi1V$=NIarI{4|0ktjup)Y78B0ISz zl0l!N9P+rZ`Aq$563&?VIsBUY-m4$IBJE%T_Fo=8_Iv`5{DKy`_yPI$-KDhVRcZ2% zEFA_lC=$tJ-zlj)8^r&?w*EDd&57gGekW1;y?;zC$s&;m{&<@#K-ItzNqCDJllA{g z336{JbcYdvgg zfWe=6Me}A8@S>y=@KDNK+e}tP*=$!fqoTK$Q(L+kI~ZL1IP+G%_b|simcN-!7GJiRir9# z%nm{A!O8y?dj7>NoQH|*AYCBO;kySSiC^n8qX1^Q58%uNn_t#Uh(aH6Jn&`lHGgH| zBH3`rGO#p;oX+CNMwpdBT3N4hfPCZUsy)PMe%#{VWja(e5JNk{FfmhzA2u+DxE(b@ z({C@)baMyp-^3X1CXwN{2{;(G6?ik7m6&Lk& zlbwqBby}##Qw$LtHBRUefrjxFSSWUL%VZweLZ+d;pxOSRkmG|Fv=x4;hE_${@($PA!P)`Mx)J2iD5fXClk4^My3gD z&;N(t6tFSb2Xjg&q*>nBdI%W!c$RbRh}&Mb0ws6_w=gc<*cZqQvtW*DHCjopL5d|A zY?`-TX~)cy;fj%Y<=R4C42 z2CiG_#OoM(Swfl=J6qz&G=^1V8=$3hWj7B+YolW?F0_KhB3b82JIQAnu|XL2&&U0- z11JNrSBrFZ7ooK_n*W-_s%oL55LGL)>XZ%J>M)}rGelHt$z6cPa(@j0EI|RX(%BN4 z+pBx z_JzXjbA{VK8@T;m@y~T`p+_cf*Hm`6ADi$O9-VzeHDRgSgPL$ikY9hH;B~twcdgA`wq93DST| zagbf3jbSF2ZRODCkf+{Q*O!WEpZ&Uvoy)#q%g#2U)puHiX?PkOVY&E zW*OzP80t3F(%rQ&Krk7_7<4)E9zp{VK4r6CW$OXlLbTw+5`T00lV&DDCJyAHIKV>? z>9TQcCX!pg(v+3+96ovI2Ao0vR`Pe)0YC?kx&b^oIve)T0ih8GsJZcuL{}og0GY-K zCjCJcA?(bk%SjfsBh8k!6>^oWHZ#Tbr(!gUWpngUqzZ>{8&hi@CHzHOwnYiKBB`S` zt3yMx?E$B%MSq=2aG4#V<1sGkq}{Ss_Wb!io=CBEf0Q3+HyyWA`%jC#{*DBb_^?8> zO0X80Z6%gxCV0!^ik5lP&N~l9H{{(s(xf1E)iCp_Mw$tS_zW(q8_KqNn8_jc$9@$O z<1jO|=Se|ZWw9Be`}990nM&P^7T4|N4t3>X-Ov}px_=!3LdxIs<*%tmROp z+$M^SREnAalPJOgR7GO##iAKm=u>kzhFCNLAozNy+y&Mjj3NhUm0hHnHDk_G+^0Af z&Us1OPq=)B16UK_^6-@)U=EGz<&iJ!Q^01+GLY@@(iU=#3DiK`DvGnENd?6N;AcXh z`p=9M`G4)!Pk@$|L?Ls_sIi$`{?vikI?Jbu^|5b9W3+s{HKVdjj=)FDDd)<5ux13s zoKf6^oop!@Izo4;sfu7L!5d*yWqrXkL`j(Xy*v+^VP#9I;t=8a z=8L>uj%`{k$&&6@DN7R9fbdwpoRHebD|pDsczEg1dJ+bJQD8Eg!BFgVqMf_<;u&9WPw4VD5--;SnwM|hp3P}7jRpcd-0i%1VLR)F)gM{;Cah&7+l2GpWH z_P#<^mG&LP!ly_LWH}Gf;$^n3GshaqOQQKGE26o8VK2#$NS!q|g2+p9jxH(1<^+em zqzofw z1qdR1Dr-^9idr;BB%ko2Y5q=sl9*9}I-k(si?k~A?V1WmNEgc;A8(RHkzg_9@(j+3 zmTu3LQ0vjheuyt05n+{3TL3?ciJo%dmFg*tDwOW%q_f<&(Mn)&^>lz~^lwT~mfkig zDnn{l;CjkkU>YgchN>j%#)X)f^nYv=>lVQcv}C=Tu;I`TZj_j3p{m}hqpd{(43gnf zlY>N>i~{RSzXUk2%S@nETEteNni)bFIMKmRz*-5c^GDA7}GkIF5JRk6rvl@F@rFV_FM;#iTZ1Zlq(U?xSS4O=wb(6Ozz)`zrrrE+@ zNJ_w}si*}$77@?mb$>w%QmW%zIYPl}ygsizBY_j0)H4!1OJC6^_22_aMk>##wsx+Y zEIOdg`mB&_4)u-jD`6EUMZ6{2a$yA@}a103( z>PtKhf}hg?2S+W)z-k7f>kT^X`}a+}KngVX#JjDuoN8-nCV!^39gY^7STF-~gab~; zxDo~Y4nEg@Bj0-WHMH1&49ZGhe3oWf+S3IC9{9qDh5TDn=Iz#j}FWxOMi*7}AnYyE+og-9g>Q)7L@DXsf&} z#JJgouHke26VotCSvur#GzCtGY=K)j6IOx3b72+B# zuE{Ffqi{)N*#V1|I}cu?e0nMDAx_{Z~-0*;D^Z_5ccRzH{qG6Hp;N^ zfkshpSRjG@Z;XuTSQ`D-8nT+*G%JKhbk16DX2yi1}IeskV;m| z&=z9dc7JC?39+(btq*fh*iw4488oTeTFK28J&7`J+U3l@cyy_g=gG}VKlWlsoo+r< zDj~ZDrniLLcu!1+JObAQxVWapX9Kn_svz{)(y3fr1t4}uxEoa>yWK^)Qj6{i-=8lw)CI5Tt4Va$A2h{dM1OOZtSFvpG#6n*W-Mqn>{iT5G`;?t zozV1>4^7Z?hl6fs(g>3gO*dW5;-X$?!`^N}OW6Xx5)H~{+6B#VQhZEu&{@qZ(F{jT zu~ecNX4TyM+8j?6nqSkb63w`=KAX{uZ*!4`|dPXgg91p(@nUde6thVHk7S_`2WiggbE)rZ>qfUQ}_z(0}a04Mo$0n_ru;Q-#K8`iP(V569Y8=Dw*g z;@SR69w`gcBo=VL_=oaL0Tw~|9fZ1#1v|f zX?OO=QNI@qCTKczbenm1l3*&F3vm;x=0H?verk%&hzhbHV5>sabRl3x6`*}x-lUGJ zZPpzkR{}Qs2uBydk5BvO&Db)JaDQ~cX?~lmt5Es>+J$Y6=Z zS}U$XlS-RoAU`o^N6orHq;mo?Boltkt|#B(!VxruU5P-deI!Ymt;lyVD}QWNZYtl@ zAG0fy5CXkSl&K@6?#xYBCIx5blXs52DMAhK9*PPTPM+aK&n=`YtKMv}nbU%6(i3_s zF-2fP8Vv`HJ7FuN7=bLrH*f$ujtEJJAMh<~vJ6MiF7!taC_{?Cg!JKLC?ZgL59h8< zw)G#oagIx_{%nqR%!JHoCEph}nfiChYVPC2c9Oz!1B#PH z8W#xp&+xYcJ>8n6YnMd!(#_QZkVJC~SIQS2Pe%R0Yd2A7au`EKRyUC*2Yfi*QOp`} zTy84Tg*-g|x1j6Ti5l?X)qjFnp;L|`S+4q_0Y{EBxl~gIj&GyeRevnxN;(~Q@M|A| zO~?l4&YG7OS&>4kk5i@&@l{ejg6?}iQDcHo9UcALM|%+n_mTd**AJ@H6gM?1sQ=ep z*BrRu$au5H7X`|~A~o;bKpVFd{lEG6qD8nAxXbCr^51H$vPk9l7AzLQClnQyyYn0l zPbVX#06vE!v(T=we1F#uLYM3^73#YLEat3?sFE$hpl?qzg^m=W3U*zg%1YSy^okBS zIvEYmwi}fg@=2C1Rbfv~tI4Ya%x=ddP|KV&>C4ae;@hV;2FVjsNqh)VrXw*#RA$Y@LnxXMvg4S$W__n^M3XHjd=E3&oiY1%eC z!gD8?R2@yw5`oaJbL1e!th;lpaM9kB8$cSFYJu$ zG~b|8sd${x^EMKqQ4qr3deiiLkBDdl7Em)j013snhq`L$=XD23FiX$BNL|Z zR%@GYyHs^3qj{*x8J)c`L^KKkY+<-ujtuwKMSn{UTh9UOyk;WS&$iGg?L(CRI}p}4 zjXO{3Gjz|i6x4jMyAKE5&iOd#;e7VDr~OHQvkR;~BM#fX51`oBIhd2phx0fqrt}xO z9dUGokJAM?YzM~R?;AAAay%6Mzxjuk;#nmOtMQD+sUip{Aq+CVra|s)*+YC7Svt?n zB7d}!(iCsS7t*xv{3p2?2;vDSX1A(E5BmeRBgiFW+S_OG4V;1zg7;yv0#i9$)^|Ie zSqc6mSt#Ip{jHDr>)?AyCPT+du*l6@utKMcEIBfb?p$sQ0lj=#LU0yLPKP}=3|0iR z2$L2Lb!4ETfB8k}vM=D;2UR$bcaX2~t$*9HGoTK-#y+c5#={zbV3oJnAe2_1&_N{!Y%@zy#U`{W_!`1mn9zY6bcV!8>gMY7{ zA0E~?9s0>nUIAt5({rKgIAM#wOC=;?+?v(5V_B#X0;7AYhjDl{=1tH~Ze+I- zk_bqeXm$XE;~1k!bQ+9;-mq(T;qfm$)=sy_Vi)$(8Bs@Gn+FYhxxA#oE`Mv6qM3-> ziUi*`Rk+khcveq>IATAmM8tCQ546y9&(6`53Wpo@1$FCXA6koJv^TVOACcVkNJ%Q2 zS%xhHEGWgh8zX$*un_F!9xr?7)Zt%vKa0$&cTKiXJDkv2p#a$XR02Vlz6hvvw0gCTg7HRTf?I4^K01lsyza-1_+tpM7H z)MC2TctZqoS}LgmfcKpVx*^N~WwH-ebNF$VZdT|*ki#eN8NS_Re~Ny(#D|T@4KEZP zx-w>;Uq^!yy?Ev&54Jz{MNvzbp}RXzy;TYYx4QA3Jb@+&OnrlYSW%mFW2dog8;zaD zwr#U%aAVuHZQHilps|xCjlcBW{dV_XxW9AH%ri6R881MP^K7!uwNn#KFLH%Q?Ubf!uT*N5`951hNbz|XZ753#tJn> z8PCFi=*b^fL|AY9y;?y9q+@CD0-nQK!C54Y6lj2?m>vUqv@(de9K@XfKL2uv$_o=e zMjVC3%g!AC*VLaHo(r_*MV<|37(~G~ZpUKdVQ;8F28)Y<{>k-cO zyt$FDVc}ABHMUKd42y5SHNKoIoZi&3wxy}ifIJ3eI;h9?5rzRtk#ha=)t(>Mk5HF+ z-(D|-I+Pp-1cwjyUIX!vtz0V?8b*#%%-w=|bATlesxAXI48{Z|i~&8oz8YiktVj5d z&;0|ou3CTFGpy@zHzLix3^29Pd{Jp~Y&y_e+FtUwTJJkuoN!!KwqPjONNd1-?uOpm z=NrbEei2{S9yqnRSZfCnF^%fVoKV1HeL(NeTk5J|y(oA;bK0&D;c@Q0r*HLmlj1y*O%y}{^SvkYDJ`Isdzh;A$b zza?ko3mW6&_Kk2{;D8jg$$@e{^!v(?Foy}NOFV&d-+P!Wso*5lghT%U<2IZS8z3Pb zxcTk~qc;De85q35b}zWr_joY6^f_+FdIJ1C$@a)#*`zvHGR)h_R1yju4SRB2jQ5)E$Rd3EF}{4+z|jzxkAh$ef^ z$YoS4$DCv7xon0=6Q~7X{2-kjj0{n+v25_|Z_w@!5jH;DWzMO!&?}g`6>=Y<7Vh%5dx8?DGaegl>`E!5Le|<89J;vcl&2 z{mn3ty1RB*G=%S6QX+I}4ZOvI?Ndbodug`yHJ6PaucPaRX#0qLZq}+gnXW^Ci1?2D z0l%;@%?9IiUcht%F$>gUF@8ZmnbORi`A{e-Qt7ld`aPTz zUr<1rrLP!X!F{L{PIU=d+qAP7#)%;82||Q!PTzfVFkKhP)mp??!E(IGbDUsn1TV^T zJ`JW#;f~&^0&!1i>fo>ezjz=FZmvJo%+E3VTe9j_Bdr|s$4&Zc{k2stFTmclsAHZj zfIT4ERBM&`YD1p1#3zg5;mkvEW#4bYZx2;+m>CJSv`Rsf#{1pcxEr1{C#H+BwyG`Q zn)=~vtS|G->zu}f9GD=bem|Jgl>yRp`lda`BnZ41dmDOxqf!UAMBF+QP&LSk zhv{wF{=z8(t&rU7W5|T6hOU9J>%%(htDhnro_F}ed;p=sb3H#_DMbG=Is(HG5Fxkz zW7g^D+Lqfw%t1Nh4BA26&|(qnkG0XC3UW-hX^B+cRc zhy{nK9;RQ_Q z>Z!w22OHjpD-LSf0uKESrYcPMN;Ej~GmP?3U3U|dnC1Z~_SrrBJV8qaZA&M2oRn!x z?c;DE$g6I;(EQ-`tmEzt@`F+AG(X>xF_Z0J;uED)?8VRy>&RavU)SbS#jw-sD;;|= zpHc3zD?6JQ8rXU$HG|j4xN7IDn4o^PsE_e%9TpwMxI8w$0uE{WEf{1zen!rdD%KcY z$@h$0!osz?BAz*^h0~95we68VN~;lRGbawMQnZ4Cs9|>(@%gLR8QsbWS=Q5a zW8|%_1&z;N4hT;SQhKwL*5_(L(={*)@1jPC6M+yKD-vP`jLBg`(z0uY+L7^Vvj3sl z#OW3CnOeiBadIr36v96Jok`OPk{h`@KvePj8dvw2+kJakO=|n}ftB2J4@TX*a#)yV ze@Pu87543&-RkCBbz{kXW=L+>h8T{piW*7eV*9)`Ci)kUD|XZjyyoRj^EF z618ldw+TyFV+hFedDPtt{1%f;BBV+^#^>YyzV(!ecfW7BX{8&0*@_oRP4>ulGWvog zT4U_0J&7PRSPeD!#0@vnkWp|veYbt#vwG)d`1nSEFSnmJ0dZ|t5kw>$3+z+D`$_JF zIDQ$+BD(JgUFCAvL3jl&zxghUMEqhrj02bNXSbAYP1q_|kVu(8%@Jxa`vt`mDcazK z_6E6J2;sH`9d;|`TUy>bHSBj4Hx}tJAA{wH$7m$6J()lqaxPwFk??m^v<`8eR2yG6 zRjhLC&Y_(|x|768aCTmH2vAFJ$me}(`n`y$9U|#px>CB5_;Y-TTV*O74d+yeeVN6Y zCecisU(@41OVnwyV% zlWoSEx6}+3I&R|n2GHCz*BmJuWK9oUUduHILU0`FljNaI{1azT?k%HKBXN5P@#lU| zjNk)AQKpicW}(pXisTx|A2TECyal;9COsuMB-#?Y*bAAz=D|meX<#}o4D>44R!^2D)tHko4|CT5y!CGxTmCjBf@-L zqshV-y#8a1`Y&RQRgIKjgPuAs8x!GI@%;j1@K&p%YhKKjf2uUL0yleH$rEFu$?*>C zC4blwP+kPayBziD;)$*pP zT@qvp69axG3YW`>BN(#XnCgvsoCz#xel~V-qy49`%R;)bdVN{8-G81oJY3BZqOo35 zT{b9^8Ht`O?xNBZ^~1aQj$k`;P<{PxzqD8OUFJwgf^+5s5TI&+Q(KN! zv!1=7M`<$Z@310lwa7@8F^g~LlZo*w%NGCw*qwAm(g-9lioOCFZ7tCptzARe_z6iw z>;R?}OGka|AMzcp(XXo24<`8@?Fp69UsHnj*KWzU#Gz%tw@LX`1g5-;=A#65m#iEO z2|_W`EI$lwuKTGZ=!wKWP2M<&whKMYd9)aiMA6W+QNEPn1q$Kw{2`s_n`9owkGgFX zU@>`|xFYk7mI;kTyXEu+uf|m%fb+zUB#(tP z+`IEc-C*0r6S2t4n&q0}eVX-sA_|^W+E-#~Vo^W3q}QUtSAme5SD|j^vxHl*lYhtE zkqIeabnlue@t0wHnh3!6!hfJ_DcCJ@@HmoN(}EKygU74aAUkPe4rjc}<`D_z-(na5-2VhM8;K*Hr>L)etGgHRlV+ ziGo!Hsm5=$5>WW<#5sE)V!`5E?ih|ZZ$C*h$t1mTy?`)t{w-RF! z{qobk6uMVRh(8mjt|voFl5OmYS<&}3Gox;|t7W@h&@^LyVrN%RCVm#K4stj!E4^jF z3Jl6eX^oS_+tty+28e2N_QF@4Hu1kL>cx;@XBR6Q6k+Qw?QRQesMb4fmk}(%#(rqu zDC6lEp*&fsb5(>Jq$^bbgV*wvPEt}6B^tNKXwHz~Bdt(`As3AsyIORpO>^Qt$2WP5 zP6_Phw;F7^?l9ZxSdy&>;_x#dCcQ(k@?_^@Q2k)Vi8Z+|M{yYHX<~uDB`fHh%6#V% z8Y~3J))QNtp@x1Vv14p_x<_LbedhC_L3+qjLqRJFpXB)lKK5?RVF!r zwh+eAM=;p=u~UR09pS*~4kEJnhCK{+;(JGjV#*N~b{|MAERU+!AEmQA;`?#Wp`YkW`;;;BMajO@pN9j-;) zWV|`GaF9C@7h(@!+I`xcq40LX!v!@;9I?S0ht&uc+p}5cGnFxTabb|-tEHtavtFh_+PBj3Q#Hc-jQ8|u~k4ExgzXJWf5 zU&H)8Xh8U+jbK5`6^6rlO5Q7n!MoUc3NyohrAcj6a9SLw##GArVk{iH5_ZHx_dfa> zI%IS|6WYrtmE8ULX0$9YA|tT*{)dDx0o3B-yBXC4UdZ)htW4OFbPGym_(;xCyb9=z z@GR0;)U!w!hqcw8= zHktQmuh9tu^68M^Bn{-wp~C&f^)d*gUQd|tSlIU=dM-p2?JlJX77p?4zZ0PkI~FW) zHyVgHOI6OEod~^C|KLBPalI+hD#}0~)Se*oZO6%A2)YX0Y7(ms1rWTLMuAEwc(57e z>a3?{5!pc5rwH?Ksr{+TGM+$%vmx1aHJf@LwEZRlBs3t>s|869Mu;A6ll)>R>d5y} zR|8_0k6Di8`%&9^C_ALq;XYcG-`;nfC_w}yd(Z)r-@2+`iT9bwfYC`^A-_&MjQ>1 zzi6pLZc=BVp|sVW%^RCnd3}dn?>amC!mwIcE}nwb~I(Ow6|hfQM$a^m=f$5HrHoPsU#mF)8555T?L!65|P=JBl)D#YL7Mf zQ7!O?e}Z0UGpvS->Fl>+Yp`){yoDr;PWiVGcRi|`z30sG4DzGypNyKBGu^+l16Iye z0BCo=7Nb+uQ9DCFRA0e#^fTaG0<;nhY6>wyP3>oA^9-W3YUx zkI0ZJZpW6gAHnoX(7W}|#N@w;+znbb=C!g%K)_{Ba9GLDVoe6^OIIBf-3c^FKsD#t zqX@wjA(L@Gp9TGzkeW@-*D&H+vFb7nE;?5rS*>*+Ve}ccYf(16=kl zLOHNcwAur+5&O@v6UO2f86Lq54k@@i15@Y#ZoB=DOFQQ^*oS2g1eCAtr!J2ERc zf8kTajMVn~Y7Htj7auGv$iXj!V6d9xJz1H>IbX)nk-lsdj0lQhz+Y2+r zFDF7a`$Oh>n$$P!HohTwuc%-5X-k%Z4N78C?Qx4~H?BhXlWo}K%K5&1S-eOA%yx5 z3myVxQ^HmJha2Dcxx8N}_=6S%c0^as_R^g|c-tpanEvpRLr%Zd3Uc5~l!Y7!$4VEH z)F$;N`-?LAUw3dTfyeSB2XVt%B-@+|>nkhP#};EQps4xqEs;dZf+839n${%s=JC2G&&0?0 zq1qj{z(v_4HPMey>^&78QSUIvVM!1rLM!Z4ynB?;_v=y&z-XF%f-a;^$H(K*pkDCI zkxRYf8Z0+jp$<(c2x%Jkt15);e(f;?i}~wNuuH&4&VRtCzDR5_TdXWK<&!gp>|DGcd-6_+2X404He|7mUh(IFgh$jQWo_w!&(#7mHKPN$xRX#@;B|6o zM8^|YG~Ja2WG9xmlk@QrHlZI|gkjuP5S7b*WnFp774Ay}x2L4pNBDQGe6zm;1 z_vcP%q>>!D*8N{fX52(amKbnGET8HJwvyFC6^$#S#%uhj+qzq?YQZyaPWrqnh_-WA zSMQgIPIJAO2!;s~V_;m&uASXbAW}J{yXJy`^#SB=TQHuwl3oq+8=Bjn1m;A~i`vNI+(|4kmPvRls0>_w1@j}-9f=EGEFSLh5HlPo)!@`z;RRrH3 zGGR|v6pjo_l-a3z9yqC+9`_Z4D3a7^#~&|UkEnGls zEaV&(O|j5VAscAbKkZwT_{ro^(+qCEjbSwDK^xC~7Gn-3GMhtLLrI$leWf5PnmlU6 zFgtL@h(>adE|r2?>-lyb;zxJ^gu9X&qDd8-;~LUgheP+kYV}0k^U-5Hh)Tjl$1q@FiVwA^mB;X0ecx=PP9Ej7%mX=9E<-r}p!h znooiw=;QYiRkh=_vYnnNtYfi zZY-*B3ZuRU9V2zS5=SFF^^J7eGL9zu=S2mzv3C|o$1h@lNz9fGDF@WO?zbL=p$ajP zG@0Ps;}54kxb15IBuQCU{N&`Y>cQ+6asZ$G(SvHA6jt-OSAnFF+I}mBt#hg zW6OE)Bz(!uyM`q?0I8QQgOgwgo&qDZ2;vbhdN4f~5G#Wac^wo?@Q-Y90DhyNccz%R+s>}#t z#8C#$Zq=&1{UP~14W;17mD-K%8rnJQ=uKgamwTF;O!g zT>>@ZGk^;?E?Kbl7Nw|5SKR(g>Rxy3;I{`M+sE`_JU`BCOlzY>vVd`&zT2^fwc5= z%EZX!cQMLJU8P)ax~*`-XZ!9u@4v5E%ZPjLsDKRAL7k;;(b}KqHRW<`RK=lBeh}ST zTB(YjHfNims9f<{NZZaaCdKzz4KTq6U-`h|!%7A{WGpFy}Q`PCBWnko(sv8q~j=w_zrXhFxbb_eXY_U#4!$?6b{A zOQK`U1AT)jU-Z|1XW$r;@hwoiRWvD&x)u;k)GBt55r@oUwFwm2=enPI(a9LJg>#Q1 z?<|K_tZ&QBD0O9TQQjgjgN&gei1G_lBA_T1|QDxeT}6!;whxERar=;8oy09w@&I z6qg~xE3k&Ncc}eDLgNWRyAvzG&1<2ZP47~=5+-l;gf;8+o=@-_ZdTpERIGuYz7S2@ zWlk6fl?ENs!+!%2nri7eTNr_Mv$XS0=2~y*K3VK!@{E%X@MWT#7pD#C83GNU1+)sLqq-(UjgckgbzrRlD>66 z6A~~}(h8Laduh1Pr*RZm*9Sb1_&^lj%UDrMhc>~zI6%s zn3Pa@xYX0JoPxlY5M9?DxAn}_klv_W&tu11)=9j)AQ(FJ0Ii#2dX*ShOZ#kXT?84g zwd0Gw(W2{Y=i;_j0br^A{W;Yf0!}JqD=1SiZ>y>DA{B@zuWV+nt=x48^ZllNUKogl zgj8p*n3f3fpNBmzB?1UWS{j@?B|Mb}eAs_8-?~my(ec^t$huJQ*9t^^5(ZG_Pr~qo z?u=CL&)29$wY4r>H=6+ca5x@6CAS5^2{Q(sxChwpExV})rteQoz8sp~-W$;jXoNY@ z(h2X4F2_5q*}e%wiKG-@5Oh`P`MeD{V&+QaDBK122-zrIW%MAsiWJC=KN7 zi7ba(NeI+%CPxOv&b|0~H25Yf1*@0=4v~z_O@V%J@zS30i{oz+VPI=Ce)Ovm5}aJ*-oTfZZ%sMZlrJP?V~Xq0JxR~E z@$PoaeZ}0j17efALzxd9OU950HvDFW8zi=AG;Rt=2|;2Ey5C1$NWIbu%wL7AoYxXZ zvVOBp$(unvAVmG&>(DZf$L7L-?hG=ZPp&AoPFmT2zf_jUF_Jzean3y_%g$B_HX{1A zMn8v~ud7stIXRE2O&kk%J}5Wv0d{H+a6@4kqh$++3q06TE8FT?jzV&82x&{*J@+A~ zacbII&y7xT4R#bo4~o=ettG-^h}yv^5;>HJ@(cZjzL#L#8?0akxwq?kp5X^)x=@eA z^t?CSoH6P!VJq2nuq-7cMo%m$O23s^nS0ZlO~C6`2_Y|S^CBCv_dJh^L?^fo)MtXO zq+b~hj#be%1rB#rawa4{{^cYj9fxzi+f;V7>X**jzYSmb#w~B|`|g0K{=HEo+~)Kt z<=tx-^#?DB{ue8<3i3*@6_!-tYioR)cjga=qqX#B=cJCaYQG&9r}l(jGk3i{U!s&I zJ|P6D^NjWZDHh=*&lR@FPRoK3;0qG`84(csyUI4yl(gz|wf+w6nk;UJV8OnHo7uz7 z{k$r^F+_P48+07GGA&Bu)$FwWexl`C?nR+6(pB}?Cxl!kwo4P3(exeoB-2;eQAdd- z(656wp#M8c=SdLMchk%L8I4q*zh8T8tgiiVH`d>kHZN`3)KWFf6KJ3=+vNLf$wK(4 zS^!e^rM6pmezz0sCxU!X`*T%t_QaA2WNacM{@A2NJlvHnEx(w$3w2dW$VLs&&3%R7 zf8t%w2^P??$rIITdI?*M{?LgQqgKQ)cL~<8>i8RSk%!~Q z_L>Xneg~6&G5qrcl+Ie2?*``~`gx{+<2?I7~cfSJgl+slKjUeawMs z6*G)HrhL%eHw?{E{Lv=9VENb7jo>j==9Rzv`I6->==LUVZN%0WGb&EV`jZj_UA?1o zqs8~St{Zsy@Pg4_mzG#;+ zA~A(ql-Zak5YgBw&0?q$VUi>sOV~~C^=J8y)=o)`bC%IF(~NqPF7@~0TT^wT?!#nO zVqV>~*f2vD&@t)r8i ztpKH+-jkvq68b;H{UL0c$0WG+M5bEpjvs!C{C|G{#Aa#v zqS=3(=({X@*nc?D$4h2l5*=FmiG{$w58%C!WL7Dt=p4Y*U{aVH3CQ7G>=8?)?jdMR zK?pZH$zF~>K2QxBzw%--56j=VD4!s3V#v1J!O65ND)gr|d{|%aR|TQhoD|qLR?dAP zfKfFhe&Y%8X1*@c)sqJC>kF19S51q|`6>q!U*%7ST6OD}mCN5k^PS%P6H6$ezdhA# zB5P^%+7bRKHI)0@=BPTq%?Ol<^Np$ez@9y!fSggcO_tD3amQZSqBleCgx{u+ga5<| zx7{F|OM3@_w=~afqz`VUbB>HCdDM4uZ*Z6f;1co~Z|V(c=c@UJUL z)jnrXMVAXBZBoqMsYeyVm4)PuPxUoS`pzS1NYNAwCjC69eJ=)dC{10Ecv!AtvGVR{ zJD{&v>X%v&toOC&ufHcOhx~NW%2(bKs(_owr2Sl7#2FrdjiwDAklB?%X z*sZf?ZdzD%203!Ep4ouEpY%fZ-)!A=Rg)S}3;Qr@mB-fPC!D7zTFXgl*pTKWxJmZ{ z@^7-{469PK+*-Ic+wSI!@qhtLiD4w;)Mbd_n-s}8>(-!jcuJT-aGKH+MQ_zGU`|Y3i<@8ZlxYF1#s*S#U3Z44 zJM&Bde-5Echks{jEbJBx3wFcx|UHODhQM-j}WV;>TX|2}F z2N|Jt<-Db!-X+^j8u$CvRHeV^$Z~&gu(E^$TnCVOTZFQP@@F;34P@W4UEsF}s=u|L zNwq(Hzg*bzAl<*xJ6Hi+O9dK#WY6uJL){`oDgW$ZEhr2B#b>Xjy?Pdwqn!@~& zBh{x4?N}k*0Y68kpm&1g+l0Yxj+L+EKZZ$Gvv0K%(Qjn>fl+D$vE;uT%$k*g7ay3k zsb!XW>Av`4GvpCAP)+|+iqsBTMM_Ikm%?=hmI8?$P%OUyS1$PaH+T8s&9S7UK}VOb zIY0Uvuxpu%dMf9JbFGuz%d?o5pE{E?duL9yniSK8PR=Lbc|wRE0h+ZzCcf3`$J_G zZ$C%HfHcq9F?D{}whiOR+LjRxBWG7KmahO;jc{tBca%zJDa~xWd~Xx_B9gF@HP7q} z$VK^K%H>OdxCgRu#@@S+bYr&`*r+9eLK-f%DnIYFYco|>MLabsDQHSdC@V^*q@%MP zXx+WVIc~1R6Vg2WYCq5n62dhjvQ>@R9mQPKb!>X4cXawl)a)XRV~*hP$-lxO$$IN2@vn-j8HBXjZlLN>)p}K=x|#4qqI#K z1NSMX)sAu`ZU2+g&Z>KDr0I(yxpq#TknxRgNxXCo1CiJt)Qb$D5XN)cW@A&1rVpN6J;?6La}dow`E7ax3}>Vb`p z=zeG{y32Sq>hont#qeM9`n6jB2GTT|ILP)ScW^>Ho+3jdJ$RTlu^mfO5!H_r_oS?` z@$IVNyf~_1)`aJF^8mFtYIg2hMwmsoG(2?OVG&K}BhiV#VBn#0}Tf!|XfUNDI^2snC3X-6Xzvv=su zu?f+5CHf(HS@j#QF^>=CJ6sQ$BGe>GZ8H9*nX$Xr6;6Mo9U4|A<=n#s>rS=HPH}bxT!)9q#TZG1I28W(lqJEt-@@3s$o=$8Fs(JV2f1FPrb74c811lijk z!20*`l0vD4@2zeJD+wYHia6goKrW0w+>qo}jBuobSTfP5KQGKPU!(#CGVnnfT8J57 z^8opmIH^2(U`j-geDudOf1DR;Z3>g*FqI2h)P)S8TYRoxgN{im=}NgDBSJ|!I$nM# z#^$p@>80D|U%t?y$d=}O$;?WBp$g0+{dQ>M{#RQ#wbdT-aHLw5I08km9ThrXL!wGg@m^0Sw$^^AmzpPy4pzCXXlhWbjmze9 z#ETTf5&W38aTmCq>&D04pDy?NIO%tk{$oWrJ>h9LMEdCbR7VIBw8e{_gYr3Xt zgy6GKM>?Z{_AfDY?6OUXEjHG+ScsL$jW`E5ZP8Eb4USSLy{@J@N6d9ChhY<=nEnk! z(t9q87Au^NpTqT>6*2PP3~OigZkMjama#V}iqy@jdfTFwehs#@Vp^sRMQLi|X$Cxr zH1%eT?YKM@`qyN4>R;?4J_4%{nRor2}rDWaWa!bw$zgL9FN@xT)$vQ*y zV>t#2#tNujLRWpP5$-8EI6wSO*bE z$&;*R&`NV;RKukQ9zcAG3|AAEu)|-i82k*kCp`x`WvAAe)THWm)r5EQsvr(qIp<{w zps1C-XtQ>Oh2MX-1l920%Y~NAO=v_O9D8I=t(Z+$C2(Y%D4D@+8jYvAyCW7xW@Z5a z^0v;gJc;Elv0GO|KG?IY-K&eBKby+O-qDb?l9=n~)(1mLi7|x)^k6DK1qVtHsUf&? zXX~fz)o$nqM2cD+ggg;0C6}NPL_#*J3#Z*b4!Rv7kD;zCpEKeBv7Zy0HU)^J8dFyM zGX$Rw_5zqw0s%?r2}qly{cYG20vhlYuNqQAQm0Y5L80jVi{8fQG-y3am+I^mSKz~! z=ZvZ2E4+`J=i);Sg1oWvcDwk%!vmGJgHksGAW7-!pQ81a-LuCJt?Iy36<~N2oDdad zTQ)h4r6z@2fWbyT27z`1=o{fz2pDMdZ+kvoc5QBL{=UnMg)xuNa4Mxq1gHm~SGd%( z#HUC}^qi7LB1P^CQ^K;h%xQ(*t{{5!lsk6UMCQYD zAPNfmZhX1l+&T{I5?a-gxJNhgjpe#Pca8(aY*~aOLs&pg(&{Hf=7io8R92w|7U{!? ztwyhzC)9U|*qB_0K++fp>`y-ocxhp88=J#CDM-asgdSs zZbKp`bcz?W3QFwQX07ctSq8Pj5n_-GUi-vVN;e&@=gO(cMoY@Di$wyOtT#e~-1W>z zfGXKIS}l2Eo1Y1Hv^VRq@S2S}Olp|;;oRR~T(*J=d0Gh7s6e)hah?UWSOMgxWg0$( z!``OD7yaIkFy+UvG;+4uz$uR7K9Lv(GZnSNLk|_#TMBMQ7czCHd)IWA1Afo@AFaoY zg5kD@c$J$HZ(j&Pf@gsB1qn6j)gRGEQ+;PiT^HyVF?Pm3Wm|;mTj@^Q9E%1@y9D~c zUO=kUKI6wsNdMx;UrUk75|;b8RfZLET_PYG{VSDJ%SR>gYLiz#)5l`UA1~)*oq=TZ z>G5AOV5SmN0|f5Xq39#rD(o>@;EKY(}-*#)^47|cVh3BDh4 z6=>?fZ;4vZ;hE@gb%DbEZo^eTpv53c^)nsg4i#@WQgNAQN{xPdflO+;PvUL;OBb{# zFJf{DsWwG5>MO1#z)nP%g2K>y|FGW4JmUOvx#D0HEl8+yFST^1ZOvOhyfVM192DeX zuVGwvm3WGo3>cDwv=>P>G5j{PvO2@uLQ5&Js1Nqt!wX zD{%gT9e_LgtFAyUaAGw^o`)JO-cyc_r7fE-Jv;s<4qz1Z6k^X+0hY5}XBZz`zb5W! zLy>=oiUp5Y6n<8AZET1PpL zT+3=09ychY;IKg`w(ZO)pGBAhTdkuu6sJy7?xLXmo;CN4`*wZeuDYh^K!dnWLf5>! zuW>P%4B-97?HVjP2|Y>=Al4@&GFo9SeYnLOoC(d}(n=rF)1~4@^XgK0lpB0Yg#1mV zB~=ul7Hw$mThQCnPP171?ly@lW1t}2TS(rCIz^OdBaCzBPD1n3&!-2__(D$W3^HWs zD-dc3uomeJJN-b!nRbLQ);9xn|4Yj=zn13W1FXmhXlU{oO&#Bbsiwhat2yI9flAkZ zIc}GjMqh#vOeOF0!wC(9{Sx5IPg+xUWxd-(Q)WatW3Fr>nPq9hR!tjXqoHaNYjrl5 zQ&&!Le^OZaC1+VCYSmkH+Er*r_6GJ|+dB(}37k*Le+oF7J-Phl*3M3ZE0phFv5}`i z2-q{l%0k8S?Jq}V~OJj1$+Ms8`i?_1844Z?@3TB!I7Ry zM9i9kvDM^uQ)*7dbO(!XEq@}LPur89IpU4uC371URDzA~hBdP$;*Hkk3oTy&(b}1% zb_5w}H(yARj^NQ;s=F#seJz){UfcYuY-`;lfp^pWFm*?D>g*fUl937@PS6wzC;o6# zcI|5oL@(xS6pO^bq@y2txShgl+8+gPruNmdE}T@HD`I>tw$JW#+nRU(+^2ZHPqh>& z*!?XW7qp%jU#sME>uQi(mM}ncf(Au8p}v8%AMT=Y zPA=Gli9*7fPby4Agq?cjkJKc!Vv~{xydPLjqu<`>O8h#vAR~^&Hyv+UmMo0BIF>)f ztf?sbIcINbAhDL%z*jbv9xtfwX4j4(khPrE*+WhzPPruo!gwTxeFymC;KcmPo3Wv~ zZAiN?=T+LVENQ8cv?4@i()zEQeSNuXngI|e=?OZ+qp$L>)#Uc5G_=l-+~YWlgGXUm zmGU@p@HyvK;oXlgTQ||D?V@my4&K@J4ON8y;c;i_$l4c&om*0Jvq{Thr@Awc0mdj=FD0 zGoE8HwwHfQVmsiH{cS>pLf(Qvb%vm(mz>|39I`^{eY;^pT~w9 z%gxS)sd?bgqNUoN0=>lW<1e$+PA#JQi=z-#WKWNEh0q zRn6dM%2c34H+VtomvOywmWGBAC-OnnmtxX&V7B|RFrW>`!B(*3jU~h-R9fb9nqCa* zCY6{@{R%Eu&3vz!qUQZ+5fG1V&fdGg-^!NqjGILW&j!0^F49O1G-@na%N3WY7OTP1 zNl9X(7P*{g`rU-lbl&mFMmSYHaWgeq5Hm~UcRBMGF~BWfM0Z2VSAM+TJX}9VOw4rw zHfG3?0eJH1+Ni{!0M0kY$st|a^7;fk#LGriqYAbF@||ik4eV_$J; z`aY@u^2E`csmMV1ENDXOV6%CX0O3w{(>0k9vRRwtElta~?v9QqBYFr|yN`X>S`U$aKmOO!AL?6~=Hzn%Tt9QXKpywNKHZA{5$Ta6 z!2Xj7K<8DR1(Yo8WnnU=Qt8MtOx@MA3O}}N^4XI8xkq-VIIpHQ1^y#em9`0`YOp9N zhGzcV^0+wcq~O&l_||UHg;8{VOs0p~Nm|Rb;mX z6vBujE3E!My3T?j%XVA0DBa!N-QCjN9nv6;bn{AgH%O;+H%KEO-Q6YKB6S}8*4lfW zv-kN4Puw-rANFgIkALjs*uRsG95bq*;;(K}2pm38Iu^8p2hJ(A}_}nT0?(ow^jw=p}FIK0a=(;6+;}Dr?eoQ;2*0^o?D@)2rw5kiNwNt@Z`IX(WavKGi8|qtIr-6Ew zb}Ynmkg$Z#@AJ@-!HX$6;>Fc4D+$Cyyw*+2WFI2SI9|x=n7X)S_8fGZepg2;F*~Zh zZ=h9|6-{KhLB5`n6CN7tqDVT(RVn7hgXSNSJ$h$kEvGef{SBpO7`V@fWa5|ANrFq^ z_apMd8Vk`!v|$<9;WX>>*L?x^U0+alrMeflmgbN(^6JZk#e#M6RJ$%>R>9Da)|8(O zVrB7MnGgA zoPP|{n}r7mm#a5Co=UeTfBjfjgTF2&pnd?H1M)u#-Of_%yUodf7M)Z)_N_tu5qgzM z!NSq;8~*|)wO0Fb|1R7(C7X##rYyd?QqnW^j1^YWOhETwLqT`I4q>&E^1gH8-cLX% zbC5+dZ&^Arj<2o~L?*%?Xz!NjSZp3TE*(r_;H&lLPtgXQYvzWMM$E%ngEof+X{DIn z&qugOO4oke>$BeX;{o-~7gdA_V5?}qMnoK2@gGf4dVf33(53l=a0ov=T|3TM7kv(R3wll5l-Wvpr#d7P$qAd$mk;9dy1L@;joB8M!njK(s2~$nxY+0 zo09Oki|fZi5Tq$P2JQlkKPe-m;8fWMbPx=A$~9$10DMr%`JR(5Q&-t1QlS_j!wA$E zp^sFF4QZe4l&RgVLxu$zX-z6P1kuR`OEgrNVCW!BHwRzVM>b%7%co5sP(0Jue@7_O zNScv{!_od-iprY&gG21AG-#%bA>-0B9X^3B6mnW=3`F_NW*LCe1-6h;{dHEW-sXcI zZ2!dt&K$mTQG6suz`LSpgdrrbmP?wgb@G#hYgtR~5Bnh=Ov+=g2hWL&N2Ac(xWq*C zvRc&ErSm5jvgFBp8*+EF$EF5rG*XI$2H};vzMW24`=9mJ%4n4w%N6|wD#JA)trI?0 zYRqQb--2xV+N@n|pgki#wx9U^f1l4c=PpDwV3$vcu&}!0f=Z zdPK&?UZ)G&SzI8BIeq>t|7%?bH)zQ64*A!GHZpRf;I!kDXS#Xy*GJ?+^)bE>vm?k) z7ZR7Hm11@N0_LJz-#Tr75yXfTzvOl~cY?_jQS5=p{Izld-K+HOS$3lJ+EY3kGe7!z zcNlu#ZDl-z7pae0uYAB*JEpfltw9{lcZH+0Hp!5f7KNoc8fP=%=xPd;EifkHDBj)R zM;^|IKh;LDqaa*!K5IoDYsTHUqR@FqTMNdKBCDM5)VM?9AgnMQv;{{o1fl#QrWL%t zx=;-Y^2zq=q*6=sYaQR$6B-f?_>uh!(~P-H)hfY~H!cndd5nmIJYxO?``OfEur{f5 zzzL!nZc#Shwnasp-ar&m9C;RlfwM9s2I9@yGBozkU-(6B3y9q4Ze#)d(s*;GY!TKT` z{nmWxSk&%YM_Xk6d&OmB7seV^yQYC3A_bHgW6Di~MM2;RjaEFk$*muSn=Z$xEkkgg z2>H@-=-DOPib-_;0HG<89Ac4^Y18$66I|uCrT!qKdy3-GD-tzvq~l{DpWG4U-Tlvi zt)AFE-sBaDPt}3@^LGo@@;=jFD^upHU%W17sl6kjDixaDI~lLXRVaXqRmWJ7-6HPR z5rzdI*SH-N7|(SsAv_%@vtskBMt8V+HH6gGR&n{Xv>Mz#VdUHgM?b!rRLtkx$qbx7 zW+UA!37aTR%s2VwT7FK-n!VP*=Y35D5iH;@Rd{;C#p(_>?+OoS*a4laxBJ}kMAA)v z80qohT-GHt+gVtdm{cqOGQrT1L5MLcR7`G31l_ews4It8#sOM#Jx~aj}gPsfCg@IZWgrP{yOS zG+n-sk|jnrg8r!LRX^g{QJzZX#8uRIU%)EwN=Fcz^bjrP!O1V|;C4;Y$fO_G0wwRU z!p8mU#PbhbSSy6F=rpS&bz~<8c>2(f?9;Ev9%EqT!_DELP&Od7_~T6nU<$wH@lbum zTvLOfqYcDV#xy3qFbS@Gm>!-6#lNRh0bg6wO8qjxucp(4*%-v364UchvtR*IUhU!R zShGsi!kv2(Wtx=|R@S~xxn0gFX_Y=eh0av4z*d#@E1^p;&a;dlEWElF{L~pQ4Rcyq(Jwb4HvW9_7g+NG$H#P4s|K zG|$AHm`0P=#ogD3=;c2!{kMN^b9a2N+xiw?=YDzGL3dhlOnTq^{!O;z(9vz@ps?!3Omm-(KP^ zc67qj+d4P+R`=-3CHx6}3ItR{P<-$LVTCHl3y)f{nm8!1596NCsVZk&5#|L9x*q-R z_pWa8<;JxAo#+unZHLtpcuqN&mri-iWltvGS~cw}d-m75+#uC;N@TTkBPZc8tfGH{ z6K&nLGW@c*&Td9xBLYjhzZuFIodC=a6RU2E<8G{*`1Hz-(wM?Vqp&mLmTZOImzVNe z8RqA+J)!zU3}o>x&SjS*SRgX-f(^#5UHK{-@Fcb$Q&S$R=f!QwLrzEU4Pbp)H-!hi zU*Hp7KZB@KrJk%N`vzL@3yVg@qCB;21VV=FH|sCos2@$0O$qcc-2+SCfychrjCuAa zvc^_hyx^=$x3#IM^Ea$7Vd||W^!MEa0^y0i;=tN*M5x|>W3{&MT!_PvNn5X7g;|-H zJ^PneYxnKUsj1xmsu_b&MgJC!Me@?uq*(t|G#0i6ipHHw@RtDh0uTg5CBt>l5>4HQ@Z&-iHnhw;q=F345%k<|}u1plA|P2~_#;^fyYTC9p@UPYD30cDb+ z8GNnqc96l~@zE$@ij*280cISrNj~UI{B^^#m4@sW z{Ne33t4;S5w?`z!5UD%xtVFwi_D2V5Us){SuY(muG)rh;B2=MQP-<1{Zkiz5DnPsM zxXm`!3bU#hd&@|bTUKXY-4{lWed5s*$VN-WFOpNf9*H|RsRt&KPy{fk>?M&>+*|N+ zUa!n$)XuCA;2s;FKQRz7U6CfknG;m1MoD>n6BCWH#zkpzk0w^d$e7?6iCgqb4hRR- zQVVzzWhC|+c-C}Uc|T)j+GEiluqu&FDLqincG2eUb4J-rS+5zYeE6h3JJB zo;G$V5g+gYczkxXb-QZJQa z-&z}vpDti3T%C_slFl=@aZVnt2F?{<)j|`Wp!{MZ9^YYP|7F$Kj3fh<*{kr|d>;xj zZp;pPZt~Ol0t{3aofw~li-$EqEBSKhsG%t zBW?pg;)x-XAdzzpgWY0Gz0W%)VplOg=5-5i&?S}&O2{Jwa}$)Uya$zV1a>!;%U?N0 zN89bJvU52$PA5{Q5?7qBvSwY8o13}@>`sZhcV-zG>Vu&6YnDPfeY@LsRA|ReN7Jo$ z!3YV7f1hbI|L2+J zSCE7>;gTk5Nu>yP`!HOwMC>?BaQB7}v+pyTZBpCVc?sRnlf5nzUOmcu9^-*n@LmGQ ziw*}k(*y(ndg{$a{K7+?%@AcRq><560D4Cm9Iet|c|bVYzBuT!kvPrucji1~$j7r^MCy7Sf^b= z0t38)yQY}9;)SLfAP?7rv;^X|LOsB#xM%(Pn3d?AZRlEwORsYF?>;C%H34Anzo;f* zeZ7`nmB&RL!0=%EXLxj?4dxH0eguU-Way6IIJ<3&4tCTx)_haAA9&|2s-gR%q#dYK z`!&$tMF-*DEt{1v=KzgRKA;h*_<+nOb1DAP4p=$yQ3k`ne?mNjStt59iy~Lpj~=W(!3}N_FpUV&{jdVj;p0zl`G+PIFiB85{g3E#&kw=t z8m{S>!SvU8xreFlX2Q{`W5BwG@%^CM<1H>yb7WNE9DG`X7y{!}57b@18E2&I2GjPv z`pVceKfGg4O&NOhy&_6*(qT&}(1#72Y%)utP+UPf-E2c=XPmc`16KTUy-)U+>b8X) zM{Bp{$llG*E)5J)AOO!es`Pe0h=zY?Y!q%R6AQ?x9zDq97j9lp+12D4|&`H^f5|bJc7aw5=AyGRMUC= zaMW7WC{`A28GA5bg5X5i=%4VzNh+_YPsZ4!eFDAwP~%N4EwC`rcGHI+uS7!vPY~ZN zbNK-WC*VXt>VZ4WrqqXL;Q;~XZ!^Zd=}4EAr6US1_&cMCE+C7hSwL6T`Chf0uN9pW zp59GM&2D^}U&UM~h02j#Bhsk40n(Rd;N$UucSJ;4@e5d6Xw`&=lECNfaoeg?K49Z| zKLx@UCqiwDwz6j)ck$Q`kJyAh$t~CfBLl9IZyU7rSuBYFU%Xd@Sg@DtWz7 z98uD|Jk9tnf7lM4^;P(=@DJgOzsacIyP|}*gcHWVTaHyM5A&a`*zjFLXIQRx9guLc z2Im6$D1Q@9{IBxCu%l|yif5qn)x<}RipY#wf&pM=|M51nFV9*+HD{&K8svX#1v>b) z=}UVyjab`N_mkLyCu{eKjw-ROT&0OB$);?12?^i!6NC`Db~~sP>r{cBlfDkQ#W?W3 z=V@4^_7+>H)LZ>`4XGBf!JDl!D+|ATpcDIXZH-Dy%v^zHfM7)jqAQuyRCb|s-|Y?f zBG3Xa60WZ9iQO{q;~cb-^V!MjQ_5sFn8mfCX~FHG)`wsY?uqZ}QV!c{#(lRL7S3*K z%Z~Tq9N%6)HAeXfxEaB~30Ftould3a2aEgCT(lhDN41}?=%oYr+w%)0UgEhDIR_oCRiM{G-=dLY z{W_W9GZ@vCu*rU0!HGbbm!X#f^I42W4RPx>W~&_i0mbl#AI@T8rWqwq10CZl&R6_l z88fu}uus!eTwj+Nu^ZrPRWGr0mnjtW`oN0o1@RJ36-`Qe`GYNw4iqC(L^lL-)CnD* zEI@hA4U~D4@iy)HNjZlfz|g)|M+?iVB&5Nsb3UU+45b^cE%cCX%$9#}fD$oc&x&t2 zwGUMN07BE>OCnS6O<2Rg4`_J4c9X|j2R?!;G#Ey92JFPDAd@MP*@roW`?9R#EVsVzs32j z!AR(Z6{#2kG4>^&!#vOxy)08?U00R>W(1%sTH935dNIYn`NbO~nv56ba6aUR(@7K|unI$;w%p~IyfmpmurfvGE=tzRC+>E3c=}oV_S?I};Tb)}lw4;Jxjoe6(x0>4=t?qZ3u$#`0TF^onFQzafa zSW{=%=6XdEN2hh3f|yfZ(iX@tVSLHHcR96J;Y@IYx3e>6B#VLq+<*nLp;~2+09`p-zXu?1s=7aMEGKkQV#=j6z1CgFq8s*F7dVM z!C1>9)xe8jLa4kDYv6WoIiWlQ6{CN`7(xTB?f-kQZW8e#0(PG{=D<#ci%{6G%1u_e23J}m{s|?wtkn@F!4)^4Q`S~M61WsmL=Ce(8Xa0z2X(stNAqy zyR@LK0;PpfPLUq(t0d7dcC^ZWWzj&ue|P#%80|3cKmWVnhJZBSzk7mdA&on6T+B+( z^7LIOvS5(Xfe%E{WlN?|%#v*P3PURv5B!JpN^IRO5R`tv5oR`zx}0HKOY$NINUy3D zf*D56B$oY?XlU5KpjVOjM|XmY52a4{CpD*uDi- zJ}&mb7)S!)rN5D#o^G6z>d$_UT+mfrA2sx;;QvrOsEd6z5vUW6j$wrdj_twsphrwx z0+(4$l>9J7MOEeI53N+8hz$xqKIW3WxE~+Ra|?NFJl+j0N`gr>^@&>#Cv+t18pQvu zF|fj^p^mYXnM+;ee(*#pXv{RxS`LV?vnu1#OiN2>g_7E*>a_gwlN}nbCS7qVA_F6B zPB1SOdS=)d1A`b!qF{1UJN*If0tCfLxnF#($+!zW2hvcQhAP$GLbVn~bVWxb+YhH=j5R?Erv{{f7wnHyeAlt@8Pb^^J{nFnn>%`dN4oo!Fam+cy9yTNphGZCXy6N)u8t zJdxfe0s^2suA7d}?!mwJ`iNx2ewTGb!G-c)o62sXdK!ICR#p0E8>-e3IQg$_XdvRC zBH7`Xtjx?O01-~;_+tKhEp_&nF6zFMtbu{w>y^R!uL=tW5tYxun>MPgxnUW2w@-cq zEW>iMoY*i^skEkvU0U9xM8!(%tOKB<9R_`i+XVV(I(>E65PCXVqo0TP#1KE(Y!Gec zd_JS$Ze}Y};q|UOEOLXlTccyQeu;0QBt($y71@z+OqDah7|U&8S5-EU2_sXH$qYf= zbuRLl*;35qca2MYg+UYsQn2X+`y>h~UsZUQki!u3nz%DhTjtyv4(7w^^fy4ANNrvY z0i%POb;n2M)9q&hEg>SJohgP{eH}oJ#e=AE%$}DnvjBS1nw6Y6rF#jw@KXZ(cJu1kjkm?>FP(vK8+G7nwmpcyt)k(!a$z|O+GI%Ci}k2BIw-%Tun* z77-4U)I1f?^3Vcv^a@(}9EdEYJ`@}-AQ;0Lm7BuHn5d{-?G zoF|GB+0xP*AYSblR`MBBiPx9q;2e4WW=Gus8s$`2HEeJS=5W?A$_V=H0&Z_Uv~&eE zj0<^9^I6h23>33CwM~5Eo-+Y=yV+yDNMlAOh^(nDcD{t193ujlK@cSFc_mWXfEhv( z6|yJ!1`M2X41#`XM+{*Z_n%nx4e&-cyw@w zF$JrUN0-!um$?-ArZmxAXUK^7^HBReTKP-DTHHCcVc5LaN}NTfRht_EqvY1&$4+zb zxINI&sbi^w^e~v8%p4r5>m8H4zCEX?ql|!_%9^39M-RSGbo~ExUmOoMjk?hWpUx+3 z^5~*T6PS+1vHdx#Uqf0})^@GGJ)U7cy42x}sD+al;uN)&ZVrH3rsIgrq%cjmx5U7P z8E8M1)BBE8fYN*fde$#YTOYgDDA3f$pM7vDWikDk0pG}6bUX-Y{*#j%N{Av)4$d0- zVGjW;Ca8`r&M;_nBgDX!=a1@LUw3ew`2t*8uw&g$wFA8vF%2B6^g$n7MC-hdx3Xc+ z*1&LOAs~yvs#&M-uN!(y17tDBCFpZ13S5{_Eeiym%UP}*DmX{Dwc?l5$ZMehur zNdSk{mh#83doliV3y~t+STWI;f5ezC{43`9{ToHn4=fvRLICZ>yG@by0BxRyz$>tc1t*%nbqS(;p9zBGzg!EWQ; zS*-5=a+kTr8DmGXH9H!*xRdUC?Y2Kw=kOwpB~!pk&U1w$A~~WH);ju~nu1W<;=4#E zB}fJx8GW~FBE^sEd&B~cdt0aTD&^Y7_-VU@(?M+#i#NtZnBX80$t`{~gP`$nTrEz3 zQbc7p_!@_Vsgc|P6Pb!!Z%`J8f_pv% zw6D$sg*zY+MeFpjl{CeeX+ZRV_m%1j=emo0Z0BNWf+yaEP_4IAH&Qs7xwpX;q!Uh8 zd9(md*%C&pVdWjS{Pn_dKN2Z6$Py9#BaI>_RMbV3N@=0^Y!-N$=Oz51cxlNZvq0vL z*c}+FY1TZ_kcvJG@9lNs})ngF)^7@YQPTd+DOubU*8U({SMmEcHYLnVQg))X@VV|FZ75BSfOML#yC8^;ZhR;as1qf2K2)#=a~Dq8KI}Gx zgWW(OE!~!HE*euG%I2Dee!|_A!NBzN4EN*S^02OUT!DB<(f{5%WDm;y+Ia^H8@SmY zr74w{;3eBroPAF%qtkQL;04Fc^I`Otz}PX!cpRJIC4}a|t+!LzKpgQoq&JJ?Yu@m4 zyQb0z6Kb89IN_Dm%g$&2bu1>LAsG8a=X|ZA4iIl^s9d9?dYvbtt1GYT+??iyh&}%6 z`!@~Rf0+yZyZ#Rq{8wE-$rF(Rp*ytrS6#qs1+GKeFf+E_IWdu7u;E%1Oas$AjS`fi z5dHPiATdi&JY3mHN>h&FhtL|6`<~Pcnb6>bS`@8cM)9aDb5X6?w1k>+o9K~DILi3C zb$atMzWoBS((fPhz502xDR8+dG9ZA6dsXg_eX|*@;2Gx^8D~aScV&rI;X~?#L|>gc z{>bByJX89`&yz**xV{%N+za%rN=pbXKPt48oj$J+&;3aJ3h(Vvf@{vFFRzJKt-tPT zJ%vagwYise#NbcrCfUPx7~ZoFcRhOkVd9sYXmYA?Pi^!POR&)wqJHLN(0{msCdHgC za=(!b(luZ+r-;T%_L{L#`MbS^_alMuKE6oV%{1@Cqrmm$&9>Jk`OyZkiMa4T{tfd5 zraG(pMYS!T9HkL%Z5Fxn^kSg%+qaDsA+hhTt!LU1y^IYjhf>NJjVY1`AzHZt6dK5B z`*p-O5!?Mingy7ULNqIyxouFET?qY7c}s{8IXwwT1;K5_{Wty`V&|7I?6WPd=t+=R z7ccQjtvN1b>34yv0diTE)kPsliQ_%nBDF7bTrT%1G_U%z+FiiB~0Q=qb<@#IR&W2RBR}(KF z-F$}R0B~4gbN}06b;aGxsDC?sisG>I$UBI!F;=fpsRbykmg?wf>$%5)rvpwMF zd&@C;>00dUT%b0ecKop;mc@?&gzC6LJE^t=_{Ck1?yQJUC z{C2fSqT{_`C>~w6(ij+wI>VuU{y3-JY^z;R0;wlv?rQUNdynjGKGY$KjiNUp1i=_z%GkhzE+=Y6Hy;0N{~7+yV&{jWutx-8j;d5)XLm{IT_QvVrab)Ew=1z2 zeeNYj4vpdoji#oUFqB=$xv+pb4_#K+nwj)uqr#h=l48xSr;ElKy5=D!X8G zyR3m+G1YRU1pa`pk#1?G6CEpxyj9N>26dQ+ravvFisxZ4%mRAuk5rkNOUkmI$I7JR zAMkx(KSfaNLkN0*U$bgZfK}I%_?xjd*8e&;TT{bA*Y3}~aDt3{Z|RHP-V(#|WK!Zf zIb%qI&dt*H>lSUHfmN)!nuhC^4V0K1sJMw7u5ejDao~X^<&Au4@4gWX+`g!ZFwS+} z$GL;mQ0KJ!dmn8BlX8*hDvL`EHXE)ORQ;Zy6~274ViD_1g8kcexTwdF=*??A%IENp zx-iHdS=9X+10tPWibxu};h)$~8CM^oD(lFsDSOAlZ4)nzw;2$&y~d1u@<82M@^N4} z+6@;imOH}Ob|48$L4?ULTry) z`EDz5?#QtFH2xiKK;j3qy5A&zExja+^682qS!yVdIU%{oy?nA6Yjy(}AwECE?>9PS zxKDpUASQkA8gD(wUe(tJeG87rr;SLk0iLL*g-fKfR9Tq5i$$k;UmIj&S%TH>IrSGy@U02+iuZkfc5CRNT?ntg3KKY5y4nMCP0?) zTx*C4t{&7HZ2cL^&Isi`Eu>^l@so1{GSj_6w9lR6`-8@k6!7SID_B!3j3u+s;@VZN zqGV)-)!MIOp>EZLZ4T~IuRm;M^@>%JU0zv7wXt!0{eQ0+u?F&FT_&7)J7_zrSLK)@ zllQ(`ucNTCV0mc9P>g5DLiJ~Sud=_AQ^?){rsMoxI4QkX1O9H)Wu&8 z@3m!at|`7+_F+PH0aTTQeWjGl^;=duRw;Tkybh^h0TC6xV3%rphFz9t33IcW_m$5p z_U5YZ$DCT7_rCV?a^0<-IsTZ&4Qx?dPXutP54==vrFa>wX*)KP|jB!m!z5mL>U~Gcwe! zV(=FAk{bVprJ!OXu{=x9YGT)1C6!{K6kUeN)%>%n9#Shx{P*9AJ!!_q4DSfRml8z$ zV9-CklVP&I2SIHK>mn34DXY+^j=Dhu;)>?EF*k1RD~$Z+NmXlB=3?2#tCgdxh$fli z&XTpAZ=VF_l6-2Ix8aK7{##C_7Tbm;t3}%YXD|=vg%HHUzxHvG!i>s@_Qkyb{!TsU z?&HDOkhjAf-g2(Gf=5lf(GN6!401z%4@Idb-oBTlIVyqHvR%cOJOcnV5g4EkJV!zf%Ai z-Y5!}!@oVuztyb8M4WKb>Jj_fA`;TE@O^yggJ0}ZvOX$Dymn^7+^NI;L2^##CU#hV z4CUu5qAO0kL=c1R%KNhQOB-uPrK*Cro<|I!CFVe^LhCfxGGVMF$&oAb*YnhAH1?g> zf@XyrTX8K=Gw z#B3tALD{aYob4-Si``&Bg$-Efq=W@_Y^=TX`WC-`9a_8Iau7Os_33u_1r0n(Bv3X8 zKEI}SQj67vtfkK<^QgtR;XxVXm=9149Y&yueD&3nxNl%MY^MTwo{v6ev=*q98S&vx zOeSyA!{JoLm@l6fjbyM#viE;E_E;ZsQZWpJ8upNer7p-Dk7eRESUj#^(smf;Q1mh# ziAZToj-$ie3p|FBhp3~5dT;oCMfAgWt8ZPH98Qj)G8m*O)lzGC%22Mtl|a}A#>K0y zJ8kN)aQ=dS9pqKiz_b? z>|nc!zih44cDVAl)>#Z~Bd~5#oN3nnvAh#!Udoli{q&p-%63>?^)RlEEH-XVM^CCnH-f%Fn+6kAP^8R_<$v#QN1OX9qYe#xo2n+xo*l{A%ktI@r6#>P)qPAZsx2mZLL)n|R3w}Joqci@`{ zOwz_N;_SvUIHJbwZr>T9xJ{X`BnN{MddZS2xO1WJ|1|k5X79HHx1uo4CT0B8l%2a8 z+WQ0BB(vfhDme4aoiCZLYf{Vc?HT02|0N}~@t(C4(U({@SPm>YBmx)X`0%bY9W_%0rh_=_gUSupUMfd zFK?&S&>t&yYme1S4N6?QVO-I23O396cwn^zJ+++1@cNsnM?6<%oc?`Ik{G?wYZyB* zRD{Vop+JuwQehYJWUamI#3jVpR^5j~sFgV%6_YXAZkSrn^lJQm6~WbU;jIj|&GQx; zp{Masu?gniOFr+5;z0j7?(HySO;IrhMCspo>uYl*vNH9L)z!nNB)qOGyuVe4J8d7& zjJ;pCK4nr2i>R5(HX7-{N1*fJ**{De;YM;=aC(Y7IXfczV?F9I663gE7(#$8mbaA0}25`IDKu+}5UhX+`Q(;|_Y|@TqB#5(D7} z>KAk~!9iYNK&3U9sD!Go7gZOh$95e#!Q1`i){^pc&a|YQGclXXOISgU%I-{9it!%n zkp(JvBNfk=87Q(!a|~TRx&dygnyC9(I9qqFCd%nhdI7)fScZ&lX%AIB2l zVefe}UVC0_?O9mvZE`{-w=DC?t%rbA=wuHl0+=hmY&{A{#GFo5!kcJ`BcBmrq26l8 z9dXR{xLHWE8KG{h(Ru4Avo1XO`1>gIkV6v?13(c8^M>^-Ay zGGCo|9!`t3<>0`z$muh2g`ro70z5Fmt*Y@G_Lb;`e?pk^*-bhh8>JuwVA~?{JR(6V zpCF%uw7KR#JVU?B6L%6gpVy|Qjmo>}8YV9GPFkN~+~8LzY%kgRGj9L*N^vw}NnUvo z`79sQH9T~2zAf?bU1fsYTe58E{E>E_q!73moi6P59o+V}*#$dNTdqVi<92*^iz10X zYir`$GJ42aGb}%!_AhhFSE^2fN|ix+m?%{JJ(f%!Go&AL6c2j8VXBsJh+g7oncJQ{ z=^ocVnG`$!ocQFlJ{aZmP7|z&W2-l z%8F~o~)i^Am?@IsK?db8;v8 zF0jgJxwnZ3Y}4CsfFQ^Y8Lkbp{|^}CrMfP0b9chn_!-nR1r@p#FcsC)d()_EO@0+k zdtgf+o~yJWG{ux<6zHXh(*h;HE%PBPl+5t5n?(1(hARsUy5eT?x5r;Gd`}xDxW2|U zY_g~I`7nXqB-$l?={$&r{a!%4vbmh5p$t>=3%;lt}qw}2sJfW(>+SD1o-EHjrOTo~GE609sQAUt-=T43sxp&U; zpRZK58AR~UcPy!n**&lXD&@VGh)blWCGdEKsW*;;r}lLNemQmT)@zk26aO|>Le4!S zcwx$okSnnw^cd}!88J{##*!)Vr4TEI6XbP^exE70(N@jt!jCz!T|dA6q-b^@s57z+ zAv=J|vwCZ;*ugb`o<}u*Vi@Kz0#5c0Xbc#YuurH1E z)5Ooti4Ht$40dLFMu7?C_^)ytUu;A<>*Jna`-O0RtF3s6eXsLAMha(0fE8dhT4U}38P7P=S9@OD*!>9-BnrS7FHi{L`9(t-m=1y$^_LVe+tZUCfgWP$>$;E0yu$Z^SNxXeossa!{J%zNtGay*FYCBcP=E`!s5o)*$-2>OxP zoUQVDhYU2Wd*gjGQLym%;zlLxnU?JmU;HY_`+ZgG)d4gh(H@KCd)ah?9{sZiu9pP? zY|^`nOv-&$5v3R=U{eOF9ZNC=in@i7gHXL6)SR>V_{Ck|xD;r_NT_@^r4{16J*qS* zv776bPXrn*Tx(FMKEJ0|`zOd6^lgen@K}8&WG2dosc!voP zo(-eFTSQ;@Ge3bP|3@e7zG7t zhjnjuWb%*JgK!x1_9!NDl5iuIZ0t=rc;GGW!*QP1qy)aGL`ddEU~vp>ZWk3XR6_E&0Mn9xWiD->iOOz9vN2FWJ$3V zYzme4_Ar0}Q_ztA(Ree*?LijqaCUWAL}o5RFF9B(z^sU5RJ_P%S5bM@g_XK}#KaGaMlFzGG$D)482@WpjxH;P?l9;OUj;EX%LO(-vDOvuss!F2)dW z-zOCIl(xN79^J6o6T=zeiB|6kIW+2H#LZ3l%$xUm_T31rNfj#4lAg(X!(4=#5vIntXNfLw*zd9?VA} z2f3fb{Kssh0?*aC4oVOc;y=)8OgSh;UfctIqfCb04zx|Nc%IKJy-Z|+xHB^6za+JB zKBxSpj#pHCpbU`*I>CcKQKa=aB_qV45}EY6iXFH^mvv^GXut84?2~7^+L%|7%)NZq zMjl_g$9SexK%pmD{^o!n^B4B64QTKk=D2m)Oa;wvYUtwvhjm3Cpmp>=Q~o6+2p}Ik za9@C|ow3n7oQ_+S4n6sv*%0Q8uzzOCbI(tGFCcU*$*!4q5+owckgkbVk|oLiUBt$GVv>$cBA3BkJ(s0a1QC#r(|Vy(fG`L5Y1qy^9G%Cy>ZQUgV2_e$r$ zYcjxU0T@DMXf4+-eSiMM-#-(EdTq6aH3reDx^hNmn1KFnR zaswT&2XRZJWHd-gQ-`2&y>hd-0+Ir@I{0zLX-CQEsV4{$Mo*)j)`Z`8NURuR#eXQO zUZ@eOF|&eOq@?k+jBx^^sH=t84$(e;W*~cOA*|;x*V}UBrGk?;13R;+E!7U;3C!NR zm3kWkuNr`idPD42g$0b zf+`?QLuZfy+)VPRF3mpWIhS$z^^7VqElG5TABp{X-*Dcq6+|>)pb)i0 zZ;hwWvjT(zkn(`l_)@;pPKs-CL1KHSB_gZ6YImhbyp427vl5Y&M&|`H#Ri1FOs2-y zo>JFnFBA<4;)jL+TmyJ%HBESToY9|)^wb}c^ZA(rcp0=nVUE~8D@0;LD}fO(`y)v| zXYEd#P{Bp|W@o}Xyj`dZME&#vI)s7D;LhZ<3C{%Kg?>H-C+=6XtU#+lSa$1y2pHtm z&bsh(KVSCZI;W4=DHd^#oBhbfvvnuSeKw;Qa#FFm@L9 z|4VGEG_g*u4ShayS3GM4%~o1~DkR@7cBwVvllj_&clty(mX3zspbKzx+g!;u*?&Yv zj!)dE*niqvm{0u@1;&>C4QI+kAQ!Lccy{yVX=QNlW_iLF@Vqj{q*v-1W&qeOpU(<9 zRP)$h?+aB+Xfpsrlv;p*SJes1kHX*!i=-_n+HSQvuPD5;cGdKh6$lQ6D!-{d6&aXb zvYxaLr$jC@J>A(n18?@r;w(|=WK>%+uLxT4DL!E^m`+4$0R?Q|33A$-s*IUZ9{n#$ zYyHCAgpW}FS=Zsvi=GndFB`QfjJy)>G*~zAJrf~{M+iFVY_WE&b(~y zxmeMWrZPFS{twi6*6s^Jt0_fVp9KgXF$sNrA*ei~ctTjcAbnSrr@PZ)_sC;TC%nV0 z)zIqboJjJ*?|cb~dm$phZ&!r9&Ie%Vwl*DM}`HiQ(}J#u3P!TO=bXz}24L=UUJLbg(6(5fS%( zAm(oc7Jl>u(03V7CrPj8s_2u{a4+mu`B?Fj+E2F!OS5)fBG8`86xtdaCF;fRu z>cK{NHW((NbG?LalYrQut2j51p8$2&-D0iZZEHQxO`?HM4X(9C`Le#CqH+PQ7aW51 zJEtfv3*1>LTI5glDVDP;U=S;qSBJwy}K6GaagG;BNQ8?v`i>h*zNSTx3g}d`jp(x@kUO9 z6Pk^>jtZsq=6WV~tF&2c7FNq&3aA65@{1F`WQpjYnY~IG0ayIc=-J}Gt4BU#8G=0l z=}4x#(+6AW!g@049?duP2BE`v$9P2ai--d`wXRTH?(tu}cof>*Ug)>mA&fph<<}+$ zo>dkssRZp@tbK+iwhIzUZW|4ekv?UWPIfH!9)J8(5Q@5rWTI4P#Q~rk&@l{Qq!%qc z`^dZ8_bP(CF8%zihX3BrA3;C~|3Gm}+d@IV$ z+PT{Ib~spD&zy%*DbSUPj6+#bbR5PHJ5gp}Bh=0v$ufz4e z%$bOG12LU4gGWQYfnnI+@g7h>mfv5xPFQUZ2iBrSySQM6=|fuBO3e7V-?uxr;!x38 zq==lKD+R;&yVzR6;@6Wh3B6-X6aMWIZkl~$cO4!N(3f-Af(fFRZM-oNeUKy7PH$IN zX!^X*iUm+778Hql=ZGbpRG?-Vkqc8LK50%;c(jPM%wdLB8s^Szr<4nN-hUQu53FSP zAkwB1!(x1HeOd(4*?u<3_E%x7)yPmb5X}s|TD;X|o*9!ZNvhJ?)?CVTl2_Dk59n`g zR{VA6$&%ZXEo?vb>Phlkh~|mGaXuQb03m z5dzt9H;|nNU)%|0*lL&oKOWg<6Fw{U?KA+C@ExmlSOfZ49G8{VAA7!Qy2q-No z0PtqJ-Shjb>&&5_76)?3afy|P=u~L`hqkwV=xSU3hXq7B1*JpjM!F=Vkw#J)>F(Zi zBS^QB($Wpm-Q6H1-JQ>V<2m=7`}y8qpZ{R5wP(%DTJwsUGQq&_lrw`lxSV5=&iV*v zTXOs5(QkFJ?JOP_yz_he9kvdk+6RPEKRw__#fJ zh84~zt$k5d$Rlh>gU(6XY>!vdkUiV}OPF^sMfa%-T^JEl8{DOtz zYSU@B1@7OU`}lwzBKNP|mFR}NF4jx`wY&G5rf_mmma&v6c8B4pZyE@WbZfg?az9T~ zOH(nHy0zz*G)@+n*H7YpO0KM#*w5jOeyO4n#d$Fp8od$;BYY2JvZ3mBw$3WQI`e+t zL*-e~jBgzl8c{WJ873OoiC0K9-=%*7yU#?(HsR;-3rm*N)wi51N`h?cv)WrI8015! z|Nh!pFct(ccqPzWk-*KhNY5dy_YS#y+}lAbB9`RTAG`vBRm|Sjy_lx7>S<}t0MFM? z%l*F7_)@vDM>e7BO?!o!WCi0CF?5QtDsMTwsdMc#BDo#k=KAXPJbCpnvK`2@I>8() zy6yL|CD(Jj8L1>9qB^I_Ibu+9ftyZ(;jVlOd5V+QVLiy>7pXVdv%qMsefn}3$$Zc6-DGj1%@_sR9JcY;dL26uT<)$twK(xoAe->Y+B7t z_U7i@V(*7o0rn?fUsXPPo542Ejf8Scdd8a8%y-&2vteY;xj;+OrK3CErQkuw*1(2$ zTf9Qk^j|+>jHvQ4%AH4vc%Mlo6!hRr&QC@>>yj5t z?a69UzHxk|UqVWFubYksEOBC!zW2S)j$wEsUy&0T*Ap@(7tI;g8PaGF5955Fi5E_^E`bwZfRK`3U@nizn)X=RQ}sm7y}R}z)K z(tOjy-;Jbo2)5i15Ipe5k);G?{|^YB3dHrgs1 zm9nHuvLC@p@T{063v+SPcqeN`UpP!<$=y7eP6NDfc6#7M{-}`iWqQt z>RZ@gQ8!}Bup^cg9_)u7w)%5W;fTN13$c`cD<15H-^P<*Jp~Bv6RIb)xw7zy69iy!*)DHF=bb=vN4sT3=iG2Dx#;;>kNVCz_h(m1zFY{5j ztpKb-m?#Wk^zJB2A2fCVz3^I-_sN)L{+`2{S4zL<1tsUJeGm%!FO&?rIP}qDdx_}t zUHx!6rUcSjEzt4QN4>f`*r&)fInvqSBtE$5?_cmW#nQ(PA)JE8z+FI8Oz;&_*XqQL zc8|!a5unoA1uX&R@D=g&TgL_TPTdAzYsH?K8=eM&svBm0~aN9N6eGUAvcW{8mesEw*_25x|_*c&(- zKXEU!0W@^$)nYAm-=|X3=BrSa^Q~e!NpTGOvULtgH!fYr7K?-r0VqDrs(oV%RKdw3^c&T9Sj4OlDxDL!DFLy8YNZ_tZV94fYj zDk$l9jxg9qOBUF7Pk!HSFqf;=&O%{j{ivlRD09vvkFI~M^*Q6Ix#w%gT8e(hUycaC zM2<-%QCE5JXX-Q=CG~pNi}zZDNj~FM4q8Qt(w`z2px|$f%JJL7zR$*#eOHK7C)Hre z=Qlrmvb)l{Zps?hV#*xe5wbQ zdN4D4{SF@RL}ww2aihr*ekoq`T9YXRfg3DE%x{0hw%1RM=85V{>`(He02?(eziJu8 zz{**=)-b_|Z?GjBcP}=ug0c6_7w!M-HJDQ}NSx)}4sqa_HRrsf-?2X?cWj`U>!(Y9 zVRf(=#{aG?|Mvp zXbEKIOxv3d(ZOmI8ZAfxyy4nUTzh>Mz~TNs_8AMZ&!I11GFGMF%n3FIA~EjWOoiPJ zuIJktcZvXN6akqsNqXJpL7FYhi#L#B|19-wkTeZKbS7ZXG(8m_b7GAPx*Ca)F=W?f zfq76dHJX#PGla05=5(h0NtzgYynZi_4wI0nZ>LEf@M9(=|hv_qdDhA!Ds~}&tfavxxw(5sH~+O(qvrco)>+S zW&J!jYgEE8A*{v;HdyLMI4AQ|w(BNN^HJ*tXArJcu^_NbpXVb_ci0RET8g_UO1X29 zTP#r1^}Ov0_4MLNVJNWe^gP6RH;L=NNGA1AX8&=ugN3E}i8drM{u9rCeQ!~(NFNx^ zZ2!;q21e&03rLjpKz4a@^wYjYP{a-sRBClQMLgg)Gf?fX5?>r|`+QFiSH2=#L_LwU z`n~deeN=lThjL1ySvD~R)L}yj7ph)o#ZlNe&nS7ODv1x;GR|sfPTb|OdR^UEZZ}_7 zgkX?c%3CuweGr-j+2IMYzWXxsq;g3^V=t(t|2LBL1P`uxBmG zAYM*c;x&vjo8t6J8W(YGWrnj-%57c1_(1`NvQ}`alHUY_maP0si|^yCsYW!}_Hn^w zHrc1|wRY!{+N3u)rD-^#6>!99!`hwyqwv}SZ{6w`LDu=PrvJUme@De%yPWOwxvc^BO)DT9 z?%7=b_QLw$K9?3nF4FwXyUlX8%8EP>vz0cQAi+=crGsR;t_~Lay>?SlwW!r!kg4Z| zU**|H;ZnS|)C2@qM$KN!^gHD3b3e2Gv&&g-q-SwTEmSX@mti^?vRQ9zy;Z5(w#6Nt0?dS!d-l{l8CG0#rW@C{?ocrA*PM{b_oP+C4uAD8DW}H zpt|T1X7Fl2->~*P8;%MPU;02oV2i9QhO3?C%to}nJnlP9D@}#AWg~5PkYn3pm{=(4dquDGB96&QIYELYU0bs7OMNhX8e+H*{S*oXDJym z4K7wJ#=VYT@Gqw|9do*xtm6fkVFP_-z;rQFjJw7+CICa68Ug%MO#b>{_%x+){cq#; z$&e35fy^~NwAb5to+KnPLM{fQQ@rTsYCaQDJqynn1AMVQdcHmfYf06SW3Ztnhk8WR zmMUe;`_65-t9L{RKC=_BdD5%C>dYFe=Wk(yz*0g8mXh8$+lm~_EYWW4Fkl;vkoU>l zrE{%%_$PaH^S$B7l)3MBP=h6I`~CPg&6>~>$f$0qbT_?aOSxLtqF)dFUjDzg#a#H} z3Z!^%%&}7X3W;tqxi5xm*1j&0-jD$1tso#*iy^gNl^= zI=JkC3pv8~KgM}A>6Ik6Y)Ox2H%6JcY?#S|6|GXISvWvPSn$U9HNF(ACE@15t4`Z| zTT$}2q`oh8!cZ=%P#wS)?mB_EpP#U^ty{6GO z=<0F-mERIp z*M$}&-Nt05^Q4l?xg93+fJX5T2?f$me8SAneT5IF@kWViPt0uv*@R%hYc9KigUBU( zfcpd<-SpB;{0P<*X9Ii3%bS*W1UJjbGSAemm@Gm~(Oc5>A#S)TE0@Ixbo{k7Y%dWC_PTP1>nCV&$P2MJWW=l0k<9G<4R(ndj2|R}CZ>5u z@CLrqH#!m5p}uw|K>0fT_+Xu-711dGXIOU~c+*EX)4UZSGyYp5Pqv8Do%QbZLNsw~ z95=qdF|u`^`&4u7B2Vy|freAEY)|N_IJL zx*1jqSKu-UeUBb&lzBJKh!<5K$|=t_D2_M&bZp8ou5vv(+028hfoO{q<%j52mMKNI zP)bvM%II&GwqS*#6jSH5H&=n~jSu#Blw~dRo53iAG)8uaj{QQi<3vJ$83s;frPW5L z*GAg*M-o21&}(`091|8Z*4-B`Es7d#*kacB4|!r@r~>c>3_p_H#HEgQhw2`!GAP8u zvq;g(Zlq{(O@6PVCV0M$nBn~+EM2ZV*%VpVap5@L% zzNaYx8nF;H7WO&km?XMO#9WiTyJOj@p7*Ycn=?)8#y8d@?%}7uB&}#pMuY)oUfIus zkl8sVJE(#^N83F_dWf;k?^VcHE(G|m;3!-o@s$w&`+Xn0fc=p#hIkB8X(g5IT6P+c zF3{DNM}jvnL&cCvtZ^<>t0ot#jr)JtiV4RWI&tX&4hR@K2Sgp59}! zzhRXHz(-048y-d27aZlLGqc&&M4FYGW`${RJCdC~4@=E8Ab9Mh4AKngvVgHE+Qbs> zZgh((d$$a&c*enT%?U=>s|Eb!k7tJcxLBW}ccK04^pJwTF*hRn5p9&H{~o&}!lzAF zzUd1j&d*FdR>GN)KeqVfG%4qMif4da7SuHe*w)PPaL*h>`mmHpzGl*V@Nvi2=1gCa zlD12W?d&^hn*l9jxfy=&9brk32AXrUDY8; z6qOS_zgOr8fW9$U7OS^i0>`I5M2+s8e@{<=$LXojyT=+xanJ zuoX3WUT1U9_Q?8s6O!?lq8YVKiCYyTr%$E>ab*61TqD6hA?_sXsLjq7aK{VreCa}0 z`EQ57@#&?K-0c8Q3FH3=05fdi7Da^3B5K`o+-QM%HAh2ok?W-e=?|vV#=rlVOjcjy zunCRlDv!P*Yp+uLc-%=cz%ZIOY#VNnB}Dagq0V*yc*jrW0BYbW1Th*K$kc-$|rc;g8ZV--hLJq{<+QE$khVl#Nyzo9Av^3?c&Dj;(NOS zPPhOfZg9jkv(9B*-92ck+Mf23@qwi2Izvo>N{gdQ-lj(2>VwR!^n8eHY!qaG{I{z& zqU&ZL$kYkZ6OoXb`-32W88Dnl^?$Jia1hg1q<9t_T*5lty#iy%=oZ7GlE-RwQM>RNH;?qN2$6r zkYqc92;t^2^V@|^ouF?FbFC^O_aO58gH&tx2*$gV9YmLr_$Hv#|wB9)A>NgyPbY5{**i!SD&gw z&R^rx_Zf{?Ci^R<*t!mMKarfmLBu^|w4SZ79VRx7||;@HK5KFVpnn;zVLY_f=c1x`HOZq* zg?(8DYY|`=4($ua(qQ`Hn^yNE^7@0|wp0rfLxOZ@*08XF_+U`2(dWM==LQ%BDf#Wear! zJ7oI{oPEzFr;GKYnTmi?yme7kzxFR5Ks`$2x+`fQiG{vuGb|GRcEXBwiLOqocW&1c zocHbPRc_dyX_>5C z;%x;0qN(~?z!hIT+Zs@5QNqZOP;gElNZowYUS4?;HU*F@1vZN*T|TMfdQ1qUS(k8i zMoY1ZkH_KBa5WNZTTnwVtTGoKQ9UFi{*TFhPI3ux)nh`)m6l51(t2TNwCHwXccP6oFrkIA;h5Bvm1>j{$n zZwRmv0%ZFXp84TSR4r@ev>JglT%VpRyHJa8jRIC@Nj@)tF1O z6KD&kq-<~U|0rUKCbF$E%gyxEJG6@3in59Nr^)Qh_{WP`Ye$daC9Jc+V8YApyJt(J z${V|Cr1JRGIxE1;MgxQM=kW#9rDP)A%L?scp<)ew#>iY{reUnV*VXncc zoBpo3K>8wd4W(EzzjXakaK^4`Kh`DxDr_E{$B-HT+MZu;^prUy`8pV%V}rKG67kuZ zlD6Vo4U2l$Gpdq)hx<*?iPgOd%oPNKE${Iq0{vmlaRw#@UENrY=)bY;oJi8*DAla4 z^}nm58q(yk!rGY?h|8O;Ak#WJMD2<0y(H?@4r3O7<>KYN=6F(TWY6S(W;p&Ul>&i% zS)o1 zPIQOV%z@ZNAbvlTjxK5~Nx5$L!*@)g5v*X&5Mq!91(ECU82Zr-k?YVM0}XNv@O@DN zy4lb5va_}-Q3_1D;b=g+jx0fQk&+E^Yrt*@Btp5JFk$!$P{F8UB5*3HzsY~zi2bc| z>JHwf44NDsHl-o)gX!^a(|20~hnB*DObvt`%~DDt2N;k@yNcLI#V2YIrhi1)MUN>NY%v?;JL3pQY(|1;-fdlsbp~ z4t*y)S1BI;jQC)xT`QJ{Pm{^vY`WJ}Cu3FkV6bLFa&;!S^arzIu!dM#U}e+WG#%8P z;ul0YwSh|<;ilW?ckH}#srC$Tcb@7Wx;Bnnkv|I zF!`TuNOl``E%>t|L?f7kxT@$NP?F#`?}5k3;(XDdVp~8r=5o6+ zH`>4wN_(;wCqu=Je480ll9-u*q=j@C7VFCpaYEf3P6~6F%s_J9pD}6|=`t*OlgzCt2esn*AZsBuAL)jy^8M3?f)8CpK)Q$a(1N?U~ zD}<>aaSL)IJ~+V!sVMdG=+PqRPth`bh~Qc|x5!{@Mo&)#guxNhr$&0D$4f{c#+32J9y)AUUP_Rh=x?pGdx&IGB;HvRKFi& zfswH~7H6v;HJ`YP6fA&o$^u`k2RlvODcQUTc(Z6fbCsXvXlWA*(RzoUF1mnOHWs%e zM3~frm8O$GG8upKb(}<0nn0Hq@Au0C_t1+)#tVK!DwX><+8?s_BSRbbsgVQu5XRHR z3D!)Wlof~qhXIvR5bFr2R#~fH9PpxWbAt{nch>8okZqxlo&!N}VgG57#Nm z<#FZ1&UOdRD>odvxB|iJq_=M|WHlXt2j6SwEA58cyLJ3~IoW^57z+_^jg4Sf83~=U z4K{?nC1FJ%P9c4PEd1iZBRXhNxa70+RAzphwmn5QVnwX3pD;8J{;@S_%!GXkwUz1P zTH3F%`W(Qud>J%i?>M!~xiFf=e_?PphL!tML$A?s@eueVmZ%`VXz%DPth3{e)y)2l z@#!f(+1dAR&pQ;?>25{;ti=(s7C4nU8r(MM>+>dpd#hrtFw(NX5rY_%>K&HFQv5x( z9JKhQw)J;E;V$#tv6;hC6A0M&Ol$4`RLI0(v-9hj%W81`{nL3)xAuWqzxKNR#fnK!gJ|H(026-1>AAQDc=mrJW1eM@ zPul%P`N|PPi`|wy$RGz_V!-NyJdJq$#>>+;n*otqo_Bn(RrXZ*<7&Fl40_p@0H-(m<2mX(ZIOJu4Ef*v|mx_Nl-&j^XFniRjFn&CmI}C2hha43Ma>Wm14m7GY zn$QLTAD#*xuApr)%jwlsc_%R>Kc!izpQCYo-onMeL(IaWAtxcUmP^|K|K-HIV(2z@ zcp&gjN!3A6O!BqCjy0FRo*MY(yCRXHAJ!E-A77!e8@XOJC|``HSIeq=2c*#Nn(hf~D>6$hAB^*iPvbj)LL zH`~)-Po70CzsS=%aIql!wn?m=es8K~|Es&(rlVGYx*=f~(f^761q$AE7Gg=b_=hKV z&@!o5_A3=;DgH~s?A)?)`X8A?g00We1gR6-X0#}1l(dA!anbRXwhHL0Z3L-M3 zu^NLTod`BO8ZOQc#v>K5XD69jg}@`&2m(8M}V0;s$@(@2*b! zYIiV@6aRN30P+HhNQz&*c#5Wn>>ltAV}J5NF~o2IS5^ea$Fd2#vj$YOpU7*_gmQ#^IoboGuu36hBaK)kNN zgAxJ4dgwv0IC$Q{8AIhW(>hBKk@jGzF_H{FXfxx|-|sGHgqb0rNi7~0gd79G?Gsq%IbwagMkk0}`5714(rl7U~8pbhuOdke-mS{#_$%%-w9=1t>N~n`aJPV`(MRHjl)YGP2DLV@y&t6M;yY=Y zEUB?yUGt|(lN^xRy=> z`mYa+Dzu&GGeX~&4zh+;@9?dc%+Hg@a{89Gj&l~_++L#nS4_!fd_XUN&j6Ms{#u0b z*r#Z55Tc|ZV)cr%>(g&$mNBkWi6CT$bR1IKwD9x1pO|%OKa=4LB<-_Uh3Zh(nb$(| zCtcAa0=YY#S!3#1_ON&iYV+R26eOuKgne*dPCZb$O49F*)O ziuKw5Pe`eCk5~ade>8FSr|JjvE$!9-$5x{A9MMIVEJU znDr=eI(qU?>qxx;#uS$1Dls}DU*7m*OmQIDu=EcKWnC^LtByy*H?8U~MsQeFWrf7h zj7$b#1jtWoP_GH&{I<&c2y53a4wgbd8>IbPPE<^OF24vKU`m!bt;#6+6;wDS9eiC* zK1oZA{FOb1Hg+Ynr&unmq~KPtsj=W`2{!Vlr(p8EquCTT(RM=$#45a`@Ot;B8ZKUe z4Hw!bCH%ha!`JN&s$dvokc{HVJQU%@zhFNECf}9W;u^pu^Xmk0D#-u+7g^pC+n}BX zK7*2W)8<>)m@3>htKl0tjE9@55F|I%7w%n=7whXD16#t9*v7PN@OLD;g=@Ct$YZ}q zJ}jm%N0$B-S>xfA#61QE&);{xZsZ%8v=*35t`lf94?1ggX`2dD$kuZnn|X!^r5q+2 z$)W{-BF|6o1+||JTaipi3(|%J_NsA;T6IhiNydalhL1PcWfxq-T>2G1(|&vYwOA$$ zbLO2D`(Ad$FR-s~DmnmU;u%0;asart`vvM9LQXs=F7YT3_m?OGJS^HM_AYZt`wa85 zNrMEk60nx+t8YvHIq<-MhWqiCSW|e7*H2dy+I92C5~&%!M=QA4WpqD7*miikSFY)g zYNOmRRQhejqPSXY5igkRnuj&(C-;j++r{qM6@@$k?f2*YdVbO+sL~n;a`D|97^g_A zX9eG0{`S~GN1f5PZSl=kVh)xNbR4X60wd2x8|_z;gr7E|U7;K1U>a-1B)Uydu5tr*WJ-oz0eS-eam_Jh(a07g0VI zdQg<%Bnqui>D@FQDU}{(V4jRv&gC&vQ49y62)nr4&vncAJ(|;?h;_XH^4OEaMFMAi zfGlb=VmQ)sPwlkV<#iXEisZU8C?kROx&dxyxI$ad>sq)e_}f8qUbK&3ic`_MX`_f9 zShTp&B#HNkWe$^-9pEJ;rFpLJPS!L=u6IRu6fRNe<%N6bC71aHzj2|;!(_n^EAW=G z4YpqYsq;CMXVapBNdZ1`#sDMD_^Oa98;)3nmX)uJ(z|*SQb77{np#1V}V5?CSXrCna8$?o3B|Y^m+` z!cl%liSJyq*SDpL!7R*dV#6BG-0^bF9wsZ{crq~4Ofq;g_}U#<^V-(;inDJclgVtj znRFV%?yq$@qv+bpb`$NW!=iq`uAsV(2 zF+vbK;NL+58}HATS3(3so>Ok|jiT*6bZo~%6C^3Scj+#Iti=3p0WtZ*Rp5OXb7n@h zlO?_II}i;v#X_X|7`+Gf+&Qk#xy_7by5%Kh8Ignb}T@SvO~M;YQwLS&$ii7 z4O_b~!OccY^pXH!eNYqTuvPQ;S0AmI&qd{j$qnHQ&biF{@H6er{KbxY&d^dgh=*qm z4;y&xIM3a1usf)JqB0J71vb@8rI2d6$f_&?0H|fM4d#J=+TuL1A|F-oW-m+gS5wTY z$&R4Z?o@qtK;dKe(ebUJVN+I=U$?wQ2fPRI^k$?#Qo1%WT%L8lkSy2~C#$CFmFD9Y ziS^hQK7UW4U(0CnWBPTUMQY|pj&|EmDJy-S6-YB4z!Y#ygc@50yud9%*tA7EMvJRK zG!{8B2oJEc=T4Xv^wt&YrWto<@-MxE>i@QL5YqK9HWAD$>^Pi!G1|3v9`0mrbQ8YS z`su)Wrr;Nx$8)EDFCxfw{7;Ger?sd1pRGLr>FxO*mqDBU7415&WZNe#MznkK$Tp;7 zbV401x<{NcAxz9xdsM4bEKVan^W#Ljtx4g^&R@%TdQ8O509ObzJMVkz``Qv3PoDRK zXd9P0VOY7G&NN0D;%BrRrVl^R6pia2Tl-2qVi|LQ4|fHta0}`k9vO!RD1v{aQ!tqHwE;HX+l0~SU+^!6r0)h36| zcFwow+3!~A2%@W3d;;-4iFJ!Y1GTekKqj-h5Wm+C;)|boT47PsZPs$gCxI>xXqO8p z7fEB)v|smne@6hj_19o+`KKlRb4Wn`PT{vMf#5B57&bNVkc@*^p;PdX5I7Q*vuKY7 z`%%eHgc*u!G^ojrOm>H8g_UwozVo;OtD`V|A6e*it6#Y15;+Y|r8gD16xCk)B&+VdeAk335P z`h7@7!kW{?^~)os_m4&89_)*>-!7}zK`veYxjg1*AzIMIl5obyskTZ>8VMt)OYUuEDpnI>(*vQnhW zbxxh#^RAY`4A$&Q+AY&BwIfbRVgHC1J?1<3R!*`c2r3oYK{8!Nhgcwy7^ac)Ks};l z2x_A13CdQ0M2hIuaX6>}?;M!!Y0U7TGDSi~iT@liTSyYV65*&p>%VII50^MRSFtOvxRh-;FL- zi@WoD-L+(7B27Ao>BZr_HR*=*@=hAzUhq}I^tfW*h8z>8XY`v^8upg#Ya;F)D2e*l zy+DHQ=VPo@Yw`~QK@&hc8`in{JMBY%=`Ya5$RSGaZUK~Ik#EktFK3%K_0dN?$K7!G z{fGUPt)FH7kRQUB{R!W8XfaRB-OnFrk<5cFIBW35CRZ2N_~%NMiyX*CO{RM(U_xC$ z$8m;Krc5E-?Uy&6+#I84mdmW@uA_&ttyj`hAz!DQZ1cl#Be4mnfXNfspq6JO>buKvbaKl2PfG zF>|#vJN@0zP_z=@4nD^JFOoOn+i;(zBG4$Wk{%pPT4udF2OVK!EWp7ea|!_Q4%#Pn zD8Ma{FMfn6$Y6di0!iMIAj$jLACkB9deV20>lnnJ&XHL6Uc+|MA1qN0RqMT{OA};?TU?rM0BO6z%fI^Il+7LUOPWVR_YI2$Uxg5J3Q<_q{F=AOSl^SrT>8e138$yu^EdH8nX$eF-M=L zcnJ6kk*pJ*{Vj3T9cZ}N7yyGv9aG`e(i?wt(@Z=|+w%C_-|-L#SbAL8>orD4mFexg zJyPXq-IEbx;genSbK=OeBx=h9CZlY*}bl zZ_XP2ZGtZ$WeFwTCw67)u?pzpl|B4dG&Nm-hpFAWEVoqcEbiG2+ctgdem+Sx{5P1A@4!g>A z7ml4%)>z%Vwfeg$67o@>O9A~Q%`mYX4P^f-otdV!bt#5H^ zPU&ms0`0lj-}wiQLlFH1@LwI7eZfP75zx8Ck{9uZVaKMQ3b zFs9r3%)`)HqpuK(F8D^(1RBYtmuNs}?m($B$k&Qp*%^%?moOrZq##Axf}ohHm8&6C zOWvlg{`vXDQS>rl(nJyQ)auy7#2+YiJubj|ERA%Q_ap|gx*hLqeoP5{ME)VF7u42= zks52*S@=%syKC^Njm2(4K|1duUtDd2Sr)=7W4Ur8f?RwHgAj=}{6i zCw+L0d(x;x6muA>9QjG8V3QC2Yg)7TQeqKK{B#+Lml^#}7aeF;qtRba5-JM=h)!&( zd7bS`*|kqKNHuz-PuXtt#BHS(!IH9bT5Nhh-3`^paJ@@;&@#A z7=A~JYLBM*hU#p#By2$^W_XVtRaCi&Os|U0UKb(zp|OrLJew^14%6mx@XAuG_cy}Q zA(JhSXfR@P%^(|7BE zfh75DJu3qIX!sSf9K_D%B?8e1y(%?P*1~qLkQ5B*kY<6xwZXiR-olgnAM6V&gQN& zYB8c39B)=r%IPBBII*lp#gL3?pS@*h!#b^)_buD(Tt`X+Y=8PfK3AE698Be+F{57|k4tHQXzE^jSUNQuj9xVtn>v>w^We@o0$RlxEYtDx`D!25s_^J!I5 z;vm4QjaoL;KAQuGUTP`w$+($n2MX?5FYjk2akb5OtMbp3ii5(>wGE~2zh60J14sT}VE zjl_*r;nGZ>fKZkrI;MatJ>n6^oV=0E)jLril>-^sm%vBOd18Y~QxG`NxAn#o-;$4u z^qhW!#>S28xMXB95CQ&ndwbtgul{(hD%E13X)3OKF8Y2WcS(A?`MYKEyTIuLI|F}+ zQ>cqhGU#~Bso=zOt8;|b7I^mtrOfJ%)qZ&+?slPB2d;^n|KAD;B##OSI6wgvP1=7n z0HOxU9wk`70+fZtYL}9FrNzVHl!4{9)@@3I0iFG+!#@84dSaV54Bgb9SO!zpGhEiAN;W?@C~p`Lgi?Dd1~OE{T9IIj_+ zZZ6mZ2M@?(q-i}P{UcI?{&U7cZ|r-<+O4TO%P)NbZP|<~(ZR&g+zhqS&dqEfhK8(t zJI$vA*x{cepTN^9S{|Ysf|BypDYUVSE=3Qkv1W+`va}*Zx-MKWP zv7uKIUbag2*|HS+z1EQ|)hzO+rc>z(u~C#RY^ftsYM!0_={;j`z0x!>G3@s}d~u+f zV3nP^((U!tz4<-Xz<23eaYIj_t?h~BP7UQRh)xY%o>S)QZ$$4^2si!fzanlONM!v^ z96xyVmM+SXgnxP{vwR~cC#Q!&6ib)~tU3^K8f8Qc>3kjrme)GBfy zMxiR2;p=8r=7R}NQ}oE^gMzxT6rexR_N?F)h{x4q3OkxmmI$);1M#@7^b!tuobjnd zo?GPPDxjJX3cOhd(JR5WR2tb$9jF~?Zgpu4u+OD&s=v*A#Nz@WAonK(kjo){(1e(- zoDSk~yQo1tuE?=+8#jo@wS&51jsfM2uKt4Gsmk59@swD_D*R*aC`4NmC=I7Sh~OK( zC*rpUaV9E98D}Mnm&Uz6kW!z|hacnB+P|?`T4+;>2aN_rI#57IY>56F+bq!I0D$^$ znG>Lg><`P-+LgRTcpH`m{9sa4E3ux2aXXMaY@qx*f!C@67XnE3I=NZ0RU%Wtd41nEe!sHGH$Cm7xKzMxdlDgAi5e!-`#b zJi{e;1nU#t`Hh_D2}ghxklxjEKw{_jf}%wA9KU5!&6$rT8#K+_+}7#r3fCgFzeOFp zLM*#y{KAgnrXn)Wxz&b+<(Zm1za(^icw?zlAMK4Te!zfqsm56XQr4~_a@fQNsZ@m* z0ah=nL(x7Uf&cc5J#0_uJ9TD>*Xi1xu-iT14ODE@Ux-!U2Fnhf>~F~G3W!>QoU}iT zVi3>n;Z%+=s*c#n#lW)kz|3M$1&@ggS+T`3`3U&68n%duC3%+n1K zzvd58=1)%b@Y+=UZE5L*R=TS|Fe^&kj71U)x#J_2b>To#`{%YyZ~d+=4Txp^-jTtK z1Y%kBifQQex{D8y*n50? z0R1J!pSl@W$|b3%507dI8(WFC8nRFz)u}leX=Gm>EJ&Axzf$_m$#T$`$Z^6n5^Go} zP`dJrw8|jsTNo(cbXoV6sbk6*wE3DT(D+^Kp3eaeSq~uhf;oBag3~bkP>R$^*qkAJ z3rvvVfo$#h0BCrJtSMxOU8NWKC+4x?%{Gw)BU-=9MMT=VItI@X+TQWwIZCTbh9@F0 zhdjkIjuW+UmI3r9-##EYmwykh(BX zP%&)PRD#4IjQ(BkCh#@2a5%PAnefw=i?)=j`=r02d1x8tGa%inCk6~3w%ILfbTE93 zD)lfW6?qbvFNDTV?`1U_@=6a$dPsWgemY2_9kJ^r&* zF7Q;S7x*xN0xHfCx%%8Xvxphr^|`VbWAp5gx+=w-pKqy5NXWWtUB0$ixwk$-;~E7U z-fEF)L*NNoY9@=vqv9MWxd%%7^e%~qB64IN_Z3nh`vx|Oip_g_z{Dy^%dRqEHT+h& z^cq+4fx*g}c$O=$A|;focOfdbR`a7sWCc*YM=w&oy{KHxsT>>iOGyd-?XuVq%-H4L zl4*>X)eJ317yC{4lWB*bRw`8)nqK##H6a!Oy8MD)myMYu!O+LdjrDzudRUXz+1}(@Gf?Kc5H# zQd$BC@6U3sxHABZH)vBXf(YDEh_sSXPx@4TFd>nChGihH6S6w^1qUUGbUqbE+n!$4 zD^{YgBB+$q_v9;^vH@;h0`5-=nognRSd8y>1xu-JVUxM^!gfWImnFp;b!9_e)a6`k z33rbCp21CO5oa^b2qP_5tGwINd>E<=Y)sFu)Qks z4+bbJ%T5ExXqxHMA6)c+&>79iM1V)$aLGxzy<}t|_FC;>WBBu!if&Jh zML0|3CBgPQn{;cx7otqsr_j=KBVxj_6&yoi9|+&Os!!(=5r)r5+)PTdN3&n-7kt3X z*=oVT^3<-2<<~$x{QtN*=kGj&e_c0LV>Gs##*N+BW@9wA^~APq+qP||v2E+5-+j*B zd!2va{o!5Dnz`pQb6?lsIm-PXm1==!d;dW`N#D@nL^s{Zh~l5!r)y5;$ctCc>Owh|9KAXFzg?GAx&qeXQRQ#MHIZ>ARVJ# zSJt(eHwfu8(Iv-!afrdn;JbYANo4_sIu}S|G&CfYr_=T|BAPV{|)O*9-#jR>l6~jUH*i1w)3<82iE!j((Td7 zpEU`W)U`>2faSF^)t^RWWxy{D8VCRW|BAPX|Ke@8L?OEEXT3xTA>;#fiNaSmjILGr zvtDw0Xm}Ezr~Em`HU0TIBOy-vSvdTTv=G8A=o7#hpE1>qyO3&MmqP3pTx7C#x1D%w zOu>u(?+@tXNrTrWX@6n#Qx8y&LBlT)qIAlhJKDA{!MZjVCwz>1yTM11%2ugd>kW2#~#+lR$oLEaEQbe zaZHej^;Rh-nps6}O4-oWEu+H}p`SumF)Cb5IrIMwE5-i}D@RvofPAvL<(wZ3Zs%cA z{?_*EU4$~=1nMjA_0thwIE6Jok#U7VbRfU}6U{&(HhmLi3ej211GrSm@mW5z8Pg-` zHE3RaO(5U3b!iU+%9w6_gh=tQPo>vM04;&11KwEPV0gxv#(jem#kk6lRmEii22ToQ zK_Xl2j!o3Jt3eHoG!>Bso}$ zN=~K%iU`@>S6x2f^EfD_mq^#2P@OuxmK1Ic*mFi0eP_=V&kZRM3Yk7pE{Q@arEA^X ztPl8;Z~SCw4c7FNQXYQ#BQS~p^jtLcGL7FV+;Bdf+{5i3e6K;0gDRP2yooh-bTgY;(f66%m zD*SO*pyG2@hyhol_>@~+$C7#Pu)lSYbPTT1tv4+#sqsTQ#X|?}UQvLl1 zTC?MndMwlJKOA5yoyQDlt)Dg^OH3&tgdd!I?y#66&$gxLz!#PaP?FHV08lPp>Z zQ*VNn4NZD%Ywj~>MEWj~&kPgFr+i9Gcm#yNbRfLoUz2rM(vcc>i=XMLj`yTY*z?9v z)dY(%619obnZsr?s-3ASLRhcv$^VHb&DOwwHszU%29^ke==~6<@tgK%bxr(J6cq63 z(>TbP!q^A=EqzoAC6U@}zTR5mk%>iG=vw@;1^r&*#A<@oz-YbCcyRFmm|S1xiTA5U z*iQZwFc4LVVLV1l*>gy%3RpBoOZ?2b<^Df1R(<1GZ(9A+c3vH$Eye4%R3` zq801m4U$7S!{X84wI^uJWwa5*5f8Df%Uz&AC?0zK$(XDB&S=lSLveP3Qh&F*TUu=D zTC!)p7vz15#)qeX&+Q;`=5iYVJz9gkXuDq|=(pyD{+O8+Rc5V%cdN99%vOPR0;+ib zo*V=kN!GoX+?^HPjhx@+sLdIRas;yFd>y*1G~f|0 zxacL*?@WKY3P|r>zOaH^tUXLA!JKo+jqU>wQ{gLm7{1abM%z?1UNBJ?UFrA?Fg!8E zRSO4=UMP|(29{jq@{du-zjDs=wZWk42`)F5ce}7;gn|Dth!HJtp&YgzLJ}vFd@+LL z7s(k(1{Wk3sFM#fCx3Nz9oTVf9BBj1T^v2QgSux%MjUf0rKj_}mGp-r*5$_!pq>Q` ziJN{i23_{>_J9QGfBl|@)E?sXDq3jnRG4KoX4P3w9wv@u$_NUI1sxWtey|#~u)Nn2 zvllLs2^XbahF|@Ra^s76ixdYtZ!Ns1>UC{r$(=j~5M_v!K4m1aj}vs0on~L6WZOzJ zZfJ*VLn?t&l{H(J&zJaB@KK0cGS>jvU6Tn4Ul_(rS(rkax~&;O&izIx`m9{}n#4%s zze?t0B-~$v7pH+ZczzLTXQC1j5F1j>K?@sZllv_#*0NkQ2W~swjj=_U+a_vLQT!ry zlQp#ICsDgP0)v@^HP+!9BOUTr!}#9kyAITJnLpveL&%aejZ7qnLmWaARk1AK14U37 z#z1N7CXo?jZ$qEgA?yM_nzK%yfzCvVJTeSWQ;FVfrpwzaalX8{7dEsiZCZD~k`$|J zhLTnUAJoZv?LXWI-?Apw6V(H*q8GigU*c7=D`1MBZhmdMcIy`*9&LOOk&gW>9Fktf zIXOUkfTv9Bqs`*nIS8Xz8~+Blzk^)jd%CAJ1m|Iar{*y2+qLSvS;WhiPyW=0zTZ<@ zh+dzZ6n$xwpqXS*uWQ}V5lMM6Z&e#l@7Rpac4cd~h}R$n?ZHhq{bTE2Dx(EJ8pmgkJG%9G zR#+*^2l%@4UIni@GU6RH3AtLG3`7rlY_B0|u!hO4NIreZT@86o%JF!Fyu@##!cycL z`%=2THUchr%THab5n;3P=Fe0sI!b}xYgUGqIbolV$;I!pO>BoFvqw@4@SxE((JG?a zCA_0~_w+0tDA2wtyTk)wDcl~m?$@8^>&0^Ix}mFc;8R2Tr>W7hsj;C+d(FCYWgEX0 zMR(HgJNm-!TUW~=CH2oWZx8Zy1mmF|=iE%=FQGLU0=1>;{E#N=X2s76{XWf;ATTG! zvg%^oR$Uw@jZ@iX{=g9omm}ErxYA&{%J17P$i|@<=p;n6er$E$gcWvnOVBo&_Yv0&!Or`4k}xWF7Cbl!J6h3ch^19 zy%>N&t|xh!KNu#AJcQa>&~DA_`4^^bzb}Mt`&tVXsBh(X#iZpkjQj+>H8i$UtSCJs zJJ*yHqKTAV>i`H>40EmUGgs6i zI8Z1|;M@IJP9$){h%-rZ8Vv1^79uEvE=cNgRZ*{`#?I%8*?DKBkL~2Bte|$mF zLl{DeQ6Tnsit{oCSS)@FAP0e?^1b_q6qv3XcEUW(0MCx%>Qm3I$MD~Vk?cVJo={^$ zc3DU%Y5>{FY)bV1Ai}WOe6BF@0)AZSSuN=mK+Z#^HvSr}lh8Vr%2O7+y=f zKla;7km~J}F`^Co!$jEfCap7rnZ(15#O`Y1;i35P8?cs~V{+aAMmMS`Uqvoj`*%3j z9z^=FgD|`>rS_lSk_)awAfC<`);UVS+S)|408elC(Uz8@X0S%!1QBqg)BK~oP_m8) z^>A-A=Op~LzTS6>EWt*o_0Yj|d?Ch}#ejeq;IOIXMEgL9PUsfKMl;e9oDDVlfwx(j zz7>Qvunk>5IrRuuIf;NAD`uC++?y_*f3*_24o2;&^#1DUrEj*o|J5#PSr>=A#&n?{ zz}Cbn;wNz_FRd{v|5>14r~YXkt!7usn=9kfuItQK)cp4y{MS7!V^h@+yfEh@RaG_o z0ZRSbd|Lj5N>m0llxO4F@Ye@%N1ilht#swcnf8OfZj;T=uR=c*(a`zWr@gAGQ{*^n zBVorLJ<^1I6m`(Dy^Iu8_AGg#0SR&5ue_R5L|=Ke3>M)Wr0PJ@rEqs34w*yJT-dqJ z(Ca@R`KV+`P3C3Rcrjo9!18@XFGeaw3xxIiNqI7g^%fe%D=q;yC*VENLqF3y3M#(c zB&1J@doY>NOWC@9J*X}FJXl8hmrJCBA|={q`W#xXU8}kFQd6QZ46&_U1AuBydl{R7 zF-=A@X33RzcEGEzAJSW|LtUJfD%?t2hG05K+#1fU=g`9Q|EbgY^G#oy)=AU3mFN!t zL;ZSMR8$jr;=Mt6JjoRDsDj5 zv#%VbryA}DL6jF%+*_2LFi@F*rdWiJXiDM>5pD`C?iYoz=Y^exw|rb5o6M*iDN_h< z@7c^d^Z}x>izw+cY%|!_h_jgvQz(IbX||HG?Yv$!G`eU^W6zNc+g6dk#m;pQR=&@BJcq}CX0&0Dn!yVZ znc@}fLXg2y|A2AsL(#~(bL-n6fW*fojKgRM7fP8%NVFE@z>(W=VOq&=WfKR$g7ct%2WzoZT(jUt(ecntP3bo zP~zbe#_e#WG17lAZzQYBKHbkW**AdB75bX!zkcx@GwO^onN=~lUf8ieKg`WI?FWX$D_RD{;1X-GERS$ulZ!xpL0P>fg)z%+YrU|5Gl=cl4+3k--Og0LoC% zfU`(W-imXr9L_M8N4fF|Y=V}{^w{|K=$!VibF!6pJk!~EBqJdatyaUam2@5NopRr1 zq1J0YZQl5YNSsoH;a$aBBgixQ(|wZfu1*Cm+8cJFe|leH?{MaoEv!=Mk=`dNFH6ip zsLC7aW65hA#WxnjEmZ1{3XzBg0o>r9^g}GBEmR*KEKz)*=0t0Wdtk5~H|<KeGwb!1#nD1=xHcqA&g_yc6;l z@lr8#U4@kTCV-PvPheX(_PCNdG*4>rS5)ng8IoRcibag*<3KK{mV!7r2-%Pf=JX}u zqSVeNOteX0jY&XMyy>6KBS2eZqG*YCn%J-$d^=~sJfLt{3~pJcw9EZuWWU{Xm1dg= z;ZSDkt=@iC+hvmwb%Id@fVERnx!K&z`jrfRUg}*Ycq)QRpG;Jn=Uc_sU#c`iyQj)L zVf;#m^5YeKm{z?IZ<~NVsmNAe=`P@yMx(`JXz9k1B=Q-pNsVP;73f(A0ZTJ~w0OCH zdAi%X>-Xhk^T6f#IuXDbr*_~bhK2B+YCu^nWMT&eJ;|InpQK@9!I}Di1=TsHN^|HENN=TZ zUQwMA``qMbQQ?d04^*XgC|(xwFmA{a@y&D7^;5R8Hn6yeO*r3%VRDfikf+GoGEg9$ zEHL09e}7KwSoYAPkF1sIQQV}wj(#`gceCo(YD}!3eh;=~QY%NwQD z*W9TRg`T2OFjmWG=%nLAXsyW|=no$I;rZ*mn^_j-v&*nb?t-i0Ou{{tXKEh8O(WgV zyRUn7bZNpi@)aaxKFdcP4=Q0Wfn?LZKEb-0VnI;SetjeoEcu)Qv6hWTzvOy>#xq)2 zVZ-qD`ZuEvV6d)Hzh2HSZU}rHI=DK8Nn`1oKY8nEq2LT`c+S`Cq!!b?g;>|orTI;x zAxO3+{QaBo6a@>}1JpsGU=FgrhhQbutm1yYpamZO60K=k5IP=$lnb@2b!{FePt5Sas zW;2Ra-H5Czuugm+^8fEfIE$;a96O14n^}pCvie|S>lVgN|Zmkp9Gr4sm(Dx z7J1d)EKZD>>zYb~CAO~=swED5l{ydt#aGk*T;o}VZd$;8W`Ghhh1<}f<~(L&T*qIg zn$Lw}#H?n5^~&u2I)!4Sa4$_LMTK~nonTm%G0tkSb!B;T$Ly48zua^G$p3DKWhSFP zoR^An6N$S1=6C%NFkamr4h}He$p_l&TIg4woh1|fK={^EwL_);t|S;5|6x6%^P|L# z_Y|{Y7pS4j|GdrnuLtT&U@#UwP!OoUAV{G0biT@2#WAm*eF;BvtR+BZesyxvfUW1F ztRDR2-?e)%9le2R+xih_!619#6$?r#Wi8)L;^mSA{^4hNcaNk8HH})s(Vumq_}?OOSdUP)*$nMO7V46FrWBq9+r~L z0O;565HvAMR;Dv_Zra;2e7w-9k)e_xN=RD?;WMS*@}m=+y$Wl=f+%alWWPIOB<};F z9Flq=2O8|S;LQ4fkwZ#}yRW%iQ8RlhyF|^|Bu)uSM5;R;pe#frm{^ z8(rb~3tElndYAK6yq!;L-H_6I%pA@u2#Z$qRy*BQW93Ky=CUnRBReu_yi!{cW)Y!h z62XveYdN;KCzBF09cGuX>S=z+f-=hq?w6S#y=z(8|F+c6Q1_nk8R|r({wvhct6w#s z7ej!n<-^E+hPoUw$KAvV^J5@0mN_obh;$3}9c^#IY0}Pf;-Hdsi<u>=rey9<7&*#>kE4rbDmn zc9R=-q6+pc#w$|OP;>F*Z^})Mvu3{h#!K7W5T`o_laR+qL&DIRfhYL@V6McuR(oq-L{D6N*i>3gaG;S^hbKu3^N3L}8{L)WrJ9Gll|PA?>J^ z(<34@NawB>uqI*D?C2aCDLn$e%B&KEVG$}h`e=i0T`K_2lA7wuXz{b~vW zV5e@tCXsm5K2=~mGIwVVjG^-1aVG$Be{I-?ALWmYH};~jEok^xq*^s9@o7Sq9jXL= z62^4phjO%jBGYk}S%H*F-#gXu*ly0`^nlm#v3_W$x4R;|6KOvtWd>TYDfQ9H>{6 z`#fYLc|KIKi3eC%6ExVkR9VHCW$xlsuOnZ z{;>AoQ5czNK+8?{OC8A{$@r5ZQoJlWx6`P5Y9pVM;76S2q|{ub+^8pY)VdXj!_l|( zl4_7LN+pM_WUEn4{0rR;(8|}Aj&w6T3tiVGk~_-aeM7<0ib{E9$q(k1@LsU4gl3}J zTp^rfCiOrj*ET~4*7b1%xT_)+dkB9fb$3l;5)i0+VGq!!W(uAb;w@HHI0ut|Qxl28 z{Jx#T_^25y{vNCN16Ej9&E{A~AVt2rd>8#^{k8i%A^gdy5%j}XKyu>tuFv1Ret~|q z)=(^gUD(&V;UZT3d`kI9>Qwr9ItWfF#^;T{aJjjsJ-0bm>n30``PX%|a%nB$5ws!bdXzk{t`d4>?;UlPg*^;#)u!`j?^4$1k;oL5#aQ$dH#clQ zU5T5sEs5-6G%NZJo$<++JLnA7{N78ERK>_Q*o}-cTx~Aj{G4?!Bw=oU?i9<#qJ%wp z{XG5?#vq-2PM12w9T-wUsv0o~#qVF$ErX?1C^>5EFugA*0Tbtn()2_f{B&^pCJM6? zZjk)A|9lOD8+TNeWVwuWh#DN2<175CA_ODQ*;WozA?^`E7Gj46DdxMaGBs&GoARAk zxu2y!Ue?|afhW`NqpIFD7zp06PU6o{o%N#M2x_oqbNFinh`D|@j+baojth@O&VCAY zLuO_EJmmm2a9jV3kxH6bsSFD@bh30ek{P#<$%8Q6Z$y}OFfPPk@j530chkX?^dZ5L1Qu28x6AVfM^qeS9qv-@I^j$sdOMF&#(pEZE$pKY_rf|2UFN zG4%-k6t4E&r9RqtCytBaB<`M!w_|0=KzI?0n`4Uq5`1BxciN4EgXbuar~P+sq}CM; z=O(ZYZy_46u@*>{ANXMjYO|HLbRKDJENp@cs|K<`ketsa6vhnG(4^pdhBo}*s~G}x{)QV+5#I=o><@?WEa)P_&)J4mjDlbHSR{e zCIV;49=-r$oX>-G6t}oqr0|2Z+X=EF*$#OOAM#iSeL6}7vnF@i&6z!}B|iHj`L&HF zS87DmH)U?M*`JBzd)6Pxm%CiIwfM!NGsde94mL-bne6E-3pho0IPWn!sUJ^ixsPAU z73D%_`93Eim6#FYsE6ov6o9Dy_jRg_tU>SRxwxt|$rQdC97opQGM}0{r`S3Mi=X-X zM5LUxOdIYu<82-)r2adCqD;g{zl#OMm5MUp;%XB!F6d)&X`qFmFGk&!Dy*IYW>jKX zS?zsd7g@XY<+)IZPH@%d=mF>+vNJyZM0WJ=0(=9;>9Wll-~E|An> zdv|}6?CX@-S95hsM}WUq&Rn86(uS-?V-P4QUaQw2#JV3R^=%rIrt26I@cB-F>AX~7 zSZLa(7=&5eWbgh}v*PSrB8wWL6y>8_2SrF&^qlYb0mNnhQlLz|#Nm>Aj5*-=t9&VX z2-kVE0maMaMA7>M^d|T$C$f5lMFob0S90G6*mi0B4G1ji1K?`8F5Fi(#`u9b=87rp zd)lWIyeZRl3FAZOo<0+a6XJiAi}UFL@(x+sLJUaFNuemH_Nf>#mv3?&Ra}bTg}XeL=oaU6;I+)g?;Um#wg+^U-{7n% zTm0K4-_NzP`LkIJ3_Y;E{!tS{O@v%wt~=71>o2;_N4~*{`D>5!bP;>{NY)TbzTAR% z!zxiY%RRZq-7;A?%{;^WEhrF+Fda@f*t#zg+WBA#Fg63Z_ZCU|VoR&{!QjaOrwz@{ z@op~=vGuqU%$*`kGR8*#LQ{|dS5|Jqurc6{a{_lstmEGMt9Q!(hvb>YR%iox@g{CK zR>5|}uf_i8E}sC99M4^EMDNX^b!MHj#DHCq9xpiNcb1y8R^1H_g0JN~$61JH$CeMa zQ|(OPQC0e#9cye)P{FL5IGIUzDWU=9_;o_p=XcNx!_XUUZk(=(x8F;f`=x?`}J)9o!80uW#QV z#5s01r6lc=+a1T1+2aOS_99?yZ2Y~YV}qib0hbvJC8HGnA$OP;im!$^1_)-Xg-CPr zt=ja~hMHuzCs<@h+&9A142!ewiov<4d34c>CIyp}>1qcMuX;EJXj<73AiFr{&ONksf&GBPX|OY#G{?#Nb&yw9TESzS43|B z5b9y%DW4qPT{&TrnLUS$#Mx;5coqV<&zf77xXEZEOtdr~pbo%J2C&xBH4$6~A{dO| zAMbV7e@B+Dt71%4M9=)8*(B&=e_X-S;1o>$p5$q59o6uxeM0L{ktgA=g{3sA(qho( zJ<-sz2L&$Qu>{@@3bYn%MY-$ezr zJsc5m|H*_T|YMWdPe$fLyI#MjsQZP4AQn%Zrc?>@idmOWFJoQ`C z?u_+J%|d2}4e5Pdn<121G!HBo@Q;!Shr6QdB@N9^! zbD>z1Uo%w#`0A3c#<((ExMp9U#xtM82Qcv>t-&Qk&pB)G@nk)l66n1kPKAblIcN$SVC?tUe zgJ`jqLa=*|Bnp!&WCi$@{>c>w9n?LOQilkn5?2Ro(hbNUXRZ3M@ z!NwKY>+CM?-B(i%E5bIhgv+~_2(u%aMx}~X=ml-uVjosH#lxCq8>U-@`s~__nx7Hl z<>-bkul&2x3pP$IH8Q)KqBTC2fQs%z3TQXZ`}jT}DGXzYJTVO5Fcj-dpm%Ap#gO@Ypcpr3s^ADTfr38~kJ@9nq5oovi9i_Zmtm&uqC}|e>q6ikd z0IeCJ+dM_t*U*4RluQ}1EbkTFEX$xIC}A|T=T{M#Vu)s0c2khyZW4cFfiRgVw+=<} zV`)ClY8g^h>O&1+P9cu-z2^}exe&IV9?9ml?vL_=!ZtzoZT(wAilevZj+G)#M;SxR z5G7^$*&Y0YyRbKRH-PKFh=6vazn)!S!%SRx5_QK% zVW(9mZStGWrPc>De9ecN-vc#uu8b|{kv;+9+nJ&fWkMtX?+M#wQU#AKD%4dS*ions zvlet41uZ;0q~U+FIIXWv6w!~=XCftxS6Zm(uVmW zNv=xV-(tn`1v;wjnylKjO%4zY?auz6sdfyOoTKTlT^(t*_n>InI@Y}znuRyVS(R2_ zPjr;x9PQ_UBDns1yX|IuSpW=NNxUUC5RA>oo7nk{sDibXc>bHe%=N~8C(JTiELy&z z!pO5jvk~6*VkxoJv0$S^&YdhoHOb0&&^<-Py`%)1%64RI7qzZ=Qn9X&+{F(|E*N+U zScP|}k-9YEN7J!FlpZk!yl+iwX?8{u4xuC4n{ zi?0>p#YH!7UfP~p4Nik)^~nxz!i?vTW0NnDQcg#IXA2pnkMBmX?PG7wua4~SUV@9K zaEqD&t_7P?A0m-3mxN_{Bhe&l7GDDrX)Nb39ug?zN1mOMWiHr4f32cuSAs+yRZTh3 zf!1W*6Q*Bs-Lo~?Gv7DcBBGciYjM9!ZpO%o&Dl`@$R32(7cf9>l_1Qh)4b+xt9CEW$5gPNW&IlIPC>Zs&^(^H|ri?&G?qw zN!^|_I2vDC@FNXM4qGdb|2H^v=d+0ywkND!r+Q&G+uhDwfEtAu{US*6bQ`SSCXoV2 zE_&0k7qYttbtA0(&#acwR?etE=-Li-KPLP32qTlGu&9Ia1mvY{*Mx>wwtE6u{pKDk z6#Fn*+EoLjdW_dk|3k0A#~K&V1lj!MK0Y%*Ws6vnpr}dXj07ve4EeH}qL%Foqvri@ z20`T!mMy)t zOtUt_4pvJ){$^rxS8~z|3orf@NyM|Klt#$8S`3}rq$afeY|{~^;LS+_O-Ea)UMZ?K z@_ZnnZd#byIT4!F1a!}vA@YRg+aOZPp3}tbk&wCF8 zPW7hY*Lb>ys2fR{A`-8FuE_mRLg8?}HcsJb*Xk%dY3FeDM|KV#9$ExrI9b0xSQ?iW z5=tD;9@TexvF%|k;O75YNY41p!>8P*uUj~3ew~1%Bc%N%#CEa%T#dNJ$90{X znl(=d2}h}0ZEu`+tzV$Nj@FDx2hQr*9wt|ctfxQ(j>~WD<4LBtIojSH12Sp(`8!|` zznKLfxg3RvOxIiHSA zjZ4H9`f7q7s@)RxaliDN6#NvA*Jk{N`&EgWLD=9imYHGYbzy~ceV`KCuCYfVR9Nj^ z%8<%sti}8`z_WS6fm5!w1}@Ukk=$IW(o`1LqbE!29Ack~V_`UCR50q0^u=1*h!e(8cewoKu)(=(kVtJYoB#}G0zv_Vwe{MaDRF5$FP z2fwXz)}<)OyBN^pUA)8|WxT^&8*XU0tGQ)n~i78{-!{MKE zS;;{O2q6yHib5eDKF-Hzk!;6*I2nC=V{CKO=muzt#gvhLLkij0BlSzz+Yl9+GQzoQ zG$|ei$flK#wR1y+qbKmdqejZ6JgLjdEx)H%v$9O;`nU8V-C{ld_usL{goyJyJ)o%*w8^ko>e@_b82iX|8 zz6DzV*Y7_W%uB73+X)!SlS#WeZN5!SGc#KB*7GFc(3FG_qOZV`!>pH&Mf6L2Gsr>E zdsfc>@>;1U;SFR?^EB(=H@S}Ty$rgey*f3$y>~x#RZrd&%q)wHDJW34g()OjDT| zmZ42o8XR~U1~mHh`%>oWGIjC>mYdnJaik|t5G~vur%zo9GwGGqt^I(oX}6&|Sg(nx zc`&D{k$Lh`aZldI(4T5@NVZcw>KJxFnl-}uF^m2461n95v{`_13~I1Bqeu!m?)BfS zSdu*N)*y*LeQz|gJ!pLD6k8K=yQsxz&U>-DLbUITW0v6JriQF@IZQJex^WF~sw126 z5s;4g#NSHT?I>y!DbnI|ds?Pqf(^wsY%0`;{X_+-5-qCnC%qx+&!lrT4XJ#AM-Cn+ z7+Xe?G07~n&UyM@*)v&noXT~y;E=F_)MD@K{<#IJiTq({`xr{3m(MX>SSaKchVfLf zGQ|sV6c5Rem>u`|j2`f@>$VHyeM9bSICfV77IaVC^Mj#A@dsq_ZN&Gep9#C&#IYfP zslq;ag?JC~2`)Z;;Q>b;FP$9-XeI2Rdhve_jaNRmAC*)~^=Z1#Qnc%lYb-6}EVkkE z%cT*S#+B0a9^04wQ}Yoh1Zge`N1Ypu=KNSvqB6O6V#3>qhODX42`({uCMRF??0!Zr zinruG1YUj+UP(jURsVwEDvgK=JJ|aQA0_7+A<b|MiK;LAqBQ zLBlkLFpa~CpWhKO9o4!#BzX-agh8xFFWww zozI`=HgN5U!8St~EuCE&v$Shlvm6p@EkR!+;t2jPQ!Dvi{=D@Gh2!Sr&9=R+l%=uT z>~{^MXmXy9lCR_W)joJeFH0&yMnz5)qik)}%U2;2(}rFy)J?+xf#MB0mFxF=MwzTe zMT`K9I;pT?%z}j)$aooa94nRucz<`#n6KJ$u@X^je;b8p0-+!})i|nkt9!3WJl;EoSF~ zJ@Ca)75ig=e3l$wZduCS$kRu;Xs9%dwmzWSkEV4*R!PZ7ST65Fua(E5X+i`o+Dy-btyt7Y!Xm2|e^Pb#l|DPR zyVQ~*U$2yeJ&gE8aDyh8ofx-YX}kHmR=hrK0G8bRclfy z3FzY{A=Od);(d4@v~C%g$8vD8cTKM{`~N;WO<6U{$Wu&iNwW-A-=Jy^UKenT}h=y9ER)2EfojlWh3 z{w{XDhC7_&;p5`sX1BKs7yT|{!_7=vA%Em|JDhTE16NCmO=nlWu=Yo+Tkmjax9eqN z;!*pPq5sZu1h45{EA4l`7(ha0znI^$6o!u2%n0hdz%6FL(C?D3@ z8?|tB;N)^qf;NN0jr%md?#;p8LIM?#9?ig3?2?67&Isd1W+KoMzs#o_{Rz|duCX&N zgtyl?FsC0o88}E=wn*E|EWO2^_jk9ziakK8VnSpAs`uye-IPCs?)@R2V2(M>LBwBG z>BWp&$t&yz>3iMUC+{sh@7{Xh0_XH!%e@cEi&gyd{;M1LZdC{@aF-zZfgZNNNfN=4 z(<~B6ts2lssg2=Je^yQPdj_s>kbvKKn5W^q%2SBbci8GV4BL5#ZflXb1#HX4ah0jH zfnj7SsBs|awTXnfllI=e86!z?t=m|1IVEg7%#6lK{MOCQc|;Jd)EAVas#IZ$p_6fP zLX%~D%I3!(0h@M$mbk_DzM~dkVQPy|Khb0;Jq*_p>2&o*Cc#7jVhO_+=htoK4c%V{ zcwvXhQykP(k2Zwur|=LRW=6J$hVU2K)YR$&zTe+Clx~m2)t#`-bx`K|>6w44q6pA3^RjG+vCee8Td*H9j-zU0p zH4T|nQMAvSnIvLkT#KTSnRsQfU;V;D<$_=mo4V*C(L0hsO8Rbp2GATwfsN)zMpn)V z2oslVyva27#0&R>w5^>&gZMgixWhnvpRR6j2%hBV1Mux`vBHgzHmD%f$v~ZZGLNLf z2cS=;Z?FRj8&Z=I%%`=rV+GqG`iGRm19r+`NYxbRol`xSJH=lYGvepB6zX%J97l6Ga4K$#0b-{cxrb@0U}9%^3IV zxWql^n4=qAm-)BNWvz^`DHaNvsf_!dP?&yp?hV@?n`L`~z@>=qNx#-Nin&;Wqq;yX zw0>~<3EmzNOy{I`NV`Kf^WZWP8=ng z&@pI2EK|&W;?h;yA^_mYxcyouTg&8ZdSzCm>H*XDuR4K?XG-5G6w5&9(95a^XRl49ypbZGM*JXJOR0#Q&q z9=v>TrgU;=%y8MBV~#OFY0@BlR8OO5bT^Yq*i}#F*t86q-68%dEN31Gz!qfWw)R(14h9vZzyDyQ8_$>`+gVhK*7BF zro^R~Cjkn{SFX1azftL`zUAfgwi;;>nC7U4jE~$C2JoL%?30hid1@Km zhGU2;>pglME`*e)Ub7oG^J|&-FTRu?o)t{2U;^bmDNeWV_R>m}l!5P@e$lZeam1aU^B7F-SLFJ**X1?`_EQUNt6@!4HQGp&2O%XG7 zQ(@}FWIp=x2}=zb1$Kd5ICQV9&1sS;wT&Fd(&$)uRN&?=#4H8<%bTV?u$W@Kyz`}J{>MJNWHUGi z#XPD#89w_H^>jHNO#I_{IiHUVBa#~@CA%m{aBHlbG&)A*ps-RQT?8ud^pIl)4kUKR zPLw}uC)F5f=3kURYR78c3Dy@|D5baAq@#mNWm_GY8BXEs(e~&k8JwefA|0!}?%5&* z;cgDHczn+*e3S|ySa-5BalKGPlQIMfuIM%eIiePk_o~61YMN%X^ZWj~(UpIE@gI}= z=M&-EdP~zwIFtXhB@)}u$KQSdykn#bKEc)ko_xp`72MudZ&wu$RghoC4U`PZGs?^M>B0KVX;^&7K`1*0{H$- za-TeTvIeWrPl4CZ@-$fG%lsh$+0m=L*H0pU3$nyt0dM)^ZhO1CdmDdTt-kp3yRTMX zf-k@RYH@j=T>5DS($`O(?6PvO#W;V;K^pnt;w0E?Mj_a~u37Ig4Wit?4Z#F_7({V2 z4E-#d#A{F&(L8{6l|`fk~W;h+Z|o1P68;tvbMR0@`DVv)n+;K@&U%a%$tb zLgRHA?y|NW!-&p?gXpdsvIc4DKXilY;`Vnqb-Tg! zHjcw?FkM9%XiwBAP2+U7OQ2H9S_{?~YCs?AwRj`Z^#w%rvaWK1d;))dq$sB^8>u;} zG0%6Qi0i8+v$;Ta61?vY*?GL~4wP3cibU^vBK*J45>ew0H9k$)xzYCR4-qT^npr#dM2s3~jqS zSanNc_ef{Rb<6I9q%(hv)Sw(hk~aIVRx^j<{54MH#i&IOfhHLA=4N6mOYitqjt#5N~#l_$~5f)rK zaJL4EpGh#?Xd$;CLgv#Mcn?CYEYg2k$14(w7)5Iw3DzK1esqgKzD)gS z-QRo7aje0{--Y=FZ>N{t$7zluNVA71_doWKd@VM9n1P$uYU`Z9g4P!*R#NGc!j+=i zDab%R%b~N>w{%gEU>+40$|LmivqkhwC$A7R2odeVu!I&!$(T3Rhq?+10s6BNWdzht z9vTEVzRQ0UB+xhP_q^UdLtjD{X{QQ*UKD|QnS#%uRG?paB`w9f+}P9tDjF!^eM6JS zu*p5GO%dY2LX?9o8WNdB%G62t?h2baS-#D)J@3%V@a!;iPLw^3K!_AF2v9V+9G?7h-={_UVk;+pF3yr1|?bRtcg?n=ycP zth7gc(ni%ToCYDNHax+`>px{M{AYo-XWyeO+C?PI`cJ%jXmd$`filKNwGb6;L{Yos z$Lp6jaMrPqZq?-(4KZAv!yp1b&d<+O+A&oNNWmQv_7JX_{ocR+`}@TL)49lAz`u?c zi|BvNzu*+;p=prpnR+LXxmd+J-V^Ttno@rg-IVO-jMha;ra`i2q?yT7Qlfy=Sx4ms z30h{+e^!G8Q4QBq!0FkKFM#<;iv)6DQ z?z4X|=GTpI?c-HLL%{?L{#qttL=%gWweQ`=amb8iCO1y~L}9hLBCcG0<5Yn5Xa>zA zWT^G(i{|rHyxl_F*ytkSbO-Vw{ZVYOpp?}xiX0^d8VG{5P-x2nFGr%wUi;Y+CnkT| z&=k-N7cQ%Abq;M|BDvHYX}?Sm#}V{dE|OxpVSlcwGl*=*O^*KB z_ZWgW0jZzIDVZ_VF{LPsF>x6T$QSAh`5SQlL0aQg;OD{nAb;5Nj)WzaCwW|xPTlAe zl>%Qv=)TYuM;pk)-9y7DcT*Txf~avDhT z7H}z9;xC$tM2azhPGI2!8u_`WFISj?0=8s4pxtd+z!V(EIw!op{xbZCZ7zScHZ;gg z9P^%X;DTZLqD1AS*YD{I3jC$F*L!VQnDkY`v>Z8Bi)|7@IK^;b6Xq`50c=v(M>)YJ zHI61VGl^w8)@V+UHm+|J>jwAC1JHCWsbpQEOL(~mD0eU;_8HDnrXmB!p8+Tj&!}k- zdwsw%OKsv2pjyXeo)el*NMMX&Qp<=f@VX3Hv8Qc}*-tvLHH}G(#VYFtWHuo$`Yj0n z)^unHu)d&`-ZT%c#8FH~O>!^Q1Zjc<(FWQo$ zp~IR*axSS0$wpwmK!ycz3JMf+@DZ}YW$SazBVf}=C<&6G@EERgi9&Med&ndyRJQN2 zEdglU&a_{M+g`33;Hu__!T*4Xw9R4&esa(=Vavq{cuKcloIulJE5->X?x(n^Q#N0m zz$4RkjkCtNx^-iKb_RcugQyez~|`&zo{pZZ~V>#yF`vi;Str)+-w*-L-0C0eYa^M?dV;-`v6 zWlb-H8qSigg7{cmvLvFf4!9+_U#DmCcws5Q^on-HAcrK~?%)LNvGSftY_Vm_Al$U^ zk#rDK!K*6v)hO(d3|$Z-$4dP)zl_PQD+R#)oS_2DSy(D5BM_}k6GhI+OhxH~-D zr12L1Iw`yY#X1zl^buMtq{bTHY!j^I`$T9+o|-j6<=G=jj(HXlhi0(;eFyb5iO!q$ zm@Uf*+0XZpvU`iHI>4n`T1cU4k#q*pHKK?k^JW}vV%~o~OE_V{3-8SvAQGP_=6 zIW7pXd0S*s?`{!q@Fq}y58J&N|4EZ$TE_eGrwIPZAcr$vgDVGDExJ2PtJRhwJds&# z<|HDg=BY$ZGrS@Omjg<+P+8BJ-lsL&?nST$7D2Z3saeG^Ln4Kr#YU}8EsAkYZRQ%O zyf4wuOg4XQ>g*Fi-8<;R~2WS~_^|zylsNq+dSwdI!hYq!GAm=j~G|+^S`fT_fCjz*YP_0=G8-&ogsV zW=5;q{|R%lGR|j9U8*;AMUSY$skqc>;AC1*)scUMCR|juBf-Z!^-=n5kC!uNb3F~!2#k_VUfn+xR02w;FX^-*5f)p1PjtKNQ8B`~3ce6& z$2+n*4|elU@M7?u0i~IHCHqD0h%)?zRMuV^knVfl>E zfzw%ZhnA&3kSG+YHpd=rk-@4vx>_1BbU!v+IwEOr?BE!c{u1Q(Q?hkPcaQ}l>AtxT z-`V=fPh=65$tqh;>2ahPPKKrAsE1dOt|@j?v?<6?gboq!9Z5~#MW1fl2=K(%It|h+ z{|SKPBBg!Q6Q`f!wE-;xV9f%TN+$C2H3rFj~YQNf(X zb{WvYF*0oxmO|Y#&cRlOi@*m%z;s{&jl;FUap%n+)r$19O8^fK=f7Q!mOqU~mpJXC zBYe}*<=J33GFnD1onSe8P{b$-&InOm&e;<0-H3(Nc15{=>~25$nB!PhVKi4Evw-!a zerURgZV#HGC~=>vcH}wqJhy6yh!RyXM1(NNF(R>k)fkaPN1=xV+|q9%Br*p~bTzcq zooiFMu`W_)wAL$|g$6=Q-4rwDe1Y+<C3E>O)Or%sdY2IpEjj;1Jv&P;DfxLhi*v8Ta4 zPBmiYL#e}6&&^Oqrrg;#Q-w7(K9}DY3{ore1dD=OugI?8UtQzNT9hqG7c^!LM=nlE zxyjObsnMWgEh7XIqi@LYJXsUUB8^H-Tvb2jmDgQ=;&QSJ=UrwL^WhyVYA{3sSGWsN zsq4;p;l%I2S;Mrk`(gHaQg$_u0hP&7rKD`NyY^)4a{fM|7Bc7`LHjmUM-}{L-it0> zhQY~+E$@Nv0u++hk#%Ws%2B!~TK0+^vy7j05PfICQ&2RYJ)AB1_G*T^0%djbOL}8- zhpa?@@!3btv(Qep--gyqcjNw+VxA|ajUf!zX=uBe?OI(8H&nlkjN^i`|09abv0Qw5 zWTi44onQQH3>y#!`9B_RT@SZwXRQdLlr7yxHkG(=)t3M)XD_QC(<*Zg>MzB(9mC>l zQU0#U_jfsQO?)t2dJ^u{ns$QN$Gq}b`Hv~8MF)%7A8H4>o)u!#>SN0*u@%WOhcV(bfK2)w5 z2sej^%KJx$72xngNQV}|Ft5;;s8d;g-^_@)is+oY|d2j0N!F0t^6bdYjVF41jrwe(~rV4dMmNc zA){~88~RZcGsi|eF6_9*M?St{zh;;l{xnVPGjwesPg=umuGKs>dhI7ocG6Rw$Q_Eb zvfOt8m-Z+_Me7H3toV2Hh3p^tG+U?*qH~bn$Lmf|O`vm!rfG*L(G?*l3kdJC2DgA59-d#Ej8Dg->GJaG?b&#UYUob8}?g zei&-snvY62NVeIbkitrR+yc3@zRd5nCD=QURMKcYq0Hf?3ITe@Lo?=U|4g2!?$cHG z91WHAD<8>5viI^eI^_X{_UmuZUoT!5t{BFT2f%+|4fF1q?0P~-oSPG1vH1Ay1}$`p z6*?BO^uuVkMOO}gr<%`Sfo+pmzF5)DIQf`aZPv-v>t8NN2`swMf9|7;1dP|Y`VBAR zx$PzigoRmrqCsw}-03FsOvi#15}}cO6_{QA9+Q6QrG2E?HBq(4m{mkmqn_^p#?eZA z9|P*ANq5|}$E(SV-6(VAczOEnwdj+op{BPWY}o4QYGilKp0v1!_h;w(K{ zJLopWM`RZFva9z1%AHXtgl(0&oz#5(f07zQq@~UX*a%W~o@%Rc8#({bSp7Q?q-=Ld zR3v_y>!ZYfw%%^U6Ysb5-Pf${+Fd*t%bx;n_~I;oB)cI3{xEh^3W~?88zK-MA#X~8 z@bGx!N8^Pjy&K|CpPz1nMtpL*DV{CVhal|)$wfN)W9PRNwI5R8=WPk1NID^?0~C`u z?*PjfrR$-WqgxZx5vCb_iSRy1+M&_jqHl+XKi1uU4$nnfG;tgPKWg7Cf~PGx$`kNi zy|Uib!|ENqrEYvFgs;FTFv-4I-t^-)IWs^MAEFntxx6KE6`I3cGP?JW=HM=BU>yu_ z#YWsCRi|LnqIR1lxxmnTN#-aTnl=T3rlw7SpoLMud(qH5DiE~Pp(>t+%0@-gbb1$f z+8IlKGMeVb5|{XfhPWUrk`gv*E3OfcwqoB(wG{&-+R7QjLZKaN{K=uK68Z#Y15XBv z1GGGvX?wB)Hm!bz)OcfMg=;rgR6{>Q?C!cP zMk8IrzLn}421s;GU0qUPFGYMC%)Xn#@AIv(pMnx=leckxFI#ns`SO<^$Mezbaxff8 z)|^x#26iwedXu{ilLpT&cfYRO0-64B4#pq!dM6iGZ_h@{!E}1@i&k@po{X1?>mBxg zG%)O%W(wSq1gG*F10yM0O7U=XL*^FO=WK?&}C16*he0Hhp9XuO1d931g42ho~D zKxNq<{W>2_PS8#PsW5`H9UNykmg+)`;Gnh!+Sn8w#ymAXd{l>?A zWJx);dFluG6?93~enRfaTMoj&&+t{66MOIG=>wHnoOBgFC~!BGH{|7~9qr4A_y$7l zjd`(hsaCx1UH8}{gY5h{`u~kXNnR5$xf0RQH`Vmzb#G5-6{nUd&Dzvwc}-PWUiaQe zHSnE3oKQt`Uc>qM+jw+#Qqn(vO_3TZ_C(rL-D+WCPkgdOIBr zezFi`(#2XU8oWa_JBP-qsnr%~p;p(Zw6)rLn+7HB=4EA_&W6lJv98w9kPI&-^YP?r zBL2`Ws#}Spn2`E^0)d@qQ4aENP|>h>!(602=KBZDiAb~WLot8 zLJIaOf`CZ+^dg+(mjT=#4dSz&Dv!a27I{6Lrz`Xi5CQm_1s4FgYSFTNsZd;*5~OQ& zsAByoE8k^6FJ*~E2giPYdZ!nU(KRDj>*{4_Ty3QDbP)?;J+H(D2tHU!ESk><%hQ{5 z0Iu+H(hwXg^p6FEttdLP#dQNcWlml=&>+a_U?GGMR^Hx^A$h7gs+K z`iC!*fRwH%HW`|k={bdIbjQY#sP6})c=jaH-MyrTJaF$k$?7-a| zq+2pRQc;obio0lzzR26^fN6{Ea+Zi{7(GR$I2A(3TsA+?*-GS{RqBN7C`41h<% zNh6!)W{_e^S&CzSYZu`%ftCw}bP!>kB`YagAI_a8J2%Q{)x6Kc(Qe7&8*GKg18wcrid45!2p>*<3i61fwi-c3f1P9Nfg6jwpsw@)6pI79a4FquGqaDwEvwEyQ!-*|8l59YXY^xTOD z$;c^x7c&^ePWnGtu+ChxfaXlI`3a`4 zf)->}t7l7BX|Lu)jnJIRav@@{Os4HzDiZCgg4)oBfdl&6cm!|Ln||M}anyN#QkoJs zGuhl}Sg{3EZgukY0dk6B(P8Wr5xZLIE_FSXh3_Wo#%SLa0G@>5vE<4|a?c7A%%DR4 zuT!b#J3Ee7O?uPws4m!P8|N~0LT}1Kx3+bDwRL8+o!URwLIcKSL7G!3Be~fEI7=B`yC+dI`Ou2c85?GI0B znDw~c8SnJo+Jn)!HgD2bmOY0z;OZw&`1g8s^d5EZTbWT+8XMy;ol{MJPr@)5zV}!3 zz+oIbD3}-~8Z;6QMhOs3Bum%5gT~S>?OOve{CCU7=NM+%TifUJZF>Kh%`-w0;F1}j zfkh)YM!3qrcCVWuQEUM=V;pGo>K3t^J?SOqH?6xiZ$ay}Jsr%m0W%iN^j#+~5mul! zAtBDzq=faMW5d2+v-<;oXPc-O`)Z71NPJUkXd3PtrtV8&Hmwk0%ipf%<=Pb?n6sx9tNGDPnlt@9L+&q%KP&5aIC#Y@PdL8yZ zqth9UKL*iw*qgizN4>X$=K8leuE`Ijl1)znF%X9D{S`w(WH*t6f{DorM!k449E=y2 zkZu{EacP@&N+gDV|85tSu)A&y(H=V=@AJ;g-Mv{E#^xw;ZV@6!RtlQY)}R|*#R*e< zjm~g^Fnjjv%r77Hrx4eJ+o2fX;AWUkR%XJjLz}+nIlf6JN!x@m@6Ieq&QC47KV$)u z3rg5RDxO1NcMgh#C#@6;l4@C|0)7&zxr6jC0_=-Hc*e?q4JU-IBQ8E*1n<+N9xxU+ zQhQf^`z)6N7G4DutsujNw)krK27^+>t>s(js-WlMeZfJdcwJga*B>{9DxsrPh$^4w zhxo2l7Zsr`Y(?j}KQJ|shaR?$kP`IMZ6GlA~u1ZnwvS#c( z71}GRw}U=^TutMX-CYf!X}&W$*oTXY=3x5cWg9{aqfk>qwr8B@sFXQ*I{sAPTlUrL zqrzntJ@zASvt66m6iW8r_MKz6uz&CS=bcrAiFNj}txt^Mus&mhe3}QtKVEQ;q{( zOta#D%tzY|uf?}-v<@?K!+MRBOJ88sU*P&dST~xl(In+!{)5f0F3i7~$eN-XqvP)h zPVfcoT5W6VHWdDzU!eq(FFHEPuNT24==B_bWV?_cU{OY}%@*t>K=ka#!D-KfTSNnB zBe3`qZkOTuH~-nTe>(Z)vweb2e*Qea-2}IgP(;8-Hhp?_6jeNcIq?I} z?-hPNv|SUikrbRH#0pfwr?WGErBA%S7>&wMh|;18j@+B%J4DD?IZnqq*mN>3)Sw7_;>@8=^o9rhA{ktIF5tz5c4-jE5O}1mvD^%>oV!2RBX8cP_ z=kKJ7bQMYBC|Fxm<$*Eku;j;fWh!E+u2Tl=_s@_?jjqj-+o)hCN{S6_0?jRJYc;zG z3Yp6H3^Hs_Admfht3o7yN~PEpVmzw$uUN{r-N>7wr^Vhvt`oLGHWlK9CzPBdwSU#L zq(?|1Mi*auB9LT;Fp{BkfZ&QU6LO!GVwA5ua-14Y2-$Pm}!$NF` zB9R)zgy{bc7ZOr>9vnRw1i`TNpkXwc{e646xO$jQX4f~<_l7rrtpcSr^gYa<+)VFh z_FySb zY+x0uG_1f;Wn@vj+2C@cmCBl^eH}hdB=JTS@tz8K=CiCBeBCCY34#t+Bt99(k9E={ zk|}fLNm+?3N3I%wJ@bm8ew1~Swc})hA0b2OJUJN(w#p?7FjaaliNYF_acpHnCAwx8|fhqA!$!ReMR=&^#kicz!RAc1F!ckOyTX|N~C>ozl zqj#Me0x{MripN>q2{9#W1WwA@`hc?;V9!EgcjwR{H50-Tw}iV`H82J4Cav%M6R)x2- zf)nWYlI{8)$}$)T^BC*o!g>0$dGqKl{+h?0f>oz~G4E{u#V{%cOWPt93l-Ve4gABMr~7n z?YDj12tH1$=WfbD2fC9u*-LKDGLI*Lx^nsnyu`4|e}kv{&)Q7-?Yv=Mosv&a!axwk z@B1m{z+rpvpkQLGXw-ywG8~K-AkB6NyVxgyN*x zZtO6brEPm1lse`}I+m{W{IpNHOLGwB@SI&|{!S-L;4Kl~k&_?T&YqK5jn~`1`)g@) ztoDX|0_|9BPvb@q{+?g4pa?sE5+GggDpjGO3dXcigF}PU>Xe|!I2&TsZ(6T85SRbn z+4bA{6(@jn9~zx>WHa;3GvnEL@vp!68^6<8VbeAUMsh%jWzr>m_Hi)y)I00AhJyp& zFfm&G5jywb!-e-`nm>L1<%{_lfByN);%4LD7$m^ttkVgD*Toi^x55j5^~ooTk!#xF z3NO!gP`srMT`0B@1iP#KPQ1{c1$bvg(AnJ@C~;dRBa7JiW$5^rbY40LK0dJ?4T@2B z1*eMVIM}7ZS^1|MFR-ZPxy9d10E~~qd)qS6I&@7Yh?Ywe#3>0)DjS3tG990Co{ z{I189A`i|-L6k%KG0+W@yF1UD% zSW3DNk;8!NhPK^9{rI@rmsnJY5&IBKL*j~jr`QZhU_Ii%V7M=Yxxlba&L1$<;Y!Lv*i&m&;XgWm;&DO;g8@kR45%y? zd(bNyj*Xv!lApJ?EfNG7NtW_LYmZ>V+{AI<+;78s=Ap)FiQGd*fV%(U=X$$`3zvO4 zM5kO3{*(HsV1`RS8g_`YFugG8ZCQ@RiN|9A@rabFj0;XN=?a5egzW$`xW(FlzuE(G z@n%H0u{!`V>1I5CD_91m0d-xD0qYQ%w6wO3hd_$#vzUMX4pG40uDzADwlK+lsYA)Q z3AuK~P!s!Qwt2=9YdZo3$l^WkQog_J#5h*s*KL2^`xb$$->?VpRuK62W|*XD)@Dy- z6hWbF1Yd{c7&QYlGEcFF&-(UJI`#+@7TpJNJ>>MzayRL zL{}AEy==uO5&m#eqrZo`+Kv(z{a`}Fi(7p%p_Nq#V$tC2Pw zw_(EtKbXu^9bQhf@z*wd64`o6OsS?EE-c5lfrl(181au$EDOyQCRx^MBX{6?PkN<3 zCRL1U6uC6kvfPx-#^+K&a}2h&&i9%3`+fcEjk+9Z%6N9EvPnY{55VWQqb?_!QikTI zZ^NH|s(;N!Qvo_Yco)c!yL;H>@}`Gwn}p@{g89B|c~$@FJo%nO+aa8DR8%f4r-irs$)IKruPlA5)oV zP-8Vc!%R+o=tM~0UA1!?)xM-Vh^NAh5ezARCDwgNp(4V}N$A*evD9OWbF~n5SCL3f z7}#=A6@@NG&+U7+i9K-??Sg@vlo}ZnWzs>p(t|6@#tU;X_U+eOoBJL9OUS zj6d5>`q7i)qSRA7J9J!GP(3dC7#ov|D*^X)S41@>pTjHV+u{5r;=DyC=!Kcu-W3La z?dWBCnqryd*rxB5Mr|H?I7jDvF|u(iT}lUGdzgkUwHz#L4e>sK{5YXu;fZz=_`7;# z=-QA2Jec4(incNW>Iv6qG2_fmip=tfBQCchXz76$ES`L7y4;cBoK6z!ZRbCoRR2$# zKotL-zv9gh3oFD{UE;*fpt9-GRMK{TE?HrO(nlqu2jLD=xAcGC9kjKyXw>@wa_`IM zectEp-r0G2pGwjMgV@gy6w0zFU>e82^XWx04}!y^ljGnB zk3Jnc_I+ym8O6-$;+%hn$sZ)vERTJbWQHW=^wp_lR`h^|6h_34fs>*XdU+gwQ$NHC zGT@vcnNV=v!>hWJ{z<@BnvdfsfG{TkixL7;WE|uUGs<_03a22{A=4tbOc5(XmS^PE zJl0K~p4!*8cjC2-0%}pqA)?Fpg!B+6I8jOtAP30=1*dV6#LqC|p=m;uB2t|~lRwo$9h zbB5mS#dqtH|7@#o4sZM0)x>g&&ODlORd5B*xknltYA_mcl-`eScVK>hwYK4wN^7MM zuB#e5=yIUzyVf8fEFw8pJ&Tu=*l5b?U7Gg5y7J84mG|@dW@rs;^U|u-NUzaIuWEE> z_HWFKZjtY#8BV>K&w_iUaq!!5cz?>s*Z-ROFVAu2CoP?S!_ZyYTKeaT`J;LueCo`9kT8B--Xb_Z9v(ax_HTOMo~o23%M;m^UdSq*ON>NWXSCeq zYgsue4b;-!rap27`R7kZ`fT zT_>Vm!E3YM`U_A@5kaC9$g2#DwM=^s*;AjZy4aqG%j}m1Uxp8VeBh(?{`ps5Ya#sy zy;p6I+C~um&ac=;D3}^f+)LCJj-XsZbf*#yHMEL^Ez6hzRx!422^GL>_ag*0lh}z50($}8iWB2!7#6=8|27Cdj_+|n?jELONLt#c-&-zv zm!^(ymU?Ob+HMVUn)l;RiROOM>;7SP*NJxgQMPzDej8hVNR>>vs`>HZ!)!9P-cKIi z%wv-lxgZ?eb-yoRE=bETE-GuI=epG*_W08*hJ=OQHAml3ujf!8m@GlDH%xJ1y3_5w-n9TO`D8jy~U-8TZmVSKy*!F^+nGlzYGy>ZcXBnefg49 zWbYzbnQ}QE`Y_`-sAyti2d8Lbgh@NwAR^ykM&GAL1G3%*Rr1~oTihC>l zJ_lMVje@gwonb;%*Q?TE5#2_y(~I8fLL;A~8EUtO-GOJnpmq0;U&+Kf&ICE zDmql-uOd1uhV)!(87epy4{*Xja@Zp&+R5dzliN|btsK%F<{PA&4vy0%#j_!aX{MD? zj3;c&t1uK9eZnD_O~o?@LNX}vR}Mz%iSk%PNnGX@gTTd0w$`$67`Nm=mS!0_S;SJ2 z;;E}i8EW;Gt+qN8dzHC}k&(ztJZZpx(Mnhc0xpMI#QpaWx3K?jhzX#ak%lAxudr5h zLq!B}%8l=clWyuwbg6qLnX-e|GC7(wkVjKCqcJ<#Fh6$(V(^6bMHv75Rj9tS4vlY} zkl#zgFc8Pz^H<#4wl}pCMyrU5P|!ia;!`1H>8%a6NyrcFkp1tbnG^OfEZ#$Z;NZTW zeC}@UbgK!ek$21>%&jwmJL+~C?d|0vBa-!KHRA|0_x;8<4{G52Dp@Ugg30x=Dq3AI zW6@MEIE1%U?I8#WE})4YhleCZ%?p*gF{(csQx2WJ>%|E znfln1F9M;o-*ke*)=Tb$lF*=k3z#=FHgxj^q%a;wHgWh68OxyaMou>Q-7!szyr3(3 zkww)0oWqaoYyA69jafe)Yc`D;uM&|$x-)B)bbVhw=11V3d;`5zU2md56n*DcjEyN^ zb*r_T?TXg47277JHR^7f1wux+C|MlH3^aCk{qH;AN0EYU_F?D243~R<&pC7MTx@rP zc_0WjSRST;Bo9ia_uJSb!}+=3TUyMzd>wX<28@i*u_9&Cloha2^aX zWkB@-Ecx%m{|Q80L>>-(st7{FK3ux4a-TsF9G74ZaZ!w+z6VQp>Os%9##|nmZP5`d zLm)Oo`oCz~e-eHRh%d{3CoDw$f%6-g71jIJzcxc2L+_QTYd7xkLHbR1(7sn@=yf)!bB=(MX7LF%?XRg$e->GG$x zOKcz^cflu@`kW`8N!?N|h|IGY1enJ1FFBCX)pV*8L+;9_OCiyJs3eC9qN(Rv$ccy* zInVWL>~M7ICyh4oO~OpvYcX0A2xBuz|zMMXoa8%kl(IK(t8tZZZ} zcXOF4*~Rjxb}zF;>8dPE+_n9a@evS3bbOpvP)dSXN8-glcA-lm*hgI*<|u|srwt(X zIUZCG$R2>Kye*6ypQJ}qUSaYZ?eTw{-F%DHoL-!~UW;m$I*(&B0-C{zw0Gb{Y}*-9 zBM)+WEo+^Btb%tfP2G@ULl66Mq?4oSo2#>Tkox;h94Z$nEc|B>*IWlJIO(89(Vr{hnWOlcFXWVJ)=NDpFRd8e6M%1$EuN5EKP-fVE&pwu7kF z{`Z{&v;h`1FJw3D;(66R0S$vL>Lvpl+ z&LYn^=9`|bCdWDzb262QVf2jdnCP!#B4W-Qfqllon z)P4yK!8?*(0Posuh{tJ0=kf5c3+YxMFDb)P7gqFykSdklgKKPgwUt*+Z0Q@*@%b)? zHXMaSq<_q0A&kG~ML^Lr3Pn(>xjfk5+Q!F!u!i z8#dmi-FY^`wMMhShZ-~nL6uX^J?H&-cYAg7%|hZ_;Ut-*hE09%urIrWs(%{P{PR|_ z>;>-+y>KTLt+2fd+m^8JT#Tp)u9rpL-~?4yea&QQO22N4wppW{oN-xy z@|4lX^?G&o(b?^-%(%)|ag^e7a?rD- zUfB8CW%ReM;=*is%0{e_bTOo!Z-*f?HdH?Wj7k*d89ipcm(Wpp_PA``4Xh|;7Au*d zH__jUuCEu@$=E9NEj)m8>y$4m2evkU?D*0xQaGpg1v_uQO#AEm===knl3P#0Fcin% z`ziWhxI`c1VnQ|-qht}Hl0{G-7+FepfW@tCdQphsyW5S6q7aFFXwuVje*gbD?d6r2 z34~&xDUpCHO3Q@mNG}8^uU2&tBN-?`DB!4Lvay-o@HwURMyp91(70%Z!At~yL@JQs zJuI2BER?au)~vF1Jw|JArrMGwmH-GX(~iY zvcM-g7f@$89-j!Va;Y)r>3%I?{~yzi^NY6StQe(|6;!Z|5A!fS#r08f_aj;x4bMl| z^Sr#5mri%!_k-)UzbCW)J+nV}?DlRqeJ{}`osi#4!!QuX-}6`8+qTDl*<77tcV%t zGZPZj#5pN02pN-NbwC3j2?#sB+F9O9tj2B7WopY&ImKVl4rW6-uuwV0Etu*&;lGAE za~(A}F@(XNKB{P;2=P8z5B(K8k;(k&#?@%kY$6fG=t}vpSU36d#4c&6f(Tv0_4=r{O6fnE&P}7l!a?4MH*1rWTI;RRxXV8_%XL< z5?(=!O4P|V*{9Z7G5e-;n&W!|N0Z9Xz{aeNTWJ2(j`}22sK3+Wiy8b*xtjq(kjg z#Wo#Gsjp;`pRA|{0++{vErv(HFNQ=4Mupb1jFDLbaG#_5MNH-atg(7r-r?cwxU@}& zB@vc~aa9A|$uMjBbjMt$^CXZz;BaYME?l>6oe7=4>6+dvp#eeDXDq!}V_>$Yds_U( zfj46Aq!Weg7c727gL1ArjpzY)%xIuiQcF7t8pFQ z3;p{A;L5U&iQnW~R8Ej{=z2ChdUP=XTM?>|Hi6y#&Ysm&v8}e6Q8=}A z#m%EBbD+lnw@bTcF7cMzSrhwryX39UP_n3QxtV?;_i$n&9HAgJ~zYV_N}+<^ROf~80eA5!jyDNb5JJTGwo zGYvu1BPeNw8!dPip5t5hdoW|(I3Fxz_VMO*qU$%TnIlp70qISM4?U5XhKK9>yUO_a zQrS-UC*|k`TEJ@L$e3qyNiwrrXtA#_(6c4WeQGe|=hZ4N{N9ivnA4K9^THdN1_3lh z(1pe}n_KJ(N$8s-!g0;?wie?VL|`=laK#_TFW&N#gS_y~AAE+W3+d3NN@6Wrat zP`aC%t{lzyKBk^NjW9mLXv&Afox^?M;!3MtDS*%W6eEaI4)Xrhz>uDeQqmA~Og{_|eVf?$^Lh-5UM3K|{VdnW5K&=MVr^`*U8^}_~^c}ZRkB_KTqBJ>ZEtURjaS_C%ZMQhnmf7XJjQhG8yJ7 z<=v!CDgsp+ld3O{O)FEy?{{v%^`Gmr`fBWd@7=#oU-i{DJ3p&;HaG#lvg71r1_gf% zMDH}mD^F$Nl;Omv+Rzc8v^l_&ZY)w5iQ^3f8N{F0cCG5C`IuRQ1ASey{4CG0o|RaY ziY)_#vehio+*dz!%-}MuIVpFOwj^lJ-S!B_y>Hwdce{*fz_^??`fptTr15;xEN9T4 z?OqZ(?!VBhnORKs5)!dgkN#YhXyNDqNzHXdEabbpanvwJfT#(IEuW_n?#CbV5alID zb%LT-g8U;WT!){Bh_MJqwh(yeq#{aaY`h4T%g&rd;$N`FDowPHlu{4TO9rlwvH$Fl zX-lkF5K$E2ykb`a@&M}|Z?5^L3!LmYA(nnf^rO*CO@pr-wSWB5ah0|_Ow zEoi;u;%AzbM)B)FL3)dM*D+5y{8AWVjNI`n=wWLna)OSkb{fM)T z3CZF;h7AbF8I$QO=58*}?V9K*Y$7Se$o*>CP9-Rx%6Zt2U46)B&}#9_L5Jl!a+AX% zJ!Vw`ZQX_-xZWM%Ba=p1(!tDcA=aMqcYgtt_!_1u|8&4p)G8WP&S}4*{Mk;3r~M?U zz@9TC7w4D_H&Jm?MlGX#C}RUeK#89@u9G*$au zBe;-VsfO2i^>A?EM->hZ+1uf%%ch0kb!-ouZ}A*MSXz&Nu}_*?aLV2D@(hFtN9q9D z)yfcNOi$f!3|Rv#a?GF=l7}lOTOwZLq|h;d4b$us3)^kREq+xaZE|_@N(hC|vR}yha+0 zD-)xDZEc(jDq=;^ih$S+hLYaro{0dkg;Gue=^rm|H_msO=clW-BlQ>;`Rf<|to}|o z<+oGTU#?#~VmT(Oy6m`J;2G({Y?CpmaTN=Z(aFhauSNQ_g$)J&srqO3JY&)vHcaAIBw9+=KYhuZ`C!$@aT|yCaXC&cEI3TkNIr5bN{wA72?jePA0L zZw;##_~yw>F*s;MA{8bpR{r;4h`L3W8fL!|57wsy-VgJq6KcqBWF0|1YIMm4bW`*D zS9QYgpPLTMkn4Mzo=9T6HkfTtN4o%GcOqudF6<;)pH}ov(nCh}p9$_R&5O%SrL-7i zrPn?=MeRNF>1MRSlx;x6E9p9bwjnw;oA0V+koZrLEwzo zAJ(adI2;%j&mm%O{Uw~k&nb*8szqa)1Q|WWu-23uCW$reT4Z#1=4RG6g{P;mZWd^{ zOz#;y%7GCBzROWDdW-#HhxUXdQsHq2bp{=8&=-uF<`Fe|(@33^&8IwoUWxCbP4l8X zG{#NsUc&&T-8@>dfVe!)8Tbs&dQcNY^qo)9mU<}UCk3GxwgzcLkhD_5s5Bac6Cgy5 z>K(Mg%EnM39A_{UNO7luj&217!Yb{07WUTM1g}M*M9D*x;zL&)$D$ClsvCxl$5ftp zI(y6j;6rSx2KT!jp<5I1gNl^=&y91XA`@^$(RjHUa@o~}X!VkHVbMQ~s5mB(IxCyp zKiSCHFV`HMzMHzW;pOf36bI?qKF62ox-~mu=Vgmp0p~nSh>;Cz&g)rxVuGWkpOf;t zHh$tUFeYD2>$C}>0)y4(J^Wr?S2_Lb*C$Vx+#Rk)(Dk2KEdWG)H*P4~Ja4>FB5ID+ z&r?ttf(-icI@Z~kS?}g>K@U5lJB-xl+ld?Y-WFb*XN|+)tlx>4{47=HX82i4tO1q zfETRMXm99PINyyHg36gCRkYFdyrEzR z5(7(K8Dq93@t8LobUKQ_FOkw7WA|>xv7vF`-$_*oeE`#!_^A_M@vOEfr~Ne#;%&zL zge5b5T4|F0T>9T$F0Avmg?2qQ8<7#S-B=#aHI`kM#3~pVT8i|MK8b$7jZexel36x+X+H%0_LA66+ zQZ%n8%7{R=dpeUOrZGjAOK)#!$I0%`Lv}9H8n?UDZ1~O{p5ynirC8zIdfH< z<{B)huB_Xo>UFJN<06VZ)puw6qsQaRsxgNVhx1{QdL*>`)z+KsL61Xv5a_Wjb-JC{ zb^&cjlOBGs&O4~RMj{@&rGl22jhm=dYRNTSw#eZnO2x!Pyd}k!{c^yi1ryHSzjM5a zs!jBEXjtMZE80^MQmz=7NA#m%$u*`e8qgUAd|UJyYn~q%lBL|xQIS+8$$S>iNtdgV z#^t$Mf0*l&|F}9a+mdwR#4z8mf1A+R3IIy9-PyNpfE#Rlr+xrJf4U?(0C%zU3at5<^`X8EKNnJOK0*o`UyxWzN9@p7CR|GcS*2YRbLIWw}5dK~N7w zV7SUI38*9nNKu za?ZCe*jvA*{QZ~X!V-(ZfyS&DFGR1o-SLcg`MD;O8Zq1;k zCku*^BMr@0TH%|3xEHwW>N9Xze6qt554!}}jvST%Vd(y9kJBVXj)U6<%AXw^+_0B! zj!K$Vuz;`mq7C>G!SonxIYqj@zy$6F@PxJfV7xBIPa;>&+RN;@3IItV2=06q)@K0A zK>o;gdpKNlxx$Ii@ldfN5a^`H(qga5T)S-NP2-9u$Wawr`9elH)Sy04=S=Umx{`h7 z4-)o7W2-{dFG=;^hLj46wyjF3+D1`@*O~~57(8w`TV1?uhPv9HrS6$M!nwf*u|9V3QH?98Id*ncz*OE1XcnuR~5K+!QQV+`;o ztjwh()7o9rBbG+VIDtMgqspaV4dOI6^apFy8cQe74xMl?2f$z!k*(BW!2xY4_<$&t zFy#1aD|2;hm8^DFoH}+#j_k^nWg!ubC9d{8e1fZk)F!)@2JCBrkRv06_53L&7XHkG z)rF+bv{(es(pAb46WuGJoMre^!vm(1*HL-??A_+4EG|RsPmN)tQICJBkLDF9o9>C^ z_FJd%ib_YfA8^`4vB(y=lLRr@2GZzVLn23P91fz=9Yp(k47}N6$;*55x^Z<=sO7?7 zyR3CPmm_`+TY`Wb7Ws3fQh1Y92b^v|@#)F&O&q1` zXdxT^*}ZOO?vGY9BU$B}yD+|C>viPLqg~>B#fY7r6@cmm8necYr{yGtj&Fa%DvE|~ z3PjkV&t)MkG70rvr?--#nIUK&=Ptyx6xVk64Rjvk`#a@;?P_i9jYDlx+_8m`!SyA4 z>Y*Tl?^#or)*X6ue%KK-B9*~zdj8FswU=Y#Yv#nPyL!1J@HfG4AX^|%pSeFCm4ek~ zjr&At=zs*r_P?mZ)H?t6lO^kB9L3#4AXyRFbUdRCHWK4S399Wh#GLX6X=rfe z*5>DKLgJ^VGUSbvqfmqpn}q%xqtF;XcAm3aq_?3h{s_?vRyTU?YpN8JUd1d{4HXjW{5dg(cw}t7!75mGo>|UQ#L;Fp3#E{;1 zjTZ{el#8{~5dRd)Od2t(pJAVZKtyZ}u9}&kkI=A~Z-4)AQ@1=wTlbK*g;InwT*uh^ zz8yU-p4&Wqyd0f|H^ZULVKi|!sHOaD{QF%zKpN0Ngw0?Yf{CId2`FONr ze+PWdo{Y}kFP@Cvd*JJRd3y5Ceq~Reojlxme|h=xN}mMy2z-0==v4oGl(ZP=U-trU z70Ht=IoDy{kS!R=puM|{o8-ygeDP$8;(7gDjayn}Pd3!65-zuAGmd&#?sAEw<%$p>-QIC7gh)kVD|YIrSl;A;5Fk#fix42c@`x$<$mo}sczq3~de_|rXQ8_O zj^EYq15M{c?nRTbNR#F-&12n+T0+w#$1T?>y^$wvN|tTk%*@Ujyu7h9*|m@#@BuE}#Qq^e%0(K%hG8z~$-3 z5WKPgCvB1$m2#Pl3Y1!`NsFs%nC^hOq&fm2R5*k#J6ae$n5RK+jA_cO$~4f5LagN{ zx=q+-ph_`kv98Z_DsnG^TZ?K^-wDt+UGaJprP3oRQ^sNNDnD0xcfd4ZVh#~Xk^N1A zwVMV|{CL5s$_yyX3trN5GvOk~g#aoV?*z>{DWU(fz!VUD!q=3;4NKmdI4Y`ZCW<8h z#!6TOn$5}*=fAV&^@KdksExIbD_o9MNX?o^qcFYW_VpxOip9LB*spPK|GDx2KjlsG6tY(9pU5{$sRY<4x4>cGr)%zMwx zO$~tc!g+a6p35tfLr-Fx5(M}Yi!X*t8~p<2#InLrnIrEY36=1=7L_u*4`yb4F^0G4 ziE*kHkKPYN2OWM#~N zV~;VLLkg?9Ah_h#3&~lkkW2fEr;kYEi04i%W&(}nec<%*Q&#rb3j)l&5j*&<8w%)S zt_QT|2AnhVXvi=3-6b?+pYvVBIEv=5WHLf|9Z0`!G%r3F{U7Log^g;y-ltVzYF30L@ z%Tjq7h7n>@8MXHcZ~(KX0p$$1c)c#ntsjD{{Vup5umOjM!oTmeq!vw@7bUQ@tCtU& z%aHEfs8npIh@>4=$zCI$UF}5PIch=1H#(o4Uh`+!vS&^morg!GR#H;Dw8CYu@|u&i zD<^1n;IucMcuol|JlU$z)Pf`EVy{wG;WS85XtI`A^RL`BEC7~bc{tu0qaKUgKO6n` zuS*}VKbztyC*QBA7g;;;-6YfdpAO{PGBPezaAM_T)MvOnmHA|A$05XQKYJ2S_UFa# z=RYv^akRfcDLbl3(1r4Hp4D3IwmV*)d-=V+U;b5|o$_n)M%e|1p=4Ln;ty*HVBP5_xU>PkPHW_XEfa{sB~bFg*( zsgy<&^36tPkC8=viNssHR%tXYJ$eN}${6RvoWEe#60wP<7~RNRF|vcMciSFW;JpI7 zo{}Qn-dP6T#I>1|?~4i}H>TfKYj{th_%hGVTqUv3f$L2KQ9Jr{5|ai*4ecE%lP!X+ zp)AC3@c>iS+*p3T_l`eb|IPx=&#cQdF9ifnMW6fLos6F$jOUITfo>a8f4@rI zm7bd4oxGaft^QpUs8y!ZEzZ%+`cAWJ-MrStd*1hg01Su0>){qT-_)j_oP6s2LF{My zpzC+PL7@NWHQl>f7rVZTc;n|J*y-ZFex3zfWN&qSoE?W=k--UjyE61nn(f5hvVv*e zMgpi6{&Ml1!G#3vs^&~>S4LhrUjKVM1AF_phEUq6Y_#kB+bJvby325Te@*WdAVF{6 zV1NJ=^YJ~A$GKk%IH>)e(foheuIK$O<6$)kCQ9ygdl~##-RK@9W2T^_olMb=(pl z2#R`pR?!+iqwy#OEX(LkR`yG|Hwv`zd#xvex+Z+|gGj+i&-Ledk<%av$aflDH1MpN zmm`-3ex2q0x%YHmLD=NI($j%zAjW>beLSm!fDYq~%gY^0uB!a=@x~j(4v4(_bO+Fe z>(>hJAhs4-JI-wOwVX%5zJ`;3^?gIFr zh2K>g)_OV7JAUeZf0zz27!`0OqXM>lsPeY?@X0G8hVBpoRtE@9M12X(9v!l_!?GX(4)nzi7f_bal|SO* z2%WQaAH2+kCv=KAFLfkat{6!}`dxbg%Rb9Az8eB^^|p{Fz5*pK4>!l0^MKKtQ7!uy zZCTt=Ciy|@{b0lnLq1@TRAA8V$(`|6M^S|{913CdM97{~IJ=lyhIaudBjS20uK=D0 z#e$+uzVj~^PjZvN=T(Xmk&cu=be&9tR-vWu#KpEZ-t{YY{SOHHWW6~o1^9;4=8Sp)Zd+#iOPYl3kzy9pYITzp)0?_@b z?fd<@dw#-|O;Ic*E*w1#v@NeT)D z-9H`>4bKxW>}o{5|L0bfLQ0rcVTlI+Tvh&%NfbYj8qotbe)Ru@W=!H-qB|_&Tq(M+ zlM;8ki1(5<`vgp+BRZuW7vnc-^yyIsvUjM&9aTDgvZy+kT04a^_ zFGa#>2}&7FSR4y=n@!pPuVoADp&B4qEAl2tkBsgj94PNT2Zh9KC`_Sxihd(U21&v# z<&k|;fMVn_5G8*fZfDG&hs-*Bnx@JKW#~kFan_QW>nxFf8%VJ!t6@8;@T5V~gsf+| zOAjtjk{2tH?hRZb!9_=G-cnli;-&$p6(VaB6#>+;$}(YN^c_|jI?W6E1o5Tbw6&m^ z_O7~cf3!f!wWuiuT34OL%(}pisTrURKEl^9fSSHhU4OjoapZNwV47$j0H2{#E z(gskxRLKRh1lDq8l;nkv^Nq4tX~bW;*d0H}*YF`-Vn-B&IW}ZSdMVIU(Eu6delW~1 z7#&JAQ84x(L@9I(V#qs4;BeBYNO@)cK^D>=8;ov=(c8p0se(!Jb<@O~1}V>V(jJ?E zb)-AZq|JRhrBdB8v?Z{LjC;RP4S>Hl-vN}FgT{Rhp|`E>^pHSIZjY(j38*W56s5qv zc%ofkNbr~r1+ia8)G4?S&Qg^`+%YeBP|1~u`+M90VW{gAc~Cfsc|dg4E>S*I=;;{6 zfYL5shN5)6-qiQEsP_p{Xc}vI%6=!Jnbf1dR#n=yWI%^xpBQU)XAsJ2A0Q~?4A)93 zqgMx_4^{&j{IQ6RZn!jn&{g)fvTUTla))>eStraP26n)AjNeo8nA`&K4_{u)+91%) z9N3^-Lf$0~m6;X^Eic`Ypbm&L?qQO~6q*FSwXz~me(J)IrHI&L)N=HaA=Iifdwr0# z2t)I-)&N;nWkZk*bh`C#X#g#d&+OuyF11VnI_+KqaP-uR6aw!9Sb}=1u;K(N@hv3r zys0lJYgCZ5LX-q3mNqdgaA~QSBp2~ozmZU~h#GkwljDX|&|bQP>n&MoE1eGTBRTfX z=M8dW!cKCEw}Ul3eYH;3Q}U58j5v*^lDnh(b zaA9{M#oNx>V9J5cK*fi>8Jg+@5eZvVWL`NI4T`iSODFupcHefNJCO2N62g`Ur+=EX zh252-i^?l2GaO8^4B&(3BA&Ng4;<`%e2aop=N^;f<`=Jm@)j2}6yXq#mg!HH>Ccww zFO~`9XmaX@P0EoUO95#x(kN_()b0mTQj?~2NAl~Vc)}l_t1NcpI_QNte_JtH5GcjR z6(e0jP@mZ~Oeh+%EQ^~|NLHBcSS5tI6kLipa4oqr_Q$E)0Wi@!0dEu684as5;uWfA z3%`jybnlZ%tC6Mnmne2BY^^z?ZMK9(V69A*U*#Y#?a&&yo3*)Qw9H2JisbD{LFiY($ssa$nhL}v1z+LOeVU+~wg6L<-rD6aHvJ@T#IJ@}ds!EmQdCt) zKsba7gZrjLn?lSJ4Q(KBgU8nD1Bw$sweN`TL5sMkztEg}KTY z0Rte$$U}VNObdN@vpa;~2?^pdGt*L*(~C0F;&pwj<&cd_9m$kXzYwrnv;=MVmox&+ zdI72#14*_rq(FQ&*%Z^;6v~gT99noToZ7Lk*y!Kd*mZ~{m;+?qms(O6UVZ z#RkpxY&hL`f&JjjfY7r#GP7otJFS*b#}#3+&V}7nrh{}MF_wzd7Z(QZZhnmzOhj1* z#gD-7N`c#e1qg+q0b<`lqA{(NBZ%WW|?u4{+OWAZPkkIgt=lz(T& zp@`mh;F4KM+FJt)s6#t@PzOiKApx=%43M9d1ZX?4Ghtkq2&{457Lrgx-~}P7`KejcZc!w# z7gBIcT`jKLsn5gwb*KS(D+ExrOmnqO6&HoOw7#41IZ{&Eu&q>2`_r-^113^75kaq4 zIl*7x>gL%}C{+g%!rKwyEP#DZKLaw$5=fT2Hzty^MB#Ljb~?Vu8$GWGQZh)FajU(q z zifYS){AKtT8JR=a*Qf$IT>`;!Q%WG!Wi~3I4BLI2NFaX)$9uGy)O{cYSxY!9{g%>y zuuc-#;Fl`2K}QnAJSpHn29-iUE36nlm{4ZtQQ2Ab5DWhi(c4C<4JW<=qk;2Vdvu?u zXv^XTsacfvO7iGe6FC^?(~|DEV8$V?q!fwC4Pv)cn}>3Y(cRHDrwZ^)+`T`+G-sYy z3#dESnvkY(^Ly545?DY5eJ|d9EpMA_li*6b@CO) z9|~kNrO_DDAL>$k&c(V?8FSH_2**bpj5|VNr!(pd=#A1M3L845h|SlyD|rCI^}ESh zf?-+;f^P}O7+4pVGVn0-z*9oDv~e_xsMJ>B6bPwfE;3m`ZblNDTNu9<<%MoTf#jd@ zrd`qWLeOr#@(qBPk^eGuH)ptd{;*WYPbv1AuWEXV4Xewbs%La6d{>jue`lFQdRT|F zV9ER^XUPF^5OX5-$X&KqU`Qy({R#0B1-yRA)X)&#mivaNYE!vo8N%D+yJ5;@R~JaGo#}|@2)J+2^1-5wd2vLW=!0Kv@8|{ z{Kp+L)OAbTuVItf2q@S))_NrjpNz>~QvC#UWR#wE2d4miVi>(KnQ4RHz{k3>VA$jc z(W%skrPzRLAIvqyKwlflR#5_WPwER5{J#d_@SiE04i1BHJ-R&dtYeAcDSd^aEni>l~A%KGYD9wO(!l0b?~4^;!FLX2j~Lt0{ZYH;Lt8Ou~`) zsf4?Afk{NMhPQ!~^^gMSn4=s=j&!(#b?MCWrJO`PtlsH2e47exeSXcn@!5Ak?85Gs3j( zMl|DPefs09@i8j$hYJUmO7rnMnBL&Z6u;gCGQ0{``C0tBn3q8_d1}eV=hb)2;!IJS*W@B<{F`nbYH4(HFOcm6CWIQeAZ0{?@H_-L_46cy`?6Tn4 zOf3D9wrF9Mb=d?X;zkz52ZzE6;(`MhpGqVaP3}Ks1>ECyVTlpLtk9zl zrT{IuYl^a}XRYA|<`*Dt1W-W_nH8F|(&8qJLq@?vf?F<#U?y1ydPys8F@yvdXQNV^0a>eNt%egqzf$;8j1P-T1N=JJk67S~1a zwbeCcc@)i*bYJr26_qw66u7)>%$W&7OL2QV`{xzffQTY! zrYF$#J=9wU^A9eGsW8x;JBVYf5aB+v?d7F_M~39&Qywi_DYc}RVH`wFH>dq*Wx;g^ zS>Vij5s1czZ(%CJ>AyLtg^wX%GC*c5FibY#=|~_8*J*_)`~eV1Kr(E!duuUGc?y=8 zOp4+PD2bUz=Es(ktr~2_wZKW$6g5z$-f0>wyKfEFj6bcC{r97_%=!I0qs``w2oyHe-f zn+990af!85DN?gE&5Hv&F*?g}cGo(VqH43^cT@~nRiK85#?o9f2+Of|PHl|AGD7>X zD7m$bl$WT?`aSN*dw5U>7;uH4@Bvys5kzn3fRG4hM8KJ%2m02~_K@g7HL~-3Dp~72 zaeX6??)Xy`C@njr9L&hR$jf7hgh<^D8K#j6`asxCBq9?!F)z{#62-_2O$ILG$i#FV zr0>A*u74;g>A7XCfry1v`(E`lt_np^+ll#^4U4h2%7+ zgDxg5DK#1;P!VreQ zScr*Y%kUt-gfduWYR<8}+Kn8Rki&q8AUTzp^TYTQp=QD|z`X}T15((#Y66~t(G9~4 z#a>tu1z>8JgGj=?sSSCEu=?y`(0&)q?A>(tI|5O%;6A@Z{n~?Z3SY*j;4Hh9xicurx}2SCxR85^j|={W zLbY-y9PGsTol}MwZ)s6GiML<0F78 zM#vlL9Wo1sHYLceNkg9s2{bRXd>Dy>^G$ZC2FSf6(F8+fd)N}Q?fcLfGfu93iHO~w z02bQG5;8eJHBtVe$sQ<=qzMLS-rpDva^O#*YrQ382UFTukbf}L3OvedbTGP3o!|y% z0tAJN`xBY^a~b9cxMGv(;ffnH)H^`R@k0kbPLhrL=GEj$k}Qv|<$3p`8L8tejn_D> zT{MoJum7SfkYPR#H;cf`VSP2jFAR@7=rAC$+%UA0lQEU+LP9KhPy=Dc`UYZ@7F5at z1Pn5K-~{kmgqT(8$DU9K{~*z_G!Me*3`7=I0m6X9zly}OseL!GTwrB8gbW}izT>h< zq442!fwKYDg2y0g(a+dRNkOq!>lX>!1I8d4Vs;b`44x(mHaHHXhUU(rz*k4lC({6(B+>ZwOu6#9n~chJ+y|L2Hlyqilpv<* z($9OenNFv;SeZZyy$M+>s_O_@2hWRC?TsRHnQvnw1xzI$rg zIZW-r9ROzo>QIn)(#xbI?96H!up82{F*=Nl)6s)ekzo_{b@zHl^(EM=;9Uevj`AWh z5t~nzOGyz90wmAu2=5#U#!gXF{UoHSsUJgr>v;LmeL4uS;Q~MU>(%tOObcai&|(ZV z8vrVs;9A8`*-pGCh7MRo^}W~<5Dr6hb4VK=12DGlsWyC|nrc7C=QB_;p} z-{3{PyMR(1fRgEwv({2VM9yuO5{Nrlp#e6AjnaGn1?}VZCbmE5`)sovUVHd?m-!kU zP{8si@0hJ7z=RUqd=3U-C51AHUrIJa6j8rKo!+LDse{oGKOhknC={IGc*Gd%z%6VJ z<07-PKDF|6RC_5}qgRs96Q-dZv}@lzfOVcaf@B4UV@CHd(U z;&kgRlR2wNAPhg)8h8sB+royBPB_P6&=Q|SNQYT-x?4@FX8(7i4y!G1%2Q4`AkkL{ zu7m{)Xf9*+rTgVSl!z|%H})LT@L0OCoSZHllGY~3y2+?u`i+Hnjt1%vZo|k7yHDcb zAa#bg|2@+hWmEoAU*hP)085&87i{Sq0_P!+7=!6josh({RrZlH23{W6pSXjFM z1#WO!9`G#Q#n?cH=*EUqrKqs+em1GF4FYT`alC& zwnIxcn3>L9ld4J&q?mQ&(%pJC;81+Z4o;Qu#s|f6C6EhQ_fYs_YYcT2WV$5;6bPLg z05pc)5lI(QglH+Oemt> z(gE!ijuZ$Jx*S8upG+k9?W^;8djx@e&KTnlrN<>Z+UHV4ePzb)+nB4!7OJ~uOa?}P zOw;o*H!#f|HK@07QH3N{BxAAmaZK1kM<&2&e0qaBZ7(I|9W_X~hR*Mlj|w)K1dZfl z5L*(P`7#GvP9QGCHn`TP1gqT+5FVMAiF9pJ?UQ?R4^^@ec}dm0E4&T$L4*5pDEp=B zEBnQnu23Z6EGbHAm*fr>o+zCLrYu!PbfOOHnWU*?BpQxKCeI(=DCzl`(8M`rkY<V_+tV1HROCvR!B+f7WDA}WoZ%NJijI0(p z3o7(8va}NmPn7>)q%xn1it^LmAWp86TbGtHDWZ}_29jHpLUpO26e`nV>FrgtXfs~K z@T-mEEFYqheCY;OW$7{ptObuCpga|>XQ2k~9`K=QM#2sc&5%~IcKb4Z)_q{U|HhkW zEoy9eKKjAHrbuF0yye3}bwh`cCz;Vqne7G;v@7xz^1Qz0#Ki2i`3uZ`}*~g+1Lpm zR%DEZHgB;ZwWW~&QQln%YpK^GvK!Ol^RNtEvZ#d92%B)MqH3zlesTO)q-aa)dr?|T zGWsT+-=4tuQavqB7Y68RIrdCc-XxgVP&en{`{U$UvSjTZcb^BS5Dh#BXYL+YTYNj< zqlM##+ow;d!;L3nANrDK*Rzwc2gCFF$7eQ1Za#&sJ)bfFoz+GGhLrvBVVhfCC2plb z;feQgGzIbc@{`y1+k3_b4hvdVF zfPlhdzv9KJ$Dv4_NTaE7d4#OTh36bR=OFcv*pF_iso>Ld(%JdS+Rfl=mW)g zW5#WsCQpqSJ36ILUdSc*4u**}`6pK%j(6SM00gqBk%4HaEZKZv$0hyt*{vM41lNE0 zeBHU;Kc7|@`Oa5hWj8&&Zg2ODSoJ~ge{?L}n!nF59-> z-xu7a4_XbcjLo%xf28W&!T*djn!!w!blQVcg^Zw90QM$qGmCZyyqD}Vi+VrH&)Zwj%983T9 z-TsFB(@1?M3z4>S>%=vAEH{q@*YbJVEEH1D^?SC6TXyy1!!`l28Us+<^Y)?zgZ}dA zboXx6tdMs3^bqN@6{9=*{9**W4_ff!cW3gZ$5&cVB`KIjgvRDhfQCnrQKawsc3n)L zG`_O1#X0W;+L?0^L{l7`g~GpX#&92qnREYk6Hgq!X#H_{F{MF3{0_9mZtGa-YRy~e z>dae-@Q%(a8$+_kMg}x>sOv7+0osb;iOWESD8b_XE&2~2#S9b@cc|+TV=UQL;8)~D znLROzj;Altrb)S0C#x9*bzC1ej)p$ov`j2Ss70t(Fo4l4N`v*@Ez>I9{*sr{9>?qH z=d57p+%c)NGT7HDru!%7UR7&X1r+%A--xzq$0IiVrKtjKH$FfvWwh}<^p=#pL^j}W zpojYmLvlXRvP$iqq5fN#y1U)2S+^gP$ev_q$x^6o1$?Igs|%XO*Trt??SnjJ(X#mS z{_t~YU}9$F&idJ{$G5lQ)&m{bc?>k)qzh$avAS8EvSvf0%G!jEdV2VbuaTy=$2#9t zwhc&d^_qDjr7WOvPFi=!MigV619h2GLIquH6~>fGvtHt)_nfs>7V4aSSK#&cIo(p-w}YMjYZdG!4t|e#iYp^CKMfn z9)hfIPDO|c73eZJPUPwo@1x{03d{Hk$Bx>D;F9orUm7H}z0<#oqN>|3G-`;;ajwOf zN=N_0*E+T0Wk6b>BKzYUV5`c>Hv>yS(cJHODj#<*v5c8@ToO`BIAv!|Dp91&$?M!PwHY zM#+&H(MUa+j9xvNrv1jUVu>a$JD>y^YMYr%Yd;oJFK;3#3$?lT3pD77W3*6wpT|+( z=Ft3hKQH_}W+AGy40=4~cEvV4;iq?#t&OhhYk&IQ zZGFU?&*ja^?cZ~=)l?bEY|cynzkB|>Ra3to^Gxx<|*I--#vbXPjhOh1>O%p2E6%ol;%}SD`db9 zs?*s!M7sWdODq&qKQ=h@z2fzm(pgo9dcB~^OWN}Oa8%N|Vio*hjo;m-8n`_vVrWNW z0AjL^Ld6eSjfNmEj1PP6Zu|aZ&#iDxwsFR9=vsgoNF$xVBLVtH6@dhtjFK6$wf}?Q zq;5z)fmIY+12E!WWFduKbu{o~P2b}7bmYH;TAlFp5sxr@$=)p8hps{xaJUzs;~NJP z2@`^RQ>^Qu4+>F@Mh8Pw>yAopCVUjYXmEHyVsQV3DB68C-&rT>)dts9Fn)cfuyWm+ zdfjwbZ;wq&csREa-NYjnc1cn1nm=kIwzjz|;N<+P3)na|vlM2bNm2M zGvdjV9h%#|zpCi&=O=CRC>gd`1k^|T|GLpQ$l3<1yeeKZ2OGq2JtP?aZ-Yi zty*kz@aT8A9~Lpyhw4H{1o5Y12`g>Lp-Op<-Q7DOTdn#{9NTFv{I!5Us;qH<5ye$e zy}v~i1Wdg1d)Kd|u8u=y@K*WSi|{*Mov=I9n5X1fJ;KO^`zbPUu2s_oLaPIjT2aPH zh3z|wLu57 zs&CJ#mTkK*rCkObSBaAC&9;rc&0U+hzbeFK0PF{Ki4MO^_=~0GU_*Nb8}+S3eiv8@ zJOAv=%b;^@KPf@hYdcea&3ElBD9E2x-IH1fb<#NknHSbR9iX9^Q}?zdUD#iH=!mhH zlfLiVV=5;^-^#b5CTA~bd>uH3l#K$}8ysj&6tZncR8=80b2pJ&f}81A8{fhAfNe&_ z0W#pX@+WZ#v;NF(J2UM#sUA3tPoU|Rrsf4h#iCFsYjEXuxYIFZMN`DfnFNGcu}X_a zsV~VXa?Zp2et&oum##`Zv4B9-_)A#dsDk+#lv&|+^V_U zdNNC~^-GAF!9fIviHXHH0lq53>`bPq40u>q(j665J}hT1OJbncF30DNJjnNiv<%0@ zUOQNp#P{)#x62MU?kN=V(OT$(Ub0Bl~8f%1)U-D46M;Jf=Okj{DYy2Cnk&N9=s>6Yybx za%I>8F_)~b*UZw^IeVmPdIf=DpaIUymVy7<%h>J5y{o@zc40Gu&yU_<8wPe0lYjTtZ2u@SPraK4RVMMTI(@P z77zz?F~Mx4H#q1dH;YL#=y`{{64*MVB(@^mT+jFagm|#gccIm`6iSi*xstl3wGOQ& zjIffdR#{K{#9K*1UxVuvQv;+bH(KYgSPh+%TwxVFDn}2J!PPVW(5utzRqM}(K4`#` zz+L{ZP|adRrecvYg@@=KW1AWK3+i<>g_e;{(?w#OKCB#x<0n$zer+wf&q5=-Us2ht z5}NZ&cHiWZ=im?CcKcdfT|qs(zmC9-rpLRqey2iOwm+wJSQawB?ho*4lJXnnhN}}p z?Zqo2TL!w)c206=K;Rmwi$K?)9jg!wu8LPPW#e=PC$c&AjLSzmluAZug*m=MnALXX zt4n^hZ@j2XMYV>A=e*u`80x{;D?s+O9SiQ;92oeTh8prUt!ttLRi7><R$@Y1;nI6oN|cMj(=7CX0^v&OU5WIby`mCbC@^2*FpAk|mgnb0I9Q!r_4 z5j4x8Y*kf>d5X8B-TML!;(gby`fKX?pCxHms!5_=Qtb8eZu_YoVwLz{CZK#3T7t|` zlq57Yct8GeY+ppr`WJlRWPJa*#+Cal)3{B^h_X}HRTcn_5Ij@=&T~X77c(b!ei`F) zK9!2tEAdb}b5POJ8!ah)k~flAt|vnz9PMdNj!)q#OFNM@raGg@ssDbNSYb>I8c@ds zK^t{lBpNkYNQd~_inV#qMkhHiM9k5`F@;HIJpv%-_fC?F+f+BpF?qP zo~RGfRnN`?X1uS?^!-x0;5$1;N|4ye!JA_8k2lENo;k8;hjaWz67LfEBtFQUF2x2=Ag$}!JevcbkoZm z2C#t1;r#aN^Fd=LT(1n73oz#&2Gmeh$h=nS zs6c|;Glv@&Jv`YBD=HUQO;8u{LzRdbh_5sV%rVOaDeh4<(>K+Wxuu--@}>9K-zxF2ER3WphzL<41f! z7MX;?T-#z3Q&5xZ$i5-3C(MCVP`_-tjx3d0sbkcsoG^7m(F0Bue3g$ z63b+>J`_c@)b1bEE|3&07H#O0>Q+vbYgtHI<3U3LUcSkW6&6ngL||=a*`NYyQ4ZFSC%<0SV#)ZR&RWARKD;ljyD9Q zsz)wI|rj?cds`LOHTxIlVL1W#{j=P(b%%G^mvQ(1Z%gL`OrTL zXWQBSs1oT09TPYP9b@dO#6wH*XgcV-!3!9#tcG6bnm6O3FJ+D2OOg4?1&u1DX+xW5 zb!dkOi{$hQ=3!>W2AjE$LJW3WV>p=OlTL!++(6?JaB$rLA|9BPc zdAv4e+W^qMHLp1Kp9?EUB0WC$uSI+v5Of9?_dJ{nYfB0pSaENBn{L=$%Lbj?Ge!iN zYl_I%DC(;&BsybKJh=itoQbn^YpNR$SwzB_8!N5u6z&&9HL@P?|U47eO%cSZr6jq zKN&u(5rCLNuU=nUvA|-anq1ej2ZNN0u8*{BuOL2H$VqI- zJ$-#_raSe7yTv>*9R5>TSdW!By-Gj&P3a%hDqRFSiiqn8U&~da>}nST>Y=})pp>RY z(0atLh)ckM8Lb}LGgOt!&uPvVSjm<_D9=o3humI?`A_uJk$UWj$o8uOXU2UT>>zEs zPNUd-9>hWg21(np11?RnAKXU4-bCs^ze#|Ig=-tfAacB(6T`Kg;0mEZn%B;SYZY9l zUhwL0bsHJ2Rt{;^Z+7K%YPb_*5@B9efcq6JQ^zb5F@H_}+WxHudK*~rn{{{QOOs|B zY;r^CS@C031v~WWqJL`y4>)s$8SX@cXaJ9>fcU$KB+nIB44OYzTH@(}JF#iY0ew%l zJv+T7HX+N46SE-uq(@|cH4&zmm?vyQcay)N{7n>E*?f@-C4}95 zWgE}6OrymB%TKz8qecK5mrOT54!IHsG z@TxdsbMkn*1@NA=9N|_bF1p|JJv;ESTgO^ooul{cj;7!;DR&{!YL+HV?(Ejd)@2hR zI2SJ5gda&WE_dmZbyNgpErP zdv6wu*)&l~x(IC@cH`-6zFTR+Dp1xByT-$hnMBe=QhqymNHDy6lI-z#F=(D&$SR5; zcBNiiv=Lj+YKuV5?tbO#J&zU<_mrd$mVRw%$G7vO`2pp{v(XW1={7JnW?Ei9ur}z> zl_6u=O)Wa^vk5#utl4rw_g?Pp3mjJOJAL(hDMv%4f0Qm4-bd`VlIIONcd=EM~ zosePO?MuEm_2Ny}6d^}1(Fk@o1eGXEOf??<4PSDZg%S;4AKqhuB}c) zGan)w1rqjO5uXNW#LgAl5$(h*cdMv8&Ei0QW#u4RLHcif#nDrJNq}KVZ zD-##i3vR#C#;UA~Y9I7o%vId{RxOHFHqvh^Ft#Qs?vqc0>c$hm$XN!x&P$yeVz~%p z*fJ(*UL7t)eP=fprwBj`J6qr3EIv(ZN`USH>s$L$Q$)xGw?r-2ZFtc~T;XV4)s%!) z4%=IN2UV`i*tK8cTD6&%UI~>cQRWGP+p-kd9}gU9(_F2WStDGnl`guEP$1e+sKhz| z{1}3crPbL2YdxG|ep{DPZtaOj;Mf@3oVw>N^Ey_xbtV={=C^Gs>UofptT=452%uV| z(V}CgOwfq6h=q8ODUr2-iH@ub$CidhyMM{8SI)hE_uPyLMVO}(pNH0;iu9e+GRKZyBc{#3QcSo}7CcS9g7st?+xSNYM1-YV}sOLI^a zd{DUix7p3mn8NH_rKaP(MarZp6Z2Udj2G7%>4yo<^G7VaiK|Ez!{eDT6M!6#3De(Q z!&mxIbPsk-q-6!CQkgPz+n=ZM;x92GqZc(j|es{EKxNh)ba^EK<&xt>MhqzUBd0o*_@HQcckRT|8R2uyl=O*_Dqut zYG@ng&s^8^l5RZa@BYpv2`K4bWFvO1K_={VmIzWcyU{GE0y9z?302uqY&ps%M79mt z_G#~@0o7cePa&GfJU?&fKl4miVbXuOx#p}(tN+{Yb-Y)4&@h6K@}KKn4549Ktur~Y15t5@t zT`aHM3(a|*{A|*2mK|tAgQ3Z#$Wb}Zq4FBLz;I* zwU!-sd4fiCT@rm&*A!uJq?Stl4Ntt_>eI4Ak8n`e;Z<8}PA6YwYjSUwK#|PK`fdcY z8|FPTXNrFF6P&-_bRb6lWAAU60UQFpU-vblJ)bunN~Fp@K+w=?2I)dT`x3=j#Pb<( z3O(QXD1mE4?XpnP7CTI%8%eJXqs0qi{s8phT(Cv7}F8v;P zh2afqI|XElQw`~!|GYc;AiTokF8S*R`{f3s7nhC}4e|c8l5`gzscru4O1=;B?PkSp z!nuQ}5@X9X06r5F%MM4CZiu_P&tQ`$9dtD^#-kGO0(0Sd>a6Qs8x97M87(bodS`0bxHP$>3H7pHJ<{jCo z&NaFrqw^R{E^o&=9nw{^UvPr>d6W&|?U_8X$t(OJz*MO)Cm$Z=TUi%Ah=LDF#4sv`EEp~ikL2Ea692uob#Mc>BrdopZu+V9&06$Rkd>QYkk#7=l0H@ z?57gp0y!!;QZf00+{4AcqEFh?OuVZ_w?%{4q#y$)A1Wqma3B>L=UL)Ko#I^jXp@$` zY}{I`Ul`{@E1ps>7v^EWpTDF5tKLEG(ZT|NXtxqIOwIgr!BiNmMY?{Vi_mP6ADcGe zRA;1{TAm3V$>cIz8UgxK*@^(X-pbvZIw;*mJUc5qABsH>UI7Zv17R~Mc7(~OnZim>SGC^xY zXo+S7_pB-Q0)nwtn3bz@LP+$OLW|9cY_ds;lm0tZSQ&{9RLME;g#xu{fFm4eh^U;3 zo8OG1yw%Q@%~o@aE9Ygutod6hb|T%b3|0*{N(GyhV&w0dL>v~R;xB@9JLSqp=B>V4YF^wSA9qI)fqcCXpSd)ULq#pda&!ItF9eQM(k1D_JT96=Jo zE(h`F(v1<(4hLsUKev|#z7QOcRQX_sH1r-Yl1nklP;g6p^8&>|s@vy}^m2fwwX-Mw zA=H|6V13K2x`Xu9r0+i%j-fyQ!EmHyoQ-V8xnBE_#e0S%9i`xg&nA{|M`tcfGg&zb z#o_#s%;;o)UBSFBx9Ol}0RbiRJ~wLM&zXtwaQ?dPyFc$Q`ZqB3fCgOqTJumxi#gPrYpO^-wg&p~WYdM08 zOYbqRD&amna9kSXpZk->Y^BQm`!6oh;)= zH>)ERk|eq6+4Sey>!3&6#6R_C?zv~%_?0`lB}vHtOXAq) ztUKTc{`n&Bv$?!igzrBj4mYO}`rzMN@X?vy35vUJFR_k<7k)Usoy`-``;VW-YcgU_25LO!myA0AFm_XeEMpB_FgY-f+6 z$lCk1phNw@)$pg5*E$!^rJlCpn%M6>;1u(B|ISLxd;IAkpWf$mdyZ@%;DNbi!klc3 zR{(R!Ae%k%50q7~;NAyzt!?}JtVM5tY z-t)QqC%ygBzO!;0s@LadN<`K6$Q|f%>6Sr7gEGz+*g*kgL<#ksOU2>OcG41&1wouk z%0}6|79SeTG$eNt-=E%b4=e{2Y<--R#LW)WotOC|g6I{4anyV|fm@cux;^3R}f=O%--bZ(ko9`>4#>~HC1W<(w9UTKT~ zutV4)=X}`O!ZANz4?7{KUix>o-yH0)laXAg3z95Rfb0NF@G!*=Y7dtg!r=KE@R*ye zn)NrX&*%70?j1h4=c&``r%T`_TW?^F9+8|egyq+t`Bg-bkOboX9g|CuZmir+dn%MH zy`X))C2oIZkwk~_^tLGPj;`%;7gqo znXlovV?Q?mY%fE0a!&v(dXgwC8X%W41sw?^jw2vJ%3uyb83j^^T)^^&AE#G})YtqD zG9a-FL?2Yc7o&zewG6xugt1qhlIRpl7;B$Y{S?A#qet!~a=Q|>$JxI{mS_oDy5;J&XV+tas*g0f3t2B$y!E zA7NwUmP2ngFykI+e`|ChjKk+v;|!C4uro~zdx1oOFIXtl!op3I${bQQo$f`kPD7QnBM1oIutPk@L41_H{jhX@G^qlD|t z|C}}EZfWCfiAWw7;^Yq$2T+CkX$OnwoL<0;mmluzJ5PLIAL@yRNXlanf;B>n;Lsr) zABv}4E;@<8mI$7uX`*~#(mJRp6UI8xXiyQ7@o)iBFb*j5Z4B8%wrUl!X&2mk zfsRW9YKTLqZz#}5aG6P_hM*T*$b#t}=9EAJVf@;m=CMV9=$B3j2b40N8iqdd`KT68 z7i%643>t<-1IhrXxD@M{zpjXv?TO$VQ!Wor4+&J`|0e!^elTQC z`vhoOlt8-3av+PI1^GF*_=lavMlR!hbIC$<_S~Q}Sa+%45)3PZD3nWhllfM(K znX4PjE=KdO8-p;@IN@lR&_wC!B)Wt#N#i{?f2-ZB7J$XaoSuhU;>fKE>l?Qbaovj}0N8Hc-gqotcAjQvc4OqYUk|EgS1gIaK=_Dk^-G zB?e(+NZyA7)`{QD`pf{-kcnwjFrE0rtcGYtWnkzC>2a)qnP_5Ba+3TgE)x14Cl+a1 zF6Yhh8^APax2$P=)LWG^}(P)ZHK$#J@o3G=A84#uq3^YR2TKyR6U!JXH1k z8&-N&!=m48DIz!pF)JyLJ;EsizQdv{{TEhaRzR#E2&472^iQ59$)f=EJOy|fL~~Dn zZ9K+q8RQ6f^Hd6qh;#U0H;nPKd8(-QoxhPwmlcr1fGNpnbqvk}e(c&pU9A2MiaM`gb zSs)<+8ic2BY->o;{TMmoRGDeMfx(~DRDc;6L>h=MMO#c>q}8F3SutnKgti+_?!E3ZpSAVglG{+d%fQWanP0$Ug(FR^FD_x)jC2 z0$SvzsAr8o*4z|s6CVs$MNdQh6)VHB{I)vcM228y5;d^M)gEMhJYIe#a3`&DLBNZ0 zx19GQL*g_Uu_u`eH&t+3pkGX>TXd|>Fq-~VFO_cqwMeMM{H`6ly;xYG^+2JJW{^>D zS}NWd{x?D}$sRE{q-g5)LZP2048E)u za3oDu*r)!rx|87TC3sbZ#OkJ8Y#Qh!kU#K%!h*cqmS4YuwM9v&I85db4Teh+$TRt# zo|rE)j;-la5v9u7Fu+-XcMhB>TbDJ8OQ{Ml##Z5+hLzqYOUKnzh8czm5on6Vtu#P~ zuf3a~Eubg3T?ZzT-io_#kcml^E}+Oo9K(LQYpaZQpe6k+@q=2fjCSH!@z;D1naRGc zqFIxSGV7*i_^HEuMn|QJPxxqToJQ8%lZGk&sH5Ur?>>$NchWyYElt3_rUddk7cN#{ za_1ckNBR+L&_Kc+!+9YLtbc>oyG*o#el=-r0w#TDuHfB|_Pe6NtzPT_RKy)5KSD@u zf_RQx5?IG?{Lubrsd!x^f?t))GL2Tx)_f_N>+c$!o~2Q|KZV3u;m<3m`huuduLh;+ z4V;;Ir0jG~JQyuhYD7T)q!HOOYoITwF-Nn+RP$&f*}uS?n$*OOBk&6b;$m?KRDCZ{ zqQ2pB){zxicIZS7aUPOi)@<kZH)`)@A+<`vd z8MJ>O{0)k#4(}fBAD)zlDW+2V2s8O$Q4n1Y6@9?-{2I&=t2WVrv=3quLZ?#CWn1BFANa zOm<>0GSZ5+&@!ORK@q=6KY`2%M35+jmH(Yyg}r;~7M7f| z0a;`Gy*{_|;E1>|fdu{}brNUXJVwuenfStnJ2IiMZZXD$OgJ* zkQlMixjPV7197?XqTs)_F76-*KZtXHe7ZZY_px&Y?*c;Rr zWwaD4smizRv=Yt~des>s*XhcYZ>3XnU$B%1eV{Kf>32k#jO$1kZ?Q%&CbE}hn6aYE zqp1#(YauFaXk{N+mWlPmABi)wjQ**cF_ZduHEr9OHD%egHREj$UJb}mczC;rfg3-O zJc84tVCrFuq#!cz?67ZiK1pud9C4-C(XLLvQ4M$8puv4Ideml!970hepfJ|r!=Mp~ zLIE)x?H&J~Qx1l9MN;N4-vX_-2gkapFvtv49RZC4?;lSR;cEZFk9#X27D;HiZ&nL_ zdI{A&{WGxkVlE-%EnD=n+bfuZVd{k@AUZ5Dz*x6b`B?OIvGvYX?@{?Sk@W zm<`^_-anBoI|VL6%8>3XUfK#ig1b$eb{j|ymO%B%El4ri4^5sXN*yq{5e@S4Z%qKV zw7JVp6!~tE8Ytsk3Q_(hUV~+1pePFa1`l7Mujw-=>_*ilHrv^Y6jtcxeWwl9?ZG1{ zExmN7oW~rc|F8?Ax8ncJhS&aPB9b23gWR-4b64~!e60eerk(vw2Nv^c(Rqge{19-U zS~7!uZRxp^E>u8;hsO_s9YOzAGF1Zt)h9=pG1$YDMwvmoJJAvl69kFM+yfUvA)Q+L z5~Bl~@>fZOjhjwf%qf*7w1}1rq^)1-a5)oX*s*0khn%cd`rECR5E?cm#nh~m*GFVd zWYO3AOh@nPK_M-gPkGJ9dum-Rk_Kw@Wp(!N9q$743hF@~kI57y6UZcqZw52{&atgX zVqxKWMB&-1P`+%oQagFuQHXSS_e^KR%Xu`{U|itScI&y^#?gAhwtikn_(j|5vBMl- z;b4ikl01@P8w|yYQ5e3Ww&t^w>2TX;zK}i@hWd~YQbbl`g*P>DyPp0WJAlX^aW`=YCwP+N+f%S_;o;Pf9TG5XX&r#Y&rDfxNj^N44jhKN7EXQi3>h0tNd3NO2W z(!=0RN$)WCJzK4qKFIVj)1sgxbJ@)eXoF~p)U1Ob5-c;q_z*yu$wS6o8kGg1Lx99l zL=)*)8TB-u`M^x5`>WLMfdQVn+MzgBO+6ETgMLAbOC$yUOgja!kiCo73_r)_^cB+U zDf}a zPb*ufP6OmP>f(XP{lTY^46p1TNBB05-(Jl-^)~T3=EH~o6yil4{XD|p(us^J{tk@} zVTwF!N`!|W{?^?!t**lQkxGE!r;RR*i%M54UeBfzC^92RYr%GGsB2C?mRJ_tXw06- zUmSy)_&M?<{ZuyAeS8Dh56?le-$ynI(PitSMF%>(sU$_fWtr!xM{cJsP3wN&5r)SD1WLtTVq{4|Pp2pZ^n(XXGaNhOyJ zw;Winc2LZv%j&W&@%gBS2DsIvXPVa$qN9bFz!8?OMhlO@wHSfCNjeG%{uK6_0G#$F zw>5BW2ljcp0bUZT`{LukAQL7xLPK^oFC4eC9Ij0p!S4k-(UR0R^+UlRE-ZaCw5+ks z+|!tL1x4-!gYEVDW4XWMj9SfdgST7wW@=x7k@^84u*f)aR8^}p=E9k|f>Ihb zc8xPrh;QT@erACF8H9vEIe26WLp5@i+c=mlQSqNzKV&qhcDjspH&lp5-$#_0-@<~b zx;HrLDooyS4X~JQJ3T%yV-C9lLV;)!l=G_V&b~}vH&@|XNz+m6yB(sFfE&WDj(nD8*%h^Sm3z1h^x3SJzvRQ*jpxA=MIiTYPsYWG>_eQ1~$cNArNZJyFxaUt!=PMk0)(95DPvTKw zYKmGh8W4y~3%-W91KUdn0&S!YF7(>>*(=CT7`+1S!5(xP8k>VOgfu?D7m6#OILr_D zBDuj5)57pN7CM4YZJQxj$*04YRE7S8Y(xt{zg*_;ylQX?5<_5Nr7Gqeg#xdDff~R- zvRddx!}S|P$_v@gdW8wAe4eF)D(_W)Kkz2@`PXasjU2oUJKcX7F}P+>SNLjOSnZfD zk~a9~1@A&&CDxTW5e%{4s_48qu?GS$YJs~+FKkKBk;T?gIW~^^yKhR2kMlm938)+jaVH9xF8Og7+>vz(urQH>{GtV z$f!ebI}*WA@VTT*yy#+IXS5Q4Fqoi_4KL42NV%$B@Q=96Lx4zi4S+T1hce81|6NEj#Evjf*uPh;D76!z zavY%?6R9`?Bh{(Py&^t5zrAgmUG3eu&3#&nw%%qdI{2;K{hhS6{Bcei54o{-hj-lb z$fD0ucvG#DtvAsM9&b+m5O*SIW21ZEr`^jwCBQ1X{r02!C`gqx&Y&wl-Mekux9nDr zgXZ-*=$H15)+pMk~QEWQ`sUq^Bf0{x}(9dCY zqbCi=<|nxqLE0NSjzVZcUq#uqT}a0&n#&o!Rg~D3S68e2<-XhpqIdYgHY2M4vD=|9 zJ^%6t=eognVpjV%w4T04H9F9+TWwGN5z(`pis=S+OQKBX(bois(fVFLDE=gbbI-8b z-Xq<-icF;?+2eM*8k*i1ikz~LvS&<%hVI(kOF<{#z3YZ65j;7UZ zm^hs^b$Xo$)wB>$cL){A9Yf^*RXi zl2yK9Rs$Kt+{h&n#}w{A5=t)q4Ob6~oq~84^aU~V5={f-H9JI6CS7Yxp^7kK8}_G9 zxEOJ!iDV$6e48uwVaxG<=bBgSU^Fcvv8rEzJ{FMWCJ&+|-M0!)tC3)*DHz$ZM0s_1 z_J==I{#g#ej}DV!ao;Sgyi&#^Y<_Ak$zw|8r3NGY;BH0Hb5w<7u$F8c|B?>lzm z28U1{;Ptf}%Rwh16ATsgwU?;X)XY+#=vXKE5dSy`@wic4G$P#s8NR)8i)8b=hc{q80I5~sH5ITR_)_`Sccl`djFG-O!UjbLl zp4P{n*fe;Mv!bI0b(uH3PoCJYBc)o%l=5d_0+Sn7lpu#GJxWw`i&K}I`&FnAzXcv5 z0G+JmMcj}`&jMay@gz3$;PFdry=mc8sq^0eLmHet3yzGV|`*|OSWUyrDBu#LZ97l;_MoVcRrF8-eYngQep}l;Mx47GPu;~gfly;0- zY_O|GlfK^~e<~)lNi674jFb#V$rxqW0b>&X8bbWg9B~(330%~H20pepjaCQ?8AHnA zWJwl13eyB*yqw*@e*WV4K=1_JEOq-j30EAb+s9MHTDiqI7?|Ogxi9y?Cxxm?}D0>jYVH>ym-grjpyfm7Lxc8EXj~3f#LUmpr>zlC@;7?vY z_ph945QkE-78TvBmE|NWQT$$brU)W6DDUaV4^Yy-6{ET$*m;_H1Seq+_NlUMMhcIS zED84mLOLG}vu;c%6Qhc>!M@$?(+udKq3Juj`M$6oRrR$xOKr$I2mOxX@E0(Qm zSZ8>+@cH|jUG8x1UgYZGgMuS#!qk?6y}K%lTjZddv=Gp%o=hbaz|>{d9cmJCX5qP#X)EW#er z#(7P$FyD#TZ)?`2FSfl{>ZQ3DwyJ${z9CNO=#>61M8VtwjXK|G(%s3Gsl6xe#8P=b zJQ}m!deFjTz!sve-v6H!1o+=x5V45n-qZ2>bIy+T_<5)L?-ZxoDdn))!->faqKSdR z-!6aG%Y?==@Gk<-Nz8l`gz4BRql~o2xvMlNSy|*Au^eYj``L3YkTz@RZq{ns&Ad>J zd}FKx2a=ZZ_yZ?P@_J`wi#fF6mP^x|e5aMn4V#=|r^gi{_zu@&A_QFVQ+Q|NqE) zP{pGAs&!`Z#+O)T7I*$XQa&|@p7acD8}RJ$VuM4QxUOs195?^x^8gXyLk93cp4b}t z31$urSKal+Tc}$6;w>yKyzIJMwrT2Js2$O?mRQ%v--l$q9~W%(9W{@#j#Tp@s6rl{ zF1)8NXeNr>71Mz>f7EE__J0|7#+Ue{ljcU#SN`60Kspu3`Gd3k66W(`AfJV@x_R`P5|>JNb0^q{vA>O!N337J5|6Ea+n1 z1z+s;W#fHtW_I&%m#wr{cYpXWaJF`xWg|pS1^>?9EwiO+(7Bt5mkwYOKQaDS9Z04{ zQp%F7VuIG_`aNul-edSZUaUu-(n1C!z#NKZAQqj%6#ctKHdU}wWf!2RiY}t|!vtHs zak;vi;L~ffn;=ss;~|(1MvlJ>HBk{+@fX-;%D7q31ZXSJ4Cd|E z<14NaH@;Yy%KZI5c8pY)c{KscroAUCr(YLQL#ZxK#aTYh+Ur|E@E%z2RVc3tKgFok z$Q2!a#3{O_RRK6hc;x8e4lD4Y{^c`|`SpZiC;ZMdpp9*&Z5m_=wwuhUs|3nS%3~wn z7G7Rb``E_&&NDos-nqG8+o9TnPx`A~Lfg}8EZZa+5Y9L?ZsQzEl)sCbGG`V^TwT``Z_wv%X?s4WmfQ0gKtixwGfiLUmz(BM+5oMSQoMwj2q@E*}q62pDvv0 zrtlQPNHwn*saaYv6RywbPx&rzCNh>E;*RCM5zsjVXGKudmhvqezOXihTok0u>7!a$ zvljO@&BN7+EC?$KR5Tchm(~Wkuv3?I-Dqb2;hb4}2>zp-SU6=LN)v;}+ET!c5VxuS zzxX<cXxLf{+YR$tGTJ}UaPLU zR@FIc*Ln6?byxa9rU&>XJe;`v%m>;vMZF1l&N$Q;hs<9mlA5+uI@_4lzB*AGwLR(m zo_!tPH-6r`dU-K(;Oyq-=iwtke8o}7CSH?0fcdI&jRkS^^}R=u-O}N-7|rzckriI; zpBp#vYp(yi2F2&P7c@#NmVGGRVpJ1&E0U7 zZGNJ!ZB+HwVJ@VM^|rogtS~G$JszzV{Pj$yeWlVGd6f(4gkQa4-8>P%3fUg|ozHJc z@Qc_|*(3o1I>B~0@xN=7Kh`3<&byMtZ|F3Mk6Wt_E}|vKk(v66x<=Y4R;Y0WG)FL( zs_!ZKL_w`6WmZ7sO8Lag{T!$#*+(Gc8M#|M&3i;R78x1ta?WF|aMoco>O z>L)>XI-l&;i!`W#?I|)C=v58s@gQ9^$J$nS&XT@*r0MJ7VR?upDP}PvDW;QGClGBZ zgO5)L2^#qpsD{cCnxD#49*zfLTug*EomFxYHF)zfS^vCFI#L zHuCP-f~a0mn;tpt6ibsrAiBCbhwM>;tv8_|w7k=(r{+_`+F*+sRy*{UIWfXKS6#BPb#e*BC z7l84%xy+p{oT($n+Z+_v67peU2iYno8_S$TeHvY{LJu3Fe=e7~gpVQbw*&#zGCV;K z166IaT$9-OkJyz(k_U@5oK;sgbD^nl;!SN1sgZ0Q$DYU%wX3y0+A9c(G-N^IQjnV~ z(Y!&ri9n&ct*qXvXz&iYE^W>?@DH~xHjp(**|1EaR$$I+&HD?QDbI%IcqtscOY3-f z2RaP8uGF9>BRHQ&Mfbh#;ojRThpws{t+>_+Dc=W^wOZ&`O#aXUPOez=sr|vNu&Oc{ zxU1Y)fJV7El5ddI!1lT+SDRX`)fPr`=FhrRwvS!;J{9;JHRsY^oP|otCsD0ZHUPFm z&r2{%PMsF&w!qO*hc<9N$tAddYnS`1G#~1Bmw9oEM?-*`dQnX!O)18V(F&vLe^=jl zph$JqE84-(bQ0V2&O#R(1nt=n6n z<&TWdE22b{vbVE^=V|D$RiQ~cu;|#%^e&J}8$h)=%Of-HiS6z11Avz$xTYP8|2NSE-T-8%%O+V7_|CF9z(SH#Xrc1`CEy2p7=UU7R>4n7hn;c*BkhKaVXlnS}w|@8>mnf8+%YgnOXkWYU zx1gM86GrTRGk`|3_koUHW7V(msVjZZG-VUJ-wrCLSV8Dwyr%A@p<0{dqZIK*au!Tt~Z4)BR zA%d>Rr22U011ef2j;$T3vu*bbc62oA4Q4W#+~|NSTsip!8d&HzkpzeC1cM+EmW;RpAYQN7Lkqc_(EF9r1-jO;uakx=bYyLYP@Lck1-d8nb^H@d z3Rx$=oVTN8R?Hh(A!SzFANz~{J@Dj3;azcttn4mLDmR z=e?PWr2QkOwPHC|Y4PlrQc%=QqR;UMojR-5q>0&);HecKhdA zMS#wciFQw`))2W|M0Yyopk)wunKwvX@E6VOH*=|P7jgI|0%4@!nX4$bk-?A=L_iCr_ z4gDJiS&S$C`~F(~;EqS-*373P%<&zHd_Eg;Rm{#~<(MmI&;hGyy)1pIF z?ih@05b1uJ26pHkP4tGqgRx(e5aRL+W&?^%xZKYABGlinB%3vSYZZ~#r+#FH^vLmj z+lK_33tv>B8a|aaNTyAGuKHV}5ZIyiyV|s>_Jw0uB&`m!L=<}9v~yU;yaZF*s(V;V zuGx)wS;i>wQTn=Qo;--MFx)R_8ar|F16aR=vTV+E4;^S=m|g}#7rp*RLm(;k=s?Ma zuIoAl9lA4TBtcRBgWIz0!=(*yXwM4+y`j+|rJ@?|vzm@l= zk3YswRe6XFZe8t2X029~Dxt)CWmGehmejGn@eC7R!k-aziN^5!+L?kKRh)t5pw@#b zLHd=NGF;xOENoo6-c zg)MdS@5LsK!}n^HyCs8IfdA3}MSQrwBEes#xzyg+)B(nH$)aF)aceOvfAQ0fdG$p7 z9{PK?M~XQ83($eD+bB-FzRbu2qg7$Mkj3uHt5wxcoD3jM(KRI3BlEyTNoMBG)#7bp zVt$-lEgip|8Xy@sctHa^FoV77a1|yd_OUDGT3(HzWYMAFA|L#pO}O1 z-`>^BDl#NboKk!+?QJ^vF67t6Vy8CVa<xdG`;{i>AHFH_16W83`_m`(rJ^FE_1r*?kcCmS{*&bR+mMY>6T$ydJ$APvD7 zEPcG0P6KCX@Piz98Ti3oHEWCe&UKxgJsmpG6;&^7tgws*>xHZ8U@tpk+=z@;?686c zNv`w)kPTX&Cd;9k4K&ND^&4!k2?lp%tT#58Y&xC4+43@>XYn zww`yL?wUPT2$3~y!{CWO9!0l|&T)lo${O#B+-fODDiYpsh1zr{&mMSHfl`0f z@BA*;X**gWPx&iGAy1-29qVb|qUt*IH#CH*>CZ1uMi%zTvT2;}VP%ryWOCHF!_f_n zv;np=^#nD#DsCKlNDj`jd~vh&<>i6i{QrU~ka!m$ojk?|Y4j$mz#RUnS=p91>KFT; zh%b2U_fJq|XsE*tKqe%lt{_c`Z}L5?$qyD|)mUT8UCg6kmcj3bVI4N-`aa*B8FwNv z4r4?KGkV}oB;flncln`JI`H$Vqh3BF4+0AcX2*#WYFiJ|uTbIz3@AOkPs0N9{4=`> zANK|*swfhstMeHm`__AuQz$v*1P%0GXTqp*HIn3)VBSseQ1j{T#(t4gs?!WV&dt@~ zO`Nm<|HbJU?9V5ws^rX{Z4q^;{5hPH6t_*e=Kh7zVL?{bk6Pygo%Z5_?6hMs2=pgD z$+8+fef{3#2DbBX+56MlDtH$rj&u!qhfDK5J4TJPzP8`%f=*+H_3OFdXX{}`20_*- zY%x0&c7*hBM|`7O;1=ina}BBIla!{IZ`GADN&D7QXe!T!CCjc&{x=Iqf!wxZ6W(=a zbemyqm@)ILV+wucFl)9p+UZT~0B2?S(G_h&)op38qO6)Z8)t0!g_V(dG(-;j-1URJ zb^|wWk(4HO%~)bZX5L%g;D-BC-^o>KF^&<%aDvuobzb=)bPIUmMPr%FzwGfoWtF58 z|Ayd&?J||}UYEpxLnM%3k^&`JbZ>%G2v{*n@dh!uCn z`*q9f=&wm+po82ZOlO@i9TH3zvca+Rovw7nt*WWpqqSqz+ObnHdW`#yrx8CBP${TK zMrm%w&pc56dQ(tAgZT&09x)cjBhQuhO`hECCA|mzJxt1$i+k>zZGdA&LPW`fPoS>s z+Y#=rrI)CJwy?z1YOR6}lUFqm+{HTicr$lyf#0~1c1tx{w~XlMfsaC<2Yt4q9B>GY z{ueFD$MZJTPriNr>glZw-8=@P-l_8wG&&K6eu<#KrY;D{^mwSI%9_xAyBlWZV2b8f4p>gs&mZ zT9xo$ea@Q;XD#4%5QIG%>-m%3QKPAyOG%{h)Ah#R+ocmWY-XwdnD?T0*V&2^f$W*M zD|K?^M2WHj@0mDDHigcuG(jxfH!L_-i`MVtpfKDwXJ}l?dFgTYp$r2UxtCi3q!ZIMNrGq^uJjrllh1gwrN?YdBL|<-Us-#)~>dmHQ75Sv#=|YOzde6 z^Fj~)3lS9D75hyC`_=Ln8KuLGv{XGt>077M$d?U?dmG~Xb|4b2^>?y|0oRS~2&8gD zE03~{ei7VqJAK>!k@fB0@C(hT%|c^HF_NY9D$P!d0i2B1D3jUE%}y%;U{m~=Rkm)P zvw{znk6i$14qfI9MQ;PiUPFjTJEZT!wxxYVzX?&jM9L+UkKJ}E{kQCQ!y3BGty+bv z<156lpS};mZ?2waB0G?A&l9GPvDnSrycA^o+O2n(>sbMRv0cqWZrwe=S#=as6fQkJ z2be4R`@fU*X37Gq5WTiSBK&%1{r|e47M^bU@74it+|JdoZ7YQG|0ls&_@4yl0;0Ho zj<_0@exF;e!$*#X_w?KUKi*$VwLPkb4gdIo;;~5yYbSKP7F&>11uY@S`aRn(aFV@I zo`2mBC7=N+Nd?TpK%TyZn>U3V@M-@_r7RE*H2+UXZ(LP4C3UUnCl`PC-_KpH2isex z6bT(oq?qP^3OGH;u}lAWfGOxh$5KO96|EE{>4(?cu=0-U`DRZ9udAv0!PoKrH~-CW z(e8h56~75b1oQj8Pp+@2HD#^FmxS{~&yC<*(nH|Fa1uGtbvta_nG%^ip{b{w!XdY5l0@Y+%Bot6$;=gj4; zRm5smhV}!IMQmq?}na2uy1#ZNb9lh>DbbPe9Ez1+kwS3y^8o=R|sZvL%4CBbk=P>#IhqpbH1Z}enoEWBYQ_rj1%B<-DdOHNqc2wl90+ z!no?c6>KGLE^KziJ=H|xoEZxzjkeCJX_TEc0vLDGvuZ|g%=$WXpv>QH;P)#I72ppsYqMWzOYZR z*(8EqTxUUW4*Tx*XdB(oZ`p4BW=Y(LYyP#aoEP-2E&ZA;Rh&i|&T?gq?(3vuc5Wbl zfWydyWf;@mY2F4EQJuF>y?5rlYD~R1`E~ZsWaAE+?%L<`V2;5Xu+R6dvMO2Mb6At= zXi9OJz8-hB&_(_o^P6&Bj378b-*l966!Ibdb#?R3*RuQG$S|Se)~DqQ zn8?1!&i+Uze%_zlvA#ZSvl=i_tV_>#-~ zL8}{{W^OducwU~UaB#F@4XKVoz+kIqMX8hbDR!--cWu z=NlSHav9&FLk}O1kDse|vyZ!B6WTKWWCJgSXY^!zfu*xk^PhQ>;lwa z6-&&{GspXhtG8|GT`mWhdlV{vvX2#)f!LcV1pk{T*4Fx)jHl<3XexCtWU%Mh8-@nT z8mK=Vgj#@u`aNE&mqz$)mFqE#iYD?1yXp{uW>z%m*CdQ9da>Fkek|Gj(j~tE(a$GBBte4-UL;D&h!&ikL(Tr%D|n=Gpa2{))SG6 zs3$D)a+f-wPl*!KM|DR+vpir+S}LS9`lgj@NUHQ|JUiVx&mg}@A7C*bF-||@Evx!o z3+m=qM4b~0x?<2NE(;qJSMb}L#NO4cSsu3Nl@IbQtrgRoj@EE}Ma>J4&lHB?KDh!< z5hVf(s@!BPVc|&;p@+i&ShSjPTD7s$1a);Ty*3zZFRihWG#kl%DE3&G|2*>Xnf?ra{#XtuXsJ6Qv0>fNoUxW*AMyFHDp zQ5Cs;3meaI4Y8zCZl@8w_|i5~!7D~zP>j>;EPJow zz)Mqzx;y9d7C!hA5Q;*)gUNCGn-euVr*cBPONFQ}I0N8xrlBjf5{@fqA(1X{&cBKL zx@U4SS%*2QOO&A#zaFJXvO>N|(m4#DLJ^q9pQclHZ7Yfdh!)nT+RhZ$OGD6+oT(aX zzllqG@IbEC|KnsEZ}>LDECkIPTXYImHLAG6dto>-5o_#NSZ1wl|72^cDe}hB+9b`# zfm5H-9X%I{0Ebro!$#X(0K92=Ptx`&?&?S;2Z?Rlffc?b+JJoPqj@7+^z-0aY)d31 zT<++WZ;PA|P+B)|GZcbL5X5TQlZ<&XuZUdzub9PCoXkj+k{9JP`nVyGDs&$I1l4iY zGx%)sKR7654)(P6p?R$QgIlW6aB}3x42jgxAv~y}qXSqLx=5xg-M}?O`=YErkFUIC zRLkGLucCxSfru*`6&ka}&D;#Fd)%>3uhEVAv?9fW03{3#-5rG zX$jO`g$HbYw8EeoIv3TN~$! z7>yB909w+U_B%UO2jEyj9*|SaTqDFtIrb3NbN4VqrJDYcCt!h-xg#R#=%NG>IOg8j zzZ@5xPia4GORDlZ{P#MiCj86eiPJVJY|>1ykT7FS2h3E+{|WU1<%c=gd?S?mDjx*T zeLp(RpUEy;CFGNmh29F19*yt(%EPqQDUf({2SC*-WY&&K#9)@OD*VCsq*5lSj6BP8 zG2!e9?2DKD+1CI*YR9`eu`WIbbp!K52IByu(2HSpIzvxOiLz6gS8f;UOO`EC7!?gk#IG-{*1*>_vS1f0C&P*r60FsEbooGTX=3CS7F^;8 zOVs_^VJ?d|^D1563ZSFBnh;g*mz(?}o~?jS+9lHxnCuuP?)jU;LNd%Xu>!e9fsE@r2URtH9 zdboKe3oJ*jkGg<9=QNnEIwA`J2U3jp1%7vnxDpc{!j_9qXG(H*OO3(rkC)4iUOC7>;0Pz}MXU?hj;e=5P>UM9=L7$ zGn2W|D6zhioOpGzA}O||9l|C5EU5_}>XWO_={QG`%erh@;4Nl+Y%|5YbZ)RJL!FWWOmjz>SN;KCr+qRbi7&IZ2fovG1bl@0`@##1ZL zS-31$e5LaA75BZ^HhlWnP?O~M(l)iApmWOQ(m}7xkHl z+EZ^f^dgcltf_q*NM5nPL1Xar-_6cX?f@qjijqO*cKKmMZJP{gg&+>olE!{GU+y3W zW7Efcx-mv}qcggi^Xz;r85ZytAjaX@bz&#}{76U)w^1iu_yFrWza;-#`nz6EE`E0B%HnI=8>B_I6$ z2+krp1<~mCPRmxYUP zT`L-1F8aw?tk=KV56ZXWv_0ldQ2p^(Afa=vikzrk*P0(xm$U5p_B%MG@{Mk^_y(KF z3#=85SFSAVKUgTqC7P07a9SRIP z?qxm~xBvvoeE7LAiR1ph3nh@`2GY~VC__ywvUYM>^7hrzM1V9M>o}YN>0cgG4pfDm zNbGKx7~FA(&7~uW(2t9ZD!S=sT_{&!S(e+b8jtBeB;#2v)gn~)LKUYdS+iGVOFGB3 z?f@jTMf|_qL=AV>GgxPmQ)&8Z9LRP>DQ?g8Vn;R&B7V?dh*?EMTn`M1 zS~47?4$(v3K6ZF{>(;ZAC)dmAT69$H&vP(zAgW^QCUNvI6rLk8qdyMgo(dN7GA6Ec zQBaPh8G*>T#4Hdzv>SOA8OI-XJTliesW4`kcY8ERb43<%8<4uGfPiUvM6Dt6usB$hHQT;}bVOPYGlf)H%nxKgf_b!3Eg%kg4w}59F3hs6Q z11r0I5BaP28)mK4Oo%teg)TfaKj308-a&#+`Fy8dz(RrSAzeWYQdGB{CO8$WrrWNQufZ~FP zuS-Nz>i^@V^fK8{`q$*MOtPTeln|Z-0+0A>s-l|`LRaLJcI}Y$%hSa_Enp(tQQ_>o zFAVga&~@=_MVYvp@JS(TTI>+ZOIjJke0U}!+P z*<3!$6d-@l^Lcv@h+SSb=DucmHDJmOgIVc(gW@iKC1uU%t`u$?o!JdPtIdbEp$Z<& zIH~ZMwG28wmo6JvIWR{wWDQmU#KtCRa7#Pn`gY4A!!U=Gz=ANRy^){B=d99)B?Ps4 zYaV_Jyz^n*PQK7mX@z%3kEK}hz!3sOmEiXG6`!~WMm7j4O!zW2$@>6Pns^pb8EMjQ zc2L^4CLG%^?RmN}HFEL)y6r|mBza$llV}@*b{Qc|;JEJkG7d6$4rOISX#7vKcq#aP zGqw4yrQK~Us*hN}-Hm_Z6dnYGHUIa@u_p*IxWlPSW{+=(v8H$0VIzc@sR3jJ;d7cV z%U=tmaDs&GLTci!3AoP>xLr=g@8m;eeHdS>wgXu|hvO<@zzJ?YwZJAYsMZ-pT^V zANy$I2siC8KEFApi#wP@$bivPtn~Sa*(xJB(e**aEmlknR)%nx44?H@d?>xg>gMcU zg+s!05TC?j%6Q8iyxdzY463+tDX#>ZcXRuTh3#gVS#+}Rq}B?yAjK?~L05fQcju7D z8!pTyqC*5RGOt#Q2KElgc#dgwfenivEqElRi8+y>5b8JOzsypQmI0IVs#Ir40R>mY z9lC6%owXSzMOG_v3X)^$^xP0)>4ii*7!`tyPFsb7sqTkee+T4x@$RcwjQu~+1>KE? z!(59oxts%R<`_2DpfWKz)r?^e3C&7Xo}rsmJg)DJyKB&SWjnG#)>4WCjy%_T{QDB# zXv@7Autd)oq)qpg1%SdjvCs0y;vyS;{Bjl3H3Xr_bjb^z58haY=gM_~c+;_UOLkae z8K)uZJ6}k(#aSauXR@U=g=6Ug2wHnMUUcq9=yU?Mn1J~ua}c}#`K`anw83C7LNAI& zE9$pHHP>jR;HSznx-3H>HdFk|IJfP*C%XWB9GU@A0iI_!cp%i~C;D7a*=l?lizkkX zw@;7kzS{Jav+X|v#iL9H+HRO|*IOwHj?0mO_B-Ew8)|<3bY{(V>!YI6YS)()j}zkD zRD+2@)7DB&=Hgqmv4hizY@7dF{mRmz5>JHLo`&-#qA5Vym?K6JFUfOIF$q*jTW22h zYauo__dR3KxB!g8m=oA+uRlP(TSF>I<5}h#IC^C>B&iLk_S~&09|oCz9yr!rD86;W zWH0ulD|h5cy$_fcVp=VS4HoQFu!N|!xbHrQxO9q_1fIr|-pf=7dQ?j%fUn7LF---P z5%qMs9B5?(mwz{@z-`lCgxQP}v>0RVT1of}IM2`L0T@YKYpMT(Sl0;wCG{lCxl0Zi z!hv;R>wQ$u^#Am=u!hp;h=Ui{o{y4#$xtvz>&+f7dmB*u)cZTM0LcMKJ~otDG()kR zOe;oyDgS`7Nl5J58lW*msO@$7A{QN>re0KhD~;BPNU7+*N8#9WeA=BDlp4zUOJM|B zJrhNp1)xt7jM|?E|E{n&ej86Gbc^|k_TzHbA#8_pg5|B37EvXaYn9j_#Bhnn{lW*s zpYz|k02lwud7$kf59KRt*&MHmNF^5DzpqAnt4%%5h5g+`>z*ZIS}Jd;0SJuurq1|# zYLam+%_rQvkmT+LIoW>y)_Ht5)x$}!UQrB(K!B}!G~WGWr-6B+>B$q)qW-H2;tPJq ztxz!Y7AA$Z8r)}u?(?cgU(1g;2jp0f*bhni>9w`7pO)An4?e|R!Es1dQP`N(5?1JC z*FWDsn(~(^S*?UWc>0_M`d2MZQMcj^*@Y=Yq~P4#eE8_GdmJCN#EVR>V<1 zE`gGN(iH>Y4X!CNMKpw}Rw!j^=vYN1&1j^i$wfa?n@noBbSAodJcbbdZG`Z!Md1G! z@boZ$$XI?J>Ys=mrMd2evQSEO-m##;lATaZyQ%~hj=h-IZhpeyQ8pOdob!IZmb4n4 z4c?%c*=XB#ERhsl(C-1vx?^4Qj2w0S=rv0&8 zmfP0+v5@5By37>DQsyk!GDu_=V-`l3A-6}CvqA}DM82ik5kGNL^=2KO{T;Jwr*q#J z<@)2NIkk0B$z}XEA4no(pH+*vUl4>5-syN8rQIq+hi@dqTw&n-_Yv3ckcpM6ZvfQ` zI?r$2n1x0A4?&s-B{QGY^Cx@?WOhCK%4Q0`iX%b>jRshT2x9&c7neepMvScOep9AJ zffn=(U~Z|FJNY56nJJUCUYktUUS;=}fWYWmL`q@B{>qDdO-zj>AV^=*WcHWNb^$xZ zN!qu4x*~-yA8>d%!rrrQQ2}|}F#_3t@;dZQDsCEPc)sabo+5dd7ux4^T6P4*YO4R| z$4ZvNA9&;8S4%#XeM~;|!bPf~;%q|P{?fM(*JnhJY|STg9C$^w8>_P$u@ce`Y7&-V zq-{i6|M&7po9A_M`cBYF5ncxAgpj|vXC-0ql8UXOr+dppSCTd7xCcr?+%t5DwAd`g-(7a|Gt10RWpoWerJ5diy)nP0kiWzyj)IsukAr+pS((jT!yT;8uQ7Dt)Ig4;QP^Ek@yHca=8 z2DTs6E{C^!k^#%hDxSN=wJfw2tuEH0q9lKq{5AC)fZ6T|KEU%6+%DEYrk@dWaPyY> zrZx=ezgD*(#S&QpMb)2VL5#4=>s3gFRwE>;rkm@9Av5KV*KZeGk84r1Dg?q0u+o}^ zDu-2&Q|~E4E&6|*^Tj}uu!3U_A`J+aOXrlm%sd7{q07tGI*Y}ai+SrCRwH@_0>Ky@AkgAM7SOFY`+^z4J4J{BKeZ!&KNJ>O zFx;iVvkEDPq$?gwgm#A|OM{>pbmX`$>HmTG(==W7AL#w*Y?$EI`P590s43!UleMWE z-Fg5McQGEuhQP$Y;C|qWgLwXSu4(76B8mEOVNi#YXAD#*QphQA6H!nKD@M(uVsfgf z5o!^z1Yk8ZFP^e1jRTk6PeeUn)~>Vb*Kjo!UnPuQ=H|nfpEpb0#dN*yOi+a|zqr{O z{xzToef~YNf^;CgszVxi!L=v;vrzPCy6Q0X>1mPE|9pA*_jo187$1ynIQSdIzjG`6 zC2UB`3qAlmjS1efz;6ll^LhR`5-%4Uqb5k-f95*^=^6g(jQ7(PH@kM|fO(8WoY^w* zHgYKY98=K~m%53hlbO()w(U9OI>J5r{p}(%cmy9cd5Z1X%C4st$9%F~8IR2y*3)R4 z@%nefCh$<|3~wQrQ3+Cn55ru68PH)H6bf~1Ts-ivboxgfz5{!$BPaI7EyYhhcyDnV z9S4G=g^G4L5JhYNaoPdTFZW$Idg|EoYszU9odusNlh;KtkSEzm;oY}GFbA675 z;Htg?oo(I3atHeiHTI!(f@u~gok6_nZH;uwv%1C{0V1Gk&s$|C;Juyq;PSVX&vzql z-BIt~PoI#UQs9uWF`sbBKM5S_lK;5K#sPCJbstkUVPzL(2;az)Qg9Ds#{~Bsf0Chb zAXS%XIKQy|q-Oci9a4bRSkHFf{T+NWj?25g4+re{9PM`}Bs>CUd@8?WxdVaOK~xdl z=FSOPS7-EURadM$VU)oaq7MxsZsRxKJ*=ZNdApn6Ff7LpvOPN5>kbi=Ap+JL-t86l zuoJN6|Dt5cb_k%)m0Av;sQgR{p<$Fks1p5k9;klKb~GYWg5R9ZM7yKPMlT-8EIr#- zVm)8JoRHIqyuQwAT@_F^iXS!nCk~*XUwQ-1+Y+4g#2WgN?>vs^$OvRk?8ttl;k+xs zhge-NgDR1`Ag7Npvt;otnkxy21xT>lR?R8gP(&a+`h9*)+O;x~~D5^-7j z7^GY+y1FiD1R8{!i@)oPmedJ*Xb0SIDsqU!fR0_oJ7kh-U*swyYS$^PE9}3}v%Cpx z={4Kst&MZu=1MVx-OxBz*MK#Z6ylHz7%>r%myPA z>q4n@3`Mu(bOwi(Jfw|~%urzRrmRldZpp>p=hcN*pYEWAj#p!kc%EX`(wz=L#UM7W z@8VNi4jp`Zw`GGV4XRvq!cE0IY6zxk5IRryRNU9gc`;(!zW~yQbnM%x_|4#z99A_I zmv+POlZumH^UrM6F&L&tZb*w&wz*J&7`i4rfym;Hl{`Y@@g9G)9XN|+sUOgzG-nY^ zUl|T3o0@zGpk|SScbA5!s1C1z$t}e8?IdH1nEnN5pTYXG!97A&^?Cn`Of~TF5~$%;Iy+! zD&T~i!Vw#|M{=JdyYJe@Ao|MBf7i0gOWBufDurPY)`2YE+S3Q_aTuoHum7VnUSOTi z%41dhYg5u1MjOXtNF`_f{Us5`#w<4IORE$qN||QCi3rIqRw)$lO;EaINUc|hmGtSgG3?Javj{>L$i07IoJ#Z9%BPvGDGr;voUiKhj zd$11*v3*U%%3KQ)!uzi`$nUw^9RqiA{;C+?3pSkPo~;YN+XCR7+nSnnfiQ+PEuT=2 z!PBfRP+~Nh!P*sTtF3E3?w#Tr7`d7i5Om+?S}|vAc{}GAPawVWzgkf~6qY5*Ny1QUsBl(j63TpEa(=V9P+?t{jf$Iy?Bow)& za(?50cGB{)Jr2bLABgO+w$uFT2dtzfXP~#hFJ3VTsf#B5sYLNsgWYqq%|;=DvLXaZD|sJ`Kw&W!tQyB%x=K`DqaewSpoJX|lr&yH(qFkW>4av&nJens<*`MA zRcs7KeaNKy)6R0R0aCu;R*W|@bpG@i5>VM@K+p)Az(Kc_kHE<7PcUZ;jbr1F0GvGS z{m4!#_rR8PmjBaE<27(SsI}J!bln^TQ_dRlk=hu>+sIPj(@i14^z*1=v>!n)<}-|U zi1cq<`t5py7RLEWJszTXn)H@}f^G}JKlCV(r&4&G)YzYwZBOLUj)j~UQ|-}ArUP~X zZgBSP+w&fx?#gZ~ZGZ6ryV|yl0syMkAajISDVsQFtBdY^sVo%W1J|B1%G8^;NE&QO z_|ctpXEj1S?n=+Qi01n~|1VAU<&cttBOziM?Di~6dzP4HiV!S{lZQxOW9Rg5eNhMZ z6mAH%lRG;viK+?RTQ#)LcW9%Y>@Je~;r?+Y3jQg&l2CZ+#_+D&?b39320)V0qexFa zn+ux3_|lls-@{8gqEBfLz5Eup0QKSKXwTTu#cj5xc)ZR+bN07;wj3l*{THH&7qh>N zFh|B#jH?Joo00R=0$vF?ioTSL6J;fOA@V$t-g|ibwBh8=T0@i&2oQL>e&6?W#BcX{ z8SZHTcR{{JESlNH%?D)r0m`P*7+G^5F26C(2DL+Wt;{BS?vjTvXNJTEx|8_` zhoSM%=*+lX-cU0}z_A!MZ7ii(*tx6HlRA?yz}?j~c+}d-Wzv})83pA_vbZzgX~%eP z{T-}EiZ};%#qKVEM#-RJ>^y7AY2Twx@!GW9Ew827JT8u*X)7k{MMOrR3?BY?wlyFdIDZf-?L5ndeks2K9Nf?EOsdqk! z*q_&7>#_K8aEQY{E@YK>lpGl8gh07qU6~b@({g)yqR+L+U3?gOYd4@@*)tldM0W-V z;>t6%KPhvFlKvRE@dsTbFnEW&;|jyUsLlRfeOc(J7QL-^ecJ&4Mh*oI^W2zTL-U$gXGSM zfPsL2+MIm=+*=wo?m^A03Mub(kP4@o-s`L~m(V?uwRg2KC0#v_^CDnjT&P8;TaEEG z+*r@$hwb|c=E){dKZxor?CPiMj{9e{W(bp1Rq}+)3u}$kb||5qn#a+q_l;ed$H1|k zRoFcN<2TFpo@nYrTqVVS@3HcRf25b_PVY}M=e^xq`N7Rh(QK|_nkez|Ic!}sY9ycU?|0-IO zs35UwbHt6T`bbagy#x!VE3 zCrV}LS(=%l3=Xy?r~M6$Upn8pYy>#nFURu>+l`br*=%>l9lA#3_YhyGg`vgEL{Wx^ z7w%BA9u%iy$wu673ow%^&)8dGWaBtz__(Dp%`_C^jGI^F;$}_91~#i{yNyE=9T$v4 z2Qa8H-fGyOG~|98XRpZq_9Qb4>Zt^%Jwpho%`5f^sYOa;A$Z*E^qHij|JDuuh@e#d z?}>vA3OH?NXChqqNo`IS=wN^ZSH*1C={fU@8}qjCXBgdql$Wwu`_oNPHGMh7G+fv@ zt?1gUxQug#*ULs1CNQZ9usf| z;nRfYt}Y3SmdT<`ozesWL_O^P3w1z>zpH8@25(;#F{yH+Xuv9J>VwDdB-SC+%JbS< zxuIwJ{JB*%=83?cAiRo5l?Izfb;GM4JYod$dnnWVg~07AA|zBAWHzIOORt6xP2+en zm4x(4HB)=AEDYPOY9Ar+6ATnasC1Y#ql8-ak;d_4DiPSnVO{&EwARNJq<>pp>&sCp zQ^fIcHAM{LqfbhFC154TrENURv-F5bU`90Q$x2|`H7$A_h7~;al9P%_qYGpCp&}Qd zUOwh_LPtcdfJ(Hbo34cdL*?9UY1@13`Z4Zk7=K`CMDFp{s#`nWV~_MDt&i1hAzV;1 zh8RrB-az6C1{c$aEv@ss+J7oC7TuI(jKNxzF{Y8o_&-%-d`}0b`bu#ERxBfT_<-_K z;do+}%$F}(0|-Icr^GBf=(gQ0x_1nf$u3nYI_uCxcP4Ts-ML-4JC!#*#8B;bCQ@mv zFNaQPUw-?i_GM~cN9WrrUCG2#BF#YB^EwPaCl@Cey^T^^cN&9fSvJ1kQnEoG%E>nHJlDHfEg_VWzhn&Q zry$$2&J>x%NdHyEsr=g__VmnirSH{64q~YGgp5ff0zT4@v>7E^&3{^sTHuBdf-6+( zxfzN-5s)41t0Eh{lz$rX9yReO5WP;cMG0dPiI828u~%KlQ#`M#&IE%imbAee3bF)K z_qt>c<1(`H_m`|ko;|c{LPL6bGCJbR2RO;$=7xAUJHI>`m$NXlT_b3hgX_V`c{u|f zG3@q2yc9RlvCu6E;F!pYi8-x`xQzD6e=+0m^Mm45|3@jT;Eof8CWTU4x`Qpg=$+^q``@L3%}P8^u6Pg3LT4J zZHvl?aI&uG2i1h7SFZLATdh+gASpR%!}GbHy$L&g_4S4EcuOu;c3|1`cGj>hclEWD zFzotMWpNTPDSv@Z3G^KN@0f&>D}1@3v;Bsbiw(gm&s`EPczg;S&VeEIfE8y|ThH7Q9^m`jsYi-d=LBTsGtS|Pp&L2eu zx45Ui;*Birci&*K4Af!@gb>``OAxD6MNza`<*QB>2!A2q&qA!?oAzOpscG}G;$kZW z5b2WQY($lgX|JYg$zcdn!lI9ZSle6}OGqOW7xEb5{r&O3uLhIhsDJ+cbfD4QAr|{e zF{>;_IJq44Q&=Z1jOKc%uLnQAA6_%89{GJ`dCee9cnz^KUJDjDLEj%jBcN}Ud<>sW zDlri$$Q&)Dj=!+Ggdalbf-2Zv}IW zp`;jn$;xTGd|YWJ5iK>M}RJLGIhNtl1m_%cuQ`*XD@4Ae4(|>dV<3Ui* z3Wavj68sMxf9`q#qP;=z&PSNq)me(}<$ia0J%5Jzy)uIH%h3o;siTEZ*Az!wVF{dG*Q8y_Hwbtcz>E*e&;WK3S6L~C%0pU}& z*MvIzKkoszL>;Hr;*8Ln1C>=0K{k-epnc^uIJFi98iY@KvGfwpAhGHLeSJb*&IC+K z$bXcdl;ex0F;$sM!#0>qRhK79Kh>p4K|W>0Kq>#PE?*&rC#?b~iZs`JB$c(H&H#!I!uI4Qhb>!ROrevpZ~zu+!N+Ad5XPu^7saOynm^<#D*J0 zW$STWww;up_h~Kbc}PRLs8w87~L0sdQ2jy@`ryWK5cd12g#zSy-kEE;EMo z%QPCl;#_DLaiRQx`xc|%^3(vv^2|v5jIf(x4hnr8t_hTRyLchGX3`?ve+t1B_8hbq z3`)r3QlbF_jSM5c1B?=-lYhYj@rz?r42+;vWr=_ql?UH;kAiF5@`Q5e`kG`dC-qlJ zv4NKg9Vil6Qqt^@%2~Q$TLy-e8vMg8H?hy9CXbi}BwofYO-@waRE!KcTHtAA@BkDCX0eFWjJV2hK{moPm0!01c^>0IDKwMsndhOkvKw0b2PZ z_r=$Zq)3+T18cFg$$~gR*bT|=5cskh1{=^9R9BVqEkjYbQX12lVtDg-I1He+HVap!B1Q4(&AlIQ`FwPgo1eJb}PbsI06jDo@ zQd-SzMk}(BaDUZjjf)Rk^b{g&3=P=cfA#2t!8Kwp0)x<0)^5{!l&Od-E&?emyXG)q z5R%w))tH46I8fN8&#R&FPJsc&7qLGa4l!mhE>Lw~60%|CFZNz>XS;SPZ-zUj^ z)J>B@h}M@{Gp18wLK3PL?}ab|o~NvpCeh_#({-I5xqq4}Ra6!K63SLXE#W`w$5~SE z2M&*l3|MZ1DXT0=-!sQbN@e%U#b@Z`OptD6rOOB)(wnu)?qtlgKD z;BiG!A%qw}dqs6J5YZ8%@Unr%)haEOvP=>ZwZ-q5{NWQexw)Qz+nMXhI3mjl6RU%Q zJ#eg_j(-)R^tfk>(AloLR71xg+B6hUBr)W7z(vZZFyaoNt%^rLybK+!EfnqY|H<%* z*F=8`x9H06^)K|b5t`PN`}5qAKbnN9MF@dn?`fMq%dwogYBQuOiWyvWPBkeFNQOf< z_m;vAP!x)R2n6%7QH^e*_0sA=scNm40<4!PH-AE@6u2;E_{EF$Ow8<#&wW96OV;cj z`zkwk!x|j}66{Lx9_s}=CZ$1y!A{sL8|*}BrR5m5o!T5y9Pfk;m8vGnn(IsKc{cNV zo--2Dq8F9-OG;8&R1->xhceNN%$Y4aXVc4H7G5!|j+D}SsBZPqITiPad z34g?DA?_<^q`p!EIdNb)D@CUj0*P~JZ1yygTq9K_IT(mQ3ifYdtQ4=EHMnx7vg40= z*ZMpD6!<$gZi)1@5Xc`w$mHlz6RVIei%A*N$K7A z;#_gJS_D?I)!rfZv_;u&`?=wt6Ju&QcO%xY6Q83x);4r!BXde6(!()3oEu?}J%1(J zwheM09xvxhO-}ZAh8=(!mzKgCHz++1xW3;elR31Vm=TrU0q5R5vM?+MbRfm;$dx|Q zflNaC^}Gp{#P7hWy2*$DjhwI9!H*E~8|k@&wn^eoz|ekQ0Z7iR zg`|#B&M7W=au{fVbCa;{%LWqIfWw+x(gB%^6DC*t6Xi%bw}Mq*KyAMV-k06?#Nq-X=d%UPA?hcLHmh;eXx0B~DN8 z;4Ua*IyHUp0CNIEhCyu6FLj-zOS;fIrqvjsC^j3~;pky-cM)rnJ=)3e(c@{w%x&m_ zKGQ$zo4URsI?^J6%+b9F;RfwDWD0)R$e`y<|BleRo;okP89Vr(>kqrT+w||(^sfQ^ zaqsM-_7{z&>Yi(B<{VrbD1XrNQ?OqUwvVv=Jqj>%z!0se_I`Y}{aSnb7?2`}v%gV@ zvokpeXgb*K9v@N2*GTK1XCHe2dij}nwhKlB3MkV&o>TM(oK%3!WN84%obvYyCX`*8*4&J*Cs!w@lk>sZ zn0KvPv7Z)Ymb8)ynSwuXrmO&#%r`duod($fjylRcO{4IW0e_x$W@%M6knzLTF(5rT ze7yfFwRKO|osaCGaP%A3I}qed8Q_2|1OeFQmk$SNxPv@k)U9|b6N7E4v8C&0#p!7; zUWC1m%I|hwVr;>9-U(aLA1Es@Tfd|y%foqJG;N1bQ$MTHFa``S6ABs0Xe|l!uo=d9 z7F~_T-}ARM#D9H4TYL@_s<}{I4nSUET#s9Mv%xNl5Q})QAP;kH8 zk>J-_d|;#~Q^Zu8j?%c07Snj@p_kc+&WpIE(YGu>i=IKhyu*?PoqpIM{53{bq`XjV z0-Gx;oA{C@Sd1gH$)3&xDS=WY6?s$TidscFvz)M28Y&BBP&S+8%MU&+Sf|Smn?70M zB*L&n8-L9T*pxN9h)z;8;KnE=SCk+o2|R_3Ea~gB{{@xMQA@)x5C`!0e2NqH&_4K} zogmgJD8e51zK)S*XB$Y9aF>Wh`rYkXl}$$3?)C0||6CrQeeH$Vp)!&X5)PzQ*oM|4 zFK*IYSlJ+ZsSviy*p#t)ai2=vX7_WIVRkn!R)4i$Nn)hpjmXhb+MPklg@}CaPJY4c zpWi>28D5<+sDic?=*Amt&<2L$B1?P;=*yG-kO5(a`yRsr)|-6n#L{R5@6q;2&O$xx z4McKg)Q_4D-k7(qS*SH%KaGj&O`kc=jk(>)^a{g3a+1OWNFv$(Qwc*PdyG$swd4b_ zbbrpA2CuO3p-qn5bP84mCH>M&_R!-L0}OCfkzJ= z1zFcg7j#`_cc}>fduq{H-{rx)Hy`hKHjM$ONVb9r1M65xSGboUd)kHxXwi{1LJ}6K z?@C`^`lpn;=n%_@qJ5lajmZRC;{3|obAKvy)e;`Yq)~MbNG%3jT7PJ~a5;`(@Y{b3`Zz}o4N)!$NGC)DRBO6`hAOw* zse;^i@bM{x&K{iAQcA20DS~GZ6zq^B$w$4g1{d+A0%!Y5AM~b9P|II22)iq`sDuNPZ1ie({fK)AIpssmMek5<3Y##hm)W(B7geUfiOBu zf&UP1qk5{DwbhCEzn$1B|8OU^n!3Y@)hzyv54%+Ss^O1%vCGtT4P(rxZ`@{CJJI>9 zs@l(=IqS_CmJGqswVyGVI)7V@5OV3C4Aw>~T1(?1{krgST}$Jmjd5O*C3y#}k1-3v zFc5|J{E7??b<|c6st8U_(tkmm3MIW>Y@kiTB@v7G-%W6}xOnsXzV~i-u)SrhLl^`h z&zvU(zVVYqw_hzwrp1WP3P9eR!q|q}(L4aw`L=)@^G#7#y{!Z}q>?eEJ(5h}v+3}v zobra)lks>qw1WaJg9fjR<}FG?cp-7eNN0jbOnjju=VI+Q0+T(7vw!;6mO8~gwi(%g zvG`vyA>*>SS6=K5wU0du!axj$_xy?s4(+I|AXX8abde6?RFHU$dSLI4+_hN5|8DEY zCODZXdGqE;GF!N_11MQtNEjm@M60k5tz$nQ#u*r@*gH~;`&C^X>eJF*l^P|JR3)5@ z(;`2+oW!$a0NMnWV}Ebn*pjzG4fmb(M}`|<7p^{Bw8CR;RM6HSmE}%*9jrvfuPsGS ze!FqdyprzDZ(QNZHvAWKc>flW2(>sc-KdXoiqATOJ3Ij0Q%y_5KoGs}uNWbR1nfau zL5x=LQ1qfbh!-PeyP2d5=_c$)wMhTF*(95`Y6vQVxTnd^n}0X6^Ipy`i$y_5j4Y!P z!B<*xre}Ixpt?8;LL%rARY4iT?Ak2nCcVmE7&{)Gj@S@~C!=V(D5g{@lp!HT^~0ju zJjMsExXxuX;UeZDZ9c>A5J;upvy^X93M|ZKP?A>y&8lQm9t1lGd+KYrfX6y|3fuIijl5Mo za0wIm4ABoZ=ew!5eLOAc3T@q&`0rhn|0&mCOyjt1+B~2G=|Z=pElQ#`QnU*gj8oK; z+=$ptpj_uor)oDsX(|}rC9QtexFQ9w(!NVP*HG6CFqIQc=HotHIf>R&4>M1-rh^y%=)_(-_ThJ0 zs>8@vQH2{fa)%<9Cd3-d&gQp{W1u(`eU^QX!heSB^hL4*9Vh1@a{?8Y&ZIby#TbI9 zIwt-0M>}3g=`6JM$GNBK|NO<} zniF^iA)?2hvBWR=1BFh@3c@fDyzf`+p$7#o+6qD~f*|zR4=9v$yL~{KgiQj9`0uuQ z@qgyr=E2OIFK%=I9g|kVxbZr81pn!GwQV zfhKCbynVqNv#~G8DB$8sNlng4EJ{_-D3@)d1SJbjHZry_Nj6S3HZ_+G{|GRDwN~41 z+CUI}_g732l0gcQ(zH?q1(YU@+Nh#YnyL>tvWyvm8@xulYeJOp@7;?pc-a{8P(N_- z&YYP&GiP=`50~?$<4iGJ1QemgIE_N?^QR@U{z<#%kRV333_=9|TN+Q&`!C5l4BwxA z`VgMt>BkS=^?Z39P=>VUI0A%!F}Pw0xxg@)B6Xe}5YLiEtAHakDb5xc@+cwa()2tC z=h)LG>0}XwFiVMAhN%Kj`H*{P{uP*QWvCJ5(_96M6rm5ET=g>#WqJf2rzy63g>f{4 zmbMdtxsQ}4wAF5J!O4fuY4QjJAHlmx36Em@x(;zEGite4zkZH%UNR+rh0p~Tj={wB zV|FjF%ix>h7e$^@0!==TSZAP9zQHi1ELw@&)s8a9O@%sxm>nO38@1ht`2nTDQ*LAK zRvJZ&A{^u|+jN#+7rcF=#glF(D|vIt^mqEL zD*Sg+3VM{Z3ct6BUuFPuEJB9R+~~Z`UH`pk>{LJ4NE7o95zleBRR>6PE+Hqe7_ak#!#3D zT1Y-0YWMrBP&YMy;>^luy7#<#{+tqiBH>Bo? z(rb1N`9M{~^*tJcah0q;64_0DCNR+ygNTiY;Bl=N6)*>R3sNoPgC*|8&w7~0x z?Jn@-0f}`5$@GU6ODtTz1}D~T4aE9eN!?J(?{LLzlhwO_sXAD$FL`;aQ&Zg>#|7kW z*{U6=F^X4vXRbmxD6l}+y-_u5mGKX_2kwbc%e;M4HqQ0CI;Fa$c+`>WdFpyA962p{ zIs(^s#fMlmFW3sq$92Sbg#xoW`SuG7>k(R}cHEaS|7Wl|nKyou2a-Gr?G~2+ukl>) zvGE#>LLD0d=O34Gy9*o(PBt>OFiAE}H8wSu6Z;519MxEDZ`(Ey{;pqf&4NiTEGK;# zHaJa&tx3@iTbHHt2q-^i2bq!wSCKg2Vg>0Ub>94l|G^P#$yLe%4zu^!@+!OjIk^pj zm#=)7V{O45#p=E!^7T@b8rBskz!Xdhd<4i zf%FI{e=m^#qXZ$-Z2QGL)r(?vj7IYIlaxz?P4%r==*_g2(N(6o>cKHgx_5PwGO74a z@)|A8UCXaxjVJ7@f2mcWJ31{ccVsU z;FToz!BUIl<~@&7Z|}EEX;3K-qWKz_hL|%Pe@Fxe;xyRn5&!*|-*Sl}1;4qM=V+0R zNLxAil~zyAmRXEwSKJ%Bnd0G3rNLY{K7p~TG?V(*NN}{ai|$)|n(=oieUzwts`e{L zmP;nf(7f%i+1EQ3=tQo)Ue7-X(6cr7b|f7RM;B-B&Ms!7_oMI89gKwt ze-LfT4z@Z+H#jvUXeOe4Tj)ndnqXY;zTIimKQfzdW@`R7c5foR@Y8ZWw~XXkuSYTx zdIvnCI@RQpW+G%V^oXIBY{heHZ?D{CLDl5ppRh3eJwnKd+;Z!PTTU@K$8>tZRT8g= zF>)@Gr;UK_%%`+OE7>JzRg;=s4Bz8pe>kk?!2JM4p_Z*2IGNwbh+O5<<>}eQMIZK% z68GXQt^R6=?k0jl#-vH$vEntZ1mW2u*|%E^xjzb^)prmksGdkP7$$>CVDaF%_FmKm z?=}>(D6YAl1qp7nD6u@QY#qz6rfq5EP0y4(NN}Il?zCZKE@dL$ql3jexYSvVe`xYH ziDMqnnd8-v?<>93inh-t2mi#pJ)?ZTDYr&ec~E_Ue}YyrLKU7?rIGkhK0iAf8}5J`fz^v z5Jap*{{zCRrtW|^DQ9y_bpnv~K=n4FchS zj*#9yjZ|Szq5jrH`Ued3o>P?xttt5STO{;P7ED!xUaM!)nG|Lfo)$T(KN?&bIdCJD zb~5nFqqU}eS-IOZMs0xGe*nLcDK}G=r8EhveSjB>^EE$0P6b2r_3`s%AKtuqgYVJj zOXoAe98#O>n?w)eDw9o31Mz|yQ5e(bOY=Dx45lP0k@wQ=*_N5?wdY)tU9iRmm1GjT zXH&pn*eAdQuq&+SupS4s7Mk7SiNyK9aXwb*G{TGu)WtzE2fe_qe+Em2~Zp-Tn@hY=d ziNUOfdeZ5k7b!$vZoKao8Kr_=>%6T39)=ShQ^ttcYy{|syk{k!ljKHDFf8&Aw-H`5 zKv9}EYIDmeAWrSGe-+>p`ZDAr0s|OR02nx?+yW2%nXOn9)73$aX;gA5+Z`G=oT`yX z80}2LR+dnfghe%Kl=+O#M=nT8(5#gW#TrYyAld~6UCRyZtpU0fdRdB*;5cWuY?;P< zXy_{U_CxduG$?(Twwf-6oWhlq-HJY>HUCiLt;;_B7m#m)f68r+?qO9kYk*y|NTAz0 zc~s^BZEBA)j$dE|ADU*qOeM{`2~}i~dNpzk!sSc3+W9e~&_i3fUXQHA8oBZBlWET~lFexV0sXo1gZ&+9h3EV53g!6x_zsDY(IA zCjeCe)+znVHqt8|JBcm}t1U#7Yj={+teiR(Jl{rolg~~NHsY@nMbL%f;SQ)7S-YUA z;=L2gXe%tWYptgvDYHu_5V;kQ>K5ZkIOzQ77Qg5aPygt}ZEq*xT?)3dr^&fnam~x5 zO`i7pM_!K)r>1*weYc$ew^nfPgIKXR3ZaY<_)5I*2JM!Do{fsSq3T1K+)#J+=Xp^+ ze(e5#N~h|-w`%YR9|M2Iom+F{rK|M|bir{fPl7{)7>CZQiP z=hrx4iD&;AzJK-q_B`MbOStpOdU+60k5?>;*vqRw%AbgTe_$&%2dVXjuV=1hEq2SrcJA!hYCD^me8&Iq>OcPT)vv!^ z-Q55B>#IM%`h$P*=Rf~JzQ!*HHw<2kW9Ywty8jxIx}6zT7$$KNv7<=(AO5{^v|P+= zhc6cHX5%<3ckL`)XS0|)OTOJ&yRED4$WC64eAv;9ZyeKdS8TnV&n=g&ZFe=Z*S76! zT*fy{-O<4U2VSrr_O;qV(HQf#8i>+zxHc;rc_R`)t8`Cr`XF1kk5Jm^)d*69<;_^A`9r#<#*vfWxP*yB! z<+}6D%C&!O&Q{K-0%XV)q3tiA>^}-4b{}1&FtM`X028hBycw4=5Ucrp12)4;N`&VCokYe%v@d;8txeE zXt$lM;DXI}4qPkI9@y@hS?0`KZXMHHLE47Xb=H5G?^*mS50XwPVH?ZZviX9$J8QFb zH_TzX-E6((>*dVc%=A4T;`m>F+ue>WcC+n{LrvqWIa{qZ=4xecwrnSlvmQdHX%(gZw6H3b5oilg1;p%q>nP|jEZhOrC)n+m8_*=T0)piT% z+iZVLcR9D$3wO8LS!~O8&TMNgNBS!}A1EvEJ?~sRZmrg$$zMY&0=cE#%x`_S#xQOWX8Po=ShvA`9>o%(;Gv_X!+snmz1C5Ejb)jEaLJ8VJu%hoPwIa{yT)clR zpD#CSb3TJ2zgs~|24!@;p25H6!sf$a(0O-JrvaNSTxYSdY_^>(=g=vvE$|45-I?~1 zIa^EHnFIeP-l0>+-PLw(I<^Isd}BL{#oU5iox2;?a@OW*H@3yBIrKWEat+e%!kN!( zwwW_?=2*~e&p7lyTfUnuhWqbxzPNuEwtYeLxN?`P<-)WX#F6v$at)!_Yz|?W#TT}I zQ^}(!j6`?dX;NHgX0e5{H0P!@gT~TXnJbH1uESimuvYpWpLxd_M8zwI@!1+81=F?W zJ9`f4ny+@tHC#(aKY3y_;010cKcSPGfxpcXdYkQXvEt+?yBTm64ZCx;&| zal$+Ge6w7-D|fzJ?aZ}f&Nu`u4#dyfB{b47$kA`az-7War4vg0e6w^RTCmqHbIqj# z0W~yU3)cmo8~xJh9y>{cYPN>4)eget`D#9QnKj$&z|j_Z3CrRLUr8sJ-L4^JCM0aP zfM!g@m1}5WW>E8%Hseb~HbQ?Tcw#}P!CcQB7s}&m!)KOkTHNItsyKt*XysUrev`64 zbP~5)S{4j>Hzvfejtv!I3B$-OU#`qGj8m<#@ny|dkRJDKZ}!}rTM)n65PWTx<_?C~ zo7HB!+$~^Gxm)Xddt&iZCmWds;g++q7h4Wa7PFmeiGhx_;Aeqib&w|*p(|U>K zezt=k2tsoc%7?vK*|V*)gQ7Esj74}mTv?rn2tv!nYU8X|v*k`kCotZhZTJc<+7>Fj zenjNKQ2A@;x-DP?u!c*twP$l{JD)+1x^m6Md}Wzz>*!Yj@4)t*tc0;X4D@#k2<==L zcQ`w9YpvHi7?r>XZ@zyTJIZQ!>(*|lRU$q%AxzoXJK+Y}NE3PlxQ;OX(RbF<3C!%Z zDQepc0?7qLloqrn+tm_^%X|$r8&M>KeZ=F}p4avWG3#cro6jtVLxetaAxg22!>*nGF<)@;kgq}~RKjbm}G4hC=~`*TT66l5L_~AGlw?Jg~DTRho^_my8G^SlIDnbd1YBM5st8(yI#7> z#ny4{nV5XgFP47?=J`h!bz4gqM?r_mY!L>np_;AD-NxB47dqDMZn@E~b;Z15x2QNA z#!_3ynl0ht+1AQg&bQWTHG`0S%@7W~xD#C3^EnLl#rOuU8(+Y%alTvFB23wdNJxLg zbLg3}F>MGSMQJx-_yLWxwPf@42K-vkwXR*n#e3=T#+ZM*T0&f~oz1p87$na&+s($@ z*)UpQ%v>OnCcJf?G9pB2A%hA?Lw%qayg8#px@cK`eC|s7dY=bQ$&un1~;6q zpmVN45j$o9V|6;gJV%+^G-H zU|CQ$HY-S`vs^f<`C>NT&R1*bm^R!+_)8Oc(;|QDxSTKM3md$+qDMDZ5GT#HYinVf z^Yv`a5#{B`;us1{XFLK!IBwb2cC~+5+EqYBO3T7MjQ zbUJ^%?A*0sYz2Ltz1eZLH6dKzE?k>0XLA@REcHX9?L(4i{X!H zr?|LtD4Djk*ub^27>7|1gtO4?I1GA*IY(T+(C^5La2p2fy+whKDi_0~bugMayP)R`)BV0eE8tq5~w zFcjHA`CsfDd&OL5A(l2^ib?En-l+#Gh<6&yMGI0_Np<2SfbLZULjW z4GgH(uC;+kk8hy&SwKXl@2%Urnb0UM=Szp}pzB^P&DnYmbr0$|jIZp)T)#yIUr~1< zkppRfv77C(-NM=KmezlIyMRW;TrQm*+n!h&c+TAm>!uA_U+AM@d}?j&HT0qz&Ygt` zl= z$HzOCJbg|)|M7oO>a7<4K3d`;j=6Zv1ZIi?5828>AjsD+!aK35w$Rz2bj&4z&ij1s zx{%uGOWgzs{Qsd`6Pin|5p65uO|8+M^QgR3w5lDxoUZ+>AZbTcp#>DZUX2ceZOixRSQW?>_Rl^&`z~d ztetb6LieXy1o5EINk2fWQ~2*!xl>SqFaZi=STu3%#zg*EG|>#ISdo46RlmPW1%KsZ zJdeLP9J1&~7C6;~S+px*_47MB;=}$=MnqR$G#q~pjSh8Arf)VB+I=hZj3dasPC-wE zcYo;5$+6KBmWfF*4WKj8m>yUEV^bt#Wqe0RW-jq$t%#8bu2@5X=Nkw^i8x!&JyGGd zLR?DN;;Aq^YCU)+B9zbm>5>hG<2blD)2g1|)934p@o{isu7!Z-fvyVU>h0jD16jZ_ zEdqb4#sCHfq`ur&u(I50cY8cWqTM$-fVDY*(1Mr|_WFod{KXpaPI z4gWNey7O*hFx%TS> z#N9%irWj}eRt?dh>)OPOUh)SYimy2o|K{Tas)zVnIt$JFYXj+TO)2T+!7+y3FWi3{ zAZCEpDOc_3DSd}_p>*Qvo}R$c^KIvv#h?K`aPad^7PSl zW1hs?9y=OJ&h^}laDYzQ=yZwy-#&lm9sCGy4ZE{WBEBD^4L?68dC&L!d4#6?{dv)& z&ul(A>l=2%PFhVCM3vBZx}HMTbXz8)v{v_*&md@d%WRc>iQT|bJy)5jvZuyJEr$(- zw%>LiSH3L^|BZ+_UAX*%&O4o(aY98I0OeQN-G?x_4%5IvC3je)*S(BhinxCkKI~6i z*jA)sG|h(PZ-TGP_neDppB{LSoNof#j)nw=UBZ92{44jBT@(f!CXO%|H(UyUBf8mtP0c9 z!Z(LQnlQ`9cqldcU6qw0hWdXj_x3tp&(5tXtTc_5qzZ$r3sBpGtwCUqbDt7tKuu7= zzZfRa0yGrQ6TA`Il93WL70(k~=3AAKLUcqGIPx9LXgS)V3LN2q7NMr6;9YKYMhnoC zRAGpGT>{Y-HhkBl&U?PfH$x*$e@9e-!=tSZb-nZ6-+Cdb_qv{f_hNq^HCl#_sshO~ zCx)mCp7(#9Z@EUw&=FPR$nM>eleA=&SQ1WKIa-nm3`gROIF8DJMsu_T4Ml$?0@|wB5LEC_-9z4t>m6_87ImIS%+L~5;gB2G5o0tp&r^uC z9z?NwL+ZTeTZgzDHUt&?=R4i&GW5@9bX1iIN-8jXcWD7?dgr~rFSh3+ zW$3CZkmO6wX+hee3LIWcJCtb%D)^88MOz{pf-3$I0R1(yDXD*e@IsykFB$~2{Zva* zkwNTFNRQD_RVMidalPoMo+tT`?Po~J(bhaq@zM6SqzDZ`1^?N`hqMSSO%)2c9U@T( z(^gaPUv7^`n-N{v^DKAyzKNtH9Z>}iv7I6llvH96dxBC!G&B_`bw&N|M=dV;iFl3MPotK%{UUZECH3D_R3IP@Qhpf~p8O*B zE2RdAMlF9g6+3j05;O!={L@yyy54#3|K-v4$aOsh?=bA4bzc{3`yYDT_9B6G2pwN%_d(An%xGlZ}%u2vZV% zh3mEF*~9p^Ap|mXNyxR0x-=bn{tydkt~WL5Sl@s1Lm0h$jv+VX!z47cZB;tnhnFB> z&vGRwA#Yoij<@mgB6CT@+^0M(_caq+q`XXrpF5yS#pfU{8mPu!NUP=rr0HEeM>WcG(?G{73xY6t!{u}GLE_2H7|!|avC(lI9u6#U z9v^?-u$bo`&brQiX4FhDp0kIJ(`c;wwjGAyipMs@BV!R-W*CC|G#Kf;ve5D?GOyf< z>__e&dmHDLXJKSCY!JTRr96)F=hi<5ULrPT&A(G5$$xEh1t_o{WW;*qMS4(ea|F^) z%uo4U6n^#OK6?S0+r$?XX0H+M{2 znsGaO096zw9QJu#xwW;Quc?8r;3+JWpK!k5%j`nNK~4>N<`p6EJG_lCtXi5$?H9QHP3%6+C9a;7*bI4$%vz(0wa%v5G7hA~SGJ-BQ$>x<*j z_Xek`+bF`usF`3q=Wjly$uU*wSEYaNh7rd5%|}(2Hy=@c0ss|{f_VA<(W+jBol%-$ z5FifviAPo#dx=VGDc#p?Fut=3buEsSND>}BBriU%inLPkmptcm2pOxn+14L4S&acX zQsk=;&so?Jz67o?i^Y~Mo#huIG`oLqUXE4PAtV!@s}w;&VWi?`>TW`;(`4#6N^>w0RPT@KQ3 zjHLV8zzLtv4du=sX-UfTHJm)m~ zm6rThFA9T$JP_th>iLeS!2EytZ2Vd?H0pMg3}Us8|MmR!9%3o%u}qg?>N_98LQglF zPRI}w=F?CYNAK_aY;bY{v7v)yY>4Sx+Fk)2s;`o#HtNf6i@=+oS$ypUUi@_a&bL%C z&WMoHJtQnrxGjGYF4xd!lP_0Ze9YSO&KGKQEu;2lLcE8Uz$QWL5z>Fhya~L-W4^d| zbje~47e?#_?sMhKdqRMO>LK+KKDtJn5Fn)*RTGBo^_kvhH&R7M4|4fN@~S`s#yFZF z$%RH=v>|I8kNDzUw&+) zIMEBLFBB(ZGPKIf=$C&XLiB1)Pn?g&v+dEVpN%J0QKd>iyR-*;x@0J86D7vyEckr9 za1$Q2%4ShlFv%IC{=bkQ?fRkNgeH0NE5sFP+0#HxQK5gg>a5^Mx0t9)(CkMOddoPAqSL0&$ ziRj?l#D%5NFG$4wp|~@IDF;0wM0kzoYIN~> zM38uLzk)DdAW)nEIsz=WH|pk;NFSr}IW;6*j}jGV{ziWTEPtf}xevo6&Q@~k6164B z(Q4O$fU>KG1kRTDh;PaP(g?mDYcihE{cYP6N%HA%guGULRe3$#{bx))1(XBR=%DLTefI9GoxezHOqIoeDu1q7Hlb8A!qt_%=f z#S-IF^P`F^=VTCs1auRT-Q~Bo!)O#u+YCXF7s65Q8#YwF$MxZTrWgR8Kw-a<^l)I& z%jh1UV~1c6n`4XyXc}pFf6tT1v$K=j?bKHp@DB1UVa*KCy4bB9fp zVo+cbD#glwaTZR$rj(5NoAJe^V~C>gg7>i}cO<=LQ2x)(G?f%>Ln4avHMWNUS7UXH zE@g>*fap?;-?Npx<#PYrg(}f$6%5}e7VUYG?M?`P5qsdLF<0IussKDAqeCc@Dy9w^ znrDHenbERB_|IMy-DWRnZ{ndm)fTPpxMqiDXce-TD^Ly*e{-3wI)TyMCaW02S7q-gUYof4oRSOZO_3wq!8jH*J>OlnUiu ztlSdM>#>99D~%#sKurNEtcNGhO>ViX(-D-mq%im1{z;og8e?$Yh_eV;Ah;s-a-*U!MjQTq#&M(SYk{kidP4QoW|RG^E8CHyhc3!B0n)NdNS>?~HDi zGb;?hC5w}4^I!2P|C1_;Ffn@U@lfJ_8LNy!e<`hK07OoY_AiWR++X`4Q*L!j|I&&E z;6{B0rgVRUn|Z06f3$vszmE2wnb9C*2au0O$jnd(Aq=L(cg%ky23AZQKJqT&EaB0o zC#F24@6j=8GE*XcjAYO8DI{Vo^~j-bc^qRiwa}OhjwCxfVnnzf_&&_1fb%h-24zje ze?SKvLvXbMRr?-E+b=pXet8WiNk^ah6bTv~LJy#mgwaEgMYW;J=^n)?!6zsyr=+Jy z%GlA&05-*d<^&>Dai$s=mIsF9OZLWu_FYp9$rX3Kz#CKWDhrI?YU2tRZ(Y7;$&;%8 z%F@UTX)(r)K07e@(Ptg${hM*2ZVjg}f2Bsz&Yz|L2CGYWbc`!rD^8fWG5Nc5yC!7RM^5&lFr;OC(4Bek4Q93giD~ zAB54!X{fpl-uK8pp<#sbo*nEs)_ubYLInwDUdz}{J(eq&Lt-e^KsPOO(uv20=SNXmbL(FI&Bg z)F6Zz8A9R(sd}VSr^qa6K(4)j`Tomzj>3=zL+)|QT>hRXPoZ-O%A2;wOUzm2c_nHdHFDuOFEyYOP=5?eFDc)o{#}W6)l*OoATm+Gl&+3t3Yj0{cfA zp5LUcOC!y22(sapzlz^9h7;w!TtJ~7R$S_!T1;N<< zw1n!>Ab~6HONjVNldVUB1g(loHNiRpBv=nm&?Y&)exY=s+C$Ts+v6+R6e_d$*qD;DfH8W za#PsDB<;ze4we^SE@CD?j3xGk)@Ksd698SracJYHq{IYhP>FD0ATR;eXNJ$ROk)bT zFW5{I3dCS)hfWM*X`eiC63SQak9&}OT)*4{Bx1uT9udQJf2m4|snC$EMN?-gNL0H~ zSD6YB+k&)&Cc{LvB@G#3MCI)Ud&w}{4GsXkXNa~0jHz*Wv`2(L(tHY}dv2#u?0v>h80*3J zFc(#tQzIRbe@w>-pgudOQJgfN0tp$JRT@*kVFR9;2sNIEkGd<3$>6Y8*PAl%uGG=j z*_$-7{Tz7zQlAa(!ISpHP;!nL5zS`ybWpeUwHK)`V`%{8wuCTA zMfw!VecW`Ba&uy&&&MMMNtzQPrQ$}I9*#7nL;0lJ9)2Qi4nHG$tIyQE)o1(XFmm+z z^4t~$lX!l0zg5NspF*)zyLMk&nGLjz(^49!cTdOcakK0o6}9KpN+YAP!TFYnt#<2S<1(_Pw}PcsjTuY1-i!#Dn&-49oR>`6qRh z+`yD%6!lDxKlod|DFZjQSF$yF6Md7Y2mf=_p}}nboSK!h40H62S1Ce zbExk*b9ki9uPjZP6j5cXb~#)3nEgdN2}087e^s1-TrO$xf;|OuOKSpJdEd!}(47Le zEj9tK_@4r`rb9$oRFd*MM(uhxq(ljd#iNG$5C%dQx<_$k;{4KRGoF+qLWVE6ILt5z zxXQ7eUC5TeG+5eM*sntbdCy%x`@1$@M?wcJ3T+;X6MM7JQ2fzLJm!n@!Q=Zh$bX<3 ze|KiTHu9evC&fr`MIjFo9A%#d2Cku}3ezycc>frAd+~I#C@|v?x|SFYxZZ)>zae_b zzstT+rOAG6w9P4yZUTotb0`1)4QDEyX%nkYf(EUsF=_`wcfi^L)L2@Vu`57S}~5;#QJev=$8_BsEKCIx-UvCLe~3E|a{M3`)u=r<-Dc1Gfgw3cBw-;#j>w%)FeVWjs(u|mR%l|jq$p8kXpz6%^CQF-noUDJR57}8Q!$?nwnjqJ zM_H$+#azOLqhC6Dz)Q&~*|UjrumR(cFacfNDN`XD&?}ZOWEE|tf1#~9K?=m&ocA4C z1?ohc5}qI(99F$e2izt`eZc%Hr~D@ot%R zO~PI+O4xd-KfC^De*m(fK?;Ysw&a(UB95Odfd3rWbfb-aFXZI1=5M@=jtcIoZ9NVl~b`*&)C6mPSL{>#HS1-nto-ogfK$<|yBa9FdG%WTJbM z!zod{Td9$he~E5icG8k(8F9H9Qk@_HMMe>)U{H2~Bzy?Px{RVr8?&)~7HEKc=b81D$CvYiCXq!6we}*Q58(P!T(qwa=Bq6(gfUS^- z-!Z-}Qll4~Dy8N3iA@I*La>r(VI7pIf#Cv<;@R1_V%))eKLl(e)7Qj;mgd8=`s1|I|eWjOXag?>s3 zPbv;Lf4}ZM3cne@f!ga>%E>IM)Qy_B(bPtx1Lm7WmkeJH87cd>*Og1zvKI2gfC8H^< z19|V-%jI%^hiA%#bQrSN2S`Exvj`(e8gghJ!q~E3SBJ1xrwIA_RJG|~u*xUEYs+f# ziJmf-imP?D<#!~oM&-ijcp%}vOe3EhRfv+%iRU=paWNy8hy@+wpe=n8=DUdJ188}E zC^>UWpM-h3>Q*PGt$nqohK95zh=U?+0qTl6Sa~FWLJ>2RQmP!cOfFWt;x3P(-pB3o zTeU1WFwgK=v6iy180qNda1i6qWVq;dJe4M6T@~dw)=6JwJvyl$#2p~t`+lN)b?$sa zu^*cJ-W5-{ot-ULz8@qDh1tQdz1L3u(`@B=X^Hb+b;Fn5 zcm|_?GDc$@k3aDjos2LFQ#8W2SghlhtL$_zYUWs!H|$`Ap$0@|h<5KKmfT3>&O34+ zI?mxZ;si=Z1dWwC&Tw>af<)M1onLzAyZK>+nl&CIvU^X(JkKBu(eA~wj!)iE2Ou}a zBLvX>rePWjAsvpIJr?FF3Im<1A?>iv-+9S@kEwNGpMFkc7@}cM0CUSMJqj?yy8jyw zzIa->kXvE_K5=%q>^}|T96@1ordUV0zGB>M|jnExN*DQ83b^)RrXA}?Uk%Wb&#?6F*RTUCa;>PW(KPwNKW7ta=d zPl&xfX6Fz3o>e=IaO7hTUB~BEzp42jx!kRb@gw(-FsMgj;QeBIJ34OszAq-6!R-PK*;4KpJQ~rE_5hZ zX#TNN5oRVsGtZ z^!6+BQ^h3+XNiV22@p?AWR3(=pVzG6yp1A#0%@%4^hXvr{Reod`_46x2-Wj{TEU(I z$Ef7cWS^d*@Ea9ZA*MkkW1fKdP`N$Ved}}WF1k=M3L!L&ej#eGXqBUiix_{S8tXcR>V6Op z+k0QNi;2`RN*R3;c@Z-mF%5KoktC64r3o*-!T~najgB}O_GQR?9`m>VN}1pI6D9tj z6S8E8$2up&?}*c3KOcS1_L7fw!u(0l`y7zrU;F&ogN7EO&+Li1DUvYggf1DuWJRYX zO@{n;{_-u1oGFl7(qzc*#SzVuWpr1a3|yS;9y6Cu#@_3I5dXj<&%PCZ=XEpxfghP% zUOi1hPP!sX(miKR82B%fU6Eb~g!p0&;v|7WOPUOMvYf`|u$V-ZYi6IdXK-o~Isk|v zi{_w2m=z1eFs=&?O@yoTaMT|MR0^8zvrShq?lT2V_u|IBsA?#JQUnWeehJkWn$b(D zT3A1Mv4?0UY7#gAib~RdlEMLrTe4vQF)UpU8BIkjpQsbGd`(3>UnCBbqlfIsVo61} za`vf!5r}m?G@IO3I|#B_SHgVk6~@xSmpn)&;T@3HB$k`WVz9)9vHHG?Ng^CUp@Qdl z7lrBYGSX2nQc9cXGCUl8{wy{FK;hJM5G+Bgf5$b)5E9x1;vN`(%D)gmc^CC0VlP+T z;hMv+9SvhNQ$^J0DxXs@U0!Woq)HRnfsbJfB8h;G5!l)vC2l77rz5V1&`GrJ3e z8zQzS3rRx8z-Fjs@mhya2$Jz#dBbbr$HRdd8QFU;NVS(h_pnJlIy(KOn|*9rOE?F} z(&0@9G{{or-3HE*-T9;!RLIe>h2JRA!f#|`4^N((+;W$)5h*okDet}g6FH_7CE>j1 zE)^U|A(7t52W6K~W)30+Vd!%f5SMpm4k#?bFG4n{M@IK9;_TFxz~lLHMQXy25p_m3 zg~@nt93CW|O^RA-l2OX1ZkbP)%VrKQ0*5e{{ALa`e-F$@Jnhy8nJH2e(#K>?VLD#% zr1{DHr8H0rO*Ew(oC}V)M2zXI%$K@ z-6Qreu%s3V)m4~UCw9CWhn0zuaNPvR6*3i-kRoBqHm9e;%GF57vZtb` z$Z|Cjf3nX(%*nDW6T@cx3M0%UM zG@vMp5>+XBdpIT(onWSeg~9BYQDf2EJEMd0kRFc_j|oP&4LK~@S4I&ZNEs~3Gh#=e z8p^ZYmOynBu`E!;sd$<~2?=x)*na9zw9thTe;O!GSYY$eC1EPXuvjro$DipSVQxL_ zf@{elWsoTHDP;ndOa}`i_rjy8UzHXT>I45qkUv5N3z9#SO_@twO(Mu*+dQI3q*oS+ zdKbpY71!SAtb)sh2ymbcrojOrEKbB}GDqs*VQ8{O>Y!mflG%Vv2Mt47&nWBH!xQ)Y zf49#Rg{YLmB8mMei2}Gviv)`JLiUIvF+Yi&!t}S+uF!HJERNU;kDwN2I!Kt$B0)s= z@hdF~D4JWRr4$nBCl+~(WP-O)LIVBM$>@`aohV{1lZ1YJw=Jeke7vtK!L<5R0!*wBTnmf#%@e<=sbHn(||AWnZhHG0g z2_(VeCMU(hn;Z_i>gFLi zAbS@OKzVf0#>#I8mlzkuqo$^i98<1$EOehe01vR|CQvQrCe( zPkmHOsL78S5=En4LSY;83X7sFAtSR42EUbA27}wrtb`F~50g~-LJEnLomI&57d%%} zj|Pq)y9y;NP)NZNVlm#@PZS_h28-gy{06zOCxgj^2ylpC&?rHA5M46?e@(7L07Q{D zLI#WSEEgnVH|NWEN-ZSRwHGkoM=na0NQDv>D2ymzKm`xN8A*ItC}DwU<_07YemX!R zz4Jp0yFOL|WT(Ka|e(nRJ2O|Q!=Sdn-bg#J(5+_@`_7nDgtN<#dNRS9}C>O%weDi2# z@Nyv}4#8SHNrPOAm%|_rTd(2hAGh8IggfE zG?Kya+h>~}PYz~!I7%a)9S;e?Kk%XmNCMKBmbrg&|AP3CXrF`|?fdoeYV4_%lOeSd5HUeEJypFId!G z9a_q|^7(V0&!F~-k@1RUt#$$LgL9-&y4GOh{lcO1|5I$4t%2a zYNWJ!Qhev}@o%wsEH)6;C_Va~%@Y21{-V-*`i}7%e;7k(nPj1*_@q*PEwkPic#d~!d2Ik;i) zVjM&N#r1suHArt~hBzNQjcgtpaRL>_sFaj_XTsT;$zi}n7Krt^p%3G*i(^*OPhOXt z%+8FAf0_*qLvbXuIHpXr4eZ4E9UYj$*eGpDpe}D7AK!V&Q)*qv1yA?<7)Gbglxc%q z-WYxMG;pDRsugaNh+h-=l^J{+GDl1%G(IZCEgi0!xzR5+4R(+)sJ&6+du{AKu_>_g z$w~_7J}FA%^37O2gR}}4Fh6qts0&oHrG>g>f8Sqpp=!3oP+k_DX+c%C#89FAMQ)HF zZq|;+s$0{7J$U8yAgi|%f{m}cy@a&&wvH-BAGmyMDv$%dXVDiY{Dy?=s*rWSWRF8yiYtjcmYc=S=ZE{fh^|Bf6B=9LzrBLDU|E;Q*v$A+WqH#DQe{M?fCw= z=SD4U?_9$ie*qsG2ZgGAg;Lcq2qND!~X=)e-WzDjK7nB5dCzf`6yEsP$O-vRU?e|b^3 zKcPe`rKpkd`8si)w&ch6Sc9ar{njwDZV~ujxct%wVHP*_eh>JEgxM!nA&vrZBOBE+mcm(x37TKdSoRff)fZuDsoLlz@-UBIS2EnIrgL6TOaAjqpY z0pj`heI#?)AQ zv3Jm$6AzXTLlvfzAl(Fxmoae;Ab%&N6;my&Ph^Xu8W@-S#Gyy0P=w($IOC%AHWOWt z-T=D~zp39stuqNjdYlJ-WRXtG(6pWaO#9-|T{zi`Jw9GU`>*n?GLHPUQQFbMMC?V6 zrZA+$(IJ@zqL>iYfhlb1p+pEYKH#jQH5AAJuf#%KZ`5pI4X&~#2Sa7rbbtBvaoo&m zjp-xZglZ1-kVKpvM3aZgu^|~^)MD0tJY8W)0(2Yh_xUPU@kRDgnJN3Z(J&^#DxSl6 zlZq!dxs!cX=E@(vX zII)9)n3RQ22*e&0Vo-fJQlM<{(mmgMaT2|>KP$sE%~~IcK!bg`c24I3vmpT*Ix%`K z>hZWixcs$Iv!n#lyq}pdO>pzFz{-B3lTme35~O@_occ6eVL;?PmVb9eYXvg zxzQ0I#mlRW9$Leg6f1ij_Xtl8RWrpPi6i&o7mzw&7Z|#w(qwB42Vlk5i$dehgn_h2sc{$CUF~{Q7$Zo*;iNIk%|2 zrN+8q2}hwd1*q||V}El|fNcp1#9FPmu*FU9D;{`!RKqAStLo4zLyUUmMO;39t<#XV zc!#wpptDz1s_fSke&2Zsj7q{22duSRmj)!>{m@c&48NuDc?11L-aw^s5+0xd6l>!0 zZ&hiE-y3}*w3wp3xo5$iBS{Bzh+&~hJdw~22+`s~9rja)mw$B|34L0Q7F~4QVk2lI za=#2cDhxCd_%i`*uM$0Qzz!67+m)e375h_Y1J;dcv5H-m@9YShi^Ed1$agGxLZWsh zXc6zZokp?uwQ6CsQHP~yksrM8B)!*w4l!&PCGzIAHf2kI0`KAIi-zPTa6?s|nhAy= zU*C$I!#QR$lYdR%^kHfb-Mg?;jNAK=M?Q7g1*LoHvJWr+?wUct8ZnOQV)hG7gqz)S zAp!14O@u7A@f52r2#`Bc)X1YB6YZi>J|zXb8L`kE{K*E)uTa+owarWkO;`yTiq!ET9TUJ@sqU`foj9C86Xj)NnK#8+M zhwI@qj47zzyd)!0Dhmq#mynvf&lfY%WZYz$vZfEcfQJG$Cbgk22^NHL>0 zu7Rm6DEvS8X|^W+BDOs*|D=kN|JgIUem=sGR zLTItk#s?ihd02>c#x<=;!A3^`Ei}p)AcMORhkPhrzwEbopXZK)srwvx?#rOhPi!y$ z+jHk9=BJ7&1_PsJgva2dvdKOFSL#Kl z&VQUKIT;?z81V{06dGhrV=X*QLUq<=f&J1a!>icu>1mhW>JMURyKglh~ z$NFoZY1SjDN+Y8Z5{ODk)%VZbI)vX@l!$>nG)U#^Aj-GG!eH`;@@Tot2I2I*_kZjS z2hzPhrHO`1v6e_o&1dfvd>-LvuT!wdkE=|cP+mVr!y(*|Q?RM|{L^25kgvzo@;&=i zoUjC5+%%AnoWI(Oh{j92tWEmkr4N~wosaeE-+cM{Cu#oQWdb6eq*3td@zM|DG~$2x zi{%B*A4|bM{^?a3^H+Z?tZSCyUw{7f>;F7P-1VMsd9Y8O;=4Fnz50(=GK7uA4xa*2 zaG48xVY+-b-?8nMyY6PTwC8*=GwqdWEjP2j{N>*|LVrEw@XCt_ycH?~u56Ku@7Yn; zNnxK~I`Qv+{{2;u`u@Mas$HSK{6+roPZ`Dk{O~_N{C}O7(N5bi6o&8n6o0uuDo6xR zD-%c?+gO27RJKap#3n_mT<5ekIJRZGKzRBcr%78Tkvi!`TP6SR&-OV!wm*H*3*G4u z649koLeX@htvNozr_t9rNHEkv8cp-4uQIJHm`-Q!5oD^&1vk-IlyW0!2K&|TWO6ka zUQQ+l2Om3oQ)=P0Y~#iE9e)FEX=Fr=q4|C%!cTW{z09V|`8V~<*!$k;G3!C^!*P<_ z!8B7Z)VL%WQMdT*xJZ(2boRM)Z*}S@>XN5QPBg0HCCZ64tb1@6j5)VBS{DYPg*J#V z&a;`4ISxaKe8vS1W3BU)CP+5iXA z;r9<^GAj5Bm_}fZ=2))1?fKsg)eFd=IelI_+pzmC*Uga3JHkk+4GPjq+6r^UWg3?IvqISt zBEaU>K^6w8)U9BcdVf}lpnPL1>23^&G)Zo(l0zjh(oG zoZ)D>l1cIlth>TVfG1@hiWrSGu)1FG%Iu?LQ5@5h>d=wCjqa-y80giz5Iox$+I9h} zDA4QlC;ghr zbVo+9(n6jKN4!{B-e`8jOl=g_t!WfiZQxbuAC*weihlwz48Hd%dhnow;sdz;vFAnc z;zf{{=`e*(TbfiDWZvDG&bqkcvS2PD$@i1wW9>^XgoR3x2UPOYRo;;br#%L>5Tei) zj6?%O@(UQttuaT<<*q15F&z{|!{R1n8}lqnc@q@m&YHTfS_fjVvnzzu$mS{ecrhB~ zsOnS|Er0%z7%&_e0@OddPZFTYPmr9!;;lCvgPt&i#X}hy1aH zmUkfV4$?2;C*f>9(zz>9*!Z5J^6A2(HF6bR5YmEiN=a>T4#WVnKno&rG?gwcQQ8NE zLvRM0nm?E=CUp@LM!X?<=3`8f&vDYb)00xiI(uKsjbrY= zjFt2OmhkW0&t1$8Lgg^GRHNe6|86_y;v>IUE2%jvneTr5;SVgj4zP(!SC8R>^M6h_ zl1Awzf+kT10%OAYjL_R|B-)#^AC=C&OFB#Ie?n=bHF;RS+;0KrHM=)t@)-OEW z)4bi?^W5X}*&jZIv#`|)kWYAsFn@u4>W7pQW{of-yR8=X5a%#rWZL@M0(oE>Z~?vX zxOZkBpB%v+7;PR+ei1AHaX|fMkB!TdBh1=hC>-acxD;k zN`nNQZyCGVK^RRu7Xuea$deNVShzF*9|=4&+aVHyuwVmHryH==*3Sr+v3~@S=gDV| zhoS849K{ela5;u0jITffUq+ z=1X7vbj56_(Qvbq(q?pavwzrbvVUzxc;qS6Rw#34&u8z}Ps~KdSkA5@DzhjFu^i-a zQp}2VM?v~0Bc ztSXoLQYRCHFP6(`et*Gj|O<6@4m* z#;cplkDK3sOrkI+l**|gol)!W)m1^z_!dkFh|#+;~>RK9+%9ND&RE?lkQ^mg%g^AjIZAmI)=S6kjE|M2Y3K(d zpduyvFr`^&+Ly9L9(9va*!*_|l2`5z{(PazmtgG`x__1wFA5}Oo$=`6*?Gmm80cT0 zB|$eQnksTlYuCHymTx~Id{L^A5|>0Wd3$}q3+QCDSPyJq4}DL|3c^4Pyzf`!(1R9> zAK()_i{izLATiz2h3)RL$qFL=yR}shD$XS&nVC$ci%H(0=43@(6|@-Vc~_TFW9gl}^j&Mug047Y><0O`DWi=T?}L-9HjFk}CN zT+E+an0@c{M(y+CnYkTFIS z#>p^`MJe9BI<{aJg*KazeD8i6kyO7)DpZkaLnSwCQe5uTNj-*3|} z5Xay1R~%EdI8uiS4+FK!_CPaH3A!o>UI?;0=aN}U9Lsjb(A57O=f~1EYmx9vVxRAO z-~0HkZq$SFJjqHligAQbRjDe2I@xfI3xCh!1v3VkP4vW3Sy4&ACyO#Qki@mLqTEHi zXAj&`^?e~Y7|X2tWVPgNTBfV=w%?G+%kdN@idl zrAe?D?uZOXA`E3(vp-}|3if1LsXoxCiBc6#nD|rh_loZ{x5J-CTe~EQzacpQlYbll z*);=i!6(5SGA0U49Vq0r6*7l2--QMj?$+5Hnj?cnHlHh}_QmxVHSK*xV_1%)Z9kZH z7YT9*gsaq$w&u4TGKpgj+UmF35h8k0wl4z z#?iFA5yqe;yY!!a!_EKoYH0q)O;%}S`~i;W0yDi?2(MxC$ck~H##VFQLh0~0PKl}S zjn%#46fQ1<_JZHr7_01A?ot*9;qB@9KGEUU+j@Til}^hFgD?=h=PUN$L4T#i53n!j zxlnp8$ht-pViK~+L5lxgjir?K)VT~hJHyQGXge!}#zC@0l5jSIH7wozN=}wSw7o_J zq>vdd=&8F&4$6y%fEh)eM?N`;jnQh1S6)Q2p;kRXGAuF4<-duh{1n@u$@fM>Rgux` zT_B$(WPoAUvHZ* z5P$clIOVC8P`CAQZw@$(HG+|Gn&pvz6Fdg5ogMAr4NhY{MB65C9IXX^gny>1$CFJUdZ>pt zxY#iuz#n4m1~;6bh6Y7&lEn^bfKN7vf`53#eb zsP2fx<1EtJx(7Ef>bSE`o2%`;gbPaJNIMno0OCH|ay*sS6x0ZG{uFah~Y z;Otv>q`#eGU8Y0tLVuS)>xlX=MJxs?Hg+Hs=J?`A2)6Hu!P&rYEC0HiXUO`678>s> zB3-z4{`_f{HhrAN0VVB>X*~;mR{Uj~NEI4C`o8y9iq`m{b(AQ4XUt%$KKS2u&T>2K z;3HbSS)c=4{$BOo3SEuf5B9z=)O7=3iQVD=rJD{R;^7_c{(s`fSr7h;`Gopw0hL;r z9oGV61*KN6G7}jrc!lpp0y}BeYHI)|G%w5^)Czd9haa-Y5)eO2EvgEXW^z;JQeaIM zX}-;5@d8W470N&^H_{-fQ9y!sDk&-=+X$Vm@yVAmmu8=^l{5u$u9OB2CD%r#+nj4C zx4Kl7K=}-53x8RxG^&V=D9jV8VhzMAKA>9jJSQo}x9DDzKS))%*Yag;V6E~@U~wtX z8DHk&CWWEWoXbrD8Q<_1F{2c+XhvfP8YfszA z_B+2~c7--cZ%9~)Po>aiX{xefTLiSLD?ri2o+Q3Fw&k%C&~5+wJ!c;F*q+G)((RWU z36VH+o^zfvCvV;+vt)0t|7wrCA~&;ulSvRV0{;`5W+a}Fvv{7woTWWjfs5K+hkOb` zP6j?p=YKSc$eW1Dx9{|up3hEkEx!JYQ$HYo#M5a&qnNz;Pj9T=zvC?QdtIC)Bg=`15O@<|wYEaJddG>L&g7Q|7PBq5{lY!R@ffV((98-BVTA}S$7 zHlrC?QcnDUXK66bGvy55Rk`t>MK(yq?}*GC@Bf%z{8wH87GunUSAy?cE!IV!L)}f=QNRTNGM>m8u7I+ACVIhfe3dE zqIU+ZcIViD?Dt8^rXUtT3+#+b$qEs8jmW_%_5F71`e{CiqbEr#0?u1qG8(-!(5iDwy)0PJjERk+N_ZgTgNZ)4D9svs>m&3soJn|msl<`i33TN3D&dw$1B|x^bG-n0L^GI3< zd!)F*T@p;lQ=F45eL_BRFgmI>HHZWk4S%&Fn$nzrBY2A56o9D!^P!)zh_oAE@Gjyp z2#G=j5zlDku}&AURTT%j4Nfu%Ql5cf#Sa1imq@nq2-k?u8g(C$_(96NEKZ-g!a{>g z;(>(`nb0sCgUV1u;f8uM`z07^B8r7{lNgAQF$2PkOoIh(NS;oMKz~W_`vB(QRv^Nv+8=dk8XX6Oazp#0dJ+&1hrq6Xc#!`GK zvL3j}2#h@)A(4?(UrYQO%~?8SE#>K>1r2i`YsGzBpjHAJ6e_Onmf!C5=9intUbogT z95ytkh*Tugv2%xPTb;kj>IWlmtzoqu<9;r)8|b#4nKpF_GC=0A=6@8?4vSH8aw_WN z=f&KnBxfp&u8}}TTPNo-%oL25QC$$gdKCLPApx{gHSQ&_mH!fxf~o6j5eNQCA))6f zgcKx7l(tw>6Sy8fYG3QnD}zQIxNDFyVg+H4qSoTwuj*Xt-LCyBl@YLog}w+4Mie?l z(H}sr!tR1%l@CR@bbt0PVbE_foeBs|5(wLvCSWNn(VtW^0WAo}$BQ7&IdlR@NwzEj zR~UQsO)|~G5LT`x&|)wJ=`f^kI&Y!Pb0Q(6Y-t>4rhqjJqG%vhnkW$Yd&W>`luAEB z>6)0HV`=Suty;-(x1_5|6KnobP<3My_Nd_N-x)^Zs`->rHh;kIC0(JT*|e^4pl_@- zY#U!z`+gz24p2MaRoT|EyI1)rH`|)o_hqksqV4zg@cy{Ek5C=5%vLMhO4$2b1$y5o zOf~@m(pA}x*YR$0=dz>?DX-k4b>_4QjSA3)@$yAXZ-S#K$_nf1JUdh$IYV`E0=3I% zT_Ama!0sE2$$taclm;O}weId(+lKQaajx{wg!62c#!F7_&LgPp1AmZCb3FeYK6)&{ zIR1k0FKWS^rhtCGFqwvlpqwHL*0Oi_7vW6vNYgejx`6Df~uoO`&A#oeXf2KKEIF99oJ&W_uFJ_zKhdcod2ca4fQS%{c zK7Yo`(-fjnsk67wwVr_6HL%$g#72@0F3)mpH)`Am{eXHn6oXRrLB0bipE8}U_9*t4 zv4~4X)xeU!G6#RdTT%0F_XV~wD3G)bgbphx7vRx?!ZKoyVCTHu!f!_tmU**Qhy3;% zMn^FJ(SoM!APPp{!(vTOiP-9N$%pfcn}6Ze=if#j)0jGpD92cVa@->q3*E!__8b-p1QyDT_W) zlj(6TLb+&nirBj{eylmFG9oyt2uHJ?XFkQ?-MRxOo`fS!byPsf8*8DOE@|O+!hcQC zE&zQ%g1>OIt~|%;7{|_7>xf-F!CI#_31Gi`x1O!9>alSq;`Qqla}Ui4gj2~&hy2S4 zy{6X7BkX8gz_)dh_qF0`b3mf>w!Rqp5~a^I$4yNrkIL!IRYqg1bDE9SOn%wGOkSXR zm+BB!)<&{7lSxbrXaequyUQ}#ESXzHcoTp3*zu&SA?k`ohmmRF2Hv6gVq^TS41uEc zTLzr1+>An(sy47*SBo*}LZ_1;@;|^64biw!lvS8qf}kDi6_Vh8)pX0M`2PWTkh<3O zrx-;=K9?XiGb%5zVIRV8v?jrBqIyTZ5b;m;#K;V&OeFoT42&CYL|v=3edzbgqDX(0 zQI$QaoCfPM=2qfr9s}E}9=+Uoxwon={PvAhc&JXXt>Z*Z)Y<9Qo!Y2b>dmvV)UqsT zH(+{_6-YI+AhUGU;<2T9);dEH&g1#YMXt?h{)V<-sEfb0W~GJm!7bBIV85?LgCaVQ zkJyfg&J$T&LNEpsPxB}eS91~h`0;=1Ulo-}%M;Pf$9p1PV3rA%GhL zAC`N*%F&q|CTRLG&&T=%NFaZ%#;oNG-CTK%a8X#3UB+C>k|r@!1PXSK~ zK>>8wEs)m2tb~-|?WDxf6LgwO9a<>Q{v@iV4hmYBmxrQPvFr)Z)x6jCwG;qq{NF7? z;0u4)0$nCq!yMMn`+l@x}SMJ{`jcRUfX3 za%gy2!&1@P5@o0jaeFF0x$Rto0=pwe=vseii$AA32!jW4F=^|dlP0Q{$;zM=X zs<8uhzpVlZ!&FC1*zbR%Rol!7IXD!>2Z&?ty}rD0d2Go9qTWG_*vKcEKUt{1epUoI zd|m`O{E-pFuC3=r5cA%I_bN7QzrlghU2_e_#prwlm0uh#*hrxoCE|8y9n*G(n-#0k zihbYvUi_Z<+KUtX!FL=|{C%{dt$%I~60VcwocP6LdCK27YEZwO)LK^3e&72awN-6T+b|IRo?qcg6-f}I1vUz0 zWiVbwr7{pme4)rP$%R^Toy>OFVD!Jwj*~PEP+(&Ikf!$CbN4)VzI^_Yj1tFbwGc^F z%wiH^0fa5nEQZ1zm( zL1yeVvpoFF#iE);BjmY7Zo?wEVa3r!yxr&cDWy#Fg zR5>_P!^h+kMpP7wF%Cu${K)y29x`FL(l<9$DxE43g4|7u@U{kVmylblwCgV+B~q|Y zf13LYCDeaI(>D&kUQpi~hE#AehUp8&hyB3;#=c*TQKgvj|47oW2-{30oM*i-C@7sC zo#Kmwv-AGRcii7c+dcHDz20u4g$2|IA)*{Y&pkT2I4-PQ-<)}kqM0!K)~QR+y$2p* zn=Fnf0}MQfLkP9Q!vktOckESVG3{4R@->&Kl+u58dcC2{3J7CZL+j`|bML7#<~ug{ zYXt9h^-VH{lrVa4hDUx^DwHM&n1mV!J0^}vqAM_$Pi8kJNo_=wS`|2Tk+L8*nGf3} zv@N0SDju_Flc%n3i6B802wJXDEU3}w7QEWkDILm&&JEsF;U?t)OG7x+Z6dWo?^CL# z={kS;QekSL=N2aed~$f3rRN)vV5I5JU=oS4O!^^kMI&l%;kMnX>k#BD&ukJeQS@rK zOF8N@Q#l*oGlP5LXoK=2@lMh6PqV2zj1zU|HNOo`zU~grFI|j_7wnyC z((Si@>wh3B9SmyH*8KIi-v%0QhwUdA2Dtyr=b`V%&!7JJU!K0+@yp}=*E<^aUB7=l zyz*IGDR(75|Kq36Gs{<^zA)bJ=wWr;r2&Tfy4Y>^Bdph7cQD=@Ui|v?-~aQ!zJC35 z_388V)m8mdzYW$M>}mfD#TQ;3sL()Le0*C;HW&h_4ak(Wa2BN&mZT}9bx=tQN(y3q z!%D)#Pj%ZuI5OhvIE!KakO%#T*x-5WR&(OAQkV>07R!X^12JG z_b)H}M=&t!S7tUE%tbjd52cloY+Wi&3KgZzWW7+{2M!PpiA*}FQrD7A zi+NGj{U6uA@B8f$=OYs*f9ih#X1C@7ou7TbIKcXc&tK}B-q3o};mtMI^V@AVuIl@* zV9!ywT!A$6IxW&hjZE<~@iP7*ct^N*|8w9J!D?6txpYrpfRTl#4%)q9-Bx|4ena62M(#zawm~JZiS`s1K+- zuc0*y3a&X?xg?cR(rgm4J^@Q znGiXRmWSmFqUAK8W)}j-n$aCl*&*nQ>9?6R*fn;mOe3fJa%0lmfabKcy{P)m;AkczvX+s`s$g_-Ax5q?Ih!DSKr1Xe zm{_GxL&M(Pz_9B2>kVwX(lFVmwRTFyVf6wkCMcS{gk^sRPbF(8K7mFs+=CQqlT$(K zL&%w}ojx5EPhR2)!Sl;nu=Qrv)|+>r;pt7AjlJ;sL%{FK?*Pzd03ypuuIH#6<=Se`kn$|sjZ|Ts}UUXRf2%e6xn#C?xR3B_o(#T>H786UI8Eb0- zTX#fqxmbJJI?XdxuWB{WzF*%hcc71%7QF?il^qAh`4nP^b+#C5FT#+DN|X>CSyY^D zto>TpsT%WoH}tz3!WIoP7dH>fmyz-kN3)(Y)=Ph`FJ6Msq8LRYaI8oboDRZTFN)Gx zpY{Z&m{>i|mlkEpN4299aGHt99%4-qE;BwWOb`>79~9APuEf!?ee%+uc8kx68R3@( z561z+boCtu4{rf$P9%q1e36L)9g<5n=m4>>>gBHj_#8A#nzpue0Q30oGBa~+N?zWk zUVwjSWdRdsjV-Zcf^3uH=0paCQV3QtJ4SinBwOB^c?F;~htAlfd3xuwJoPD9t^7nv zAz&;lbA`~rUK%V=Bq4>?fhd}cI;Iwh_Y%l{96B6V!|nP7giDj@T}XO?tyu<2mAT}2 z18l2725v?!7<9%8?>uoqPT;xhoXyl9ls13;-(VOUHyuEC2m61VfC_FbOKH* zGsUT>NhZzCnq?maqXG$GI18PZi7U02lyg&6IzlPknpWM&NSaKyn3)D2R^N%4mvDbt znF02g6s+go?$~f8DMUd`&KH1`R47Uo=gR3_)H!Cl?Op%9WjA?lGeOU7Cj25NPe7U{ z5!{=k@mT;AXSsz(BS3HqFJ58<6h>)Q#Z5Km2x8=Fz<+IaYZw)BfhQcOnhrJh0&3QEeS4`IwO(V}c3SBhz599G|lhqH7Hdd+#Decd$iK5`@G zyy2vA7#)HGPnk8ZY3Mck;Trqx2;H{L1xzc3ytHDxfY3awb4pp~jfkw>R8W7(15qNA zQZTYm3|u}kLTQ*<^5?JnZ!H%;4S>Vyg%@8xy!Em(`@LvW6cKguu9_PaVouih2oe=H zRUwN!{fmEn*{hCA(cyJ?y?c22=j)FT{au%5cM8P+R%LeBD%itz1KoA4bxoVwQ=xZQ zy@22s2%2p|ayAx1DoSV}qb`40C?iy4)yw{X@+qS$S&}szIbM`1_%+$HxY`^}?k=03I^~|)!o%u2v2#Sytm14j%E=hm zC>xhiO77+XJ$M^6t6F~v9!ZDuGO0GQAKkb(`c|_O1vNKO_+>sGk+kyR>(I%P)!N4> z1Xj1Bm9Lv7KGY3@lwVTOAhloEoxjjJSHR znme+Ju>jXzApp+^3;MC^hXyrfW=pDhw~~6q(X4z!E_tDWEC-1Z zL6AGAgnnE13DzryygV7Ovqi(cThVxdrMay{E)^-~!jZsL!b^kcCPeRSkZ z0X64UjyYh_><0x`8KVs+TFovWd=cD^Y&|dJ&k=3)yu|H*wCZ;?jJsF&%AFeJPiu~T zx0*8tsg)s7j4>LM2AQKm3W61G^j0Snxt@>kWIGXMu&Z0MjQynVfMzj`FWzBohN_#%fev>Nb~&2)g4a}Y;eHROeWGX zGBw^>)Q+1>EIQfJ5D@p9(r@qU*nHowm#2!BfA@Yyyz=TLRJ=mbTp{WXSNw=p%Vw4wtB?z0dn z`mBF62@Kh3?ztia%mI|jPPJstBc8fJy}#d&v}p>LsRTK!z5_AOfV7VWbg8!nDWgL@ zm+d@vS0Jwf=;Vl-iU=j?hC8o+g4pJUI~P7SaUMZ5yFE@DcKe(qCW3Ubb0xB$$^dO4Elet`kIZ$Pk4IgGe~)bsg)dxDC&t~mg$f% zE9;94Mbsg^l|DopqXSm&&9!ycukSfj*DGw1V0ZFL&E4bju>20O@(NCS%VE`See@J_ zi8_>=RTA38L!;q3>r4_7PanOR#>^8C76R+lw*huHv}xpLZa+s|s8ZjC)yk7}Tx@?6 z2Z$x^%FZa(>Cr+8&Sf^r%8R6()u$&Z3p{Q6VZ%WF)=+c)ZjtmFSabijQGhMhNf(W0 zW-?}7VzTIB&cusWs6Y*mewaYo)Vtfe?c!$q-!Ghwh?+I8^agYeLP?R49Up)%S{6cQ zqqHI=f>f~KR`CfIE{$IQdE(~*PAh*eB|(TPrWv_MGU=nN=4aoS$;lBwFdm8RKq(6-#nBr;99bxK|0Z4xsHp?X; zMs!$jrOK&3cPV8pLyD>4X&px_ZDsajL*&fL8nR*o5LxestVIbN4Y9D11RGcdCuRUC zac630;T|^YCJv_C=ZDpI;NSqESCRV)om>DiH-zGx&jkEPj621ugjjj&)a1F=R)N?TDd#UN#}PK2CJ&!V1((w=Cz z9{caKZBe-OK;LX1zNigPVYE*dz(|TQpsKq)O0n`U(gw6al24YrWhZM8mv2uv-a2yK zdTUFZB_du#!~{hv4+&V7Mg&SGn}|A=EWD2*I25c)ybhR>4h>Ib`3a$dT-}b{VwqL5 z4>?p9KICu?NGl!nxnadqMrAO9Ox#{XomX?YwVCaWjV21OmfFpiFMs{*{{XjLG7hT& zf4!Y+Z{#?ZroY#(s1F1546r$BOwFKcFgv^J^d-~XcG~T*v#JLM3be$CV5LG*>0&$T z*Do)+i;~E5PE>wKM<{sS_mMr}Co*uHa;Q4po{nIN?f1)(M5c&82{e2|zgdO-lH-CTmH z{U=fG@3z~5mj%RV629u`?c%75*%7b3Q2$@Phde9g8FVulge+?3eCH@BQ!Xhz@Ew15 zlhR3-wX&Fn+~=?kLhRZBo+ewdy#Mby=)>MbnIq8zy4mDu$cyF6 z)MjGBoGdmaD=TjY6Xj$u`0DF3e+cf|-4{|?9?6o4g!ezTIrlm#dA^mW)#jNMx%90= zw9|rslP}cH$>mF0UZqtML3eIGe&TwQ?w+5|UWzhjVJW}t>?cim#OW@OF@a1K3?uBS z*U2l3MRb<$ssm5T#bRl!KNo9vlK;mVPDvsTAT9>-7wqaXY_Fu@V)uT9AceUK}FpWgAJFsvsuZ*CO zAweu&f+lKS@A`14O7;>1h1>9{Lz|HcdDUf7VEJxs_iAgEK_?fC)Yhy+fN#XJoQG56 z(A~A7+ufelimj>~llczBf0m6u{w}hAqcR?fEgPS+SlY0h%6p=>Vz1gj>C3NV_G7&j z`}9EO+>=@{tzL2wk@*hQ)~xdwV5~~4fn`r+*-({pr7Y*D_I9GTVlT)tc3*1Q^irf$ zrhTau(>zb}ZIwU@YrFMCa0TF<(|Px`mTj*@%tf*#JK__)b^GF2f0Uf89I+^_B9xpg zn~&61tTVdZ&YbtR%*af8QY)tNLQt(wGUu`0vi+w6**^EBR!oyB+mYE0#FmXevtm!> zJJ4FTy;e_9seFfGYsQC*7qZ&lNNvSBOp{kK=YiOY@qz8=4)#E7)tKyB8fdN965gY( z-S1D=$u8%G5Omfff4w#Pv=m#i7S&j8+5E3Xn&2zD1C?dNn}{xJ4YXEl#S4F3dury> zOrHp@`oA9_%?kUD57kzzf8Ub%_N10gZ<&ZQmebuUrh+Q~>WQjUCi5Tbt=Nl#tfoKE zTCpvDBg>*s;xL5Dfjs3X-sy@7^yi}C(&&|f9gIEbOQK0T@IfJE(3hw zj^$R&=?bj}=kiKzX}>SN zJ9jES>~bpzbkCVL&JUP3yilF|=$9~u4laLf#z1SuHlsV!ne#dREiQ7h=dUBR73(76 zobJjRs;yb?$)0u(v{r0O2D+T=E%~9^nsd$>-PJTyTeX&=bfw5hZpHj9O=GeO%1CY5 z`YDZG$lCBju{GoDcRJsm)`~5tV~5?%)>HEkANSXf-K?x^vDrSyK9%rH2DcqUYz2QoH^#V`hE~dI_OkX4qhryBUsC zLtQU;5z4#2o9QSq)bpWAoa}$Pbly(t;OM`FY;1n!amMHJrA`_QQUcvRRlF$b!J|)! zDDPRhueU9F*J*-j7#3us>v_`B2V)!rg!szhir?qytB4eetkuRCOe#0MX3g*@X!n~Q`rLox~@ip-DV%id7gg;(?AVwtR@Zc zIIbvB;l8VZwrUUo2yqe(!m4s+`MLyBCmDVt^d8h1JrH2^!4b)2QszfJqP1`V(8<++ z)`G;gzJA@E>i`mSb6L83oAfl+^8arezfo#G(Kd`outu8AU4igsiqDV2! zSAP)mjRwX1^)4N1AWMJr$*?>Mj(IwgQe+9zFK5jtoD}aSWh?h0H%Oy%GE@podc?2l z`eXAgPfuzEZOnsMoJV9>Z9Gp zBo8L3fv)OrUu%EqCQ@75LoohnoaW+p7uzN!!p*e%&eMqNi3}ZFClLsD2RpF7p3h-? zb{6fd5uWas$xcSuZOm`pg0CV^6E(xy^Yh0_#F4tR`1?#ft(QFLr>1gMJrUy9x$`#X z-b7(2&eJN6zNC$o-=SCtCSBp9+GJk6@|ya zm;}KXHr0#ic41mFBI!0PHth{empHHo6F`Yxp-|NAK{JJGm&}#XMT-J?oMV$67Tj5p z06*p|dCJbVvS~lcZB2gn-vJ-ZKX?~B^Ep5oze9g|llM^{Md2~%F2z6OLUb_kJNfQ{ zczEhE72x8uE&ZW8E1Jd+6u&{y=op z30Rdq)sE2Q{TZ=83Yy~3pDgdIp6uSocNm0+xaav+z1~SeWWlj6golN)ofPGP??fT% zh|Yhf&=%?o^j`8rjq7Mu-;zY1nxTO0k43+~+uYa^-lYB@8ZC`ID@TBOA6GlEGUjED z%fxy@sE0foJ(2eF^F?(y9J>wnlh*wnjM5{V)n_xO_Nr-@6y=vhX7wSnbW+!0+x+4{ zp^^o2@dRk?Fx6($XbkK+TpJLK1PJJ^ORj%=py&yfV%0<2oRem|D`S&Bu*(pTeretX z_@7-%C;`x*hr1t;B@_Xq$H=Dj%hzUwt5uXbD(DAMLEPo-SPu}7C7uGU{@{#K|D~{g zNYk<~Jv#ju#(|_Tz2gk#nra{rO*aR%rELzZ5?NwM2psQY;{b&B;~|qK%OhEO&clD? zp1!(deo@D)N@jO+l*rS&9x~u&XmMC<6Ug^-NkHUpAl!EMZ8H zFRAV(b)6{P$5c1tXZkx0QLKSLn9qOZAvXUz=0BA*7^X*A*L`Kwmj|w90?<8*Tp;Em z!8m26YRp9@bK3HGP)UO(CCaWDs#WFjc`Rg$d);>uLIH5Wiv3H<^2n276bD363sg8{ zy)GHhM|DG7dRn&Vz7`B*0`r`J<-UGpnC1@tTqEB z(XpJJqz1aG0nv_@!=#>mx4g_nXqMv)t9ZWMQ6~(#bYQ3D=0s}*Y(ca>rVU_utFi1m z8%EBtn2}d;V7a=bsz11%_DOQEuSjkSp{GQx+hhmZY#4T zOr0#S#()W$Pb;R)2eeN+;pgA@ap8&`m=0pl1g^)K+KT z(>$=pfC+L@?hm{aq5NDFVyDN+tPr#@K^H;`aQR!sVgQAXqd@s6$~RH)v$UR+|0Yv7a zST6b}<^nJ+sMY-PJxhNRuBXWKK^TTnfLtfOIiQW8u$OI=rJC!=TBjzn^~-u)2nj$M zdD_vwdSMhG_dZAep6Jjk9lvAWMv&O2Z=UXT z0EPL3>hGb(ps<687g{zWgkcy3$Yw9L&Zgh?7Q@6>vks`uD`~97=uU9 z6M~2QZu^Uujgbyif1X24>~RmGT8MuL9!HKvp-Bt1JZDAOP2#7%)jutptAv3i3WuTo z*LQUX^ENHsQXNT0N0k(BconB?rKD>eby~dT^;!$QHN1wm+&jCwmtW**}yjwke z1{7OWUx318ONwSqJJogF(PzCvI}Lz(U+}F+#Citm(m|cNQN*(CaDL0m{jy`1J}}AY zj9pqw6MI~1sSk1c(SN1#*8^w*D9t^O!7vO8()5AYh+V?UD(8BJYSo*IM_)xDUPL@Q zU3~*J(FiOOlz`PsEJ6g`C?1OTiI?W!pU12y=4U-`NT%r#&h=*}*IrtvM&6zpe~&~Y;yq=h=(q-mxW7WipDyEaT?sFDVCN`IW)Rhq9n71CZR8QO@m zaPMfQlj02Z!Ev!O387|A83dU#>JR6#A+THQC)x9A5@S6bF7H87q~B^+(4HZpGic9o zX{P>>A!vsFvETBv+9OBcWZJFg7d6?w`Xb!=VWw)L2}=mvKh2!3kX}NtmrUAUKgN7_ zbJs}&Ya|w@?SH>^oyaS4?Y!3{;~*?V+l9&pVjP5pxJ&r|@H};RR$T-11EA)2Su;6| z>CbwevX~ch3mi58O;j)p!b5zNx3+I9ccs?cB*vS1?laxq%3DIXcCLH2Dlv&^DUxdK z-rx5%>G9TAB4KfSbaif$xve|`aQdNmpiL$( zq{y`+ehV`WqXLn|+IpX)5k(zCh48=+>Fe6lv=KrbgGYGedBWD}c&&Mzn!t9Sr*E#8 zrb!GnmDzWz1{RBAC9m}oLcJd3t@*vH_1x!trX-$dR=S)ThH(rP zg3hk|oPXtfQwmEiGpzyIfhFMdkzNInVB5S=QCE&3C6~ zi+?6*V2#A$n7_JQGb@k&jUQE6>qImcObS&c-~3@@5G6z!SBI6t$U>o`NHGpCvkSZ~ zap*8Y5H*XUFNKOBMmQ^qG=y;IKw_BLRaci${Fhr@19@W5!(t+-alXM0jEW;fS(?Up z9t1R(@ghdNc4xCd#PBD+@Y^8sdS6RbGf!7)={Zh;`3a2DVOF zWC$U^1COe;*Qrwm6Ge)V#SFrs!{|Z4Ib|GAiuS6?D1RayMhLQrh5xD2L6i^~h<_p@ z#(0VVZ4ezq4FRgTbdl6JuzZBUNpN82Oq{B^*(n3ho;X?U?kN$!tvv^{ z0O=?~4E5k&T7E>>Pt49!(~8tVs7>jygPO_^Wk-c^)d z6d8uBU+}elXk!QyLy6#jAV_O!T7U1=7vPo5e6z2%+qIDmV}Lq{4B|1>GtBrw)Io$0 zPg&*Yt}t*7V+GZ*jbPaUR`Ki z$!K~@nO{7il~7>SA!gOD=n6%$gHw(ai23xpmw}iL6@R)lo>$CVJQW%Yh!W#Vnkdbe zSRekPKJ=bciy{P&asyWj!XycwU#e(|H438#@jOiSXacMUzKzZAooPoXy{)h9I^;JWQ9*mzJ8F zpp3&PK|D^*Gz<&U+-{q-N8MShkyspASTcFvkNxwlH4=^Eooh+6E8r+l?EPlX3$F90ud~}2!zgRh9O_~ zX$*qEJQs5|A0|imuFZPY^8`KSpEiqxaS)yebqFoMW%4TWbYTemB1BTd!+uDL-Q4+1>RH*+snHr_8$WCUl2pK_+&{-|HV zxQe)bRub~8z2Us_BuewfN;L8ElTQCZbO9P@Nj+&-4WMpG=C)(gau2W*0EJ*zP^37Uj`>_E?b3N`VY(m zXyB>NNg)UAWIQXZ@$86f25ajF9hdL*HZ-_RloY?MseY_P9Ko~2SceqymFH|H%lN-O z$)=x5s>ZRYQHF3{BNY}L_VX=vY=wl0(BM5rK}Pv?6ce)D7- z#Zn`ENy{s>90-W12_}W&(W9)ktA7dGUR|ryL$Hwm6`a0t*MA;(Chy!{mvR60A529~ zL20YE_+!%6RhBqa`}i#KJ?9qGR_Ii;<{_($k-;e%d8&3QZdJ5hu#$l;t`YTEi16AugLeKu4j1hbYWB=rp{_Q z3buRd#bi~W!t3YUnVuLkSc6D19Pcwmda~d(+mlpjpOO$;ifYJYzK_tL-#Z)}>!bXID;GEVaw7 zP~-%Z_xnuMFM1~qezA4fE2<~hkM6;ZYC<9L?P4dOZtrm5(xRtu0=}Q`S-D^AIJyeh zmpBC>QSn7wa(Nsxl4E1Kp%-USyH=&@obF<8kHpc)%YT#c(EnYZbbl>m;7Q-}+2GXl zzss+IfW*P6-U{{h!aTokIy?M>9pZMK(DnDhc7FW~e^!y0ygnXF@0I}cb^Hn5IL+_C z!aFF$9-QFK)MOXxqePc^<^+kkn`1)MJ3u_c?-c zBtV2!e{kwvWTP6!pMM0(sXNg+8%Zr;jClDj3;6o31P1Jj5aD@r7O{a5b`+@_GHu^F z)kV1|J^CQl0!=@=pcj5ZGLP!#0w7hM8*`d1n1eV_I4vLMP}+ouXuT@0ZrFcNwYA}Q zuKc;upT62RgAVR`G{b(H3f~aEe*RT&w^W_H$QRUzxz*DI^JafNkrm`XtMH(&K@9ox zsOq>nImjaIg4&6>n;WUe)3g=#ks^}cs1)_J{!k@%NqijCXI5aB1aNF>#mS4iTmAIQ z1*M-J=REk@ubjDei(8Q(}NDyHfermtmd`6@SYQ?TDcwD9Y-k z2nIT?#+z`@4@_U#>LHGhcXD~dk~`RKup#|g6{Sej&oAj)@T(O1P-rE6Ksw=|ryC4q zQH1r}Bj(;m&1n-y(w=~km~7N}mlV;fEAK4pWl|kZa3qJaD8hv%JP6IBB{0vVM-iUj zxQ&HTlxETO6HtzYQGb+XfwmJ+j)hT_X5$Gc$HF*DJ$mRAlp|pjrK&*a?)1;kH)&e% z_B$DFs~8LosIb-H2+LD)j~uAL+mG~jrjC7Tg2$)N(nDDk;ZqXvtw?xu0!)jxFY9Ge zit=c--KTooI110`1wA=$qW5-aV*8OMN49doR2V^7KVoSf%zrJmEC8%?@_1s?{y!1# zNE}aVemN2CNSuoHmPdlA!sMjbQx^h$-O_!^#i__A`UqyV`GSXOBtA{DP5AC}9fa|HKDV<=K^Y%&k+A%D zlkP<5fzuCjvA*w?Fj^Q7n22v8RAX5_WM(O0l>i(I> znQX$s-D?4u`?Fa+Lch3%BLtlY3gZ_n!Y@$!3m(R7eqf{{Lr(L~R*IqMM4%XE>L&z(5rEpO+2V=}c@#PkD27_e=zt*5@nG{jmF1kh z0_5s{UrRs{WUWS&PX*?}Y$UJE70n44)JqrHt2HT`OqU%s-qT7TcX3NkN;B(pzh^W<@R@YbWa%yW>jj)Qo8 zW=Rx-YRUa@gmX6vCD|bEO9p}vawyO4#Wtl*h} zK*Z#;`ZV;(De}iim4x(f{P>pU5i#jVm4x(Gt>1Wx!#Wiv;Z64Fx~SIqHLj{|jQ z#COP3j9#>_FRUE^sOhVarYjH7u?Yt_UsQ(-RLkyy0j_2mL7=M%2Dqx%z3PI28n^Kn z@5P=kJ`i3#VMa7+wQtz<-HV3%BD4EQ1NtYBgpUO3{-5A|wUq#a->LqCv*$oeR`f#ez*$ zj?dZgLL9ERY{+65f`Jm2=(+@dy*C)qC>1OTI6rh4@Jyi@(zmAP2o|MN!VndO*dbB0 z1e)OvTwe7k?qJ2$kVAL3e-i~iOCTL%rc6PnM~QcbDrP2hcc_wQ4EHm*DqyGk8CVGz zJlxUFBHzK0+jRa`37u)iNZ;48QR*nwtLG1RFbXpIM z_rSLVOi~3w@=*^DKvrWK5dsdfYD^yo5#+)T| zr?%Cj#3MVkjT{LaNfoevWh1Bp_R-K)z#bT~3fN&`tAH&Nt_s)z>Ha)4NLq>n>Qm0y z%=DK2ShW}>*j-L|*oK-UnAZ_cN)b{KwsItJde|R}$qL*~j}ninz-{Fy;mGc#ogN7u zzCGEJVcU~EC}exGLqfGDdqBwcWCw(5Pj*0G(vq+|Yt*RFhzqlSz9I=Cx;5USAzR}; zBxGy6BSN*tJ0P0Yc#B2R8Xv*oTjN7IY-_xScVIDWFprJRh*5%(R)&U}G?;2U>)g~Y z0K!HN1*e;^vM53_H8L0$(;`H(v@!^mb9wTCquM)?Mg+wHn(Cm>;62U3*q`J*s}jP$ zY&AIQ3=`0388pm)MOwYsCz0}_F*<0R>jd6GqJvQ?XcRN?F#%02ga$HWK?s0qAvDla zQgDg`WOOh%?UX3^ZYCow6jhplhRXM0lmw2UsB+}>Z8Y!{u-P0YApSEt3|NS=2}KUM zJY*&E#$+Tg48SqLY{81D6I~Lra<3%jRb<>Mj(2#Y6Pu-Akd>D zaR^2N!=NXdLSHGJ41(ngf5ROOC4lj-hkgZk_f$EB(x>7cK9>=9~jR=fG?ushwFxj%N0fM*(&Qh%1?*UU38{19DVg@b~OfA8@sSdB_`KUs?&qr_{*Mz)KR$z=2jM zn8!mcSuleLUcq1<6FhPK3?gVA`yn2(Pesjtgy~SRDG%^_fQ$v3K0klVIr|3Rcc~E= z2?WDAgDoe}A!r2@0p=xAjR1a$R5M@}2I_G@mj;@!U|Rhh3b@_hBS99uEeoc|?P!qs z1W^+*45%4|3DLfPI;4~r_jueTIV%#soJ#mBZA>bb0mWl!1;5At$j5j7!Gv%ScBl2#G2$&oW3ABA8L+T14EIP$nsk&U0aC~NQspfqYh>>HOr7whk;KAP0aQCz8M6J~R`SJD!2hqx)SP-jK_E~`I zRrXnK*b4{u0MQs)0YO0U2uNXIpZXY<6g))GK%}rSfyN!Nc4dbET)oo9LCQnG^}x$2 zN8agb4FrYhT=W(35>IioDrgei@u)R06mJ6k7^>DlP~f^pX$VC3sG0%3@N18M0=D$4 zjRUp%>y!w*{_8T^^Yd9O7`PkP3}T=~i9zpk9`cAM@aeARXgg&rGV&TgyqKsNj{2E0 zlER1}IB+98H3edDXU$Mx1`ZmA0z7E2Wk4PU+*6#N_OjW4BQO#mhNlGC`>hoK*~{Cz zdXa$d3pf#i;s_Rr@IIE+nW#7k%9Vo)PEWUAb{NTA8>OO4LAM^%J?rpW4-Pgq+(P5G4a0UIWJXfOQ@#a;kwG}($>mFr67<$K7px!S+QzD*z4Wl&`5e@70L6zyfd zwamD=-A-ox;0K!K*j^{EEEdsOzN-$hf&j;v6GG9=b&j);xb}RT_ezr;FVxfOLz--= zmxBLRsYcZ~i^KUPHEkq+t3oKwTYivt^2_a3ghC!@GHh>M)Lz_GWmd^Lesg!w<(Jv` zu@ZCDOAEG%3FdW3Fx9uaBt9YttrB!_ebvQvDpv@tIwY8?zhGF(R*@QnGV$_5UDhJO zr2#z&;(YtZ0^;80ne}@V2Tot$c&fVXK^#3l|Fuv6dq9N0gYOb`WmH)#e?nIBzwzVB ztu2m%UuB%E!Ih>4r?xaofmH}Xq&_X3zGaLq8se?jcZS&NK!~Ga70C{D=*Jomj;AEz zTUkM{*WXtF+F&PV-6?u*NN;gGY}4czWNCcdia7ot6@UD5pw=p_@{kunQOc|zbRtfc zM$|0!m?m89uTbatxpn64>cOd6Tk8HK+$)mn#et zoL*#L*P*9PN+z$te6SrtYtx~ot)I3bS#2s*r0oX}tbpudY#2WCe>ekh^up*^ZrJZf z081~7kVTl9kS|LYM#z$e-}GQ<^>)vTrXNVhvk|+5>EYY;CP>*8%&QQP>JOI^q_jT3 zoigk zWTjd|y;tpNHak|Be>#=GE<(!LefDJQKAwoj>ngN@(OrRkLRE_gAGKjHDc3E_zeVXA zoNX#V%J<0MOEB9on3U`1Lkz|m#G*Ofd^_Be~xEs9tyP;#4l-il~yvp zEi&x7~vi_8_EK?8OXfo}p9GYD{ZRYw}hYW4?%~lsylQOV{6S6hUS^(ED zl#Z!7c#`MZe~ z(|w+XyePbZ262=$J2n5uNBhXtd6p)Moa8!*)U$TCXMiJ~HkOR)?-egpwcY!44Fkz| z>O^2HYdjg<<68Ha5zQk>Pnd!GIk&G}u|%L^=qa45z+)7en(u(;A$@atN!LeFF|-sL zp0V8Xm)Eck4S%(i@9tH9bfM4*gEoYYA!kQ#h$e=L!V`eryLqDN$L1Y}>3@7o2WS&#y8dKDIAD4a@8OviX4hJ5Y z(!?9d5{)Knny7NqJ{2KvzPn&GX@g-XC6gKqtsW-IZ!j{803jcUiHyVaQhDGzQIz>{ z{N06V7=JPPO2C)w+73{j18L@B@ldK^*<6v%O;epP=mk-6_`e@BD8w(r8XA+v^RV=z z&?I#aC#R=NO9XkF@K$hGt?}-C@6_q+o(87 znFFFb*tQipNsq7@Mzz_i7mgLvszOY9eFx|3#ebfT3VxPtBGjCK&VP1R;{Jbq-tMy_ zRu=%bPntoK^&{r~=Vgqf9wk{P?tP@BxnL!S5)ET1smz*zP_A(_maLc2&qDQ<^nxdX zyB27guFK(81wujz!1ee~&vJK!IWL1{HGdsoOhT;PCsE4UeQICvX5`qWMVrRyi;JI3 zhJUrXmL+;!uvA5v9%P}Vx-r#T9Uz*dfi0enP8AjpEZK25;EV(zqs-xZEaZ#^9i_Yy z<0|6q6$)ovR-z+TH&QjBDV)@}J;&<#lW=4XLG0jW;{u2T> zip5fGvRD-d*U2_@!04rh8rQuH5zjF)qi~Xk7&bac%XZ30-K@2dx(^te^3exo_Z;dBb}&FlKKp6n-WqDZ0nK98;~wN*MA$J z9nLTY4Wav(m^Z90{=MXA>-&8MIRut43Y7Y@BSD=SZ!9uibaTh*uTBUmVK4}zV$pxR z?tBJj7)M3(l!$lFqtb>@G5jPmS^8FZV)Uc%Bp$hwDr=e#Po;=`e06%Lx#{=TT@U8_ zl6#?31j7I-dzq8MG~(VAgE%bA$A4q#PS7RB+MdfDxKBmmehx+vSO9Q^yv8|2ecZwZ zsg6$wscYjFPM^xpgpaE3({RZaTdbShYGLVJEQ)=*#eu6$8;pYqxvp}agg~rOEFo3< z(dSC&z^36?HuaFqxrFEvV{JEaWqLKA6`>IIHwS_`WzY{JW2ry*oSKGb9B+zc^1XAB z+_C<_4sqK@MlX5cGWX|EM)fBCOt2Gw8jAHX+u9d5QrlQv79n%-s?#COdhb;wyHjy) z+`AX4{WvljzkBouiS7xQlMyfX%eiM&odf)|j8{sg;8OEYf z>JK-m9*)1-Cv(bU5uk#SE%R3qxmHZ($R;XOcxsK5P-YD*phbrs5q@Sz8eVAk^(q?@ zvOH$I{`s%kF+mp&B)WYm>Kb?R$%*4oCk~n@p#A+m`^yjYA1C8XrPQl={s6c9@z3=i zSIZy&9O(2emQTrER{moi-Kw>(_3XGFHskeYENU(gx+;M6?nGQHf8sBP^mmq*s!b~k zk@iEcjo__G959_muk~Y+1HEp=yRg)BO!1+TiR*R0N~cB8 zt!7WTwSqL~C6m`y|MFko{eQRNAP#Z@w<>rJeG8Xx7Y}uRhg|G4=k|T)%*B7c zPL|1F5YZLzgnB?O;#CrJU?+n?%FDmbc`D*CroM9#QqJGwFDbJn@)1^R{Q3fn2XS;s znNs6PdGaoQ;(~@D`1&ay{5v3cB`jD|0R*3lz#}_BE_Y&l?9u2i5MLnjW5&%Qg@(7A zOpcrq${5|)!)(Ce-k$n?lW-cY_8EwjMe5GpVWu&?4pEadSB@R zxII)OvRLG`ljtXPtMZ!145+sxHivM2d|Xv%4+-Ue73YT)om+ZmSE$)hs@<=!;dVJ@ zX03H{t*eUFyW&?cC-xCJJw*jxoJPVfv<~a`vaD3hzPd7L)M8bC^zV5XB(~$BV=j_} zxiXDzmJutHSOHsrH6j%!wAXh}j?>%Cr%eL(j=;}W$TFcP2Cf)t#z_s9)kjXx3Qy`f za_jNge2S-1vehOiZ{lqV+*@wl zndQUUW##y-YQ6^nXHG-jC-EHr@_B$Q%;{`@;1W~$UDm0F$3xczqd_DZ1yw$hoXW=U zpQ-PQ;t_VPii(p;IkI>i_~3VrEl}3ZPH80Dan;9RMQOoLt$Y7$MTNHnlM|h3>$do` zoP6;}QetExh*D@HkIFVvVVIiU!%JgkC75WjakYSD_DkE$I?i{g?TSdcT+T->+y)$f z`C`#9pd7e0>SeOa?{fZCGnlP!_ftG89BD7=jwl!;A+FN==MSUs+t#GC_L$o zBX6(4DhXpBY)kfZ>3wF+xZDy;7T=HvZiw?C6(8nran0rP$*l*8>?O9PS1079MGm&w zEB>`!;@n80SdbzN>tPM*S8q)Zv{O8PY3Vu|!6*&G9zZ|P;?D&CrD~SHD+zkdK>r69 z+UKa}r^FQIz##JAx1$5gBmaR+sM!3ONT9*Iq+r<y>Z97G;jf+kWHKtxJ|$l z2jnvc>BDH%jofckoLZUv*y^>bM*>IT*4qevuzQvt_)I}TSK;S$pW&JS?8=uF(t zA170HJh_}sF3vwq#+3}q>XGb!QfD_A7~Q4j@bnt@uD0ur-%VY2ME3s}k)t7bf#aFRu$G7yS5CQ*l#qR zP)1ihY%`Fouy-V3>Xr@ZQgSD)5^ZPNee<(@R&G2pZRE#9%dKmxJC*MisxKF?T2!6G0>yDY^|RaDGVZmyIVVHt<9RXlIi2r46iphA>B(`eRF4Cu zPIR-D(0!oW2J)=bWu7Xx16SuMeRLTPcvV5GmJ)Dx9)!41EaQ;PdQ9Z${Ea*peQ*yTrkNripE{#fT)H_b|uRszy8lLW7S&z?Pd-jB^Mhskx) z=`5%pdMPD#mZyQAyZJ*xv*CX4pc8p(nkAl3$x*yc;*6%wmj(U0S$*)LMM%?wPG^%T zU!MCZbHM!l;Kz@Dqbw)$PbVjnFYf5{bo!YLiN$|&zZ{R>eR^*l)FCHllQ{#N&L;0C zXQNZLQh}U}=NF^dg*!P$zyJx2ywC_TA75Nd&fYVO{7m=5=|-DXV3ph? zjdSYfbV0iLI+;X)Tn=u%oD$$t9{8jiL^BG%r@8rS6qfmao9re?61p&ddCxdK^7G(U z+urphAj@f_UA>$6 zX^_+w;bxoca~kBRq3o;8*AVWy+(dBAI3ljggp+RkoGE>@Vw8gBE`$3X+rm{2e}W~k z%WuhW2*R{~dI|vk2PtK6YnRK`wzz&-J)L9STNEk?1Fi?IKzu5H;SZ|NoIH*cwiLU!Kpf7}3&GtS zma79|ZK9hfzKbj)9@H_!!auEO&N=oGmhH+>ZNgD4r$i=5M7p9)7?M}7Du?2_6)%?x zT>@QU-bCK0%3Fa2j1mFPKb*Vs(fNeyBP`ZbQou`95Q^R-4qO++Z1ZE8A2Qxj>{qP` z&@dH$H%9|!&OmLWGWLo6HIBnxg)DLIqtQq+n)AS6I}L#Z9SAP;K;C#8&2SADfKLTh zxw*W1O7l$`@qJHF_R$NXIdeXR1L3~t30fEoDvRp5UU>F-;SKHf(@M9A8Uvn(zWhA@ zn))~FoZC29n9qsgJXk*1?P@U?9DNuc{npoi>|~c%-z@lBu@Tj;p%SGl^h4lUk`V0^ z;QMuLHY#1OS2dw6se=OT<=&NIpDF!w6Qnc~W@sDCyza$b!~u~+XueG`?j)rU7^tM6 zb{sp>kJoEJT=8E=e9hKSDD zrw`-E`x?@Du!6Xp=|Yyig%s{-=c9`cP;s1(W}}Pgtj{+#DU%}I#LKTyFqfqVh3v}> zqCjM9?h=?{_pVfV`d$<<#VugP5(72}Q*0=cvl`DN9S-BXyQb+1QZKgJFBZLj#I}IS zH8}jz{rBOMJfYV!rYk~_e1j`2YtsZOl zCD3t@G5~Aasz#0?{bQS=`Q^m;CY zxUu|SdYdqBKTJYBc>>4G45&zI+7r!1JTqr8&$n*TBq+!zQNDzbwvhaPT{#VyJ@~j_ zEt~~GA15i%y#bbfzmI40$@C19ueU?;pS_><_G&KHU$b08pizvPP&5@I^pmL+1q)8- z{F;WL%sCq}N=7T_LJ(ma0EzxQIXj+yo)^Tw`!qQ{u6G6$a;zU%ZGazk@xyZh9H*28 zEBMuo6B^lwp-(QsBXpC0AfcJg(jap|ALC8xV-VsP>bX9>4?ospzDM{3?P|zOBVy8RGK`F^`78=#;?vM3WMmzETog3s((yEIK>)_ti&X9)W|g;f*nN@iP6;zU$hAL3Kj1A_0DNbWwKZ#Q5;54IBY|QhSUaw&r;mwsN_{-kjBv(8%(O&^h!ksHmsyQ|pnAoB#7zpewv`Ej_MvKD4fd)EQ6vn1r6^@5P)hVrEW8pln2j4R zZsQ&%sv)=>6dsh1c7e#kAUSL-retxbHH~XEJ@;9xZ^Td2$~JiuY~h&49HKDGu7joO zJd9`haU@!gmZkb3$~ZZrD|(OLz5c^-vTet?v=0ZEnt%H+onQ2DZTNZ}s5^Q3s%^CY zqS3-F#tv+M-|jXC-QDhWt2mZ1n1_F@+?9A4=^`)mt8%d{yxe0lK@jE##kDeE)V%4A8XQy;+&20`}G%l+%mL4G}5F2NdE!=&Us*alt?{#hd& zYOr%Y8^3p_Cnr#fx<{k)i%+w$IX@GOak9-<&~jUUVA?B@ff7N<*V<()RAg68Je3wv?D@eszP?xK#VvzIxx!7^O~P+L&bm&B@f zSN2W_vsUj?G27r?P)jk=ekhlVJC~x z^loxCn*CSpT6v-aBU}~~(V$3B_|KsHxU}HgTMO!e{f2a=oSiiIz+{tM+eiW^3}L!=QEZ0GE{X#rdP7`t+!{&oa4oDPo1nZ%Ckad?ao7p zf!JtM0cJ~mF@Z~k~x_=#Yveq$r!^^!M1ixb;Ju%BgPgH;^IM~m4dpH z6c!UIYpNOXmB!XyL*i4W9x7gze(+ZwZ%Oyo3pd6@WD7eKGHeMb3^T9Vrrhc-2!5+0-Z)a>>rRVuaOJdH30P zzY5PVc8SS}HDt{n$6GA?Ec7zSDa763rjGN2)#E)OV^nG~F`4p<^I8?7Rwg#*@73{s zQ~gr70~7$g2X~ZJcQW2tJ3FGm-B4L-`9~8n%=5Kyhi(5RqN+nqwRTAHsRcNHdZt|N zSI@s;OSZ#bw7nZ0{dO@M9gW?|dmIP4quG0P%GG5hGmb*ASID;N^CAYJyySWHiU{q( zZ!Rsoqt#4$D+?+Z+TyX|q+4UHJ_Ztwp%~7X9hEW@y)+MKlt~0mJSuYxWk%6AJb6$< zD&VOO6BKv;+(Ef{EY;UNd@+50ZSTUfr*3SisR>^h>I!}q$juDZa_=X2Qp@39{9-^w z*KbQ#B;A*M_H<>QP}ZLWl>6iaN=;_Jr}-%^LwqP<;EX${0|~Pd46d?eERVI?gQTGg zS9Uj8JFeL|ZaET-G*YYR%p2YXA~uYj1&liMB8woyie&N9>Zsv$;wDai{(?XP4oAKX zl7%1tZdaUFr;{t7elgsGC1ZStOSyTt@vEbO+06UuwX&%nUEvU7A;q1LJD?yCz}E># z2#NmAu7bw3=ge@}+*un;{n9X(x{K2rP@J;Z@b795msnU(0o$7_1xJcndVz0i*FZNB zSU_`9icfDJzLzbMu02kFjm*7DDp_9QI1LjmNu$4B?9zKm7BS@l6RmOb>FkKG7Ym{< zR3iS{a;yjW20O10Hrw29&8+<>4_y!4xtnnWLNyvdIZ&NpjscU=NV;qAaNY{@6KjOf zL_ibXxzPOt^GEul36r=Sl|b8><9{8v0LKr%V4h>NRXIw8%FM2R>}QRnYwo2bu6jB9 z)Un4Wr_XrdW4xhR2AP)x?p+Wq;yb7=u(z3~p`_Cwlva4V&>_1^Z)-e#Y@mfOHE-|S+~(0V&GL>zo{%34Ldesa-LZ3|cRNvgCX zF+F1&Wwmw4-*p3jg=Lz=-YRh@V{Q$x=A#%W7hy;AuJz+(hn~YfH4A8Z#)FBZII;E^ zN&Xj=kJICE?PR%c%QzS4$_MoVOrJ0{fy?`FtT@t=D+B$NycU#N8s4_``j7s7Fi9)y5vr+w;tf`{gWKX1!j7!!%$R z5Em>7#Z0_rn2$cY!yXA%m}fzV;exI*$}#gFB0SF*R{@Dq%!a*Q&N19_=3mo=`YbRT z6My{jD-sD=vl5!tCbjJ)pMvL zl)?H7EaW-FaT*T>6}a7DDeSjX&A(+d#GDTX91HIQ9fx9>@Z;ZAK+0;uXCz-?Np56Z zap4Sqd`5E;A>^-;kWnRyd>J8j;TQ_3-{AA<>8T3?INefSk6)T;1*dYLlruj*eF8ti zaYAr}oV)u=$yaAP1dEi4A`Vh+@p*4WNhZcrAo4pZvY>;CXibx-iIcHuWR#~>^0eDz zIHPPs3Yzudtayn65p-BeVnB6k2cr>?JWb($?X8wDw{lAR7zSw?%u@yIqZaIgW4v(S zM0xNutQ}CM4ip87gQ!&DHkGSKEE#vw*SSbrVH@ zztCE-{9c93)^~{+%|(`PFcbJiR8UJ*lLq6~FQd1GR#i%WBWs`%xm_86-<%bLfgS;U zXV{5wf;TiS@zfG9g67$a&ERjxB(XN6`};ai_1l)ao@$BIH`j5?TND z>UQScT)X>b*>Fr@gAw5arV{tAZGbyiAVS7_}hHV0WIr&^#A>g?{{jWo7( zrJX?i?=b!6>rx*qA7!?iSD<}=C|BNFJ7X!^O=ld{e$eDlsb5kk0y*7IOn0u_?b^Cw zIltPut1f<>g)HMxGF@HDPD*3p7g8j1T$X-FS1XB7C;ZJUSQv|PQabjlsNGC03^~)B zkh1Su=k`(35qHfS8KVii5hcSSXQbmEEoYIQG`l;%M@}?&*5%0-MO)Z^QbJ+(swCXZ zbB9m?=Cv~AY^2Wp5`&FTrVtZ7brWu~Uj5tl-h1!;3yoD#Z<|02e&<)Xi1c8~R^>Hm zR%vUbR@&OA(b`F+MHg@qGy?1nDphO#`+Rqh1VXgl3&foL*`Gf<=NI`Zx2y=mgbM^$ z79tLdpm@zujtAbzO8FXpWzIu{Z`nG}Bntmmg!6KF#nUK3F|w>u?tPqw0{yAL<;bFt zQo>YZAxdfewSZ1u&XYI(P7L3Wn*e;eaf`7>Ga9F3r&Rn0)2hToZePGVO8Th`<`W26# z2J{x`Or$qzkfYguZP#8?Ui+xrI`L!qgBRh7@OzKXy{C`8vkG$$W!r{Ms0K&Xi$ZI% z#hy>!&cC=G+h?o^u>mBTDanZA^b}6E70?e8y)%JYVqI}NnyOJcqgBmfHdCs3SIeAj z%h*m$6rf8@$2;~ukv!TJk-aBR!#?j&yYQ+ZP~Xkx&HqP#c(%eMp*+^K9b7I1f7Sl- z=!`m{xeP7c?`B*_3FInX6t0QY7O}aiw2_uca=^|GL1MBP4y$ET`St7Fq8}~kE;4~U zT!8@wE~_4OsHjHyOof0FKojh6EV{H+Q(gso2kjDzN&2$goN8V7;iCTe!jn>wXm}aw z{n>6nnNo~@>WR#h!az|-^CZ!ZRnf-x*gkEKSWDYFblX)MT_>1L z?r3R0YPhF;z3S0#_q=%>4vT6+S6f)G7sVZoky~-T;y@I|-{(_Ip^zvm zrLSqNExJ%&+Mq856`4-1aUk9db8m#Q_}x2`=&E%s-DPPW@@F`6&b_}}=C)^-R)`FA zp&ZDV*cr`pezQQ`>(-4xwF0tAgY1_pTN1eGO9ro1{-`i3z}*OO)ozP>Z$qrG6LyOB zmGFLlL^564eu)c{i(f+e%T}+2(Q;9tW>cc92%eqE4XPq;$wVsW)LX4=^x?YXrJ>GU z4m?n-9xxjL0mr_!ox%ZE4&`LlEN#w3jeUWca@qN)%qPh17b49<#*O--+m%=qMeD%l zu&Ahm(GMAQw7=IoCK0df5KT0j?fo`?-AoF9jtns%e@i=CkIH%#{KRz}rH|>Tf7;Z6 z>)Czt;nQ$F?ms-u2g6aI6ScmKB1~I&{+_r-Rj>KEt7$p2_Gx=uC!Kp>z0ZhE|2*u+ zUrFM9y&)^dV_-Iz(|?BQdvyBWm~I_ND;yYikgernna8bcIP~ywQ25b_N7pRE;t{`+ia5lTxMFhM<*^SV^RimkT%lUk`s!^mXWhC31S}!xl(tHMra&kzG6sxq+{PSpF1EovwohFrm_?K8JekG8 zICVPlW~w?2)^5rk(v85dUM>axFX|?m=HWveN7F8>KrzV|hp>Ww^ePE&_p(xGYAtN) zt4{0hIGy_)5X;8@r%=}9FRfJFZksR|z2_-hsZx@QuG-Q`RkE}K;-*w2FhZnFiiC{w zHL(PS*`{i=_TA@@cFCf&fI4n4(m6gqpYgZre3cu<0%$@6pte+kQ5C6m4s!6h(>FLt zLFR-4if)TEE|yk*_DJcM?&SsTLig*%+~W&D#&equK><~n(96DI6tWTHb=hx5#QdQl zBNU7iv39d1qkTiCmJ*Gaa!HKfQ2}2_G;iR0ZpOMYLY2*o-v-i8Uc?EbNGhWA>%QPr zv5X@ow=7t+>+i4Qp;O=w9n?c{mL;XYR%Y`EP=(+n;_PaF398*1IiYJ>k?piP=wvWJ z^Lvs==$DM=eS3d>X`0O@ddTgK$Y%U}d0eJREw9U7&vv4%srO7U=@&^7z^?+NDvi_^ z+aKshjqmT(>rnwj!HvjLOLq^1w@=lI$+N3n-#XnG2O}H>`1=e`!^j!_(>!{5LdQt> zM~H)o=|=v4%yoC<19qoka8|*R#YATVQ8~R6NOQG5OfW4OrKLO1D&2R`^`Ye>D6RH3 z$eKCsu!PkKFcV3o`?t0Hz`MhC7|jA#yZVG$=kaD!dEU|=FSNs|DqQL7z|PW?sgIXx zd*iVaM$=ofs@Q#GjdBBgQ`xT0VF|+N>c8dCs?o%M9OIf{cJO+MUceQx0?0GT^zXW^ zb!}B29p4OZ8>rSfua$)c*!QMR=mkHwC-?n657D*i^u1lEXX6j8lu>V+FcgK~`4yfN z36NHGTRLe`2@JDM*Jx^g`y8@VskDut))HV@T%XVP9QZse zH>F{JBtSDF09jHAMpdk~CCI^hyKiukgDeRJ6i=#rRi#dGPw9v5rwiJJ?#GMBC- zQPhGy8m)BW2vsgKei=xQvRY+~BB_Ydk9Ea=sbU33Ozx{7u}o?9WQ&5)adSmQ_)7dz7r>2eG30F`ekuR)UcDX_KonewB6qZZ z3qZIP<*QhCsw||{Q5z=DE)OOIb^ng7xW&%I^S;J-iRU+_{T7*va5js5{4KuGtqB^5)3woXs8<_KjWI)!3aF_oNyAU>ejccx;!8p{jPuDXX1Q<7)zSiwbqfh4k; z?u`baneU(ZNBezLZ7avgfE82$@w8E#nbhnm(7|Va=m=VZt|$YN-q><&^H4r8_ND*r zob{pq^?WrGnWB?b#K&NO8L2QFI*!$yG7jOeTjHg-@0hVrTu`;Ul{sfa2fNmqL{br8CW+LwVb_kxzt_#kHHq_u_V+Au@3c~es7G&P>^|4FR z199(@0a;5~)PQHq{wOe3iTaDviyVySMziT6o-Sw0yZO!B^+^x}#AVGc-C>>n*wp%0 zB-V)d6pi=x#QjQ${B>rR86CpGAd1r$3g6Sh_1qRk0>3P1Q|mdN+4TB+XBt>*^_&MZlAm)`D8T0w=Mb;sHEn&cDtkg!VdNR zi_MSDAElLRYuhjshQIq)XwYFBnuV<$3}&QSlBvxpL3JHo{Ll%#sp{CJ{|S=M8@4wi(P;Qs&k3chG7)yAdA(sahRdcZx6H>NXBD1zs{$O zHVpJyDRRYhyBNDvvz#jecN+LakYog9iPsp!v*fY#S;aYkVXHFR=(yOF5WW`-5S4$Pw^cn>b{g z=UFMRLesSI1j_9oXK>aj1k?!==n;9wq`} zZXM~AsoL2p`28|!>lFCk{9q6TZr8^wG%*XNK(8XXbj!3W(%}^>n*>M-vN9*HgM`B% z3WiSYx-x>76 z@236os(#ylHSH=d@HA+ZJZ}tKDORoJ$(YmhWvwG2mrL-}cwMmVyB8RU%a!V4u!O7% zZKp44XFNyMhX(>Pq370G$F{fBO9DKjLP$UY$KOB|#SXxB)`f&ARx0tO|9*%`yXxbwk}ws zJsQ6Oty5iZ+AtJ-&#!Q`RteIoXrq&+FglTtmS_;75Z;g?<6OX6VrTxSimLwi89Er7 zriQ5VORf}OpL6ax_siFMQ(IO6q{IS{BbA^;*tPpsz2fW1=M=7kU6zpmXsi=uri;OW<*iW5S1@o zP&ntmZ=|A2U=JPSp(W?#9^eILcLXRc*#5?U_3avzWBXC&&x3DamIu?xB+Bd#y6E@O zVuecyy?x{JDa#{0(;d**`0nhmc8Or?f1|aT&Y|?YAj*GpOQIwkM{ziNjS-cJF3S{t zXpm~p>U`u=!{4gn^exXL0~V9yWthQyKn_a zT`K8bN&EfZJWmixRjPRnP1O5cv& z-_a3_-rc1Oo(nQhF?#?7RFy)Pu3^-2km6Lj!-O7x8mL$a#)&ut<(5&`&|OQ3FcY)@ z1kVb1E>SwbcRE??$Ou)K8Q%@0PgSoAMv+uR>Bpw#RI!pHCXXt}t^W7x_RtmZCmT6v zU6w@)IAWS3K-Ge`U)0TUTXaOF2|t)h=Na|+)s7%K)7|K zc1+&fpW=?&w3^VfWfBBgp| z%xn4PTAHsrTr8u-qlZ^n5_?fNnR}+)R}p#3#Zl3}h0B+sp~n7d5qHXCcmdzs^Mu zdOy!+iOMw}%|dw%2m(v(!hjHKS}C?+&`vm1tCotfmWu23T{)M3A|US6#?UEf@dTQ} zGlI$uowYDNyUJY6xWG`77ed{rY*t7?4RUnLqg4WBsi-vXD#$y{_jl)`N1#?+>eH+& ziyH8b*$fS6wW>3YFXwAsqO z3~5u8ZRq=9l>WDW^qC83?rl*p_-Daj?W8$vzoB1szQ3363k@7$#Mhat&VeEhtSs`_ zVL%_Oy)()9k@;QM-U1nP4Biqo7Ut;EVA!z z)-l?tx(kH~|R*HS;w-XNJXG_Ig3CUFTQmh2`iJe+& zItP}A0xJq%2r|_)YC#_L6B`=i7z*-Ds6C}gGQp`vhW1(-$x#%N3cXW7>Nf9h2c+j9 zKReW;Nl|3A!OmuT6rfSEesOWX0(71Epg#(S^Y{3FZ7`h;Cu65W&w4!?Em@|)uZ5dK z%3nOI4#n7R+ueF?|AAcn?barped&4OFy6EMhavQ<$+9VY7|>XwG`Bn4?WyR8y*!UA zUDbzUIvV9Uu7$q1->+|0KXsj8F?@N9$BR)gm^zL87AiYx<~T<> zJqZkdi#!*28uwc`YszjN1H~j?pAJ8Tve3e=u4?p&Tl8y}?S}jSt&>lWn=lZ?@BS37 zv=Zd7hc;WOf@Z5gXoE^fO2RD?a?CWb1UB`b)kf8R_Zn8IqN++jSzkN{&-~uJ2cN$* zhX$b%XhkGoS82(pF7&YhHF-bs5hpdMhETwN#oW|8vk$~Gr60zh9_SdxA0M_$UP`jq zhHM5Js20+eK0-zf>Nu7Du*Qf#4eZ!R#)&*8V$Z0L?AA)*nG_r_JZs>k!rK9|x6_?< zj8Gji^c!J&8ndey#Yz)xub+lf%>>6xy>>zA_MdOJ!*{@+M%cqUA*v4WifNAoZ6xo1 zUfe(KLAy>EJ0m=qOt4e7D>;7m_T^mIUq!YdWT{QpZO6B{^Zow;Lku~Uo)^Z&EL*10 zB@IliOjTv@%Yf3Ij{dCkAaB)uKFjl{1ft=q6m?)t2g2PuePHVT@nrP6Gs|_l{fbqd zBt;he$fNbf+W)S#-x*!8J}|5*Q!5XDJK(t|usW<{DWf+*`p&1Ll#$Rtj`Uj=?+ zIuv!y^lij&xmd)TVm+VsAqJ9gdUz9JkWJHYeifQQBNVe=(y`YMb&;G!tK|UT&1ts0 zf5Lo0e*mSF@r#=<6vuz}ugIW7g_UFL4Mw|msC9QeY<0FC3<_e?w9U{YOX6{VW!L|G zv0~TVZB@A-_`vt_{rG(^`TT|Ln5L}}OcRcPAtc98#&XY)7``_L8c8xFSOO7}DNoX~sZ1d~otBTfcH*Hda0UdD zjEiH&Snwkf*LstGjY~W`)WUW5ra_r8)C6wTOBQ&yo!L9%@z_u)l-!e`c&&n#ghq4p z-@Bkr$}yh&2=r#c&v|8x%64D)S=|5?IFG$0J=Zs?o4-l)PeG{#yaw>}MGtq`Z{Qz~ zJfN!QaU-~cGF$w`sUhqQQeoN_X&{_Cq2+oAyZ~!F#y@s{gG$^>{FeVJga;70@Mi64{L65!UJ=h z<)*WQ=j=$VcUaftow75@^#3@0Vbq+Bnm@E5CUUjuVWS&d|AF4%2H&NW?~B?n7{}lD zugKs=S~w@0HyCv~Y_Gd>_-n1*E1|^rs2Mfsl2lHA#{KV$b-fjtTDee2pn0C}C*S8u zK7Yy9nPn}2rbGg=m6nX^MDH?Co%c@L;$#CVBNR~bm~ZC!$`enNerSEVqb+ECyqk^r zLXzRkXZN6iY9Y-Uob(K!gFCV85M@GA$U z3y}I^)lPUVcr};nQVB%ES1C50F&+rFZ}i&Kx?7qZ6>gQ5CzE(ENW$QI97NN<{^P=b z>|CgTm$P&+GLRrImf<|Zx3QOu;-MFW^+aQtUM{@K%ul_v@mtk2-%l~$&-fN8NSCgE zdvrT)j}c$s!eBB^qCxzCozt84C+Oc}=Mw${)4tejn0}>W{&+a-PcOP<t$lE1iN(qM6s%T z_pV7C`Owr*?}a(=_V?z^&ew14zD1}4S`!J_Ra!EtOMPfTO+Jo%#7P6HB@}QuH_g`U z0`WxYr}39NI)?G*yUl`ElBAoE%|HXyLfXSUUMaj8;CwUP+RzBqAw$0rwx>1Qno+DY(f0FTIMqyW%+!ktD!2dr zwn2OY{BeXmycMGE056#1k)Vy_-5a{Yio|*X`aswzB#kP zkY#qz?h$i*ePv7_P0%Lp4vV|HySuwA?kM36^-$#$%2}X(~$J&6>t_fz%(e;fXXSz;i=ge*zXbB(PyVJ30 z&+^N&ey-FPZ|`=A60kyWrvMEh{1O1yxQke<<7j5yXmYiSV`w)cEHNSB5 z$Ap-xYguhk4u(m(XOW}0Gg7n@p;WezwZ~p;3=*lZjD^yXBo>(8x0@w0N6uMu??nK} zB*)Ia(gxqm(A(&8e4T=HKelj#jaxyc_|)i?o{QMOY`n)mF7xKTeqId!10??25A(xD z9t4KRDP|5BkpkZnRE+}VvqCU%j=@sVsG4#rRVF?1U=^e`YGf8)h9CP^zH+75-yGVu z&ayLrp_w8{VhhdEf1E$=diN;{m*$3m4+uElLBt)-yOfp0-d5kMAm`=Vu ztrg&C5%L|h(3z>x-w8B$tX57Mvr-A@6mgD1)BaK8Se-4264S*Og7w!xV8S-r2lfy; z{4`CM&a&~qRi&HcVxf?hreA8E#z|y1kBCyk68FA+T{>5WUX2ZuZ54UCc?92I<<5gAJ=>R9&r>2N66H^~kQO}~q$gf6#+lzvLkQC7%RS#6MNA%IQT zDWuP*rEuKji0b(TNpFLD03C2;Gh!HF`D!Eh;J>LwH0xy?r z3{(843eespfS}uO!>vZGs`I}_rqS+jzYl5;^H03T$It{K77L9ZE#_~Wz zEYXs<{3oAcp}ZJ8dBN5Y{I*Z8&y2?FP0Amc*~viWYLMr3YFT+3Sy=C9b{K&;_}^&g z!lypEX6|^AKBBqPhJaoo&s3fvg>5dKZ}QL`2R5-JwFjcW?3v293l4nEr?5+@@4gy8 zO*Q<{bY(?n6>2!591~#!ceX%gIbqwFloxwAq}-3X zr10(Fb?8uH5>SmJd1mBYYTv8Qb?2s@ptke8U@}I zdx+a+0sOP{ag?d|dEoozvlyzOS#2ZO$twZ7ciy?|S&>FMZj|{)QNIW>) z*<$dTQfAq6_;_os^&>7-x z$d26m-Q!)B;sPL2xsB1KtQy!lWwlbSc}>94Kn-WZ`12>iZCBAg+=Dt_B*{zSK=$8{ zTA{>Bub|W(7Z0+P0a`Ex>q!-YPLYfG?7vTT!=d}0p2Et~YA^80>w6Rpy}WUO3d%mX zZ$PZpD%1ckPBP>seOFUq#HW2@1MJBKqYJmk5uF+?iSs~JGlbvhcM{7t_5;j8YE+%A zF`P(Z&fH^>kwIqb?=v@uSc#%~PjNy2u9b+UE!%z?gzZpVii> z>u?QP^Ic!*3y1##Mz6?=OVNB*jpoHim6IgdtD7~lf>83u-0UkPGR0ffgwa3!;%?`f z*@Gp;`GuWlt~*v91m1X~u^LLBg~6skPW6~&LjWoRlby2dbpnPVxg8eDfNq1vYzkzH zJNYkW*}TyMm^gp@ZA7uW-ATS^cM%X&)N?DH0U@Ncz6l~Kj9*9288iN7uNlJhRu~g$ z!O~`z{Y-`)?AqAJRtj?;HqwGltnkz#PD|K=)r54a0$L)kTvbz8 zRBv69M)X`kXcLj=mF;hc9jY)&C;#@j==Dx7><(AXUi6GqT39US<_+qKE?Wj9Gk&-N zLEI3x7dmg*326y9)ZIUbTj~5ahVG1s(J*VZ`J(8nin^H*dUJ7qYI3h~N}oWi!l?#( z?Xy|a8Ozt&9p+V~!Xs1MPgYbj!Ulb2jH{=_#(Q|VO!)`7@k)7zroGy0sxL^ZPh;IqX%LDor4^W7Ft0G+jv!)8w7j zXB!ny;Jk@-CiwvFt@hwMh{p z#2x?JPlv{dsT&k6J8`cS!of;tb&Kl?={ycom2gdWVg4|=ZRNnbEg>IVBl8iBRfk`5 z%Ko-b4kA{8(JkkacwME%cIL}tq)5FMX9YpqKF^HP9S9ve18eofe2NSpc>2NN$0Di< zMX6<4NfwYgP0KShIAzRCGNur~lG1N{M=i^QMT!okNJCv>+~;+x)jk$~+f}~{tMFbi zp%hDW%Da;EH!>@>adxMjGs8<-m1=|fp^RM}S59#z?Ht{_5!sieXUArPW$Be_vVlb^ zJfOer+oZ~IW?KdVkKgR#W!1EG$@O57xx3K4Z!<#<`9YuyOb5`P@ zUO_Kv^b@+}cJWNd9vRMuD^pr25TD3f@;mA?VDo}ro=n8v7g_9o<} z6c`w#4L@FGmDsVu0@sa?q9^1VFOabl7x&XiUw)4G?3DT>In=bO{VaX-$S1 zF`A)@a9Na5a1#KXQ4w1Ln;N-Q;C=C*CLCK*A=UWAF{+?j(11lP6RN6YSit`54lI=4 z7k^bYB041>Dek~Iy1^b8)RlnNJ>x{5%y7gBnjErj@i>%t#P=!d z%beL0Em%dbwg&km9jvYdlEV$o#8$4f{xF~#+2sZjQa*75j!q9 z7pdQUgj=S1uxfIx@t@GzAH;)bmrH_vW_SuL2v4&X`sOe4aRsXmNcG`wv~U?c6sx__ zoz|UoaCbm;1wNJAIO>Ztcoh`GXkGc4fL-L#p41=gP$hQjFa0oe^yrxng$G`u6B%1pdI%-P*S~{}@qrk{b)#UWnneBokf5;3TRP{t zXv`y`)wld*UbvPNW>jM?YyJx`YgI*6x3P~dr<`_pR5%`w@m;?e@XN#LdOVmfN*riD zN6@>uy;kaT&OxqZNVdVqo;D#D_{6Drv8)m5vb{UxkA3|N0l{MP! zf;b7TwS0NedC3_R@SpK=nwh1OnVOPgX#5`&HvUUO zz*sbGt_1$uw}f0BuvQW#eGv*aNGo1W37p8`@~AWwCrAwb|JU13hiUDHX-6gP-^t4` zf0`W~dkvJR(#fjcsz!Y?QFbNMO4n&mQ*wgDr2BtK_$8rFm!t+S%X)juZ|tnMq}QU? zcF_k@2nOiSOdgp1;ic2sB1{3#2Z9ND6q6>ZpN2Nx$p8s7Qe`T#E@?wZp_l6{ynkq4~`$Sz# zKN>zQrDz{cX=0n$^Lzhl76Bq%qT4r`4#tydVnTCzy_3> zY~S1Kyt6cbV0J|h`v=~&N!@NduV*^UTCukg$c}6?S*%27t@K-tT6;WrWFuX;dW89% zDTE1$2Liy^%k^YSi-foghSHX&J4TP5%N26}KNr3jtM&);*k7}-Z`70yK50E%Y5PPz z06`zm>(#%zgK6_TU#aS}`SksTg{HokZG#-K%WHFF=>7Co{-d|2!fiam+}QZn_a?62 zU4uTy1wNLeKdXK2*bw3CD=fFgA+<0zW=6sODnbKyzdi@&LY|8g!S{9_u3_Wb1Y` zWa<&4L%@wJaEBQBxKKC-8@&z+Q zx2(<>C6j>_n3~3O^zM*JIU&dY5Zp&0;z4Eb{aZf@D(H+~q|=mtaLb%dpS>E&mU;~u zw2MrvQI)~o>1?WGkB^O4E^<+wGWaN7V{Z>>vE21TZ026 zSVkUNq|}~acO!2n#hFmRDfLR}W^U|z;aC2kyBiCwxPb^j4~RROk6ZlULQfetlCB$O z58VBBG7{cq+g^h&YZS&>UK!Rxf; z5tGeP77Oe?rE9F#qr8!AOV|u_4oURx>BwlBTU$pneDP;})*rkwMprEsOia`OJQsqo zKB3P^3@OZl-5Y)Ehi)dgk+os~1yNwP-MU1ml$NGY_jGkrXQ8+&AJc?8tPt*kt+icU z2}^IPnO}4>RydiRk`R81rYXw?1*V!Q3w`W(Jv-;%dWF04lZw^na-68;D-CHtkTiSm z{5-du+&)81@R5Up=(3u0IWZ!j5MX+d5pL@n8`D$%j*AS+Od*)_yQ1f6&y?`AEU>aA zE2|@GMpw_LR;(00Pl1@Q_&wHbC68$@b*vI})IAyTXie~A&yl9(s*P~FbMB~$XBiR> zW=Qp^iz<$QudSG+S{1;~1?L>g_sL^P7Q0!tZmPGJ-j|3Vm?yOjRU`tOt+xE?%yp!i z<81r)7u|c;f1hu<9SiQ_PJAxg&CIN#4&4N>Pf>+dGgCj>BeMU*_GCE#NuIEp`v%6=7+?m8s7 z0UsIUv%wdMaYBOpY*3Oo(!9m#WY1iPqBcd~zZ*pVMx5T#HU8UrVxDi-6V)-Wv(B)u z7lgLw=OA%Q0Z*b#z4m< zS^S}?j*Wu||Kx^*Fyt3V{7GNE<$+97NbL`zCspP}K>G!dzMG;Bv6I#k4KL;<7|Bxh z@9|zxZ}3<^r?>Y{ZO7pF#lEDiFW(l8p!f&(E!CF!WB2_UFCX9 zi>1+~K7#d-^qriMj@}|jX@!!Tx*C_(Xuwaj?~hdcI;F)(st#uTOD@XR>=@x<+x7lI z4prFI;%)t9x5UnK#9Y{DWJpJOA@Xvwb9|}6JE7y7|N(MLCB-h1|U+BPhUm3px9+69|12H zY_nAf+J~jSZqj`! znFAe@BK?u&-9{^HEnar#ZnCPPNg2hhv6#nK$W4q;#;Bz^n#nN9JrXpmIhx^TRiP{4 z#AKK~d7&o{&ES>6)kwkA#+mECxlYOfyjG2H{_e~{>t+cCCqnVW=-p-lbjlDh%-0Cu zeO1(Ox?2&Mv$_=ql+5UPO zd9H5-2Sl^ew^CK?&d+c{WJfiBZIkYMN4CjbH1BvKr4Pg&EB|mer8MqlWzikOBSTGR z@Ju?W!=58A;t-Wi?98sR*x<#XGT~4Hf}-9URtXhnW7W0Q^01g_@j%$IqGjf#>PAeo zU;uMeFtg7_si4~+H6fiyxjhb(erbO?_@_086gbW>%%FykTL@+ugtP4Cg- z?m*GeTTQ$&=kPFT*pZ>JVJ2;?6NVTN*eEa^ec-Ql;5;+Ll?tzhp<6PNs+R7+Ud>wA zpZ3_uf-Yj>d#om=6SYz&V=nAw_uLz0&xX#8-K*eI^RkL-+?$klij%ySXH1oN6owW5 z9qUSU*1Sc&ZR8bIg6xS`6nARlHuFAdd=Mh!Y2vGy~`WEn4c20BkZixI4)4FMl z2K*F^W4{o$#Ypn#?e+FrsV5rv7+(v&9@o8LSleiAjg>+1#{kJCGr$xNP=VpwyywmS z`;xAaFzQARi6vRnIZXlooe|~}uCo$>u=r;@#(axJJ(Y&L`TS886OG8@5=>>Su1{Zc z>?(C`TPqFbn{<`6EKTe>@&YI4{F!0kPtaN&0~Y@?JQ18@Q+r5wPa6jS%VpM$Ss5aA z=-rV*d(UBMheQ9bRHypc3WNFX9Vy*puL~NRx%TN{i+f!Q5w@Ux9Tlvh1M|~#-|_c1 zg`n^W1#}tN^7ZmvU2MhOt%Ef0kM6%nhJSuy<0NC@W)zQ0qlL@o*6V~-eLGvo8jq6P zr+dq%52JDpMt0V0JerUIVyNo9PgDXjUq3f`J|Vj_f3yK4 z_M_)ZA@?)5O8x(ey0R7^`MBBdBj?T4BMCgr=)Pdu7oxu1{(f;MAh3Nm?~w@WK~CEj zGR)C`c=_$*_H6HB=-+?PE6>q%j=Fs{Eq_xJ<>^2LW-I670ruB?XIe6gpDdvGAQ_t= zj1P9Wvrh40g3_mR97=M{M;&babY-6=-3FNq2I3E!w`lry*K*m{x{w@3)4-G zV8F)J7Lw3%QbJY5-0^G6C&;vxw!?-bivLR8Dx9RWPPoLH3_f4uS*zl?sB|zsB$x`S zm5n)SK`I!sZbi}OR>on=AAMTITUCM8y{R^r*%@V~(X6G?C6j-dBX}!CW*<_Wy)q5} zY+EiDzo5W%-0AfK`Y{0_=1iW`7^R@x44})vD}$=|vVrG>}C0 zCiof!EL3dh8ax>6j)y02uAEYh;@sg|+A<|>=DP7N8<+KfJB)3is63&z0-&v!aKlUUy{qKb z1#g4cA1mgz560?=0j0~1Ps|c+N-rx=0BYNrD zvKXVREZO0Va9-%E={!5U-I?DQDH}4f4$+^$Lp2WSqkg3JK{1y$1l?o?NDV6I-%rrv z4Ugds*Sn?)3#gBk5Dkyx12t^*p!rVS1G<$Aq-zq>a%Eflznf1{YBPGUhrX z@efZ&vwgeh7)eKKpc(PzK*pH=&UPXR46+-+j4luYxOqT@qwmt3J(mv9Yk&-DpuQTS zj4AmQOiJ@o94tF(si(Fach*q7mN`3K>Z|zxKj`BYrUe=@!0`!C3&fRcs9;bo%AFL_ z7RTZZ-_b^iDkBDo98Sb)I#WHuO!K}HG@+JR0p##xWC$ar zYq=yw=qo&5w0k4RO%M9eu02b3W2#KwU`h6^-B|FqxlR?Q$!5Ob*(FKnBx3`-rp}nE!K9 z?FoSiBMH45cr!-Xn(4@qkbNpR75SLWo9-0s6GT zlc}xPDGtss6+}I=&9_(b{oLk#K1Gbpzh6!>aNkY!Q*)Q{OJ+hZFg^0JE_bSJuNax+ z!x4$EIDP{m!rp$Yw3LPV$DX!<{O2P+lTqTTYR*djWcl$=fU+<76B@z@8u%l(Le;f? zuaaOr5aGScaQhh;89lr>`}q1-{GFjxmt6qNtF7faB``c&Xb+=5*Urkx_LKTMQ~-O* zd0>UVM8?O8XqEz^LG6fLoxW;lmq$TgK&X41(DAMW>Jv*QDCFn${@dp3WZR|r^8z6-tG!qfRCE z&UieAmOR@Xs_82=#5Zd)U(f15A=|KXJ75ce$Y!T(+EEuAnEQJsoaU_Hh2fdw+0`NG zn%K-Cp&GF=JYug{?ezX~IXQmsFoD@_d!h3Q<`<_RH~3%l<}2Mpf*2Y-q?(9M9||OZ ziX5~eoNhnjN|K@PZb3r&emR2poqo6jp?ivN*2V4I!+<6TbS+q9lYiJ4ugixE*Tq1; zRz7rTxYB>HwjV>nQmN($o6%;Ak*J} zIBamDeAF5`^~cEC6VPe%8bu_#TAk&?Hj+nlfr?H$e){+>Y z&mYW#j3*B^T^wc!o)_Zs`sCIu+TB8B(RCmP*g8Ku%6mH1_11x8QBpSey!V>BOO3@I@)EF(q zS#sTp<*55xq$H0eFK^zO0ge+}>iv?a$RM6X6xIretb?d9W=q-;f*9c&J)_^C$gzFB zY|{(EWJM{&<6_=|7eWQ4cRIMW7rq`KM4XTgn>&9PW4nLbxzIfO!2ngq9xRnH7W_%;?lj(0Tfl?bD4m$~v>C+c z&d0b*`k`uIG2G460WbPnE)<+-W`P_#B6bP^ikA)DSaQg$HmNj$!vM?0@cIazEt^MG9um8E=r!rk~Dfg|h8MB#%;7WZ? zT}I4D0Iwly^sulj>%RWCn{Dz(DwsjR0Y+*za1h*D#m^}1T7E?Kp5zFp6^aR)+}^I=WIIk@@{{= zyiU#o zFRl(Ea5s6NSbbQE(4;;UGt3zeifjv0Ddw(ivk^)$C5?9$_mM-9bBNx&Nw_TUs( z#=fiL)!n{pvu?>5;rhl3#T#i(s`O&v9pg^<=Y($_l*aJoX?~lKTV=V&5GS0i!VJ%q zD9ygQjI$^9tC4x=iCVk?4mw+XZPnS4MR{#to(+sPW03du8TNtO)2HA5-CaT6j(;^H z3%}~9OyN+?fzFb!kn-<%D}V@7f~V-?00n;f^W@jF2LgA3jh%4fI;&r1$(R9XSlWQD z%A7t;b#y&X$2iATxmOcY+EU_p($#BTh?~$jE6ZOM?L3RM8+f-FgNigo0Nw=2QQq2CD@oyG6Cn6|Lfr~oX7S%W-0%N(hv z$!xV$R6U=61WqReb4&_+#Zom`hUz6^Q0-SW$&^JV03#0EElR5Gt z-d~ z?o_^^R4-{1;x=_}JhB`7E(wON)Q!6SB+ z9F3zr24^`Yt}Pr!fm#~Fatin(gpo?&_DFf7odQhq7*S}dGe8ch1LdyOWUxwgdiH=p zY5k)ozO%7s=E@BOeBAe8y6l|cIc5QVm(G`4OH*E8Ns0Wzp>S) zgdam~VQ2q6NZ>ycgNDMOV8$70Qoex`3)rrD90x@jWWWxKkA$L0Z#GV! zTnSv-v0ZHcmKj(;?ro?Qh(j?!y;`giduU+Ijins9)vr$`m|ErpFYlsrl{uR%qH}0MD)1 zh+Z2^(Hor^EtGCTC8|FUK}TPL|BN|5cZE}efY8VF0NaltiK!OUjjLj3nlnZm3pp6X`?@>;>=^hwoZiIp03S=OEW64t2O`GrF9o#Wf$tL3D z2Z~+)>j14IAd{OI7M5zbeAOD-c8S?0P4J<9&Za{}l<*bZK8MReUFzAFa&ak)UNxIZ z2Feaa|2IaZNa__6iOXpwNz~Z#u)*^z1COR={va8NFf?#K(TjRdCq05!=vsV8H;g0C zNfx+kR89DE5%H%?>nV^$2)ezVyDYxtRq1UE12 zQhDO%l8rycui@e%`km)lVdnd~o@tY~{Q+?0BpA(8C6U8!|1Wx*0u3RuEZTx>#eC6W zcUO?|Tr?aj0b42wJ5&0g3|f~w=Jv+44Vy4W6@BX(c5#Lm%^pTb;9JBTrMd+3-3$#q ze?YPvf7ninYx?!e%YN!z;h@hSr6R1nsP;#idAX9H**V+1e654Gp-Z_#t|6=C6dWM) z6X(}i%E>{<9}LvtQKc|Z#v5xaCMRUN$%ObY84OWN8yzlpS z78@-Q*co+j2{%EHSNNU4DLkf?=t!9@iYl@2m-}B zvY&Av!87SZPpFvf{mi_USYe}rPmNFedJ?8(!CAh-B)p>NFfxTT6(KVk5U3*4|7|H9i7OUr9=6{56Gt3+pCJe82i&BS* z#otxf{%j)fb1YR`$M&`@Dv$$?@$B!a?tXzcf18K9g4Gz0D$g-@E)qlVw1FmC2t;f< zrXjfs%g?K0avX~~N9k#`O+RpfYH3BKtn~N=c7p73Io{aa3v`=mLda_ISh{yOcg|k3 zQaS*ZiAa;E2$saGNxQi*X6&jLV0Lp45%$o}es#fb+lsew9>WR=z$$Pd?P1qI;caM-%olHk1-d+OE9L_6w-lMmM`(R#UBy$Ck_g^?=pvJdXu=h!SYroHPNAzMjPj|LlpDV`Vtg_2AcoOcBW> zi{_9>zLl-(r^9pyrIESeV7lTqvVB~a-ew&rxJ08&oJMN>r&A#l^T#^77Y${y^&d+2 zn8?i`uO#WnV(Cq3nMFU>BJnfP#Gm4k#h&8C7?vReCDc=L2z`L`K0pkJmfY9e*Ia~y zzPemDI}LeI}0{`VV}vmb9c zeQ)bc9=UzDScb1JMN&+;z}t8?gQiKoslq z!CJ2<3XBmsPOm{f$K%sNTZ>H#uPZlw_2L)DW&;VI69t$gKgubj@oaGBYxTVngew< zOf&o}c7P)zpi1mM$x)&7cOXY{k5e;PGP>heMW&syY{x=fagc-NctFS{v9ZTcd8WTb z;%GNBJKQ!}FThr{^|8;9dTpz(R4=S5zPb%;1vsG9%Q~UZOSX0VQRvoAY3}ox(BIf2 zRQe~#wjZ*cvdu~7)c;?~Z%&1O11-&${Tv<0EA##!D`q&ggi1YP?UZzm7X|9OnbrME zIwu5Q(^NJRpUztmx~;tIw3Ep%QN`s2rO5}>T@wRew9+Nld=r>@HT_#WddWZ9Q^#Ry zfpK`d0rN4<^VJYaF2`U>x^|Idjcgj;#dFwf8p`{Y(F2T^uyN}tTh?eVg(K#=ahxez zRhxn?6Xd5B46!za98JU9TW`=i-V@*$~&G-hM{|_ zEY-x*ZDg((_k&AHUqpyYdsvjAj!LV1oR_!Eye4qQTJ^!vT+r;qFNz9^zcJxPg`(2)$$(J0EyOz<47I zKiIb4x}B2E(-X70EK){5fnG}qJz4GK8IwOY*FjYY9e$>tgD2RzX-E5K);Lc)=GSUE z6AA!QhhW~l;}WiJ$#N%WlqL0BO&6{dZg+x*xVecB4OImEWXTfzkOG3WcgWDms!*HV zKmO8H1plLH!4UoO*@Y|6En_4DRyfy4oPVfJ?3^XcsX}XhJHzd48z;MSPj+T}>owzR zVS25|D@jFM$}37`Sj;O+6<9PZPE}YmEK2>cU`cUrUUcVCVP2+JR#E20FJSlLBU5q0h~U48MCw&v{jIJaYeE=@-+-Nts?{8_9x z)Hh9Nd*T`!rDGUTMQ26ihl<1e z-f`tg|97$LTbvUiyUJV*hUZs)34LWivE|_MmfdfB8_T7%FTwlGBwgoW1B=IIO{gt& z{zn0#v+gQnB~&?-D?V|@+=j`G`?07Bi)lHxgY?96Yj!uo@wXJUFr>c&&S5I<#yD7n zNA`4KNF_^ufbVE+;qJy1h(8gOM+!ZSAx)Ri+BkH@zsRG{{t()dI>b|`wT(uCP(=P6 z*vC+rLcw&(Mq(TyJ&W8x*VQCYxi<^I)@UnPZdhy@-e7wtJAJT=w3_%0_gfaFWulxz zOtsQOY{Nq=T-Zabk?$Xp7I7msr2-r`k2>`+h--=W?S$GZPFhB>C7up7z z8m!Y%oe=B{LfZRSp9hop{ie01v%sNn(RtkC@8(`D$;M|{?fzApeEhF6!carDoB$;T zzT&Lr{jaW$b4-FU_+bw}$?=0(J$2Uvt0tHA1l>pV+;j)NLh$sUo+Wlw5x%>T znZ@$7IFIPRb3KnJ=qdo0cMbcrDD&hlG>zeV#`0gu?rU=jssG{Ryz3NrjuJ8{?5eHIqx+j|_g(7Dqxm26!snfj_m|}cI`~v_z~^}* zmEpJ%`ox@PjlP#EFd6xMO^G*wVLf|*!z2oV)BZYvow7vu84A5%etKA`QoxH>F`^v5Ol@iac$NWk1f35J&*6qT9{Jo<&1To zo3H1V%kMduuKQb(SYqsDn5;YgQd9`1*m~<(DfS>E43DiHHQrGmPo}06{T*{!<=&LN z#Xq+7Pxkq-mCZY$LJd)I#eFpU=z`MxqUz$NcIlB`Wv9;`aTTh(f+87=1$$8Nj15G8 zwj?u$*O&h6^&0kCT7a4jL}ENuxfy0=Kh<&K)7wI%wHBg6RDF%0XAvfdBX(zgnIp(Z zj4b^?A(nV`zzLAl|K%iE)0g5rL-4f@90t!m&mFF@ni|kuxczt=3ot=`u{-(DU!z`z z*;*}-L{VoCg0HiI2=tdau6`lOdBGOkSK3iKcc|7&{uq<3>1%YBK>QL!_tG+ZH@Twk zBi&yO`qr~exR<%kl3+~b6y5OFDn%b=rf&K%`(Vlk6tE~3XTEA1D#(IrvW3~I3UUcX zHIHVS(TBOj>mrPYj6D5G#@!dU=`ws=lBe6TX>7MxKORX-bzdHj8Fu`q9Ziz>@^AK8 z{(n*R7C?18!GmxJ1Shx?+&#FvySqcs;K5~a3+^t#-CbUg;10nxxVy`{_xs=7SNBzI z&Gbz7w9V|>t$j1yNQgXhL7Ly;7Q;+n|iU8Lu|`5G*G{8e-LrcIn_r#5URsVY=8(4hX}7| z-n{+0G{s|}h_dLJW=#?}pH1{1Nj+X-2ZW>)LPFmPI;^yz-LlPWE7^8!70FbZWD0X_ zWeTI5#mjpUGtVB5+`Mq&oQeOauNWeP?v)oYO+$WxsS2!_eLuGzFq65|-_D#$R{NbX z4NZOlh3+k~D@Z!3gFN)56%XTel|*$YU(8S1XmbW){2Ijgj5)l0_EEcN zOy1s?RUuwEq3e%vsWDDlnp8s3M4&};fAteY9%e)VNVm#X0N0B!nUO&0Og=Ifj2m-F+Z3x1kWyP~@3W=Q^Uau_BQj zorF+W%|XI;PVmgQy01m%Hex~=K+ca}2dBwNbo_KOC1*vXGfD1qk-1I!O1DK!JdnmJ z0)2h=4ou1tGhaq)V~|DfBqD}j+(Y)ESJ#Ea)DAR_H*s1{e!yzD(q*t}=Rb=H#2AZp z#2AU6e8X`#Zt)~c$E3n~^P>JuWx=o3s&G$qdgTepRr4}URgktW+!HX<@cFv%+m~JG zG02Ei$Os0z7wD&76~BeljkeZeEBsLqyZ1$6&;09BF=Oh^odYSJ|ILd#Nm%*)3;U?F zreV^(_3P7?xs2;$cWZTQZXpfw(ZF;vkqpJ5j}jjRL9eLF?H5PrFI{>!0DAk$64+Hd z06b#3!6M3O>{)xF0N~ZPtY&EZQ&+YbYAX6sf~}**r#80uewUvl9uk)z9Rf`h`%~yJ z=;P;(vVh=U#QeBQS}{&{EGdr?b}JLSGaVn5C{x^Xu1t%kYr?$--4GE^qffq@BjG=b7_cHqS_U0?e?ccy;u59K z9&UUMvm2RcH2}1oBztAC2Ns33pm|+fKDwM1eRer6f^yj}LYO6&MGeg67qy)IN;9mm z;+jJINtQ=8kTPdWwwODIC?GjIS=2qpwCMa-^g^Y8 zW6^m!^uoyi0#S{m2vw&18`28Jfiig7ZPl*=u{!a6cxrg7sMAm?ydvQuqSR)?5>+_) z6!|+Jwt*J&Ui%@Z)%wN{oB^3oeS(8QKGEC6=BfeA0erFlW}$ncQQ>G|IWY27^GSKH zC{^f1AZJ{A;*>FUf9>ez8=!HD576!k5hsfYC=Zl*<%g2mCPb)~#d@lIxxyxwswU^{ zrH0s zvuCx_e$xpnZ=hc@3F5`l#s%2Zk-H>~JGfFbY)UlyvO}V-6E8qElLzrMy$ydpdijQa zk2AQ|jAK)6#ur8)ub0@GVGfXAJik>5Wz1;OWwHj*-53)3~n>GrXa zq9p$$n(5a6($NgTCc(Cga+8#(FIdv}PS+x+uoBUc{=?QCt20Va`%jO%)0WvkIKuFi zQyFx1B8Goan7Az2HOkmwT=KMuQOV@hUo5b6?Nilvu|G+wI+xJWO=9Cl$xG_0IN5<|l|2USO( z>{p|eY0k5b5yw8d&UVMXNex5pJ4GJt&J4%CjVeQytL4tNlW#p2XANo3r{QvoV}8Ob z-&me_g-^4MWnZg|b{4myUetynsj%^y#xxP6fG+~oaplWd;5 zw&MP2HI7$XX6Ua239TIzj&9N$$FW^8^gpCGI{0UqItkfKHvd+4lH}~p-82*lstdBn zu9%;C@y_PvY)FIhHZnJr9SxtI9s6Zz1Rt2Q1?J|m4v!RXIW+G%s=U211yL$4vn$T_(DPOwO&ErASyGZuAOK(|rW9*G>}NjZkS& zI{2a#d8I=GUmUb7Xo^Ba7F= z-#??%K6ed!?&U|HGpJx!6!>7exs?T`Djp&->8lWSgmL^t!8muD?50|mZgS<86_i9y zBzztlQJgn5FDU{w-KGuVvCYymRJ&Y1biHzocgL$(JT+}7Nx9-o@? zTaNkQk9@#e-msZ>R(syWoX-MZ)((L}cRY@~`+n9X&tp@(+XGL$*~J%A9rbNiqF@f} z�}hLZ2D@pFG7!56^yNkDs~`QxDDvAIZeA^oQgchv6$e^+(s7u@XK2OqE{N>D8jt z8sP+JQi+qrsp3!LPk|SRs5PFun==AgW@Dx6aV}WZ&yflPD=u4VAH=F z(LZ-O>&y>L*OhJFg#95up3KJxS!OW1k4o<*x4d9Hh}&hnNRy`nnu_J0e3n`A67RRv2-h{K~m5T1W*V3G}$%)%DaYg1x_yS{N8^AL+IA0|0O zO@&}oM3)wh3^U^se8#W@HCsZYf(1F|{{!ktQ{IH$)^X^CG^>|)HcK_?P(FuL^@}Oa+4p5eFGRi7huxTX%`n| zOI0GDbN%edHb_Zxfm*~WU@wC?I{41p(4D-D6i214N*#{bV$ z6fl&1YA&#o*`x=-bo07yX!pPjfhT`(<~GVoKP!Ueow{mEh*C7jxV5r{#9oy5W^yM_ zt!qDO7W_ZskC0>T&EthAq~H$X&jVC_-{~-|UDhz!3$|{WT_V7rn8o;3()5U^48C|?4(=gRg_+uK(zab~(iHg51XpuZOHB(4* zul)Ii#skIXd-V03$^?mQ`J=|W-sOGlTjpDH&Cj=H|BpFhu*m_5Du}bdykE6dK4Wt5 zwF(rynAM}8;i=;Z(sR*!OAiJB*U!oEIm;sFd%Pkmrqomh=R!ke^uymjl1bXn%9V~M zPn0!drPED`BKDy%40LQLTsIa_-=}uMSCDqe30V@xb`fh0zcH0ozaZc4Sn;?~l$Nh^g4(q!wG&({ujhEY}?Y=v`*N-^tl( z=?6LKWQNvvBsgV`$Lq35?~i=+QZkB9v&g6lNQhq(u`qIA!VvFQv~T03Kq>4P=NBzs z{+s!h*_Uh??o}RnA_Tc)n~JHOnPiTgW}VAN4nL1D!@Kwdxqh+cr0mwTYPM8TS-nD^ z$a`6)$ONev(2qt%_;$Y-IDr)UvK$A_upK@{7jZMrUK5G}J zT~TV}i%XgSDe4FXn-p=9^K}TvFiZydoJH7p;!;xmvg>tF7v-2mXjP(&Zhgu}UCJpL zA}({-Nt&+|{~w25N^`Oi9T_&9L?lXaijip<@1eBK_uEt8TlT7}-H6xv=AHKVDy61Z zR5nndG2%`in?jqgQ-on`2BN(7G^1*Mx1+!})o0hsVWR&gLuk=F9y<&vnX$ z{|P_I`@}=fU2pis+mz$$B|mWA4|>c2y#t-7LXT<2Z;PO-UTxvmW6*O@Tmm7oe31r>6-u zt=Ej&l!+ul7&^QKM-cj}7uBr*W13k5b|sWvq_W-i5`5SSC-QPeHtp{N)3mvO?5_>k zar3xXag1fHnFCc_!3RNnZUQoEk>6D`4WX+m2=g`FkeW6(@Lv;xE&|_X^V&EDU!0O- zIS*%L?oET#f|+B?NR(7;StB`~7vE%~zOtp4G;QwZDX7^xMa^oESkiLxC?5SFnN+b= zk$W-}rQ4hO)EF`8;FK`K-6m1KzQtAyt4-T%Sp}hwQR{qjlS6S(0cx z=1o%6?21l?x5$bYcxxzvhmu#AWaz-M)ro5FwfV`{it96>y&$Y)Cx7KerM@SIUP3vh z$5gdokK`3RPTDh|UmJn3)%b6vbCaV}(5$~^ZDKNkf~u`%F&!sQ4D^G~^9xK?N$*j=*A>Sg7+0se zS6=RA5-d0Ss2-D0boCI#oqW&vc>F(R>M3*4p7jGu<`@q5rm?ctml1>~jU+8+bR@Ct+jblau&vPrg`WT?hp*+`5lbOrqAw2Wr6<9VSvEefNmM7x@_WUb7+q?LV(6ylO<~$>2Y**1^ zgtlPtb|pz-0|B+l_m59BO%)dwPx>-*Ydu0a$&7JBI4O+NLO7|6jc0Bbztz@*CcA4q zQNlQBYwe;I)4OVr>|~6L;Ypsbk?mB3a<-!Kl>XQs?kEt=46V&||Fh}>*6Pl$=44Ij z4(6&Z6Lkky@y_jjZb zrcMbN5cn5<^(D7HAqbuf{U zF+_Ogx-pLeNC8zkuU2fpzi?O66@C^4pSaLQqYcMRtDi;=o_}6e|7pMZqm0E1>8p1U z9kEXgPqlRUg|&A3g}H%HEBmgi!jZPS;-roD^FD1Dhdp$!{X;Tx&?$MSqhMV0v4)oy z&BG2Y&YzO&Q=9G&ti!sslzN;#h-*F=9-6wWPt*5>>| zd*Ss-bK!EX2Pd)g?cdycwJK+sdFdo1pbes(%9v8Mcr{NmRP*sX^?a(jz6x(?OTo3$ znTTfgN+@3t5Vh;6ta?oM9gp*i`b>qY!PjxY&}TAjQR=r6&VT8=f3@vlJ?K=4e6e2k=93ZpQiYciSzfWe(|aqDyuJhVpfe$;sfi1z z#J`Nraz7;mX z3gl4d$f2q{Z_j_=wA8SS|JUmF@nocw-A*s(xA$oI5l@9fb+?HG^FkhTN%RUq{(kfd zagl(NRlxe0x`*Cz?)hLY0j|`9h$4SVsGgH8w(TFf73bC?EU|7vFWdPTGvM&E7Ss<$kEvd*qoUq7kbnbSNb5toC-0`?2e$!MU?I@ z30d7==(@h}o~mowA8lySY-ll6WQNJ{a(?1Gn&;3MEY~f=FKtjkQd$==v)51BC-|ETqW&2UyJor*|yK+bhF;?0a%sSyt3MI9)<45Oh%%itHoDRWj-xk zPq261FnSJbWj~(W+{>Ju%L^{0TjaE&#l3fRG=%Jr3_YNWLuOH7&MtoaeM!F8=g%eN zu-ed?<}YwQE=N?@sTX5D@W|VKd>8CuDoiKLbt=8rr=Kj{vhMBEt{B4Z5(Ox4+9*D4 z0w%)jB;2Rr`+c*E+!2ePw^vPsxwSW6dfT03yjGkf+MNm2XeryAXT=?C1Uf0&c!+SE7&F8`MhC;Sv|Ft@x(o8|d_0z6^}v z_8=*#)jVSD_1TP``PWd>;pYBYJ3pWoZ?7ZSr);ATo^rP2imhMv;KUt@xLSmzeHz^) z;z^1z*SIkwqL3oKGVXPWxCqpy)dp9oF`u&FhrBTbU&8JkgA_+YTe}R{4{cWg3KRDT zRgwz~vQrkKABw;ZX?Cf>A~G%RMyYSIF;;{VHKip1HThu1FJripUG1O*^`gHEEdDR5NDJc+!?Ac`^vUYSpt~n z5FhM}TLL8K(Z2uUPS+<_8Gxq&Ff=!pxo1>k?viMqs66>L8mg_c8KRwGWxGl6!2iuN=N@4U4lr7uGXZ3O!9Mb1 zYzyoqg}u3AZu^Z6;faBF2QpY=XE-AM;eGwXBgL5psrPsWOLp9-V$s#_UJAxgUt>)^ zN6OCjQJ7`(#+uLf=@C)vQ^u+yDevHYwQ`Qu(}^=5$R4t9v0uKET(kU&@wkYOJMtoa z$+_2Yj|zn(tO;vq>Qa6Zo`MH+~_}F-S@I2h$t)tV(Tk66$ZYV zy>@>tbl<6U&%SEquUIs`fPZ=Ua#BbL^irH=eKg&~fPV=SxqEUKS>lG?5bwcvq9z!oz4j&@wQ&SfVT`zSJVUAWTV;jA-cAG8H!kjko2wd zNGZH}XW)ak1SC62mt8D7JB_!4k+xrSlaN&J;W-YTxl|?XtQF zc<->h=-$|f<*T$kv~^o)+6q}oj-jyrZAJv$%z;)6%ZMrwnb>E{ z;@a#+^P@S2C#ZsZ2d}I;kXEx>5RD3ud-n6|{p+H1X!`^~1w+^Zq;i_Lu)iciow0HV z|EQ|WUY}^LXt;>k(+{C@)(<@pQ!vmMx~0{N@a?R&M+u#k>>dh|1s$d1ZY)bc%op}hE#u@ zUncuBA34k;*v+j&JOS(E^rrk(Wd~YyA)xa=SG4_M*3SANrkxcdmiH=jGW})@ooynf zFW<=eUbYJG_x~|ln*muO5^;x?01aX`k7y)UO14VYC`941fv+lm18F(8Oi1PCO^GC- zWB<|8X6H-oanfj@Dyh)?n@5n``iLtrpQ9pi`XMUft`>eCP##FZjB2|-`V~P)gXMf; zSQEid!}#lKo%EwcUs<5x$N6a?C>OxG^aF2`b^y@|lgQ^YT+(oN1jL}2my(-FjsaIZnQ0xdvVHsf~ zzfb#NSjiMb$0-ftdqTJMk__zFKCwgf|D|bvE*iMj-x5IQO@~g$$Ge+!4B}k$C-fa> zxi__C-FRnD$4uuNryHjl=N-o$4^5{l0S0$Dkp7 z_wAYVM^+;d;Mry}!QHq1vdzt~4P&!TUdNW(c;xOgVPh zx6*}tt(=trJr7$X+qv>DW%i}_`R+NR;(OWjB4_;AqM=GN9)*&nu?4Z&6(}l%QaNHd zp7YBeipyNfI;0JeRiZkAI&RBOpdcsNRJe)VxJ7j5(@~`p%f5Cvjdwa#A!<4wqaFXI z^EMmzF*}8+*vD!WbU%g^`>lYWJA&Ib)&q|_a$9eUbx;(Sq!A7jAHv( z<~yoN)b;kIY_7>Dl`jz{vh=?tI!n{OaIRi>D&IsJyjYn2s}nyIK)N%PixJMzAs2sP zsmZYf+0JT1NE7lGfmfr64)lYsmzhrIZCZPfX^dIv1M6znhN{{|Dz|p#knr;jB>(- zB3rE?lrdpFn`W!D7eQ7=;d6ruK|K`X~{8RiDnVW=X)*e`GF8zcQ?unCs*iwYs5tyxKGaFs1owr^9gSN@1fj`Iy+n zTJ@z@Uh07%>pOD=s7a55;b)lgq3~UJYV3lgg-(=xTr@$=9H^sbt*N`_iHWzBB^FtJ zEQjexQtX_l%z*yfz*@)_yfLawn0nNLmPZ;EEf|s2)Q$CpeWHab?vt$0Q2t4UM=#=`D$O+*v zq`~|KD*En=G-g7W_wkvfg6J);5|{>OA7x2oOadK88H^eC+Y#G}x5Y2Z1otF~<}28L zLBS-(_^I#4vEScuiop93=gQBH6PX|gyl`C)QTyAbbOhY7JWnk>YsJ53HO}_)zLj1hy}nG>-GbQ)-rLRI%erR)_SzRw za4CWC5lFE7$#>|{PJpl~FO%hA+$zhs;1=9qazjJ(O;C_C`rWZ2tQfpsQJqJ20`9(( zrhRL@uLi`AK#gW6io?&wY5?yExOt)!?QJtXFZ>V~U8q%gc67)Dg&l%_-xA7!&-k-g zARJx3y<|WT)Du&Xu^C)`p%5MH-q9_u;(piNZf4e9ArynPv>?+ax$j8!44S^vzLF-a zg>Vgnh`;|e5f^_4NGztk^Rrjv-3eE}ual7@GZinm$dMCV5Q+0h1sAqSq~ZUNwn!D)&&m30EA+GNkd+}&ZC zuVb&A65z&`+^|`|uJ;xj!ZvL1A^mFFH}Rd{CT0=gB;kzaKg+A%livA#T7*K~UZ)m- zaJ0AZW7H#1lEzyVm~h{t;C54C7uk3R*Ea7KoT&2Rctr9SqA5`p7{b@}&wbwZ+od+1v zK3sVPi%r%A`g0yPn8xw0*z!bm;2C83Qc64IX)RO-p29_et6F>p1W&+SH7swfS`z@p zEnwvxy99=_RYw1QBS>FwwCqnxUnu-H{JqrPU-}Td@=D6L<==`@2u>a(e6v!lMSnK_ zdocqJd$J07w>t)I0sEJ2h=J#2*>_;EosoCpVu-Kxu~X#1)fH#Bw^p_m zA;~JRw||@t07m^G?D1IsZyBtd1wcA&IycErfR%mqggfxcLgBC5&GDsIS~)P&*q=8y z)n|aW=}iRvEiWTCO7`{lYfZY@d)CI!Q?M)7hU5a+?IsB_;Bz%7>J;oaPn-*;IraZJ z3m&VeyM0S!2QmISaBCiVII(3pxobLV9QOB{0~S_)-L5obUmN2VFKUT`Ha}zuMICZB zJsC;Vt{#Kz2Uiz{$fr(F^lN`sP1$jgM9rFan!T$hZ}3s{&Fa$>Y!>GIz9;;HsB?Dk zM>#1OSBaUDM*N>d3n)kF(kM*(R0=-|{Vc`a)MY zX+MtYs5GPDO)B!H@f+a<#&ZHm>XNYI(p$=s@PVQ*)vbE#J5xcPd=>~o=T-S!l(!Jl z45EB%nr$IYDY>-zBQIRtRWtS6?g-q}4m|7DUD4J1ANy8AKvrRqY|wJo6G9xP5lh^h$6PQZ-;670bo6j|rL;pK*djf@ssGqm z{XmtQM`Pdp4={8Ze_9TD@P6vg;z_sv zwG#{Fq+7$nuj#I0;JMxI#2n%6B4aZZ^6Oi629lozJcJ7oD50%O?L{G{zvT7N8bGGoTxIJ2%JR!bl_09ig_eK3q^n$l zDZHep-^Dd+%*p^;7Sv(3c?f;x${1{W%?SxAp@Z(Tud??pqW{4%XZ5BO16&e&gmwFHgckTt5EbYBxrVWiuKbts8M;XM zo8D`jM3{qXE(3h+7Hc1&8;)xGpj~EP^U2>lsDX)T1_9FA)v&5Qs0`$8NO7xf8r)^K zqrUwq0~wUqdwKTGFxQVHBKdrwVed;nE6lP*KMQc@&7n;3o5rdpK>rBlZQMd6!690~ zsvZ8AD?L6-FK^;j&X}*C-Xz)C@X^_}(pr*wI;Lr&cK8#Yhx@7ic6yg7vrb9{$s*tY z%r(*D3+KMBaj9t@?bhE~V;1N+_r>y6Xh!61Vz{!3(8+mwWtaY=p!p7~5tma(RxQUC zhlDmeZjK}N%gZ1n-j+Cxlrn4R8~o9}^CvMeFN5H=Yaw*9asdYs8HTtlG>owwoRIme zHi{td+P*WYn78M+sLY2rs1U5nHq-(-0E{PQJt-`OmU$Z|88PBX8a>?vFp67r1%FSy z+BCZJUQc#r-SJ>BTOeGZ=|D2qQ}71sUA!6oTz7GI4XEbPk66AEU%Jw}V8QU&J(V4w zv@o$!TMs=7TRIYTxBR< zvc2(aS97gqx4Ll=`gGmt``U_yIgfw-?z=o_#;-`K=a!IxcSU{VW-li~H9{U;Pbv58 zsaRS@X}$ZZ3-9RY$w3)r(_o1m@QjlYTZ`D5|10$G6dhw}?64WWr?bwrn7H>Ru21|0 zdUhA(zQiS&p1bq_vZ7(3)<)0L91xcttb@_}G(OM+FC5T~mQcJ<%=Fc_JE@G&Vh0>r^}bJ*vM`WdZWv~d4%qp|Fw}Uh=s#aNs>sMlz>>&>RdA0H-YDk z+AT_9o-P>kG?{Sh13i~aEV<5z*`Nll4M4%^xrADFnpn;+;?g*61k zG6(e^a%FI5$vr6zX$cZ`GB_CIhp$vRJeh+^XN$ei1yY$=qPE(9=sqOw^#1r}AaVT@ zhPi<}Zg`uVq2rB+x#3s+*fx13TP_4_CJ%yM<8)Jr#av^WC?KK+8fxg0`Xx@$o1{(1 zZ4}Rms4<2iiTeiY`5Da6gZM7v1$Cu9qb?_y?`lQFAG_!b=fd)bhwgHYxHQB&IH>*_ z-6n%d*&+)p%G!xJ7y1$udMZ!G%V?3eeNe0f74(<8wKv)H?}UBo9}{x)m_HIxS>*R* z7L~jTlzNzfk;!7{fNyc9><})QgQN+$<^)8%8Q9P!uFN-KE1DkniqK$JhB~ufGS(U& z5*}jJIf0_YGDffR6_$`U(Qdac!8|OezlvXDz-HmA;M8IxzaGf7O-8ZOEf%_(z%V2- zJ2v9Cgi?Cc_irw^3KRxKN^oml@Zy0n^X;Fx)Y9~BmShY8^Q0juW*73h1f+E%Bd%)) zW&TV7E*CP_Npp&{OfRqRA%e=pgzfZ^@iARv&e+Q`+|tO`zQa_mVXBt>sq7O=ySWH=xmIrOkUYVBVA`6U?cP{R~7k0s^2UJ(-?p|K*M^B1)J(#l7&<%Q7XQdDJHCGq8yzJPW9{FgoJa<6P6hI!i_3x?rPRkcgb3vA?j~;j z>gX+G9yDL=w!m)?Du1oCpqxM!q^7W$RH0i<@J)F+*h#P{8eBBTw{R7wDpQx5&6c$3 z`jAy9?)h<)WQJoSaKerpwhJa}Zjg10X{m~m_%aeuwZyt4{vHT#6v8Cq4dvL^aQrJE z>G~5;oeYH!MOAGAWwkfvErGzpXiRN}m=iM$^Ko)ayEr2N`bLrN>(+p;q0dslkF1J& zQ7Ef@!j%FT3$nW5PrIZV^OaD9iA7a3CgO?nv4UG$zVc&Yzek?JEO3S;SIptacgd$* zIimYr@71765A-u5poR|g8(srY6n$6kOIofVCLR)NAj@)}dBQuX5hs68BBwsH_Qok<=!_F2j_45{N7Du<0_xkLKhF zTyjvTts$87R#MMOT&TLG{2>Q z&qp7=@5aXtNqxR!#W!$TZ%7UJKr)hJQ%Y!nu3kV8J&@IxO39PZ48t=L>8=c=t71Uf@N~vE%^~l_yn^|H-W^|QdG)u z(S}@l(fh^zZs#FvFo-B+ACjb!vb;&EEVcENLZi>_9$iuAT4N)J9jnWlBtu9Ti&U?*_1M)A5g4m=OQ7&`7WIM! zLcgUdkriBI;`>}m_JPd4(O;!H1SvDc(TTgW=8xEU?T)f4xd#o! zKDQFMG>>Xl`fth=W9;-)i^YE;p+}gf3Ng5rnWxOv=#H4z`?_#=01P8N-u7UtuH9z& z+vKzlVzJlR@i4O9M>q?&tgH_}VgDw>k0p!4jgc#(W#6ea1Xq^s~`PgH!JxeA|j`7qH!*zq;Qgabyb8%zh|gX zAUfxHW_-X+IjCs2P03#3My5>0S>h&(x<#jrY#qZFpCnLB_-|l$=tsY7MM|Z>R6ex< z)%fo%dJi_$28)h@ji@gPG;_AY*|Nzt>o2htuSim2RJ}U3fS}3U_-(2@T z?DGiJk36*0-%1F_WmYIB1g6TJEhd_VcIk>BW%D;`$9*p&JsRf{!5V&Q*ZtzEKjHHk z4sC_YlGh4xWMN53CR&|$(|Mkj%^LAyI|tai(@k@1TFSp{hS!IGc^SoH$rRcs+t7#; zEBZvekR`aw0fQ3M6JyB&$r_nlab3H!O@e0lV)~yOY*z4}FpfCZ>*%k1#1y3}E3M`g z=FrrREjbW|%WbA?H^tNxeKO&D5VMQPd~tY&RFDDOC5lH@r?9}SF_8_Hc)hvYB-AAR zxm@!i9xeo3K(_WMjObs2$sCGuhA-YI2AQupNJcshAU(9km-CUmSISi6zFrtrSs7a) zinp0Vacr(9Tio}`$Q25ju25=G(Fnfi#ms|2A zI?QVQxFDb@>mC*+58K|lQskeakNgRB2KSj_j!V3EAxoM!OdgK?2)#^?jpN)8A?B3? zrX>FxpsT`0>|N1E+fd@8l8^E+CG>%pW*XI}(wro#gy6YJn~ubgxtK$=S*I1K#XbI4 z5eypi1207_F={3L_};{*8|F%BSr_LHRimG@%RK94q=AWXH(g}<6l4cp>L<|nyk~5! z!6_P)(k?Ey2wHKZbf6MCWi2Icz8RJHv^k*}KqWqXPN>-UDv{kD5abNEQgm_cn5k}| zu{ikgaBq>ad(gzP>qB|iH1$o!;;@OO$v^(r-1<$=kfOt_hG=T65d8^y*EC&?95vGp`DLeBbwSKAoniGqVwRnzt9vcrzCktSW2iNE4VjWE7`k=foWyf7HVn0tV+?)iyqhdQpbag5Q*LoL%vYfLG3j3bmLS52!$ zfh$hv`~>~Mm~{By=yc>z=I|(0YaUC@8{i9!j>*nFs7QrQ^yYif=#&0g@EX#Tt5noY z?j@Kb!$(tp@Fe3eXQ|w(k%BgSHd7iQ803g+x3ZYHKF9mFL*9GphOXI+rc_N-)qS>n zPD4p$6v4m$X0p75LsoSCx-G0Nq9A$hH3BY|O`ljToNw`3+$B8sgn&6QoR2&6fz|@m z%@ZW?ta6Zwlyu=!IYfvN!PlxG2Rp-*_D6Ztj^YA*1KAJ>hE7XChvx#A*#lu_YyW6v zRcIBKkjz)n_n>|HrLrYIsf(HVBRYJ>ECB*7}{)igqnyUmMXEP~!o&GL>0-iOzDz?mIM&sAldurD}}fyCc) zueHX}m+vhG?)|!!_z@U{-h51g>$y5&+d|!eHo)#;3t)QR|6-!)u#CTldXRsJoCJ z@X-eE`+CHd&+mY(nEMy#fkBd-eqql~xzA4|ebD!T0NgziNC_bB&wwp{40oQ+#{vi3 zbkSg8JqLcr|2X1kTJR7`&)6SO!PpyMD*)zQU&8VB`LJ~M{4bzxbt{6qZZRBM4MD^Eypu(TI#^a-XYUU@UJv33_ z2S@F`?DT;?-*?5>J2I_r;Ir!8-1Fd_Jw4&!DSGqMzWxD(u6KV*?f!fdb@QFED8qjG zMOT1BaQSn81$UwnI>G&t{rc14?x)h;&+`Zg!svyn!vZ*Wr$ahq zPbfNkq7Ye#x4#_x-Rl>!`I}8;_rJl?=2;89uc3j#Wb~EekySzx_gxH`6$1enL0*20$$Pnyrs<1!Orq(FwV{Y> zo}z8m53&907-(sXx$D&!k-2 zI)DAFtN0n9@ebJ#yx@GaXdcvdzZl}Qx0n>vb`4s`VXP!7+Zo-&>I*eyLHgHMI|cu5 zv{oKKS%lE0eR4iq)P`}sTGamJd==iwWNPq+Vza_m^Zp!0TJv6aj%n1tK#Qwz;4O(( z*^dOedhUfO6vKm3d#h4>GhaP;*{_`b+@f5mvgA0lW* zKPYJ1rd}of^v60x6dhj{5}Nj=Ze4_!CgHmQ9ylJhoFHp+Ueqxe6vvM7)#p`|FLEOUJK^+PF%$lQE%+zQ1HCT# zsU{ctd9&%{WH(ne{5_jC%z0*E_RTuFQNnZ?c`JDwc`bP!Iq26{$(^W=Q9)5Ajev)A zNyr?dmm*%&ODY=71Jf2cdROsh!<~XkD==k~IckP=&dhovfU(jTu7D-`bXSX%sYfhx ze@=V6wYrHTLFKF8LM+MT`vp|;MbgwpYV7_eUZ^_>R>jiyr*qnx{RXt6r+BoQBU3Vi zNeZ#)y+SdSJ##U%J;=OMU&IcD0IE;`T}YKHLIGC~9gHH1gY9{T^r`l?)H@0S88|F7 z9!Lx6x@Y+Da;klJzgjyjXbBQ~XnR9khkC*82!N~AH2|WFaQD)pt$;tf_A6-X_U^WhAb~F+^AA80w+E4ith^_n*}g~? z1pWF&9xY(xZG{-mI>6I$qtgZq8SeiRAw>3l~RJ1laz`p}TYKw>b$qq{Bv znkdTf<@SRgMRH|w{}2tim@hFohh;6?W?Q#{ki|cika)HOV9H}a#8;Jpyk+~RZUWiW zSK~FrNaLscGgF4drWW+g>*6YVw7_u|U38hZ2J8{NA@rdeG6a$aaxXhVXCdQWJ~nbm zI~EC6Sg(PobP1f`=|C{dDlFdOf-pn*PJcRn z2-%Ht{TTr|(B**JscbXQT7GRgRs+4+GK%Hi{+k|sT-pzW6A~seJzZOGp98Hl2_xt!A`O7p$ax<~_*Xp-kL4blmGzZPjRq%nA+s?hhO5;#=s zv2@u(W=ZYBREP{-(ME%jNW=o;xx{JF=}q7z`~IL7C=6$lVIgL)hp3S`hpEz2#@fk9 z;i?wJ+Tlg7IU9bY@Gwa0mHDzLZn7JDV#?YubO(=jwBwBxed{a;yT9acC<@boTo(ce z!m11`!9&xUe@}+OV%xX;P#o=rC-T+Y2v%h>Jq`+sW8dlnRZL8MiOMWqw!e%6A|!r* zDd`|lS^(Y;16Z^9D>StJ*ziC+4}p&Zzjstgy%UB4PQ{2}8lg?wmwf6>5G;w)1>t_C znwY;5f)EOBG&F;@z^}N z5yGYo9RtbS7FSIo*6%*!xp=&NMDFd}_#}Q^^Y9z3`-C2^!J`{B?A(wffXsK1lQsF` znF?>#!w){}-jF1a43cEyw+iUQoOSo&nG^5X;|&%W+R5)@3G^$D0^H*ly#GblSAazk zc8${PvIt0bcS}jf($YvsgMgHjAT0w(N_V%YG}0j<-7PI$f;7@`2fzBid++}|oHM8E zeP^HDWp)PZupYoUROI6#Ic3VJx!;q&?6kgr(R@k0RU3jv{sc0^*gl zB1itlR~BNMG$u{{@-7vpn!RJUzOgP`y009g>$i~|AnI_SzcyNdDYT}3m<}H;U-;db zYupeNCfzii*pq8WlF^-O(7+HOT{Aw^ldJcue@(q)0k=C>mt?pnSEoTLLb|vWKR{Cg zzp{0vku2od#^w_T;MDu+UxfAUP7bn@@KuR??xqwc;ZlTVTl4C>WpxUPjZ?)}B+r}K zY@o075@Y=+xlLH3e!OHlMlkA@p^KDxwV|hRWX?Q zgjVo9O^D|NqarY@dQn%{J!Oe8gtFTHZ1h=Ue_8i%yYnq(?o(Ubun*d6hNH7eJY(63rUe13QK z&4^3My_33U%Fp|Zbqesbux2nSdAstgCpjgtUrzepsUdy27uCC|eGX9Pe;d75bTT5o zl1Po|p~&PBqQ<<unm4qHX@Jp*NZwaiY zGT$YhF3`*FW;W=z#7`O*&I} zOXKMMt?&-jRqImcAMkntgE$GJ?R#IMKN2e4N3VK$D0krZpB?&oI8T8cXUnR}w>E;*E9|W4aGy_`NG=LOWci2yj9jW4o{$ z=PgJa--0rpxu$1}IGYzFcVj_!YM*5RFr_Qu1~|ek^(AkMb&*q`k$LTh!+Z9-Mf()8K=iNLmUu>sF&Z|A}k`FSTtcL@? zkTLd^guOxwaOz`m6i;~y%ypibTl_lk8ojqs>gH-j&^uj##TAHo(^OUiT*`zJ>(j8$ zd(ahVWkmS}cs;j4H+C}%Pd~UQZZcfW#CoTT@9)%_m`wuMFXxov(0e2_O_<1!>~CW0 zkH#SKz?-K|eC=ZYAw`^+VD+WiH$f>(%7~56}+^h;UZO+Px==L$!ut^(1_hJb0F50}r6lpJ_u6RaO*p z{2{G`^(K}EC*Jkk9R0BeHB@)o)BY6L5f1a$^1-sZz9U-SZxGbHwPdNgRI@3MNZKVm||lr*rK- zbF6B1(MV23@hY#e(v!67JS$Q>O4+u z%P~BV%6~~3Q#9W%ro4yoQGB2f?G6#^hWilPX*tB-*AH0&^Awr{-gkU~rXHCM2F{&zP+gs)Y14LuN%rWZ4M{z*%%Iwyd&Vg}l;ca| zg})Bdz|0KT4Ej>-fkV47%F;`er$SPM%A&E*k8%ljHR0hD>|V08CSQk*1!E4q_o4Y9 zk0NyfmkExN!lXTHUt#VgqCJMM{yiXVF!uuJw8xVBAe(m#Km02V*nBulyxApOhs7e5 zQ87AiuC)8m2s6~xO10oX`2sH`t6BFRl&FSWCZT8=zE~W|7GEepL1z}XNoYT;C!cy@ z)m3Xwyf?RiXk%-XhgN!k+9YOLUBW41!p7N;ntW~WbI>Jxl1q9P0GY+$1q{@!*%lsG zEY6s*yKoEVP->IV{l3z-F7ib6s41ks?ZI(xWs4iY@tIj8*<`& zN=ZkO)=?32*-YVA(l84RZ|hk0W<~2Tb_WuD#(@j!YIxF-6!;9eTfjP!9XkuYYvBwG zjH2mzeI8}hqa+Wk?OnagwXYPtfNJ-yPUW(aTx!tKNx1d)MjP=QzsGJ9TOH07<2km> zj_|RG*^tusq9}J)-P@Zjptm44Nkf<2XyK{;IDp7!HccW*F+NZ}0%h3twl`DcxO(>6 zipIR7omHamdXg8k$zEb|*!JE>!kQWQ{q=TgGcl-HPS2{(xh38^Tm*D0Go-+`bVF@N%VpDfo(4#(Up@STfX*Lzw; zgP;zbNf#Z;=)!`~y^zSNp&=or*FAk$z8$j4J5;uVBNa#aktbAW5(C&8e>yx3AFYx< z*+m}-xLtQ{?wQT?dVl|Y1Ul~251rm;Emwe0uu?5s)TU32tIp$u4L9W8k)nY~;->rm0bL5Ey z5W&aWB6{3g;w@(@rXi5uo8kFQNW4UHx{y~vsJ%;pwhe@ogm@p*@LSDdFkJ3@PR5NP0jK4+sb;1$a6<9!S?E z-<1#Czt7%M|Ne7C1#8zbX+F;7HatackPmMYFK=dq^!VHsEsJY7T#%PvjvQGv zyz#BqXnM*yLQKcq?w$H5%Ac;HZS9gld^+?{dUdd~xoAOI_JZT+bjR8Ic)%@c#E)^= zXPS~IaJCscaDbxv`(YhWELlI-Bsnwdq6TU2$wF^$%R+0fGHyD~;x5@S!t>KGx-O%R z`1Q^-g#lT<_sxkY;zI=+&m#}IETUSQuhrQkYIwcxL!D#6*`lvR({nT0XeS#g4o zgmF}lIB~>}KGFA~7_NekIt)QOQM32s4xRR^2yyqfbYO=*eKJ%Ee6K)TWj{w7adz(; z3G>{?3TD6|Y7ilIaQd_FaZDG+K2Ix%{u^N@-H!-Ng$Jg>22;U&JT~60sB}!})oEdF z1wA(G5ODH8_t%~hCgyY^fDqL)7G?WEzhRfSSaBOJv*K_ba>m5xBd#D$8$S+2|Azhg zWYjeDo)xDZ0Ei%C5?q4N!d7qUpBwbmccLUOTaQbNm*Nm6?>f0qbI+zb7Z`i)P(nK zKZ&TZqz277kum;y0?T-_GJKEgRv*U}K(+Lr1K#Lt)bl~^oY~r2J-3ts6z^u6pod&b zDt^F?1Jcd4JGfoj(h=@47Evxj4jJ28gPtOuY#lPbyrW%|8Kmk;54~*iz#^TmiM=L)EIZ}?+;d5 z=Gwltu(FFo*Gx@H51@2m<>gS?_pNiGP&yR{%&e%>=@m1_78VH1`-DPDa3=i#>Q(>5 z_bl#6g#35D3G|A;9sREUBpHtrq64r6Xhd=k&U1XP?+)z#C^tE}S7xejE@!SoS8_ZY zYHDmQWv)S2`P=PzMTxWiT7+D6|6bN|Mz?1qjC72(jx0clG?~B5I*@8HmB?_SzRX#g zPV{g%Z#k*kK9V5vuvx_Tds;U|WE1JiTX)d_Z_;yq0lxO7{R>nB(s@!5(iOnQy&J_F za84_jF>9;jpZz@TLChE=;Kod!PxDbXR$M>?$ z#Y)ymb1k9!i`@44aFVH^Iow>6?$rA;W6D&@SjrED+YgbiH~9(q2>Icy?lN)dmXV_e z6i-rzNFu99xA@?#*-Vb%Lk<9^AoA$pR{lTx_!!*PE-=kkX16d3c?3}6EsWQzSUh2i zY9l1mY0N4GC)AxF$M<`SHnue4@3EycfgPpWjRQvlzM&q8~p+ zB&Rb&5=2{An-Yd4z4Ytxd%rNZtjB}t1gq~YRdI;rMI`4NL2w7JLn(4j&V!mJ$3b%f z`Y{iQoe~V17A%7i9T0UJw72v&l@Xc-(-DR%fj02EHur{_9-}1UWkRPEgKNw-a|eEp zIc>ChRMAbHc!Lt&HjZts{DqejDC$uhc#>nk*z-l@x==>1wDBZ&C!Q~eGE;O7ng32h zh|&P-dvCnzZ{To{j__fT8!@B628mf%tkcCHID6h6Pf|#j(eI6`3V3(m=!LV@>cq!* zK+J@WoQkBXL2kH*bJB+%ly!E3a%is}>tXb~cvcrUtAP}7CTp07?1Ptfyj^jnl2)g_F z&f5S$I*rCamOb0WbYeZ7Uzz8bEOVm$J^xtl6G^J6MR2U5+$)mQmljd6%p?4c{ps}# zYYY7W99oH^c?7G8T(j`;&$>zWG+I3$I07+p^Vv^)?7#}gG-m9y1(Xr2=3HIP6FKCc z>dXp&w}RJv0uE$nyM~n??8J@y=L^ee6u>E|@fY~J2Qg4|MscfO04}f6#Mqd&epFNx zo(BoC@~6m9k4NH^qUyh zV7{|$M{&|$V-_uS#?P7({6Iph!&@73p~`Ou3p>%`Fv&$K_B2rFUexx2g@pddgD#IU z;I;V+3FOWcO@R5|yl#JN_I3)zX;cWWO$rp(7Qz0C;YM0Q0xQ;K{a>N-F4|Elf@#I$ zivK}?pvMF6QS6Y0pxR`KR8J@jMR(MGKtGD0rbNOIUJvMp5xAN=jDF^$|HJ!V&VM7c zD-JG~&YAfcfEFIbXUgEFB71_!ViT#_{@nmXxq5%mkRWte^CT6)?FiieaDXY-jit1Nk3EyuKyQz&4AB)FXbUCwdE71jrX&}eWtAPLHW z1H%-Ca+D?UAmT@;wm(*n6bBK99nwo@{xzC~Evai-mASo0@z>Q7xy7Z36hx!aS8(#NA8yK_(v75<7TE7pOC6BLw!D&q0IJ2%`Z)K!lEw+TeEt=|B&m187BQ zzCF`!2fC>#x-|qXfrVtpO*VAZLrr1g472{~ZUKzc@L6c8AHin4?ZC z(298Zd7Kg2MZ(8n$;q)=ktg!=`<)c_P4Q0Ed#dB0fCUtMd=NN;f+T zTKlotS_Z56q)dB}z1Q<3R`bKc^KQelwI{>1MozVRc~$nw8TL)TU(XX*&6k0yq1oEq z;o6^0N#+xJQ5;r6wV4}VQi5@bR^T7Hhw2mZJXbq@;13~$!dTM~ai+ESkf}L~trK0B z^u~j$KB{cl{GuW+b{gt3Py*^UXhf2Y`23Ad21g?h8gN!F+wd$`UIw12FJL(L1VWwZ zdxM}O*JS%Cl|k$M^^z;p^wZti7$ZturIkd|TD`%ZJeBEnLG&W-rB-2|PNybhq5|DZ zx5Ds8%J#x&>(W|?)4m2dUFflOrlm9y=h+Si*NaZIci|*f+3i`|^Z=8$$6YZ6R3Cup zoe&k-awE)A0~$)ZwU?pKipWG(MW?qq>>O&|J&_UH)6;&@Ok8R6L1cdhUQfMKWLChH z_@lyYp^12|E=b+07!WYvx2MVYY6&xwKUr^U>>lol`E%N4nE&U-&#GiTOOc1q7N$tE z<6xkGq489WafC;|vI5v|CgvHzRc_e13#ZxjL<-lZY6S)O5hXiPY@OyouW1s*U&HZD z#9ju~=f72JBO7Xbt84m!w2DG$yv{)^{v+k?)N{q>W3PTY67XBXa&;ycE&3B1i2LW@ zGqLW7zVSka>aIBLI-9C(thz@pd(Zg%d-8ZoN$p({$D|-3bwCzN3Wb$D&1=ghre&R4 zCfLG<;c5qaSu6dz9lO3-0{G^Bn=oCb&2&F>O<5;&SgQ{HP3cfS*}h55wD+4;jT_&A zUMYpWI}G#4_q$b)N6&ICoZldg+QOTyJz|kxmjBYyo$@8GBdV4d~ zKTxoiDk)&OXFyk}FcJ1rO${BE<36qOyS>O1cuLG(DvI>Cz()078H?DLCN z`^!h_MCF6TenMT zHrl1%6dIwNuX;087`-OvHnL;)ZL`HC+FsbVmch~boD`UPLKD&aN$eB>c8!32<|mHO zl=o+T5q^FmY~ww({fcPD<=~b4yE%u)L%FsNNoqYwb!Owm$8-dpT?Q$4sAa;nzOT zA&*WZf`C!ldxKEmd#}r}Ba!_2K;*l-zC3o)`K7IFmZ;t}|95w9S3}p=#qVjIW#neB zZ=^dPU#{kTZ-tY`x;Y+lVOs_q`o0HT1ZlHB@n1{_(;YYHy$37=c~~&@Zggo*f848t zhOhMJeZ7?%{Z4}(LP7p@+Q}R~_K`Nx_>sI9e+*ze-v203HS(j_4^q}lQXBAQ>^#CE zq#3cQ%vO#^a*Kvb%z>2JEfw}TytgCp zZTWjR#Aw?DntOhuL~|Mk+)f8<)7)p`fcHh`3iLf{g-D5EF9(-N9gvyj^goI*5V2U- z$pj)6=6KO1O|!|UXGvcnqogf>FJ9KEk8rGAkYknd%>^X=U}Q^#bq=S4Xt>tLG*c1O zRAwAM37=axW+FyI6_B4c4@^A)mh2^gh#>m}GC1y} z;gMcmJZsr^P_>D$jj&ngX!LnBr)M1CVkE?;T56M9nqHD^pT50~AB z-7aIQ7qJx6Fzw;}^03`Hg3dl}S~zJkAE({ApSB$Gkai^bmwuSvW~1Dq@W5eSLt$*) z;PF{iL+O~P7jB7diOs@TFHN|Q&uod^!bE-f7^VtJI_bmv{>xCsJMO&MA2ZKq0Mao9 zqXTFozZahu{~Lq`uI*{TPtJyPRI&r-7o|DfG2In%JGw3E4l33elY#}YTwgzizwYAe z=4a$PM$?hAD^2LG?v9XKtmp^LGrGTZ2gohv^ruv6kH44_ER6*mX{5uaO1gz2Pe?Dn zNBE$Q>QB~xbk?Jjh>88~Y^S{jq;SQrIW{rX7%TXmx=S2)o^+g5F$BR&$go`gYffp$_uFM^#Wvoon7G*3<(u!rw zOz-8(n3#~2${3kCwgm8*^JUBE&+Bnc&jWGR&p+Z!o+sdRo>S0RA2h*Z7AN59i@b20 z#VYvd&+|a)rmaBWcevGg!^?#e_~-(5Aaw&3hLkfGM9N75H(=2iKVZQaH(<_~Fkr@) z9VPQt27>D?3)#6U#0mVvOJlvW1&@heNN`pW#5`=E&sfNJma4z!3>4SgFRCYAxW@@V zDu+n7Lwg#CI&fDO2W!2BLy&xQAxH_W_3Lqtx@LHa8=d2a9YDixX zaJZL;Abo3M79&b_X=-9_ew^&G_MVV)tGfyK7ZS1I)Yx)ckCk}6`o7do@7MNGC z_#tny_JhNlng@qLz5h7i;rw+7+5L~hNacgWk>P`b!(WGLt-lVH~QyvAtQS_jBqVu46`Q;y)hY&3P2|@NL>~E1?KOTzAFJIz^{ap4M z^4U6O8UWM4#2)G*^!jTPy$IU8*e(QvR*XJ>2zqz=5EQQVx30;D&i|)F@|ie|WeDw*Bky19WJ$BFu`r z`IQ>0x0bTyD>ApAKQ}4C*KgnE)DQq}+#iZSr z3kJ2UI8!$UGx_y?Wb#+|_}Q;F{{SIYZV8n(JPVCBEDJGD&4VzMbH!WIV#Y<1eg-)A z?=9c*S16}Kh&7Txp=~fm$m6wkxqie?J${kQBx!LJB1wNFFS&kL?x(O4?azH}g1qvl6|sFs0OF`N(wY5~ci&&Y=`7`51lKbG0C7|fp zoren3eU$2*QRdCt%o}gv%k#vIZZdtCN@-Bi6x_frH@{{Sd_Wir2fbVZA#VON7_@F2 z-kx6_bI8g;@AC{6_9XEp%ozl~XLmB{3;=E3xX5>?p}*lSM6h67$4|%4; zGS%fq)n&2FwrgR3GGTuMVgGqye-UB-CVBF}i>2qwa>wcsZ^h zi55#5W+A>xu=WQ=I#$_uJP_hRcn-po#Js-xXJZ!d0&AW^O}#2e zGL^KUA<)uS2udK-G%E%^kFLoTiZ8(10aqv|W zrs=~tN`q>r;PQ64#WkZ~E78mxALSDX#~liSs^x8HhPveZ#6i-;hDHpmpHf#}0X>0m zT&f_*RROS}q0rG+kOz6ZXRu$21wp3?<8a}k>X;}n^%^JwFDex-td3Cy*$I%10NLW| zm|>7T0oj0Yc;lDq7*3EK09hN*AGGk&0aJm)$O2PwfyEGk#VCPlOHlm*RD-QFgOwQT z>H`Xnp#CYSHvskaU`etzG)CI`3e(kuZs1=H;f_AcTOVd9jWRQ;Z*9xr^ysna|2QWt zz;luZJSR!ObFv#eCy!V;EWmS;q;(wrO4){nx2!q_%FJOA@C=q3GY)4gsg4N)Sw_$) z9u%<@071%HHZ*w8^?N%L33;FeLCTsoH1V4Hy-u?@rg9*ut>3#2T6=;TDI1#STKc^S zAPY7!SPiBCEqK9cq=NoVZ>g8TX}r>~p{W8FUQb8Aw**Y31BSH&Q@sT}f6px7F%u!a02yMQKpk6kN@QMkKE~h5{_7 zF_Ey6vLL8L*M?>n%zFj0=FecW&ILiQ!Tn1HRv4T>SPAam*WmsY0XI@6C<2$y0vyw9 z$~asAoQVop890F11OVhqt7C>hz6#{Q?I{4B4;&yH4zh9M@LF(WnP9QQpvVeL2_5U;jUy0{`DupMtHD zfvq+q621Xj%>Y~70$aTVS+LaxuvJ5_RU)u2@Kk*RwrU8r+9SK~5BAi+0J?p^l?GK6j~xjl^%Ke(-d;`2^~{*=`?`mSGqVi z-@6Iy;4hAqEx9}CYo@(duMje7 z_B6&2mvzu4Q4Rb=Nk7+97y&=+GqNP&zleWJ{x_mrs9zr44}Ri`z|5!ie-W$+Sdu}t z85jkq>bcbjtOGqF{p}tbSMs57z3|{#XdoL4^JKxj{CiqwNto4}!lM$$t_5mi%vo0Qp9KvY8Tu zAlY6Cf&mzXz+u%71;fC~|3T!yZ4i~Iv5>x~3nLIbLpKc=Lwq1{%M`%w!XLW(Z$dmX zN48aUc{N4H+S!n;ns^k01Fh!45b{w0UGg2#FR<{~hdP!7&cbn3e(ogZW>?za{?*u^N}}^IzfqyVwU+{f0WT zZgc@Wycz)jn*loqsRzOo$r%T%^B)Dbq2zR)X)0 zZ`$tcA0LJBuxA*Afq&W6>sYgZTjQB+P}0LfhhZV0Cj685x8#2#Y`QhX|CR9Hng5$u zrK-}%Wzc`fh6?8WH$kG0fEW56Y+eRjTP0TnMq+T*9Ak(nPRXMx5JF(miQal5wv8hM zK93dTMvk#3jQ2%_7QSiJ z@-!+6;M4{*l8ZhnX-^fTfq!EKX+H|mCJNG~3-m_|^d}4S#|!kQ3iQVc^nVoSPZa1+ z7tDoafs3@3I`+0IvfzppD@V_#e zZ{HSrooObX36ad=rc}jpydM%KF&&n#MHS%12oM5L^#}%qdIj1t0$*dleuanP!Xt$} z!(M_caAN&_2+7E_iV!WuC6>R<@VOQK;4F&!_l&5)N1HwY1l&yc3y8%es3R%QG0Oaf zJ})z-#A7(T7b-TT7_>n>|DK^+0p0Ah5T(?O+dMFQ=7l!c&^Keu8+DfXwwjBHnhcps zXwI<<7&9)8I@5Qlo^H%<79iiN`DI_)y!PsVZL-k9r!%f!lviu|1b#T_VjnTQ?vYjpY3b=`d;cIh9?qU*Xh z=mDDjb-!?)$c+X*bwsCQHS;~h+y4A(RDL2Cn^%Hu-s<}pWq8z?(}PTHA~*X}hhsX{ zEg!{|jqvHjU(3HzX^B_jI<+CvYAPXFX;@m6c-TSGK~ZKPInOy>qkCTTz33 zDR1z&PkCj6eS`Z(M;LfcT~aY`MM0JlV3d}Kj>*lI?;~Ckm6N+`qP%BB!tvXMqU9h= z$74z&m3=1mLo-}5L!fnfmyGzO?GGPvjQ=hPS`PAb6{b_%(ZLf0hWadX1Wl)R*@zJ; zh9kUw!(D%n(YS@3Z(|T$pOz63x7`Ns%415JmJyNowHtChK?rLweueNZZnp zUzuF4GEtp!ybKudCWJ?@L4uh|9(o)Pva%TIgO zWI@c-5YWxqu?U)`gtX;5s<>@&sW}9Qn0+p0$qCWzX zLi)rQHBxW-TC*&QK>Yw3QabS3_!Fe@-h1T#GZJ@RJi+Pr zHIZ*O&M2mG=V{*vXU3Y5$}OW2_bW&AtrW>#|7Jz1C|J{?KqQ_h#EzukW{aZVCzy(q zM;~mb3#)3ZZg*f?z%($c!c<)Kn5eDMi==m6b$DTx{kC6n0pq%~^uz{W6MaP?qE+3# zHYF8TTlzWWCyt%pPG-V)OHWwjIW>;TQxutwN62HZll`o#2PFAsr6u`hIwbj~=_L84 z@+J9xm@i#yf=uVj+!w_IQHKb!emV)2&LIPih4w`UE@W zSw!yYAIapqWmUs{ske;C3pok;%%+=V`rO+OgibTNI%1@E-l9l9W(lr9a5?IIeOAw@ z>p@krjB@R+!g)~jOj8i;H&7@ttG3X`W^?VM`o*N~(FaslBw#3UNsW#Mr)TNBJVhnK zel2!t%FDRsuCepNqpz8TlD3@_I)Iz>H>Y( zC)9FGOY&Y%qlL*?8zJ-8f^+j`bmF83%h@OJ1g|LY=BAtV-;{Z%n`ON!JeO@M|M>=D-UUe)q4Q(__p@&r|#qSw`{z>XxA`A zol*-JqcIs|0l2!B=ZL)pvwx8Jjqq0rZpby;Cla~fxT~uJb5W@tVv{_(2&(p(xnxcr zfrw(9gt?UM4?Pm1G|W}Rt9bz4jkNZow6LT*C}Ov z{>Bm4+WbSpE|8lT?NBUxl>=XO+AAn82;St%?n*$P98TIR@e)qA(c(Q4*#0PzL5T-) zC6m2`W1MYrTJkvV#i*<~+|0v$b^Vj>2Gr9!E9xVVJGAyyx|gG{;@+_9%laI^+!7UW zayL|#hGZ=19vZ3s^G|+!Cl3Sq&g{$N9m!e_l{qe#&Kuf?nxR@kocIGU@i)BgGqM%9ut0Jw>*QC#zLSS}S+{+7}2h(C)-`r1>( zex0fU3^MM~aF|DH>z(zPiZT6@b}MW7qBtk5-%VLu`FoB#Rh;*)jpx~(^IXeM!pe{$ zcJGVN^#8K{{Abt`+lIuuq`&g|mgW~sRq_5jWpfVo(5w?DXP_s>CHt@myy(6y9yWsSJRSGaYkh0WXX9Z znv@c*HNspQ+soDWPiBAMr6`&H)(ZFdMo|U2q}qgR)_u(;Of`x z0T&wS-JQ=BP^T}C4!#(O4T@kOJ;6a3^;M1KO(8%*J*u-dHz$h`B$;k|#kfvK*4boN zbGv3=dqjXZgVsMrTX@|NEKhO9L&JGmB(35#n`!`4TX}_ro5$_^q}fWoFN5*pi*JXd z2=eJw!dEgc=xd4-j9HsfnbR=74)hyd*vlWd*?d{a9zqg745AVP`c*L6xpB}&Z!>7E zxF6D&*Ap3`(yNNsj4GqWOMdWhcQy)?ngXtnMeetFIo$Vm3X=kRLQ^Y-W zmA7vli^UdK!TFXNk;>f`lS4X=|8caqRh7Biuzar{cd-;(OiW}GMp^)@eJGmXB!}yE z8#_^R$!?w-#}_y^$wlY2*fvfgl&gI0%8=_{%eH6Ag_O^_^}RQIc<9kK`{g&&hZDuGPj~ z-2cudWl`8jlq@7*QOZq}-bEdEQmCQzB6|e6SxqQE@!ZuxJ;K`l{OvsgSy@!6AQmgjD?)Nx7;-)ofa?TSet62s=O!%nlU1o!nQq+``q_Z*HYsaLIRzJ_Z(r;0J80@;tDd67kx4z^&L(>SSN?$K3bNY>s zCX!3|9yasSMb9`f22H)xxH$H=;MT&D@5$)4(0fVAf?=xH>d{`lKPM*2Nr0PmuG{y> zy6)7+ZvkYaJ*D-*yspIaAKZ)0_tWTWVm|jH*gNZ8sowkHbAQN}Tyn{Zo+jC~FW)Rv z!^v7@skZ$oz5M4Uq*HvwmXdzrv_jw8lNba1IaK;t#b+f5q$wiwU~a>=s`L6o`R$%cCGGAb1Hz77$VVfvdgcEMe8(7Zzd|a`mfQ=78fBN z9;Sep*^A}gBjr%4Yy!&XYN6Q@qJ&Um!GtmDD$B<q!s}bihWgtVJbDahwLdxcK2FoJ%!<7pKbS2vkHtel(|Hb2ibv;;Kq9I?6!Mh@ zY%o$736^L(g*?6VE>M%F9ioHZdzVgAnYe$>cg}`oJ`O;75kz_LlPXB0 zN;#eS6Q`_D&Y0DKx zUX~1LO&+AfR4@~Ta&2Q%%V}}r)p-2-fSk8iZj^qPB#Jhhg+HY(-{;rnybzgNQ z)=xhyT;Aw0?X&sRqWvlV_^>~?6hHT{@cVl4lajTsiIZ9$Q%Q>}`e0I2Gi5*f{1fON z=!BNSpNogxO?=e-c$bnkCT>~Nu&I|daiTyIl7BRK@;YnaC`8t8ik!KNW>q#c{>!u` zp|(OIv#6grgJIv+9_qybX@u<#f|Z-l(a||U9NtbaoT+fF79LLggQ!tWB1Lv~t*2PK z4gJTcOqt(8kemhP^bh4HvePPfRgnNJq0>mG>9Ys*TXkOzUdY^un~1@sI@R0taD-&^ z&x_P=N?Yl^B!rZ(6Dt@MeKDGs){wN7Ig?uTU!_foE?W8VFjc zdRHc}9%UvOm?Kn^L50{nv1hEtI76j;{dO|z;H393xk<_l=f@(;PljI{cg#U=TU~>* z?RLWzopw{F7Ou=_7oxmw(|zqpUhq2G-xHrxrXrW`(esMQr*>o5_jxfg?u=}_6t`-w zq|w+bI9JT3f$%k{Q&8=odI=3>!!?jGMOj_Tm~qRn8O9Sv_EUl|bB6N&~+k zI(!p94nwp>m*zaXOmit&SzptJ6+;{4WSno8&}PNC9Im!gC(BT!=Z0o_%%V2cDQ5Uz zVQ)AV({Kyf8ETIEjq(?TebjprWN0s_lI(ez?wJ?xV8m}e>l~wYjt{qWp`uyE;AOLy zFnU}QhKBY*rTQXx2KWvMlYm&(dglY#wlH-F=FeJ0W18imJ~w+LE`-Jd>FLgF3Sv$% zJbx1UCftft1)NhS1r#qIueakkg#9upCT>jNL(k(JOi=ptq?T0JSwy-zX3f9TZ;KCi zexBBK4kc=g8T|c>qa!(3fMMllfAB~Wis8uxj}@G!YJ`+MTe4aid=BOpQ;No`JSgsT z#!m&@o{S2ymWZJ+o~_q-XY;>!y!VUg4KNKj%b4&Vmz3yyl%t2B41F5y4kuMq+YQw( zsnBP$h^TW!nlv!_y|T&bv~dYEC=bLraT3 zc%wCs|G22x#VosqNJTECYHO{Z4l0dvA zMwRv!k#ncJj%|B1YH3YkD=A^~AnXJ=ZRND#)0j_}y-Wrh8y5N{)`FIK=1cF|`(kFH zgpV5nW5eQKt5wej#Xz! zQqzuY-clFb7aZ}#{q++e?ptr6;|agEXGp)-z2daV+}S|+M+EcD577wb&q_Oc`Qh$b zYwDLLf2s?Mn3yC0w$J7ALmk~|9w_c%^o;}2MV)mOa5-A6U}}arW!sSK(O-%@0m;yf zghQ&%&&MBhSx)eEtVp(=ba&eesp~i6ll^k^+p7AR-}EseRVuDD#q=zo0q#qOd9V{R zEj~D3nHPdw@HQG@_nAD4*nyJT6{Wy1k+=)ap4)ch3X-ojpcU|IkONk!~u!n&;Q94F1h)=1fkbM}?t1 zH8MBML|?szBY{oc6~i7x_eVhvqE!{Q+;x9Ye|no+%OF-}jTbkiif@(Qimc`{U2 zyhSIoI6yF|raFZ=UkkpuW)#+c@lCo|DPRt*vbeP#7q zlU-)Dnts|{Tn%*f5|gX2zyNr1`xn3dvWS8p;nsv2lZ%a}Q>2Td$Qs%T4F9-YBcarb zn!?);3^&ur{uaL|coEx+x-pu=tDiohzgMKT%~z);u%6u;ytOwy0$L!WJRrOFzUp>` z;PxaM0buXZKuk6oq;ng7zH&>$^qbAOrw;MCAX(kWhaax{6~*cbRpkNV`fJrv;rtq0 zi6c>p?H3{0@fJ*N-!cUk@Z6XrH+1_CYWn^dSuK30f<0FGgIqsKPO-K5Z0%4DHFrbA z&{IGnSM6lfF*}QraZ9}GE$u{>VN9V;Av@yj?J{uv{T?AxLq!Ss2~P7tdCE&0_wTGT z7%yvN*<`U%3j@&U7*wq4{9ogqAac~+|8%We+Lqdi<34CkeaidPNbH9Oy-k$P^I&eT z)5{sFbKCA2*^{EKw3%YgNOMDHB_)+ z>OXNpW%TOZ>fqhH+B91+vfze=jVyJMs;U&}SWh}qYt@UtGjjbf#a29^^hZ2lLSm-YONGJ; z2{Jt@+YNJF9_eYeld~B$%lr$MVtz9*&N}z5V`p4PwxlA>+{ib*;MHkK&%0{PcQKPm zv^uTUd!BfCy$GGv2t+2YkKkk7?FxPFJPBiQpD-$sMumck4^IAMDO zY@3}gca>64VZY90_Lx{}i&LqZ@V|U1{-OA^wW+2oMBfEM@3|z}wyv0a@!P96{Ad+v>%sC@z*gBv^uzya(+TfUT;{~&BV7IB& zo&K)luJbL;E6?JIuG=t-{X4V$kvM{_UqMB|WHFA9-N`3b0`L}dW?$z-FT&qu8R`D% zoD1hlj8(A%KT!uCToSPSset{_{D)bPzj;>8PVJj)__N`pbalz?p1!(fKQE? z>hcv?cJUFj?Z*!|l~?zB;!}H|E@M58~(sB1TG=UE4sK#59o&*?%|9*qnPb z54j`XefQmWxgV%f1%b#atW`!4(kELje{Jy~*OXp$Z+f(g-RmBiZ>n614H?NwNrA$U z2@@;SWNJ`nM(VpDpggNzcl_qGa>lXQ1jNuXC96Aqe`>XM z^Mp~SU!X~lXNG-YW3j0Vqq_r{xKpv;bc(iy)-qQJaHcW;tjgFK~)ktl0 zs!?(G1HQ{Sv@hLts5uha9y09>??+|z(A&aQcuLz*l$Hjm!+#fHWP$~*LnqHf0WB9# zmvSnyBlt=fcm~`y!@>m+rLjmqf31`81>QvD02lUyY=a-2R9$b=Fcf{yuehkyl1SYq zu_2)rHi^LmZ)hO#(3Hw^ZW>F86KrQJqWkaMe18t4<)xK<@44q3AN$>P8m5*dS&TYm z9AW=Ci|@0;hvbp-*B5Uu`2}9Qx%9r}agfN|yGi0SktmIKE2NLg`(jWrf0L+(?ZQUWylok)z>{@>;pf6S8ffoM|0#)pbZ)rlIe^0NP7NRoJ(l6@N^y@$n2PQct!HiQql(f>)*IRr+qLA?r zoIX!ry5pU@J;o(eyF*x>GD^f&V-in*k;XZ|ida7s+YYK6LZ^%)G;8{=klC`Ef4DZBQb&ux?S*r_ z{&_ri>BojM@QUmwK05Z%UO^A<4D6!j{J3-%_GV^&$`sw0^}3(THYl|lRrO*^SuvTC z-}4lIh$y-VnLOZbHt39VOpP-RZ>e^ArY9#Lv_|91+FGq0(9nIy;+b*Wom=#@NL1%c z&Rvyc!3!82;hgjyf0>cPlXDR*i@?H)F0B7w>5QV+ z%q+vMFpcPGb!^YG%am7#9FBTw$*-z_$IS5X8HLmS&X>lxF2FAcK*;n>C?cQKPEt@0 zm=D6}eLKAxAibCmx&17kC9ikLZi&A^V-z?O9s`6GJ%~N?e_DiLcDu;*SO3}8-SPQ@ z+e}<+FdA!~tiPR+K}*Ci5QXpg6#@6q9`<5akXCllg;fuNtbzw4(x$U*AWcFtffm{S zZkk$zy~sM3fy}(`y(Bjq(;7ll*?}`92m1NoyUI6ry65~dyI%1Ova1z)8M=d31KaA( zXax${PN*6ze|to*C2Cs`;@$c3d#S5}a9KJ>cS6D#B=i8C!4!G~RXfW58;w1AiNZ*D z=Jo_mz6cF<@y_;u-m2HZz?+bA+m@<xo!aGyC!K`M8t9OvKoO0f7P!Y>OC~jCl0Mp4PAu(m-Qrw zn{*QuG(Z3O#;?iq**?)q%b3!BPSRSd^Yj3d%fiRynWf>ZE9b1 z*z+n&f3#Y$zRq&3NICW>)RYVxIx^_A=|&NkXf5=;bvk<#vJff}Xz55zEwID?=re+% zawF#G2pY*owa|mN_iicqi4+_XuecLh!FbHIvd(z!;@TS;V*5G)GzM4orq*Uj=@Kf@ zhLEQa*H&n&=GI6d65^?H)-z(kY*S-p*S z>v;2)?meC;3e`Em> zb?J`D;JZO)7Ow?oB#b3Xz#^*^Q_@%+Gwb0WmmAWLFz5y0(vp5C=*C=-wNj$J1dQ#6 zR2Ueh;a$o<7d!v-{<0vRFM#mT&JT?`Px_Y0NEV?{0^~Qmo{$ zTdiJ*gck%omX`0J=(smnZn+^mfA5ZxVoyvQMM_(u!Nyu9bz!G8cAQW{LTok1R$mT= zqhggq@rJme;q`SHoD3CLQpu}taqVw^?!e|m+e^-Qe-nqO=xB~2_Kuv55$Bt``E0uU zF#ih?dYH^7_)5;t$=MNS2j%1a-JdDIiw26>f~_2Bi(f~_{eJU=#7|&df9@mrg9|a; zQn`WWR)%G;du;@fu@Gd8wRt(26IDrIaCv5f%`#3|<3L8`VLr0~yKs|UYr|8R9m?g< zCzrh(cca<1Mu#(|mIzNWTF$N9c(1>v26BQ_Dbs|eu>ITw-A-{^>?`E6lE_cBp)1j40xiSVI`KY)d@YuSMSo<}XgN=L~5eCP1`e~|9v_c%p2xRH_D zZe*&0?6aQb*DI^*eXFp#GdY#k9C0%*sNywL!{L1DEX)@xZ_|20)it{G{_L34k-hB+ zonrZ+tzajYsQy5A$n{@+72!pVYwxJG?i3g{g)_Mjr1u%;zCzp84lG>-)Y3d?t&2Vr z%0Rk6>wHT2H1N~Fe*pZQlrVTc!SqJKNkVu7fz#~yuLvnRdFu|ne*vvkQE!_t5Ps)Z z+$2<>O4nxTq$z0{b(^Z~p;EPJPrxF_aS}^lBil%cBL4eqAQTL#x@mq$j`MfE`|du> z-6Gp%j>Aw&WQH(-<+nUt<=fAEkMW1er&~NBlaII2&qKQ5f9w!_;c3PhVJdp0Y)wS; zT@is47c<8}E2#v+3UGp?gr_`FG)u@c7UYp88h641*(<`<5~8l(IXa+MCb%M4ku|s} zQh4`+Y{@>8Fo!Un*$Bp;&S3IYLNRP|h85)umP^c;E-=T+Z>k2D*47A+5a>{+d`3$9 znQXjunv*{$e^XTDnziAAAiM*=8xBZLn+&WTm7H!>rl}pOJQuA zBi(=>WqNB__Sdgaqb7}wH%kze3kJ~!C6dfK+r>Zwe@u#j8QLe?4AM8%|F0a{JoHQ~ z8eIbYr!yUR0rii5WyF<;TJyDsYZLUYfBWx`lTon_~?1>x*v|cF7BQj+w)bh2-(UWgh3QC%!GYK*d6BfNMMdc z$orb+Q545854k`t#l-_4K}2yNLt=PBo4(Jnj|A3!Y9OyDaVhb@3t22+KABn0#jSHQ zf4LdLDZK4(ftX_jIoblTZl?+cu zVo!DmkvHqh%=|2&?{g?8_tGS2ktdgH%dzyjM!HCtCrHS^aZ-MsctW==j_xs!RaHu= zP8Qw)Hw-DXI93om;j*YQ0egXHjN2)9e^w%OwZxLd##uojagEGUP?&SnInTj3f?iQ7 zb&&<=F{X=NuU^j6(=4@iW#`K7>XBrR1rk-ox;>BR6_Jg{79q4y2kHxM8;?ZvzNmDRRuW$lE+ritq>@OiIHZ~lAr(7~jJW>{Q)Z@K@Q&To8|_oVd;TTF{6Szr`W^M$|HSwBulbUeoHmIa4^gU4e{DTu+CkMgZeQx$rlc#z87V+l@iL@gjy&KiLrE#9 zK_`|xd;o?YD zVGstXDTw+ZCt?`@l0ghmzRR1#O5)k~FuT9{X3tWY)+)kZ38jN2Vm|)9e{sf=JyPVQ zHzy@k!K17R$|5ygEn2ZYRW&n9D~&iuD>auDC`W`&x~Mn8Wm)CehbsbAF2>Ge$}Q3# zPToy=w%*=RQ9D6-TPSp=w$Ua*x%9LJOcnCvWNp8-w$^?Dm6Ba+!Y~wu@AE4%=0ytg zW;z&lI+#PYi@|WhE{v2Ie@|_oO-eq7W%%FMRNLAqgXN+mC+EEHlXLp;m?t?xl4W3W z#sNn!E?c|pliG29JGdY60SxYj^rOgPB?~%LS*|2VOJ_oEK+{(Xnpveogq-<*xeu^P zfIc$|?J-0=WyWA1oin+GnMg~k+783cg4`HPyK(f5aJh0VzRE(}f8&jy!DGB!g@>1xaLC(N-|HovgLPUiiX1*gnobkniq*wOFwP;jwU4o4t#~622-xk74wneeh zz<7emg?2Ji_Y;02RP^;_e`3K{(zu=h{{h_vZ+CTiIV`9Lv`0T}k|>X%6z$kRrCJe^V?#+xG;Hk9aHmYy^F+d}g*VhL zo^e{^P$qe?YyjLkq@@LRse8X3@R$`*+fu*yg{sR*J-D6-CE z!uf25A~RNQf3W18{TlN0x&=w@5?o4rTS{y?nnvUIc{F+X3JTlfT!+(ev9!%z4RD5a ztESSf*|X>-C$eAXLKucM(>^rsp;HM#1=HN*8FxDMRnG>ezI}1ueCH9k%+P$N@lz(r zAU?(a?LfmF;VqFeo$z~bpq&xf7f}G0mxEK_;j$#yU!jR}HjDNz$PVzx&eGhpLn9Ui2aNzx)4k_xO~o5<&!x zQ74ok1TSekPnXYf%~-wh&}0p4+&BH{CJv?8_+1$%QlK#YfQtnxe`ruqBUOtK7E!HX zz$2V(e-gBBo7$%V*9OHxgMWHXz6sb!(s{%gFe$Ww@$2Y47z{`KDYW6Pbw$t{PWs*1 zcrwgo^_@)dFKQ4fv0UIuWta+PxD*fsc@vc~;~eOr!gpV{z=bL5-Mqd4%%WmeT-Q2T z$~u-TavQ4bR6MWT{?ODdbld!S^Wjg>q)KE{W_sgM)Ll`r#Lr)8DPx!z=K>|PQ|2O+ z8AyS}Qk4-n?vaUy;Ao6O&%2yhyL~lRE#K6IYV~MW>u{Yd*m2zwO%^J@68IsFbZIPG zK>L3NvfJ$$LUH5xcj9%wrxQGupzgEYa`o{~ z{#`_=^hRcFUb9@bNa7G#c!1Gt21KG*Lgpo4wN6a(}mJ+Gh#H`fe%Gq>w%B(_3F1M5k>U>CDwx z*3;u>kxFK%tn3B}rF%nDCkZ}oaC^u#sVe*;@RMZe2S4=GRLixX_|(gQIK)!3*`?I; zhNS%MsWDX-oaN`a|A5T3FM|~myYf0vHLj}adH_@?cj6%j;W-90Ok9ZQIy_bu)qkyq zoO!y>yk-%OD~~Ul*3)-d*`#zx9?!y zbmz7={13EKqx-;BTCHX|K_+z~!GVH}Y%Z2ShLQo(K$F%Z4)S4`VQ_J0DcL{lWB#90BQf)fYIsSc6j%qEty_R5~6iP-!* zyH1-dQ7*t-Y}s$-y*D$XyjoUCVpWNuQW|0Uxh`k*;)7djeLZ-0qX#&6dn3PX%EH-= z{OHQcS+peYjGd#856UZYewZYBr9yyPMR<4yToc-P0Qv8wd)MSw0&P_FY=31m6t&f4 zoQ3IBI~&N?ns|E{yMUB1P!`dOaUUGKvL(1@y3(=g3=3z9Rh`dn+ zp>Kk*8k-pw&SO(sGOH|)*sE80)?LyI!(Q)r+9TG(kYzo(E@HxZ z7j@Yh{j}Ctb@I6kRjZi_&VO#5m5iY7IuJ8n756Ej_vB1Hp_;4uI>It zesiQDjj3X%qMOgXDUm-*ez>0W>O?##zd&j;V&>(z?LiCX>^ti-g6;|cmwP9W;{W-N zZcPB|sC69S(RZ}m(|gi*>MGnVoj8EsOd!vJ3BiVctO1MjWgvv;C4V*zusHssk7HMT zDmG@P)I^fFH>XH;d-XRgqmwKtEls!_2c)l0SbiusJOR6pqvcN{eu8Y1ZSotXR85cC zFc7`xR}8yUNoaS)0+rgb-l(5yFYTed;WRR42o{MQ*-l|q`0vfvW~o3Go6g0K=lRWh zBTsIFY?V2VWGR}Aaesv9bDqxg_?_BvJ{rH8@G*{GPU!dhbgAS$eXr6?NtBj;5^{mM zI$)YvrKgU=6J`v2Ef`QgCIGh<<-!2%PJXa;emhV^md_KxVVO&Ag_00OTuEbf&aD>| ztB^7DEgI`r@cL32VhNtilLQDMH3D`!=+R7L9Hq?imFHgmq<_>5JVJIovYXxBg(UEU z>S#8+dQItd_}s5Q*J&JzCfUCf?u(kTSSl(szJE}=47<{50}?ktzsO%K5sSAv&eOv7 z$1TUKG~-c|6$b3mb3Z6aT?={H4`Z2Jz{N9j0n7jcSv4BUde;wyAqc=N?YX``ZR_sa zUEeYtqXp6moPUkN>0iz1QDLHj8@1qGga1z#4dg*_X`xo!ke^aoN)g7O^;)Il@JNT* zh$06?Evv0c)CToG@nvvk5Ztx<<|uR6p#g!L;cz%T37TtU>*G|zEY6`GO*&Ag=ZWs7 zJ3Ui347$pX&z9fKLHslaPc^bXIZ!KMuI`F=`lBk*PJhhw1ms(W)j#alI)zSWDFn3Lt{X0ZaiFk z78V!Q#^`g@Zm1)fY(TIL_%C8jR(yFU!z?zB=W$C}nh)vt%De-i0|y;api((FQ-ccw zKMpkNlHA%T)Hd+nb~RJl8RoXVOSR#eM&Pu-?dd2{%&Y?4G`x+gHgNE|US^Addm*@= z;(zu*+!GkRO578a*u50{Ps;xH50e+*&Vs$Qx4r?bR^M-%Fc5y{uW&n5LrBS%bkfum zA+^)Chdr$idx(>Y5R+OW27!^1b-2IM^Divjwq%KeIs;*lc}cpp_iuMdl)UX ztp@lLXUmZIAY~rouOOp7BM}8G`i0l{%}7~7=o;v29x(*VC<=it_I&medn<1G8ZqDi z#F7lx?Y~L5^1WpB%o$%RmjZBwL$V z<1c6qI+Thu9Wds(b|v3kr?T$l?L3i)xHT^cjzd0;MD!3qgv3iW?x~#ec7N+BW8u)B zvL9?%UmK0J*;wxyYpbzdG}d~x?!Ru=2yKN|e%-ii0P{H{YdAO;tD0l3C>xKvFI%a8 z-Q0bHOAlxdpm~(sy^!2JNxtXqq269dy_Lwuv8!8pA8SQ1go~knvg0bbxzYk+%#|4b zAU>DUn}hd!>9@BRNgw_P>3>5heb@YER3r%XpQpU8rxH}YQ;0tug_2%9AN0DiV>Bv2 z{b!+!Z|(RIWrQ|;kMbyWY>n&2r?w}Z$}_<%OQ`xIWXri^mrQaj*^0*=Cf9Q9FFnk` z3c@f90ML8BV&7mV2o3~A(Az+dfzidx4QvwH4m-qu7caZM!)p#U8h?QJz{xyu)m`S$ z&(EV4qK(_tg&YfX{Z#dZ+($L^g~mFXRso`NU`Ak zEe6jT$$*;&)~m(L%JoYsIO7r(G5`0IH-GTHd(U?>Hf0|sZ-10Lew}${|Ek_E#NUvB zo#i__ou{R$)a0*o=vQKwdUmNui6G$CZr&8V8E!P<(LS5X{^~OiH z@m5I-QkM0cRBpn;wBx!R7s|LtitTeh0k#tw4AsCKB?pKgVq|t|Ad@j0DyF~?B6WE_ zYC5{OSpXT&S$~MpOd#0KXxE$B@M@O7#n_JHZ2Q_A%-OtAhh^_aQUK`!_mVlr66ygE ziZE@o4-*xnvFmo{YC1iT?{TrmD24x5+K%VRGKUh~(^5-8JYjYp?6j)N#Y6K$=(~42 zMQ=u59dFabozJlf0x=K-(0;!n-(XG<6a+=kPP7e3T=z6^yIC#?l&7@sSX2bqyQ;z=cZqg*i^b|bjWp`(0zwg_b z*|+cWT^MA4BgRhBD4vg}qXfyS^^ zAuzX6(L4y8c?Lke&I6HhW1v2M;xfg!1qUoFQfz=dUm&}4WMzh}BX|tJTdw7vTZCcW zD5<<|lS%=JBT)%huZ1FGwG%e{cMoE7UTJox z)qep95C2t+FSO^Wj6dkD%X~%~2*;};M`1Ar4oTGosD)j@##v8~u$6nH#tjEs8K)QqBQvP!CS#bufDxlrAuTLbj58RSaAcy= z`CaKBlC}^_?PV%`EQ5n9_*K3w+T|JctA8X6qh72;EkXYnc<{q^5v*x%8dl$z`ETue z(e2+iXLDz7q~RO?qRSrE)tGe3QN8$lZ^mfRGe#p*m881&*R*~u&dHarEs>holP$}+ z_LDK2bw~d!ypuk(JLv(NSy=SG(do(0I=cEYpUOH^Uv?9QVgrQ{9;Nplch1K{9OGOhFhKiE*o#P?*}4-ZiX zid9vs|5v~1#F@sfet;*u;0>LTPk&1TF%ZS?`4mH`bQi1#TR~c_pa>qt_P9{ebapqe zI|=!tEz<99+-8?rMX|XIc}eE|=H=#2mzpu+HCoLD!t%-2D_`8JjS!ck>#-Q&=xUtJ zw{@;)n?0ynD?)PFvrz)A%^o)bwUdgbjCp%PgIK35m&7X&6}J|mIG07xaDUyI0B#)8 z+Cp|ZX!hdC$r?L>y)y_)8~Mr|LSMH;jp|pG6p(uo4Zw0K6j^7yaLNB6V(mQA#$)gQ zx%#e@b~uZtaC-#P0C5vKP9|SKY=9@1Cxb$`24!5^*1e`YDVHmflrG|1bHbmJ>}w{RIzr!V9HVZExE)5dQ98!2v-f z4Q}c#9WXe{vcz*yV@ng%4F=3I1e!WULS>R5sVLr>|Gpz-*ODyTKq|nnse8YB?xBCZ zl&S3XI9-C4lmUr86o1P_@o+7k82jn$mv`(8&VGIuPFKrB@KrbxODQ;T6W%GoK zlc3Lgy+XglxcWZtv7Bm6?s@j){1JFEz++9qm*o>)EwoXT8F%Xa*CY5yl|51e&Fhx;zavN-LIC?JUj}NEP;UIII^|Wgb*Y z&wKiya{%eL>oBPjCE-w#@S4UqU{Vo}Xr7Os7)WdBdn3xZFhqmOXrBEG#3QHZZ}ivI zbQ(oRqL%av6o20nw%{)d9K*UfdnU(np}{}s`C)M|GnCUySTDKfxKiFR! z#;fve{^(3|Pvf`8a_2Zd0;l)brTswK1U%>kXB=Pg_-~aN@GGiXP||>XHHzYICY^-z{+ie*}N{;TFL6>*@)~8BTK2-U|#bS;>!q> z5-Lh5kAHJe{><59FRK@0EA;9%7CPvNeEo`91`al^NOEz3^;R1YX~@B{qQb=}@q^qx z=x^IZF24tBpC>ot+xySa-KX(rGM(IhBtMe31NWQ`u+@Vd^o0tkNGNF4+FJ7_i|FY} z8(3OOyawPCZqT@po#?I&)AhYImnNudICGQi0)PJTgcFofmJ&M(s_|mOxI0{D-Qz%4 z(qYj-5Jy85OMPe1Z)DvkA@Vf@b5!=cX8N({DmkWxqVn%yVk2#Q;_#E9*JehsMAlV45#GzAD!I*v)`SX7hxgLw~+d5CbW%+JW4`+ft=m$=$wv)!Kc$l>(*eT`EzHNZbeUzs~d;+S!n?Iz9@03G zO*CdK+Bn|O$5SW6s>>i0?>`l!lz&&udSQhVWSfsQa=;oq)&%)kE`9@uLikDXc>{<- z7PO@ zx`9psZa))6MQ$FGCaO=xeFLdlVDGPxi}Bmg3#Zm~Eed8%l$>Iql5KT5=zrj#9-2Uv z6v1AgBvXc9k#YqbT!*4*I;5?EwAb!Z`9bBxw)TYMh>063C%b#Cqwj}%!fGxZtNsX^ z8Dhr>2xNX|*8{+uu$WLgRdI-{L#QDN%bHn@MwvlN3n>jEAbS$$+3ZMMW%;s%Ev3rM#BoqxlMESLjGO6Y#i-r^@!r>+WA}?>l(bz|!^?ZzT~)->nRpRXsa$TtYk#g(ilV#1tI{Y- z9`y8t-aQ)`q~Atqz9rTES9ifmXmza1PwvLAOjB;!*&dACnY=W7ZywlGJ65&%p-|=5 z`^(mXvyzW7SJk84-W*Ue@kPlzBO*d#yEv}oD%TnIzY-ZRzl)(?dUIwfwSPKkd|W{y0@(^v)J*-T z`uw&>&h5q5o*Km6n|`l*F}S$CLcgF7Exis~1u`uVQU1z3HF6cuWVMr|1>?Um&%oW) zP`hEV9&lms)_();YGWhed@QjZZ_^OKg8=%5vNxM5({oMq{zG#~i|4oOP^&2RpxlH4 z=);zIASnSu2dOm?G-)_*=x~~bOZk)Z5>@>}M^z_=F_IHi2&t#uzUwzGh9H&AI(g2e zCaKb)LEBt8G*k@>CU?VH8xq!9cc$;9U?!R^YZN%Ws(&~YYP+s^P?IW4p7GId##fE~ z8v4PDaMNer{=Q+JsnU^ky#n-drdaEVuwI;jfie5?%nM3bx0+&2Y}=V>uVLAW3WjT* z7`T<|3ya#K_Ai}RZEG7j5dOZuLMgs_4bD+6EgbPVxh4b}4vs>&FYN{+%d_^{f_S;zSeRMCjnc%>6^jQi9N=2WO4Ad+LjC#f8hZhE!P6Ur0`FENotB-PRwkS~^ z%mTVpT2iJ7OQ}-iWAW43CCN5R!Cp`#dY$X}|9?lWLB^PX;734kWoDTsjEpj8Wlp|6 z&+>hle5V@7DB+pWcP5TO;_-OwJ8tbQQ^CH$3dJKW4YW=%IQ<}{kh8i2vEj_7fh-nG zaE#nA9p>66PA+%Xt|TU5l&FOSC5&Wn5FlcAk!NC?fl<@Vz(lJ$Ks{9I1xf$lxCS4Ul^}n4rmI?)7J6ExgK-q?b zg`pf~s&c^FaYS*hB|mK2t@+!omck_|G%$_GmtJkCdfF=u+k2X(cL3bgpEMatg%fg3 zmO`X0pQ{S7SGn zYO%~3hRz_E9B?OpdE-bw>^Ri0+H}jg)*zu4;guY7dBcp9NcgDVXTT4a2dJjWW=?Aq z<;!dt@Gx6;#j&rb91^!nZ=~1}4!c(j!Ql}cMhd4C*Ks(0^P74@_6ejbEJR9B-T*A!!{Eb|Fp-f(!q67)z775JG=;p<%ICDcZe+uhlX7AZV88@iYS zbDRTzSB;W_eSY8=813-S(x&Z{GwGxv?VY1)rB?~}vBbHJHnNPUfja`t*?%!tKJ~!o z1H^}Mq>O!Wdfb?n20gl7<9{u8N6_gewEL@~WS<=bfP}MIp9`ZE)zsw>aaxs(i0H@H z*Y}_P`}d#4)8m(ip4O{Vq*Zh*Si6>J2!$1&*@B1s};2{MsHh)#bSVXJRB4{y) zAc3-(PSVBA%(A-?gZSS~BZ3Ddb9;y9{W!mHJEs)uhJw>buvxZE+16L`jyO$EXP8oY zJS+09sf4>?A&nCzj>XywQV7M`I0~6kh9miEA2EDZKT>@t=+CvKH3%piA}p3q_jj9o z^>PDqI6CQTvfohEGJi%R3^m1T3h0fC;zKflGtl1a?qB-WSQ_O#>Fp(NpS_8clp+=m zN-OwkxITn$jaCBn+lortKqGnD(}N=(YWMcPshxhK$G$mlof98N=wU!I$<(L%0bs@zv{UmE81qz!^ zwWMgw;b7p*^RK0+3yR7zDbjOUGTLnq|25nXCoHRRBOv9OF)*#v${BEBQRD{FXQx@s zgI@#iL%A7e6n_dQXvhSFP$`Vnj@sByOq4J*R5N80SnugPhY1MBc>8v-td);~YcUpOkn&fQ>VXy+?V283;|90iY0tVg;J9fQ#($7D7?2uuiSbo9yH1|UaH30B z`;NSvCbAthQ83?yg1_XMI4 zsMk*#ZW85eAcSp-X@VtdKJ@)Hmdsex#8l4aaxTc4RB_}4XW}MG+IqGicXb``4u`$7 zHrI+Z+kdc7nfAqv$D70r5tD|eNkh%#p2KTmu4=g36oIjs-PA&%Wqna0=bl7$CUV~c zcA}uI?XOiaWI{RHZI25svz|`+qOg^g^B1!GslUk+K>2!Y5l5F5!p&T1oxcQq#+W_s5^vG%(hoFJ# z9xK0^W%On{U{}|F{vK?_%@sv1Sc zxqm>k#L4W0wwn6icP0rWA(UYxf^+A0@9y52ucKs@7=~aGsDyDK?rjz=vgLLB!uhB3 zFBkkA&Ocw!*=yv-;+5XSQ4$LfDRpGbL8&Xl;2~3rIICp*0z6CEB7~oT@IV@W4T39? z!J4H&I?%9R<>qV=2Auer;As#G;<`K*Du0z3Pp$68BZtweldb~Q|JDQ|Ln7dr&{N6N zCS$9cb9!rK=A)0bh~toS0>Q(~16wW?2B*jtnp^{)SRJgcwl5(Cv9?U-)^V>VzwGIw z+3i+*OaBivQ0^|f&G|jYO(A$3MND`IZc=KJ;Si(zm`ukv5BJkYcQ$tHsf|C$h<}*R zE0AE4OJbIX`fKxQ53bDIy)=gkIFg+Q4+=;Sh(%wwtuc}W2JezqI9P!jX?w9GAY?>ZkXB5q(`1iz6|<4 zej$>{!}8HrAlD%E4pZ_LOLN{UEK~Acz5{K09*blb{wEz8omGMshPU_Y{ zj$?c37HPI~J(X&mL7hdNPaCr4SJ1%`$EsULXP#0#H$a@t+<(LkCUT&o2YE+x)36e#W9 zUHZadA>HL^3tXVP&z^+lF@K2yzBqQ)cA%Wy{`WgGl5E+MobbBmJeLnG*wSb;8qJ$V z<2Rd=^U0GZkw50?#2;|h|7AKpou2&^e;o{7tpD(Gu+G~|+npQGR_{dOlP zzXj1SzDgyaLFlI`lPy>K}Htc7DfZ3HOKBH4Wjv!{g2lHcc}> z$@s9Q@p0$y)9&7uY!6cz2a)gWva`Df%~tL2#4OhAF9iW!SY96Qe(FHi{=s2qd-rH} zpGJ6YYq<-^_V@Pp`agZ#-~O<>_p@U-YWJbjIp_o21H#G)?tkdRE;WNTFKgR~3H%`2 zB*7(6i7gKNFg*1K7nR57e!4B+K&Rfw4^v+48IQ+)Gz^2tcyl$ZJmJx0#3`2fweZ#*7*&rTP!Hnc=k1{`-rZDI3Nu|X^Y@OX` z6enX}h>KE#n14{*2~z(Q#Gi|7X*M*Gf`_oP>;sxa5(uU|9Bpjqd&?m4AfY|(hk|e{S>4q#p4m9$+6RE5N1J?Vz(FH zQxmWp;tSvzxu@8`kD@qZ{3{3L<2HJS@%t7na_x z)7#?&^xn!TNcW3L97Gw*5?>7WlHM!bHT(fJ%3=ny<0FtR zLpFg9Fcy+<%*SzZ&EnJl<%6t2Fa!zThcPTsbbrRg*j(v!0EwU@5Ct%F5@hFNj!PL& zQ0qYh0Ys4ZLjddJ&`hT0P5MQz102<~NxAEW@~^qTphpNy%2TnRY= z#DBs|_#abXd4!!$j3)C^5Put)oyjdzG#R#m>Ep=+M)2YUwFyvn%7@>HzTZoB6i-<& zQmyH&pym-gkvxnGlX0+95?F%pni~C};~G+bmeSPdwV>!vAd}A$tz1`9h^LkPwdCh-z_ICQmzo0$QKiYcVX|~v3f3aq-*Q9>E zon5eUkM|FM?;mvzwhp)8SA*OoBzk8&gWo*sta6+d5GUXZ2Pm*ZI?<&^Eq`jL1I>1k zojk!+ErTx5Kw5>KVllIkVPn+J-snCttfOxhOCsMxD7uc&F4!)X*2_1~!|x_#EMX_u zAObzFd(x)C+5}$#ZZjLzB!Jn>nec3yL>0sKn?tgsA?FjXimkSjK|X!r*?BxfM@8F~ z+roANMH_%Q1j4q-o&&t?kAGW7NBw@Qe$*@ff=}-<>@>RFz+h4eIck%3lCz{K-ED%k z4jQ@-_>cgOL*6`Lo12p99D7JNieat7IOU~H$vE_NY(G%V-m0&4k(oQI_ASsoX|WBErI~$T@-Dp`hT!a$$$y=q^_3rF^{9=f zX?A#H^w4XwtnjLkfRaQ2wTkD%s5E;dQ1F{o(CS30BaR^U4M^kW`XB`=Mf> z3h3pY3Mg$qq-Yf~BH~c5on5?LVDgAig^=Y|G}y?W zhNS*0WA%cxPi*8ZRy2=cE14!rxknG1ANtTt=Hl>G@;q5USQ zM;-p_5_m+9tcC@b%~Zk1f>RScC(VlJH3go`3oQ{&OCOLk`QRw=^VU z*bnTxcB0Fit0;aGWVTboTD9pHP4b zoo`@(=9ThzTx;_u(4n$2@Fy6{ZaUhU{_Xr)=>8J;p_2&(kg? zn?%SMqd{quF0KK90y@4W;$AwLz2XakAQ%RTSNI)|r73#p1nhtEY$TjPu&^$JA%^k5 zN^d+(8*CVJ;rEe~`n=g@I*v7(q%g|=(aU|w>h91OxNW!cke^e1&~`!Y{IN7EE7Fyy z3JMK;)B*R(&>u|^f2Pfg(V5T()8d@@G>Al_UK!g1W^uVa5=->^hlhPqFDdDw|%_3 zznA-*bF)b~9FyCS7OB2qW$<(Vk{<$ z44-?Jcj|x5OffSDje1iNcv@RsH3J^_qX{(gM7Y~bW%diGgu)uNHN=A!XbkN%&tE^C zd{B?yNYa_p=Lg5Fbbjs@XrDnAhZd=ZjC2~u;p0lRTgt0CS@j<;r)Y&5E=72&5Q9*$ z<>-&}BsG!ETa)qCL#x1u2(*WOj8;ZJ|zOUZH3oyx8!oIEN#cC_hGWa)J& zIH0YqNohUu#qyLfERvlR03e)rfloK&@14WLwn71BAb^?rTJy@K9c{Oh3(06T3p7@! z_EaKAGqVXT3obQkmjpM>!8W`Ua>Su^%3BB%wU#x2Dm%c0RI6$1aur;QgJ5Vx*2@A~ zXZ?T8It?Tomkly9Yh$^za7cGbjzQIA7v95Is1;8(YqM(ja^CRqP$W?aX;yb6@;CSt zBEbu#k=(IDxMd;$pxg~5vE;e$Bu>)+X5^5zWy4!etw>>eobzm{I|hD4D4%k*3`03Z zc!5YUb({!ugZ*Cbg_}un$)a4&Qi1RN;)G6^?Fe#goL?dL)056>Mu1NaUm3JNxShNOKf`bXVO*C!wnGfvcUy zXj<#4`=EZT=W!NLx8A3v!K_a`qQ7R?qeo!}GShBW3}8RNA-0^cl+ehvlt#{Z{dxkV zhgeSyi+fyDTRy$9vbck8y|Q$#;~lNSEmn4+kYl*F%Uec&R6}(eqc!J?f!2RH{c{TS zd;)ViQKijWQ6#W3V5klJj8}z_?xOWz9r;CFiQzG`HLo@=A`2LF$9UHxF)WLmu<5c4sut zv-a})W~B_O0%zAIDuOcB#T9?Dwz!Ve&Bvic(B|jpB8smfc@wGLH9VTqm7CEtbh(AA zdd_$W{W{3!e)<#VkveK{Z{Tvs|2V&a;@ZgNHLE{`nX!^Mm<(Fo8+xT^gpr1XI(2zX zCur^I&|?KLjsX?AivX*}PGQ;bF4`oZ;13=hEH8@)%(A*3_naXmWN?2_4;sPhBmuwV zLq}|5_Uh%6pNG4|t)oX}E_u;u7H=VH_sv`LVKtatJK(DzeDRr*e;TCcLYk_i9EyI_$+cr#$!s4?>+7*Pm-@Yxz)g zKhCZ_OfzFxt;9y@`a~k4x|xRkVBXj9?`(`g0(m@~ii9+9zF;=;nhcwSeuj2%O%4H- zX2GDXFe|}I&909Wtj9YM&!;0DoRraB7(_0Mg^%bDS5SY>`!mnLMX?#2*v=cG|88snRrg>@dR0lmwZ5N?*PFES)7;v9Tfmvj-0xkbB<;tGUR!lNL}c;bm`^EnW2 z5yYFB`zU`AS4-q?RQ{{5iS|GBf*Io$eqnoNR!-?ur0oE4^ueC}-{s2q#51aorK%0yM-JvtR36yR3m7UtOgzxkGTrV4 z$VGqCZc}9?^y$_oUMiPWTO>k#tV%Y~o|me*6u`9$0unl1xaQa5%C*g^kk@x3Wl})n zwt-|_z_F;=SRsNL#d{EbFRoRqnuY=+aj6>XM1p4oo&@~qwHnXaQQ)0JzQ zzpikL=t-l^uw0r+oOuF}svZvxKzG+^HEMrlPPO_|)kCvij#AYp%dKCVnu84caw|jV zmtW(J3UX^o7tNbgU0{tBH4K1A-EI?%TdI$s+_@$d4>*B$)>l`xuP`J<jd-P<$=NIuxz$?ne zYL19tX`WtG0jpDkau$ zR;;OpM0W7c+K!z$p4U}RH(dwkTF#Kj zB5FA@epa8Wyi@xvSPf9+cp|@%zF34JS084e_Wf_4~y2(sXk zW8M@$;|bPs5JZdsAD+yL;#f|@og1N|))fDfNHY#Jau365wv|gD6cB$UFpas)8WLue z$s)cXN1a&!VUFSlcdd6|vu5sG;lR;rzUl_mye`LjOBGdD2X{stU{zUj-qLTvKoMY^ zwuvF3%&d5uu~Lx6kXZKWZbbrRc|zrcYX#PNX|X1=wp7|@m9qStjhzYHb|T<6JZdZ! zBPZHq&G~I9lNVgmG;V+E&(Xc8YxI^auhlcL2CCx3+0VipseGo;tCr!l?*zRTZ+XyJ zNSO<0eee9JP%RBz&_teJQNR-ox{Z|;{Fuec*#9cNjIx21GuKvMyky_ee;8_e)-*M~ z$e6n)U|I=z8{&FZEBEAPeAY;7JJ+?kIZ^?O4h}}j6K}P|W~F~Q$$ZGwy(4g2xeJ5^ zUG;l3RLsSGce)DR+`=+o|X4(<(RD;?C!9qL-yj`5`L5i$=zzJf==z?<4v}FZ1t|>mewX`&$&$Z zw^TLNXNx+iL=J!b+{=5Kw(u0BoG~hiVw`iBt5~y=<;K>SPvz8fF4YuY6lHJo&kxS0gCJi>oPIfNodilY2XPcF$lvhNJ7 zB}bg0l$2a= z8U=rVdTTb#DqxG3ezJ{Uw5n)qd~U@dD8_ZY2b(o_`g91wGBW9{-UN&@t-gB zk}h=Erkf8Zuq^Ew*eqTTe!c@9L@0}Ei)+1JqoAB^Hn_mJK)A1;vuDq8maH@b=I!D; zTPA-*4Zk3!3zD7*j=!K6HE7fBZyCa%iT|zqy0O2ls3bA z0BDAnYY*}&iLDy$A(j@uv$SfaR!P1}rwl9LJ$)-x!SdbO_N zydTt&@EXmAArVB<7XZUwG=!dGYuDfvwWWGFHC8eGT7{L5?movO0Y3J#!8wTUZm)m0 z;xYCPM18YcDN7be-p0yTpb>Tp|q!}xUu90gk(qE{_P%2Xv zQlqT$auq04BB{ue$|B`r)4AQv&l^>~rzpOk;=a+L>}IFM+3PL#dVg+s-M+v4udU^O zo;-V|eqCMu5v;sculJ2~tZwGv8iFWeCo?jP4;|ImcBETnf3TBIs4AacCdh2?Pyr+7 zfmb1@)JLl6vqk}zLBIzUe+|;l1^%tdx0U9JGpU$tS$3I}saO}rAayx##iz&|DRBAc zP;3?kNUOtNJBKsBm=vUa!LS}SzzPG!Hrx||io2-#3Lqp|q%;oC zqR2(3{2*6?JTXxeZF4Dug~;|8XZ{Y9jgu6(zat}y8U(A-X^{=Iidcob6G-rHH6jXB0*TX~rp?hSvl@N&rsh(V_ zt+M;(G3jeSyNv1zt2xUqn7Hv(&=El-p=WndMw6Rq$%zR~CS{Az-5n}aKyB}L#F!yK zWrFvqDHL66f3&*4I<;3-{@+IGCIWx8vH5`=G<|3-X^s6YZFHO;VBBi2DIoSdtc#`< zJ^ftHA2sWrM!=OBOvHO{_`R_Hpv{Q@qEZG`kiu&`ef*ka4d1&3%?a`HP%deFJ zd8%4hs-$1JdJI2G#Yl+PA`{6e;hXC+LN~nj^5s`U2C|UUfWid zHBlW0sL!1BtlEFN$*OzsX#E4NR9kP;Fcf~zukglL9cl1DhlE-Rf>LRFK%i}iho*{L z_aw38*p}_Ai&+0V&aF+-3!21viE^%={e3sL5#29od zRA%q329hF{Dh{cuHz>HZpox|GOB`#6i3RVEhny+R9^D_hkYbi9o1+O58Rz3}kQH5B zXujwLqypjmfz=t*p=`++MNuYbfeY1rF(sUne!pxgbyQC(+YQH%+ zWUZM6T*2%&WD&x}AT*gw>XZ1baA6v3rp0*c+jNR+M9fUNG_b;czuYETu91K>3jQOb zI56&-g^lpw{Ixkp%ph6v7miQzE(K6|+N@huFmnp-`^PzfC$BfC~nM7V)dU3MJw8dVIUvsS})pI7tXuFQDI z75rwLPZJ_ySR5P@gKb{RzX0!KU)VZfPT#nl^ZeZ5p|6}mUT3Eg3d1=AzCwdRi{{3t zbfOV$5M2?Jm}#c9qqP7`v?h6I5*At9PnkR3!?i7A!l_MAkkM|99Ku<_jI>O*BYUtA zIDU_xu&MG-oo4UK(B)-^7WZ2|_cQn0ackLh7t7uwE^n$zskce9xk|5p6x62H*~a?| zw|}1pbpn62Q{79$Fc5#wUvY|J2h#_qAkHZ&1B)-R&9_3y;&qFpNy#PCA^YD=*H)(t zzrB}0e;>KuHFt7WObf;|&yfl)5Yj83kNxDrJPNVjIXVy>>>M5>!+D+=Jx?x8UKowq zB{$XxBHD&z|0u9<(&!}CGp^*_xt;htFkT6OE)$9qL9MuTmxZ1O9|5eFrJe^T z0$#6|&YlMs0q&RPo(Co;=>%Qu&~j&*D96X~s6R-D*YQo-9}HSQ=(lnF^_Hm?$?l2l@E;(Yd-!Gi=z@FDrp^ta`&RU{Gw z27{TwyfA*XJHMK*tvS|=`g3bU$?&Je>|$~G#=Rbme_nj|x9>;a(eM89y?J&so4C%6 zx#!O2u0x%`d~eOBFW1%<{*v#Q-RlvZ2e#{&`-|B;{PprqU7c8-Pw&)M&$`6_FX{N7 z)^tH%u8pRa?~?;(YCCl8^BRF`zPOm$BQkOwKOm>wAG`k={(OGi>+TQFdZ!0RKaw3{ z)OWY5fA#){stMQN`8xc>Z|&$#1OBUiF%4*B8lr_^8sZl|HI0VxQXS9_tN{M0&2g6F zcL2~4OpSUlUTZ6-~O{UhR-z4n2 z235{tI&DHHp6y&FF(e*0*l>KY@$%_(vb~*+srrTMP8+0dE=OzlvAuoLIX&wRyZ_qj zp7aimkB0Ey!O=fE?+*5dz4s?w@=VOA@iGZdauMzUjN>=|-QDXIju|fIy$v~hdwe=P zf9#y(44o#9dl-H1_~@+HIm(-IibS+*g_k`cb)+9s+1W|cUPGa%RQE9wP2G!zxLu1r zGx&kMT$cp?5yeP>(tziud~iJp(9=mcmsyjtS$=>ilOT zjvB)tJBS$mEP)M=1`E$2hLN1BeES6~e-ScxgO~uw@R9~~V|Kx(*~ZBa-H+6py4Kie zBs;IoF1pUh9V12n#M#9VI-;IqO@~z6uPeafrEg?(&h`!tjD`-#z`IEfYa^E9{ni2t zVc-~LO9k7Fz*iIAXr}3qt-vQc7+n$3uwSzW$vNURvS7nA`o?zZ2^-p@{$d)$e@8!~ zzb$a#BM^lAWS~TJk$^{D>+3aJ|K!4>*01SD9K_GdfC!>yj>vx`2*-3{0SwFFaAZv_ zF9jcGIfRl41xEX@`guU##(p8$n{$s|4m~=bf?ifPHcZoh{-pi9w$U+~z%5N;`U~U& zg@hU@`o}A{^4w3vp`XZ-;xbFUf2x~4?B7l>sT=1Gy`ICqK*wZsWqB5S^L!Y~@<{cm zUu|cA+02xI>tw4*WK*piE<{`;h>_!-Jp*KgKXv#K0%!#UC3MDmxX4H;xp0axMN>tn zkcka)XPOi!I4|4xLG&pSO}pB9@uj|%1y_k3W(*p8xRCKJr9rlZZk60Ze}n*o{UI&< znNTooAL!h77hWih8fhkEJh94tzkhysQbx_vAQP{9V4s+w6XPE1VoFKiGQ^UTpH7Ix zgAeE>7J1(}d@HUIyIdkE_N5C-YjXhi*vBTR; z2^&#&Ld<>8-FxThp9^(B&+2`7=$3}Mkok&q6#nww9B8ffn%H?k;CYDN`CHaV@3#;fKog83p~YPViZ0iK~&r27%eC$(Sc4cU3k#?0zi>AXKc ztv6&8;10sLL!}w$F{F}alA6LN89G*a6_hoO2L24gl3Qd;dp4iCW6)Eb0+udNi=1q3eOUmP&QOT59_MlmTrQB8)%J=m54ikaQ#22?`qp zHV`u2{KES+L~_-fn2zb0f%&nj8L>8X!5m?xI4FwzN8Nn4e>XfjKkS|!>@`72OH&Wy zDn2MvlKFdCypYwiu~&{V*=R8H37G34@-ihP7(eJ05iX5}7MaPOZD)e+3R={;IsjsN zXosfO!O>e3PwfL|Vl;W9Eb&JuAdaJO>bhRIk|Al~nu=kv93VP~j7o)}h;5DRW?A{m zK`Ou~B8nq5e}s6KRE^L4$E{HXWxf#W8LN9|T9U6VA?Y+2;_e266f=3%Fshn&h3m_I z0|uFQa~8u^w!o-VE?9fEaOMSc^uzbu45Mk^SUA?Q8;d`(=G5EX_ULa5pj&_61$&MD zyl{guK(0C(Wnccs4z8l{sQ-Y|I)m91Oly^Km^TB4e_;+5uu4W(prL%|Z?^tESnm(< zpXW7HRvvOdPFLXrK+h>sDb0%q(Uf0)ioLmXG z;;=>Ee`ISV1}9J*kK4r@LtG=|frYe>DAPZL6OnTUbl*Y4KRoHZA9hYpJMYnqJL~>@ z-aXn=^?TThD^jehw2_J$WSVBWManS6R1+-Asw&|kjEt!MQ-4s(gi@$YJCP+R?ICT+ zG|4S%GZxb&vnNUt;_B3QbpGxgl3nlM-F~)Be<{_3ui9vre2O-c5u094z)!>=WZ2JV zKeGaUwK1LAGn;wo)zIKG9a_t5-Fu z@SXdDv)N7wv9L{JECVfab~QV}J8{Q|YipiIn#I%5JG5~ip$Nq85!!@FSsCgdOF9tAapVHk;#GI5wVC9CMFCu(Mc zVEn!~RN_|kr+y)eH~8-8Jlu zJ~7Q;u>NEt65{ZMJq47XoOXX49>0Bif7a~{_c|xN^V4n#*J(IY+25w@63DE-H7Le= zWWnFV6hGA4&vzSjX8VO)_a(u0=(%rfWRRHzUpx0`-eQhh8qaarWmS;KGdHv?Gu;Uf z$(@JR6yrs}oHk3p<1SIY!)=FhO`xraF-6+fN}*(lBa8wV|0Tq}P=_`LsID6Sf2+Ow zMSJ(P_U_Z<-A9k&_pT@g9;x?{p?qwQtia_Fd@w&9#|=>R@B(6y`P8x z30?|Z@*8f{045br+Yy`NoQlM!WZ)GSN@^_mY{NU3ZKYBX$|9LwQX)$urL>7&$|$92 zy+)_Jfl8LEs#fkpU`3HPT{7KX4haMM46HtSD8{gMeWlSe@pZLAYQST zbuJ%cAa)DcTUJJ(4qIughutrwigP22fGbFk zlqsy*>_`QUrP2>qOM}#a5@tc(GbH)xj<(NPmqm*rgI+=u?yG12HxU z5c*)r97=h~P+%g$h2Fnte_BzjwIXA!t{;Y4jct-nCRVR>&Tnec&|f+WxD0CKf&-O= zi9fg(vzUZjdFZ_iF7UbqqT?xe;`BntyIjm*X9;&$Qp=4>>a#rbce9Z%(=fxhsPRnA z3rBSr7v;`c&5AvocHeeS(P2D1>GXQt)1xR4mG4G0+f~6LGeH9V$t!PM@h^7-SyCD%fGXY zT0+s0VngaVGyZ!8HD@LDMhus!-PEk<)cth)k$RszJ4l{0!>dUD3AcMORQ_&HG+Qix z(#(2NHJz${JIp>ye;_p+@*-=mzs=a|kpVS_tMX)wQ0nTgh&^hxJ9*{i=9SP3Ywl#? z)8Gxoc+o%T4Kf2iN0Y<_?5glwr!OcgRje-XAe2r?2uV585w=lBAW}!*q@;-nWKII5 zoc%bC7UR(N*`Q(?1m@W`itN!eKc$z5sqRtwv)E3dd#&(BfAqF@Vrj$0Sk6OmYSEIO z6*V4MG!G^7t~1=AzMZ(}Pr0Qq>|!PC*3d3+Gj&go%JrMJx=<2aAoN zKB=ghliI2gK4nRVu}6;=KQRtw^Qk?u1C(r-lY?O<+Zn;@upi-328F_XbPDph_{8=J z^CI$$S2}JJf3^hZK=cToP3m>bxS-Z}RZdA0Kmj>0FKT6F>U+F~E<{_;JgRqui4ee|z<+KzgOshrC=Cyo&URaO`a{ zw6a^pd>@JXxR$90SzK7GIh2W`X81@ViJj#l!KQS$hmA1sJ_z(|n zt?7}le*&0!>D^)HC2+qAo*&X!++X0XiFO-q^DL@1rUA=7U{)fM`s#aJF=jISe|Y74 zBk{`hNIoXFtE^f;D1Wjc`I8O*NNkwvipML@gRU{#nhCXYB{w==e>^VzkMuo<*uOU) zblBsPzUXjq{}iWxiqi)br|I~HzI}dRI_b96e`WZ51AzpIs0WTCB>Y_2IpyVJ2mIYA z%TOfk#dBCTqXVz#@RQ>i&(lHJ#2Lf72(zZ&ePZbSEK$L#WR}nt537t!PlG?%0zL*mzvkvsr~{;lx{R$Lf#KQ+P_3ciD+fi zQzh05=#uF^axon1ElU(uDsYP!np2tye>lT)+bNOsL&iRvKW>>ZQ$r;MXt|-Hk}!E= zrsAfeE@T<&K$;a|skUAe>ri+BMnP%xhGPo4K6jMY4WG-BjT?|4Xm9awa0Ticv4}WQ>J!;vMrn^MbZba4dF3nMvZI9))!Ip$mg!CHg|^02fAN^g zn(2$FKE5Wat->-F;o*WREcbmDs2G8nLQ!7DoW(=L*ic5-^d?_?bhL;N~hAuLCe>dwAkEBRg zxyB_z$O3gt0_us(7$Fx6dm6OBDg}XG>iFNCf6wId$}5Qj zo>Fw_1EEGeZ5iJFqC0K->s%tSL8Sdyr|0WP}KHKd0VqG zi&{zBqoD3$%XCM#e~qs{@1|e?wUYNDx})Y2?VorCrOYkXFj@)}srr@&=oJ@-k#Xkz}~3Bft&>X2imfxvO$}G z)VP7C(`j5v$jmZ)VM2arZx*U~N!ra^jqFvCR}J&uureJhOD}rLf9^=SZX}`Xs5R|a zSG(fh?flNTzaho*EOw=mfyNuT97(kPvuGleiaNyo;Rr+{I5SrNL5rCcilQRHSAYeh5A0cZVoKIckK{}2 z_AdZO-8k><8F^A?aNRPeurShM8spze?@{U>~t{VL9=?qfj`bLXyY)% z$ZVd6M1o3(clq;p=V!g+!(p%U<5^KLOB_uH(1Q{k*0q$8J3(sH;n6wL6@OMI<-U&Q z6nU`mFNHFSz0Z}&t=g$|;l@*~G7CS6;rOedHd^}FQTk7ZZ6p-tR05W)g2B#mCr4?J zr{w#`e-q9pW=Bqc$Zw-AE_hiKW5?K0jfydS1qq6ANrlvFJNS?Zw%IVK5sT(+}57h zxa8?sJofgWTfV2TJR;Ey&w8@hnX-0mE#&u)e|~8ki&Fh#%1iYpM~&dAy$H2h+UX+{BN+w(xTdA6swWeZ|6@!Rn3*AL-W436AT%X=OA0hEtM*sO)^W}wdcGX4< zs^{1)`1k8yzVI(Y-@b(Qt@S}e+{gwL`q&nY(%?3B@xN$5v-b6R4c4RNT1Vcxf>k!Y ze%QRmA+6Q~!(6qmc37VJcJ2QGt(D(yf7&n<#_#hKM~E(oR3QA>mch!zC|xh6iIr8_ z)KthAr=SKWN^D3~kan~8*yZ*bdz3xN90+Y%9IH$<2xL3I@B4gckKeuvCV{3=G$T=f zFoEGIpN;s{dq2jwR<|3tPU`m?~NgfizFnt3fvwV~b9rgy@PQQ0N?4EYcI^8e5 zGdKd>5yOZttkN4)ayzAy%iG#&$+PpuYI&ZW+pA^S)LU5>ms6aC0iLE9OzD+JK69Uu z@qmS5W<={RD9(|`i3v^EEUaZVf02_B62?Ocj@TTAB=AIW4c!qh{SY>vsldj6rA%?` zi;e$DQN+meMhIVv3f-w1#TjCFVrHJpBrdYaG%B^X*4+sT5oRPzsSE2ejl7QC+Bt9# zlB?~Bhg*9?ujo*QhL9g(nFk4Dqqi{M$jO-TaKIzkH6D_9Ve>|cZ>&Gst zmyZjAk@(}*Exq|*HFMU26I)iHC4rC{dM$-UYRHyCOa(C+k}U7b=u~AxrN~@`%%zB{ zLR={ls*q5M5M`aKBPj&=kl2$E1qD%%5)}nekrIxhK*Xku`J_1hpC8i04^_xdDe_T) z{Qdq*%Jh}YZz&V!Gn;P1f0=9JNoY6|5|0TsoQRJ^KS=-W51}UBrfJHw`7>xYaU@0Dgb{k%q;torf?R5Et2vT24LZAchIey;b!{sOblWQ7F3R?3drGR{Cio0gBEFaQTpI*$; zDV@$|akwqkCELbES@4okCgN36UZYE=pm(CWF?FJq^fBjF0?dH>KZ7K_FDsT z@#ZeiQjnIc7Ql=gpLol!$iUzVOcsX<9|j>J=!b!PY)$|zYvknj#?jX*O0k=vgvav;M%SG~r zQ2=eSv_0ciLFmWWI|{>dLkwNj3w=HeYeXUT9D?EJP%7t>L15(gctv0kz?Gs7(YFY> zM%#+9J_zqdf3~gU*s{&`8KV}#x~$&Edw>!XCPxj zhIz87Wu@_HTc(>ZwNAEj;^YTLe}VXYv)oQ_H9B4N#VRVAigh(VT>pi7M$?h(avopx z)ceU8Z^ZvLGkU^!yNmm#;G;eIjO7`l>Qws|_Yy<>e|-o3z(>$E;NKZFC6F|_+jY?I z9`}y<42%z~KWcvfJfo&dXcQhj5*N?QB=z(@S|-|rT}gq%w#3^ajp>3X6E|f|_=wWuITL&8O!oktCLWsq zvFddtf6j^ZH5Pbp2b*KvGko9+Kb_1=3c@fD0MPxMB4;oa1Pg*6aIGt0pu}<1LgxcX zAVs{pyB@&pTfBbfZwJsMoIMeT;aufjUwdmrtGMYXa$I+Ko#kmdTBInWp+&Q{RNbAG4gkz;Rj#$k8*Vl9xeme@Sbl zzW5qqhI!|5tBK`?l~~fV+%Xb0-EFIk6m3?Km6^U7S&}8n+DF84*V93Ttj2tCVH#Q% zZ2auDwfwSlv2!X@B!U%3x9U%hgv?1r)LXr{?p2vwjr9i@Wm{0IW3(CF9x2rs*Qzl( z+AH_J>vXiTV%H8*rk8S$vSr80f7N?a)&a|3E314bHZ07<-I$raA=O)Bz$Ua;QK1Z1llN=7#3F)mav8(+2s#OlV)~$yB(d*H1oki zjBn$c_+sA976s#~1e>NGf73hXo^xhSpRJ|dnsg>qis~Ags)-KX&=n%ZYP1dG2>Ge6 zXMX-p-*En7_thTX#od>CgD6V3BG`h|hpbw9G9aTa>>T6Q)&(yt%H5ohndzg`Wyir2Awwwvi4Js%kr*na}(kYshc{8zC@yg zcr9DO_SeRFemtJ!IV8|aljP?~UTdjYk^4`VI?^(QdLN_$X9Nopgq-o-fOOQ`iWDob?QS)ffpk#`!5R}UlgS7EWD zR6j{d-0$xUe_2t)8(nS9NmLvJ41`^7)$2mkGi|gq57QuvvGeLGG{ze zIe8M3)bE{?-A>yu6vyxT6ld93%2c4H1xjIKU8%;!v@wdb4^m}ma7v^!&TOY^MLTxG zdvG~kgGbqu%(0Jw!Pp0pe18AfvCm(pKHc2Pjk(Z(^b0mBG-@&O{rt5<4DIyM~+`n zq?sKP%t|mT!K?(c63j|4E5WP;vyujK9T_0|$Pjsm#Qa3(KPke+sg7qwRFyP1cY1eM za~q5KOBrvyRt;1^tys3AW<}kK6)RSa2n_lLf6^c|7#Tzc-0q}S;DV~H71jZ<4v2L? ztOH^lkX0+ztY}!VZUx%2DM@I>p%s@)*3BA<*9N}9D}!CvmfN&~kbzW)@-&n&OM%nR zdCaNUW@??j&6$kTL0L$y0FOpNlGAx;LZ7ijA7lEecsP|gPoWB%;ANZ+{9z!&qq4i? zf5IXNnnca!-5s|G?ozHCVg_Sz_9vrMH}<<&9$i_b;!i&tCJu5$8!MU5jUdvWRqoClL~VNbGzeWARJ+bXI* z(mY9uU-xSfB+vDYh=N3DF)4z+&=V@Oe`ZBwdWuDn+nb-imhpOdinBH@S7v|zsSm*O z1b8kuN;K6tR%50{vCxAGJXU<7#zQr>dN5UJ6>AHyrCv7SnQHh4FbB`!lbX$rKZ;pz zX?)+CaaHeo-wel{6RvaPX1JcKyUFn8MVOU-0>xPSZ`(Ey{@s5C6L^t?+ClRee=yi_ z495*nZ%I?E?tq~x1X`wTtr8`OR1|K2;jpME4=DeIw}CSYmRIhBX`Y__c5a@rvtQ5k4{K-P^0hv89na;AOZ{)^*!@;35PQn#Q@X^z zC7b_6?SS=LrcH$)Zvw|-e(S#$e}TvIUCB(z=A>=$Ifznexx63E1vA?+$s*t;4idvK zT`r^_m{PU4EJ%<6IoCp|NH0Ftf~bWx7vx0C&Eq3izI#tNyC?dDf2FoHANk9`0g>wm zlX)nnD$^Asc|A@bB$+X?^cj`R2PKq~f0^$dD_TEQ|CD}f%atX%mqoZ$e|w*5t)7Fs z&H}0-} zzaCGG(Ffyp^qw3grXC%Uf7nOh03j(inY$qR$oJ_w!bBb)NzDo&=VQ!Dt(+K*<}k;T zYgMJFT8mZIMmc~22$1EYjYAlP-A`#rl;+PqmvqzfNvH-b^RP&E(xR zyr$QGj&6*ro4fHJg_6N!jMzaa=SIeZ*^^u9-e-mj8W}r0H2&@LYJtS&`RjcFEA{UkYXbHh&tnX9z^s|=65BJN) zYloYonprenK_mcM!JJnOh@!+tT;Ff6jaxlWWw%M^whY&W2XT@MRry8WhdkmNJ4Zw) zoqUxKUq&uayD7B*Q7JtIQ=to+DY#){x^!a%eqer197moav;+^CyJn^PEgYSPv&j>+K{ARiQp}I>>(t|Y*Y&+LU^M1kU zFl$X})4I5C&Z*2|=ZF<*ckUzff1GGS5$>r}=eg0?D zr!~j=?J?Yk@prvdCeQzOyR5dI^6j#^qVaaQ)x6Rze=|B|?BuX}%eJprq-!4CrInNf}HRgY@3}Nq&5ZyQmavPbq37XkWA6X0s08h&T1!3TvuwSIyhOcYzPh zCiobbSej4mUGuKZgHoMk?Esxl2};M%*N1kQ)Q^HvvA26I1Pd9&v(A2yoqKufEJBwV z#Ri79#lT7Wj8c`yvKa%e&ZgyPIst}S$j+wgF6W|vrwM5?8g0XH0zLkTHYDYWY6((77_jL{Su5oue%wA&LL|Ae9C3|P%BH8m9Q=DAm;AEE?gqu8GFTh~-b9(%h2z#Bf!34VT$ zUh@3riV2DJpq_i==Q5;U!l0%X{uXxnD+RJhD--2tKdVUQK^U<439|QlIE*l^CCeA8 zOa+252-cTITHFt9JD1%HtHTR9_@1pO zmqL#?NHv26?d7Q@P!9X3krhK<1>(%(ZvT#ZEX)MulyMl{$;N>mpcvp#Gl2P4ztDo9 z%o|lmedlhbo@^rtE`o~xRPz}ge!jh}JDOG6|LkyZT9g(0@pKL+DY@zCkL)^Y2Xguv z#8Hd4VcZ|jpHb^~aRePr>xmJY<8IFIAus^++R8y0z+MsD7~?J$J4cZ;Da1=0n4?%D z?UXiuw1Mb~b z>I;DdjF(t+Qd)7R)x>>mL8h8X#-U2z#_mOp;6k5)3T2}Y5W>)_u}(Ww5~SRB4SMue z2vEm4k|}wPS4>df5?|%>HdCijAHl229;51JVVCm$7QX8PjPa|018e9gqlEXfPXt!r z&ROa#%*Bk&dQoxOp@IAHW;w-PTG2%~z62^PQer{os4?iJfJk`b5h&XyPaSj>u}3^D zIs7KA45DR4h-dGmBe4wKE?0i1KqXe3Ni5n!C3BTXqR##$TSaUJkQ!53exh3Cw8>GV zc=wPcT^nTuOc_FD$W!jTd4OuG$8${~z|v#NmcCab=;Qp3eoJ=jScHTzK?#`XrMHkX zVR;hv36Gs=5WcZ>fP%xY4fXLu0rzN0(qSJ}Tr^mct%mrungq^PO zdaszcfvKKprLRj(%YR2q-+|nwi~a{iLo}v%WndWv%!Z#~Cx!ZW1S29Xd` zCcIOHE?#$@%!8@V2A)}&ORznz?4aH@f!2^FtQuo81I@Bux}v`}tX|*L)&}sMm57$f z#{XFcpcnFpU?o1(Aqj#ZxeH%$7iI(LQDxL2rVTmwQn2(}AMU|4WhjI{=3&)qgM>l# zLnn9&$-c#Io#xZW+`F6Sf*thG@JQ?Syg@OZ?4C==xBqnlNI&q()9-t2A{sPDZ_m&&8Ej@f^ z|MwJ>l3Zi#(G@eH)Rx+}dS`^@gTgBlY>utSL7gR6CY1?!*uLI|yt-0%i1El0VaP4l z5c`YCu&^GZfGmMRG&93frdjQery4UbQWM-2N$EE99Uk zU^62iD?E!>a@AFF!HmNluP!A=4&1O#8zLC)@Ym4B*IfSw`2dfC`5NN_eV>s@qa3u& z-3qJGuSmfVxF{D%bw`lGhH@>7gE$8La4E3AeT{YCUCXgiE405&L^|$q=f`J_P@?}` z%KSo=$fjsnsdv*E{Z-ZdX|Ibwr(&250JxbLvW42dF;Q;N!f;CJStH^&?wd%ha#Z=j zE3&#Mey~<=`V4<(?FfpXJjfrG&(+Su#(sst#l|EJ34x@MEr!!uyjk7nuGw67zxsER z-b>#5t{jAP;|jJGg()VdTWFT?U{LAwKrg;!&k`#uR29XMHn0sIZaRkmB1u|40O~#` zQvzzV<1E;DeFSe3BAU3e3C?l3SAlK3Z*t0%ONNG|jRP2+bKc9p98(q`ACL>P3Gj;c-|n*HXll^q!{y4@oLL&k(3~_|q+2vagzs%3p0BbG#hq(LQ1|I2`VkxmiGJ z^`4VVGbNrj1KrELiz3et-prJY-Y3R#)M)Y&en({~hT`a_P$w{kMZ?jNfJS^wG10kQ z66v;Z-xVDQa@3S&7iH8;8xt8K0x%I* zDAr{%uE^&d?#XX#M@KAy00tA6^If@4hdhDPQan}=;>8OOUbl6aUv`i+2HK_BiSxQN zD>5>F)4T3VXTGT=Ui)s?WP$lq?fuqK7S;}kVkpEfSFNZ}l4I8%nj9QLb{1k3vgU`) za9AM5DB&$1fR#+TzTlU8%A3hkhHXwnkaM7r8crJf6vpcc}0C(J0-a*zGp73FY z+?mK)H%LH1$)RMky_59e6O%#688b6#h5SKqQ0XmtoQ9Q_NA7P)L<;SdB$UV@MSTYD z$PGvp2}(S_f{E4pLvinJ4wlQkGHmZmRX&PEC24WQi~0_X`<_jJDE;Ud8krY$;8J}n znu~Eh8yg>A_KsW_0la?qyFr7E`;&)B`&mJ)GsX$3!oiZjXyu4`NKEY@SuQ?Mf4rOd z^8=N`m@Qh{I1posAx<%BEh^o_83t8DTr`8=QuT$U@hBq0VAO`W_Klrv$nXCeA!t->Z1B(ll#c`Uu*csF%rT9jTRS5r zx*P%E_;wG~-&Q=>y#u~c&ORbn)nq-DPs zwbX%D6ub&fN~kdc%6`r)&32h8Ule8h2SoDlZA`8V1L(#KL4%M?l$3uv;DAU ziSI)x#|Z^8&1QsAl#c-A{{BrmFCYI`t*L3_gMqb;Q(^(iw&sA6*5Y_GRhWpLu0zWj zpdk!yFYWXx?4{%;{=4v6J$?K!-PVb+xOoK#r?Xz^>?^Yr#`fMl#YbDXCj+i}ziU_U zOYMk&8sLFJ{<=XnoNp8r)5aCN%UEK-)R@l|wiNrL!T18Zn8Kz?6mHvtoHG!|5Bd8hNz#!f3hlIg z^*DB3f=1?YG*Tj#A*<42On3ZwvSqTv z1157~JWvtE&ub0si!!mNK#W=a$B&s+-GKgy$X=iE7!s2SN{>~g6~3_7*F2AgNSRF8 z1B)svZCxFLiubF?ztE&!+Dl{z=Cq7%aEiNwRob4p_XjFT3!?Vx#Qfjhf4G`)e+5W- z4>#-dho(){!}fYcbBFu%8KaMQZER_TK_6`CxJ> zw07;$`1AN%cx8T)X$41~yaB@_B?krlcA03WvVCx8iy4v}Uu-iOTEuu_iGj>a0PGXB z2f7Tom2P!ekcgQ;GovytRg<2rAZ!|Rt2wMQPx{%lJ@03%%IDV0*IMbix7;gfRGq36 za#c}(>z&TO%OVevTBsQuCF%UR3Peg>FvL5?l&1?7&V+}VS&xDcXZJtoduoY zu8|GhUuBz(a_X1g0~5cgCe?o_0I2zCC7_-88ikUpbu=TIFUX&q;M=hN7q#8jBzS|0i-sX`=cIi$~>Gv;w-*+c^G3v7=H8-(%KyB*9GLW7aT@1 z7ij*gP!tEGR@%KuBNoZ4c80u2ZMks25G%QDZWo&M0#$_25^2*a)dkZ;(K}IHi^3Hg zq|osN>Ll{{HsN7q=BkJ}Q`?;emkMll;fZ!--#__fmJ-Apn2Z)DfG2Lje&Rdrdh_aX z>MsL_&jq8?l_lK}S+c8pBA%oEF6@y`ws`~&U99HuGMD9o_(=Awm{>VtdLfGWyeE!+oP#Nj3yMMRd= z*Wl|I|8B|Uk;@esKvZHlOo8PVSkPg>#C-*dVJ7)dPC9QmPC%Vu#uwVSzqX*{w6!VB zX7Z?B#1CUxaHheERV;Y9Xqin4_2nemJva<%HDx-8T(f}S|dCEq`NPsD$Y?;MW zbt$MldWqzac8wPR%b_-Gz49|BTW=UF*FJOc)Al4f^KlWIhOTdZY2C+6QBPvOwJ?-i7EU1!zn4(X z0oE14ZC(dgz`q<13tTR^;5Vbqy$j;p*5=I$$q^oP&HAgQ+x3}mpmaC{HIlUw=rGO43I=cw3rOwM2GYJt><|lxPTuHE37D zxf>gZ0G`U!!`X$I5Q}3JzprchvC6FlfBCDrt%v+^$Z%cj_nPn>8v1pP+|aw#>!#&& z0rPi^)Nd;#Ws>n_QRl{X1yE8qmVLQcwPuCim5&FzfHh%!`DpJrDlcWIKZ0G{)1zvY zOF3Mq_m1ZqqmRd3>S!>;U)ihz$7SzuB$`@00Z_s{nOH0F_ts8=sEejcFw((Fvrh!TMp5PB4+){Ig1T0s<9M*Z+#4$myY|ZIme88X+*KQv zWS9{lKMN0#T$ui;8s{C1A~x@`%oW%vZP;q+#}Npw3v^nejH0#q$G@;3teYG6jTOhfZ59hP+1sej?O@qd$GY-fzUNhLEGa z8VZIH-i?&@xNk`bg{Se^?fq8#BaGL!eCd%UES7S4rJcaHOyWhhULsb*t2O*Z$@LNo_F=4RFS4)`C>S zOt--yn8)GRy=3b>+$88ss`r8Q`r~&H0v}IWJR;fd{kul7y43vT&Umqc^Uq4_*d!z7 zUJTuHLzsqvqU&QMg)R{@4MWy&!NnvMYXhfCG?=a`oz4qIS|8+3 z#iyxEFfF7(^Zh8?Oy$|RA;7_skMlY{fm>D+saexk?rf=lBImgl)Tr`|L$b+gAc|U5 zwotikU~7*9T80k|=e1mFsIx-VO3lpur-yGYq|55#fulWNTCa}WFn{=Lo)^`yYNl7G zzllq56LXH5XE!s&er80%O<^MX?ZXsWgO>}g=`U|Kt3_%gGpaoJNVhsUOsx#`691IN;@HNtNzko-eW>nw#AskrSO?UiDM z_?S)N1749ApMRK8znAzAh%Q?~0v%|2KDGU01~s3QLYU46Y5;ZArNe6%|3@71o_#=1 z$~KgD#7_gor8SvLwY2d1wVrj{Uf8ZrqujS}3-qC#uSKMjudQ2`k65YfH9vYKSHCU5 z*$mbx7`?RULv1qfI&Ic}Vxq?f^{D$yrZP9sm(`D=)8)N6-vG22ThZR<~Lx z=;?U3c(=ViNs!flHxd`lNoX}mwEF~bAtZ1D_9f``@#MCU3^gA4jAy{}w!4W&VdiMG zM2RbSQt(6NOzU^WTtt;H1m;Ami`@%!?!3u32jWesE2eI~>S$YIE&@r}_@L4J}f&pQRjy(q?b3+dyV& zB}T9hOo&DX1%8=EQ-l`WR-y|E+}bK_twZy0{{BdcT|ATukxSeZ3w8NJEb6LM5=`KA zV2B)SwGR9b;In%0^mGw<40`(*ousP=18bOX3MduI4G2#UQQDzU2Ifa+Vle! zlCjzhPn`I69UP3ddX&IW54gPBK3~7jA~MWT(ej&Qv;z`==vRh@TY+Jar5nSZJFq#F zJAE}7kzdO}W&>Kl&UaUbKdTOu4dW0Cv~pb?00|u-6uLt*j>nJt7y2)=16@q4#!F1w z48V+FM$5xMjL4YgSKP7J4s!Z#2(xl!==6rbl`~M?*?i==TcK?e^q@SVT|Ye94O;fuVcyyG>I3E&2M*kT^< zq=VT^TyYGFMiGk*XOh!D&;yK_v}{OE0dG5Y2@Ark9VIMhZL3}_o)2U?9NsrQ(ly*8CidY?R)`j<91Jb86 zO<9b7bsu`Jgv*&wbx=&&TZPK5lVW1o20ljp^NaGdnF>Nm&iT5psz$o}8A^UX#pIei zWRRiKcES`B(hN}7CtjX%K=)?B*{nK#?lOWU$tWRt5WO)Z6>-#BDW3lV&fdo2r2F|y2 z$Rz+V#s1D9QFG2r09(~Ipjq7&ebO>XLPedF?%&@y_gUzb=q4WM@VvzN~eh| z{ym};c#FGfIv%h@_v5RR2+%jtL5K$;fU2*)k=Rz~9nbcIz8w@FY}H5)ZV5_wrqkOV zo&I5xVs(XdW1T zZtiOtpzVpj=aOp){u3D?DE#2eM8Xn87Qu>w>ZB-0B-Cusbnt0B)o9NLF-VClz*+~E&An1CUg;*}z=MDWIv ztDG7gSlQI3tiLqG&-`%i@P)1V&95vIv2L0BW!= zMR-Q55L|2_A#sL_yRAxerlC>$z_1unwT*TMr@PeIde$RhB+#mcq8PP89gk4cd5}2H zcUxp&Gf!=}`#995^T*6!3FH9}B6~-;Z*FhADVKo?_AtUSV1MvAt^6F;`Mv(MIlO_08+u=3=xQMA(TxYWnFk6I<^A+Ur@O|)ClB0#}yFP{kv`;n2gZ-Mt4tJ zZIZ{`)vp9kU_y#l&ItPCGn&A?`=x@H#4gDAeg^}Pe~7twR8*MKy$Vsm^>qU79WxjfuoLkxvS#73TBOXNt{07ezWS_*iW2Mjw=3!*>qF$&ib z2|BSjF#aiM^Qz7D@|#{CbNW!&RLMm8{zP;L z1g?qjM-w)2U>V{=4&>#5;8#%*$xTZUa%|=cVF{W)4v6^USnnW8cU83KA#p|W5=a+U zy`*<60L-bBYV!d+0V9f1&D|&qEft{mP~Y8<)(d)2Ht;O!_Az+PgJDD-i;5OPFBqO> zacCe>&H?;LE^@d4#_lQ5ly=p974hRaP>jTOs2^j6L#nv)A(bi{IS5>6PgODza z$8upI1iHfG2tAeOFYrN=w#}q6jRal<;D`eo0N0$hna0fmf8X>Yjw2Mbw;hOe>rHg@ zK1?80gFf)-d>^iMb;Ebr* z16bLsA207s-Uc(DzA*>+{iqtg)h{hr_K#?K3R$blMSP6!M@#`~Q-#tXwFuTZ$3xc@e8+&q6hq zHcS+xa;_1r0>cg|d?}&#HaE4tp}?S906E^pGF&s{?dOx5=qr>QS??Fp8y*rka?rA1 z{JLk@Bpi)0JFj^72_mVUpZ*UcaRt098w(?(Jm|J+tWj&!b77G2P4iQ-6?msFJvjxm zy0(YKNGVQCz}itvKh`poM}*Sw{+LA#4|)C4=EY#DIQ8?4;K@5jO)9fI(~SR6uu08M zyZI9LZ+A=~Eei+NIj#)!7a2y~=lg7-2(8dfBrhlw>HDA^(u}mxhkwH&RnaNRN?rNb zC00T_*_da&Q6Ghik!tp;IoqGtgwog(62!A<&gj0u3x|2)NZ3&a=3*e-*blGtrH!fp5S6Zejuim4xL zC(LaZbJLVox+!!Ue+x+AKAgDBz*_XXqlem=<1`L_AjPV+vv2v>`K|>{ z3)Z!$gH>hb$oWwxyo{@S1LSI#6u(JV{ZG#ul_57t@13CgdF#^#pTe87U9`F@z_qZ< zz!n$Y4Ne1E&2|i$R7*3Aj48DxR_^PJ!PS6IIP8*eS&dngzAy`~(zo&#P0Mh6VlgQ2 z2XDujLPKL&;CZj7*MJi5F|s3K*F3fMkxxwJDxW-|f>=axbo{G80MGZv{mT?qOK1Yj zW1r*n%o0WWP&s}m`nyP;O8WF9YFpQV<+AqV%ye=rDZD$}j$Va9EGt#>lyKpCdK0m5 zlSx^nHqTs=YH)SI8p}V$qE82VW2_iK#f!%vXq%LtASafdXj3ta9m3JKp0k(&f zmePE8_Xs%MC+@FYDdg~1fziMk<(exr_l+8#>N()4*qR7Vt814BXK=Le4}(EDq#{V1 zk+?b^Ro^PL!lDISIgOgyG=t9$U#P^WpO2LC%n1@%ohnilK+lR-UH8wqQ_N&p8RE1n zH!(CYdSW$8MP7kPhqaW30=3qs|F(~iFm1^|StMav-&PrmrRVoPq-mr{;||p#T57>z z;}@qIkHw^EUYOF6@)fXzri^912A1>hyVdZyxSL*$qI&Yw#iUaKKt`X!UwedtSPLzm8Fb{fQm zw2|GU+2k&x^O@(#;R`9#*axiX6%5VH!ga!)$sYt(G>>=Pm-)|PQg13 zBFOhjK>WrJa(R8k_f^M0kIJC^vCu>GReZHeJVJacDI@z*cQ`~!^F&Nz@h|k5>SH#B z7WZcWbuLqrk&xJz^>vl_&yt7LC%kR^wAH^Xz2IA~NLwh)z&(*1VJVn%1u(wU;%?~R z!m$dq(vUm9^{A-yV3)sFfWRUk;@G=z04vR*TQw%UL;qSl}yT4a?zsYV{&6Sc`%1iw6^_1Xfb=kNKS!? zOe{EIYa`)7HNlf5o(JB%3JcUA@TQc_S2BQFnkT-cY_wXj%UI~6XLJa;u7!RmWT70e(nX@4mUz675ew39KihZln)lJr-fo`hIrIpIieLBDlIDxKwQg=d*O401xk* z?fGpqDE?|9Qb{j_bbp^xho|bz#oipFoSDv@5c-f6>IQ^u($d^+`L8;Be#+Abf@?n9Nh~R?z?ptp_fkg~~ zwnW6hEb084iQ9K=PQ&k7-nVddKrO}@P+45%POh-|UwpTh7Dir(npK}jmPDU$4-a!M z&UeR!4}lZV3kI$wrveUHM7MZHQ$}O9l}0pnVTNOEP;#eUHc4tS>bfU_?o8_CC&P0ld zS<5QKG?FUCFU(GKTE##bu+$VEl32-F;7TkkPa011o)V%CuTLLHqFQVHEf2+I4(_z? zIl*x1E%^;>8mDU=#E2Gp`$#hr@@vC4f7wlh!Zb+8TP66$%2^U_9Bzn`JRoKMr^mv& zv%}e$@YGY_p~e;4Y9v}P$s#R*(e-!fU>xj2ih425BcNp~u7`d$YL1o1{tssF&^Dn%9- z6p-yrV7A9RZ*cuAFbX@4m3`s)?;RMQ!;*ln(@DCfJl1MaYOK*!-KNEU*zWNg#xheF ztg@dNB5l(00$A>eAogn!>ytMT(nYX0&9M^}7gnB~xrI@RU7n4dElpbnl8QJcQRhG8 zamel?jW`r(h&GKc61I+#P91}`HWC5MB)j}r+MN_679jUz=cWPMP|qX+ZPX)$rw`=dyIFI{-LXHXXx+R=uGL9s4*m%I(h*op7ENu}zEU@d|13<(Ey1Yur$^ z^Gzl1I3xzCp>$TzHD|uzGrZq3r8k8#QH%=IC7u2;^nDICgb3$G7YZlE&%?ku77ZD% z(*mnwm$;}ihVfw~eA=q5gFCuS(kMf#js&DL$p2LwNdi&^kQ2uP1HyzR_R$(y)gMhr z2^E=N-2xnO9|Q5gpANc;pPU3ur;XrpYQPsy7907Nms4QpVpWrBr`WAuqZeF zwnfpRyQ3Ci>geCxj;XcJ~Jnp?Vxp#p8j-0su|J>2}sc>$GyjR0q8{VprRnjE|UR z>^eP6K$c+v%|eb`WbSfbJLbk1PHI>YPFjB+kGK_*xIIR5nF0yV%_}dp)QG<-5>?;9+Key>>a>%1KU4f9i``|fo_5b8R z68-p!^a!znO&e*}`t!c#rLnX-O5l0B1h(ZE2RiIGqhZAf z%799%`JYOCZpVVrIsQIWy*r4K`2SB2w0``qGd4mdJL~*Ttt~L+AwX-H*Xm{v)=r;I z%L5Y7OE5Kmemg$wwsfxyTX2XjTYsT0`wg>lnup7WXd)(;!cZoJOBlAIlWZ3RRFDQ+ zSvhvQy_R&YN)Q{#F5Yt6?ys$OhuC0!OH!=((g(m!hW5q*XKpsl@0wK!H28$R3hL(qC~f;)+W+O>{C50-9W^%qk5&aOI-B%V4%NMD<8_;m69;gQ7;_ zqm;(Kds};S@+C&@xl^IAr)X^nz)*E{g#in&5?^8KBAoC<{Bb2C0`Fmw|H-oE|SPB!`%Vf=^*FOrY=`0-!q_MF4Q&=Pt%D7U) zRHBx$PZ{k{AmJF2#2s!|qy10klV7w~a*%_wsGEF5`n`){*(^5}-i*3}A_RKK4Dpa^ zgu`Ix{N=<$pt5AFP^A(H!3oUqMKxG{{MRssu%ql=UWYHr;)66W-lZE_duiz^F)y)W zB?r5L0wlg?JIL#2-Oz1aB|HaRvLO^4X$-=UH~@OMARU_5MboZ}E(coV0(nxGM%B{T z>kqkvAE%;7d>Xk{^15D|kF}Sln4c7=BM%`Jk9MYal}%(^YYp39IIe4t-_GYZs4w|n&D{=(c?$+Kn#V(Q%Hv?kzaevM1{Efobeb}Iji6k zQmLSD-@SgAvtf{TyjtA$eu#P~U^D7x>M!VwyQJhg9%;bq0kqDUr-+YY(KSPb$hq z{3oam0}oo4{_612fwq%o!jD*h7A`lK{yK_67W3zr!o&7Yw=m+F#m+%I&6KV=XX`n% z49~O)2zP;P`A>yQ>#H=mpvZv?+)?vtFI`W5yVndmiI;aBrlK+X!2`)x(t zX4;DYBo(l88lm7n4#Uss4a~*U?9>^1wp;vb0DxqbXtjjlA;E_IHl%Yk*)k~l^lk>; z07Do!>vY_l{jao>8DOtn{a})SJxhL_#0OK{DSR=kTqOOS>UW^PwWiKL2P2x_Ywg|w zSQB$6-Ub3@HhIVG$jp@oxs6C}o(I~RP zUBua?oV+8vMpERIJZH~NJ-`E;lMAH6#05tNX^LEsgaGc5#b8pMx6yv?@s>WW@emMZ zf!pvt8*1m1{9h&E&Ue7|wM^aQYT`hjx&|oDNOlS8Gp4t@`0;tPy@}AErCbroOoS^q zH4Z=DMxPh~x)nc|Kwi%rvB6!dy`cV>A{-Cu-U&e>4sQ4sInibpjW~zl%%l#qX|VbG zN&|7%yMV8~{0*B`E{x?+he+kv99t|S<;(fS#X&#xGQnhjxb3njpR~S8j*gdt*4;n^?cRQ)inF+>XbzYp%*l=HL>AkFDCTI zV8pm+s=I_we;FwJAU|jp-b_QL1lA42zDZ<%20-}IJ`{x0;*6=JaKqw`9jZ>GTA5%v z6K|&hr;I7W%YG8$(TBO=*g$-Cu^vwp{^1Dh=m(x8vXY^w#G`E1K}qPN?e*7 zCr(ilEhKj`l?$2Zz!Ru*R7TGk%ArcEkdr1rLzVpV$;*l6PQ64U+L8~f-~xE~Rshf3 z+$sn>&=dRh6l^-Ld+Niq1Ergq)80x{U5S54b9b>Ky!B}xk5=N55DaUHwk7S+)uWTR z2)p^?&w9Fzay5gbHtcY330E=>G=%^h2jN35<>{`!M!wXP?Aby!+JwB245sePi=PWt z9M!c*r!$FWK3k5M7$oyy6^A>!J%A0=n(V10&8ZLkKfrHTyzm#-tJ}+0y)qb^x@u%! z=CNjNE4w1shL-x-5^eOh+2rBIHC|#^*6kwrZ3*yv8j3wv#+pa6%pE%x+Nt*q{QL5l zJTZ~**j$$JT_Uo7PC**6+;&Xby8pbhz5>qDf_vH)zpwI^_Y~}*rag#R_5nUX9m>To zy%?pKeqT%Ll(tq>MG*${c-7^L%O@m7$S1g?)G)bHo&9TaJvAzSQ1wkhLA*kYwcBP&m82lR5ji!rP{bf47sk`WQusCj$@ zsTZ9-3tc8p$LCn>BUbsg6w>8l0m=xHn(Nn|m!q>VqIEXHw7ebWH&WPm@EV1%b_82Mz? zyhm6v;px&ree1{gy}Y*q8;8JElKMgj*tL}6bG(r)4Sh2aY`$CSYc5myCj$p)X@)Re zqFXtDe}gVx@P)7TCS$MGLu+d%d+n<(wikrE@BMDUbJ;9zEsEXvK6JGYkE8u^?)b(~ zPyK7Gnf=pof~2Hga=_eDrgIhhPZPAka6d!({Q=$r_MgtteteDdv$R{S^1C$jiX5HK zx}Hy3`M!Zad#EK;O}F|tUO&LgTDJddNWanVhX5`Ha!aVeQ)IOcYFeK&tW=@3)F4Cv z(JHltZzzsb-7uI0>?WWM|4L~140L-86UFeH?Y{GvP53?sG-+Z431L(-QWatrZMH63 zY18SQ>L0#^mCfc2E8H&<v0h~@4_52%Pgpef8SMNAgwdwMcss+zzC zHx^1JaTZGD=GcS**{dtDC;haFzO&I#Q-9~CL|K6wcar2BdM1+bypAGYfS<0iL4;B_=lm1dQYAw4g<$HSMJN4W+_T($d+aMuxvrzB(hfy1zGoC&Pb(UXe;4DjKir;I`$A6=jYXxu@+V69;J=jgtCAV5!t`XjMb?; zff0LM1u=uDBv=G=HvE>o3mdKwEqtk=5u2v%#5g}-ZxQYQDa1Tw!Ig)ivzPf@-1m3C zpOgoa_$>;dYA%=NcX(Y5bHnd|zvvuGY#M(Bzu&8dwjKU6*LP<;fwe>fD7yDLs*X%E3M&`T{x9 z$_L_>WB7wRl%l&Gy`#1ZDH#rejSW>(ud0v!2@^Tk><&mnO7t^+-Pl&uTWsmD^t0JA zKxfX*O9>dK1rr(Q5-4HyRbxJIm9i+se?a7(ns+C~`Dti7*PRv3f^I2|C~#S-0i0Vk z49p;zTCNv|B*jy{;N!W31eqVgtsaIy8i1q!$%Qail*Ry0;EGZoC0actA%c&_;_GGc z6D~u{JllNCC%y$ul!ga0tAh$@>+$Oz;LenteQ-?NzSNm59X(LBHYTf_k|V-eU>agu zYBi!mQ}uqXZAy=JhMoPPX0MM!@~*s;lWo$YtvidL&LVGbc+Ick8o@@!V`~!Nv4jlm zj?eno$t)yi#S|dGd?;QXD;HEq*W@gM$^L%DXMD6ZdXhR`iV$&VXQIol-&l_WfGm#; z(WzQj++1hXt>@or zp@K#QS^IHHoLKPJwi?adrwK4_%FZ47dVCs3rDN zQd-Nndg^D*<<#gdr9s&?G-z;`uJEva&6PUA!A*WR*RLb+-V)6E@+LXqds;Heo#d$X z5#CGxX_uDfWido~koem1gu{W&ZB$N zX|Xi<)Lyxxx?=T;O?9zx(i$ zMcQfD&;VGf@zbT=P}U+keSpYDyo^IwZiuG|^=z23nR;L0{J^TwxZCu)ve971fIMk> z?Nj|0o8bU2Ama`ByCoxj?Kr%6hXxLJm)F-}gp|!t<1W~fVxosC1%RKKHc^+CWCJJR z#ekc?SG1^Ov8#qC{4;m+yZ_h893>`kt27Bsj{CW9_9J)``#8%d$iVeC{6Zy5r19^$ z%}&bdx*CnHpD{iA85Z2>JqGA3B!qUpkZOZN3b9DJxgXFlOPLc>M!&C<-yrsQ?0?1; z3sIA-`-;i(%B7@hv;gE}Tx?9jPVi0V7Sn~c5=YD}ad#E@uP~#YAzfHREf^+wLl!~y z3h@t(-+|*}{lU@q#D(*$t|xnXP~&=z1XQN)UV0ZJ3+p6jbfzg|hdY5a(rpP%>Q@~{ zFPf_tCYyCF;Ji|dg)-3yKHH#Oa0v0nUp(HeVg0?++L!JI z2r3O~bWX(JFTIZ6I7V%eeeUbQv3+e<+SxHf?biI46Mo3+jcHSK5mE@1CyXN+;Vb-r z-odD4ayCA$3BUsuW{?xX2eH%-E!R#W;IkokpZ2GdETvVcA=ok!<&|9KkTzwvwfGeQ zoQY`U$42VVR}yUh2Qf*kh4j{~>~CqJ=ZBdd`u9e~r6?{NW=PI`ymL|n=O0m_)` zk}mn1@$dftmOyF0@#ml&W(Wjv<|iV;l7bUI8Gkq(Fxw4fsbg57Nm=c()BpU1A7xNbP1&zJft z2QmRUmn|y?W<&chim{JN%bo*(Vvf;ml%!rp9q>XK**n5rU>({4ec(_wPPdq&*zX!G zU<$tkh*5QVy`$$X{Lt%#5qomzbpGSfibrN49<%^G8{l$B*F@w zmE>}l@LOB?sr#sxPAmsD0?yT!hAam=2Z90|I0w&7m&hy!Kmt2wmkKQhlL1SYo-GF< z0nwMhEe9wT*Yc!9Z4$`y6W$`AU8Pffa*p#My4#ojEe97AH%-avI1^s18eeE`dsp6} zk*K(gw<#_M1pxxO$CofK2O|MRmsBqYLL$U0mW}NuO&3nyj8TtJPWAi0f4F%){4l*9 z{&_X}IJ~^#m$)wnCjsr3;4cRo0a2IyF9%f$0iKv&5gNSDbXu2NFb6CF1DA*}2OS&r zTOQJKbXfx-fkVa_C1gZ=Jmnk;rge8b9;27QFb69E$CvCd2O=Lg*V9keSEI|}$E!Ef z(TCya-PH&@RNj2Let&uM=Bk%1F$YIMN06K|T#5_e2hRI#NoaXauwu+*U=bta4bA0~kB79sgV@B8E4O^y+Vk+bpI8`h(&I1$QSWaivMz0km zh;uL)>+t1g>rV^hljc*o36Vq<@csVh_3(c3F#K`*_-lA`3w>x$<_Vjkq}?mcGx8e= z3@6A;gSAst$64nK_IyWXGu(K9I~!3Mn7fP;f_PB5w;#EedEgfU7u?i2*eG^^)CEC@flGGL`?J&}f~>CDZmVP^TR z<$2@H(;SP3D(^uDE&*j3T04|U41tOg`u%>56z>?81|33qiX&mp~hi#(%s z*gdqja(^3XEv0||O4-)uKEi=1A;tae@^mJLC+;J{ITnFKa8&plci{9CY>RC#X#+Ps zVv(_Dp!oR!vik>A5OUenRK!7hYXZmb_%X~F=0KSMydqq@Z+EvjdqYXK0l{DZ-bk&I zZ3jzLGoKp#y{z5Iz8j63+qbrllsY{FLD5WtTK5mUrZIn!In_3`LrP()3yh@2EW;>T zfVSl<+jW!T)B(h;5qGs4!nMvR%$&e%FI9FlstM@gRSMPyXII-9B^&+a1&->&PO5ol zOnA8()I_Wwc`*n=bKI-#ZoEu4A_!3gwb07K(i6Fy8;vBl$34Ix{<~-J(Tm&6%rf<0fPI%VH3Ow z{sn98$(FH64%M6DH{)}L8(x*2CaO>8jsy)L4EP38rb7*ksucrQaoo1AgFSjo7Rxn zmhG&o(Ec4KX_|B^bW4JUA7VSXIX>s=`rOxNav>dulLWOS6k+y0O@eg(M%+;PV)*Kq z4srPM*#ELhBEeVwTaie?ksG_>TEys|qo#^UBb4VjscwKUmNI6P7$&&a48guh2oHbD zxgpBC8;UYx;ZOKAiCH*S^E9y$n-2|vCtRkcc$Sduk^u%i&X)ozoY*XSPMkIfYcU&^F zP+|!jmkl)R?`E#ArDEJf?%}jZnoX8jNrZ!E`T&>)E==i>B#80(;Q;(OnpudJ$}9^l zCHMO^skct`tekk`x=Y0jy0$qmK8GF^);zh*Ss+9Vy%4ETB#S=*KO(WlzuM%{X@OS3 z6h95>NM{Ywx7*)Gqv_S<=c|9q*{A8n$MFXkb&q^8{<==(-2`qL>b?H8?Y^BjKJ>_X zwYztDk0ZBs)()J!$Vh2KWy#1*)7W#Z5h?gu9dCY@~Sp}Vs-2M z2DMmQkK#5Ie&<)XD~p?zKR)J{dA7|41B!N-XDGtp;V$1j=9^#Bk5TmM>ZjMy6~6lMb$I{0 zTc`9n{4L#ODaBOCH_FolhqstVjASBZ)4?F;Cm`HpSwbQtNJ^)tA;^^-qH+0sBFY<@ z<-&a4uuZ;`d*>tF;x&JvROtsA%%)oLLXqAj&>KTeH;gjnR zj0k*-1R50!8!Q}HvsXd~;|evHYOH-PQ;qk}Gt^*|@-Jeffi!*hET`lMNxyAv*xO%^cziVi-Tf?7_SVhA+!PrL2 z1H;I?oNHr&XI3lB5^V|jHe~{?zx3w&}t&vBrQ67!Ua`=`gYQE_{&cC znJ?L_zyT~Hc?8C&73xxactS~zc{}+kaG8Go%xE`8v z!#Y75?lgmc<%IQsX_Ur6s3SRj;sF zv(QBc!^f8aAqN@(9+w;;2QM@)CLOxTMfd`kW!Ma_MqWvGxQ6z#(x$jCHcU!rfRGDT zr{iZO`||{jJJ?iA{BEo0&CYw5e<25~3BFT;bB;D1$v2lYA_pOV{+Xs3CrYQWtL!_) z&XuG5HYg8nagw#o{EMY>?BzJVliP)-ORWv{;lCT)FjV#ij@z17hAoL>Oq~mZD!x0t zY+pUfK|-;W>AW9&0iBY`PQx$|hVOZbIYezD6;+}|LJbA69N>b)a*T*vchXvN?BE4j zpzn^;EKL_c!k0LIo`2^1XY8|!e4cxrAQ|eMP=w^xW)nNRk_$?Y2d6_iz`@Bdep+U! z6wCNpX1Nq7jN1td?= zLGX>Tcq#Ndsz;pRA}XVH!Wo6s3cBVe33c_Hl$yYOn3#co|5_F7!9+?9{uEPUxq&gn zMa>@6!X1JWbo(#MKI?{SR_SL=CCXVJjoP#prY3|@li`~=(?{p~gu`vMQZ$-->Bh|2 z2dbbtoT0fX8Le1Y@m5=NYesW82Sz{%=VZchr^(iw_NYO-HPy6osK<>^p|MJA3>>3D)+9AZbGmyB4 zP3J-BrB_SCXx~#xxOUm&@#fzDbOoKxHvKo7Rcg0eLaGX1Uq4k?)z4t%eFMc;TW{Mo z6n^)wI0>{`?z|LTI$&_-1Zh@a16E+eioRH>LDR>7Hc?4bd2td9{_i7oGet?ZTePTN zB2(w~edofH-)^!^HW;KNL75SXF#kg*3%!2LA1VF$^4C}N5-)#w75)2^ta$nq-SH&j zDW=N2rIN=O{i9JT#?!08K+7-CfAdH&vj(C+(=CbF@>Z;MVkGJhR|6UoDdBFz8O6#U z;G@ESbSWYF;*jf?!G8lVPbS!wD1?CKp5#^YG|{nQ5@VzarVy=2EYTCmgmGrS4&fSx z-bWOIi?=8xS)&zsPhyR5{)0RRCV>^`D%8HJTjX%2QirzUtMG*zMb!_qYbpUUXR zK!hMqb=YGFmbfA&TH__vaXiXR78vcrRuGqIz$+B#Mi$JX@psy)e1|G-_Kns<&EkYSI{^LXqc4hBaA*!mcw%#znz@ zkPLms1u89455gf^CXToJatjxn$BhE?9h8=vCF&}C6_Q*ShoWcF4gN40tr&aB{X1{2 zBj$<@JVI@0scNJ`r-#zIr32UW=dfWMzHwT=cI(cA9_QZ3XsCSKjFv;o<-ctRCO}D? zx49p`)21CopNsh5+K?S#ud;h;Cl_UZ@>WVt_hRLN-^C988fF+2=5RRzbDf3GOmzbr zHv$^hKK)^8CvBr`z3-LGS(FJ}&l95PCLF%_F#9mR|1rFojPsY#^WeqMIH^Lj-mRoT z(q+&-&J_O!H*y$BQy{5Yg+41adk)9dvumBy;&*kmMEID+e2L+3>_Ya;?EuYx<=cV1 z!{V$yyZ4N=Q&rW=JHe8~mUY<4@QMp0bmLS@<&H=QKEm`Gf^A=Fe4SbF@!kSAQy~eB z+A-pqzuf9_FndrB2fVeHTvxb(Kxxc(S!`ORE_{5-2`J9`Sjg!vcZKP6dLRftn3-kE zdT9sLrl+>~2Vs1zT&b|N7UH%d^R;p=kq9%DiUf_JV~D!6 zp7o8w2KV{y3}-g)g}W0H?`(Xt@~ERGb5Qwou#T8CmtweA%Q4*dPR%}lZ-v^)^;Wwt zaZdL*;n_3z%%Gfra>-MY*zNp#m$!de6fJ*RRkp`mF$b#4{szjuYE%<8sosu`{UbMY zwIsD;IApohil`R$U!AZ+-Tlv~+P-#!{{huk+m72d5PkPouz<0a05?Fp2~cFSG2Cr~ z6le+*4e}(wpy`oKgd$yklG^O1@V}RoM2ezyS#R@Fzu1J4|KN!j&4zwW2T_@?K{la7L(6bO3N}9!lf3(n9o3iylZ45nTi>#g^Zr> zAjc)s(NivDVGewSSX@h56nM*Ez?8yZQARn$4wYL*3Cc@OEH!AeA%7~j7oEqG?2YjlLoT(qYqMiK^(rI?3?wEWU)qnP1XApCYW=fk?m9Z0H|Zz zi$&V>KuQ5BwVw3QbgW$y3IsnJaQeO+;QHYVP~z+Ihc2JUgDxD$aTo< zC(KL$&K#YSR%v5QeDcndbZ&(|y=s3ai-oNx+s!7Z>N9Xf&F`w~+CFZc^rdx1)dow6 z9}_1OCv)?Ey!DEzwNirk1IFU4g4h%w_mDJyKEtE(GD{~?{|}VC9(Z%pH6kEaX{}Bj)Wi9&Gv43G1u)f-`9xS?C?@?3Az_{su{dA zz8!Rbvd;^@K|l2Mk#Cc0LzkyyVZ5hBS(w-rTad_fP;XIDDvh=#@6b^ws_8wTsyTI1 zubY17iP&<{!@>no52G|5_pX}3u>aw2K|waRSEGSEZUwAI@lEPNp8^xcU5fQIh*D@E z8g}8DSI_)vmKetE*8p_0aAic4T)Sl;r_3~ejP7bsgDla)tRVGmZjp|T1gbu|i{#U8 zGydK=5waGx-ZA~T@!L#zt(`}@h9Y*F{R_=jU2oeq6n*!vpaCP2kTiCj6e#SuM&_ny zfHo=OcEezLf+Ev40f`hyDj!(<-*+iWvOY6sdzl^*TjV|W-otaQ`O7rgMx74xLLwu7 z&nL+J5{LKk=2!mY`@{1O7ydape}94J&*7T0XFTI!#2H}^aFAR?s9 z3p#&w5Im8f51t}ODo;@#^&aU;ZO4sETS7Nm)x0K^dQMm3`vBgoW9BQ$8QKu_yT-Jg zWZ7iZk4c3l2*Vb_9&BrN`}OCyo4MtGjPp%&jcmO30!dJJGD%~c0*ZbFQL$jirc5~q zD?vj$-M9zZl^|Ih1ZV<)k_79~s2SF*QAX7#8WJX<8)-K}rUewi&~$`849wm0%!FaK>>s0Eb{Fo&dMIlNvobp17#M*RsxJaUEf{Je%#*u;m)tVU*289 z$7-XA)FMGPZs;k0Yg_$4ZH!lc$Ig@aXTxb?Y?t0)>^Re2A6ho5%Y}S-GrykQ-T<9I zLV`zRjoQ7!@*!a)oJB0omgBaF+&olDqU=26V(Fl173X4!M%8!23ib{WIN?MaCIzVS zH+41`%;PBH0{n}Pj!?c-5o~*J<#YNeDck7SqK(SwbD`V4RUU^j-2=ma>8$?-LV?7G zv${uH3=SZ+9#uV#y$MY92TYH~{&xq+y?z=abkBKEk$rC0s=K8ZQTLIu6@QfOgGO?t zfwGc=#qAql0`rJ4+kzkGQNJ(M3j7V4w;n;?Z?|fJf(Fkf6JZW+Vw>Wb>-{qx#G$tO zKU-Ho6Q{2*n&&bQ#9Mt9Jp3-WPb6qMgkY46+47Ac|8Y0*FE6NDruJR>9Ahk| z7_-ykX*SRszv~H~V7)?f>O7tMl?%e6M*T^h+T|gps+vM`C=)GzG>?Q94wE0?cOH5{ z8$lwJ%F8;)*Hti+9`$@4h8|nBm(+3ti2%pdqo(y5(#CFYMWioiq_~g~@j)_+Gc@^# z7FI+fVrCUEJ*>Se$ha4oHuQxwuf)!pIjQD=7aB*NBt>O^7nUBH0$^Ms1njhQO1K@w zWLZ&Z7gOoNP96(?pV(RUH+P;|1Ow5;3tfvIOz5Mb0)2#PAC#%n*|k{q%&EUhJ+ zWb0|MwQF5cPNtn*=WoqcZExE)5dQ98!39PwV{Qv99WW$IgEq_109hR*L4ctO1e!X> z+$2&ZsW@KY|GuLrSud7sC-boBgDjc6=bn4+bjP1hlUdS#>j@fzPACHsd`ja<`tVUc zG4{jZPw&_v9RB#uzgfgnDHi^jj1wt97<>|1M&RFqHlU7sy;Q%z`a&eBarX;>I8)?s z{4%IfZhtl>6BeuN$L)#sw{-C^y7ucWa+}-+BbEMDa&zfb?a)vGymoI%#r3 zzT7uf7)?xns=ztX7b1iN@Fq;O!0rB&MjCRHbP{n!rm0|tOFA|d`(e1E*`Sg&;@Wh z7#^?OFIP{#f;ktVS7ZA6JqGUN@`e?&evV~>*V%G_8v`b>3WU+Sfmne`9h;&wTm%a6 zje+N1eYy(H$Co2=;ERLNYF}$m3NYVdwa0B)c4hcnDXE;^&&u+5dAJ+OYeUK}kogQmmQj;^8Fqt81(|a*Llbh4^9ZyF5h&1*P=)m$ zEe?pxoDdD>&2!73s?KnKg|QRt|E^TBUhFlCp}=rKW_@T2P7(MrHCtJU`l_N?}>#6QL7R+vi3*I~FWm)1}eOe0{pRG0XF+Wn1L8c+VfhdO2x1cx+^{VRovDq~w-6E=&b zSoa35hYdEvWI=sk47BEWO7eW8QrN-djz%fe`HpI8bxLqW6;@3r{cQCtqFQ?`G_bN- z1#o6-0@(d+0#smj6`*O-D!}u~ec3V{?X0d&WrmJTK3=vAW=AqRbGNfl-wCiup{ZI(N}*!TxlvxWS;Er%}F*ydlMzar5EWnGM&E3T~k|EG&C}1Eo{3Zrd;r z-Srg=V8j$)FLeqOaizjdhh}MqWU~x|p-(mei4@3V8l&*Pm!c?3R@4AZxrjQxyZ89+ z`1wn9sG>-+5=_N7knML{KH2?$SM|dAhsCEGzJSHYo9y9O=1Ly3J5^Rnf<(8IMir1f zfn(#OQZK+^Pwhz@uiuLF-_p z#WO=76W;2$h>E7@Ma&>WYwpwz!hwA%1Sh$b9EFl(yX8(DYRi#k|LeAfwTPxQ>|GCO_V z5iiV9X8uCk67(KuCzK?A>6n@y?gh|zGYk3g@?7*ZG`l5`@QeI=XNR*&UlI0c=BYFL z0X49a8YuGHTkiG=?oJEGtj?^1e1-JCwbmb%u40N&J-X$8xF-rgQHVtEOp;b;3&JC`G z?F?!N`gmrN-C2vq$%uu=t0rvI>ZWw4TTeBcUr;O>JV3&K2mSkar;Ce9195VY5i1%A zYr&T)H?x+Iesj!w-#}{~$2C)@#ySJvIX=QKk{kth4e2_W{Z(m#23Q_h$X5M6_c211 zYVw?wJ3s`!IxHTeGFyWiKxgD0d;EK0+dsZQXAm}9mu~M-s!)jczhXze0mWD8PvbZg z|K7jC!>s|3ebLOs>(^6G$Ku+9HrF^|NA~W&S59%!i;7&0wwS8 zd%t(s&prDRF2YX7$4e52*d%Cvn=XyixeC^%IT#*~%pn<$NBYxdX$SsBzYdmR;1fTA zFFy`EGU;^E_~Xm;o3%;8#0`A?&R=2AwJswkU4lk`A((V**T)_*JsijAI`D$1^RhbRP+vj-&q7&gw zfzXJ5TxXH&SAlYth?g^E*cn$q&v|kXoGrw{d6keFL%96=^6vif>i%Z_@YnO*!=F6U zftO*PDlth4^r@dygTai^7Kvgrh=`;-5|u|YRtDF9k@Uu*-gw69x&ouJ#UoMkh-yLv zCc&Phc`Rxk&!o7!HsE!l0KiKE1KO)m5U`GajcICfV=07VB0Kd>Dnj!)OJ|gti3%^* zcdCA1p`z@eTu}Pq0vtixh;B6ICfgA7=_U&|-oFrRa$blbU2FrX6`$HfUMsk5SX;{X zkPe}ciV12Ln+v2CAaR@n)+#XRp*j8=c5UurQ@*l2vX@%u$c=E$VmMo5c8ZCZD zT_w9kWwQzO&f1nnep+>_E`<8>8CVp!GBNUF#H7?7GJ?R9hMR6hfuCRx1D#P$+R~00=cl+n3H^YHgTh9n?JHbIryPRah|H$s=(`-ro&hZXNO?KYnS@?nQQ2_lOLvT_-&}gp-$p6?0 z6GYnXO?>M$Uz?UBa)?^LLuJ8gP1h?S9a?#}YB{=^I|||`PM@}^Rc>{EbOAqw4$-gh zV`W^qVLO7taZPTNa!JHaF?!o((rjGm4oQf=QWX~2^UdQQN^8?(fVF(rSTHiNMWh(J zkoB$u|3>46k>`YRJQ+-Ot?Z8$PF~)U;AZD6!C-;C9sV|Gvf-;?BJkPA_CY>rAt6r~ zKw{Q@6+GxO8u!|g)7ut*EVplf1t^Gy&d$&PeJl7*h2O96BhKHN2odf_5|FhTcOo~K zQ)9EfGHUD<9e7K;ZZ3S8WVLI#woPrU&_1kih1`BmT4}J*jLhtBsNd@Ww(crV)?4Qv zb&p+Z!Y~wu@AE4n6Wc-uV>%diPC6Oe#jaNGtdul8wShDV`2b~q^S`gHR^8XRI_J%M z-t**Pt}2C)AT=08DB$eX)w$a|$t|U~U|HHKLptgJaXA)kGBN1L3BW%Q>UCbb?wY1mT2miHQw=9=5z;zcBCB0u0qmb;~m>9Ooe>T9X|f63&PL)5xoJh;u199#*U< zpmnAt;Rb>Z;(*c?E3rT5O`{PW^dZ58sVxoGX%U^Y{i*9X+XJvwTo&MapI&%SgXp)b zW6f&N8}N@`Jl%}Gaa~|}9v;kQhmh6H`X}5m)Cp6u()O_vo)`SdYb$21AA25F|3ke; zd-MgTYx4#Wf1Og@YuhjofA?Q;1Jl}&K(}--k|v=oh4yJ<8+$SYML9PDSu*-a6H5R0 zofSJcZrW1k!M2pU-`CyMyj+)2q*#HrWE^2}?~A2>ywO|Ezm0xe@)3@{UuJ)HMXuE@ zyVXUh6)Hzx%4&((-G)w+DDt*PGu;$St(y0wAIgI&f4$p3ACyCrlaZcKKfSB4_OBLL zE)V?{IR+--%s)hn#8{Za}J zxmVl?tzfa>gy)RsF8REoQ(;0Zs`H?S!P9|4tiuH%{#_gW#FnzL+J~gGMiBG*V+zVk znTDA5f4PRhn4#|RxE)l}GB|jxC8m=@U+mVx4rf6oLAOWqa&i)n=)#sHDU4fAJ8}#< zZ`2X`d!V)feHC5Bve9DI!T+@EilN@HM9_L4_U!|Lx+-uSZD=T}xD`G@_8W7Ff$5jg zB^tL&+7btF&Z+af9lRONNYpjwXssZ_Nk&t{f7ccNnDp2|>!?dV8d&4JGE45?A68>| zK8GX|c0mnC^urlJ?%`56JA(`OGM&O36)=DEpD}zr2!DzG1ErDAYlAQp$M5+oa`4c> zc9|Uvx~;Guu%33OkZ#(z35W<=Xhh3#iXw%J$ zX_OUJmi==@j5>9VOhkQHu33J%6h^EQVB?j%=1wR>hPqP(MPiI>|J2kZ?ip!gWb{9_ z_!82MN-IWS+{gerp}wB)5=I&1wW2{ye>JVPMY}F?kf|l$T#<}paA{dv;MsCK-E0&<4O5j ztl&H#oFE(+TSY84Ha0fixz3dJ(M%kdU#?Kox zyenNJfv9h5dX`_VV5LCX0Bfk$e{i|G6_v{k?E^m=j(ZJxn0#Y21muT+8>$lrYB)r- z6Q&VZ`TsJ1Xm^cZP+DY0NQ9zbj$k^=%;NqUCN4n4{AL-@&zu(!i9Qa&&HDk791=?q zPW*{N@t}|wanOo(j+my`8vS=TmUbb=+26a!)IvYJ-NNB@-jMUGEfqKGf1AsT7}CDx zNr@ddw!`@!NB)`o0uJ5|GV~n^)+i`(VK6qXE_odkgaUNYRM1;}BqR6+pF|;jK zMt6pgT+Lk+{-n02s1HmmAA&LI`b5u!u1~G-+wlqgp-D# zmX=rFr<|O^6;#HkfgQK_sve#131+U9_Uv}b&~Rn0dlQf0s;a{=PZRbTI7L zC!LW^Yr`-MhVT9rI^@tocUe0a={{hku%33qLt1IO-Sr-WOato z`skyj5YCP$_L)4Uf22K^<0u;{9M}I1F`Cp5G7|OW_`<4>4lGp^XCSlKT4>(>pvirf zv2p;gWTeDGG|s^`ssiyVz<-5NN6&`PWKE1lz6jwQQW^$^GiR z6+j^C%WT9XLyLewUE(pg;blOetHcbHxBcqPwDP7lu5u|hf1VYFU3YG?wM{jw>GE0^ z@Il#!H;cS($dj8!{p>urhHl0G&LD)NR!OhHMyP!Sul+p_%j`Qc7qXY?feo@V)aSR% zv-ktGRBdnCFcAKpUvZ0=>=c^P(n(XGL*0tHe%Z9XNRx1ef@?^$;6%0q?biPHT@nH* zWvj+COOel)f4k?Nd;HStr(tSYGMEXS23)}CV>TOS)Az|8=SQ8l$GjstZ;sj3{cMuR zd-frjrHK^Mpe1z@3w9yX%yca)(>o*&?zl)zlt_e`2XSSO?-js|xhsdWhv2LzO*TU+ z55_REQFD?>o{I*fQBhuH+)!O82aPE2*eSxxwu{6-p+25hPZ;`6cNNeuVWjupX<@FD z??P(2e{`6975xx&iMvdBEa|9d9vHFavxIlUT^93DL_C z1s7H6S_sdSP85c;*Um*4#R6#cuU7#%wTk(OCO}!L#B?+Z3=b(ez};>hoRZd(F3!cD z7PMPcDQ6Sq5k#!Tb1dA;6Fc9#@+h6)N5BOwf8vSfZ963{kf!su)obbveUzb086Nrw zx3rIPJ6AADxyGv%3QhCnNQpGY7k~~4^2D-)5xbnqrEL=*Cp4MP#+X5uh#hnvwqXCz zacX<&K&#rPKm7Z$CdFPgd0(ZPxC1wPm%$b&?V$ zQ?gRDdV(IUU!9II3&JoEh4=dv860#q6@&_cE_Uu3kR)DfA-RO+0xjZyw^k?!PQK+H zypMP9aE$i|K-y!9+M>8#vNyRsg~8gbf7};VqTCg#9(@yNROjGhAS9j~rQlFi6f>6q z9WnOJyQ1bEwb#bsoK;JJ10&s%Q2#wq-*xZ+F)3!_IxCt?mb*YAA%6y}S82YR@+a3W z+yp$~1*KBUPQx$|y!$JB$RS9aNRf~VLOexJAh786=vy&}w?uHK8TM=3@L`;`e}FwXj8~&_h=b%|`8$^^tus zPRoW$E6MACa=`Nj{IlwuUrWo+f5tm;GvVGuM@ACeYb=##)KdU=&MRXy&kX85LL9&0 zWi7OW1Q*pza%EGfMbLi3aXfvcaGIB=MZNq!Lak6mvO&*kpC}iT6&_N~QMYSz-2s@~ z`A%WOvteozaF>9SebL8shR0MPQOk7p$zJ7mnCKngza<}DLAf~Xf==^fe;g!Z8?_uR z_4|jOeX}3USX*z~HWYsMuV4$Ul7Ki^n-(bIIYoCVHehInCFqM~2#iGAgk@4AsU*gl z|K3AV_nTdJ9jXVz7SH87=Q}(+^iOZnO*)w{ydyHj5kcYa+3q%5|I8nv=*7kBm(c~e zc=a;4-tShN?So(VF6E3ce+A!|U}>gilSw8|Q2y;9BB`RBftfp;(D2e>fJcejK%-a(Y!c z2e}S<69E?B@A9&ayk_3Fl8?R7u8Dd_g;WL0UK_=V3xcB!^15)a%<-W46>@;njQBN8 z{m>OCTA63hP(Wn}_$XWFFMa*iow{f~FJfE#xNIBI4@9OY%gC&;^4Rz#h{^=ZkyL_} zP%fa8J(iOVmVXsdf7&ATtWBW*mh%KToF#iBqB#jxIFY2op4EVLTSb2HW_E09w>GVP zDSe_dNr5eA>-S~Lxzn|>9ZQyBrWS`GqF|!qw3a;^?jh3wWub{1Qg>E_-ix&`3w1ka zwL@VY#9(0$lBhQa&JtCU_r37iBE+j0*`iOMP>uCAUn7|v(@aHw;e?^$*S1M@xKE4PSS*jGyU`)PS$}lakR|}u5`Ml!Z;+Sn z<_5PQle2YxPy{l&1v|O!3%_VX?Zj3+Ysl*%r`H=URIk_Pm&NA>PJbYuB5syY%;8{X zTwgq>ROfn2R2cgP%HHbf2^)qHyZDZap7@Qxd)O{soAhB;Y7Prh^p)`hLJHVgy+g%_ z-g~mfBbxs^kq4NxAjkTLW0f@#`l#pz&GLwExFO4$Y+B5I{>i8yvG;wKr|1Spf8|(fPunmQ{oY?; zPzR0%(=?bg(G|oV()hw8;2U9;o8G1tiJip`4?+L??8GFF^Pnr5G;I;8()jw^v0LfIylmrq55fK9A z3qUkZBG8!y^4HU#_&i|}(z#M{XKkEwnF5K)G=e(f;9-E&m84ukAYq1vGni9Gi&Z&8 zA_r+a=D7v}jnU;*V~`l}JBFzyqI9D-paOiEW?*8nX+#4wf6rK;(a~fQs2plMkoZMn zeks>yuT>>ySrmDB?m`oN(K*8UIU0}0cDQH7=xZn!RO}ws@!rn-l$BsL=Y+W zw&tHwHp4c}QCn1A6huM|bx?h}(&wmuKyz1YL$A#-)^O8pT^rD_vK5$+RFncN9aomc zTuM+2clD|Ce{>gAr{hwzNQKJ(?AThktA!OCQz0k|?P#B*DY>7_X{4$Nn{U@}FKjdH z9)=*xS=jS-swLpEPCcZ0qdjfMW#@W71(~G`ZB%I|a7TqoQG&K$Y;B<~ZWfu{Ln_YT zXGT+))$D5B>l*a~p6Q9MHXb@eZ(YK2k@DL$%d`6of55&-Qq|7pc>9z~1dM0l0##jQ$%0IPfT*JSUlSfNy$RDHBzL$g7~QdY+u^*{=cHs+M`sMf7J zinrd+hbtzl8?&9hu~!UfsQl^HQq4fB-Hb-5RSQsifrk1urtMhRXyLFR zqB3zlfAPOsGg9CYM7d8(y@jy6`4=(n0!iwXN$*ji?E*RrDLbn9q1rc%@W z7vtY{P`e*i?5!(wn%>S@(+@p9c7!=L=pzLpAPHRXYp7^R{jIAVCnC9d&K_?t z`_--^EeF2<&01S;+cp$__pe|Aua*!yNG}71xK6N3iVYaDAu0M|yM`juwoqB}M5#&8 z=D&}JH<1)|vD1yvw6BncWmg9&NFD zG46$NKnVIdTYqFM5PryUvLtABn27vm?^6%aXO~4EgB+uNo_@dy8JjP6K}PUWf4nU2 z;wVI`A_+k(v{;0cYMvEg?gd#EJfeO;MMM*n6mdNKGUD^%xU{f9xgvT zk}v;#d5QXq+pC**S2xoEycx{l-E=-y8)i)21=&Qa++(}^^2>g{iOA@J;~}Y*UsFh^ z%;)F2`kIJ>(38M1&2gCHWr-TWfB9QRSz^ZdR8+Es(9KgzoSDn3&|jcg z(U+T=vC>$V%kDQ(jFAWUqoc_Ld0Zr*XP~K5^L<~F1Dg^`Y@^B&enrVs1#P*|g6EfukS8}c>SiWGNr zp~C#R#vDKcP_XM*dXSRC+P8Ewg!2mxtUnD zwPT)e3}cqOR%u3U7||7HV?=+yW*f%nG~Hcc)k<`N|u--C%S)`hgsyf0TWNmMJDENui5~ zNPapPiaf_th|=j2DeciY)6ew1enkCmSZ?quzG%9P;6B+iZUFpoHBLFTy&_6auyQ+P zd`-D{KIp>%01q3X=Tv`I>CWw#qw7wpfd|iBhJz3L#bdizRy3Kww#Sx6{h&1Z!cL>y zRe1g1r9=cH{Uq@je@q7Ms(;4tRiXP4Y^HM*@B&c=u*;gF(8utVa$@Wm~G;C+W&wb%Z{G@u~KI@<2ybcwyeF*=5# ztxQCOGLDi|TYvTty;0P|q^cWiy20+0`#RO6QvyRnXu`gxjZY)adrm){WwBT{4@mHQ zqs~xD+_frMO};EkM6_wDNLm%DQ+q9mR08pP=!!Mze{86j<(*Z(Yj3M)n?0!BZ`9kv z(bS3NXq^p|GNz(@I_k)Yv;oCIxKSglxX%d)J8!zEIi2S-FS}iF9q-qTE$jj!Op`o_ z5>nniOa?y0=8=eDU63h1&2pb_!UNQz#I~ntNri(rL$c(3PNz4=xsraeCSH#0iCQXV ze~NBeQ}}9!gIuSQ<@Dh-GNAz0fA218vd1$T2Y|Xfr!cJ`P;>IH8R2x-tHzz%PHvl4 z^MWGo4EF}7--i)z7^rD;s7W)eTLCFRv# zC6f6L`aQp#_2rvR0bL);8td{RvgvA0e<KgNN)u&7*Cik^dA zR>J8&&*!I*Kj3iA%9w_J;v%^0&}g&_M0X%rHeHa)MYU;2;?c#$UB$+MXKk{tbtAas z4~jTf?(=m$tFPVlH(kJ=q1R=j$NzVrS~cA_^L(}II^{qIm5_Wr7j^nmn_IMNe_0ia z;q-0d;hVU=RV&p!irW7LabcR#9T|&7p5C(4hH3+(JXcs^8|*x_(W_64vt5SQbaftX zyuqjU-e~%MGC!I4-sy?|q)y4`Z??nvqmH>z&UtMy0PX3y1}4F-ti>S-n_+_OeP?RhsymQL)ha?Pl`XkV z>68-wxD{;-Hpz@(LeP@Qp>NpEO#t!^e7K0}tWf;?Px0S3y=Ok#UN9MqCygjcdBxKE z9>hXf+FwxljD42B8T)+a0US5@Y6S%KDeh_1c27&QGAWqc@<VWu0lcL z?x^N-rE1t4J|WN87o|;wVO@C7TUSw(Y~Qh{5;8qpfjFK-N(6nk?D2LB1>9$DtlKBH z?$mom(6zL!FA%mgKdlegF~9f#AzsDiVb%j0_Kfr^fYh3ewxDXB8dKOrL=|yK(AX5s zr)I;IZ{I|lwYR1mx0Tdp1to1Sf!t@|naVDKjhfbOJz$P-JHz0<58o|Gb}HZa(=+mG z+A$IxgH)dR052&kr;KV-k^uMLH=s7%?1wu#3=lW9En(((O1I?0}$1h;ickD z!D3dgz`eY@34+=P>t<7hcw=|9mUoUhj$3F*XUXVBOKW33DJ8uzpaDZ)R30{w#J24L zK(B3{FqH0TRBJmAqLaDfbgNminrcO)M~CBVCz^fAb{+7iz+FN3amOV$oAoS8>O>uI z(SAE0ryWUjd(UPwR9}b0{fU5nU&n`_O>anso+8aq@eVDcN!D$+r@;LSPX23+o2->k zuoa@_~vIRECIrPVSk8W-a=$jF|IgjrFW;83%y8P8K$XZmi3)x1CPl?p_ zY!XCaoVU6JlTJ!{&<}w)W>nS9;G<_o2^JqT;H>9;CcHa#VL*|Nnvm{CKLri3`)Iu@ zG<%7_fF+`|4xOHPjhKml9ajh`WRapId{Wi&4~tBBIE$mktQOK0FJx+~cdp3}AUmA8 ze;rl%b_ny{h1AxuCRpJNS5g16QCt{@P9y2rok}M?&_WmvoLgS#8PP-|;}Te&Yojc4 z(&hw}9Z+Eb=4>VsTfQ_5v73VytR)`Vz$>egOY##C4m3DeAHwMkX+QEb#oijjRHL?J zrb}hyL~ETuAv;W3^BQxI;P-t2uzq`Z@_m1PFdTogA_LP|aA)3YR$rp49e-PWETE?XIeX17Dqp0!fnBErEHQ~bY`&6k?hP3hK)%l`yZb!?271Pts}7D#OU zofJWDvBqsusOjh{USDAX`Fy`R<@HP+;v|Q=6RQ-ONDqEAIQ!Q8s4pOWHT*phHE53D zE8J(rgLbjOki@Fa*nJ2FfU!3^Ove{tDgsOUn+yhp1#YnTXK{xe&GXvEo9Od*{enz` z_X<@hE8o&^>Myn&dm2exp-iR&_54W(V)=Ot#!T2S+;!y3ZZVV`x#fxl!|+r8^yz0^ z?sbX!L*Xe_jn2hqY#p{hUs<(v!Ol6EIn#{%4q|q!O+;k(*`FdIz&+lNtm4RU=>mJN za$(2eB{Q75VcH*E8lTJ1CBM|K~pV2AqeD8qtOCQA1 zb0xU)uM3F!s|SM4lyHErkDJa$N5ew{NFDvNmes9QT0Gq_>!EHLEJ^RICUc?H&TBqq zdyf|KL&@sIOU)Vspgd?;LU13a)j$dTo|f?+Wz>R7_!A(^_`>=WTBy6+v_@00oQot2 zB-&&3>u}PRf!5L0qMzufmwJ3iB|O2slBky)h8#$G+n+A00d`uVXRDCaeY{kFyQ-*KND!Fd9o(2IVeNa-zs?6^-C^3c<@*WfTi0%InQUaiRI|*T*Y1G zFaKn0W$D+%O>Y*3F2q)jK66-&^2>Uh;MP(<1`AT3CsaTkZAdFf&d_A1(rin#=x@8z zv2a`ME*%}L47MJl;AF?cEwN(60uW@VUh)sru}dLP_5@%15^#Wd?1rl5K>5&Hcq9R1~Iba>T z6CAkAbsaeB528gz1C&A`wUT5I`F9VgE0L&l!v-;s8iOsTIX&)lHddZ)>4giUgh8|h zv@mEO;LanVc6;`pp@+-I+s|ob6p;JE@$4v)VI*E)1O0whjS(hhz3G?Z05%P!2ESv@*22{7(DO` zBCoqrKFPq1FU#Ng#%dERU7p`3bDH8G=xI5M%jeg@gV(Vx)T|_hg%^s)efx9mukLHm zDRO`}K{tmwb$PFpMyNfJxPd-@fh%BWnf0K+CuhV_CXL-Gf;b%or%im-xa&FRjiooz1d%r^5elwc}Fk>>V|Ql2iQ-mb+P-&I~a9v#y)_YIiC1@ zo?QXK?#|e>Us|NXqId(O1-P_`3WD7(EnvE)ek?G{SuSe{%ysU5HE1@{=Rk}w2C4o0 zaV_cuqf|&_yW9w|iX#PR+fz}pB~icU*#)qPzV5oK`n1^LD#Ff zgwr8E&w^|SvayFC;x1~{9vyI9ji#%sHD~0;4ci|?>BvY5Dte%NpDf%*Mw6TfEGJmbNT1R+U<%;LqVz~%;55`8?087HzFP1LSykd zNIe<2=ei36lw_@esxdzl4jTZceR{))4>1iDR!LW$393!I2mpF0Lw`A9UpB&K^3WM? zugPyKU9!!>eN87oa;x8?^)B6Qeu?#NX?k&%%E*(Do6;R_mN=!#%T{(GV{5eZDmSUY z_f`qp6jKAJmfq zszF;q9OH433h<}Op$y@O-r)CRTjOqMpHc;indPaoa=|Na=*V$oq3R#D8Xyig9uTXz zuFyz28^tBzQc+iD9e(&Pkm^+J|B(0oKQ@uBNP0mqMT<^V)8rNvtxi{rls+a{RdcGMZNz%Zt;8 zbo~Cg@%oLt7!WEmJNa0WpZZJ}ik6dwwp!H={_$71ENa%ri5jK?(Ef&6U+^f@QSNdv z1`S=x;|8(E56zDkq?mXi{>h32WwOO%2#ZXRw%kxDelMPQp*$UXbSvRxvoJMDGAum( z-ikUN@Jg;e94xak(^$`GHr&l&p5IKb>0M?!DQz``{(rMxtyqZ~h}sl?Gj)tF)gDY@1=>woVY5yZzt5XJ2&RZrw~ z3cgXQ)c20Hph^MkO16T0bi!~M2=?M|9n~m$;AO&GbYU=!S;AW2(p(mK03G%^C| zngX%J6|gVTq%h%0*@zNl3z`I?+r6Waxx!&Lf1BnsHd2ZQi~kzSGWgF&)C{|avm_>} zkB4-IJK5wHkjgr3-x$tIta^xG!e06V93|jkEE|~`A9f7{jCMw9&MI|R)gv^5o87pU z(o!UQwUc!7q`&CFUx;k^?WC0E!r#e#`z$-SL8l!f{JGuc<<8~ZfVvCv6yjYf=m|s|J9i=Yi*SZVVsR*MKAP)}4KLc>5E4Ye#-pFuYPO63N|l1x zrXUnYQ>ycU&UqNwRjVJ}Nf46G?1zp$1^QM07Z2V51|bn>lqMDZhX*f64}wj&6-c%k zh4*uHyoPHcg;>IRz5m@a7-f@Kcvb8c09Q_6BpSw>7Pr%$P9Ps;Id{g$OVZWHBsf>* z^`sy_eP71;b#$`=c)lg#`nd7);mIrE%8FyS(@bC)p!P80of&&cL=7ej9=@k};)tNh zY%G#1JKo8M-u}xdo%ye5t4Zge_P*PqW7<(j>b7MdIbq)GQ)&snX~g`fI2USfyyv#^Gz8&L->^a zKZ%@a0X)#W!s56#;&PmePSWHSp1-OlVt4 z>NzYlXOnKJY=*;1DSg8D3+uz#j2>wRj)KFwbL+)?`i4w|CMbyvFqjb)pg?M-U(NA= z+K_!PaU&UaWu+*ZA15{^~#si*h*4L||(nF;?Z4{d#)q?xbklio4q$SAl zP?D*XcXc6p1Tg`hL!6a%EmnbfjzC)C&wf;kXxEXi^Qk0~_ldh6kpn*z;UfBwMu7n3 zK9p-@KvNbXWQbJs6(mJ*ht7o1tf9!>B`;@x1SH2p-N06fmC58H9DM+g!qBv!?7!V& z(s=B+Lx$`n(k7YyeV77}#3?m8r$i^YKMG>pUhV?Wnfneq6EbJ8tXO}S)>>Lu*D=CP zW*OF{g4Z|}ld*V4-UM)?xJq%VmY5PND)j+= z>5$|^vMi76Bhg1_UW9~yGH8XU<9i5Gy&;jQ1;liJhum$v30{AZ_=?ikW{8Ig$D9J7 zW;?0sfvQY06lNMTr74;Au_2Pnlt>**BztuOe;`VJI0_70v@A4-Eqe+}z&hqBW4~Gj@!$J~v~6jG-H^%cnP_DnuA}2KA?z zLMKlpk~VGj zWv-Idn$TB-I!WoJZ#ghka6>??zRgzSAeNwH7k}(yQN1 zfn>@o)15Vv>BDI^NMNpSZlUSI>DXzLa5YwHbH%#_ zs!Zw!7CV7zxUDtDpL`B3ld?{yc)(tIu)P~?b(yHV;ti>iBPB`yTsXExt{kRuYQL(3 zTFK{PI8f>3pIihkx;+Wt)e-3&FIweVSKLQYlTfBPd%Ad_v`P47MKCx@0VjIS<1MEj zFeNHG{{_bVp7jeLgmEPdwYf1RH)d@EQUsylF7PvzP{rlI?j$A3XblemwWw>&=S_Iy z54!{%3%)yBzGaOGUMiBnO(tS<*$H6;E!i7K>h06_@}CT4o_UV~dDEp?4e@muzDXsC zeZRIaFsW7HRnMhX*_o&jWPERxWNtoWUR&QUa{-MfW}CGkvnbtJQ@nzZ zm0@wE_KkAj_d^pS`V^1;g=>=Prj}P zKeK+h)I$dB6y4;YEkakBxid8DrH}av%_*>xTwt8bR@zovY{=~~JqToqL&K|tcPn`B z&c)m`Ts%H_+{}ghR8d%D@d7pfG_U^)bWYc{iAqS4rndlElBh9NbiOrftA9O#hfzuFUs6PBw`xw+ORkT9wg{5!fBc91v_3* zG2&P6?>q(^^g~|T`Va9KW1bKrpG4zKDi-3=%tGEL&uaA06yCl{E|N<%4Q)>UyRZ12 zEkon&pQr)J$fjYB6VEE`@aF<%ZjK0t0Zu`FWV}cUJ~Kj5bOrm~QV8*{b0n!DDmhAV zB#~#V3F1}!95?WT|FI-;=5KUi0oiua!Yzhnl^ZpHwjvfC4T*<0)YBMDrbh2M>^Ls) z6s}jdUW%QDRtZ6@>9l2QT{XL=QB2_i3*yxmu=FJVrJ6rKn53pHuEp=@gsK}(g-eLnP#$c!ETi7pp$v`3uY%zK!LhaZYhp3Qnj5d&MX{#`r z8T)>~>Zm-Vxfg`b>7%X`-OW~E;@qsOVc<7+?Ymcb6KQ1 z?mrf9JP6l<)h+{{HcFZmpE4FqcmM+1XuUpPuBy{jEyW2!HAu}LJj|m0o2R#HC)V;k zRJ!^RuX2@9T@&pI<>h5@`vfNrAqe_lDDB?MP5PY*0f(g)r$8v7wpA;3mMiqr(~edH z4x=WgiV>EIC2v-#dYy(fk#Px1CJh0yx^WR^ZSZeZd&^$ttGDOGNaB?H-~(F4RzJq4 zkFWTH$Kd2CEN{RzMzv8!$li zXLtJz``_+{29Xz$mO>tcR7U5*_{P{0#y>)&gS*D%#*ed;K^Fb>k0%eX>^MNl0(xO` zmc)NnT!r5#Y^E7VPRW8zY?BvdqCO;l#`M#u&`00HJ;}r9pQMUVa)j-kIkukTS&o0MM$al|Nl-6O}0mRhIAn!bgkj4&Kd)SZ2701A7~f z#4{%n34uhD1`{D)hsi`qpf)E4*H$w}zz(5LEoO3qu8_ms!^b5rTy%tULo4ucQW2#m zjL&FMLvmC@d9BMGn>tTIHz3BV4ZZRDVb|kLJ;Lo?qzvVGV1E(E1mPZ@0Q%`=xmL4} z9W!hY73m$*X`}poAk#PJdCSV+|GIjM9WD6HDO^0&-D(%Ds5Njw+qzynv&yLC@YS9B4ySZHy4WaR_0YV_#?YXy3;xL;Rq8H8ZF7K^eW)f(QGR!64VnJ|!YJ`~< z2n>`8iP!~K#0*P@4>y4lP+y-xz^;FNRU&(K@Y+AQWxU=wW zFWJnR9%om(6)W_jw}S7(v5>7xkttvY>}2%|h9h;u{~RZu*ZPi3*;?R>E*jhhbqAo< z=R`mqrV@d`!m5yfCYOeG$z(Al$!MZ)U-5)Qy3r?e3J`D^0$Qa*ynox?yz><1!(FE? zppyz{v_g;!6E<4Y{D%mN4_CL(|B8%xzpi~98pjfKXanzgX`BLtl%>mghj)P&fRD-- zsFv`T)l29nO0B)qgo`QcC~`x=V{9^W@vt%pt}I}MUY5Jie_831$@v-i1GU>3$p_+Bs>u_}$-Wew zBJyo6|3P1rdoL11XJQg)TX1q|tPl_IuI0^6u^Hk4^1Ox}x4gW$h54A?8dJAN47?@j zSxUz%>KC1BsCl9e;1X4rp5K_1E)7|{*&eA46F>ddYHq(t84f&P_5Z$Ku(u%q*9ei5 zX{!WWBF|hE_CcdDD1g~2u#g}~6?vC;31T!TsahG4k~c!nmYSK> zZ5&<#Hm;+03OLW-5km!J?HFqKLkoHZFzs04A@&KIP%WhTOxsocz~Qw6|77U*yh59s ztCn~I%g$7+sSpRv^c1Yei{Z3uAHgxIS{V5tul17TnR?lEyM>o16x(sIYQ#BrM$-@D zNqc?-Elf0E)2SYn`lFyLkh=4ZV7gqpuvMJ{l=y0nJu^n=GPY)9KPB6KE-WH5Xtc)0 z<Z3D-yj zm`+((q4Q?YbiD5Inrz&x{>LE8jxk3r=UirSygu3IRj>)8*^xrcE{x*Ph_23IYLY3L z;RV7O)Dr|r3MIj2d{$^b{U(+c27MmEG`^7SFUCLzLZG!OkI%VBfU_(9oqgA}I@KmU zv6H#rmWa?YaC0oHD!XgI>$Xz6#Vo51XuXs)b?_>e+g?)xL@`z$Ox;Q@{v7R;+$Ii2 zXv(?NYrc6_W>>mUYS8tf44OICZ`bf96doH8PlVs+#EK-F0VZS2**O zC?eRkeSX(ocgEg@s@Ixdn-uR`W{^rehJHc);}!WxVa#<5Pb|t{Rj)SBE26IhU~Gv{ ztgJAyi!PCN`oUwu(N5YmX013?-bG~^x5Q{|>?PKZE~h4b#9HbY?MyV%yFajdHE*#s zbKe1D!;+y>Nk*OXFTMI9rmLHFSz{z|`h|3cEJbXo~|*B_i@ur9ayztRBnk1ViG zOSB&tpWMYX2f?(T67*z%y_7sdii2PGXQSU1m+}WDXFIIFbGiCcXs0;SCBPU_s<0v_ z)%_i*avUx&_+PoQP1EYGj}VUB?HPQH_=YD{-8yIV6)!<>j-)(-b?VF+(v|&~FAOER zQ8v%JFUa~?_Vs%yUI6|M8(yBW1F*facdMbm-+%o|8RQ4aTDAiK6vF;wx3pWMYiuL8 zP$UV!Uv%CT0OjUIGcu%pD_$9vE~g?ox(CVQ-4tR2u?Dml$zMQHj=gpD&Ugf&^~x;q zeae7<3dj?ETdY2w45_^%Qj+#5+0uD`Q&%4}a?iJjqLyuNV%G}?QT;e-$Cy4JomAR?%}cs+Y@pv{Wj<;F=yyvwydo~J-m z^E^VvJ~rjJKjrFLM0jBFLoaVY`x9{D=E>(yFjs2Y1;yZi>F5N(ecnhnok}YiZOPdZ zk%=P~;iRB$Mqh|sP+srjN9s0KBl~M{Dz^qr5}EOM>WVstQ2SaND*POT7L?k_;wYF0 zcdxcc1vN#OX=mJk89nkj*raD>psqm$&0v=h2qL@@m?pWXDSqe=$~y+)Oo<_VK2{NR zNlxeB^+r^H`2C*3Buz_;G|X?8ujoW~$JCCXlHk*9rjL}jsKcfZZuDm*2sB^XdVuyT z)U*?_dZi)n@@C^W31__&L3}S~%JNe!#&&YH^X$lSN5P|0>G(&U1(cB(J`xQlf?*LDP@)kDt&MWR-{YzJa9awM;{KjY{qz<;NCB z6z-n!$I9m@P3WYCrI6%q=EJ(s7{08CPvw{yFI8xiCb|;B5H2X^Z`5@XK$`u0fK9rt zdNj5#udfc2kuA+KpKknqX?ILi1MyZI>ppw{Y*blB!Q3WXkEYGVGxL=VT}a|Pi|mjT z-wq2$SY)W-xVdK?TGW!+ge;4ynRBF4GK`W#YLbsMa5kG#hclm=5=vysN@%&O!8JXm z4m3rJv_Zcb7NsIuj}88`>@Hw&DsBkI9_%jTG>+vB{)48MlEw29)AgI?Kuv+g1XoZ8 zDC?>%)p!|2Cfuc=xw=I8X%Lnl6&N|W3E=-3wYT-~&q;aO#D6!VEB=_o{HNgBut=rX z;c4g%g5y3rznT?%#+tvu9&&@akKc^pT_b=~Se>gD5QJhV&?YjBd{}1jiQy9^=56sg z5qCE)G1>{|$l8d(B@X&^85x^lWzO3KfRbeBe(R2sw4wPU#sgOb?u_}T+X0s4O#BFd z4%_76ATMV%qDa>+eX z6xC=nJ{yf0PRIV-ZM2|z$_$)X=Wh(+U7hZV8^9?uWksWocLk66x|ij=^s#X0)M_d1 zsP3FH#@5;JH$UUzd4~?}Dkk#@koe@Zvm~A|A;@gZUw*i|H`MY`&F>_?q8exWKL2^r z`k|ud0~fYZ6^B@&JOlYf+|)|ZDD`{#4o4|KZ&zUe+UZ&lGbeJgba_nhRfUB}@npxNq~ufIVg zb-e-lr2c%+ES&&u&o_HQs9W6|vxHq@E$hgTwJ0o0&-VmRWR=49;}*#7Zben8)tY)Z z_aq~Fu~kBCc79gr2s00>vveI8%PXK`e_e1XB26mzS?HLWdA;$`Lr)5pm5^0Stn9Js z-YfHK;RD!)1uZ7Hrz$QNAisa|C`P~8k3G2}5@gjFQ{;2K3*F(0Ei2KMKiUc%!#3So zt`?fV2F$71BxtiJ@AqV7ryD% zP8f5W9U1Y`xUhZ016?)g>nI!FAe~67Z`CE~0viS0Clj>Bl)9Mw1D&rH_iXgcUzMp6 zrLVlC6)b7em)a{KAF^Q3&9Q(Idds6cnV>@4 z9Og%@+&am2Ra)ZY>V{`Y#r~&E0l_cQPoUTuHCZs2h|ng->>+EU`_q*qxX;St0c0Y^ zB_CFaWjERrqjb8x|N3#p9u^!FM15lAzI!I~`Ny{P@w)H)b62t*@xqDzb8DVL1na(fPfVN09(h_BB(A)Nw@wv=+LO zxsN(4I!XvjmgtEeW!xgV1m;o=w-2RP$=l*>6-*)I5xdEq=Ifa6| zFe(KSQuCW8@rMLs(%+Ls25^%@c5rDymr%+mW}CPGI&KR$MwaC*2}*dct|Lv+Xc>+_ zwyFz3U*9!EJ5fzFO`+DJH~q54zJ@HkQKkn`U$T!c@kwfP=;Y3zAo9ByDp?h4J~Gs$ z%EdyLub+Xa7DKw<@6W~`UPj#)27{ipFfc?iLFdq$^e}dEXX-gJj42FGYHgW!4o`##(Ol^;Hp7&%QBG68rpqYR^$M< z!Y}0-HpN9Gp7k37%LtGQ{pD<0Rw7PsTIDRf6w}ZkaBPGVm5Z5}ccR^_95Fve1QiZCv@_qD*hf~1uVH`B%(et^aOJ)8dmX*Iy7`u0!1p?-6 zt~i*;SfcB1Q?e-gFVG5P4f{8SBm{K^5ZPfWoW^|dt|o9-mAPYLpz_e#=7n2_&1?~% z@6AWHvLlUtv7z`F(nUmKys9t8VqEr$D`k7n@#GxiYn}rlfDcAl3pQC(DTn?urHo4> zQ@?FwLB9FcuZZX&__qOlip#@CDDOW_o-SWrL`@Xy8i511x*8?pW%A>(WiX%>k2UV7 zIg86!S`k%mo{$Ow3H6+6-$_pciDp9p%4WU$#;E7s*80}^H&C_OTI5eF@h5b&2~XA1 zeG9iG!J?gm2C!8}eh=!qA1!69Ycu0cf5r;z?){QW2ZPv{sygakG* zRJoQc=O_gog7iX_ zM&@XpvQDlDq8QeVNT-#{CaBT!qt#!0w5nB24Nq1v%jmk~wXFl& za|4IO919lL&?R>)4&Z~!JFvEpy%2YC%Njox7 zst0`dRmz&x!a)Pv8@@Vz?|8t|M7{ltR79A+p^eRAOnyw}z?4O~HTG|ZgaOo?L45L& z9tM1N2i_8rx7mauoLtml2I<5#jFL*GH&pps;O-w%#lruRDr8LMikYFfNt+sE6^LSL zU3Sj@NCCE_t@c(^^_NAPh9lSGZM*iDuiev=0kFtqzJnO3+7~s#x^iK0PW`Gc0&a)%LBF@=$yhtg#<{!C2+mccz^-QHqUJM8I>!mJ!JHua$QPU#YEde0$ zZ2*ur1Z-4g9FH{msPQXw1mD0IAs8jDIz4MsoiPw1WubE2Vg0OYFonByB`0)^;;vaC zTSoGx25KW~DIrOS!Y7c4w&qhWBXnDiG^p&{flB?@fH3mX#DWREK2Z|ab#>0#-`^~2 zY@@DhbO8z;7X~r$6FuCJM>((yyj&!`M*xTNoS-LYRxW%h>rI%hkaYoO8o8+ptcW=C zzWjSJc(FaIV%)8&jOEezeZsE8@^Dds{Ymq_UN-r`ya4xq6 zO8*)*#07wwH8kyivXg$#wY$J@HpW}%7FzilC%<#ZFMd&BlMeI@2@;McizX9;MFOPu zTVDT_$l-IBb87Z#AfLR2Iy-nc;D+5=h-^ZV*Ix)bw91e$Y|)+;{R6Cif6VQKz31`Q z)U+!89(QvUDoRI|X!9V38g^(7<_xvr$1WL%-z~QlnmW-w_p)Z|^z@&HFLRE+ebvmc# zbi)s@Fm5kINc3YkBScd5kFp}9Vj+>yVwg$gw=6{E+`x<+UTSuBb$>m&*jjq+l`bQd z=8N`0EFPNK4FtWD*5o0FG6(D{R#Gfv*OqgvA%Gd&rHSR!nhD@Dzx{&r`BkZ2>7P`O zBBVeK=7-LqnCbAF5&|ETG4l0k%Y(ZX&ht;+_6;JLecS_d#X3U<<{=dcnE35u#gZk? zmSt&}3RC7je})lBs_R?|8&gGVFnY5q_#XsHhCEY*#E zxEEpu@!1&PcQds%mUlb$ z;B?T|R6btC%%&fe^yy^xfvENzfB1Ak_sNu?U&O>Vb+1Q5L?!{7rrs7hnNUVp#Nhq5h`BjVCl_66;XQoGSOTszsh{&;@qK=LmiMBZ$J|ia zf04)9P*InxwFeUFmZ3>F3W--!6_ap;m+DL~6{=oL^!~#H+}JW|@7z53u$Iw5 zxyrOz=Dh2mb)bZ#( z?Vq(Z4OZrQ<8JBNTwUAD_t{g)g@D$)zHm2d5@z^QW}6r=77^;HDGpL3$eN?VXvEyT0rChr>OJ!~O0|Vr1fjri`je#NFu-F19sF=zq97=t^Y&zkoGG8AK zu-r>oQC^Pdrh>UC&p8{kZe_y-ezLxS*v59sfiNM8dIN@0soY?&*(Jh52=k%nikq75 zV##C4dQIX$kS2N$Oj97i?AYSGPyT)yZ;BFiIVBef1sdvZYCJf zemk+=o-LJz@Wf{oKPBG{b()->or9GN)S@^__H+O;pFnvd?W=#xhd+tYAM>FG3UUPN z6C<}JG02bsc1mcu1&5_lF(sQ^{qd@z&4L=+$M4)V==c#K2 zd=xY?1{eKAF2xfbZfA{WihoX22YiGO!>!!OV|ukX zNQBDav3qz+Jm0Byb8ossVRq;2hVs?+#orAh9yNT*@#ZbLd+WoF6Vke4Cl)og1@PJP z{9?lA0g+tPU`&u~J#L)#pMdHo4zhPY!xtJ0pT`mx1Xm)ni%6TP(RSAn&CXevK`rwH z6SCI>f?=}GpWaRQvlKX_Y|P}~jLRg+tAJ30InO&~_S_)|ip+4T4wbWu=A&zN00Q;e zhjf{-0rU87VAFSr_qTF(dwOBxUGq<}gV`X;&E13gEo=zIugnj1qzYI%`_z$EqMhbB zh(;cn8z)R}$$bfyM{+I0&0l^BIw8wk;;@NvQ;L(EohM)RF?Y=`!r1(lIya)ic3bAT zbayZ>G4}}n-&zAsnp_UJIv_{of7QA_jY~HfIHk_8Imrd)at*eMu1mw}CWydzYx)SX z(O8=@y3Ch<&N4O<;4*^0ZVe)526z0lkSg@1ap+01W-@G5WfYW>u?}fAmwekAGgBp^0X(j%^)eGP2rY(??)&zUn9x7EqPU| z=7MGc`vnAw=j;*n1<#z-4~DjNHA^z~IP7Z4qphy*$)zmB6p<$fS3Z3ek{4m%wWE$s>R za{F+qWFN4A+M93vx1DEtx#n)F0h8M$<$yX>h_ru?B`I)1*cyf-pf&tDx~SNtoTo^K1oywx-x!<@Yg;bV@D zvxqs)MI@}Fr5wTK%W!c|+u*RPWJPP-otpQyVpSQzZpY>8aJuWJz5RFi9~{CKPm zBtpeNi2|s=4{to4Q{&Tp2SliZu4joj2FtW)LmY`j(ZFX{DBD+!5x#xj=5%AxrNJ&w zo?!aB0?pxgViarrdJ*}lOrJs>9A%S%r%>g&TOYt@QwDogawmRqkJi7mWLwcjQLqO! zP`^ttkNj?Ad$7!i+FnuzB2Q>vK;&YtzF{o*n*yvcp9Jn|>}dq^E?m>0@tW zXfkGjoiNS+5|H1`W0Lu~cgf#Q=oRf9EHpMQV9dJBY&{L%qgc4?Y)Sm`Hn4hr zc~~0%`EnsIyW7w2ZZQ>H6=?8qhC6D~G91W6sRCcbu--ZI(TN`-=YWT>aJ z5)LW(yz&y`nC<|N{qPyJJF!m65J(KYcFLXmGXf5?C~hp`jVqXGlL=q-9wf>bse+Ai z1BeFBWGoVqDD{u_P8lH|ZHzvU?Uvjie*+5ZSGLC#dAE1WMO=%oU&^{b5g+)a3Imxt zwkqK; zZ#Q6pa?>QP)o=ZoB3WJG{to9?$5DY82+t7hN|w-W^r6*!<_5uc-c2bD=TBO-P`Kk% zb!S}Bw8_6IjBh>b7oyhdn^ok}}C4O59W62e5XHX??cT_Yid^};8kyLzd3 zMc_&?hn+c|7Pz+QRg2??3eXYx@QLgF`b(CSW0qf_@&+dDu0=0P_yQ=P6Ly`)k$mgdQXY!9_vbbe4cCPV;v7jmI%XddY^}o@ z+>81j0DM4$zo%!#RDzb7OE9CZ4@5Qm<0;G>KiY_B~0pM@8@QvoBtvM() zYHG{KVCnI%GRcbj0iFzwuRt}E@PUL5^py@+0Pk%^1IfwJ#xafMasm|Me{RP_%fAqq z7$qgD6Hy6(300a^!3bk^)a zvmk-c>iEdJZzG4I*O=C%jN_(^Ri9LM#v!?oGiPFovJ0dMwhsczR^-5!6|ys4;dbVw zn&DQwVi^I}@4SrS5n*u6e}^_fXHZ%6tv8Nxs_p^&Ms2w(?LLXJ9Gj#H5o5zikaG=8 zlxN3a9!z-!*RmxdDm32Fk#%j$sHY`@HxWUg!SMfQnmFg7E(e^8>5B&UZa9NHb$ z(ZF3zglvK)Ed^5>12gB@TN4+F4ElA7u=a)5oEl3DN;hw$(Q4JeHXNjBY%m%ycpla| zLXMcPE>*hB2zjZwiw5RMPN)GHu4Ex@NXl8;=J?b7zDmU~ACGMcYEGVlJIPz(jF{Md zQ8tr(Pw|VH`O}_Kf4tc{Q3)B|jS<*4+NlrfqSB%C5 z1`2;pqY?Wni!LVQDRpowl6?uy-pA_gu6p}$AZPuAKWEaRf9t?i!)8yt)hKz;7*|mV zv3`_)s8OI(v{y%ZZMghEz5Tv=`_aIh;GG89n{tN5nGdbFR~}Cxkctt$JK`OBbk!et zTU+c|Ex2QlcR+=KUKwU+hCmIfwDW(dcD=pKK%CpgKbXlc8yPiB3?Mg2u-Qw@tAT zQ|Tu2K8Wv$wj<$T@N}K5`+d$5-H@_5ST$1^SZy%s+DMad4EJ#~jfl-rFxmDV8pB&{ z4ryJDp0tul;D;(1< z%e7RNV-j-v3de0k8k=uzb-Q32CCQ_eE=SFLQEh{R46yoyHwLR`y1hMJR>f-QXF-B< zf6B}o-tzW@)L><9fVPdH;kA>XD^>($TnUsnTk;y#B#7pPJH%+X_*V@ym~T)dBfUW~ z4BR$*7K@EZ)a-T5jTf}wXe34n?S*+k3}TTnAC$rpLz)F$E5OvM3Ar*_tF&0Ny)`Rk zw@*r7W-)&>4yQG6W@c2JUDjueiOV6)f6R&iuE7JJ6JQYvRC~zHs%c_a-jZoa$ulBw zBrvmJbVi*WsrP5}VQv3)-Rgw0<^Yzqx@w`#~VGqJ`1oW*yztPbTI@@g_Cyc z-cJwP{r=mnFUh}0J^0rjY#nqvA9jv+whsIKd-7}i4|&%;-n`eU^I5P^AJ?cRe?!@? zsdW)hyJ9QfHAW5lax5;d4OU>}tfL>0`tv!{xJdYM5WdOb&7=k4NgrLwsIUn%rN8;itYy(GUrR~z zK8(k{*K4uqZwYOnuE_zZf?(|pM{M>SxCuMnIXkdqh%!ptCYzYT%E)8M&EO^uLn*AODHnJ8nt55v>ChgI9$nB3Dem%ul%tZ z$@#2rGH6p4H+G+Ee?IW?B1s$u;aGvKEpsGzqfQ-oR-gkfQI_M5ww$2i&+?^cDb{OW zM<^b7Yw~c(c054dmz^ZM1eteg35S_av6viIx7GH#2{@AAv>2bPS7>ANev?6}yX_S9<0^tC&{If4*E5$xlhDQxBfKOscI$ zgvSHYKwz(SZvc&-+^Dy+Oqmi>NHG@M7op~LpC0hhXVD$~C;)- zvXN%RKx~7Ir-kv;Hh!F*{|tqN^teAo#UvdGb4H!)))1uiHA$?s>iYutcWWPqc;pc- ziL;8Hpw)*Pe@Z4fxR`j9I1l^S2!kW%;wnno9qhB=lXDl*B}&L?IsGiO(F-<|4X-;* zjHS=Ii$%4~`KQcLHTBvy#ht>n?U62qGb(CkkMP(T2Hl3UtWnF=3K^LMocvu^)RgcY z@rnR!Jy<)-2-1?4y`NRO&b0h+Zh!*IkL3Hb_bkz9fAh1;gcyH5PNU#gS9Z(gibUZq2@9aF|qAZpOjy)IYSql}9csPuq)UeY70_>p7A+((7!)4*(dOh;=Q z*j66s5Y{3J1nITO0Z~t4xnO%^W{S(9JBN9CvpSc5W%I6{%&X59wP?!GdP^gB`q$KH z%hksze?uMb&|2tkm;@uYsFwjEz`110a^fFbt@$jDLS!Mx7vM+*9J2`XH$+^OIrdPs zCW3oS)kD+lE*B5}g%6gGbmtV5FjpGXP`hGhiTR0P4r+X0oQHQh;~jxB0X5hArSTC7 zJ#fTpJj4$Aj2@@5`nXM)&%n@472LqEBm9llfBYy^Em8L~OLOw2H>)v{7-2FtjZ-6h zV!Hd%7X@s=DO+d@203i8NeF}3zqT0Zf_U1bC*LrPgIiRiT{K)Dz&j{T5;serlT}gpZ zfBs0Roq19nt;#p!`j9wB6~?Y_+x}H;+5E+0+$jIX6{JitwOpfUJQkbUz9$qXBZp~D zac5JV3oL;qGig3!uh==$*Q)GCvW%1JI-*6(e@Q!?G^KQ6t}L z4Pxx{;0jV8D@usInSw?8_6xyp<>$R5f1({@(=2W^z9I2iLzk5uNp&qamx4XmLKzm6 zL5QMQfq&1W0BqSD{*%upC_~Hc7TaT_1kWLXkU`9TgjEs;L0wY{!i|xA$ISeuNhH8E zhE{fjrMvn5XJtSqmE$1|BP8{#&9m$T6{*fYHUQ_qo3P`3%-`;AY1*^y9 zFA!AAL{3qd)=sx8Gg;*ft@7hfd4 z3EE4Ky*#1&7Ru)^@Jm^00J|V8)dNOq!rp`Am*Z>3MpEzpb@08apm}zW(Z0E{eYX>en1?<nkzW2nFMp+%f6>d|TXmh@6aQ}p_DWaA92l=sP&A`d-NQ?^;(56pxxt%5 zbc}84m0aM3LYq_zhd{pKe;}{u?e>VwuXswQd*HMrhW|id>3VenOfv;^_X@zTFf=wD zjuNR>7|K?_@_+U}YrMPjKiyYtZ`(Ey{_bCK2;5rg9KWV+5XTPCbz6oZ=!dk}2g@^L ziLwYtlt5BTg4O?hM^UmV*-q>X!(J315~+vJ-92}t&eu0-m^K>Be~pPqU5~)xHj9_p z>SOZgd4u8Qg*PO__ZQCnQye7h$@xBs(}WQw@rj8fBF-&|Qo_fLMkZdd`p1OFu9Sp3 zpEH?eax?y!;lBVq8lOgdFF9o^=PRRL;uAd@H{7L=-1Q`Qkt+mfpMl0{L}FYezsi2SLU>NfQQw$lDTV{Y7V#tsS#= zZdQAzuBHsBIG>uZ?HcXldatJ|)6+UDCoXEkNzm;$ z`5osdgF<5%b$T86ij}8>y}Ej!z6>oJ626&2hgbO=WkM3y@1V`a;_inpx1T>P7WTL< ziy%=@5|sfSA&p*8R|c-otgL6X0Nva`X#o@4Y8k%J04xVpSS@g)d7;(nb~E(5q_qt; z!*z?1hZ8o*f4*I~3E4iM>X4kkjRY}#TUWizU&CZF!C(kOCLN9wFR=jB{#ul?C3ico z^)@(?XT&}fj8ha_H3wA(N+{YwR3&F9R%!Q`^c7X|zsg@(`Tv2`8R!!eCo=Wbs3)$i z(gw|dCvowp#W-}%9+}aRJ`}rbL8p z1O!SjoAvN0zlJ`ZpI&R;hFKrS+tC0=iVZhGUyVn-{B=y31`pI2M+z|Nsj1=!ClW`&9GPy-v@z6H&84TnI;4&T0QJi|)!l8jYJ zZ8(SiJ|9Xy2Ij&dvO{>Iu*v}YhIZz)-aA`XWe_C^FVyO8xCR(@2U_^od6vJ*y{=XN z5#@V_y#jx-@|_>&&-F6Slc`^+boP6L3wUSVe-3Wd6gQa+tk#=OKY*X;M|G|jL|si# zxg9)y_gg>C?A>9r$J%?@kPpA?G4t$UWG*(A9(9oCUx8mKHiMb`M7)IS&hhj<`{kc2 zW%1##4gcP5R$~k;Ue(0v=N&Fnf=$zKM4ont{^+Oe=f6%hH8=wkZig0rh1-H@oKs-?TY4^(>-NoI{ zd(PD?@C2VZhaw0CN3P9?E8(Maf_{jyYgv(6Vf8m516OO5&PAldNayd})%>MivcFSq z9C-%Siq5`As5BGYIh+Vaaq+sgH^Ds?!!$21<#SCxS9%uzrt`^5*P_0w6lC8PfBw^I z13qZvBL&Wia&gN3tiKkRCzL`X)i?q#;xwLysbm^2rE#Ol^Mf_30a_yYu(d+^HNv6w zCmXdB3@MWMX=%d}^j8S-=%(m&P*FF;AJSz$^8L`Y2|T}pGFkJOZDIsxKnX%<(aQrGC5N4^jJem}?7DcO{&P$bu5 z+!KQh)!Ru1og^(|wUor-xs~YNb?bq1ZhT~1MW>!_*eNO%?&ATv}ue_XUPP;lL& zA_z>d1n6Qs%)xFIde{fsEViKoHW&6=vQRo^VRIAe8dT_;BZ9OW*rCaCRnvFsR*?o| zOMAk>htL-zB=(kFkkhcn6NZjhm-%8>LF*1@&>ukS-u3HZt%kdf&4+QKSR~=`sv58wOxMau>de9&0yhJ=f&c^b*YFwF`mf8JbO(F>Y5& zT|g|0JnOHXz#GY2WTx}~wr$5!3i%pc+wlX%Fm1jtj#2Hrl8U9)f9ut&-WESvDvr~$ zq&@03&nJnJG~a~ubJHNXVS#z$gmx`Md9axPCUZ!WHGzI{DEJ^NMVAk7%;eAgdp>3{fL?0nD@6z^8}``9!%-ko^vke*m#TrxWrWR$o52C=l4E z_L#09!QPK-9xmmKY+&$Q!N2%(>^@iA`%na-NPfmtAU2cH8gyI&IR_t@KWB*ZG4-$u zh0i*lJ3xK{hF4G^u`Jd4%JIR#p%51s*2Ed;~iFg2%_6A%f>tW3mte@L3N#1x$)F5X6iW^W_&u||5y zs#Yar%1EbjsoSZqW@+^c`*bh;0)NVA5u}BS+-Lwn12r_ zx(83^#rEW58do6~U;$SM$e0rZ<-Ze<83iJTfV+SUx{BN17~0S$P-W0@L}r#XM+sgR zXoe|{e-x&u56WxniP*f6bs{oY^a&)lB+F3>Lm_`tYCUTADM#WePE_V7-Bn5Es@V+5 zsIsMy;&M|w%mV_~TQn;}%`G|=x$=%7?`7yzJaSAUJs)z!frKIGtwCZ(GjCc1DVKz0 znyeYu0jcB1Ce?4!j3jGvjHvfxdW8wW9Lc=we{r)14z}>LfzPp2sp)7p=%KfQ)Rhit z(EjQ_0`~%PKz#w$NPsCqbPMiz)8j)z28>_GXfp|nXI9c6Ln35UOCfiIT3a-W>9`=_ zbpu(RU{oXF^7`8I>foS;S-Y`HWn{i+lTrSs9NReo=SEU)-ZLx^k!BgyIr{Rj5cH%5 zf6QX9I~Y?SRI8#zAwE;nIYoH79Poi@dJ@X z=fWo*VsF!0xW>Oea3LXZN@S6mK5h3|)gO&+s|f|qbtcusp&}@a!Ej?@J7k{_hkw~; z9rk(Gb?_%$P3Ca6cQmeisZPeSZZCg3e}DgReEqxg>&^J`IN=$RwSwk>n=M_2yojk=F` zufK_kxi3TME~;%ublzl<&R5D?Xp;(@9N$%(%VD{Z9T$Q*+>37K*QBD4^4(6qmyCV} z9w0lMGuwF;KV4e2fo&*OfDFwlvKblD+w|F?z5^-8#^9IAeg+zU42DGPtdlBMl1N+p zsL}J-#PLm{Xy1&rDsgoshq-4n`{8&xIr(|7w3W5fGh1@b03?f&7P<)4E^ms(mY&H1 zGvY&0ic12N&HRvhroF^2^P`3>YV3O8YjyKRSTfO+HNaz*Qu#tfBY(p#MuM&<33^?+368`jz5?`h# zKb93AE!Q#lQO^zz3nph>eXksnrO(zSqhHp_t4O8fYxL_#>N{a{5fsxlZ{S^9?q-$w zHnyf&OZsboZWf>}=q8|c)pcblp(V5PGqPk`F9?|3gcH_(_q^N7t*R5OUy;k~ZI$)a zfQqhGPCNA_85tChoxcIqTkBKXND}|fUm+-GB`P+LWcO;1SBel)p(<>0klU*(M5%;4 z#wuhzI!Vf4bQMJ3WGQ~^GKAKjz zfZ0n;KE6v(S*JxFo~9V5`SnR&PV46Blc}Cf^E#cNrxJW$RFk-_Q5Alg*1%x%{kiF# z*Y_D(k|tGd4T_PwyKrpPs7nC2&# z8axJneaytT=~V{r8zsf~CV0GHw$S7f^_S3--ABD%K_4tb(QqxV_Xq#9PW8ZyLH^Q_ z7x0z5Gzb0V2`Wa*OJT=@b!kQNCsy1Sp9Tlls6MW$qGB_H_1$K|gTm}8Q}o~q}Iqo>m}uJx(#D{tk`eX;vTR_!d<`s}R?JLTsIGr$pvi zia_~?s?j0uhoAz4q#8V53;eXo=FgO|j0GWM3hk2z(M*F)le zqhWsTA{f=O^M|82!$^~y7&@P3nYX{c4{ioSva2|``P4+-+{mzcLp`pFTZzRkvkPsj zYwLdcV1;Jj>o+KZ10Aq9O7@0vt-8fa(@Q%s`o9P)-i52I|fv(w}hs!4?;Pc1Dm z>Ue)KnCHg6tVN}{FsLpmIy z+zy^505>a)>9jN0=K+66iO3JiE6G%n1^S-C#Fr|aOt>t&_63@B0vB$iT$T@GN z_S=Jph=#Oa)`5vxL4In1LnGXO#)iOb8V)Qqw3=p4L68(m5eT2|-4b8vLP&q@dNAKyFcvj`C>IUeaFnaozgpcrK^Vu^W;HCP8Zh`{<3RvDRdJRFVO&-5 zeKbMUH3}|VEMN9T3LVi_x4MXkB`J~mX+A3ab-glmYKI%!o^KSM13_bbjuUlp`fU1@ ziw8{ms-UR&+T|4lhb}Iq4b&vQ`&T-w$0YXQb7PLU41Bi#xh1cE0Sx$?8*~qfo{MUV z=3BrJ^C)1Tdj=VCHZ}WoB~$`L8kXmy3Y93X1K%UC)G$5pBpw4o(PeOaaY;!*=FRI- zu;zIedtZsB9u8jMuVS@_y-oh`(tCl|`jpAOV6iK~i)9u87TR_E9=Ia!W5^n|)+^2B ztNY5{kM_&Y5x75pX%Jdp3=Uui8~7t}(Bzx@S1GjY6yUo;K?L*LtbqL!W0{URWt2!N z_vusL$mH(D{XIJ6!1p#h8%=oZ?``ri^TQn=$`SBd38&QdfAXZEZ!}10MY6GH>=qcN z=xCDAGh0yhayveDqDRznHX7GP7*oKcRRrB)$SKm+xe3s(z^a`+lNT%EOwg_}A+!W$!a%#ka7|QDf z(LiC(I`~nKr|6~3xXA{ zlLFUgC;>pr?vF_+hK9eB9e{#r#@&`fCJX#<- z<`{j|3zH6Bt^mDn9tByCPe*oSbS6EXiGJN$^Y*$#?MOx!Fh7C$`v=~3AE4@PD1Slh z%Pab2#J;?@W_1Qb0)Ibm{rztmivCdBEtT6;Uz5Ae*233@VHIfY*H8S+AjnP+q-U2DSy9AFmCw%$lJH}yR$6^ z#;LbP!&Vv#nq+*Zu{dUdu7l{ti)HD3ofGR|nqa5Y0A; zGx+jPi^y+Prr1maT`Tf!KbzVaFs_T{-~Bg*mRplho7&30q-@(xE#fu zOcp=Mm|p-%dTegotF&QRqsc5K>Iq?(v}4!;XP`!QFMpX)OEOT-Ny|XsxHF+%*R>LT zG^E&WTP&nQo)&qb#kSa_0U~so1P%@jo6)HL{NZzS{OKbVZS5=J>ftM;_poNm8Ieu;JCHCSv0D7s0;O@8Mz?7`EN*d>lo3#}T)U!{2=%e#u9dNU zG3f=?iGO~9Ccd8Xn`_2phpM*bV1ud*P=v>{NS)ah)%+SmQkok8i!@}MxsR3nkN?D$ z-6?4wSc@(;)S}y@$Y))O>nlRd@6!p*((#=N>_!2-xMg|t6bg-ZP-jS)wWI!!LL4J> z!`nX^sS97cW0i^y9lZ(LR2$RCb2i1Vu4FiYqJPIWUa5s#AP0jSkfzR(`-4P}&2J5P zHYbGojCT!CX})EPHA(>&S`E`Yq9>REoz?d)pakes*~q`OZ{A|)6{8X6Sp_y^nM?cR zFRT#pug)RdqNE)a)kTC&x9BV4>hniLAbmXJ(J@paW*cg{wKPFE_ruEn0JT z{(qid;YEoIDqXd;lcpu1Qnyb1Ftt;=ehN_q z+;b0i9-k)nNw3G;1<1tpf!tlB3oi}N_>=FyKmK^)AH(s76X#~R2sm3hpZOx;44A?Z zlRO6J0^$V3sMqsjS4#2)aP?O%7Oqkta(^R%Ck1RSiSviM7q8y09>FIO(Sxgi416AQ zA<2YHsTaHcPihe=V6I=G0APBsggEApdgR3^==Z`6@dQ^7{iT~ZJ>Ewuv&|uJ(^%2j zX!|6oT%lmDkE)w|o-&1o!*_)t_2S4ULCSm;aYnMGhEyVAAsIw-in1i5XVv~b|!YKzeBu+Lk*0Y)~vxq=H z0#qs(aU_PrRABUna_of@P1Ps}CmAm`8A>ufvdK8eEjBtG*$(SlC8iM6S%$(uRHju% zVy$B|^CMTS3?+hNx}fVIZS{^hYH2h0AyUM!NQ5Vfdvu;&d zaT{4nt%6tS&BRRRUp4jAb4E2eLuqS1svkSQJxp7n7I%=@th3Q0s7t(P8g=y+=i}`Q z?}m3ld3mJeUaQ`3#Z+x?+At9Qo?mg3x+X}hAJ$HqU~NTPC}?c0Ab;Id5fp`R3Dz7t zvYk>i^}o+CA&`^}Y0|WOfW-Im+&%Z4KV7Da)UsHRpiF}h!S83uEQ_!Ba~Qrq{dg9h z;^~JoZ@fw(&Q{(vPg2g1DgDMIr|9*OrYPE$mC3(|?mmZ@D#DpJU{3)h^NxtKM0=Em zwiVJqN^pZ2#cQN=tbbM%t)CX?C(UM*gb?a%3U0c+&co34JHx^4S2zcoVx;W$+EI|F zKp`A)lT>Q+#ExPc&M&~8V-#dm*-fx#uaAldbIvkK^^q<#X68U5jasb=vbKl1%pMm> zpvtIetqv8$chyqX=sSS*5QF+9NKJt0El=)^-I0Iax$#GX+kd`mz?ni(wO!r0eQgpX zUeuz7-JZJvT9X-NEX)f4-#5I9EL2V)M6jx`H*J`p^&IktMBp6FNfc?TXZ-#A%PHP} z;7U511dS$Cj@5$5cNZIDqp_1Vf7C+oB`{oq_YV~2cv5rBROHz10&7BpIY$YME09^5 za-noF2oa~0FMkP(p{Th9p8ZyO_K6;#N0OBCIXbqNf7$xS@S^)_muz;; z-R-Bcs-vwA6BIGlRMsrjT%>y0y96<+Vo#k0w7}%634dRp$^@%{AIRyJ>+jU}s7P0o z9ucayc~kptHO*~8=SZ_upZF#ZVZKRaoJyf=?;j(wLV%SPCV9YgmuNkd&S=zm^m~J$ z+a382x>g2QgU9+|MPWH50YJGYD?Yg{t&BQMC4W`BRN8BpT&h1@d zy;#2hrGHafOT#c2eb2A>9Ft|BKDY@&y@29SkiGb5rDW;XHP|L47q=q&@22fGcXNaJ zJ>~YDlXFgTb6=zdA(G{23dRwlXP1xM_(4rMzwBN2c@KM6{qU{K6D7;=QRRh_D6Jn! zqcW^kawg+f#bVR}A&NwefA

crbZz6tm$wD@8cp`FyX5NLvC-HkHAA#svdcZDe89^7ijEoEA>a;2kN zcQklawQVZQ`Q36KZnxlPJ4sSzsOJ!J4DBkvO<;}IX$is@v~-i@y>9vF?jsoczI_BD z0e^b3AHKVCyegY&H35l}BXTSvOaiF6V%3PH-L83V@Syi#eIQf+(t+^o@b zfk;WRI)PIVEOnXF)*(~9VO0WG8!{WPRi7oUDSNS1{1mmFYiE24ZL?VG3RnR4QQ1Ev z%3gw;8p0eMN-+bDvjd)L|DxEQ%6}h&>%i`m5NI8%7We`caG?R`OzG23w;aLwab{6P z5_Ky1hNHcqabUy1x1!U#v&%YT$1dwiMyAv*1~@s{BC4?Z5K;LwBlCZ-e^KKVJ2(Eo zYzslvd0~A6olwCF!Y~ZI_bYnvFt2WcP(e@>1=+>xK)Np53Tsl<7B<9xcYi%h5Il&v zB)s?XNZxj5Tgw-CQz@kDthkM)CLD_c8A}N0rwJW(5D_D> zx{|D*7mNk>zscOie=f&Cf%Tej_Q}bgC}8y_1k>oDuj8j5hhJuxJs6+LhO*O&*8x@B z;|=)4`Ceng7cs1*_$q6q`+r3?x#cnOWa6Lf1??K^QrpV;KToloA(7nLgphQmV*(5i zCopv|HBL@DnDNNc+SVXTu6Bi?Jv>CGGkw55Nx!{FT1hJz%k;FFh9B78%Xh!+e*58g zF!CSUQjpihZp|6<+;vDIF078BAGbY6mUQCsXND;0{j$&bBj_O z4to(@L^Szb6W%%Y7643qYzE^h45lF__kX-P`2ool$m!NH6jhS_94B`xX-V1=a z#tSR7Xi%4{3m;T3{(oQip!^BAOifV2jO51)0ULzwe2$&dXfnZ}7^?{|wt?Zk_exTTQ2pZN4i&8KA`_|vK5d1Bo zvFF;zhGi6eIr-D5dvVzrbvu`z2j}Pzz1`nC5bHws-l7=oxPLy^VrJ|wISt2o!;csJ&e@>X|MTd&b9K@`fv@QB@DLfp zp@ELkd(=kz&3~AS*3lHxZ#WzW#HEjB1LQQZJc66Z_5fvOS(1&+Mnhq2={j@a!e%c|1m~fhx4;M^RilP}a-%L1e#ymEP7{L0v zUcpMWDzM!a+z&#_ z1*@N)TJ{}*d@@U9*kBG^K?`s`Vk}wIG!APKmnkXRZSH9`LUj&Ii08pQ{)p`$6c+|EE^qxlr8rQ-703JP0cuW-=nHtzZD;G>@UPL3VlUU=r`yUF`5ZP1<6xWA+bETmM?i;bY!eO-yaH+s7x^B z`6ZKHlzWwPPQDH8^aDfvaoyu9Uh^5 z^&nH=mKBusdEHj3@p4}2j2TNkCRexEOye83B{B;l&p~61EMLU^_^zvof{+cy)`q~` zvR1QeG^$w5C~J6!6K=Dc5}^+5C=7XxpI`R0VW7QXIBr+Q(f>jww#Z#_@qZCt@TZrJ z@`RFHLfV$+@tC#4mCAG==L%6d23Ffo3au7XAuy&)j|iz$G?MT_(*8B&XN#7cMtb7rIyF4))pa@g4aKNy6>9CSnmgXU z)G#OOS}{+Wc?Zk0$znAdM}OOghbij(J%_kGNpG7bp1Uw(9Qjz6B9!}X;-On~e4Nbd zLf?N*=$USBM%)ESRSQ1uLS9oVq^#M4cIFmqmh6=rYL&Jn6N%c4P#!p#3`#M;Dx1M) zILc>HcjDZ$d?x546fal{wuC?^M^!=^Ab7c(?|c@%Pf*B`nfYuC6MwnBG^6ZS$|6&q zlsHI1!j-zp0*||IE7io@hc`Ky`)GT9zx;xX^G7Jh4Bq}5f-JCqZyJM6|I6sA-}~G@ z`C=4`qn)hcG40G3^bvlX&7dx^*`>7cuYdkMUz`-S#iT3SR_@7T`G=t`Q(|8&wB<|F zS>k>#kc85Zr;BK6V}Bez2=Al=L+(A)DkZnLRb7{-4D@ZeBl}vR1Z;NErX{`hC6k`g z9m^+6ti+rwB|N-l1l1G^n@E@6>q<3OA?9YYPZQ)#y7|-4|EbdC1ZR~uxp8|UZS->Y zmtAnteeZo8TzwskE_?kiCtaNx@k5NunB?c*q&HpQRp~-#n}60R3+pu);y9FNN4Bl? zLgkCa`wV3RFLH|es`?Q^8;S@;;RGsW?;n(>0N=f6Rl!R3YKXXeYn7B^58*8ZgsLPP+cj{VoC#v z-UqIeuYPRE_q@C((HKl6u@}#RDsXspel_a!x=kcaM{j8pOl_#>8co#N&n1p+mq1-% z3N$x+w`(Q~!My&eBwIA1R?NbP+qXn1C|_ZGg)Vc6tbaJ4*h%whi6C+!;38#jE=Nn3 z&deB0Oxm*r@>Iox8kcf!O_b=}lT7u34Q7ttT^~1CBgh^kJUu; z8yM&3**xd2?|?Ta5B&C&C@avVZ~wlxXDovL%v&~=vhtVs*=qq|C3y=KI!Yfs+`J;U zOb6P$nST>0^9BzyGBs-%K^J_zC2y`W&xbe;6`nR?mQ(|G_>o=xegwsQX6%GvF2i^5ORVG5># z0G?y(3HLnhrLFg<)YoW%~0^P7K-NCOcbAOl$CNEGbMKBxC+BJ^>qRFK!UD?o* zNj817dxYMi*RO?}eL%(e7F4#?_zj~BtCIF7Zb)cXhKYx4h~_RFX8=ZvtV@ZsA?#=l zs|A2>vsB1?&&Ve;cS21;Zxa?@Ky zkWJp7bLgvGAU+UqD~fBbr>%bjtyWuW+b|S<_pi{v4-TZzEgg(z?O4~246-F#+dUbK zq8_ILSu(n`H6#ChiWMhz(^{SvKbT0?cYixNw({{)exC;c#~G*`6F|wtWDB#r5Kn}> z8+|w-BN)9uiLZ++6}*VQh%6TzxVFEz5)9&NT`(92fl)ocUxm!D)*$1V(Yevv@i%U7 zsWmk2M?3+RTh_T0O9@I{VA+$%`KpF)^uOjdoO@(=p|r$ABf_v!$UQIXi)fZJ$bT$} zLh*t0hCP@{Gw#0S3H}7gUb&yso_LZ!BLVB%cP|tIyzL2N^wvs zIy37l)b~^!ox6wVtZ8iZqCF0eQ_3NtT%(W(!`HaCt;9#?kCJMLVw)N8Gf?j$A8boC1@i{r#-fB|E-7`VTPq_t6P^gw4V!wm!O7d zAp}FA^}}rCtm8PvOxfltL+B!3&naN(>FMnDW`28<{Fwdv{(0J|s5O~NVdzNx9vQF0 z58$Rr=y#z&{|31bit55`DT4=K9;pUugJ@G(*4Mw%EYBpG5Kn|lAVS*yynl<_M&DIq ze~ulrhH8_eY6s~SrGfAy*`6&uzC8YO3WaGk=daApN)6@N+HJR)m#P4ppTScU$YcFXgzj<%^LT~Pxs!0-p8hryA)$20UStuWP zr}gFRdah?UyPB_8`?_G-uOGQ?n2;pCk!OqRmFz7plEjdpD_V&|<$w8mn|vfHK26B1 z(W(ff#V{!`VlnmN43%mU-940ew&-O&9@Z0SYrI4(1?OO|CTOva^ZEf=a3|@Qf6zJt zV;DNeZVcLjqjtIxj974t(GU)?j9>y;Ou9>>Ldenisp|HQw?oN*fBQ-NJ)m!kQ}tcR zv4CJj-6{&!PUA4vwtq%yvH@#y5O&?!u>8{GIZ}_wzr{3DVO-rKl`-4j)2_vZ!9XiE z8hb>#u#V?3ygy$*bceWoF@$OSGh#0XYWa%+xN%&%c#kUqC&!i=cCq1nq~Si_0O`)f z3pOX1JQ*^+N+b1|d;y(|v5Epg42Ju8iYczp_SOTzlLH0uDt`;x1sTWe-r`IWW)g4^ z-`(8vhVSz$e1SwFm1!HDG${kLRh`Dwq;XkS$aM}RT4G!FF(sP#@3SF50s-1i z%vVu-eBS4Lei^A$1%Y4%7{xe{=?_~x+4(oQHg#M#g@FyVdD4i`B0_hm9V&djc zC=`}!{eSAhKIIuFGb^}{noOtMr3kg<7+wZCSr^(C@s6~PK?X$FJdf5in+W{rV49iU zuwhq!H5w5C&o9W?>kz{zK19$y$=m;{)}&P??ICQ+-~ggPUBB=j9?$tu)}+_W_!{FZ z;=`lQvDx>=2~er7&UvCKvKa~2JrFj)qo`)%j|Q|_9QS|FzP77|Pp?G=gKhLD+)<`A zE2lpGrhJ>*nbg2|O2X=uh6QK?&6hWXx=C|-%#cnd5?GSK&_lS*0Li3{#p7-$dqbvF zUWVOnv}NBvt6d&?Xlu<1(zrq&A-=z<*lKYeCb}-&v|6>~22(Ac-#EUP7kAhl3of+= zj(O=+3_^cGHeH2m?h0c?@~(S!p67sf)_D-eLw$`FY}!`CNVx;W0~OLEAI@$Ow}87l~)aFs@w-=xTWIN$Ey#7k4}Cc+y2 zcQJqb2|y{GZyf}ml!RYBhEZ>h{e-~N{Ivd_vQ3038llP5baKr+|BE`vZlcgfK^FU5 zKs1~A5wK@F;#893pB`I=bpNab2jt>r^W?Mu3KD`ne~Iks9f~}PdSCDcjm}UH^qgU* zLP#e@C;aZTBqtzB8h4%YuM&nbk5y&D)c1c#hfbF5EY$tpqwKp|HmaAi>?f#+{>EzhVJ#!=U1-gG1aglKITONs_1%M4a=$ zizx0Rj}UKDi=!<8Q3ck+vFgg0U2|Nvg$YRrs3OL2~*O33_%5M+mzXgumi5&YkgjrS#GXPlYT2*TzJ8fWvE}glrRL>CvVzTa*-15Z!;imu{=U z7bfND^mwg$qUaP1%A30Pvn5GxALzaJH+E1lp+$;WU|XN!IS#@Y+)hY-g1W!a?g1}e zlCRd{bC1T_6cz}lu*bQ+pbw_rVw;H+DGBs4p7Ykx&SCm!&}y4HluogaKoO{S8_wCX z;fqNSfNy}u4Jvsx5nc^1EvtW;ZN0@6Uf?xB zFW9nHun+|}}`mH&C8mJACO>?(Q2ry#vwxyM3A{h5)NTA*L? z|DX2vV)o*p>4h=13wSxvG%Tgkxu_MSygiZEdEVhUK}=giOZhMvRJ;3!_E+e~D>ZL)+&4SMMk zyM)nn&l$n@DSX?f-+K;UDkxOVLdC1p<<*<>t8FatWMS<4^VIPuQ%zgN6y?%bC|xm9 z&*(A?n7XbPioAbFstrQXJLT^UwZaM(s$k}KOgTiTLrhK}3SN*Ti|4k11QeOAdCt1| zIZAwM^FT^Vf&)twfnABc1&9jjt(X(h?9v^OH{2Jzw$I%b9M&uk&oC0bMqlu%j<{)S zj<6l1^sOA0`<8q*ajdE2Qug&ZKokF+K}iO*#!#!nH|LiLQ3eYE`j-_^1|`S;|8DBg&BeFe8$RB>w<}!h7(;2mJE?#_&cT$SIoLs|b-K+|3h5>jx6#xV zM{%^qSp=l$(Ay5g$@WGPL7y|GG2VKLf4TS4Iazja4depN&}AlIAi&CV@&8BhE1bO; zk8+{xwBmI@McN{-zu+FLsokRR)N5>b5~q9Fz>3HEJbCJh+GWn(>;u(RU2obj6n)RH zFjdtgQjwtTq^b<6wqh$CB@(c`G$=B`foO>xIW{Ar{P)>O2uT$B!Nbt}LUet7f9^Tw z+Ly1l!6Hx;41E*^&_=*|`Qd{<;omIzC&>d_hju5V_ z6(CkX-6doQoZ1PiLd+o)%_-q{e^%O*;g^XXmr6X4 z>y$0ru-=JXkmt~!1FVlbtEEr{ih07fH$YX-w-pO?^W=+ZJMLQ~37^SayEOKaM}FG$8UlnelY6LIkP3(9+yJCFOD*pqUQz#OSZJ z+cAosLzOG$pp~4IiIW`8f9AiiGcz;Pic|E+Pwdda2!p_jvWvmcij{@P{>m8w+OoUp z8>{-aDtG;@TtQEL5@U-(7l-vHG;_y@`f7ZG%sFBRFEw@C9X|I4cYUk-{Ih>IHioJW z&dz{V%QAi#gOSniTEDu(QO_8N{nuBZxtQtTjhqg+Xf&IRM&;$pf8^G3a^*-7l|QFm zcqwF_n5*V=a@}gJb6^`8G|hFKwAp4P!ILUh6fsV5;ZoH*N$--TZF{^?{sNtmF>Avx z5QTUB3Jo4y=v1drNWsvAkW3x23W_YBZGm+stP{kP{`blOyU^N8Z_yq1-Qzv&Q`gZogrho;^Mrt$It=XGYoqnET*@a zWZonD$jk0BFT|&iseG(@Yh)AAuqBiM_y~pu%~0nRQ7^N4o*(wBCpP?CY#>SX%3}|C z;K5=mvnl4IRR7PYe&xE$FX3bsrg_6nr^8=28*IDge1mQ7e`fM>M$=CQ-A?qE_y)C8 zO-lnY5WVMD%wZ2((2K1gu3AtLz38FW1xeG%HjpoNl4_CuceC4%EoCWUbq*mP@4d{M zOm4=0?isV(AbBnj-k+nH#_HaE3UM*K8i^qeFGuBMX{58u^1&JJEZUG}mYl}&$<>C3 zfOWx`RF-QHf0`4)Yt;HJ1|P!?0m^udCb0?1-(OT7$iCP#$do+$VvxeuYQY0SMq#P3 zSntKDRsv+SA}D7;w&Z+Fp;oqnEZHYs;Q+2-;nb|~HceCD(+FkxB3+OiHd5<8R|npiI8{B8fY>Zu}q*t zaNR6PwA8|d;6X0o2F83C7{~gEC^^#Dv>d9(PLs%lveM?Qjhtyep$$8Za0gVL&|AE- z-G4Lq5mnB?e?o0SuOG^;((=qDq3y^+I$aK~cNA(HqJ!^B*$d=#v6-~;F?7=n( z%+%hOP$>pWe}_+>{q3jWGyLr5pZcda({Y;I^k1dZS(@OaAm5Tajq&pb59ayptHG0L zn2f~V=c_?^gX7tHARUH(+^h*wlo#uPbQ)bHVH{q@m_Ip43Y?9}aIFUTFbzjI(|@fB zdjDGa#UayY>wvePWofoHXpF3D19yhAX_SNoUJ2soe<7X~QJRQRIZBJy>739|yjU4< z`EBK)E zCm7AAf6J>Q71F0L!>g(c1>PPWM@h7T3@WhJh}Q8cYJn*O@ss^pBdAro$ziSs7_*)y z_=>nW*^TjYS(wEQ{LkLgAGZWV9fUW;Y{o>e)gLwCBt;eui<}wuy@(j0VmJX%`tRG) zPJlhd*>yC;{S%yHbpVEOnCEDBHjATS2>gelf9Wj7Ah_%^P^WN$JTgJFt0AQ8wlrd;if}QC{#MXK1x#j zf5JHW1KZVgQF6S@&r-pSlr`0{oL>?yLgRTdq?|Mu3<((tjfO>&{2{2Zfg)9c_ecMA zbo`H_ppC>EK3?j}76r?g2tJKs66Kwj9ELLJ%1a4G=K!UMAS@}9;7>KU+*B6a-;SFt z3${Kw(3zOfGLYq>F>3ZHli*P^I6e6Ff8gjWXrUi|SOSkqMcC^_`RRN%OS6Ks)M_bo zRPfbDd})eQVxp4CYTCt5eMXixf-h(LCvVxe_opXY<+rC766n_l@_&;Fi9V9rvsquG z)z!nQ0DJgV767g^<=u<6797{We3?+&P>7xmXl0-e4lU~L#uYA1UO>Hd^Ou1%e@NIv zCwrSRP)xG)(~=zT5A29kGtNfDZAD31pj?Py7rhNXV)C23C?;V+{=?{Bvtd%i|3dh4 zffK5`q8vp;afWe>M+npiExSR>4Sw7x$tznROa)1r5xTrVH|ab>v&pPW^n5?a(FT7x zD64Id@);)IuW>hMnQ{c53>Wh(e{m~`1#Elj6zgV0M7!JVdaQ_t@w_U+1EvZ!;y)}Q zL@rk!EGYR6%5omZ?IoDU?GB?xN*{2*CQYd25ZxKz&tx$2We|A(~-aOvY1C;7wiPQ7q~JQXBV=ukDs3UkK!f24~v%>8JXW1{0~ z(3sH5^rqF`U@Cd=%f+6+oymNPvuM~XtGP!_0SczOC7(RE3Ipg(rdvy(4wxp~EgRC; zno7bCMPU~-1{)Qdqt6COl}@_>O01e1gLT|`>h6Dibz+m_cJ-xbKh(v`MNdkp+X+AQ zP~5zrgL`-j^3+lme=78aM02SRiX)R!k<4)#*OJR#qNhLqyhuz)kt#ukl8Vq(Io-OX zxxHDYu-59&uHTV$daz)H6o0VuauVk6!YrI(Qk&(#o998N!?QO*8wH&Y!9|m9#4J2*btJ!~Uihh(EIPPu%TMU2NuSJ?nv zxFcAHF5nT0HXXr3c4Hidn&d70h#EB>ubippn^t4 zThu-156K&19mAL?pCp95R4%>QUF9j{v1u^HwN{ivxDxnLuQ20MwUBou$jbEes415mXRQV5!BCnz5SDu;}Z`8s#g!iSxnDe6E~^F z$2P9&$M$L&!I9n)5Urk5Tq}-Jcnca*S&g`whT!Hf0lfTVh&7j75n0OihiB}QtTeHB2CEj{ zx#m=_usoU&6^ptvV{_8bkG zf4%nAFajEPRBu*V%pbLh4qRuETZd(49;zUQnVdJyUxjlz6;}z}$SW^eL!g&#UZ!b` z8t^|3ee7s2gAx_08jJE>o=e+L=v4HAeu&K5f({6vwJ=wfX4OHN3>3|fR3j=^8F`VU zP}CJpwHGdV5i7Z;5;tvylNUV!%UEgUe?ii>fXa)i#_SG7R4(UI9m10Kt~l3MLniYa zP9&#{^lBgF=tY!_)0dC(7fe?OXcWudM%KSi5AWQy0dAf9q-#) zuSiOIP^-`a>sgtlZw^ud-m?itf<8Q$CUjy!?=Vat#-4=N7=;PK(^+wYKs36Lvm_V~ zMzB|AP~6P0WL9_fP+vcnpF4Vff8mT#Ea~ByuqezS2}VUJgkK&(k}c9w?nZ29NGsx1 z_;pO3DKVPcALc^Y+{v)}QkxzIprbxYG0UycbyYCbnmTlFag;;AX3-mJU3}Y)F*fGC z{>?c@q6T$KuyGg8ZY3L#vug zAZuCTq=^K5VzEuAb^)1Dh+sA?M>wNv=3qAzWMG5yfA%hZ?12lwf2kJEn!$|d&%y8W zw7~F!)L~_NLfJ872upPl1E9=*8)HF1U1gX+{qvu6tt~}?RQ$@a?@9*@yGmUYop`1` zByaNY3e$yO(|?4&rG3r zDyr;tcN=Z=lYX)ne~qXao8l097v($s1PX3A((As}0E+<=>y3!BO{kaSiUw@qRG^l8 zx4{AE6EJyYgt{JQ!#{J|6qx#v`l?D2Q6W^660tN^9eh>ou;nE>bBhsIxEsAhTYQ=t zVBd|eRndJpK?mNJJitUw(uLE@=xUzM^KLb7Jj%NpDhaX`F9`rqd6Qs4U{$A3o$iQ;!`R9LeW61+)GK-% z#uzv|X}~i)RP}9J*|+0e{svZ_@wM0HiknA2^|bpNTOw`*@I>Yy!SF=8X6?zO_h zLUujaHm2d{Lk!cR1|;co3Xs&xq~DzerUcX{-&S41)9ZbreH0D01^j9QZ1o;IEk#O) z(-Gf%stcz=^0FlmR5?&?N!3}FK)+a&a)Zx2f1&Y5>0)zSa~x){D35?qxyxM8FFqm- zhXWK)pA%6h%+WVbw?{ui0uyTyDAOfp!>XV38s6%(WKYyz2Et=d|w zx)c>lVJf{i_qt#^MUeZf-2%swT0vh>q)wn(6H#(9$)5qS@aDC3rgg=PcHiC0d+hGp zB66#g6l7@aQp7noh0hpqVpcwIDxL$%gmD zC+nuyH)KAq0&=bKB(Y6l%$lk;uUwr)`)JRGmEND5duc82z>spJOw3$ZLQnEdbQaOa zFNuqcIvx1#&ag=L%E}$ZmglNse9pgIoL|@nz%3#thf$@^&0|Nj9eH=KKbrVUf7fX= zGRMc<(i|+cThiTjulHg9r`J@8$K z$tbOuY->j(eZbjenn%TrI|gpB z(^M9iYh*lzqiObBvQ5@+>4CvR?UxCcPt zC_4F);aN zu4Cr-F<_1*sjQL5igu)%w{<3z4v@CHnKj3DgHu;#5;|8I&~YRbBP}SqhUwt}q=ukZ zi*DlL4B@dvtlob%t9WZa!{Hf}yOZS^e(KI@=V=CfvyP2|Q*A3v@J&$k377>>o75y| zd;C;(yAHDm{O??fgTiqPwxwv<^Gb&G#5?q!*ko-urL9!_na^}pa2 z6Gnb4Zm$y;1a#p{I*89cyFz z^IiD5%2R(SR^d097gC@g`z5r@FdQ2y3Z^#A?cV9s)jSC2*QD`l zw&WFnWxt8`X@zVbN7`0h8@HDoJyE2^45rF4bS{phC(t*R3Jy~l_X1} zwOBPlBL65(=$5pKnH?Loj%T{3m zozq=IZKifw_bBhfE!>>x;O&=RJO2T-lU+;0FcgOG^DA=Eiwe7N?KTEeWOG#ubKOTf z5elQtPG_J^N|QQ^_}|T}-6q&7g1IOsInVp@HXj#P=~Idj3lb1%Kmf1r@+8c+BmRFv zh++0S#00b3@s~vsaaQ=(JV`kNCRN1*kHL3xndWkUP%i$UzTsICND0}e&tYye^@&uX z0isojOXko*uL!G==3z_;CdyLcm9-c-OWS>1&pq36@g;8e22I%1S=e@!Wrz=N?10>zT#yVQ*6p%qBy7s*tboqnr^*Im5e* zO3*cR5k#;B(ZV6;G1eIDV#+}2{3wV8w6Ho4tnqX&5^DMUtidm4r;fi=3Xm(vLN2H* z^bbu8&k)zp+f%xRp<

koE1-0UCkgM`#S{^4GQ1UyXtAERe9#%e~!H^9Fy%N>T56 zcr&{H5AP3aQMFco0LKW5c|-4|R$Y(UI23*7SGXg#6LuN(V_IoNmR7s8)wCLEDov|C zOe$oO8?ZL9Birc=YWeTIaqN(oKoQLYU~_%$*E!eu=XJ3v1_MrWPz8;F%&*FPQ7-=z z4{`kb^6wY%C0xFI5#6ryRPcXwG!uCtIB<=>xDpveH>EC09S#PiI^py?A#n0boT`qqz7L&B(#+c0K z=t*f=#yS`(6VRAYDe0O#ZV<d8k)RwJgp0;*~QX)5m_zTUM^> z*e4G6CzQugFt8D9dfR^&XFz3Oy5nfU%PjND#ZnSLUg&jT!?W}nksm+EBfH1c8&|7f zG-{o$9tpaXe4FN`gIzoK&)Cwc0z(GR^O#)NQ{+$beAFuQhCqgz?Lsx#SroGjyCxm{ zmT%F?`#i)vT9CoiS5)Zd1YkmFrx2b#HMn>pXSF$Pr=Ff*(XrW#kp z)>!9rmy)^3s)V=I+6;aI%~t(un?M-;-M``rQWY{<)((bQ)~#E|3fod@DU?~nn6r`T zo!m#-GWx&oRWEv)Xhzz>{2}P&{dk`Dx%a($cancEa>F2DhIt-F7zJNtHj{U!^dX8~ zAH6+}j_}c&W8ZtsVoDzUPc+LZ!9>6t;WWkmREk`Rv0+HQgZCH8vQP-jRGj+zoWM^E zh{i^ghMXhiQJEq9ATXJ8>hhQ=ic0vR)mzd2cPsAfQah%4k zdwq6!I`z)4Zh{}v%kLk*jnItJ6q$1zQ3grpU`b?}j&>ltT{C3Ht2LF!DT!3YC@F;u zLb|R_#T1K#zj{w|tZGncWIH2`;Yi~!((->e<2rT{BfH3nCX6NW1 zPLFI@G>q5kvcKP^-YJmNE$-9CKI2tG+75D`Jr`Qd-D!qO@aKuMDUIEfT$86-+cca|%bB%yY_mIs1Qcn8J0coP?{^yOe|^8U_fN|~C&;fqZHrq)Jj;SR3hWe2 zmbNwZu5K>QESNq1#n+2q>fMfe80`TgA1)S2PPy$D7d$$Lm}7{h;6Myl=OZ z;agnwJq7|c$lwpF&~E_Clko?gkU>ksKoEuR`zz)UXax0ODhRO(6`=>A1rJ^VCE3g- z3(4$~oz)h}e>ZJH5~(NOWtV?>`@MPWSet{CchSRAMi|{M zllNn-3>}jfQ(Hqw+}+5T3X`p8>p2!eR;hEa_DW%cc|Qg`FjDRy`DgBMh;IR%Y@>CZ_pM1lh(8Jt^2!rXj(6htY8T*aU zhoeu&=m;NuJhtu@p2O(E`pi6^QA~w=qnx?e8im3SMaM8gzQ^t_EbyQZI9TCizdNst zH>C2zkqSEow7Cc%5&*f7bC4_q#PeP3Nh}VmJ)N-n%BYM#29SS`ACNf|7&PWMuo)*} z(J78Qx#)O2v|WOL6H+7yqhLBkl12m}5@w%Jp#Xs{;MjHA?fb#)+30RK{yx1L-Cmwv zw1CZ+3mT6Yu|SeM%9WM_U5;CO$gB6NB0@6J&~=-!mc#?m(-2RDANEw!qh+Am?W%(M z6@ox}&3_82O0Iuc((eO`pI=k3*{tS1>~Sp4Q-_Be znQF9-8ekCybPc@53Ay96%&jweKerQ}Z`o47VXv^MM$dhktY%!YE}r9UY9d)!E(Dc84kut)$T-+*o?QON!|wFWDkFy#qM1HKzNR2!EQ@+J~*3v z-Ie1xAOgG8Y{)~J!x`o+5a$&0qiLQU0;9?JdNN)$%!*u#u~Z~W9xU=uNWnIy_1fm7 zRArBK3B}40v%7i30p>f4@Tp`7pzSI&&8D(0mXgj$=pWgSpLu6qDykPgt}p?-6i07Q zAM~N?i_?GMRi}s+6={O{KG)c9moX?i(?Ao&8oj7qs?NUki8NbFXEsg830PuR+d=$4!#$!n%fxl^c*EnVqVE!gM(Jq^_qJ6u3Bfn1V+)tJNvtlwb2wZl0j#gGOe9T;HB{w zomFdZ+AtLTo?qcgs0k9Qy0w!g7~3ez22x8vQip_gwS&Yr0G=i<5+^l!O%Ffk|d&aVIum_~GW$ZFoa(KHdhCZ4wE-4f-NU z1*crYjw=zJopIXTgf!Jm@LQH}tS^q2qE0t_TG(`=y%hAannpw<36d4|7 z{1C<=Kxk<~?G%A6#JEO{6_qognBJl;QZ$a*?O(2c=S_ywM?CWUhu(b)&4h?iV@^XM zA=4ZpxryV}83f)|3^k(tvm#G($0#S8Efyi?B47$js)Ugt-7{*Urzd3RdmCMJyC{EH zP+f*$y-iVn)DoKkQCL3ve(D8#fv5tB+IQlMPf z%}!bCbGd8iB~$Od6eqh?1MG#$1Vmks;-!7Z%qxv8K$k@IMJ(jRq^XeFsVyKS5~^#r zE9NTw)H(oe9dxyTdam^;^eY$1IqrYDq}oVcC0#+1LenrKQG(6IZ^<-uAeiw5YQXiQ z$b#BZcc)T#Bk^Br-bsA^AhrEItumkLv??QvyAot z229#JyOo$z*MGoc-}~wJ9!}$ec}~Ix--o{2pL+fya2faf9&C3x>>#jD7FtM!>4qt- z99xl;;WguPu~vAc-(O#2m8%CBmzU78(-B9_IVE3jG#U22k)7W|u&F8mw}qRSEU1Wp zzX6%l$W=e?duDkNm?@a1?FoO|JX`+(tyEo0!!Q(m&#%ZsA1dgJn;_N?oSQgM>$DpP zh0%4lGms`FH&KV|znislEyJx^%|kzud(S=Ro=Z+IvX_hy5v71x6ayXKm~>)h9r+%| zhpppw+=A9oJA9g_i4^njN~W0|_(V5X6AqE>{UrUunT7!QI?+xb#)_TwT zE9M4XU)V=tReB`m5h5*XQkG^MQVWALY}kX7Pt!*aLcSQE!my^j)-(Pay932ne{b4I5dEJ|F&B~AR@0oW zw9*|3RD`-cBmyUg>#4#BEoKaEjn~>;CqXISy=yNv#u$H4u1#YplG&Y|A8+29buQn9 z^RQA0$O3st9E9=T(P9$KuIRnvysrKE#;IZL?Hl`Mxo~N)wA*wM(f|V?-vUm3w7YaR zLv~TAL>%EC&f*2THQ|C0N2Htiy-sjTd~e!fvuGh5nfDHc!lS{qmHg}CE&6Kp(OLB) z5k}ch^{amq2xP7-^2dDcICFf$IjpTz#enw$gDD5Q9FfXH1>_S(6W?>dkw*n|dLR1G z0L=?rs$J~vo0iqLVgqE1vebfkw?rURX_8f8@fO*Ha!)K1D6dHxu5_i*s{=GDJX26y6oR8YK2*@B42$ep9_t|@s~ zpT`XIf;wiKDd3o4j@+HMp$@wEoy zaWa3uS>y=)XYnAN_h&#DBg;LLew1zR(qd#J$*OxOeyU>b@mEddS6Xb{C^>_&NG0K4 z?zP|XxRYEl-IwK-%F(J6bf3=jsvjGkK~;X+a5BRT4cQMNFX&PjJQwueJkC+*`wAE; z$0NhYor@naXY>vNyxZ_;-^Y$_b4jB>xVnEfm}8tSBu?Svl%K$qB8Pwq`5EDHajwZ4 zl3l~tfVbMfxanEGhZkEl<%9-}Mxz|jtg=F3v4d@Xc#_d1aFDwHf3}r>oE2jiDpYT; znllt;EI)Nx&jGUyPL5|exk@!+8I(z(xe%Yy-s=W58+$3e54X(K9rFbG`L17{{!xGB z&Ee_mDj&gVt;#QdPgdeyA8JiXh0M&0feWcGCz8HlddhLbI6Izo5s7k1%?URZf_hOj z3`N9(0?u3VT#wAmSw3qy8@*t*SEdHkL79|E)s|cFfE7eiG6#V6pzY{0O>=EjswIY@ zFIgCil_vvYVMD~V|&VAeF7)zkUyfd1s1JRymHp%qriwyR9yP~r$;MMFaj zLPlefD2}~$VPcP)PfIR|==4cK8OIMOB@r?wMw~M)y!KVyP+&RHMd`Uq&C6{U3qu?e zO3X3uk>ckD^bXXA=a!`ArU_jCbx^zA>DRmQbTYW{!M$5zD4js*q@?A;$vkXHd2Y;j zhNOn3Dosy+WMMJ8-G{-={b+tW`gT9Q9Sut+tf)V*{=kzf>BB11E`JF|ePA52sBI|f zomXYZ(ewYHHd%T)aho9#d5YGBg$V|r>QGs&rXjr`2;9;1 zi|d%k1%$?|e^#2En^HInE{esi!^pylecXgRVOm*#bRFF)HKbU_q$uArNQsaorsMoz z3PMByrDDrY>WdWEgaXqqyv(G4#Tt|#G$~91gRSG&?{w^ba8a!Qv+?`)MXGZ>T^lcN zr6XOkEIgS#U@@R4L{hX!x4j~K$Wx58R2sRI+W_u?Ri@{T4zg3K$i}LZTBIc0Nt4b< zDQez-$+EZ=!XqkIC9_vk%*`>~#48*si5uMP(42x6G4D;f_UR&AkTHCigDoS*3lXtd6t3QJ}lJjy_vDuC16?nebD&LWar4=krxBX zy6E(y!f1iLGCF>Zqz{jkDnqXidz5OLtwqv*h}&H1xqZykh@aM>zvkpFpe7N!ZH}el z6y8*Yw{iXewN`C!+At9Qo?mevS|yQSoz_m8Xv)M^rXnHOx^~i3CKQ|tcuQ={c2v;R z|2{iTfOXJGq0I*Z_PsoJ_uL)Pd$ACn$Ko87hzY{o->`~zPS^5*p289Bw%w`Y@o zud6)eY&H4FbHN!hZN4$ZGqfjp%#w4@D^vsZE6fDS$t5ZxsnA@ygY#zA222#%efH$M z$j#m1mIh3tOigkQH#HWTa@Nq!xX{*+du@RtS*#QcsnS&~0GAqBqF~arn)TcJ?SXlO z_1k!>L8v+o{QaUdr24N}U1nqNwq!(1Ry9)KluqyB~1I!Q0gG)>)qgFq-V|d>H z-;M$Y{+hjh>v>FeI^)kbgYl?0Y=M8XK-lz${pN=)I2gX8Lg35z-oR!>mK_M*8SHev z^@g|o>1aIaTksrs$rmtwOwk-aTuGiWh?L7b)-Msqb^pul;JSZV6`~5p`GY`zFLeu+ zxpDbZan=GZAx}bs!#6k28lhTn`62;s3Z;Hg0ZBOsXOzwBYN?42aYan!hd=68as#sj zXM2AwUiF%tqd^o!et-PQ_iXMW%2M7vuH;@>CLc#9<>6nwDgJUI2-iQB@ogszesAKpU@rwH;eCh(QS?G^J$IQcpVojY{wKQgOjLvDcOnb}~^0 z+?>gZBnoCLD3nd8m5i(llgVzo?e3$K`UJQu%+q*ky$eITHLij7l>;TXQgoIfXby99 zZD*4TJl&)sF!SG-EK`E{43lK5-XIIcP=^1-VNBNmOpU$pyd1#~`zAJjE|C-(gM+xc zUOR9^?e8Y7uzQcek*nuF>ts>>A%Kg9y}aiSMo^_|%SF3eH6I2QmR7yYOeK3lWR#Q? z3(R1-t7jfubgNvHVvi=Gk+c(js?AE?Cu%o*0F2-rLKf6=v%w#%TJ!T+PbGulY?J z|Mc>gpW~PK<==jujBi)-JiDD7=c{#|;jDmf8Ou}5pRA%Rd9}BHSF#;mf4g3%B#sJ_ zXRmfdC<;nuWdYxqA!a9}(M^okoRaF>X;xr52f;iT@-(}OQj)x-i*f}s%)oKKVw|%2y>dP%R>IE8GSg?37(UTJb*b1>!JFzpw1p5@3XStK=O}8RGdbP zA!WvU|JpX^4O31qiz!hukTc0uRAAJLY?pRMG7DBc0{j>= z_L&rEeF)qoVweHB7nil6#4-tIU`dh$XYk5o9;K{~xCHZmhOr=Mz!_eA!}BstPuf-_ zi!7)3EB9@|@`%!$vNj6hJgGlow^_bs#LH*NqJ>`q%gR$NJu4l}%PbbmEHL*TtU7X#>pIolTYtIO}~!L$ERl>r(irsZ_qC<;Ddhn0foIt2VVdQ zGklFE=XjofVzK%$2MgsI{rUQBl&A+1Z_JS z8lVg;OhVjkr%ucJ!ae{D8St4c{;ywKzeznrJwVNWmcVz{wgu9zbffL*RD^9>#ziRA zDjPC&%h z%Z^!p;;o$Rd+n|%&V4P;hI|a55MW&@E|ijuu?J&w?WlG*X)4VPHp3z8klw`=9$4+1 zEJ}*C$@tCNzi~GAC<)rW&2sH^t;4lYWhA@ArRr@bx#{*pcVaUs(%P~|+7)CHb7#JY zxz$kL)(XOqefaTA?w~m6(50LDIP+VjT@iGDe_7Y-5G&DXk+aQAJuC8)=*p~yssnlr zd;^|sVBLrfJ7{qZHp-$|ijy|DrrDcB-GEq*Xo0j&$2T~JopcAS`3fw^jQQ__0E0k$ zza91;e{qC*xp+_)NU@~(^^QATTNND!zvU%bl~6S0SC~?gU|0tm5%tju7t1_BBoog; z(lIE8e}55q3lbT?VbI^8A;Ou9;$1xDyUDzR83+;(p#S+lWkP=cqvb9;#dq}s6<}7F zF0d7k{25$9Z|i%5AoJPLjATiuuw)8gUU#+^K#!Mb2O)KJ*-)>M`tUt+zcUH&C3!L^ z^sMr((zW|dLs!PD6{h9v$$R&!{K{@%_-LPKf18@(8^Q_}260NJuuV?Yo6~~78hCS6 z!TjGR-Zw%Y0X`576r4o#nq)FN6lLGpxNW|WjO72>(KRInP9Z41=HU%=d30W88Lvm4 zcqw~=B8H+2l^JhWkQ6T%7l@VXbxwKk09X4*6rYU`Uq9E_!MAgj!2k-| ze_zkWr=Nf0C9e1fevUlJzAy@3&SZb?p@^0h8c*FPk^;Zkw8&%v^zfBCtjM0R1+f+p zkE{n-r)V>SX!8}*SchYVV3L|hIm)Wp4lZEZ$aZgDI}ew zwPR@__a}r+K`)_&<25`h$NYS|#$w+ICk(<{R?NfTT;}8;ixQ)Jj-EVagMrBvf1k)i zawdkj-4y`AQ@;Z~@rlaladHT{aI6b-b|M$&|0RzTiVW8TBo-A045oK?_hjx+eju5`Ohs3S$4<#~#F zaspkL{*KSQDg$U#*8Xnsz1kd)(>V1mCjzlNO=O|z+Et^AYP7!@D@u|Ye^$L=WRup4 zF6`Lop=C?+@S!)9?N_hfs7JJR4jZe~WOW`%65x%$4-lV>lD))KCMo^9Ynv4 zRkmo@pM6=-oze<|$4u%%RWadL=wQw);k8SMMFXr9vrOyw!HNxUNpBp`Ea zmD5H}Hw*<2Qv3>Oa#5R<`ncY?;#nGH;{&e@8b5MaP4sr*P_w zd?%~;^Kf;43nTX+=9ATJF+_>BLkm@Qdqz~Y)%~dZ zENyD|&MmNFtNlz*9+k`VTwbzjJCD;hu++5s6HS;}ZNu4|1>ccw*$3MVuW$8lJ1+FR z_ek!Qi&*F9ojf&Gf9gDBH5~C{%8uhveKNWe@nWIPr=%NDlmp@b!U&Y6}VZMT+_O4TltH==Gz!iI@ zxl-B?_#gO|e@j8m8lpga34oa(&9g<|rU&~3+_2Ckt-gGE!9gzDTG#F@*_0tGtCD!i z&{I~mj+Ga9t7gNRq_@9KLEx^xAuIgC@64LeC~naDs<3_GMo^p3f=#bUu?*#0hl!>@ z#2hYx4ZO>BJ8V*3?UnW`zVBpog4sM zuP~By$Rc)zYK%L`d73R$oo{)C!q9Po_Swf07n zQ~s3k7wRMWE{J@$WL%K^N$m!jzC1D%^>iG8)uyb1v?wL22zQ{YyGsh_&|H+=cP+>zy|#hm z67okZ;&(T-x_Q&%-u>RY!_ke7F#?0Zfkb}0esaHBlB(2bD$`I~v zeKq&XZ)(lh+3@0=4RQGSyqMNisbpPTsY)w}(uJF}N??4cs9fYp;%yJ}>or5|xRS-4 zT5@*y&EMwkPO%@&r?1@&Wlov8kNGqhe`0YX!o9in_c6ta>Q%Vy{5V6ogQ!5~0%!3r z`I$gC+VDr}5K_@_Za4KSn!PHWkaZM<1Fn6OYbe}_>^OF} zv3#g4)%V#p8ApakgDt z@lDJbFs0v^{~!rZYqQTFdOM1+x7 zP;#*Dm;w=L&klroNR+{{e-8&tGsF}H6ibP|;Gf$p3%~EHK!7tT9^gEeZ+nF4RBPwvZ3)h zfBm~oDoHyUI~;UCrX_vz98WXWoZp%;0#qW{{`r{CTavj1Jfv47Lz1?sr0a8P){_Cn zwz;gMF;6#)LkLp`{ZX~u7?rchK{_(?iih9@m{Q|2Q=URFe|ja*=$O)xBUr&{Bg;b! zHXv5uoT~ED^=vJ-ABdGKYI%>sb^yHu?(&c;6c+D2ozw!--(jl?mSOR#EH1Hnq*;wa z2i<$^`e*nbNbfT_L>-5rPLE`xNz}R)eJFKe>V(hks>Z%W|L^p4VzwfjP~}`}$EJ-- zAk&;`oz(iHe_X|YY|<(oYy(rZa4gqcs31{=h5ydxj8L7)pEq6~%ddh5AmulrC=@PG zX4Uh2SAa5vL5$1=S}-wJXip-kycHZ&TvGW|XUd`90kgs#8ZuWw_$pO3ln$MbTgGEa zWOk{fIb|-C2vZ3|DHNaZ-}cDD|2tjCykaf-POmvS{v?r?rhjP zkQ82VcYR0Hm}Dv|I+@KJCzj2(zt`TkH1>_Mhpcp_=0Y}I`n3VNG$PyatFv_8&u44D zVWuu1f81Ta(S?mIi5tdB0C%I^=r^sCT~C8B6o&8nE1KO*iE)X{#DG(AHcB#B0^Er) ztd>bq3ZY_(H#$ zW1Z-i^U&X=amIGxGE4J}5mt&7;~6C;02Tkce=I~Ft(~||BlafG%n|aTqR5KTviZrD zMRc@u0V&diMI~u6#$rPurV;1xQ2+jhgD(KZm}#1v@8s#pVp$Udq z#FcQlb{xxnfD1UqweTF*%BiV>Z#8Xz?%R*9wQ9q;)Tyz%9Uj03$a8Gh3Q)U(@}O2L zf8yxDfdY`{t-Us!>{Si86KSn%%SXP5eGbR_Y=%+$ZgB%Sp|N2!b~uBIkmKun2>E7Z zK+9h}LhUMLMAt?=%CC7|Oz;hU0M(Y=YU3~vh41|ovk)2^e9<;tD9J7%Euq^A{*0KR_4{lEoyM zUGdi-IB#8E1TAcRzvx(2BL4N!dq@|Av(&riG$kRW-Y+JpcN6>392W?_fT&}I1nh6# z6iLW%YBz6&z57A`wmQfBr*h z&ZW?Wvr1{N2fbmXw7JlQ^R=`jVSx-e8{=yzq_CT_0+I^I*bn3?v5~^I#O?|ihinFo zxt|K@2QMykLnfgi!ar!%GK~;^g13jDk#Ir;N+mjV;iSP-dbMT=r4FD1>pLuh>OpF z7m~feO^6{*DefZG3{|KefX3)vfXkS%x&iJ$V(Kj;rrv7ACY)1fOpx#x@3Nq7*bG?R z9cX-41gM=mo7NBGNRgFbREiZv<6y0&-t+l9x4(U2EGg6n*!vxC2w$5V~wnrCB$!)--u&8k}@=5D-psm58d6XUR}+^uPDI&c`-d zTMrfp$-2kq9^Iq+e^-oD>aA5neMlMv9@H!bzNAXR};`@2Re=cwDCi6Ofjd&Z- zgML(THBsFR@4x??$FnB31EvR`TnH~m!=#O{#`NHGbi6Gu)XG+6#wTH{34_hf3_76l ztZdD>hr$2h(BGz|vFYle2fh)%krrEK2p7<=PHdXndVk_8`ls3xA?%FF4(6YqyHf9I zX{{Ke0X*;P^Zsqfe`}Fx^WJTC;eS#p#I>xlY0eEgDR-c8mrJurF3q>|ERpLRC$FC* zny1pBi*P4GXZaFUgL;aFzED|V9hChAcFo>wbvI6TWpvxa?CNE9_cU9|+fjWxD{ylo zb=^l@wo$Qc(*7C^{i=7>=1>;eP{VBOmNctE%2vrOG&`v;f3;cbQ`A@%|IS~LaV?u3 zMS1Ax!YHNCDpjHs;H)mqcC{F^tD0`AAI`WVTR{RujT$syl&Dc#joNC!paCOPZPk9< znZLoWIp_Wln@4xsPY`FPtGGG2_nvdlJ@dVaL7E*2i4lcV7wnhG6FkDN)L zI~4zAXsEemf8Xw*7P@86?qJ`=k>PmkVz4J3y*M0+MuT0kR5W-b5gt8HkI-#(b-}ar za3n_8`)UXX_MPrNeB$`&(2?GQJx2rGfl$Y>lYRYx-cau;-wrC+)6p9U{S@f!>pF3q zI<>CBa(CTJJgQ zea8C0e^?)6>w{q#qGf2-GH)%b)(UH_DAtN;eUz+^x@8KMnYBJ~)~AfM%2=ziwQ5*v zqP3<0!vmwjI1A$njGJ&-g3CHg2r!WamIF2elMGDCFloS)2vZtN^DwOf#{#DSXTlW; zuIO-8fU8-!#=*4=@C@)W@CIBL;kpJlc(|d$e@zx{Dsa;TK>|UC83AUpaEpUm8Mw{B zZ5eJGAc`PrFw4WN3Ue&XDKKZk9SQE}APFF4;VuVvGjNZAdotWJU|xiI4P+i<74EZe zUxE83Jdogl4i5!*m<5FcB?FHbcqGFk10IX;Sc4}#JW(OTLPmj%2~Q<>s>3q@o@L=V ze+SPqpfaG!pc?Q(gclmTL_ zJ__(L3nm9<20k(HNrq1btctLz!5R;1e=0I8G72&#j!QVM<7ELaXK{kVi43v~vNEy; zPKr3G;S`TkDo(RFt>CnYoP?Z?R|LG0#j6}%&EPc#ugQ4LKwd;%!|Oa=SMdgmHx#^K z;!O!}>L>^(WO0VWnGD`y@Rp3X47@GkZ4E^pMHOdRoKzm z6BeH+_{7AFgc%*53ivdO&p3RR!RHJR;!74^D)`dGR}#L`F)Ls; zi?2C+oxwK@zLD{bfp0~8tD(lDf2QIBiwg=an7An6qK@wbe3wO?Lp_5_3@*vIWZ-)d z-)s1R#}6tREE)_LVJegF<6icQQGG&r!iA?K+69|_je^)qiB}1+< zn6D&ksCU>DUh34B5*{=kQs)|$YjPKw?uMFBe!{S zTO}e(M1_bZnU%<_PUZwMmnC;NawkJ1hDb7z402Z_cQta4C-+n`&ysnC%$r1(h^&+Q z0=b_h54gehfzOjl!{@2Te@+~;LstWN@MO?m2yWkh32yfIKZ3#0Upt1z+{du{_n{4%HoVJGyB%ST_FkP#{Ni?)8X6ExDdUd-6T`IfwFdIy#zjMCYD7@q z;#jAhFa`#E|6a25o$o(ucDv=jlUr>1_sb6byRgM+XWVwyZRgxpbK3>CU2@vbEA#GS zb#=?&4r;*no9ReQI?Zp(PW$_WOE0>u;r2|qE#vmAxb(P7JIZYNy!>d3$2>ULR-F5i zsc_1E45wp5sYpCVf1S%^$PoQYDiIz^)o)GiptdF>|D^3l>f$JEZ!uU%m4Q?Jy`hd1 zCy)0#lTzVC${udqL2cU_v-us`?=I%0Tjv)Urs^B11G(A$q7mm;kP%F#5>Yy4ukNR| z=epYpQ^!igeHV-*L&>3VG@NkeSI9gcP6iT*c)}4o9F8XGf3}kGV3JOSXlFv`d^mPC zN+;?I)~NSW=_FmhtstXZc*O##M7m7=n7{NrZ<=5-ea7Bp&cLoU$`nh`$y7W+mnl~^ z%dx<^>TS4=XLzU9@s(*#(YCd!?bw;^?xT#MZe3QFZC!P~2yh{1Pp^-}Y?QcfU#8`O zm>YE7iU#u-f6B9#V#l#pH2_oJ?cbjhylq=K#JdlkI&``}(6`Z~j-v;AizbyHhqLy+ zM*C+wK(Oa%Pre)ub#+!dxdfd`Ct_7WJ67_RI-iLDOvUJ*so+oHXqtAhQ17eoWq&Jm zFmWzDLdR0nUs`P3cuJ0>?HG23rs6UCZ76s>ka3Yb0sAoDG11 z#z8-I=@R9|1LwR8FV%uW4Ref@#g_e!^&M$7_={0qgtwemmczxv>}Y~M7fOysBdL1d zu6iG}lUnDpV~_g$yV6eBwJ#2_E%tjMh}yxd$+-*l29AXKdX9DVhmM~J1-g6sPg9pl zx;q2Mf4aIu9S3{*Pxc1%d&6@djGTUVxM#fIVxF|ai<=>O`-m1mFGsry2xM2MXrPxc>f*tcs}*OB8V zdIP?4sg;4(6?eeNbJZ4eEW6Xelq0=%sQmeSe(MJsJ%U*|+~)Ux9uX{660f7xxV|;J4bMD^<+- zsy*iH)#vj9XOe2CV(Dm+Ywl;6mb{IYf(`-c)ZO`yZ7$i*Yd;e zf4$Y*$urMLI5l)W6pltWVIWV<;*(8!3kHYc=~zBMZYr^DSXph~@2yfheAW`+dTeRV zqJE^@Z1#t8*O#)fmQJ}D2Xd;{3V3C@+0(sL+wLH%b-jR?phu{jaH^rUU27r4v8gR$ zgN#&L^Xds{y=DLKmR++tx*u>=uL1m8f4j;r9~l{q#?RU@!TG!wP9(w?LrL2|X%D%j zKIr#vG8m1Dsl=X>F984Ye9%DA>xRwDrQF^rhc_Xkw0Cf zrp>DK=Ub_H(<=S>W@_2=$rZ9fLDm_1*uGjFcV7z^!y4KJN6vhOlzjEz+pKo~e;4Jx zNw?fbjGD@Aa1L8XZ0|2uD>uzaQ;yAI=luDu(vVu?9^_O4-xcLlJD={{m3F>-bCwM#Wl{r2R^hmYTtlTfgys@;Iq}eOPy2jq7c# zrp~o*8#Otq!E`8`q`P8CI_5at1;>NjL#4Kr-PSJ9iDdC;b19(96KE6q24!RqI#Xaa8 z6eO0zUNnrIPFU5w;YNEWdeUSi?IsAFc3iZ`-+UZHZ2G(2)fv{T?3LH7Y&$8 zNG@U#|6M!ywg>MG$8=8sYy*{Kk<|54!%}aj_(E*-p+!x)Yt6g{7kM@3$dWBeF*D_- zN9qAQ3uU*>6BUy2ukZ%-Bh}^MQMt+}KC;SNwA=UafiFFbJqrRc5Jda^6)AtUH75us z2-XoBbi*GC(weYBosXa&E!4@tB^78@cOHlH7J$ zO~Iu&=~Iea406?q%EKe|06sDm_m!7THCwTGOJ(>Wc!8Lco4tD!l?~73T156Kijny5 zT$hu&TKDjV53{i^$SC0A%1f7ey9*NwPBt>OFiAE}H8wSu8|(!dmmcc{4S!OOMsPI{ zOe?Dp#~^ptka%C$5D$MBg&GAcasfg90j@zIk(#kwX_SxSpZGOi|M@At z-)&MQckx#xt!CVs_#X9EaGVVWg+cgXbh*Za#Mw{emBl^S{gU#MQ=G@kyXEQkwW<4 zE!R17I|DfKDiKzWOhk`uR`-8WBLwL)F?SNq^JOVf_P+TLt4FS=~5+x zH(rP1*0CTJl4V)jNg?~f(B|2jRzIrpsfyEt5lo>}*OO$j$bT}J&*w+ljoRx(-m|Ax zz{f9Dq&{CmCv|}t7`nC!^Tn|ScWsa(vk$Q_OHLB8=ZwQ-RZ7Gfj2Cop^Ra)nFOa4mVWK_8#c5b%JgL29Z{E7_xf9Fv%$vvHV z-{|G1yzFa9wH8RE-hC1I+GRLo87)g@#TIM*<|pnAPnFpx4X$? z64YzflP^QM5bYT(S9z01D;XTq=DH{UYE)uFQc9bKfq#-0lM#e?)^I&z#BL6xf6__deY_0u03txjTf%}jdqsh9E>9q+EY=Xq_NaP zF>x1IBS}W!m`o1|bBxEiz+k)pH(Sz;YKq?#(tnB#zDMaxXX=r9KlmSojXMj%KoErc z{S{kkYa)md1Z}hnq&<+!W)lz0-f@qRApUnBM6h$Jf%#@;w|7?uAiC$^G%;RIsjpLa zup`kb+vJpSw$4>G^{tgj9j!#KDF#)s9}IB;kOE^F{3p{!_{W_kvTyYpGhd5yv-EZ_ z&3_MrJVur#p!&B4cfglis&9s{O+wLF!H(lR+RPtevBWKE@AXu`1D=gk%Z}PG6y4`5 z?nr1zq|!y1N>wO>I#g|EQDy{mMNs6J8?a=Y)Q@&hhkvgfLNG72-o*I$T%Y?md>oXk zG6)1&qbdnSNWYnNW|j}d3#IS6AMR)uyMOQRlF4SB7h;nP3!x>US|t;dzZk_{5EzB< ztYn1|CeYhG3XL)+?wX}B4K-_GGDRiJP)^-(@FxJfN?B;68W+%_`v|=qVlvJsC{48e zy|`qq<^@? z-!{7jggzuprIc_^GLGS_T@r~xx8FdTe)%yPP9L8}X*!Q!06Qd(uctGcA0EpKiG;2o z3Am?G?YU%PxvQ0}kDGkBy|vlz+B@Bp2*;#x12|#!?u~cX<@jJ2 zx6&@lZYE;p3wsOgIBwfd^NCQX=_d*_-XaQA zx%BS%*$GCpKl>3WO-IT)hmlQ;zfBuye}~5RZW!E!thH|JEIA54l0;*x*||Sv@^ZcM z=pstJN}vOrKCXIeg}xaE*qK{kcnplU`NxhY`VjH(wi)2${KWUa&3oiua;W7(ZDPGqgRU%eZAvo4Vf0-5Q zT$Il+$GuW&D8x!=1l1CV@CGG#O<*govL!y*TogiY(_|rZNtg?%fI-ES7TLOB3aYiL zWX+L2N7z!73xzCv#Y=sUtXKp7f)A*dtSE>oVQW;cNFQXf+A8t9)UcFA&apV>sEo}E zex*WFS;53Ag`BO}GoQ93qNs$%f3E6av*c7FK89bWg)GTNCQGgGnW9Uj-&Z%H<|!~G zY6@hbO2j6qVRm`rk*2x{IWxe>8HM_(|3| zqQ3L-TqXT-nS{w~MqrH61bPU#e`N6{+rFba&wG9L_KkOj&VGJ#F`H$nN$7mq#{ngK z=bA?Q07sGYVUu!($rivABo{LrfaOn4kP(k#N?f$VDNmP+c;kAM+#tqXL_F$?3l^&t z_-_Wpuha$_ttDg(?(ft+f9^;YMPRP}tife*=Q*d9{u*d52pEkk4e%?FXIJ37ts1~6 zML8aYO8yw)86&_MOGb5Yey+2rumD_Mg2iGDmg?`SV@MnJ>LN$=ZT8K=v5$l@a$_8$ z5J4X?J;^<_WkqEPK(go#y@65|Rz2 zA~A+&Cr&we>N}2ee~zS3_@6|&%ApS8vrM)gOp(3BNDWOY$YVAZSRc*XS^)bL6%nZ* zj&n9~C1M0d2a0e{ZF!i9JGoDj(9uUT&gck|Z3ednZz!d;iRGCinplCTZa&O1aa6IA z8tiN7EUUI>8ap~S8=L@zx(g#L9Nu6?SF7)l(^}TMe;t>jf1J?^k@xjb58Tqxb-*_; z%22-p(FEsYF53aAAdSsOKH|tbG!k@_3?;8kQ00T&iYK)^t|@vG_WxZ2G*z#{TNgZq zbPSD@Svvk&L+4P&;b=1dX(1ZtHHqwCU9pzl)=J#>l$Udc(kznu|IfdM@NnwuH5;X_ zFJLyJM_4b2aRTNfA>2X3B}VhjaI+amHLzAel1Wf zu;C2ZIMMkS#Hb2L0#39o}&O8$G!q`f%YDugl%aUKhZplkC%wC+1HeC z7=NlA-JpOn9~Cd^AB0i~eyuDUWhPNW{g49NN~ge+-d4OD7%+J5X%np#(EH17KoL0J*%E z?2h~aO#{jB1XsRAy@3qFO=Nnp)KhC1JLa>ZHHh&J`QYVTtW^CuIXRL4)1%bNzA1yg zEGj=kQot+3gMx_phR9+5=)5{1GZN1CCRXDVl@CyPCXin^Bvc$ea?_MgLMk6LAdRde ze;&&=h5{l*5AdjU-ta)tZfalk_usTQx-aT1n|qI@+D(%Po2q9iHkE_wG2$ybCDXmD zt|1!B#G$8$4%%@+7q(YW+f? zD_?`tm1U9lAOE&4qU3Av%C^YoKR>^}f3hs1(r@Jr|a3?z!Ohap?NjJC7cXT;K7~z;mJqiRMS& zJwoI&Nv=G1fChmd#pvXPeXxJgu@6s=U!q;qJNx>~K6-U&pX~o^hxHEKw@!?Cce!u3 zYyH>ntz~5W_kWV_h5z}@0{Q*@f8W9H@Bd)|zWfPrrXfTmDFY|1JFu#4P;f55HYt zgZuqF2T|htduOe=@}KaT14) zXX$&oevCsR{tib3BN*r%SpmHJDDele8~A8^WfLL4#bIm<66>{S8P(!IKqCK)!eA@` z_7l%*P^e6~@Nq||-g6_{2}9?uo*U6X@86@|$nheK9`6!;6U&$cQN9zA#In_BND$$p zVvevk+TJEa4{?kKD$O~he>*9ldxQaX70A~(?xY}1;L=}`kn|9;=hAqPl=Xtx^yY?z zc8NR`VJUP*Fhj1K2ybo>u1P0Mn3cfkn2`|c=q^$q5vt%1ah!yHN&ywPLV*JK>&uhl zmCmcnqsybtMFBq80_`#tvk_R1Sp{5~D0PyuzIFX!@Ge?uwV$-Df4o%hi{!8wMXh)` zDylgbrdPq#DV(*nqpx0_o_B~BC}{LvtAt62uk8>|JmR43f#Z2s&frbmTI=?Dw_D8> z@_l&NUs@voyS9CBynk_F+XUN9JoeJ5l8&?b3f>BOoNlQcSM0`jnYk{b9sy(@oSvNR zU#329iV^4BSDrp0e-Ev2Wn)`KmQKp|6 zj$VCLQ36~Ee||E?p*vtxoeO~=8#|NbEZivx7NDIu(g-asqQ?+CM8r2aRH?Ly1{A^7 zYqHXdw%!=WH^I=xwFXPXsaPd2ZF0Def2Ht=OOi%TTTSvo&smuK)6V(D z(djGu=p~g<)=|G|D^v8|pn+6fsv>ae2j(c&^|_1H(ykJ8L8>z>4f3B7g7GCSGRV#V zQ?hJLz=!kBB*n$!hFw|Mh4oXJGBu776+@X(} z<(LLne~f1&=?$ox>y5mC7)@^wBz`Oz`x@G4pfAuyHgpt(WCe4{nC1@gljs=*L4Pjo zLT`mU4ys#o`_Mu9A1$GFf5+6DJZ()Gq1cr%7F+zRzPH`{qTX$;Jnb(v-rw@y&dO+i zg+ynKMt$$`Vq<3y!nAC?rxPF5#%$3CE;EN(e`J#o;6`MhixADXDI)J*+1*_pAq|KLs~6nj!pOyn*C2GK`gsTe&thSwGc;%2k>QE zcz5G^n6Aao=;(qP69%#t(dG6TP`*Vdf8QfMb30?b%bzcD&eSj`A1p~dUc(4sat9gWxyoD5u2 z#Sn92nN*-FOz?V+!)Ghk(fEXF;pk|xzHImS8 z>0~rYVx2yrmRwAx>ja*Y*f(cqf1Puq#AK-@lL-#B@+!)V_BA?50ZEY+Z3bDXQYuP{ zf+0>630#U;b!-bN8P@#iZyEm-SH#y;p%@M&1wpoaBBz_RwN!POnMsdYgLjpMO#2!s z7LXJn)8^TQOox@(?%X3Gid_kA7-QxD2R_rn846=AAq|66J*?pz=|da%e}H;LLInZ@ zfZf-+Vi~p6*APqiipVrElS~5d&&f2Qmm$|&Jv8_XgAxD~NYq_fp^*BBhZWEOxD5=! z=RQ@mLDH;~!4G7(Gu@?Ao9YnA098U-2r!scn!*BEfO4r&R!mAxySo)T7bm4DLVIWo z_E$|Zi4!mB@UQAQO%-Mgf9Go2xXTa1vE#YF#KZCeiYgJ923Ee_Lf;%*?lI>si!|P-Wr;VSrkR)F; zPNEo+DGqu|SQ(-$99;N3T1c}fQm(3+(TNJCI;~}@WM|N^+{Oe@e{Evmol630By0Pa zVFoW82XsAU)D(0KksPuT-?g?i?VjZ3`ijs49{STY)dEgV_QNU`z6^Oz(u0Ev-Q?8jI$TGLgii zl!v@ZG&-BQalXNWe>ZaBh9kn&84lb_9eKVNfv<}|4Az!s4?e}sb)~gIJtHbq`VqRw zHY|nSSIY~3QrywXKY^`k0x#AW#^G|Il#?p}5)*@X`dLg)0RY07INH4$B;cIn_my=N33N_kwK$;XI%n2f185^m^#ZC1tE5*YtO-S zB09FPUW;`=^9(+03bQiY;uOy0m`l>+3hmY`rg!5$0X`zqBUDrkGU0PYSbb9*V01{i zhgzp3IMQaFsxeWh$a^p!Lp*X4FE&%zq!R_av_BY6s1iw7c64#NvbFW(=?WqG={&`* zi{u~RqPfQif5M@>tVoXH;cg)x02#bN4sK-^Fu&=q$*ewf+Rt~gPqnuXwlv*(SQLx+ zlslgX&T^d*YwQInmbO!{_$(%!X7Fh$s6zh!VY&8$v#lphCD%@izM1eU?M$^9tHMO* zaf6npiV=f&vEjzKBTolVx9ej(^x$|S5XV!^PhM72e|XSOc-AR*M#Gx)2Q}=OE&{E% z>w%9_Jz(1>oy)IJU)naLNVZXDJc;kf-1pqE8&hvnUIZYEVQP5GJ2p!!Dl@1l5`B=R z{hu(k2iY1;m2xH@@AA?&F+g41GGVA;vkYbm6uIj&)HEGrgW0D2mZSr7;ZwNPn={Ko z67p%ge@Jj=Qfii1j{MP_D(J+KiA1+Ks76vsPrJ48<;K?f=Ej$1+H@;bjaUM$k6>j) z+?|wEX6;Gy%WOuO4Q?0JAq~(_nsWt=Dxh&M72*rC5F6oZnqLzMwQCaFf>h!g$49@!VKCpNNuTeN(tK@5^D*Z2G&L=w zs6Pg;)W)KqF8IKu54BLxz*;AC+kn(j522hI@d?wtP()0 zf8Ws|_nMt=-o93L5$#!;5J`d3lA+vqV*mGzwIs5%#?E%`+;@bx%P5_!EC3xe%m>J zP|TO6tmjG(twebMJ)jgfPGW4s>u=5=#B##G<-+C7GD1_ox)DR7_DxH!Zz-WD;iC%TGNw z{z$5J=celqk(y>+l=!h9Xjc3`cdQ@9v(DMEnp6FXkCCnufuRq24U*Dme@p~xGn{~` zEW55rLS{pziIbSU?fRpjUV{`AqzfF+vkH=eF0dE23P}tL%BBrGhUw$6fO^mw-i+c=#@NWy(Flf#>M~idS;d(ppRLPX@p0mu=o$*(ttrhw;tFJb{+){4&N-A9ycD;q@b4YxG^K)ok9cuwPFO z@8L&#z5P`D*k?aFTfEbHbG>uVer)ij{fz@QZvQ}ldimx4I&C_9Dw+=W4_U9nPD?a( zT2Fb?dfK$fdmW|&e-AgCys48mbv7AYkX>PI?Zd;vmz=V+ah*2yX$_J^rL&AyAm|}F z#l`itPTSG5XQ&06(c)e;f3H}z+=$Iz^eqdW%5A$h1yDtD_>yqr_+(5--#m`7AM<@~ zoR}`UN;_6V!>-(@^u{I4xZQ5CLroZhJ|{ujE!AqXm~^K$f1H9Z>>C6$0LOY50W@z1 zP4u4iLeHP0O*k3iPqwlri-efW+XjGA&{-V?DZmq)Z4vH39^acBz&{eVKLf@q& z-Njkr#)+~+>6{lZqa9Fh!%=B`f&3)z4vJ6M^vSm?BudLUo}Dy2CjzQr8&rjvUr%I3 zrniWwfA@zJ-H8}hWm0696o`pn3MEZP#q@Q0^|V;nHzC$IuH7%5dTWDpvp1yg&euj{ z;^^HSd63pF!9PSXw*B(xoYjD?o#QA-!U2xf65kyXSZh?ov?qDKI=Pt`PmV+Ui^L5v z>pk0^+{}+A%FyujF2<~T^HqwFLT+i{+D;y9bscrvl` zuss=j5<4pi6sb3wBqUOV*q~mNM2UoeZb(8uKvZS$RE>ZJ8koJX)MorAguLgR50Y2v ze{)Cy==;0p_J!0uQ?$r= z=jFp4u)fO-B&3 zmAou?VkNj{Tu{m8URzYkg`j0CQNu7N>SoVtPt<$v7p^;suYW~yYOgmSX|>m@kdoT# zrAUA6^*p4!_If&!NqZfJ%wh#Rlnd;O&lLy69fLGqMvRLSYxftWr!Y=xT1N1QhqKPD zRcq=V+|-@Y3FP54pMmJyE#9O`Y%lZ;><$`!^y%Z(HL@3DZ`^N`I(%us9Tj|Oa&3+3 z6IY-+@eA0O2K-XBmnJx)|CtQ<&va!ej1?bA*WzD{g}JMgILQD4tiX|;;LiIKnN+f}5dy=ueJ9l?}g)GGV&`|MRk^i>*3y()# zvgt}lk&Rk4!yxweHG$6@@$%U#l(P&udks6|564m@)s}zP2H0BB+Q(9!|7r=at*1x9 z1Rlr}3%%csUG^De`>u4XJJ0V|T2+1bKHX|T;Z=kEQqK_gGp=*?`LU|S@z}t%jTHM8 zK)(!TdfU3+X9dro1y$v6NMyowOC2%B{)wh_VDDS{PO!4klBw}r|L?Q~R29nSE30Um z_Hws5)c^|7N%bwSMxm#!&9k8>57o56y=LRm9~Ycy^YgIB<=UG)DI@@zquu_x3HS(D~&o>)DCw6AGa+$ zhP(2|lV=1fJE*JD6z^v7HriSKpaG$fLI<3cDUH#>G*Id8@9pC>oepZ3QHbAJnSSlw zXg$O>a{Dn2mBp#_t*8p!fZk17qq0so#-e01ncpI^bD`_LQFSK`rNv0(uz%#(H&R|j z6A|)`LfjLGqlIm6G>s8mXAL0iYiFd9QhTh*29j%9<-)O7=Aq^JeF>BDO>soI~GB@3^ zN&0<*KWXBp`!}K|*4`OBt|^b)zqM(6i3v}8bDv!JDigEwH8%BWT$<$1H`w~yG@d#z zI|r@uT_ta%(-`0VV;9Mdb~VSx$Q#8p#($6-UDXYjR;wYFP^VPgJ6$(m`+A0GB9i1?+EO3_EHMR~5O=Gr~z50UvvpIM94 zIW4r^k`0UV7kC73fru)URa8Cd`v;o*j#sL;wC8yqg%-Ic$A2FYQUCGEp5|}JfJ>bl zGH5zJf&Z-D>X8i!qNap=he-;Bryx16ifY4+`Z2vu&L-&zX3n{got`K&&4Bvto*&%8 z0is8X9o#If(}#--FzQzLsoOjZ6rH;LcSOK{I+S(qU~jSbJV(aFLYk{jzvF11NV$#B zj5U0KKh1`J$;J98jThkWK}ViiC$&-@^+jHy4j07${&``h)|BnEICSq}UzdyZsr7;| ze*phZ8s+~b1O7u@eR}`sIb`!&ern4_q=XZ{K%b@lnC-1| zF+Pae)RbL~k>1b!d&L|6>+q736!)*jn3r3GOU5((r7TNgOkhbu{ZIf@bb!5`VK} zDJ;$k!2n4fy&SzVy^M5x0Pfj~V_s|)mH``wC57rX5S~3bz5&$$8t_eEALR*#u0kKv z$_eLE4`}6O$Vn#z;GY>Ei$b*5%=y^S&a| zS}|L{PMe-kVK8|^pw|z2*P1D1C9XA7%Tiryrj^~r^N|ih5n@Ad%P2})IQNopXK_sD znNL|^9Oa&l0IJESd)H?phf8b5nd}%#d5^37!0}_V{Z4R;eR`m29G6VFYQ|eB?!F7) z+3_{3m0eT%lI{xoKsuDv5RxBWKRjY=mmRCo7st#tF*0py9xWiqlA27d(HG3T^h6ty z8D2l2vzaC{sDn)F^4G3+&Ti3I{2Xp9oH)hoHm#!xq;)xI*E?R**A{hTglQ~(45txF ztYSW{EHV}x4AodH3~zB@6V_NLERu3&6xP^tA{VtQ)=Fcob{l-6$+#W!MVjp5`YF>t z41oV(|Nnn?i|v@N(swWJpZ;wCv>XYQzc@9w-+up<`)=#~Q}cfukhbEUl5MMf;r`oT zQ5cX7AYT*)&9+7?`pMD1m{aoKT5Zx-FP{9*z=ySHeb&Rg)le)WRF+CYdr!%S@)#~~ zn7<0cvSCvNynuq$jFGpaCn0xEpYO>>xce3#5VLyaug2V2+t=Bme*RnICpYWpM$zaZ z>tXI3!rTOIZ;~FQ&vwo_+WvRr?a+m=W_H2ch_QfS3;>GuYwn_e8YPMvxyNv zs*HmPJjkp#K)FInt%ghUhxS>V`OG94`tD&Z&{l`n!ny4f=%VIlG&}W&`-`#<)K~K} zoE;{Mx$9N^0eu%GT+>#7C&jsK7pV1DL&n|1>VJ>I+~0Ev@8?}blVu34u}C?MYWYo; zW*k-!_K_(3L4mnyeQX^l3TS+ ztlnbb$q^ov>E(}ax<3BrjItcG{D}g-H`LQQuD!% zYu_iGDA~NIacaxl>W&~3nNe42-H)AcKa~yJGQD(azM^MS(e3%}J>;rD|H}#=BEvea zQdG#T+%1{VAugQ0RaUL6Z-z zKZi;1Xdi!x(6hS^>fL~O-~RP`k7iaYk8Tas4&KLRz>GGA=3w z15-ns%hW@i;J2}p?PesWs!gVgYDO?BkxS-eNTM|YE4nPXqPuJ~bPse#W=J@BVE&VrI2%S`G$c%OP)6S7-gWCl2hT>LZsUx5vq`^9DQ z8HuPjT*@wT<;t+kpIbE!10_RaS!20%nf+=m@@BCuSN)$+?dAojGypgK4UUm{S{;>-go(`ye5o#EmvnELR2l;O+(U=_ z1XY!2_1`u$v^t-_iJTm{uH|YNrM$ngGPJbFD3e-kQhz-*U1o;#0cT(XgN)dQ6cVks%57r3b*htn@f z3y%-sFG+1De?bBjGFL+Suigy=@+tSv?gi%G+dsM&=*-yGa?U6cuPBVGl`AVf0R1j? z#(0~1y@&gn2KV}R(6X;Lf|g~y3bah?C7{i?qMsu(jDNEF{^_awZ<2Ot+>8GX0RB_8 zH(^}CC$=bo&^d}AefhPMYjovVKmD%`mt@uWUyVTzbho@&`8m+g@+QE+R@dwc*4|db zOy)wcI-C0?odB0|4n6fG3EN940WOssY3fOOw%JoE{oKKF;*EP0uUn$B1&-^0th1bJ zdPc;YE=0?ikfgd`v1*jsofq8A36I|m_|QL-X%)tDWxw(MIp7<1?YK3|^EO^7it2c} z;*EqrHNEba)v~O9TB0r``4jDbZfFvyHv5+bE%_7u%Lc=i@&{VPoM?S;J(%U@9>SfU z1L81>Qd5A+2VEJ|Bv?Id_H{Kc%kwe&i!y=gj2iQj_haJgbz|Z-nfkdz;Pl00y2orI zsjvzwL<6uqZdtR$7I3EC%M#8V%TgOk8yL$gmvvEdk=;^8ziDAL2^l5s5pNvu9ip(E zVQYa99e>2q+RkvcKuC@QvHr_AE1?51dGxaMfQpfnDNJ{ZZ`DMvxu?+6V2>*YW%aW$ z(&rx`4?eEey+7V44rnYy|NC&0e1#4Cr6nVs=qw`*3&01;`jtG>2Es3YU}Tm64La7J z);Id+rp+nNLO@}!{GXdXzzBDqKQm?PQd96QdcaMwm>1Lp=={Z=u@_#XuQrGJY^?+Y zH}4L>a=F1@p|xuVYfSp++lD6&3h;}#{jrF;tQxe@6Updmv{4gL*%^v)6_R^~nv<&D z_kCYD76)3A%uB`Dr9$G(Xn+gpnctQfPRUIg}b1jWk?{h+M5YQT`&XSoj4q6n);-_z|F{PY<# z3I_jw9h5%@2liPW1Ka49JayL;NY0GF#_tm4_RY($0>DjSdC-@V7csh*c`rxJqzwc#%(395CcbaZVS9eXxh1&3-$UE6g*FRu&LuO4%kYu;C zxL>pdEVlTOR^anSUtnTW$kQg2v#9kEdY%yHuE~3Hcx?4j}^%DV-qjI(j zx*ap!bIFC);#1!);OC4|$f^E}zvX`fb^mE3gY(uA3}BXDmqj$>3Fh;bT*l><3R^Qt zGr;Umf82z{Stc4H$>LU}moWn`RlrjcFL+9l2Tw^#0}3l_)hvCx;8lvOi}F~Oa2^hL za=z}b(Qwt@jKxfq5I5d!%*;Jpejfu@TVC}Zj& z5@H&d(&2D;l`M+~k{Qt^`bew@@^R2k6eEVPz&H-tiQ7;kJ18;JnUGOYaVQ~@b=bfa zsUe1eSE`%0K%$o|S51SBIG z11ETm-5xF<6Lx@lz_kmsJv3!7`4Bm=Mx@=qHe&aKX1i$r^13KS6k&w48>-)chaqV( zJc-9oSKCyUry-iEHfT{!u>%A|9TNzdgc_sNdVPN^Hn%mw{v!zdmx{kF2<0lcx<=Cg z$1jB}yHR~YX7$*85&N%5;J=ctAzvYCbOYu-A%EpVUf4KgWQY{+3SwS=v{yT8`(;dA z2mfAQ?6glF3K4`tm}ZTMXQr=<=*tTWUqk*J=!<&uU(mqcm*ZsMB1D{>XT|ARqSL4k zq04Qq5FGT0i0kz97Z$}o+-7I^{1U#Dg4iW@AgxJr8OG6{Fr=UmoD88epZSl^>s>K- z5mm@~je=P?AP&`oLtscz%ydrGD%@Yp0a>qwX@bxV)X&00pz}OFm>+^ajENlMD63R4?nmA?kolzvyQlX9d;8yDh-$oh>H}JP*<-iYMlY zsFK5^Ly&_Lo=7&t3DO{E_lqcIMFNV%6C*&@D`VmyT!Y^0@E+(b1SA+42l+TuBnDgqK~$ks$a+N#m^Q=SOK?uHengc{@q69+$vse<$;&pMGV5C2o#b78UP&zT2C}bc6 zIqbavCxX(6V;I2HQxL}he1`Nd=3`J;J0A8g6hN24QH--v< z0g&~YU@V+sagf@THe|gli!1UL7>bn`CuTYqvJN*9bHZc-Y$rBw?JO|E*E7z7AkKpZ zuF)o~QuDpXAJ1x9xJiyOw^~VlDEVC&#rl0dXvL||Hd~76SJ}lhb@(6n#yYrkb7QUc z3l8nKV4+QHz5Tz$f0)skCIpsS0)V&I4CRfRresSBXE3J&>O<{!O=2y|8!PStEjLYN}1=8o4`l>9Xr zY=$EL=>G?XU&7`;FzOPX{ef|pP;&cHOYukh2U7mg{(-b+z@_*PX80psy%gt}f~@}^ zSab=S|G=_Kc=iWYTteyXJl~e7%r0jkzTT4^QqhacTk&Np7t0Chwb$$R3Ytf7 zoemZWBvp-K=EhfIk`b0qT60=YYMQIDMg-Pp`(r5J2vA7rDYmX7Rm7a#L3VirZ6{T` zf5*>Zr(7VOW)RVsS6>&u){X-R(a^w*rT=^7Yd1Vi-{9X5WLU&WnKajWO<))BO_qmW$z-E%e2C z>l(0gL_*&4#Fm-yp$W60ta_W!pbIX3qx=5Z@qC)FAUx|=FyrGu=H`4KjkFH#2}9w> zgzf_}>TPn4J}y<1T#g~Q-NKBF9BeG(y&!mGPj`Ury(=J75(HvVL!zY8L3668c zCpA`2Wp!$JHSR>z%Jx|1e6UjE>|wGkfn{~G7`$z7MLEX!+>7ng&za1w*C#i7u2Gws z3OLOf-lmaaX~8{JU<_vXEjRbu9z?u-Yj-mw>MPGt(KxZW zusfZGoDhymI<5H9ExUNQhnw&gwHt@U>Cu)`8p?VD2%8k7;|d$a_?}D zTB8^V?%h+67@f^EYqJm^Sb8(Tz{nSruYTJ@$jpPmr*S&-;k#fySqdFdh!D80)(8Ta z!j|Fe`Wn{j|;YulJkzkZ?X23 z!n4OuvIK~1_iArM?__f5+{Byw@R%V`>qZ7{k@lK#?U^o`RH?>2VHZLGV_ zCP(qmNN>KuS+|#TwPm?w#BR9O>D#Z3H&CWzBl#XmKN}_ssAZKPGcsmH*0HyOg9Q+C zjA47g@j}$=U8xJiySprfBbPrd(7@oVdKc9f$gh33)@QzosACoKx&5$Fn zes|ZF$RPX|w^V*kEyL81k`B3Ep*Nkdl0b+zM;_6K<@EU59c3dT*PaW0yd|$~OQ;dM zxOQDV?sHCZO8kV`R6~rT-Of6Z^tc5OFiy8iuEcV#VXBSYu3>JyawhZ)jiZQb0+_IR|0d zpH**T#k;@hcR|=WvR`~N+N+I=spQciMCg@eIw$h)Jci`&zlp^w@u%v4t4AeF<_7kbFTBpTti$a1aX2o>;W2pfwuKfZXcFhVanH zm*numK(}JIXspanS0#_Htje?tG>K7=Mc#*K8uXePS7!GxQ<<$B%E3;GXWD_ToN%#= zBTOYAOx&K8Dxl)`Zw|i4-vSR%YIBO8RTPv{c^?X5I&Xuk?@1RmOkCe=X`U@h?_SX0 zT-#*vuS1Y>|IEDu^PQcN1nB19;YNELL!qU`SqFGf z?{g+#$tD%zRYapp9|kEC_*$G^BQelDrtQnF%=GZ<&KFkYSVi4fd>|$@M__R|*Ggi_ z0{h@Teb)zmTPJ>rPbyIb-h^y;yUYgKzfyJ8(th43w#b{G>~5c{h@}c1RJ+!gohW9S zA0Qno>^O;s9{Nc4;yaG;Yr8|!rhfdrd9@uO8V!>ALC5SBvb0@gx<{H@159a|>1@$v zG|>?x>oSWw%J28hD5O~cDK#G&7yV*cSD+O^A3J5 z#FC67sA(}~HApYHMaOHFGnvj-)=*)qk13@PHJztq*iVby5#QmC`6&L&MJH8GZ4M{;~(6TSK*Tcn?Z*;Fr1l%eA3t5u#rT(V_ z_ENyB^4y^mfL5MUmr6?-TyTzFcvqf_mtL%ak1xKsIJ7(?d2z8|c^32H;^4<|LBWFn zpUx4x;>P^i!p)S){05iRn?G^1iHk$?k{l6o@@vBi)6*K% z_r8q)6veQ7kHTB(f<>k&4XP9=lXcmaq##1dZ)zK@5h}r zZ@>0C>|WCX?Wwd|spg5%INGH>+wR(>ZQB~!Kxvz6&z-Ha!&+9a9fg znQck7wW@gnol%3%n8H$6bjDMI0~+a^$^g*-Su0vMKN%}YR~p{li?@8D=YwD9>7P@s z&X4K1sORZ~?1~idz3KF4dq6Eitc56Kun?T)Ykxr8pKJ~dvC-h=_`aJT=4jg$@f7L=A5rWoTQ93#HDhNf#V`qS{IZ-}tSoohw?)PMxqc?qk;*iX3mSQ4g3m z%0En|tkc;3%D0(p{=743gf~1Y3K&mr>rix5H@9FCVy>uogvBjJ5BH>yO1E9%96O(Vufl6j)Y z8(VJ-i&S8>l3T+UUB1M z#Tovv-T9#;3nGYd5yWeFbg3*$-nsS^nWmu0hPTM#?rX~gb5+$0%5YZl!<0vM#Rd+& z`IbWMK+%f*B@ndM=1Zfhs%t8!^U!kf)^gcMM^&<*Cx_=bGv**CQ;```Rh-M0wzyAZ z#ikYyv2AFr_Z^@tw{kwH08d-^kTha`&9^Bg6Ol6lRiYB}j>*3a$Bp>YJoq&u zQWotyG}9*5(_Ec<*Q2f18&jP0Y~YOiY7>zrB2@+Rk^ENHDQOifHu#<$EN#7HA{L>@ z^&g`1yXMy3@Cq|bhldBOdq}iV%W4H);ftwdPnFEA1WJ+PJ&?5T{8DO5qj>xt`_t+7 z_@xY%M#=g2k3d|7(HUic=%RK+Y)qDtIz`!e>m-ogTacc4xTiP>-2ovJOz-^kj>s6T zfy7b+LC?IgzLPh6O^h=JvgGQF5VWDgjH>N^zvy>Crig~lZCX2@@!5!BI$V$$E&JxbGN(u4@(Yd zOkOOqFWJ88uZa*fydMgh@!Lg*IwtoMBZ>^i`OD|{Jzhn!Sv$Vcu4G&ZCM^-EV4r%X zqi$>!UXuK|o9zX!YvQAi=5uUn#_er@Zqnz7@DdJJ3UYmeIW`YHt4KEHkCkn@>s8%k z`k<1xc-$Q{$)5=$$KU=-zi8tZb8O7cufj{lGl~TwmWMfAiKIC1jxzkQ}h};4(8bNm^gad*uE@ z)6`H1_F#P`FVFRdvx(t((t3a1Bj+E{#)ch9>tFNo?0r(<^gqC_982PDmJSdskQ9s5L*=OKJsoU*&08a%-Y{7pyh~PYBkY zf=3CU*G3N|c8sPXz8a6;qgO}Cc1T0Ly8^~7c0v>yGe z>1OsvYhUX6b3LeLqep*wrPP&VJ^Y{GM)c@##1vn2ofg(&&qM+{qB+cE-vEqhs zXhG(dYDP#4OEaFonGZGiuNLKU=n(O;($HyB=MaF&%uvn<4Pf)XdYpn)SjG&&GR>6D zLIPO*@s4GD2#yn>eRu)ybv|6{QFNcmU{>i||Ax#YUYu?*E^YOma_ zZpo&v&4R2<4Fp388n|iY)_hN1-Sc_i#J~K0LmRxGucd|#M#Y2o^Ets=`H|qQ{1B`> zunZZB$tqViYG@sQb>V-+7u3Q&^R|U$BXdiwbATk5B#T~^UKT7%A_mKnh_U1=xW`3M z!ZUTTw*g!T`PNvjOf%JkERtNcW&I%>+kG^QpbM?3MRhdgIs^iasM8G^RVF}O3G|Q- zb_*_;D1n{21Z9vax&$f!i0VP4eM$L)f`Si<=N|Y&U1qx<1a`(GIHOJl>vH2-mufFP zCeWk4Y%9I=SU|5|jS1)@x}>r}s_7v}abHsGAO%sPI&u)o13T;5EtJ=@gKY=kP}UDX zP_6=s)`q$`%yvVtOv`CQT^74ZSn}m0toCv(_)o>uP=A*A5O=1$-9qC;qSPA{EC8jS9Qr#f;wxs)-1Esd9e1q7Fj z@8wXTLjZ^#f~fP7Vgy0KC13^t<`OV~00si_SjCoUcDse1qSo3t?t=44#TNLn0~pzA zxzqniPJ>6Kr#TMXGGo-aN0Gqsl-1C(%NWf1B59~AhFY0P`bGx5*+VZ=W}_i5DQ25o zU|T{RsXBiIgTp#@x#}NBVT{}isQRlcm8km5pB$;i7CiA*jm>y+q!J5z;;j-J^W;c5 zHuQUzDKNgm4WnLY_JxeK+CdXQ22dEDK;m6#v zt&djgaL*D8TgkB6*#W8p(&5J}vaJt+RT%DBT%j}>Rz5pGnFk#&M|BokNKf`#t6duJ zLg!Tb|1o&{ceep+{fb8mEB}gj4`?OAX;DAqo9%hW{XYiAhiS^m`tZw4waK2 za=ajP>LI=sAu;veUU{o!CUHDFI5zfHYG>+R zhSVXpy?{jOuLi&4+2ManX%|a9TK!MVg&GzpI_Dm|$ODdBpIpF-ZNhz$RxilT%!*qc ztr`{oY4?E@dKP)>&#k>GI))Vjf6tV*?mT0p&-=>^V$g{(QWqcnK6LebIS}6w_q|6SMGaaSxwYkNz!kSF=Y5BREv<I zf0SPeHLqM#R~$AW*CH2DvtbEdw-;&{#M{!~6%K15=%sE`)ssDPM{YQmW=${E2etp2x- zld#^)Ndh5SBS|gS!5U&RsM0YX^szr)1AElboeeeNEJ4`U96UN$bq*doz(3Tq%8(%m zw04=r90>d0DiSVJvdy4#aZz0&?49<(_bz$$4|=Fg>U(1>0_xwr3ToKqHsK$gU}+c zN7)aezEA&T-;ctvX?~6t>D6tP1MRbBKG143GlEv7nG7u=5MdhVGOcF2m*R_8#^gsZ z>XX;(npvbjP8}**q(4d>T3@I?0^&mbArND*(~xCAy*VBwQZ3JM&U@H7NB*$_iKFI8PU z_8tFXsNKE8YtI|M*u+k=`i%yUNGn>=?v+3DHUp0HeyWYC@NP18n6!U>f8Ud0o{Q(w zm{03QHio(CI}IpMuM?d}ecJL}AIsb$S*d;CPPXGiU?}Z4DNRyF&$nUrZj|KvzLVBT zRS;S#AVj!AntfBnMHUT1g@ARb_+VWs&T$;pV7U{lv->v}4!}Qn3((!Bs_WOQmBKUhG*WZ_dN^w|Z5uO69un3QY?~skw%%NgScql}^eB_UV z_{*92hnCJl+R z1<%?Y5GNLkX#&eSEVjUEjy7?yuw)M`Ea`88#33PDfN}QjH*wfX6BbD!Mu3{g+U*wC z5R3EtIJDwz1B>1Ti>b!NuOh%>1=e#R)}W@o7<_~4IZl@aT76|tp|z1SnyGq67kE)$OTTu>C4G@ayc2Vf|HT%axyAGk$^Xb7qN@- zmcs;jrVrIGBW$2t-eA#H56W8>69LZIiEZRnM82o#VErm04EfR12fE)hzl?i1Wp}|T zyM_|YhI|(d#`mLb#b-EzzKZ8?(OqUv#%5#95{g( zs4Vrv-3TY*PgneT<2_EE-n+*6?C!JFk;iP|yx;EZ$0y_~-Jh827x+55a?Lb``7w~JagiQ!F+Dwl4miDy zYEfv_8d$t9C65KP$aIyXA0Cxw#%J>Q`TE`q$@$6+VYnmnYu!!aTI<_2)B)i}LGEl^ zc2MX-_!1ilevkM48|N~)gg0WI+}tGiPUcq#f3d? z=VP%?=;7lh+m&G0;puxYw-EPC^W|*2I`WX{ezpX2Q#D9kOHkGHqR2qL(Muck6s-?7%4KYE%IH?+w(HZ^W9`e?B3W1^!L9hRPlz3U_1Opih6 z{If3JXAf5m-AI5tRGivc$Y>AN_aDv{e_b)m5mkJU`zm-wMUv{Ni*-(XqJz$L9w)jQ z+k0#M{wg~`i7UrDHM!Y?6NPW)iTkhA>U{C#cm9R*IP$kpioJ1yyMt+DQtikaS!Mwf zgD8TtJLPV{IWBAM@V3&@S8)%2Mq8|_3VGtGP>wLR(`jzsAhThAc=S=p0l3;gc;oORO9n4?3l#wudM z5xtyV@zjC`TMZ0~d^-uTSdG=L?&3cPbNwapwfm?^t)Qr0YjUa|HA$2`E0YxF@z_XZ zK)PE!Uggs}Z0tHy?()kOWj_r?)fbqebc+$)H49x)AwNc)%0d$S zz6z$;sqO{O)+;y4Ogz>XCDHEvsyTe;WarE&kj;%>AuS6~i+bkFRZ&y=(Is@%{=Or8 zirbIwQ?3^hTCks_I^h0@D71Lc7B}?eL>!-47uDe1TkyMr{Ot1;<>-xX3K<&`sdCxo?d=M zcNaui;jb(y14g)S%Y9;Hr+kOv1r^eCm`=(U-f*?zL@R|Vx2lu1N6a@C^CnNEzqg)$ zZoMI`RUqt{==@0h4kBy&w@+Gf(oti~MQShmAf?zA&js{kWhM&MM25(MIqcTmjKFih z21xeGUM|0aH*f~ew&9_`#glyoE$excyFG@VnlhlyE8Eogd1apy<(v`nq>YP_1v4nY z1zBGjlZ`lFud-_nG^pFxv*0$~cxFz9Um_VwT5qjTT`(6XaNQ;R8hie^G^dZrb%n3} z)8i*RKc?K7mgUWkuja*Ssp0V6Zr?h(13<>*iP*!+9+Uy#^3W>JVu&7T6f_1}lEtey z#RYg)O^tHR_0{7pS)oq)jL}COM6yHX*yjwr83`u2$0(-{4fjo=eqL9C&9C}9=ttN7 zd|QPgCDYfMd^xSCXe8-;$7eJ;U+yuJ#XInINF=YnEB9RgX~Z~sS1Y0xmDy))a0=)< z|LjR4wRo|p+Xj1MEVW!?`R<#VbN-2*;r+6giOTLYyY+5&L?5=lJ+&>)>N*Ik>>v~1 zz0=J}>O9-@ZZ+q|rZ$)Q+WpsMCJ_c%mg+Y;e+jJ)(0GLVeyAmMhDtO_o-WI}zvNq> zU`db~2+z%VtX1*-Y<9CBVZSi8E_sLm=wr1rr8)+!SX!>;J=3_{EzKDHn^t+89E`O= z)m%a5gYW6E_a9HJJ5qO9e`6lJy8?I)$85m7T)Fsro0^1o-8@||NxV#KP(9^$E0Dq+ z9^cI14`XkqvS?;!t-H`LT@~ve^hK4H171?ksAh(|OAm+TviBl-lX;7RA-93h@&%SV z>VukB@6l=edUK)nuC=K~@WguH9dW%LS@+8YLtC*#OL+NPY%?<}|Jz*AfpAJWd}doj z5FZ_xio&{a-WTa5LH}@LriZm1S_)rl#%V(-0$QB*$G%Y?-7kJ;x-Oq&RrccI%IjMZ zjs;=&2}(S2u0CL0zIM~Qi?n-r1+en;!#d&>(w_IVBb+||wsMi5tbdI#OBvpTLD}OfUj-j*c-!Ih zJxV634!baEgt}s>(F9vgo)zz}82hSLC_X=c>}xn5ypl0q(Fjb%Ht^I90#jddL~-eH z$lr_Brw=8+YZASs{LFZk>`TSKux9=$->!X#!1Zk=)?NM1)6`#htBuKNsI1Bq*9KiR zx3WAV4mGdu1bO`xgy3>QxB~&LjOdq|x9>brs4sECA%pnZJZQWDgFg(raCWS&tfUUn z?{%#Gb@$2(@{Ua62sQCxcRH;DDe9`&k`Cn$J&Fh-;`H}oUWDm!31SAJ6>aZwqbFV} zkM2@^5uwdlKKzK-@EjJ=Zl{01!?GYnxTpPs@D^HE0f;)vk0#fY_a`9n`bJa-WDtN^ zy+LEAJuR~D8xWkl8a^Y4xE1Tjrx5a#BQ}WY+8rKoaRqHIixNBi2B(;qD^)+v_ka4v zTd5??5dZ2Lbq3xz8*~mgV!4iBQP6lP-@7OLsRaQt;dMqxuI`>zmND5+$E%pJuk6RG zF6Bxr!d0$h=*Zf5gVZ(wE=Brm);^aVAP9+)^wnGPq!OL1zh!IqL?tqcKxLbOb^d8> zOJivG!Ce2j0HJVIk6VY>%+_>hH}vaBKjis=?|!+>JO3e$+yG+HW*d%OUG*kivIBwPNV2w$O~l)NHbp93dl z;_CRg`_+b4?)k$om!0o1MLK5HbOXWRLk!g@lAlkQKZ$&ObgZlV?Rp3@eo>B;d=UwZ&oF3MOO zVXrFE%pV-wj60axZmIM2a+?fg5ERsrxoQ7+Kn86<+6UcRA*!4r{z*sM9z}lz$s@?E9cxcu1Gx zy$@d$$7fyRNts<4$d?4ooz>eJCC}%&^ zbZKJTKI~WJd3dGcLyjwthMS=~xDW!ZQHLn!66YI<>ey~CLpGAe>mEuIgE4$l0Tkhc z%vBEs9uewVs#Y0%%!>9KOfR(G6E!e3FyNI*xKhMX)mGhNE82F0%?hCe0F+8)#Mn+2 zecr4E`}j;OFM{meL&~-I)pM^KPV3yxL?IQ3{YG2yfrY~3cGAlGGilWq_VAZxWusKm zqrU4}QV$%z=XTz|qWNjD&IO%XdvBO?goHWrUQf9x3;2wX1rlE+UdQ?EO3bXbj~0`B%#2uTjrs5G()#_)+0O+V zH#B($==ZAi+j4ruY+_n@Nr_7Qh93+#98;YGo;Hr*e@3W9$C-Xr4!u z4S%1PZc0Gp^v!GRQ;0qOUX>z3)*dm-!JThIr)w@ko^Wc7-)JHOU80tVf3#SHj)Eds z*AJH|s<2;_C>~qTGbvuM!f(3;GPs)FqTMG!ig$>3ZBnF&H~fYiFV!f`zcFBT%%l(f z(JQ}({Qs!>2H-$~ZtK|G*tVT)Y;SDaHYeN|8{4+Cv8|15ZEWk`@4a8IYEIX!?ykCX zZ`Jfv_36Gx@1l`xz^iSV^8)zy$@@(}QQ%oYpc6OGp`4^`y7Gm_kvLi`HXSE}nn8z| ze7}Z|4|v;0owK0;t+Dhoc4)@0#uygDR#nOuQg~?60%^1i9&pE&-TCd#w`=m3@~HXg zz_(*3($T$1j!lw}Tqti}vDYT!9CqjmPE3=qy4vo;-M7=l@zgHI(-5E~wDsQr#rm`K zaIoA(=J0lXKiDq@we3dmee~zWx#f58_9Gi5-@lmjT`f9E(TH zdW*H0XSC`S-b~{V*Iu^8)1yM*5_5P_+C7OP2B+MFIPOZD#?dntoN?>y?O9|QQw4mI zY=Og*BktF_%>>a3){+1m1Zlm4A338rzj3%E*IV0qw82DrE&%ofv^8Wk$S7*7ux|f_ z{{1)L)8zQs^y<2IeVwu=J~wq08g}r9GgN96v9pQ!7-r44f{^;C;!$a_&uxa_R-Xj^=i7(kGL#MISfuPqKS$ zyvFGgC6jsDRtX>i%CRM$>^kK=Ubb$uRzP!CR(4@4j>L4vL-)9!ij^ofoeO|-gXJRq zVyU`I)3)vYMY2T4mr~WO9lFu-VPizK)h5d}MY;pOoYfNaOM}8xX*BAabpf*mWs!<@ z+Ql(u$~RfHSz}PuMxq%k*OM+uikb{rH9BnTjhSC{n6JQTp9zf^oP$OXI4SNM-!@49 zojh!l1ZMOM9~0W6m{uM2$Q+^2NY_!n<2+|XWrCWVD{Hw)G^+ar73s*&*Y%%#|H`S= zN6-n6?hp<4NIIqIHm72PjWO?aZ+&xeAm=_5{93)og57s0m3P3|mYN6s$`q^@VH&Q=qr_(NaM-g}q7TKV z&sDT4UeL@O$w3nNT*P)yotj__Aj>!Y?zol28iv~Tz%fw&Wjom$@-1X?p^KrU%}V{R z%_Q4w!_J!Nx_RLo9o=zDf4W_!gQ*daO^VOq7WSMzPV!;=xw%J&xr32?F643VUS zy1_>PR}Rdu=GU*ru^$0~6VxW3IEum5?$UHdS&HTty4QPMhPa^I)A6=c2b47Fv>%gt zusr^3S>h}zG1yd|eU_Xww}^(E(z!o;=7%Zc0yu1{aYoj-Wz8`M+SjJJ)>iDc%4>5K z4JBnnC*u;i;ohz8m-)g}&niX$!(k`@E=n0tNWv9=Kh0X2Bi|2bVq9oX>)zRGSd|Ly z)bsCZuvIg)Ol&N-)`1m156W+7I@^OZ36Cx82<+GZdBU8a)yvGZrZIRBRC45vJy~EX zm}y3q+`oo-skR=)nZW$BV1^?8awMK3HvvZFmMn~XoZGx{sSNSv8Z`7nt51(*Y8(aF zDag(jTDRtFwpGnL8*3fgNo$mbJ;}yyH7bfa3HciG{o{HHjZTI7nW{T`y-D8EF}y@x zAGkg-Z>4J6I3IaAAGGRgOFOm}^rkad9!Y&Ia5Y97Ueq}35nF9Rcf9hbY^O8SqNK=N zeZ>-(_3Rtjcz7qUN^DWs**V$=e>e_!H_z1mL6=T1VXu74N#t;*{2q9#BKx|9^M=Nq z(O9o9apw$&zv2oPQ8T8JbZ$f;F^Y9DC9_8#Ck|^As^KLYVdQTS( zlY7(`0nMuf>kyWhl{3;h#Hqz`O~dAqPbK0a7$WKVDHHvAvIx;B$2I( z#Xe#f#JgMiK-Pwrq!;w0uOi@rS%s?T{Ju_`_D#bWu{yw@C9}YUQ=1h;F|@=oV>7CU zxhM-5NGqGekD=hAw^Nt+=BrJjt78|;EsCGd;gO-m_w%=AnOZf61uqtGqV82Kq-sIs z`EH{2?6n^miHSA!yI^^*z*|l=t|#(S`@OmPOCSdF<%Yc)Ji1+?9(vMNsR#P;rdMJw zicZ|!OD5P7q4ngCb^C4GD*Mm)MMZc`?aKtWA;B0uy4@A+37GFWYF;$?ru0*Yv!T#F z96nO&R!|*>kWMB^i(I&X!iOxvrH6Wn_N^IWczkq&Vv{#9Jk0&bItKqK7TA!cc<8%3gfH(PPyr$_ORF;#LoRxARw=*t z+!3t2s=>hFyBq?_{I_x%E%2`0gI;$rgcz);2ohN0I#FttYSJ6HfBnLx_c9{Cvo!BA z*uSo-1G8jSL#N8}l~hd44#*kCXqZhAT~YUh?eQ9TR$~MDLF4{RDVmV4jGB-?Qm9u_ z93&$>Jg|3G`m#)oEnQBJWcypxB`8su-BQ=1R6x0A%sRPl)`i?TPiC-)O_$v4IUli@ zPv{Zet)fgtzvZp!T@(`Ky`1-j>|v})53-wJ%Gv)>Io6#V&fdA3;@+sv=@{;EshX`t z77!rWl7Rs5xnq_lbZzDd1UF*UsIVH*e`^8*Q9|j3{etnM*6_Cr9*z*2AfN%wML}k* zoV3se(PATn{BLl*;>uZzU5^MqDWxL)Y($qngEU$`L6AKL;@MoXu6^ z4MySKz-9x?SA&blu7CZbHZZ1k@@V(}&QQBbHueL-@V{z0_aHa9!!%=YTDgp}<)O+A zKnGLJ=6pU>COVQad2|=cZ<^Ugy?@u`gXmbj_rmu0K^=#sw zmN)9MY)z#wmX`rui7PeY!=3Wi$##N|r7FBeWFHOAHjq&d zgr*!jj8GZ5tRFZzlwVlyZ>aA&<5p<%jxXL0z{on^_cfjs|MTa)fe2fR=A^^OKe!QM ziJJ<&nfXU~F{eM@GHz;qrMO)@)>b3oYfZCH2g40v+b69`Gh=hC)o_B}RcaR$<-h=q zb>j|4EeH#tX(K^x8iAJ8g>JP+I?4f9;3Z+6u7nxTrrh|Cy_L+x8{|&=AK-;qJcOE2 zhfa7jF8mHQz}>;%-5*!|{VDFX6TY3(cP6kynKajGPUFo;^1|T?h88U{5?TXYCphOp zr@S_>X7U+>hzaAF#{>$rGdNt`&k}%wzN3QMF2#T`z~`@e^~1v|0OB{RVAIcx4sz`y zAZ|!_UpHV&Rp3JAzKY)7Qgp*S3}Yw7p*U~+4I827ZLS?7bkPHD_v!P7Fy~YcF<|^r zWElr5zWQ9Cb=~Y?=w&7IbpvgyOAvbJ2pq>HzKz3prOTWxa+I!w9!4o6RsawtQBxPu zH`gBc5$FJ-x4_9n5!R`^)_ceIJHX>k|F$6ltUZ>jbok>GabE5HJbK&V+c&DTKOUte z9~A@klVL##B`&$p6{v;{@sPKc+D`K~ez4iBtALLg=ASd_#7|5Z|y`=nCy(VmLWitQUTh zrW5NrDrb?f1v9X8`_w-NoBx4q>~Oi{IS%f%;nE)&J|zEUlw%Jzt!yz~$eyQkAh+yP z30o8L+XR~(WFp;Pe$1IU6Pe0{^?cwBuPI}--pB$*HNudChgPu*k2zv}8}4eCEfs<2!`%0mD{>ar_JF zl=d$^$R=Z&`M&AQNLW?68nv{4nYN81ytUb$vAVdWsXxuFRwaV3bVUGO0jWSuLVOwf zFy5BUY=zw>b)Qde;nsDTLEb^cb-bbhxT0e9n$;*V_54TtVQkjkKl%37OgU&fFrZpp z??39EeowW(89HU4HmY^L6HA%16S=56RGV;5XMzNlP-nu6!;vR1Sbl7KNNc%U%l-YujGx&EQ7oL9}Go%ehHR?SAp!*|35al-WKTuf;p?=KCQ=?)7?y^ydQKl$f!m zG^Y-YnXr;XRa$u}4KokTQyb1;juAD# zlFHEwxO0572Faw=QsB+Cd@pRbswxS4sMw8YXhQf+cWFX&Bt!Kql(2in4|FTjl|oC- zdG{Y5<=bjY$d_DbGAbRK@+7ogpcvzI2W2RDTD6s?#P6q8OI^zy zCmmLs4dn>EwE;jG>vmuEIW+|s{9ks-zc;!h(*tiPx)9KnO}~^xPQe^NjQ)Zji?OxE zTzz?8?;;dHx4@Bo;k#&DAsFe1&6t3Fq1^9Cs)~?v{*l8-CehYeYytlA!FD|Fe8;fQ z>Eb+8-$`ckhuk*Y?p%E+)kfo4_*`2lR#zZiMH6F#Kx|h39xWFeGf-mWSdJAci{}3m zAI$_-(~YE)ny8k zMZI@;lH!|%IciJmTNj|U+eeyQZO%&Yi5fTDxa;csLPPkYv~~VynmHlG%0tn6d~NCQ zrG^oRyRzUawe!u5kV>Ae0}1!{fpe8+&&LMmkNf2EWmNx*QPDJP9{z-Il^E=&jrH<) zbY#zMgT}1Wep~WWOUe^WS?jt_uBON%l4{3FQRsmJA zgnF@OWacL?l`o(f%ND8d8~k>6U&&^V_tvGy2F3~MMPK%haSwmtv3OK0BF;Rp{xP5_h;V>C>({kEBfHb~aKkuT-Gb)y;{n##d+ zx@Yth88@DsjmIplU^d+^hgMWC8H8$=wJGsi7~*&aMX-^`_=YAJ>eRQ_Vg2`tWSd=a zn7dWuI)JJZz11!8orDPkAfQN*0sC_4Rq(D@Cf%~XR-HZt{D z2a*NQ%A9G*(V4k!#F~kj&y2We;~MVfy5Yy_Sl})Ob&_1Cqf`2Qtt0Wa)-OPjld0R~ zMuTJ98p~Pcop+97)Mc?C)sMo;_M@8l-YhKY}3IT+rAw zEsC3liD97esVjVa1MY0498EuiNMlWqjo$)1u5E($czU>RTy}0s$`{$$3iy2P9Wv?k zv^+i{uhnkjf9~f>j$HltT;#dP`FI;}_NMZ5iu7y1RXe$doVYGHas5mlg+%rb41?ZVe4vSY3Q2H@vtt6OfdK+` zzAE{M;)n{-=hy#^CBlt0>O+yeeJs*7g?1AU!2kSyT(3d$flnshq>y1*$^BDwYZ`IW zN~Zki#yo8Cu#Oe!`F)UJ?+grhACcNNC< zHh_Fh?e*F8)S>mYQ2_wDwO`iQ%RMV@&o=8HR0=r_T&rg|L+X`_ypBAv8&STG%u`t_ zBH$c@yN|mjXknG4=y6iV*fC%TR{9`!nT)T|;0`kE#@ESi77(fXqLDSrOo&#E_tU%e zJMsQl8}yvjEZWo`c?1r$m5)Y@Qstf zX8S}i1ZU;RzL#DvG?gd#y=C!3iMkd1fIwNSw`Pi1bBgCgtDj3pL{cLOqwg8~jE zhuWg;4fXek*=MqY)>Gf%xML&&%ijl8K+pcM{?$1BkfJ^d(ORan?9=#-Ev<>;G#F9L z-r4Krs1j8TfkA+A{~xS#iB3h)2fhegg+~))VF^af-EN${^n6GlQjY4}+gm(8GvD4Q zs#VdWrmn5JodT@pvR^l1*Nv{1#_bsOID5R%e3ED;3(lBnq^wB}93Dyw%^+~{ z?NMt&b9d^kSu3N3-y%G00@lG%oPVUFKQPC?$&-2SWf}0%sr`+OOhBEaOoOy1ZUugk z0H$sqyO*q!R*1i%s?o|W$)cHN;#31US>IbUzI&8zhQP-n>tv%}rSeDCh=ofD_gE@{ zo6;Ns7E6UIaIJGE>h`@(4uNpX+_Fy@VcqoG&NZyuxFT2=TwCZ1etNw1hhUmw%Iudg zoAzid;T#a(&t~m#qEcW`^JCogN~oDMDmQHbR}|@sown$t(fo6OtY&&jyzPPcDl-7a(C~RJwR_5a67@|sn-=>-M-YmI6A;*!AmRt zASC$-cXs?e473x$5yi6)q=HxTEHLLPXn@^NE-|cH!l)a4V}S$F-dV^KU8;>Fe?l|j zMGfd9GSPfgK9V7_xQf-;{1|xb%X9nw?|aHNvhLmN6Bp-t}A{X8(*wH$09er zfEw-_Znw9WzcR+GhkFWzNUD2b)s10TJwvw$zpx>kJYl8BSzj98YdC4Z%2kNCmOcFz zo5JXHKMtA1!X)dZRUvb?uGsEANj{C4f(ZP8L7v4}_$g(ge**StnQkxg%2vDm^d~+) z&7+I1Z14AP2FEtYzvYj%?JMlp@2bi0aU}72P^w39{1N_LoZWZ%M5S*T# zcbW;r(M1{&->@`dDb2ik(R@WeZmpb&R)% zG3(}rA;hs8Md`r{c)=fO%>b%gj0t*x892yNA7uz}rGHnGP|xPZSHN1laLx!>i|(Y< z!0j*c`ffW&#yJSaG!@xDr*xhe$pUQR5#3p4ZYigZ!LLEo^rI9&KKwaVFe?0oCh5ju zUtY;$LmDXOz9xRVXn9?Tw^%+K3NMmiQA66**oX6-t2(O5P)2q!1f(vfJo$-$DH;r) zst9trpV1!oBb)Cto6kS&z$tJ?+p=eSZ4+qxiL0;8 zfP87}ZH@N~2z3AJ=MdwY5H0OitS{998rO0EKWW7`jEo0clPP(7KII6QO~CFTofC-jDKn>^{!R>S^<$ z1cKN7ehZor;NXD|tSnfkj{#S8+0*VGD$;3UgCgsR=I7?vCme zBI7VQn4v)96u-pIqjrtR53LcT`?P@0(E-05aM;plE%Lmw!7;g51~34{Jy-`{BK+`P z4?EoAn2MfCper4e=LFAXYHGDCK8!%wotV8eLnjLQ=W~d-RdwHHFp#GDmI!I&bgXiq zR8=~J@au(+XSDSQgHJzNsGq!j$?CrN-8Ns#gUiTz4ex-KT zQK+peNQwUzX6q$)>{`n~6aI2P3p^#%2LzTfXSJY61!Z)2F0HKgn`xgPZ9yUotHR;C zoCi@+o$M|X!h=F3Fn~M$>`QNKFpI%-$M8fr9PHxeL8lhw5=#lG*N+Q-9;An9-TrS< zyAiBv?(3n@UjD)0%JIappJqS7M{$xDH_?T9j;1BRjVEtsjJ0IUJC!J$_r9k8b@&KA zg$91;kXFp}rds?1PYOa!Ce9@)ufUa~cbU8>zot*wovFDT5j4L8Zi|tRL46m8jg8yL zug0|~P~l3i0#Jx>GB=_xTsjgN#~pln4UEI@$BnOS;GY8e*mUw#{8tla5mwme5s^yp z+zOI;<}rfx+2{M9O~1Xl+So$Td)M}VW6>pJu327=ksZ+2lkplUmD#Qu!?{8!3smJ@ zMR^(S4W=N&(osbY-qa#}9DPdl?iBmeVKDA4{xe=L3V2r`A7$VohhDh_OGLJ;;MQ}W zqdfUOgScxeN$+A<5eV1g%^ZDJ?e?e>wp{zxncB!Z5F-QiP;AO|8o+GoCPG@=AFk3> zOZNrIpC&(z-HQ10NnpqWgo#|~8%2>&V2w948MX3&C6{ze5tR4)?S~TQ0iUS!0@F}> z&-=q$56}a=-mf$D_`mJHF&Xsuz3*QM`hOh90UsBFUvIB&gXsqQI#n<8r3yX3+g02) z@b-L5@$~ZUbo=@KvM+mOKq6~ANZ>7wTh@!Y1eUrScKDwntR!&e~d< zaeAep<}vH7T{7oe{L^{wrx%U{E7a2tt7n#tFF?G~udj!eNnvM5c-1fGIaIck5b-jBPNsVM(8*S_F4Wlol?RGN~lk4%mnO zi|y#p@n~kYA`AX%gw7Aow$-Ys)#RgweApmP(xMZ1#*tkGYSEVK z&!|^|(coITAT{%>o|P{mTnbB}@l{#vt;i;Dy7Lsl+Fe?RLPS+>YD2@AD2Uh1rOn*y z9+MEn?EZ0Y@(H3N&_9`ry0?{9u4QsJMN}{Bf+=yj*gYaI-x|`7taQ<7KLr+d53?3; z`14TQvXW1db97HuHL&^&q}Q2)=g$OqB~+aw?7>g&X9Dj8B)N5l8fECWyvR{6Zy3g@_&ghEHattUKxw0TT`T>u;Cx&s#^`TG#j%8fhz$ zTXr|RluP1GAX&WGkhOSAl`vGi@SDqglCtk#G8B;fq><7w{AKQD1nj^x;AvdzJU`^UUDo4pDPr3me<-Y!O`a2aTkXzp)U{=WPSs z;ix*YY^T1jL@zx?T&t&`fbq~DPTY&aRl;Y>0#>SZAE#!Pb77vEnW4|giPw8+ug({~PCz@4uyo}!?v%((#;rXbMA)j^ z`}kSrVT2^-XlHS8;1HT=@RA-D*?il8%rh|NS`SOuC**>~3VA#Kfq7`A2A)|TIEK?p zxoR1-&@BHr*Kw~kP&n^V-o3>!pOU-)pEM}{cn&usTFc$Pn3=sPR~!E*52MjH_x-Mz z&UA*H4U~GP8P`hsy}LI|d+^(?wtmE*AJYMURu*amMrBRGHu(69%;Co;m=6)$N#Ik|VUurL$@wkPj}E3$E3zOkaoh<-f7hUlPRw4$rm0+FuSok-(e0RTL6Wl&ucYJlFIb z-l46ZXTCl7xG-&39aX`;q-;@NE_m^WMJ(z_3lMa-O?{M?F5o@kDE!-_$aT=2xKjb$ z0UXh1-KbpOr;XA*znV@_Al^E&(3akBY(?4@o}66bJU7(u=w z;(zz|oY^k%%z4=D@((ML&QQ0Ui(Dt4NlfYyT`Q8Oq#A=zSbHoWkl)((B?-#)W(9#HR#Ajc&h*pV6Uh`tt+NtjVL1fA7 zHv*>buj7j{=jP7>Q%@xDnxjy$Mmkf9%{j%|ov!ap&pP+5*0b$a`f->RE@7LQn_+Y@ zn*sYYU3BC>oA)Lfd(-FV=o)qn277A;E_!gC*++1Z_=rT*nMamy-9!Zphoj)TO~LVS zZh~)2_Tv1j5tk9Y0|r0zb^fAz1O_L$43%Jfn=AkAY&MTowaO3gr~ViD z!f6MNDEgtGJGGx&CjL)+&4Lwe|5Cf!_XEihVfn2EuOW!*CE#RxXZ!E}MLzPG#xNKY z>mKhu@8150!7!9coM@cOr<$RwDDYFDR3PlX(H+p8_x~d&ASds?V99@m^L3_WNa1iz z(W-y+Mf|lGk1=@zzrXx1kt7DpA54GKKaz$AU7TxYz71myV*MYyVm+h1Cf;zJbu}&f zoIGQlLmPENzF;2d#5))XK)#?KsQ~c`|J(Y1#!NZZxRCFWO8iV)+ypkK^I7^^OEe^= z^P2`iR|P0xSL9t~=04Z(l{hBzhu!nK%+`+l<%4peV6b4JV3xuHi{Sh~KQ8zos%sqJ03_V&62b8Y9{f+tf8XjLo}M%4 zG4UhAhcx}r81?EeA)jsx&3NMWso6`9YC4d8x$jCSbz!`1D7kIcIH410W|AD@L$jza zJv-y;b`d^=Ja-|xlW98i3)7g8T{%*3`8Z{{zb=@$%In6tlMVNu-Z%^!3d_#%X?c2> zd^mx91SSz@7DqdXIFfOg^w?B)&FK^8MdA!B@(q!_Jvnrua}1qK+Zg}uT5CqycC@kYLhRuxfl$mQzx9|B-tbd&LQS(O^AN@_w zj%Q+0y;;?N%tNYi_kJ~1otWceSdghTo@T1(0d!@CSr@h!8!Y%TM=OuzkS&bLL>h}l zc=wN+aT_aMgatYnkJf3EhODUX2P<`v#G&rsJ&%$xCG0M@nzR-0F_WE?AV&_zOWjJt z>KSh_mjAx&6&-jySWY|G3^oiYaXu8(6UVG}8L7-2SGM=C+`&vCDO6VO@yY#OTB}fM z2Kw^r=*4FyE35p6%>u2GAuSNIMIG>*)jK1ry4 z1mrZCdfzY3`(G09o0;9euLy8E*%e!~HQWZh++?1{BYj7n2vfH8Ia=(J4n)Ve zsjKwIo-3zY|H!bOOV>su=_(<+?;&_ejP?C4i9D43p&) z7*q(X$dvbodz>56F;ZYU?-P&9)uf`2&mG$fgN`Z<6`mIj1^gIz=!UA1cP?kDjGOD_ zR?cY>uZJzxNZc`NhPUqdva^?bvYHA$mz#L@R->70--;`flOrR=vAnp-1+Z3UJ?{N8 zzV29n1*x)8SzY?+WIhz%s@GtHX-iX>BRT85mr5R|gt1tTBsm#D^sk8ll`2JXv6&e0 zs7pyz38L`E`6%Z1_x8gB%)s|Ucoi)QiX!$!=FkDr50O@4!lirs-RF=h54T^EKApHo z3!M1Zww`~$4}~4Fp!wqon}E90@ha2tD!XmZuWM$j4f4@Q)3TBpGx(E1Q`%JI@YDPE zNn0QDiss6W3rqI7?VIPDHbuvSi0+%~v=#Q}{`_6CY<}K7ALtgQbKW+eznZqkH4z_S zPkdf`@d&{6KkyWn7(RETfE0WdEtkbTgY?du*t z^W%0^T%cn}i-qj8h%!+@A}cC^P-%`###>A}j`{?Zg1?|hGU-12k}{WSRFX88=2rTb zLWZx@mu1OV)J6X6ufPLE+j|rvKUT*Jra*NPN3-;lW!WOz*O7Ee<*!F{zuOBN#crg- zb;WLQiu>0`8|wV4?0-73f2KXuHLR{GiDoUr-(Dx0IzbnR z{2+S7uYEx1YDql7`*dLH-cCt_uu!u^uD=D%!%P!%M}bHh@Q3Y~LG*}R+d%XPU+2Q; z3t!WM6`4J_K}gM=X2QfbEViODgZ=7JJ8-~w(GmYt7ZkeYg#d_1g-SF8MXp(b6i|F4 zci13u$++Wo;2{i1pP3*4p=(Kqub3S=2tef80^%!p2M+=euM5cw-*JFp1gFlglBGWT zHr^g0!k8Z~OFcS=*8;mildma5oibP2qPIaqB1mCc6cU{jpZD#Xsz{KGlp-uFEvWD| z&>X%a4pEBI354vh2eH9SlX{~4i)%~b`d`4{um)6-aY67jT!B+M%$=Z%@H^PdM-0U8 zOWV7!2+s^Co@b;Bf#W)VMX&_wdGP|m^YweGyx;y@+**0p z)oYu4-!X$SsIOyfWoX~FU{$15G{1rM?{oNRmD-wWkA=fGLo8?As_}9s=;d=cxUyn6 zssH5&6tCSE1x9HUmKQE+e`E39BetGx`;aHT=YOxn6vTgaZX_{<=MD<`AloQjE? zZxIz$L=xo*Qn-fq$BSD(6ijsh*K1YS7Kpmeoj}kBdxitLMRs2g2Z&3a9CA7$?)JPY z9}na;MUgf_;>rBcQZ7mz`n^Bsg9NgUrE<9d22Yn?%k;hupWv=OXKqm2X7RCYnjEih zkG$%#$h5QE}v{v6>_-{VT1;5K!tgRwzW)PfH!E3E$XA`tT+0LwYct2*nQa_e;m z2wYDu6vICaVY8gz9ixCtR6oav{W+yy693pQ6N1fvCNQ!Z4c z3Cc)I+zMye2)0%wB&HcCRrhc3zvpTGfGpAgJy8pIf^*aZ?WXP303e^Wp<|c&XqN&% z-SPkeTSEd%eP}$*|2!Wx;LT?!S2e*Y%YnCUdAWn0GslCuOLbT41O=FnAe7MDh&PXMnmI29r02 zQP)kES_gnenxaBBJ>v!~qjm;@r0a@NVzCIkye-2Rrd=^H)Bd`{QXu0F-k}fDh!6SC zitC8fHv!`xy0iS>Z}5cD8Mo64BOpYoFL@0W1P{YVswrF-nHO?koaYYuruU2j3UmC1 z5q+pGAaM-~R##G)H(SYUv&|pY&lC1tFbv4b72W5Bo}b=K{R#&;@Oy$sAHlM~qd%rs zKE*4Vg0^IliFyXrHU^^{Ym%E6DGcQqSnn6LgqtD0=a+$pscN{)zz#@40i!I7>CeN> z3;PSdcR-_kz7OepQ7RsZ%)3Jg@<%8hdiU8s&mtvdpp#oFiYyBg8ueNmd~U?@*D;VZ zxY=B4c|*?-JHN-HodqJ3_Z{Tn9`;8+JJlcijKh7fEv!7)I#2ZB3l|sOerPUkxcG61 zW4xj#a!Jg>(906n$bH#6kt6;RuliiNxuqlK(ltisELffVGTBYNLGHs|yFkpwtQIu; zlt&jG@4!a?1x%V0O2Y|buOL~3DGz`ME60vFSeFl)XGv6uS;I369-aN2eOXiZXinDU ztRa1-Bfa@WOvd8(^Q~_HtuC?KI(3&Kp02qIe)GXn!DO=9jsv2;ArgC#ecGY!nl%U- z>|+?nAjp02!fRjvNf!Z%5YNxsIPjLVzOhK*boc=@JsFc?L0<^&$zb(dIB)>)g9)+p zL{LT0fAJp^^wN+ScWY|x!h8nx(wG^ygjfWg#W1zny*UD_ zy1G;Q11_@5$7*#R+^uY`z>aO`osS`~L|U8N@`k&#Y%^w!CvS73()_6<*DG=T)E*sS zjun0HLx)G)=m*Dw7%Fxh(B`;zY*~>)G>{}mLBXEcUWBVPl;k$H;2O**0=v8mW0OWx zM&m6-ZtBXgTw8p|BCjM*CIy$@)zy_wh=N0sFUx#j3-!AHg7jg-d3{i(0|W7RU5X>0 zTD%aAGT0qt3Zn?m<2@%xK?XtQ(m^JIY(vYp#2|L`o%Ehbb#sje(D!L2E-`mK$5`99 zZY3Vo5^Zr*Imik2$&Z>WChg~I!SePF$tKC)^ln`DZ;U}%O)qD&O=7KU3p88qokhC( zMI*m-ok?LQYHGS+dj3d3wx*OC>qG7;YbT#N6;uOP;Tw%(8?Q9=%E&FBvEE=>gib+y z((bBjxdg9;bI}tE;3PhkSCxzpI+>%J#O)J!iQ+XqV4vf!u1d{8H+$l%0<|f{g>A@CMW^vL1yx;LNl^R%$0!FFnD#ct# z^5w&Wdg$)OQuw%T@4e{CiYwt`4MaKc19V`0LR(tQhh}nrQZtgO=4Ao07 z=f|nD0A2BcAu)aAOJdkUXi5q*#P0)@!c$t@tj0wN0GfjK*o3sPhTlOJEOxSug}}-y zQS3Lj0~|Ef8>IwVe&%sd*QP2Q*=nfbZ=qT`c1bfq9?wShRq{@V%hC6b8u%rmp<>Jit)qN<@(@{7SvMgb*!~|dU0ot| z{!y2wKtxp~oj9r3cS)9+r^3mC8tYZ-Dw`S#&dn7Vu&vVr0z!eOPY8wu3^)y~#nBj3 zl+EN@+iSg%oilB*RV zRhw@JCw+)@KQ=z_YMPq=+Lmr=pEb+Ks91Du0`o2{IllTu%fo9@Z8p?_D(UmPq_dR|gw+1O?rfn}y@px#hc*gKvg8HA&ig@S9Lg83QI*okAyc{^v z&uJi@f-cWVb#|G(-L@chJL6oRE`%R0-2LI4)kU4rX=^lEx^bB3+2#!!Y3oHaxFSlV z00c$q%=iL)Z?}$g=03KrS)*&HeTF)`ot7CKE|*eltPLbf-h@bB-ql-!SLgu&S)_KF z&2a%`BScrl$uaKM(s)8KHEgoir2PE?UAR_3EdC1^9)qBR_a_!;2E5X&z4+|oTtO6W zLMn?7PO8SGB1RY&?>8C=JUeA37g=c@fCsN=@Q@;V)K#TCgO13BVHz|LlCxWaDN^M^ zpd<$#Rc)-#u6Ya^i@SL&1v6psz8^!9eFeYX<~3kzg%ly8t-Ofsytwv68<`T{7_scv zXuC8u8Ce76UcTShXZKB?sV}zxtEGoikwbM(qnJPW+@n}O+*uinkZDT1$d9u%pv?an zNhufBM{G))(qxpfn8=ybAyjMsn{Eih`5dhn!9FklX1)|r1aBiv*vIOEnwhSz0^E@4 zK?E`yNuXiYKr@`366r+!%FgG(Gj@y!avUWza?DUJ;;w+Yyt5rLYy`_)sFP)J4CH>8Fp zkKMepwQVseiC#277HUKW(@fJ*SzDN+dXp!(=DT~QyUhT3?ID4DyKbiWqI1z1?M-Z+ zEJJnBW*5O&1*^^db(U#~c_&}zupzMG$=$mJV<;;}b@6Z<0yQo%;ZH1UN?>8c^>EWt zFB_mATQ5APM3-XpjepDqcu@yU`6Z{GQPSuh;y1z(Byg>#4T6Wr>C{bl7BvEG5|&t4 zAJ~`1>@c+#?Bx6HTZ>ji{aYv$=#9f^NhMJSfS{2z|xtM1K+=lT*2E9s`hs+ zn`=eL+8?IK9jwguuJgM+zXJOLO}9O7uLnn^=#a_z?ufr9A}HV7_=XDzM?mqDs{3^1 zQU+PjX@09Qm%4X_Pn{kU$~o90mn@QfL(T7yw9Kh)mE9u`jx@w%O*k;5=fpMfifGRF z4H5gs%a!5J_dC}c5&#b?8!Y!R8(p9-4K<165jE~{A2;OXciM22P^kpfqBI z7im>DO7L*8Rp50Ge#_<^hzRTQmM@ba$z66$EF0R>HYO?00q(R$POF6;S|;^aNQN9P zG93g8Lbfsua&MKrbIqsow54D9?50GW9Pa>J2+q7f!8p zBb;G3M%&nQXb@L&3wf&pdg;=fHHF?i^?$BR*8ADesQo2Iz=P5ngaMV0!}(tTQb4W0 zU0qd@3N;D2f?*0%vS5wbib;nst<1`5!;M*Yu++@ZQxEXmaI89ihN5!muHAWL89m#7 zWSV12^$3yy2`SxCy;G>xelKZBB3G0#;^Qjv^gk+nzgYGMcET8wq$N4j6Z08KXyBpV z>Y;z!>$ECGR`2%I%FS0qKeg$}bGORJH2*)Rt&Y=edm6SjI$ZOamBnhcTjh_^(no3O zkC2vbVmq(7`iA0v2D2Vro|Sd7z&wyGMQhg<4%=|k*TU~UdkKo-GocL}zzhtI3?EAN z_l?CTVuSX!p8Ig-9&$ZHm5wy#nau+1ShB6hR7?_%g#7uh+ER6$%1r{-`I94sg_e+2 zv#%Y&#qZ!Gdq9uwcq96j9v1r8w-`-|V#fpAs6{sMyonfp@Y9-}hN}p$|95Y8l2vjF z-Osi0^%7kZR8fCnZvL>=4w-x+B_@FTI%}=kYyi&gLB{k*-U`uEGZI|VZxTdPRN>$K zMCd>Mx$^P%mr6}_BX;jD>|h_z`o%2p_QwrdfCRs!$`T6Fezc&`+crq_o_m^{+_(Qu zK0kR9(Jdr@T3Y6vU&Q8x!a$RC7t-NV_oQXIeep=qKcb?4IMw1N$Rp+cRJ`~>>9&y1 zKj=eNMCo2TYL^$-IPt!Y(dep$QFGV9{>L`fDT4LyTYTlS>Eq~QO4^)Zp#tt2^{Iw3 zAg45T;nQ(ZMX41ebf?F>P65{5t)^~4FHqBej>q7CE_#zXP;;rNN|bnFxwRWH<~0K@ z+c$}NlgHH+k8yQTZNl~m3g{QtT{!oa*H%vvcn?&4VT*=({iy}Kb?J8(-yY7+B}wKA zAvdQE5=X;pS8YS&`H~py?IP4g_Yvrstcl{JK-ie;guA1iLy5;*;Clyr@4)Yox$Sth zbTHw6iDX`w923RFGtVazLi^*r0*okV01~iFAX$5ruh5){jRbJ#MQdk*g@&Ep*iG#5C*5^o)tB7E`j4<+OSIvW{t;_wi7F zJ8$dCvNx_g3-^7BhLM}GSj%KJP2UJ_R-ZboIhM~&DV?FdPtMYEMk-{@T1`KsxRB79 zreO(nYmdOtXIkVFtQAnRHGRXOL!*1X_jkp&;r(9vhd)-uUo7yB^Yiov&)YMe&pRTK zDVVJ7=i9d7^Ni5r)xKl552B7I{9Z_Z-XnC#-XrXcc(>o#>2B{8JESz#RMdi8Z*8Sg z>g=$7B<~n{SH^2#DdKACH7fJBwrIU!`F}^CCw$Mzx>l<@$M34FMxFr@e@ky5vY&_u z$>hLrESaQR+ToaNXazkb8{xEMN@2^klh84Fg7j?9&*c4gk1c{6vgmPAH5o~N&>t8O z`8Znab+u?NOlbu*4YM|0&vo$BCPWjH(S-NGhSe`pJF&4}bz8V8P1xM`7eP5CZO^Vj z3wevcP=tiA&{5|HKu!U;xFdM|IH=_WsAv(Q-s3oa%Ipwk?P!tuqZM4EwbdW34kF8i zycT0XQ1f(QqgMa4l9n4 zCd@l#SwzmZmX>mQ>rvj|V~A50C8YfJhA^B>fQ7BEr1*wh25~gr&Cc=}bSNHtE#0G> zuxN%2dclaYEC?A2xN39T;P(e_cZYkg2QU5IWB=g&{(dpO@uZdI!~Hiy7`8rtw}XH1&L6xz9R96b zSfzRX;Fp8_H*XtDv^<+nrbSe?hl)^^FdQ;GMja~A(MOKccov?k#6XEm z{+R${K{!RO>W2bNPnboty5A6Cdb==a6!eYM=pO|?wu+g*f*+N?{>Zy9EJ zM)W}0|I0iLP-#)I#_myXX{m^8d~b^2C~a{!{Z-(_%5~q!S5wpSQ`|#{A_18Z`O7ye|yh3xfD( zWu+5swPT9wS!qUyR7*5WW}}E;S2Xub6t$zUfL}0yt<~)ijK_Qf8YM{#KqFzCkMV(M zEZj{Gtd^mFPBNKL%s3SJ6x@32I0cQs<1mKJ5_Q-#qFYrAdxx(N{Wk|g|LyKyEx?u5 z&_#+V0bo*>ZHJh6?2xKl1zN?_tJ@J7w= zUia#D;bH4M*}R27n;{L<=NvSq)lLOy+wj4uJg6#vts$-mt@IU#F(zkhYP!&-`;wxg z02RPh)V&cw`vGO&8AUB_@7th9t?zaS+P3Mk;J*~XJ%ULv@!J7WGiV9Y6qB)zSJu|n zIy9e5qK_ISTUHE?FxUU@ZtOSj#=ac@*L&y&M=PwEGCe;-D7USV3lgS2m>BEP!lwmt1SF!I#1PMr|35D8BC3 z<=}af!OloOM1WRfQ?$$^wsIqh(VfATAE+N@0`3j7;1Xw)*PH5=!lqerCDJBuc%9-w zmL-|%(G;Y`Ca&`qvuQF$%Rf=KyNqTzW#C0o0@Si-JjUD>Q~?aSEF+enF%DvM1#3Wm zBq6Jy`ixJDBy86}AHM(U{lVVw&AS8N?-ext{vn=4hY6^ zx?r%K4d(^};i5feK~|Q$U|H?LRZnZB0X1aHssqZYD=nyw^R)n-q#7DzO*PyQBdEdq zn3O+ko7dGe0&{Zf&P5IoTUX1bs<$HP4&_c%%vlQ()c#pKp0{`2;6L%NIoQj8FmXHD z7#DMCsJ6c@>K=O-wZ9M;HJzF{&u57EtJ6?Pgi-zL&U*tw{wris5J zrv*7}XA`$XjF9%7QFGVqb>8`Z&U}o}!7OFh?)*$ZCv!TikZ0x%s!b<*oP;7G&%U-=0$)p8#P1<_%e7oLu2-(Ufz>W5*)K69HtZ z>~InXXZ+-8-D;Q3l(b1a4aP4L;M>S(O98{fW3f9y`nVvoFocKu_ef5EhPd}eP(`Rl z)wLQm+tI^E1&WJV90!|{yGHkdgE4BK6Gz&QrTr56!Dkd)-iVy=wkmBI>993wS`REwO(Ts1fnh^h` z=+r!zCT%MnR%@hU#6m%WbIiE`%uj>MD9IpUgm6I37*QDmX{#u%DdDk*7$CPC%eaBZ z1XhbMl9Dn+Z|v}e4A5GiC-^o>9yo0ubDsTaKpKA4Br-;J5Gm!8Y z{5-*9c~>YPjJhJ5>Yg}hm|^F1-u;n^(hW8^A}_^N5`S=X^zKLoIv&lr*}0vI9$NjA zbuIU*!TO~<1%1YUt#A@VF@RbGyrOn>!OK<^Oq-uCjn-z%cjXyiM3O6lgpyI1jB$f^ zBYH)k;vkOe@bofF8GxZ?Ww+kxxca&G+uUrw2lueWN0ljovJHUSL;2kb_S#{R=yX~!elX~g$ zGX-dYN4(g7Qx2^G(u~(G^FFrMm#tIZv~50 zYIf^!nh8LqgvRyKkn0ViuKQmx>NH%khVcVW>%zx>A0rCkofGlZG$B#dO$Rr3u4c?r z6_g+IR&*S0icMPF0S zGbmO((cMHaq$ir?VsiZ!L$Q_}*wc+Oe%;>fmK?&e)@xjI{<38VZHgf~oBZn4D*Txjp<2aR zWmT+75nbum7dR(JY+RR9L{=LzY*ssKQruBVmA0sEd8eh&9}nUdEt2Lic;O?4t7r_M zP&YtDEo+z1=p_!5ED#+GYp9=Yltdsz7cYniLlY!n+@GJ8#x{b)gr|d2ofTWFg!OfQ zV~Zn#sR49JXQvRqtSyOFPU6H+xsfgxUgX4VoCWm4cnwVhbVJs0!Xzg^S}>sB7!r}P zXn~Zw3`woFT=bitsL2KLJS`ICC;r=-tJ%-?#KKO*TQ@=omP}kMlUE@B;LNjvDod-| z^15SJu*PS(X?p(E9$r_uKuU~ee;(9-BN5Q=wDMTB!0H=>qV>G?;uufM#M$TSMpNlt z0a?+~Q>g86DfI+2o7at0kyE}KHBzS?X+kv#Idp_pY;Fm}i(K*U6KCo}^|$4?>~st-q%XOU?D~gTWO4MJoeJ^n z`O6pLxqSZBi^2JAF|_7(@Y)uoHPVE^d2q^%2FGTor3ls?bUH(2xMo6g@7WtCjTkRy znJP*x3jjSEe0Gd`>(~V8hDf;cdxzmEotp3Vq!`Od5>EM$M)R4O&s-W?njX*pBBk>Aj5_E{(kkGbB@Hh{DnL5)sRCfHMyN75 zo-2`X3^Bfvt8N{W4VlV~qyNmNX`4=qW}>&kD4RC}?4UGF4;q8Hxri0|dn>ET*fS!*|K6T9ll~Ug5s^EcmLQ9gEGrs}v!kjsWmJKr$6?ASP#wleK}nE`l^)UxS*7B@RF~J9MwJMp z#>!Yx*Tczw5*u@o8s=g7#trTSPgf0X*Tm(Or*2OU&?(c87 zqq%20F5(JU@qW4EE0A;@`At?cd!0-l(nlKdx0v zH;-w5)&j)7WV`r-@t|qV^}g)dYT*~X`wcJDx6E3-(zYhf`tIvmx4s#Bjh{sZcb&fh zZH%!B!Y~v?_xBYU9CWo6#0r8gcJ3OGG`!S6@)BMXu!{d~RVp34zbBt=Q5Bjj)DJGMgWKdVt|oUY*<7aBme=l534arrHA5`v=B)tU=9!r zw-|;Q9ageg&1q(obk{SITYy-lEQwHiqlBd^i>rCh6mt)G-MWri3y#z(gsl00s{&v) zFgPa_s-KWhr7@#cFxznD$Mc~deAA+2RYtTxJt-g^Y)nc@V`FC*6mwp-fnNjW*#NU{ zBcFhv5(SkYC^1%D(HvEl(<|xRYZ7MY9wZE-Eey|>t@B@YHQ57_PJ+ae0Tx27OaEok zoz8}hxW_gw<{Ktf#`K<9E75^};d#vB7NU=Ms11&|#o+d<;|w?2{y28#*91>kD0H2O zq^8ZybGhy+un}|_etnIH_}Ty}GE%UVR8|H>E0Q`V*DEw(R%?gA2xt~6XIyEatkCSQ z?>3UA1=p1{Ov!=@35>W{93hN)e){g$i?i1sJWhq&E}5|W(&vsyFkonZ#tj>hv|8$V zd5&Onx~x)Sf?!E&m@k^N1kLYYS)d{5AcnCq8q$nyk@1+Yje}T9!-`o^n#0|a?=4DJ zJT<7E%Cv1H0LpMs=7D&hzg^fDB_G)@sIRVI^7yrH|2m z4>5`|3?`0ADN&ncNjwyPYIGdib$l|2WoTV%Izohsi4v0!0)a0&PE`^bof>#*>Jm$4#Sz z+W>Mw6BLwC;Xsn4B|)Q1N|;L>j0uLyg7+S1#488roq5}p9im!)k~H0p%#7PKB}?Xz zsIq0{35!rj05gVQmv+ zID^{kt_klYfW;&nI=(TirmLKxECdsEzG4y6WT<}A+ST_!y`9Eexm}`g6Ni=O$zr&y zw%crttUkc5U$g3eGw$iKTdvDEnJTkq$G;7LqVy& ze~QR*)r`@=X-waFtRt$sMAi(HX0C;-qKTO?!My@B8^zTU+E@@*c~kX88l%fUR@bBj{#-YWEzqu#{g>@xF&Gxqdxu zh4@>VmuECzmx-nQD7?>)N2Qy>A zqSbKYe#O9ZBuav5Bh~woB{JB_NYNL%Bda)OH8`SHXOBIp-m>#ngP!z3A7SNj_uUmt zTQr!O{j;5akBi{=__!Z%^}cVBx*k2+`FJ#Vs{*NXDLKAfm;?|1vU_G@XzdAn&X%Y0 zPacs}ovkjM;K6Zo%mtUzkWj`I{b8OAP4-QBpo8~x5j=d@QFNO@>RQ5)ei|2ja}TBa zTIqxTTr2(-)Ly-T_Nl9-T0$gkY3&7%_j(oeL+@;VaTAot^G@a-EJlzq6SBN0V1iNl zqjFo&%St_Z^$n*7il2;~U{k@;R+^6q#{@?IDbv`c!->Ua@&+n^tzrHvB_rH7hKYJ=o2kh0@x9owkbB15P3pSkg zje4L__MLPXR6zV&VvCO4D60bNmBZ`v>ve$THs;;ECeuI-n% z90e;23p_nMe*gOP@bn0muIvRFmj)dLPk&z~lFl?kVn?9fTMI5W_U;_Pn-INi2_pqN zw!^t24R7ti9_@{R)~6Ukf}rPs4oGJTN7vas{mo?Sblwd%^eJ?fpm*np#X!Z@jI@P5 zzBv!U3`2ql7IjZvKh#Y#B>hBz##=;zDwp0JKRdyQ_GdpLrRhjn=P69$iGKR|#~0)5leBtq)No9Dg?)xD1WnJos04r=D1f%4TV?on(jr?IOhL6)m8?0^=LlPha-ooguXw5NkriveU+@9-k`)C} zC2WoA73qUaR$C>Wml~F`$T=409F?(o!LL+kDl3>+rI51~d*;)YL==_K*nd?WY?ho# z#K-WQnKUr{J(_;e8*q4&Dx z?|_hVRv;Fhr~Guj`{XaR7j0A9Hu!sfg_>iveNBLCySt4nu#|FzE0i9D4;yAa#Zhc6 zvYbhBAzAa^C&{uSJ2s_kOMgDZe%{}oC%+sm;zg%JVS@Mqh6n_wSu)9@cj-eIzJBx5 z+wcu~^W$6pdYQ~py7Z6JWRX%tg?}v=rjdV5vM54q(CK9S`?*IGE*K2O4aH$PMLBfv zEK$!9LA7%3j~S$#K!H>0pQj-tXmk%5I->%ynT*PygJ-~f;o|}jpnnI<1$X`bOvS-L zNFe8)2mbB=`4KTo?*T>kK$1r|Jb4JwLUFs!Z)pZXNNFm7@>0YIbPI)6T#CRHDf0ah z4>2}xT>yE`%5&B|v9Yip7It@mtcp2|5WpNLjhJ!)2|?3cFlI}@GD@Wq&<&Mdju>F* zuM9H;9v8doc!SQmqknw{wp{=x3xX2q00-ZWZgVjfzh!WHPZ0IgM0N7~EExU*1p?9~ zF2MQa@#y>{7+(hCtI?YXW?!HkH!{%bhd*prm-3%Jmwjq*6&I=|*Zp-?Jbnio2C?&`wxiGXE4 zL6I`9q!c9Cgy0a&G8(G>13{qMi)Ep3xo+{AX_A*_gn#sERw)tz1ah+T05S%bu7&Y5$|lvrkA^6n0sok!JY&eSRMh77c)36)jHS%=xpbb2nJe2M z%G7WJujOFn98G~pLH7sldR>rYa*|9C(1!GYQ2@LRHpeQ{(6WZFR#FCPH;I zwRB7I@wJsfMtO{9!mYWXs!Yynt43wVd+G|bJHOW!6uTETJVG+NFjZ*v zxPSXs2fJ$;%=7w(P@RKy*S%_~S_8Wt(CtD@%B4_sPYJ?u2#akYwI!d?BWH+O217X)$?V`jjjhT@^bZZct0l^TB)_|*RQV_Y4KZwU zWb;%sOS8HQD8d-YDYbX|$Eg21?63CwKi|E2wdeG#{U8fkvL&tssVp6H6_p*`IGC!- zMQxQMze>_@?U-3IN6TWKmLuEbyLO3fRY`Sm)~Fkby*4fJw5;q${vefd)C$X&=6`dn zkg94Sk$n>+FBwKDAq)8OE&<^~`9R#%+t{_GbLw!uDjp z+b9ZGhFew}=bAdHz9Q>sI%;Sp-gIN>thcOE^eRVSF?FRDGiG?w&`!|jynqiF%X3N{E96E6}0gb#0R1_S|4@+ z$*p^5Ah!v5fFk~P&vz}j&9L9jEHhiUqZ5KvO~EN7*l$u@q-tePh=XiA#Ei1hQ0C{l zw0xFpTRY3dQRdNWu4HafRgs?xk;3okWf7uR7r}p5plT%(r>tPP;kE0&*x255H{izB=HTpRItqiE z!Cp9x!T<)z;4DF2FmBgsX}oZ&LGRjyQR0O`Ryqh0h(=h2_HRl&2);YMH{34s^LSW-b^Hd?$``wF^U>vtV}zScX=`t|6P1IEW_w zPxKG+Aef{mpvtyOoW`A`!8gkb60qXKV4O@aI_tz^9E6-3!+-7s2y8!5^??W9pFpNA z;F?a;I02Usj1hD&Y2yB!0AQ1b1&|Q+v1iQs<(;=T7i#iwFBt)qV9!|I*upNrUmM^jpu2-T`fo{jxqkM z4ssM?Al(Ue_J0V$u^mUghhr37H+8t0V0FC-1}CSz_x9Pz;X&Wt?;Rc-*?YSu{qxfv z_^Ew6{%H4(PWoROz=?UkGr$;>K`R;1FoiF^W+Rf0tpg>;plf6bru8GLr0VZAj%j4#1ury2!GQZjn7Q=pFcsKl6~ZShbVR~ zeOTb-k%O?3J3BLIm>m}?Y>6o1uX5cM`_>fK4N~7%1JD~|`h|NA7T*PfW68=pJIC+# z$sC}++N;L?RE;Ll)G=WoSXMnlfSO|aGkbvg~rnSMC#ME#|xT*?6drr0|DFv}lH7=Y2!eKLR~Kvt^C09+bn zfLSFMU;q=1xeOo_Rv5t4cu5SvJxXJM`N^NsW`C9eo^+&Tz|*IK0gSg*13Gh4jvNh; ze5b}@XXD=p9jSfQu;gHvsZd$8c)<`}e;ipW0fa*zHUZ5V!_g>)35IozL{AsL%Znb? zE)pu>@w8%0v_EQ;8xrALt*i4sLp+kz<4+Z4>BT!=A` z3V&1N!b}F72S|c$Oh7$Q0E?V|ih{^A9RW^lRHcn-Zr4d@I{nG! z1IojLp$@Qv%M~K_(20}BsMX*!qE<)fF>)Uwa+Q2%b_Nptu94ja5skWd@!1m2{H&u# zE1gQYY7Misu7T1nB@Sz;^XaTR=mVjmvVVZe9cv{{;-plWj!=2^_MLFZKcN>`H0%Uk zaTAEmTOY^Gd(3UzukUTAQG_d1CR0Q9zl>eMiW_Wff5sxv%(AR7%#7P=8DN?COi#+| zoMd9?k0@J^ZW(wBY~eDp4FuT|nN4sZWj3YwzxKZ3rC5Tn0nGTSW`>yzeIaY)aDP=c zTRbTq!M-wr{lXF4^KRyO5T{WTq67}55glq$qOHDzsSIi%Sm$iCRY$m;BSzt|&b;hp zUXVlxnr9dI)w0hn^s@?~P#5rG@mU40+93P0`E%Rj*~J~4U0|p29T&=@#1RUo+1!+b z59>T7CMAk-Tase25oyJOtq0oD*nfCnf{h?g9M1>3sg3wWFi!o1p1B%dcs^W^t<=pG z6mk8!u|hIL^0N^!3aXqw3X5e&asf@MH2K&H@;2-SFgI;uZAsGR8Kk8SywwphNPvbp z6*-0jU2e8(LmD^0v+Rv&Io+X!@2IC7LKoJV-txidK{#1OiXhLjX+lT#SAR+4h%C)v ztZ~OF9K-9Vd9TzVGFd~7ng0LWgqHd~%Qo?f8__in-&K$&$oIM!D9%|=KAhN}dZ%Xx zACK*WeefD=ui=MnpuQ3667ng}w{gQ&Ryiku;v+6v(W>c#5SK$!=H@My+LZX=q~gW; z=Bv%^jhCCRe!)NywUF>^?tf_{%($5z&1Ra7edUF&Wc7K5TNAcx5Y!am8Klytm4%jj z1L=r=Da>2>tYwS*$m~G#h^o%_n6chL#>%c#h{zm5-c)yQ|ou@aeO zw{k2gfEP^9c~J1q$WQ@OL|oKy0L~A+#QRRRYZE-%p$a#3BuYyefPd^Acrk#}D7h(7 znQo}D#GKe|&fYV>Uz7FF0`-(EAL;L=5R%tfNiZsK(NN697Y1V1q$CXgATtDEf?cU{ zY?iM0#bPOcnVx@7>W)`Qe1)`5Z;sJ;skA;)tTu0-XMttXyo**UXoagIm9dpIQm&to zXLXegyh2iCESBb}TYvpF7@Y?B4XAAIspvKct8t$vW4wosC{;We6RMMwu^c6vuyDfdkTU#M}Hg# zM|kwxu{&L_<}6;j=WLa*7-Qj1MH(P%gJke{}ED8hQ!haX^Z=S`02w4pCl&#MFD3aQa z70}bn555lI;NZaW(?zCE?ZXf_MssCIA0dC?9Go3D>0@JZE=+^N>c%>kAJJCQ9>MNQ3N}q5ts#06?>@~+T>LX zCg7vWs~Kv$%Im5My`G(c?RjDR$iAZ8RNpjKtRiov8K+wKO(UhG%r^DJa7ftRq$tGt z6ZO0ibc=3jSfWa4t%_9rBa>Mg7cR=sjF2|l$3kvf4tj6%QrmBt#4)O%qs?`wA#W=E zFMplKDT{up`;M1K0-JroK>Sjt^6XYNqG}rp>+UGm%k~@&^~f|CA&yLaLiqTDN4|k%ulmB@uf-hZ>ara=nkpxxbLAE$mom@@z&ab$?tn zId}<69JSRSz~KP)UD}H)1_~nGFRc5p%a@eXy_FvT{-Z z^D3x}{AZWX4Fwl}?dFzGiiXqA(niN@r!q44={z+jONL4q@h4G-{0<}n{1NEmHnzGq zcbqagIltuYOaqqSxnkeuH;oBUZu+^#+8&`E+7yf=HVooFnvaDO$Ch3OdB{Z)e&-r+6dOnU;QLjgx04I^-Vl;b|2J>|JOSpF3 zpAMcraS!mp;S>A(I`BezZJ&fe6jDr?ea>P+mq)!`n%sJoeY$pW#7Ic<)){3u_5i}s zH|}^wKRP~tSscg9G=K@&z){cjog_gg;Q~)WLYZ8N@S0(|NRWNoBai0^iyfC;P~yU# zvbXoShu|+t=RR?fmr|FXjb<}9q%b{onVHCQchr9i8Ae|$l1up?@sMd4=#gb*({^{! zBRh)mauztuU75!IergQ#aKB$z&Hvac4nHA^Ki&R+UhSeZ4K;!;roZkzMH0i%=pSVm zZnD-6Taje%MRr?-SWdmEl$H}kpb{;p;c&Q)ui;ZDQFG`Fu6V~kw}j= z#xmSP3q3|JEM&W3N|~7f8Y9)b99^OD7<9=ok|6Sd5}?C@9xup-Yqw69`oJGpp)qD@ zOaTMHJ3~7@rc1U0IX~tabmG{#t{^I~4tmb+Y0y%yykv$#Qj zQBr|jv8lQT^68Z1tw3q!74JI+6~KZ^JDAVHcwrU?2gnf5+~{95U4(nZ-w9ip1?xKx zL%-tbsu_rYk8`MtL+@Md^tLkP36^f@%M_G_u%BQK$0o^4h&qS<dHo z9-x9N0HKXI+s4pW#WuO*F4?9|uym^<+vH@)whEBl*|sGe?Ihb+mjTaNC%f9Ls)k+( zi>AI`85I#^ZL<`dYZJLjSIQ}W#xn!C?pDjT{JpgC@>&GIaP&MlARYMl+DX{|oNVIc zriA{Ty!>inJ_Ivmu3>T%+uYL|OL$xMzKo^%1c+VA1qJAO*n)y365hO^paDVrFPrrR z1vQn&Uls016YRfVVF0cA4&+F>pytJ4FhKej3-4FE#YfGN)CTZ;ur7RmuS-9R@e>Pc zi-BqV$$u$!sxHrWmPvuIO*L>c+dwtSaPOIV z=lrrrLeYhB2SK1n82QM9ZHAXP?ob)eT=VIjE9$ zeggO)VKBt+f!?I=LIZUYwEKZ+D<#$D#@>I6%-I_B&eI?vfFKz7gBE9B7@ z=4FucOkH-hnJ=|}ur936va&m@%ePlHC5o<<%~4iKrEU<_ZkCl=^&K@uZ+ia#?Oa=P z+cp;dD;RZWr`@&Wul(W4t>FSJWShrv%*Sx`{;qi6F2o*vtSV3AM!X+^* zSF$i8m|t^$$!k}`+!u)4aQk;4p<2^rU}kJt4MQ&< zOLC&5rCb^mhm=YbOdGP`wjzOLlB%Rcg6X z_-;ghCNL8s!!lXGj1mloe`wGVX`F79Va7{>xnQpt|DIl)KanBt9E3}NuPM$YG{cBQ zmuY1=A{5-3!2=qkZ5@NkqIKvZcsf3?%ve%tTC;`H9|=G;&W^~9VWksZ2xrj4V4;&S z1iijPrvw+wfZkh55wQ0h5Rji7_*eok70cg$K^fKyT-jRe75MG-?*QQAH+*sWdwQJW}CFd+PA zoUp+Wz-x1#Lo-b!luPg2;1sR__8F~zTN<2EP*Y`!>SDC7I6usQK`gAtnt>7q-$40a zxxRr8An0irI2d3m-mRy=(w|RJtz6I1)UV)Ya|msh^?W>2N-!#)IC-mq*HWr3bZ4g83MU#FbQoc%@5b>vejDWkg_e>#5~g!fvv9+@{&Sk1z+g; zvSnAN&=oq40-n>sKUY;fcgCt35%#Zh;^&g4U9LlB_bdm)WgZcY!{-vbe`5Ft@QZWR z1%>$v2N`?PP;a;rU0TM{@jKIhYMrV*^UxN-Dw{g!RY&{+KGXZ~`Q?ijPXac~Bdfrj z`oJB_0xBt}l6(uSe23{jXP{DuW?u$JWLhaF3M|6TfamgFb?#Ve82mWQh+G3=E(}%Er?EiD2GAf3_mo~J2@lP7)?cFwJ zs6N`%w_~WtH_IzFXZK0)M}yD`!V~SmaJ}!T2A{1NG-NxnDf~epy$@UM4?~QiJ-+V( zB#Ia}hONnNGwf#CzC8^|Lib}i4W^C(g91uL9BJvK&)l~LOh~QMyUO_v9H_O@H_372 zZS+RbqH}kx;Pa_<=ch4$q_w(>l~^-Sw!HOeBo4vs?kILp3ZO(z$cMy?85 zW+qKn>7GyD4n+~aHW(Q-cy}WC579yThT8=PpDpredd z{wcqU*E$e$6PuEMxNl%%C{wcfSf+>$-HnTj7Ec+kwuvf|h@FUk<=csbh2b%81U7rI z_PUH^90}t&zf_BO;%UW8`;L`yKIW;f_`HfEzrqFz8oe`Ga}n1@y~d^zd&#&UMZJxa z8kaL{*560h@YUk+CLBuxd;6SSl($jz@6;R_h%GKH`8%~>`VbhAWu}FQt#K`R-)H_BuT|veLw{a~CqVR6*g z_;xb#5b(OvY7w{W8JGAzI#%KYO@q4fNIPFbE&h)K_m8HY;F~)C4~yJubs$%GcE?Vr zX7RH0fKHWv5Hv1)9wD6xI**g>+zBzIC2KpFe?h z%zN!mDJUmGNtOiQGuQ>bHIPLL(6oZ|0rHq6c6^vX4UIm=fAEDDI;;4$s&C-PKEk_C z5)JQUQJ9J{EAhI^#VfTTZRCVAn9_V4Mp<-lTaI z+07^&M|i3}R9wXM6P_}%fr4cEx;q1iqJ9HqFPb>M(?;rXq>mwOLVzOqG*qV;@*Ds9 z&@24}c9e7We-m3`=1m84@?$cH60VNRdJjP( z@{19D2&Q*_6Zh*uu2}B0;djYsmo)BmP!HmY6)y6ef8qg3Bj~|k4yKgQOsjbeNQJ!w;2Z*GPwvksmfU-uQEkR22VqDkUwx%g_A5MFIl! znsGa_K!24;554YKCnp|2fwaRS+xEF*VoE0AmDzbB9ia?>ic(f4y#!1LP+EpmY%zq;F0p?Zt+_4s;KCpqu3|dDHg>j$kNPb+c`(;CI`GYPA)y zc4FI5qZZqS%*HE8Vd#^#I}o?9(j7EU-mFgu{&2_o6M0dc-R70vYzG*Fu-`h?P-rG@ z+tjvkhGDX}ttsE)IXJ`W+--4#Fw7gZ>C)1Ae|#qcRtqL~4evqMyOe|D``FvJz#i_c z5?u+~KE-tfYV#Cder|KT?7e5w)?rBJumQ2Rd3%huIV%07KxXV&cawUPD?hxfG-Wni zR9fG@whHe@h5N|>22>+*8p?~mZP`=}gpT!B`P#rAw9f|qmY``^4xjLLch15>m@$A^ ze+yjDW5h_x9mvuIn9nS_wd4$_w z-wc2HL>jO#Uh$*^*md~(2kahV+8A$b{81BHH+WYPvJO->ygge}W80sMxnn{#{uMfU z5`35)znslRvsv-a*|GmqGcdSe!_hz52PN}Y>1MOpv44hX^#5Mx-^_V~k#Oqw-LXTF RJ;?APBRm2C002iqO+pHYC=LJs delta 821274 zcmb5XbzD|k(=g1oXxP#rB_Lg*f|P`UlzM zU3@cZtqVN&`@Mg>&+m6XoHISMX3d%v`#Oit`rKIRJ=0U!)zR6vty}v<=Z-G30^?Mi zU6WE%+9jmAxTiYL+Ti-%e}CEiKmSg;3XbBlse;_^W^!^Z<>cf9_#gQ+x}%EQ$X*F8 zo5;y2)L3^XJ4d@vz$3t(4XrF8IiovJzV-)0;+)Gvi`wV$Gi|FU}g411I5D5eXo=9QMOe09-y%H@bx3XqkJi#7f_TJP5({mNBU4eIRJXR z8#b668)+|QsxsA!fvvg2cS|y2q^Ed*1Lpv6hhV#x1dOzytgFECr%L0BiR#EUV!JTL zTBa^1H{(fu6LM{Y9i_4bwwlA%ie$kEd$HJrQ7x4RS)B);A^k@Sy)Qw}r*;H@hI8$x0}J4c&D<}gQw z0MfhLnhf%7D9afy02DpacOt8YcA<*QL5#!7jT=ekP&T*L0mY_vW_84Fs2imi3luT) z*ISaO*=$Z#1I5>4Q?HTI>@ZPYnYoEGPxo`L=A=_LbMq#!ImS;3A`w}ZL@(Qr%8CTw zO?jQ|WMNhq1-t>ai{;`^pz;!}U>;z!%OM{WqLg%qkmXOQ{6XWTM{5m9eXzD^T2`i0 zcz#|&9{d9iZxhZn6GVBw@AHG0`f8IEnMRaz3@Ge6#^MzzZm&%eGL6JCC8h(tN>7b+ zr3jNuGfJ%ndiK3B4H)n@Lv)+#80#Z=h2)@Fe~{)>UQGP z*O(|~D3jJhT2tzGAop02<2X_^m=)Do5M-}}0yR)%OlA%?6({o9xEw^??o@u4I1g^C zf2swO+ZU8281FtOn*goJtR!tB4%VW=mw?v185fKpZpOrPpdvY&){4#>SQX?7H+9}G zV{-;JV=^{PpR(11O`rB%&x5F#lBz*w#4AmmA~1Ij7>wCMmJW)bfY|`h?mzJxaT#Dm zY6mKr#H8frg=Hlrz#PZXXvs&l572q+8)gMDK|?f&^B`v7YA|G#v$HcqzG z0Z(tZIgONA=T5By@nq6KRx~TX!u~zaJ3!D)N%o+Y#C4z!HK;Af%gh(|f`u;RMyi4S zaXyicfXvAQ)~L#4c5RTEmuf{>Hv;RS^13`aL>R0A$t{R}sxb}NML?=7y6z-n_Xc(g zQkBw5Bz%Oi2(-H&aF+%xdyqV3PfjtXvU`L7t_NVq+*40_)EM9vIg^==vfV(i|>fif@3E`ia#%fA~zHg=|7d<4J} zhkdCsFPx|sssr>WIRWg%81=QJqQ8f@rxnY+D$sT>OS1_H=^sd`c7aVlBJ&MlT#ZR& zygD)LZz8U?V$`k>a?>GNg`}pBHCfWHIoTi2l4&&97U!{`kaMvHsy~Q&8@@Xmxivc!o%Y+5Hqrd|y>9oMWB1fSIu3 zRaeNMpI=$z@&kd2!&{p!+qJz)_|0=viE!k$sbDHZU%rt<$J;4 zSqv5P2gJ;9UmqnCgC#?obQ`Qjw)D}W6tjTh!G3Qe8HG8eNbJLwyfSdUed3XsM5PZ~ z(2fDXf1T!aa?x9lICq6yiBlo(dbeciL6+jOorg(T$42DJ-Xc{b2gt)m_f*Rixe~Lk z29&)=Z)Qp}ps;QB>#>X?kW=WAzj3SrY5~QDk+&roML>g$IdK-$1f-a$?9!X4#D!C} z*fNjqGq$UY#iN1cNiVjHB87+dwTUFbztQSNz1XBds|&-=?!vf__$JYT7`|pOr8TaEY1@fA61bDo2FQ zdSqs-rl`*QvyNcngydtNh)b*|RiFcaHTNGT!HSNQDnvI{jUqY#LbJc&bke^QA{5E> z9?YZ!Kz#nP)0HEXNktFFkp_s2=qbtMz7yl<(SuFS0e~3w>QEN9Mv)kBjz{3#l0(N@ z(ZEn0G0a0v;8?xr@N?)Kn5gm?mU%+~;n91uS_2}QBXj}r>S)w-;?$0DD8;bF9z{iW z-+qcznQ4)-SXFW%noSc#_%A3}C9}%FKPM$&NPi4t1us)>K(g=alT9@Gk2FkHfANvrONOQ8HJDUw?=xvjoPbqtC zH)WF8U4sU^H6V^!RQ*J1qu|V>oRo}|%se#bH8)2OC~QY=TMt?1N?Cq@g4)*=hBV?R zYjG5_@ikD++g?7IBh*OWC{4=I6;kKY+9`$&+V!HC_P-!1)Tp92&4b!*Dx@xwjp_?P zR650_lcA9wR0LX)krhz~cDAE{uR!r=Ru_LT%baLOvMl)qz;3=hR#D)!h(@4Rz4k~N zkhu{oAg_V)X!EPX8cgaD!A#l>h@~Ds2^}Ex&LBcX8ME6EEO`9oE;$@!LF&3SivFl` zZe)X$1>KmGk03>FaiJAQsF2>>m|nE-=+P&>G%?h=v21w?z~G#Kx76&r;Y{{0(0BY^ z&(95Eo*&M_{2QoCmTzht%UVwj3v!7pn7i9u7GBEY#3XMap5|-DKV2Aft-sBRUyVNy>S(qw6cL9vLToa!C*if|Eudv`UJB@`76Y2){dwOJcAX|pE0&CJWn=y2Ny9Jt3d3gM@ zB+20^_0^$^A~6nBp$I%dxT-dzjt2Ek7Zz09MrnMx_m|Eiq~6elMFtTca(cIFKxA`7 z4j}v&#r>pp&!G!TcBG!W!~ZDi24|Hg-~WC*YxS=CvS z4D8I3{Tm?Udx*_Ip`Cb%@9J9t@ZzDNUQl54$g}`$@;rda#lCCl$FcDo!S`4Itm}L4 z9bGa)0u04yMYiOv1w`b9X-6Q94akfDO`;dTyc`LLD)XyTY0^&%P$#wi%Hl}A9^&DV z>FVCcPQ1aVd9vGw9(ItYjT6o|h+8!nvE_4@r6!Lnycn)|cFZw<3-lk@5MFr}@? z1wUmfLKQ^Jf21*uQu_MJ>qOA~QxNy}B?!9KcVSoHF(qMstY9<&p7m?K{RBJAiM$`% zyJ-N>piRGJWSK8JCcs+uVVTEc0GN`(PKu<&m-%=A5C>x7zKH9RGUSs2ePd=Jc)8g0&l11?nB4`6c0G!AZ%=FO$yG}!7e zHj(B8s4<93OG!_r6Tg^8_&Sgj-ksTjEc59=g-rwLOD`GBp%JcfRV5`p%!yfmFnTj= z2raW!t{NoBhpp7O;u>mH#X@(%~%V1|XC*#~T8I zjQ|2xcdgE&%?}!%=EY{-WI$vtyX4p4m8}=^Y6>83oc%ioCNMjvz&26-`OisEMcdPW zU<Y44jq}}5-`@@T3bLP{oI{J8g~wP z2X{G8%60CHvI2l>d{?>B`dj5HPh#EmML)i9sDbRmN6+5nNDZRzu0gwiy})HYEQ+`U z=wsB3qw{k9G3_EBZ_MRiT49m0;Od9v<)mex@px#69%Gbmt>4rXJhmm_ZfvRZ2CZVh zo|k1_69qTsz+#}bc_OFA5jwh|Df9sJ&_D6ZblKh(auua1lA;bQmGnX4`s^F_+z(y- zgxuV$BsAn5XI%%P<&s{VfLUfqp0{TeW;y^h%TEgcWYdQLU{0z=F9>TpI?5#gh$|bG z*pR%|?U_a#%AG^@eFRopJus7=sqN;<$^p4BGR%&qL10>XUJ5NzyEqyL&m*RN9JJHk zRLfxijHtVG1G3guH!>j^4PU{D=K=0q(V;f9P*=IKLXD?EvCgADfmzmMnk$PQP9K|V zS0}(yfvFC&(3Ncwa1NaFSr^1+w5tyJ+qTh(KF_C5qzSXTElZd=Ag1qmmr)HlVdAMo z_s^z0X_7%)=j?~}z-37++p-G&1-J&^ava&99Jt6+7bbEza40HdO#^dn$$S^4d?s+5 z&rG(V<;|z3yx~75-Y)z&40qehKmPtp*PX3SEr^-Kz3xZ0%XtD zTUi6s9ogH^VR{TyLmg7*)5xIAOefZ`VEUQGZ>^?zyTnnMym3@82x!iB}*>LZG2CGAK9o(Z=K#cUr5=XX=wE+$>Z`mGN5tlf&q%J<@=NN}!76$)v zh=WGO!4*YdKm@154ziL4C)@N!112wKR7*Z>;zVgsqLaisuU3Ef}ibtO?Ytd5rh zMev$01BtecGfNc!EL>s#mz=R?t19|)@lCW2nPA;s#5+73upR(RT|50V@wH~l*AoD^ z9-Fw0OtrEWKXNJ`0AA@{afO6hv7&@4s?zG&yU49JmJQmLXF$Dq+uE3HZ=)x=Su+Jn zaO~zWw%K}8VQEZq+q4w(jTmASEH3l1RHhUCHumCpph9!*g4{0eyB#KVmMjOf0k9%i z^Esb(hS%oRRFp4D;+BPnKOkoctv_PDX4E#I1E0`~-rW zh^`07Epv7Z84Gf|w!BzRO3m5XChnlCtJ8nV%K6ahEmiIZ4&Bopof{6#w8<tRPGo3XRN2|!uePJ5N7Rm_9ZF?P#_E)sB7JL zeHjPHg<)>r$P(i)DrO-V9n#KQ2gG!zfCoUK6}n<08Qsd6Y{*w7=EkglQU=7mi&`&8 ziBU97xQPI$49UMO8@yn0zm*?@DHej1+EIhB4Eq5cC25i<31^%{rfiJ+YSjv9^ zC=92(caibi5>wOGq}oVX#G3$|sz-pO$A>q6$w+>}8)QUuC>yXykYyuqs?5oXWHWeJNtw8Fu z^z>8toRt}57h!(d2TU#321Z|Q}`7$-ftQ7{jq|y(XLD`Mzb~e z>IMo5hh6+WTLX@YTDBBN03K5ei&6U9(MLhCFO4B?kW1TiZ+JssPnL=%q)$sxtmk)! z!$H)jCZ4Y3z8FMxnE^}OEE?lt~F57f8K2o4Od#B4Paj za!j4oK$Kw|*V&a6s#&(AS@aCKo z7lH*WG^>I9lOky;6V{%Rk5^@Pgm(d3ZL`~4hHV2_ebPadUBR3M?5PDqJIk;EfHfg^ zRM?3nZqMBhzJE{psjy<24}ed3ZJQEx71n}{0YGM_kUwO=(JUiOjlw@ zjIIC}S}R^4JvbZo^I7r_ZWB8tcJ_H5LY`nR4wtkd1a`ZNVfy7OH(x58Be2zfm={FHvMH^R^j6Gr5^ly3AL`ujI45dOMs7p79z-I3@kXkl( z$~TfwsVVgzFDM}1M4ZWQ4kDn{=@atxxMW8J=3qW}obYFnz9fug!sMktvjt;uuOUKk>$Tqf&CRuwgsJU;12z z!DyDYX*Lcx`nkNZ5Vlg1mhaC7@bN#H1)HhYIlKRdNSc856T>KzR3zhr^0@!c{4_g+DURZ>g zlH}Jzu#l>zLGZ6nhlm`9cvESRhr^p2{F0e#CC!-5JqZIvqI!!LG8D_faR6Nqy>5n7 zF-_<}%T^D77>=pgCq3u~Lnne}DQlWwBx2WuDw@LIv)ONrBw?D+PE?I$&=v41BPGdt zt<*OU#_L|0z`6s>Ht$8Prb)|G1x;zp6c{4FDNEDKc>JbIDYp`j%|1x>ZNvfR^Fq|gf7SH~xM_PW?lHTCuL;6)Ju#?w3@WX`kUEes(0B=Y;KL3}FbC z>Qmda*;W1C>I(Rg6k)7&SG!Z9?IewPUPQs!is zo_%3Lpe-hV-`DndHU>0UY{f@*5d@$pRIW_AIGA&p@>e=BISFZbI9q!1#qKPm=jWn= zZ_*i#1An)6AMu$io2V&GogpYne@X;BG(t%-D&fP5^CM})5@Q@S zwl&5f7<_gf_0vMSFcETZ&+Xd=S*(>||Qa8atKnj^$J?ZNNf$i6DAxPI5e_9%vE|^PMSZ3Ex z5ZHkp&Wqy@J(E~+f;1)R{REhoQ4@F>SPo8^T>92Tx<6iETa-Ou<+|njCN*k0GM;O? z1S2yyKF&afVhiC@fbRdhUR@H#3!Y*LFYZsls&c*k5{{R-R69;!8{&$Z2MOPwG@*>0qkz^%>OgiMT%CFOp19l z7XhyAjLH$xvLb;sNw}gryvSZAMHUI{R!tdHZ`Sy6O>#j8ixOZova=u)+7@vK6=AxJ z&6}#lhNQMoU_1Ix5SZrnZYQLKLZK`56o*{7Wy|sgLJjHuSXf>=7xEOn1T49O()LP+ zhk~i;V+3P5=P&WAA$&xo^5N5FoYS#X;$~o&F!iP%t_Phd+6 zhnDnwjG#&hv_Xj6uD@%Eut-ztJ4Rrw;1K|toHIDhVmNa&450NG9;7%hd&}k8%6~=} z2wF(@M)NH41(8wfW7FB{`FNrE0j)+$bO=Jv};a zWI8?Rx8;*^E|{#drSoA-3U-+B7$9GFKfLk}`{GeN!@OaCGGofOK5U-*juNbCC{v-n ziO)KXW@V{%7!2j_k$iglLuQS(Xw9>l;_iP@Y)**8Vykci5cgR!BcHM2vB~u=oOoFz9YEV-5?5u#tSR{k&7ltsv`sy>ho>jd(_`O?w@3kg_^Z6 zv=>_#HuZlcj2+G;ya&@}W%UaEC(xjxMXQwTgdEu$O+%nTH}G-n?SmKkH+U~E-5bVx zQM_**;o{SiWgQHPuC#cVATRd!WxVyU)vMUoY#*jHOY#CprC-5|SN{`~zxjMQ>;=+7 zYy0$2+RcJ~Z^LUlPl~Fx1btU#M>{Rw1$oQ~kmj{dM)Lg;PAR=4#Y&lYcx#S8C zq*kt2gVWtyT9^y1&Bt7xqu3fc%{%>vg%xnTAAy7@URArOvHDWBzPY^fivzvu+)4)H za$znh=kjnIhIyjzwSoLo^r&CRO!IRVH)#jt@P(mcpmW4Tq%`Al_y{?IxhAd7zGOuO zS>ZhpT+pQQYqySkYU9D+&6LWnSoVTxmf>4!g8}n9He{KOv~(!1Hu!YvNuN_?4Wpqd z^%%;7;0}^rrcM@FfMBFlrRGEVI`b7|9vyM!03W4nX!&+$bD0*vSJmt82wuSumys@p9qFOJ z3f@m&Ncvd<+j!pvJ;S!d{QW0`-emF&N&@QN_Dj03C<0hsT9?U7^9{hI3dbw|sl1e6 zKqhw#pX^z+P1{Chozs$j=Rk!q$mApc3s5$+Sd^SIU|p-r-~^X}Ky!7?2y~k5 ze?I}_aBiA4YXN|owE%d^w&L^U7Ayky(|H6ofKxwPYFA-KvXgl{aQ>?#Fcb^aWcWMwSLY3lXlZ>KA2>{^^do9kbZP68FSL~24}$ncr14Iz z0C-Cu85+p83hey244@@r6e}81K|@+Uh`U$}xXSC(j<7}>jgg`U@zCI|W$?B!r?GJ{ zmzE9^l*p+oTH+l5qoK&UE?|B&TdOGRmVtbY&H>!r;@NL;_s0$}bHVGK15%uER$E9# zsjzZb4CG^k9g_O48CR)WL!!Vfia(Revmp|sNzYhHUyF+0S%eGr7 zg0XH`a6p%C(OoR~9BbHY!jfeuIi(6Z()SdeimySYNykgWSe3b#1QmE`il8g5GH23X z!kI;y-@8SudL!N-G9f3I-38a}V?=GBYj=3xcZj5(BCtjm3p?E}!UD{qe-#w9e;Mcd zkD$)^8QDxw6z_x;z~Y-twojCLCJT0AC0}y4fv^Rt6Zz6fZFGipoplO;yVh}h5>5r! zF(&a)c>wrh^@@0$VHB(`EluLZa~xPQ@>Gd8PJ52)ktAr-RLuokujB6}p|hYR)uuzg z1tQgPf61Dzp@46yrqo$7jRJxp$%2YrTtY@VZm9zKo~#DOqpoMR2H!zrL?{*sEM7>g6fBw{t0Q&2Veyo; z&nDteZi5Es8GGo;cN|reqbP+Y@Jz?ZOib|3A+=by2EbywVZ*cN z-xmUKWB?EKDByf@D#jj@nHg6!fH&%efI4vQcRmX#Wotix?_pm+$ZS5R+We2$SN*wI zZ5Z<|dzUW7O3TD9@6V(C9Z)---foRcs3EhaZ-2gy&VhoZn~-h7>I10MkW~Bg`cMig zb&Dfj{ex4BhhXlH7xZc9EFqYhS9VWerGPRwl!6JsJmJvAc~}ZUDfM}v-gtP!R%vEG zzH=E5GwxKmj}0#`Lml@^%^bU#R0{;2Jdp`}Dxm&g0PxLrF$pB2MRnju$S^T?$4sr(}3#>2)7LLo|g@Vuqaq zqW14Lf2PY;S*)OD6qJ^iHZU_Qhj#I?d{>AMH&o6nHO2Ert}Ct2KTR8*+t5@{oR(zP z2hI$z(Lxo$pkhl>dJ(Io1A0RpJJnk-6kRyp4DbdT)#|e9tRMl6ooEUw=^Oy`(B=?D@RT_pv zl=P9S2j}tyspCH-WHq`;Z9Uc#LV;JrC^;NxOm_#~XY zuot(qXV5pW9RKZl-Vx^^ADacSyeruO9No*LaSg7>ORsuB9}p4CyVeolOQ!AqPPmI@ zx2R(Qawf<44~nypHum79>feRRP5jBz2bT-&(b*nYpe&@DF@m9(@JO3H;OLEi{#CILQlbTNoEiyWmWyFTb8B}55!(#>dop1#^2&ii#+ z6cd;Gni8yxW>Q)-Z}0}%fcZtf+obc|g}!v2)I)rpZrk^mxYRWg8%mqIb7PmmVw013 z)rB44fwAV2XLm@jAa2YGFeY-`k1f~+8%orfvM51K>}kr3?F36=lb^P?aSdS88jlYW z#^;Wd9!2s^#|(&!uAc@Sn zs44vk7p%o{j>&|-fk(6wrM=+-dt!uNb!Kmy9wDWL3!TK_oGuCe?!S6r9j-~5((_RG ze_KN#86v}BJMf$nEr7p~u?OZ$cfy4B;yzy4Y{9=Vi_Ux@31>8=En#5R1x}BfZR4{| zma*MbMi>ONiZfXOQ+BlNMOjYSN_RsABgrF75JfzsK&STudv$I2KB$J&q*kI6Pl6+W z323u$3iWqUDEPaHs~iS@j|I*OqU)J*C~S@ghw?Rg88CmmF);&MF?-1(l=oQOU^+YQ zs8purBZqF6%wd@RSP9XL9U$^%`uPkNnk_+sfwU-u-xOe*r*`cgqKp9tqb?H$HbPPH4gfnbFwn&vZ2d6waviwyD01;xHw2+SAo5FSPS53^#e9GxXliKa2*>Z#tKHNT*6d%=;ssh19 z>ma^Y!_SHw(j%2*D0W4B4H$;(drHqFxOZiNoI?#b`aP|wYtU>U1qSkf;cKv`eI{9; zvFtg41d_Bq_Fhd7_UMQ&>caOx#Sp?7L)6d>?!dbXCrKuP-gt1a^x1(vin60V?o|K`(DeQA!M_ zs@Ekwg}&>>*TfhT+-fc!x4Q|6d`G$2^-U9CThD*x*l;a$7u3bfMCqqBk56p}={a z;8FWa|6&ZI8QWVq#bgah$)vAw2k<9iAz+p9>v!MjG|sXYOr)M}{M`8*B<#tYJQu09 zgV04BYs~Cy4pZ`z-{zI1xI|Ox)Lw9vHg(_@`GZB@Roa+IzuOD_={R6(_Fzswf9Zoh z1S`HhtRi*o`GEd_D9w6y^07=%2<3PS(8KE$JIkQ1l45(fm@4Ik06$gJONkGZBHIZA zDFePcjc-=o4IzQjt+sp!p95ir&RiYR@~)=j*;WXr#GgTWe2X!v(iRsXgF-yOf2Z)r z7SaP(V4vi|+ZkNY5FsY&#&6qU7hq_eP^ZX808=Z7HEOn_dc1og?2D^#WY&j$vieQU{?e z+SJM~F*h#&_`X8BgdzdfBVLNa6I5Z1Sb2W+h%!JfFlc&{WBk*I+PJq9A-}`mIoOYFN+4B%x zh9LC*eQ>@kNv*{*K8!&@O-}CHxtX4j8B_J3_-u{0O6Jt%k9v!bJ32ra4RXmRSTkVEe#jCSFxG`GDPW~4NPVHxdFuY z2ln01oK+jxTTvA~a_J&z!IjJgDyQQ&M%=E#3JQn&DRib(B>Jn)t?q`8ur^((1&5w zKu=Br+RbACJP!WR7MChfhyBFEUbvA%{8*Tdp6aIF!0skpYr_-H2)OR2U6=v|&`sLf zTxhNzmX@1GjmJ9$Wc&-6bL@d$o%F$y&-F-Px>p%|4#&((x@^hAfzK1fg)RIgKT9Em zJ_$nBHk%69%2otF$weNr&(x9^D&$byXxCe^GX_CNEO@nZ2k_6=eeX)v7JSvgE1W(V zbvGK!l+-N*_CXC^k2LL>*yew9Y&YjRIsks>?8xP4m6z1loG+nr0RDbFwx0RW#GLye z4`8|Ubv8J?<7gT40?0JYXeY)W)SC1E0lKzJ5|=@^S>U91W{`JfJZL(=W!%Hx6J6*e zm78(#816&k<1=YfA>B3-Y$RthK6iQouJe|9Q=BDU(sfh5o?}~A-ZUp4GuTTiGUc5Z zM#M4A^b4~e!19uVDc`@f0o?FDm19v7tIjB->CO%pa16br0V;69HOhoj>jQ3W;+fmb zL1Po{ApXcmmHhN(jSikP=1GI~ck5!qCOB--G)O0bc=MJUGaCG2j|$EJc(LW^vIcNl zX`>PM3t57@XPzPv^=@;G;SwR#h>J(AZ;m@hVfpPMJ#NLTK0YQ6nR@6Bb{<|*q_&`_ z8_s4Aet?9TdK4%=E(`9$i<1QvYu$=R>^NX=`s~`+pzxI8KMH$%T)Y7Xok^Aw4S83M z+m=Ol%rm5IT3}4Q0Ut;#)Mfp4SO4P~;AEc#&gTZ51u9FIdM)&%4-FJLG48KT5fgV= zpNp#oaM!%<%^H2v>6}J49RK>(bEcEDR22pgotF&t`2ZdR=DSmRKK;j*eR@2~7|T|N zt_ATWkcFg=9`8diBƒUEP*FV*V`%5?7HRztyh^_0eWm0$qTS*Xj)(J8>M>vYTx zc>|@6x?CZ8vhL^T^NpTJw{`w8G%;gMi~o$zXdOO2r-AdOo&J6l7$%v@n9z>Hd-r<$ z$AkUa+yi7<6R+RnAK&A&xhWX^lG*_+P+(6QeKamG?ZMxFsOM;F8dNOkkjB^+a+=68XQM2i3(q=#_ib)xK3g52bpj_XZ{sl zR=Gn9k&)DVR9CoM-nAhCY*3ykO;r_?Xx8rpf|7&Z?>1)rHYLGR-zhRZpEmdSiY zkZSRBs#mI3;Tewd+a8_Z*kCHV^4JC7MQOX+%5qqmsRjj4NrfjdM(F9D^3M%iqO@6= zOGJYd{l_i%uf>W|7iFHeNYLR@!B;w*AXim-t;7>h5sYVD#Tv>Ou;Ktyh7_xs?1Q*tVQ{%!n zdXS0Redheabn8*^v+^wu%;Q`Rp4s7w?6$OcJAyI7F<2aT?;JeL`DB@%BMmW&{c2Td!Zr8 z7B}S*z5)GTU!Th~MFN}h#t7d4Shf1w8$;|Sy=%fFe-yy!^Ph*HIyY%?6K+$}#Nk)7*CHe-`~1Nb~_*T9brM5OMovSorN(Up6#&uG?u~yIM?VnfdH9)@r~Y8=jkzs$b)9_8^5i-KOCWupt(w zY{sf~j*Th@{b5IM`0mra^NT6u+%MK#6@eh>XR;3ut{Kk@x1Ve~rvRAli^s;%>H>#cOmYQCPW{%#nFv4G<9}R9p6g~k1*r^x z?d??iXWGmOl<4|{Ef75bGs-7+Eh+t;Kr3o209=zvf~=zAsgNs)|IVHS4FT-Q8L``7 z|K&v#zOxtVz5s0TZDAz>4Ppl6WU-lt_n;Uf+%>FfKKc?(T!PB`d}A>}JIDQ}$}sFD zM|*&F+494zA#vb$5AyPJGO5r2?ibGBsh6f+ZZO@L?&smN>Rft^W5&+}Rs!88#~B&a zk=t)sHX-x6KhJhj;3N+81Yl4`_jfRzyou9Wma6!P<-E-Y=E8Q|i`2bQre@=TRlfsG z?=szxcSa+!b5e41`7d_LOvEPaT0!9_R%A@yuo{QD)mA$Xr=dz3#70Y(dxeYI(GDFt zfI3!Z@g8ODwXPd+aEbM6miHovcvd*<8_PqMDJ&PT{Qulqp-9ag{fe2Z4ZxPWmOqxQ zI5ek?U$O5GkfY=9iV7NR({B0c>DXf8?||ZA7(Q^pIf)`37)_YTTuFV&Tv-psov_=I z!0b?c$t2?JZZq?Il|O#G!=v4sLT$uJ(TwKeRS<$Iir{bGSFQ_XxnMyI zUZ{%rQ6FM)J}Iw0cC`_!`cje9JZA^yS|IqSdwL4-d+sB~@#Y;%T%_BeFI1b&bCz*? z02x@~lqZveCvX~Ke`BVlHzdvW<<4pUV*m5Y13&mFO(-lqs@DQyWe0hVG%uEd@Z>FC zlVzuLElJiB_)7FCoB4;pg*j9DU;8gMlw(zZ*Wt{9D0<&U-aj!B@6|G+x|qTqR(oEF zl;8)4h8v%liK=`q;#-1Y`qS2e+ZLe8KnycsEK_0a>oPJUUnZ=TW_!nx6(<(- zMSLE@Zw@|UfDCgT6-6HxA(kK9*u(eI^ zzJe^fpH2Zdg+?4T84Oq4$rLaK1jp}P-?70!_4~~7r@&efxEU6iyTN4TJ$7pm1JtLx zAAv7LT*1hhciWS8_t%**E>wMls2xez%Ps84rT zjm-ebQ?Blarw*3fVGhoM;IFCb=s@n@W@k161WB*?md#+k7s;qoC;M-+*@rs{iy0fM zWYJ@f>EXsiZuzP+`EW-cN?z76AMnL&iTLRX0265lQo*Ka)-lH+j7+FP9eaB_8HC=| zjp|9emF!!rTNw>Of0SNByB$sP@`erZy~S2UOcj53BVB9*HObbSU8!_8fHu$B@R+q+ zH(ARy79R#-8S*gLLS}swbM~?#8GV^$V>(b6MlOIB$)TB^u3-~;aQBg zTw;scdax&LnxO){*Yvt%M{UAZui4p$up7raigy=TY10HDol64apm?!|>FNM@_r>ln ziM_}QL@|tH-ihgrqdaM{B=36bB07W3g>*FC0QeNA(DO7oK zwzdt)u4O^*0`fY~o3@;YwQe*7kD&sU_bS^a3xN^&P_0jX)UZX)1twF%-gPcyL=Bra zA0cTUzfm>A7fbN#lQsGztcEqSv%#Q%x%y-9H7J={V?aJ!V4ou{2A@jOm6D(>V2Fhm z*uXh~EoLQ6>KizGFSMpMEr(#eC=M=>*<=AW8Id37Sp}N}HchfFrw1FFWJ$FqS#+L% zcL|!>G(QPH98{u7egUH0c{dt;{4t)#3Vp`GBf_>6paB|w&am}|hZO8bHt^>?S~>5i zkg1HID#Oloq~v(8{YAIB8u;4~wR3FIQ$-m*svmLnMmxMI=}fR;^7DlqaiF!x?`jRA zT&+a1s#{Xe#shZrap&DKH9l00ay3iGB#>C@aIi*(MZe8R%~>TXIR-lE7g;w}lFYMq zbX&am`MhfI3w`ML+by(E858|a^d(MJXN7CPF~yWuBEtcdd& z19IlHC?;`=^B{c5&FGu>Rf!hyJflt~p4O&r;I2!fsA^{e#ti=h0FgOqnMrBc33Sg= z1oHyb{DzU<>$I($W{$@h(G@8hJ{-t(iq1>OOisv2j!er=Nl#->J7mwj{kqb z_*eQ;ez9$)3g2C>JXs}^4nNynYDz*+vr;n*B0qeORZl3Ju0)vww}S!3d(IDrrU`zx z=oBjeuYvNdN7W;2`ABxTsd{>HLN>bb-J7~WicfhN=45B2Wv0?kt<4}6a4f1o*!NyF zi>ZcNCz;yi08~nf86^`&W}IZx8xP3l{5TKIIaciK*`@~BxsYZwK~uGuMEvomHvO8f zmoe*Qq~+3IKpUmU2r8f`y54M8OI2<!)+Mx#zMLU%=bP$}kp29hn+nsg9r&t0CogRvA;XWeeZg+P=&k5}M`j$cKh8XB z2U5p+rs9`CuDZ!-^mnSN`MkxQS>DY{>l?iuk&&L0O`XDLZ5T&9&~=%0q7q+CX%hQm ztoXhGS9=9TQdf0{B~Yojr9uuo5PfHxum^^beLu1b5XJApeF5M~QjfBQ(-iDFt@(0; z%oQ_Yc$8U;-Cy0QjiwE*)Ewb87+8#bUe`66o0OlJlSZ$VWk0Te5_HwA(%LB#YpS0( zDlNM$eU-pxy)KYsT7H?;AcnlCV!1XRFk4z1d}?4Oi>g?7heN~`)hfrb4VmdeQxaaq zmS+6%z%GS{_cLkt53^!=5MmIbw&qcT4uiDBjLwPFjt5X^F;3CIsqd!Wo;V$5?cHl& zN`I5LoDNlf4o$vFsESDJ0H%#|{N~eO+UzQJV`F8`2zmpdrt%#(S=98h;U}2UZEx;2 zN|^a|duz5aQ$56%0Y`0E7u-(HX<&mFpLG23`&m@{7mVtWba*tRDr-0Kyn6JR$ya3@ zr0YR8Jh;IfvGn;+S&Yocj{_{-%>iROd{7!q_jMfD9)R&03UBCa>3=|(u5uX%yoksN z@B(6Z%#l!@*Jy|nvD?pv@I8o2 zOdlNDFeKz|B^&l-AZXw7u~>|J=&FTt_KMVupA~jmX-B*(+1BDRh&KsxyFr%i>rP1# zaOBc=H`bCP>6m?uq^DN&dr2PbWu%vYRQpx#ZCGu5$dSG5)aN1q-|W|hZ`dn*NWxy$ z0wZO?s~gtj&?2ANd)fX2VZ&A}%%$AR_h`{@?b{PX{PyV5f9?bS{AhQh)Ta6VpNZe@ zUKCleJBXP5gLEG;rA>Pkv?H)UAz4dXU=Zy}2>&=TFW%2O?OTj*8UJ20oUBhV5c8EZ5Ht+TR!f{Y{OT`Ksw;MJlys zeRFbXBdcXsfW`NLPdJTauZ=852wdwr^dzuWZp>G|;wHJ*TUb;O!x%wFm^pN!|(CEyc-zE-)aMnsxH^WqgMcH`M;-@vI+2a5nSD5d1IC8KFFAqMu+@!P zb=R+N0;$r8yjj%<9JnoWrOZcrQo4$b7lyR-$@dS;$W_c9)Yfy&B{M4c+{(sb(Vx@$ zux!j(#YX-C;|lTm#D^%YWLZRq)i%e7#%SG&#u)wSu4zDphOA&hF|mVQPCO?w%#J); z&YZ(@N7JWpVt_Lb6KU#l4H^nW=-&(NF0;dqSS)YMy{OLNrc}d;WsMp}2Kd4cG($X6 zIS@zToY`P|D!kb;R^*JA1(B6Y8|T5}v1d}Ls4hzzqnH}F@df32yo9-hIrTpOPBaCM z=Rgd=POr>A4U^7zN#mqj((c>6M&l1GX2xU8EAqB^P>uZ-HyR&i@p2&u??Ii%d%Yvi z4;`gcixx2|G~v!3`K2(1jjO?__cwK6P+0mP#fIRg^u3HG!6`Mmf`u6);W)3ex@=7| z(@RWXulC9;*;2R@RH z0NQ=+{)e>l$Yl?aH}akn&(%wA*#Chx#g(jDzy|mdG!+p~?B6yt0lgQnCZIVW!ft$W zklE@$Yp(GEFTKIJ>_5ik3G#6Hz7JmYFHe{&v&59-&Szz)9awXC@?B~Tv6;`j!At1* zsbi}f$#2eMp@yKh({5l0RW$z8`X+G%L( zNA{W9qQOjq+^poZeEKlGnEQ^m{jW;rS2oa)wR4y&xT~4_esXw&E&b*&TQuCE*Y{hw ziw=a^95xVG{gu5ZC^X11fI#Qw(5GPbBD3c&NSvJFIbD`bruw;qGP3CQ4}ZHJ1Auq? zXZ8CmZy+HyM3p98N8&~9%x2BsaS-ILa&4+i8SB#VV5l~Ba5{~Bb~25NE{##zk63P}4rz57k6q>%}uu<@4t=<8U}vfiuN5sFLA zqt>hPE#n>-=}T|+=F03cCDk)oFrR>`uOWZ4K)(&inaLJM4>MTlRbBjG{A@_ov}VM5 zCMz$KK#tzr$SBz^O^0Id&0wLP1QyI{t9ynFn8BV}*8%wx7dw4+nzgVL$<>M13|8hg zfa(J-m-@*HAj968&Yp~S1+0l*w`9Dr(j3*bU z8Z&bZ@D_Rh&63S79g;nb72Qy9A1C5X$7rRDEjh`>9&0MgHR&?Y7w1M193`gmURV?b;Sw!kdb4Ii0>2=a$yQ9f31K^t+@6WI~6Z2R01p; zODv4tcihbcZ!}5fWCv0|nGNGSa8u#ZQ5k~mF_!{xO4lk?^0Fj_1_KXlgVnade`=wm z9|eShyd`gnC$rJ_nSh$iN&gZS61=jq8FpN_tesuU8DkPR2ndvgQuGH;M<64W`c#$6962XaP{h9c+5&99 zJEU!ayg+&8WMe;l@hW^NK`jU0bWHpbSW8%1$aWlfup*RC-%X4PyHO3502qAqOtefx z1Zc1&D&rK%+p*@^TGfjYMTE%k?n;c(u!SF1*Bm zYt=$y(ydUQydJ|Q@lG0;us6t|;KUbOhv(cTE*rCE*tn8SDg835p)-7hK_P z@VQGf)Ne_=nkk5uJkDA$>s{5xWk_QK_(!_=;ACE%*>$`L>Oghix6tNSJmcvCD1lXq zl5uB2(-MB|;uoh`bn>!0u;(OlstN=0YJ=%NH6@-b&>7V*tB2^%mN7AoXGK8$j#<#0^kRz%l4(% z0Kk!Klh>gx;1iy}QBOY0TyO*z%*k{G)<~;?mIEbT`edVmD^;5gNq0 z08lF)oGasR1N?fJOXN^96-t3WERfnn+VOuG4i6T+*(CjDneV4 zbqFWGjHw&0x)K*f)+x$n3XDhx{nidF)S0l<8hYxzktwo3Q=}h$@R^|rpG#dJ4br`T zI*@OQ*3_RFpgQa1oDsyli6sT#e^C00%4%Ekrir8aJD!*L46R`9ViMm}hxj&Shfest zRLS$xXGlyFR+8oe=cXTRu968&*!02^$8XD}SEPSarfeuEE2!9zMV<;SZkQbB0N`+b zUAW9*b@+G3#Hux*Z!+Zq`!JPeVW_1;7S zKeR%;KWJ|e(ecm9mSmE^EbIcHpb%v%;y%Wx5NWnUszsM~(wE6NA9JL%&RIP8%Pz)w zqpD(FLa5o@myz)6)D*TELmZJ?Con`Fbl(W#VS1p&KtQbo+Go z+@FB?lHW|>K`)_nXH?m|O&#Yhy}oCthC<&WM;Bq|pWfR02iM2_ZDZnk`fX;X!sPFN z`u()F7LTp$x}^By)AowvLYltx8U3KwD~qLJ1EzQVBR@u?dn@I*wBgq#wvL_CN=Xb{ zkr#L&uSoN^;>c zRhHL|YW-u~vdA~?=3NcbUq^&au#MY$<6Uga!ZqZ^ikW>69UnBYUAD)7rByK@ro!Rd zX)%XYswaER88IO^)a=yHGnJj^Wev!g|0lUk{gHNcE*H*iTNShSm_de1M3tKI#FDQE z9n-BWO|(v~ZNFjDpk3QH8u--s+OE1Oe0MQ;_j`HGg&K{58}X02Z}75sb7q}%Z~x)j z&VN>}+;+yaaB7>2)=x)iO%G{4@A05<-*a}zf3jAw9vl=E z{9NAfpO%XzwfVfk#BH9#rG0htZ{AG1eZkGmd(NkGYF4RN^tN1h-{jA5^B|{=e_ZcP zTD9>0EThL>*Uk;!q4RL%yRX&fzx=d+k}fT2y7_ztc^q8%!IGw>*8Fx{@wqrIG(hLKIqz1y{4dk<}Hf}e&Oo_dZoOr zc-quN^XZ+`ep8luJzd%E=!1RVD+}Ar_|WH`LA$#1)1t2T`JrJyc$mxS;XB)%2vK-7 zuJ!YE9giIn&qrkYv>c^U;TJDg9?>-Y?ui*iW4o_AleX0|>~rjsJ%>W>_k7%8LBy#y zCDogUJ^t?gRaw>k_xIc1o@{m`^WwIC|5-C+?|6?ugK2HHBzQc&)O==a)XBkKOD=@C zogQCUJ@|fD>9gSKCnirU#tP-pM?#MIiU*(BJ)L>1g}rr5vmtiY<^<+|S7n0IlJVKzNG&-m#yeb6}yl18V`n18D_oJCRX5Dtl3#hsfC zl6UU{s}`P1%@v3S1-Hgxz#otx%SvI1njED6(2)*!qK^ptsjS>`LP!S!A+|%seRy8$ zR?TW9jP_2|g4mxNN#JM;Hz%e-y2)aIg87l+pRI&?t)u`)ocyB`l3P;-?315Tn4R80 zEWR@dT!KTD4}TO`q}poG_!e$i6Aas6J(grdNhhJ;Zs|8i(<4%0vR6sPi*#}=m84xK zsSKA5+sXe1c;JF~+r>>|Yh%=)F|xbfTQIvV+_*bx`(&}fy>iwQnS}h(8ZynF!1fLV z7eH_l1@s5sEi%O3^PdX#W~Vt<4tq3RBy(WB)+P(-mVd!xmK@>Q3+*Gvh)2-AA+H!S z_UlM}>tUb5`h)?FFVHWRw%>mj`Ha2*m5wos!axv(`}q}9SSVO1D1tc=yymVr5esbs zve}&^1Do9?I}t_v?TEz=m&e*mTLE*zX+dW1{Nytm0mq=KaT zH0-XP014dT0i96GYQr!Pyz49W5Qu#!G>}rT>wgxK1{x?dgtVuCk>zzFP-G*m(}t3N zuOD@=jiHY{NJ6taGdp(=**;?|MxnSta4Z=qD5O({Hki0R)BJ!o;{qXk$`4V#o24J( zHpX~5xrzDpbi33E3X-Ybt}#*d(`PJ^nky(+t%WyfWh9lP6Z>RPRF+3d3J|Hb1gqEC z^M7&<0gUVKu|LqWe%UPMo5f?*W>PA2Fm5`HJaR%Pz3Ux}j@(GDsS75#uB<^AR+J_e z;wt-1cdSQ*m8nxLs9%YO$>jOXrdfaxzNkD{U}Y66vhmUDax%(?M9EihoGntp!dCymGSN&3%WNta>~f*>6!0l2*Pv&6WEY9UUE2 zAa7HQt7yUkuOMjPBl9o$tZ1KVY1z>3E?PoLX77gUBv@VgEazN3mcg~g1>;gAFJBy8 z{KAsMvk}Nb4Nc3=!RXXKImISq7SRt@7S}40(nCIQ_Jk-rA!l6|F@K%K#$oQ=(nrdk zD0<iXc-->6i zcuGyZGnE*HjmbgAoUT3a_UlnD19gzRB%f0F`Rv}`B`({YPU~X0fnAGp#y_51tJmxH zHgW6EsKnDPG3@`k9)C1`y5)#I22r$)8uu^TH#a4UEC}8TzgEB5D8X+KjKS;1^5Y2( z+E=X$w|hI-MDd!*0SLJb5wE)gx7q#C>Xi_(*g;DXUDJ2hM@fWubC@;!4j1P02WbNh zjg#m^)F-^HdNR?U`hW@^5DPA zPy##0Zhk+{(ObY&Jl=D2fBk4>H@kX$)vdAiu9(%T&)IlxPf@LxT%V0Uty4{F!!QiJ z`&W3-LjrACp<}Qt9qfzku*-H_MsOXaHA|de%cW)Xzb_wclP2j}w&`LcOL|XF^7TzR zPYDTtM@#{=G=D0=(Z^K^+8x;rkt_zCG7i*#GV#>RZj&Xy3?LYfE&_Hw_MT-397Q6% z7s!*fLx|BpLn8|}WlFJ?ABqS;IbBbmu<~IkH0tvCIFLamadSK@ft%d@3fe^IkgOA} z>0^N>j>mU%;lnKpV8Yo?Llm5#p86Pb<9aJ2q|QU3@FyI@f&ky{VvLJua5D%3sDYAdA$ zP^BJFVBM($FL6%M;D;5W!{M+8`#x>cE4oNT(CoY!mofM18*jBD`W4^5676I;O_Hd_ zFgFEglz-e3tNvS?++fny+_L*e#${J?UDxg+q-_Lx=DPI#!){RQUZKHcJJQaX)L=JT zu_oWOR$Xt}Fcf{yukZt^5{*uD>NE)oQ=6q5QUMLE-3wA=oExwf?8tW5riuT)e2@}{ zd{DOf1(EpPd(OG%+PV1{u0zA{fCN|oGNlrfD1TS|4nYpDtbxJs24si{AookOSw^cn z{)>F@z`MSB@8RC{V$6IXigLD?KoTqmh7rjVw%eRZ9zgy(i&Pk?fe{0d5=|(ZNNTTv z`~YG6F;KihLAO`|B5{C1Pqz<`jyrpD=I-42`Z%6DpWJV=2WNgewH-7>?*>}XlJfv{ z=zofF0deNx~CdE+q%H~@T;Mv@R!>(u8l-tRrY%R+XQN|28ZR%nFnlz7jI) zNUk)?*x&mYvpX0wA^=P9%*qtqGDuC%++&G#n05&njd} zmH-tAc93URSx3e-#!N=OPYDI4Qi-f`F0~f?=LsIz`)pA-MD8&S!0Y#u7AUyqB7f^{ z!TMQetyZM^5a^&w`o0?e!_1j=)7fOvU8}QdjQg4s%9}>B&;f#34k+bcWt4rg%Td5r z&qO|hdS)`^iV`@-0EP0p;H}*+fzqSf@cpOe9uL}~rHS;(B~_9>8{pD4F+#oc42Z+f zjsC9j*lHY~+C%CTRHeHq2dF30uzyxv;B_;hd#+Wpf?x7`H8~sK)|`%L;p0F;mGg3* zo0OBD^9_;^`2Bw4m(Z!aN@jjZFLbu$kA#0DPRf0)t@I)}cE(?=QC&;JFcf{yuegF^ z9Sm_W5v(FO9PXh{Q=bYWO>Wmf3cfKk7`lju~xkNdgoJoE<%@?{v;Z&>h4Ete98S{it zdL7fS>HD#sJyoSJq2r{KJQnL!h)10dsC1B@J zOM?6m0DEH)!uXH2gW!-WI$4y)^hR-Ld5nKRaT}GrGULO{n zw;D9Q#%hv(mz50fD};ch8sCK0XRmDFn=Kb$&uahQd4G!ug; z{5LbA4Le7EGvf#Qy)Rq#4z*U>Zrd;nefL*rKp*VY-4dX~fO&1PbsJJ_ZG&Fk0vM`H zr^XaH(4`j)`S)3h7t6BTI0crM1mPh?@*Gn7e6qY>20;ddVh$)2k{3j#@_7m3XdER0 z!wV2gOaP@5wYXFBuYcte`Itd=IR22~(c$cj zg3YHKNFk~aNf-0GpcJyx3MoBS;JoC0Mp-N%yHv8z&PsU$LVxy0m!-tiV?4=ei7Wd; zNvtcsCMAcnsuZFtMMsD!O8qXRd;pH;aHap;3WV%@z!B<>7NnseO$}XK5gGd19Cun9 zyX}lUEsT9_i``a5CaE>s`m-nR3vqDVNusKuPXLyim7{j(sKJ6Z$!nym3=7yQN@G1j zvEc1`HQpy2JAeMB7bdtPqLodW(Ck{=<-Awl4rEH8_O7o8h{ts1Eb4XN}s zdN;BJSZ|FRtvMsU&JgYUr(nN3MYgWnigr|u<_~nat2cG+4>@dzQlkWAhmCygQ5Z3Lol6&2tHvtA} z}xSO3BjKEs&)pd6^E`|9@`UxlL<}o8UX-@Ob%s<>h=>%nCwM z5Q-b1fkh()Cb%rXMqL&X&F5eXE`TOCZa#6-%lu88rI7Zzrzt<_#kV>Gfil7Oh#Z|q%%tXudX3i7kyHpq>gfYmr_f&IO8M#B zjDL7}F3CHgz6v839D&CB>W-hdnF7|h!QPvEAyY84V{4soP2?s@ik;si5xMp`I)TAI zlCz3@?X|29&ZIpa)W>MlrhC<>UKsGH9Uy!gzgJLs*ftpL)8QY0ei&|blx{gx_7VeSqTPu7$)$poQChn!2RrTdLv8yIbiqP6;##HNO)I9qV~I30eDyek7Lc z?+G2v8`#&?PLkrEj4as~%~xx0+AtLTo?qcrOiiS=TBTN#%G!z2OhcumB6Ql+RFUgk zz-q7~KPYJ8zt16zfeCFoI)4p+LAmjLoO6$F%%{(3KXsfKNP-0*S1Lh?iqtp-d3xwo z9fk)WQ%nFwU-jTY_s;o zTmUA0b`L`bl9QNUojoR2L>e2L}fguo8Rd1PwWj*L8QrVcIdvxTbXlv>9U@uLND-e(D}C zE5&ead+eX}Kv{xvtuVBU+;^cpj$AwX-WsKOHmYo?zTi)J=YQ8t6gONPBJS=jdu05H zp*aGSCo%_{6EO2-_DFaPXy?7$+1)D%*RudmN}V4I{{4$BnLMLRQ&w%Y%WkHsDe;!9 z1Sl=ov-&U*v!ep>>yC(VyQJon6u6bD#rWqAO(T*oT+BHB`{8!kXg2)|ZxcYi5L|2v z9>3jgwKswjjDMNJqpboJ{J8GazDI9>?UAPG_J}XIY~0*zsy<2Z7D4iZdTmok9Xf!x zr3=2k{|8g2aphk`t=rBD6_s6V+Sa{PwH*HM{37LMtjO`^&<5E0=@} z>Ra8$o@MLB59)7F6XzGzR%>h9FckgnU!g)j*pR{s9e;yl=|~eV&6*c^lno3#|tv4;L%}4Y>zCV}i)#p3oE$1NSEIEI*S3^68$~o|2eKuLUyy zFqT-VHRnjt>>DC7SHhRf$DHG3X?=_%@UjIzO30#SrOglmO)!r^mQsTla`s3<;MNZd zrDMU#BbI=?zg8HXCoIkvYlW2B3^dM`w=~_3n13;rpmRo(Ws^Muhp@*&FolRYd(v9z zt;IS(%@Pv4sNnlSx+b{_q#WDQoD*?zz1acPceE>pZFXHp zmSo%tF458PMp?HY1*#fg5P4;kI<=MUpeo8dSE`YNRGcEOWJ=rHak0JT5fK`W;JYFz zQGeU1ATPp+0LLjXSi50Ep$JO3c$*8OM2JMlHdX9w#pq!#2_)ej=fHest5tX0Yz*C& z^CI-hM55T%dVRl>w{tmFtNlUWEfo#l=BdH)jeHh+<~YSy5XtzDSE7Pj*r-MGc@i(qs=D;&)4 zuG8%n=$)wQTt8?fAPjN(~j`;0|nnjg6AX+NfVU4BviI{q@MQ zESu1`=2Ny{S0hCU4|oE_TzhZhHWL3opMni`8yT?EE6~FM-X?{UIEm53_W7|7G=(cm zw9T$8>PRV%yX$wq;X^h>OS0_5dkeI&EOA~O&irOb`R8AvMRauJV=r(SMt=^E8S&yt z{1Rb)_G9hCQRpr)k6aI<$!)TnCi4sW?ES;X{!c&t-FN@?(?chmVJ{{$e7K~`r5pMm zj*b$J(JTq&*9bqyIOOnY5>OWge#qXQkpNHdGvP6}?vP~^P#>#rD{v2IWS%g0^J*^& zLvMkXuKts`btlwd)roQ%;D7XQFNvch-f?UvgfS2Iob+ABcjnyb?Kt3$&Oc%{rJTes zI}TOqT~oGn;~2At)u%4F(T=n}`xu_P1&<1L(K&WWSo!&OIESaJKKzKo_@Na=0r8|G zw4bq;h!3A!K8#%!r_Q~V)HOK$@P)^C3DyQ;l*zBU6l|A-ucXprSAT@TBb2?oo}m6) zkpQ^P9Hw1Qp}ML#^d5`Q!yoQR2%dhqz~0wu7v!lbd!JDcbN(<$LYRNJL1N+tBMfn6 zCpu!pH3N5jqU>w-Y9ykfBGU;U-GKNlHcyt|742saN9$1If&MY--}WcNR=-oqxX*=+ z=h||e5Z1~JqOBDQhkx!2Kk$f=FrJl?8@?=OG<*@UIHIBO*K81JG3LI=kFO#l|KBq- zUP%g*xcqQ5BcU50$SIs7m=K*AR4VW}dZ?O99xhyt_2;Ai93l7zMtF4N)W*I3sMG6C zM(yEfay@9>w?Fj;zoIjA62rtbX6ekGe5g8hqP`t&(r8erFMltkbvtOcuGHWK!>(WY zbgz5&Wpdg3*dDa6#1I+=FAa}AVut;)al_l*r^)?z)LKc(7xbyIOk#Jdgx%hxKj_^I z+Cw=oq>YHtIfIo`HtM=JxNK(z&M5P6rLmX2?sey8Jdo0gp`Mvc%SVD~S~qPq2+ZQn zaoO|IB)x%@Pk$PNvU06Dccb<|YC{58cv~!R-x{Tlr)jNh#7$>3x$0bB8*JtzZun$2 zYi#GY8hz0kwlia=uq4Vx-t}&7+5<_+u$F)e#Vd?rBT_S z_UHEHc+@tWxzoK-i|P_YA7&k!g!6`6Rvu_kIyv_p_%YWtWvzG=-)(f4+5aY4GP8n%Dz)lS{(IX|kd{Tvb@$X%{AiQzTaV%h@b0VnK z~oZ!K~TLjsA5MCP7dyOi(-I#b)zk z>u%hh4BG!3cfc)ysF}r`6QK*DGbyov8EBPhP=8F3NUF~9dwyIyfswita!!ux==h{q zzUnZh*&Kc8w}-V_6=Ew`-E3a9uUq50k!824_DxsELG65^Zg647DMk^15O6oR5SETJ zmab&Vt=dBj91U8jZY8!*=l~@AvxM>MbngO9%#>eA0FpY>^hN5=Bs@k>3oI&gS-*ty z%zvukdmBZn2Vr>J9TgkF1U(0EgKn?e1~c3XWng(h;z2qINDGL_i2{(D3ln*;rb=Q% z7H0v~GSloY>kz;jf?GOfWE_-{EC9y zF`}{sfKp_LrY_@1D7A{p9#o_;@)H3DR)5c(qE-@9Kvhs%2QX0b)nw9djc$t-PJ#Bf#2v#3dt~+kd4G|? zVoL&-p|n`4BYZkPMaPZCdw$jr5?=2o(|~v%2`5t$02UVDBUgicaYQ;EAa8$Mk~UNk zby&x^mQ@+#M&d1`&&v=ijkCAkE4fP}mZ~fNU(j<^%f1Ebtkef?Hd}Xhdjrpv!6sdR zU&V&C%I|ODIhM~LD7n!e4YTC`1Aplf5b_;rD0~7lfItaR5{dD3)VhaT>u+UVp+JOS z|8!qJw9HY#Zldw={1|Nnc z3svlDz^NUhY~5dLLSdO=17`X!hl3z@biM+O0_}zXY+a6SNPL@2Q7Z&2rhi~!S@pZo z@j0BlW0+mhOIjrxh(0bLB!wEig&RTwZVgAL2!aKY4TibIP6>+u{FbV*tp{~Dt<)Bf zE;QnWKWf?ODG?IFn#l&H5-aPD++ic> zJqgJ&S*}$ZdX$O%7N5wCDCB?$H56gy0cio+9^D|>J3VWi%9S=6i{D21OI`b2LiYWZ zmM|18jc@B_>0#}04DNm`av|_Q0iAP=RsfFpc;+TSEbj6JWwCV|Dt~A!?uAs|*w-i- zU5iap*aiNU`4iZt;KJ&8i94#-BWmir-jD7qtNzF-`b5CqkZDz)SQg>3COFm%prFMZ zq=mxOO0{X-vu}&Z zpxq;J<^7Cx3vF8BfPWr2EXM)p7jRoianhv zrGdStqjn|H84B@Jg;a{de6vX*cGzt8)8H~d3mE*(PfFZUn$E z=dnv2&Ez4S+7!BRBRIxlfqqbJUTYoQLl5lCqaOvLyL}q|oRF!#4sGl{}*% zaxt&ziZ$s4#Wj#wpMWkBHj+*#}14nR3S)ONv;$TRIFeH z%UB%NgU24ki7Q7Q+zsb7JzNglx|>kT64el8cakYQF$13I`8$)eHkS(tn@j4IOjbD4 zWJZh?(SKh=`*JDsPm=HJOLBpKg?$AxD6Qt)?}0Hcd+MblT3uvb%={J*a;iQ@ZcJw^-N_E?zMD zq*8U!Nm0itCN5pkvXhk?;3a_2q75(ch_+rDL* z*6fffjW{Qe!e=wx+urI`c9-?T1|`|ytxiX_S*=MhDSdZV(LqZaxpFcsRbNe5o8WD| zLKlgmzJh{6Ul#VdRr|hlhVrL!G|Thd z)_-8S`?UK+Xw0K)2e7*F=7Cd7@w^5%a4r1eqv!x~$1Eb$gsI9zBh(dmP?Pe@t9SGP z@ECOKJ9^G)3mL?#7O1lab85RX%y#uEbCs=%%1@i;oOYIQwaF=@Gcr%z$~$!vx4mjM z^G`0QiB$~h#dzpdoQsdpHj6k`_LGg)V1MQ5E9b()a zHR{^V*2IS!PuuYRRr7DXyV10$+uX94{|z~3PjPO@Ve+k~SrWVnvd8vPLmm9A9%)oV zP#8XwE$bO5Rh3$1L%OmI8(YJbM{e7VtyvvMt8OPDkKG{1^iDdnF2*pe)rxrC1b;N! zZ2NRA^G>2`;baoNg7x4lWSnjL=+0SZ^Vys-eq>e3~f zeWPERxx!|V-gkMnX`FMws)2ujwJ~4{O(9jA(?)L!`Q(CAp#s3VJJHEiwi796-x6Pb0*$RqjOJr0nclxw7 ze0cxP^r|f>V4DAg)pEr=GN=2`sGx|Dmt8ZUczI#RBJ~b_dG*8F9WMp zrc0QOUZxhfaV|gLP2MKBM>v4m!J?o5J`=A=8f!h>Z%G;0I|9a{Py|ZjW`AbOAw#G7 z#ARN{ZZ&@HjaMyLpdLzcJUkcW)Iam(5#X;oM?8oy$fZ_wJyd@Qh8|^ z!P3mkR(0<(e{}$yi-w?jy!z%2KjOf#mae@=Q!M!~nTi+1rkD-zoPY*QS()jp^?kl# zlGe<{R5y0H8t1;gaw=}qRrpB(XA52`3LM+H7r*Y0)=}q;0(;K(mVXsFdm--4oZl+( z+u?UQavK&E)!K{ARcDyt^?N1(RNkE1@)Hpiw&tq;JVe=E-RkYk^dGv-5rNtAMX>@xG)uLD}t$ez$ajh29Cb9~!9s z!wilzlWn?`jePA@;(sp}1b@UTToG=5W$&JD%%MaZ&Wh${pKv2-71nAwd1Tk6mAOiV zEy9P>l#Nb$Y3^CGw>!|r2taV+h)wl+L!yHR<0py?avPvPHJ#sbT{fHIe3D%D;>G7R z?>hQz0)b{Qnf#uMF97U{)57bC(&$$duv(0j!36o#+8c(ExPN0pLjm>khZ^i_rgchl zRsl+Tn<}Qjb;Mjgq`%3cI!DnW@~87nOuvcla-~g)Z6JKf%KqIe=j2(vHeUrz=J7lE ztjAYm7kTt?e`fv5-p7-iIPlle{{YogO>dh(5WVv&=3vQKN~>5(RSB9{NiOA5AA0D; zQnW0Cy%o$Nc7Jf}RQc~+%%@!w1@{yVM(ldt%)EK?zAds%<~R|`MC1sr;ao|6;(dnZ zc0ThR5-FNYNQ9^FMH&|C2fdSDBaCk5Um|gRvkE9i$x74eQKzY($akE=yzB2|bb_n< zEK8IW<(WS&GFZMD@N=KWn)YQ~nIKBpo>fRV^U%n$kJ47KF>`0A)2Vt=86L7~!k%86!GUohoz&=^7wt^8BLxAUI z1{0;>7N|%Pzd|WOD*%WUi3H+;4gs)6?kU5afj3z8o0>YLsLCy$iRi9u6`55%vFDv; z^V@)-q<;had!8}@85SgQ8N2;-SC=*5d51w>!SqoOX$B!B+QG60-XO?&w*9_Td~~%D z2Fkz?kzfj+VVdJw8LKjk8km0g9(mehAV)58I%2N6e62;G*;a3%+Sw^mtVE(-&>b(e zb8BTaQ+^LKICiyQq7Mh9thQQ3Cn{-V(QBlspnnPM_?hrVnNN3>s_}Wml!N5}>>#ta zLs{^Lpj8o{u-XWz;;U|@b`-ZhwToz3nayAU*A`@co{!e!PKjyI#u`#taHw_TNFDM2 zm{M8YC@%_@Cp3(96uY}WtXsOR&^j-$l;#Szc-UdviVlC<^mfx@o#T-SJX;g!+g9pZ{GTA|KPwPri&RtIv30_#Zuh+grB}@og8?0L%5Gk zf|ehG&2_MPPw&h>EMmQW^}B^%zFrJGn}3+Xq28iTHyi9(CkF=sC&&)Ga2c62@We@W z&30U}BzF!MTs<+V#|63^j^8iGqv5CX!8CWm+4wHCh+1tRif213`NpYBJ`mR@Y`>$I z0pXmm#f%2bBc)a!$a+9@xBsKWRoA%Z(6zZx@`R` zr`{6sa+35)9uu$XG549{30pnl!s@%2=h;K9_i4!@{MA}-cE7QycQ5n3Pk%koYYSWt zv{nDdk?Cy5!!9x8 z5p!;^i19d{%m;wTxiOnBFMp=Jzm0##)4wDa0T@5BV~{6jsQ})@N|(jR7X06t*AvXCixf%`TE#>EjDsPjpJjc-0n*ctp1?ag$ zB}A?%b#oALY@|Pf$46%lA8cW(w_2%9A(rHxTjmJj#xST1l}MEw4DmH(LQg$=*aFo| zw^Xnh)OG2t-MQhLkfG?$s1R=-)a*&zsY0zmTlLd|1!0QK$L4R~Y*9LxABn3v-ev`qI z?yu8lMP-?9?9Dyf2VKi*6&obMP!S06mh?Fp0E^TxA+sbTDCpBWvOsFZK!{3lVx3f( z)feTZy+||{Av`xD>>C1AvxXi^n+`ifT*#0={wE1SDslgyx60$67bb;$`R|%M^lZGh z^MGj=O^`;{R)0W=tfIIf&SctX7vm_8ws4%)Q$$+m^z;WTv+sd zJ7Z+h4JppDPjh<7aNNM_TeV7rvto~z2wUg!G@5vtu74j*+=cP=X{zs-jrE%R+(tWW zR4cx;O{GpdEELt)uNETT_sPXT8W4a(|0^j;Txi4O=t0THfyv?0;64P*LFeL zeLKnAn19qSbdl)r4Rj(KQ0(jle{&pvJ`78V8BTy!r_qqK-^EwAdv09xu7>mF`2eE1 zKOS8SE|(XBq0wrfBO@YU9$E+%knEJC=IQO#!`3mFF?^3Q?unMNPI@cvtD&DRO>JtT zEo>P&9-V;72PiR zDOc5Uj1JaWt@_l_nOas;R#AwZ;+8?MO7L*Tcc7ycdbu=(8RzlpJ~UH46u&{KskB2r zx_=rv&7~{8r^n=xqch1bUpp$~%bnkVHUNIf_OtfRA~p_Op`p_=mCwFxNi52*e4AbM zJSrKd@^Cvn&8l1BELvbg;d&kYj1~*m>Tz1HNYv4sQJxINn$cV3qx?mBzNSS}PC}Ac zT0P^c+z67W#GOyf(jDP-<0;Z^h-XoDoPP{dsZWfk48)IBK2~#n%{4OQ;+8O59ZacG2yEb)qkO+%KjEz;1Wa>;KieG?pW1*X6C*JK0P~ zoacfp4B|v&2;PN_<*mfepP~3Z<;i29Vv(C8tzt^fDX(oXmsfpNY3TuhsOB2HQGfQE z4-}0;2C1XHr5pDs*$!+igwMOj#|++P+vib4nBTFiL;?yDmcB+r2(lPI!eR__DwXUs9OnmHq+ybW z;9d;3bhu0uQCzs^5KuCWxqW!O(K2v&PYEJkSXrsVPl*-m_+=A2<7&qgypScX=+J`^b|>n&Ov&D zP9Pr$1ak$h4d8*uCx*OD;hn{0y<3u;5Ks56Q_P^nc16bU(KjI zJdvQT^b}*;&vDu9^koJ!Hh;0OU0{}opeXC0F(bZT@Qdxdv&ig({h_g(ox0{Y!|Tz- z@Txb^%Vt2oHkAu=@Df$fg0~^FSQNBRx#4KSd06KtFBWx;(c#GyREiI`)8~fbbFAi~ z0m7>w-7aED7`96p(k#F8;nHasJimjwH)D$JyBSeMuaM8tf+y&i$_E)z92KoTEtk<( z1rsW}Qlu?NUbF3v(;E!Nmp@0n(eUQBT?bGjoXE#zNlS1gpVtc0dv0A$mzNG$1r~n? zveW^+Jd7)p;%eyyDUj7E5TFvlkQh<@d?VMmfIYOpRO>$GEi*d$p4?0eevedi8jS@u9pqzB824?H8+`3y);(`^8U(qRdC0_I z{293OV0lF!&EFPy@&5eR1^R#Gy*?loHn~lSKBUVf_B)M6z%YD398YW)cbaQPmT9NZv zRjaxQd7Jz%eTrenO3I*CW2tFh>;yGkWTjivzEEqihfrJfYNLOieX8Yp)|vEj^GdA@ z#x)d@Qk(o-)}&SbhJ0d^tV5TI?@zYik1OfjsXTY6`Bi_OwaRF+#J>49#|}~S;+U?; zm(6pD^`^~t5}QHuLSmOcM=PQt;>^pPJWV@4m8!H_r>`Kc^Ge?Sv#8<@vsXtaO?FaJ z5?Is+E_R8Ea*^kSJ)$VCTvD52h%~jWQc22_%1hcs{zz9i|L|d!EcaGmSbXu8Qu&3_ z(Bp@#f`)(OjogB6w+p(39EPg}n+2;>u8%!O{P??KK44M(=eq<`7?~@`#0ZFiB#t2L zkkSKk%JHIl6YCKq5;zWg{|(Fq=bL|S?|tWmP$Ufof{bI(GS>0niMQ*#6c&48kCLE%O8qXi5AH)=D^i>FmBPzS z^=uoGQ9E0`xVEKG3ejkb21X+@Jd&b-k}X9JOuVh?9vt zL-8qK93S+4+yWQ^9$;lA#^ub?&S(iuvXg%m>RLKG9-3s#{-pyHMR8u4Pb=qA$63Wr z^TpkX!gkSZ__g5}$#S@Xz0+#pYg{0d9b^kJ^4XmKNKXys?>*Aqae4wl3 z?-bIr)4x*u=UMz;nL#25E#oV?SOA-NUd;hzb=j;U%otwJ3tUb1*I`xVGzDvw6s^^x z9cjMUl%J#YPGD54Ky(m##us3F3|LHI={HNvVxl7 z3}Rj}Qi{wHNxtU{D!`&E$f2Bg87Xm&WOg`5x3Cibk{mSA4OdV=DL9G;CMUikC8&7S z+AVNF%7r0MD|p{MBtH`CBNi~gZeI$}h;@?Ew){Y8jz%d+N);RrLNwNcz>bT39cZudRyX&kZ)vu)I|}#jQ3koKzdW#qeZ)K zgh)z%BY@dAQuT#zWJkP{3-4`m1WhZtiMn?WDsk7d}GCK5fOt-#t7Xuy!pCP!zaK8`8ofx#7nQyWOS;#ZM2Qz(4o(f_(TqjiXQ%DFZx}<9_6#!4%A?K8(DwP0gIC8GKC!j&egM5!-*4MC5PsKR!3P7Dfdp8A4l9x+1?Ht_yCx27 z7kh{UgQ3n2SBVtJQLMw~x^K5dpoPV57{#??_#dJEEwt&Uml0?6Q!2p+PeVVMK;yI(lSj#>W zbBHgKMVUhZ3N2go%*o=5RN!27Yjdzj{B_)dK=Mz*=vNx~og?(%-I+Z$D7F)N79W&o)owI>f`QunqC?UJ_dGI3DT`t8Y-phZb&y1-Ara#u%qaW(vQMXeg?^MW{ z`wj43+T-&rW7yfwbVRVWQitk}bOdTyxKx=Nv6-xYx4bJ8?#L(p0HS8yBB&RfSJdJ4TAcM<37L6nM9md^m zsw3tja5J>2anc>#8&^x~T%%rV08CwaxOef{v@&d%Pjp)(rknKvYS?_wTo^wp3~}jufrJ8hZ{6?U z%h_ZPGX5!xpVh~ayqhH(ld(km9s0O!9xL_f)luJ820P*sb>_$H{=%ER#-|EjW3L{+ z5xKVh_3BYHC4HJVI)u>Ac+Br2+Cub~d8Zmbv_Vg`_gBq6t7-LFIrt~`beM>W6B1IG z^$(@-1fd80Lt(wlCi}vC6(~|x)p!Q9obYMgB*fTX7B350J3kua4Rp@BYZo)%`xn?H zy=>hjtIXzZ%;T1|B4<}#!VWwKj#8CPM^tYas}l8Xze1m(SFg0wAxa_K6kHHI_;Pr- z3-BeLu2OQb>~!)nE+pgEJ&g90<5_XPz-5T}t|S%KH#+>1C6xp90G1%77BjF?ZhP0p zE{#H5>XiH`Y{@jicDucK->yAQXo`zv_x|ej2FfNe1(C`%sZ#0;2Q+S6q1d|c`q!tQ z(wAhU7w{<}%+THOO-#<(!;_D~QorAX&DsXx(6!URJu;$$`|C(G&gJJ4lumGUD91E} z?$HAb+mLM~uy%c$0sh7M1<>Se2V(HBV%1{M$s;{lL5Gp@j~?%6mKq-AI-5q6<~6~+ zJkRFy%b9WN1VT+_SzSjV$TViVSK3J;?!sOE92=8*P-eXx`q^{ekp$YyVZ&n~Uh#)v z@WDDDCnPBiOiOK7n2${&lgM0}AULs#q&dK41!9!;BXw*Ra7hU();tvELC2=JKBY2q z06&{6e9R?5g#92!oX3=BnzeHe1h|M66VL_EO3))*2K zkm%-S+m5i_4nZS3(Q0T z9Z3;)$OIKgKf-hST)g55oEAP}gFw;8yt9t?k5jzq0840CXo2SEh86sUW-?F&5-(bkHT zU(ku(N5OdT)8eE==#9;sy9xyrrB%rCAu8+2(7gx%WnE@pY3m(4<%-~nB$0S6B-@Wm zvD;ks3MY(9Q7_@4ze|T7XlNkE{YyH^C{z!jnn8kd;Mjq!lMr4yx0S1W_gO1b3}g6W znG#J`2^5lP&63l)vInAe$lTrrO}$YK8TSe(ctO{x+WBG6YTEAFtsDC935njYC^JCV zw(1I4zmpa!Q@QuXjNGt4=gV>96m%sAj9wwBr^r>&XIYnnIn)i@1;zd*Iwi`^Or;US zU}R^}!0DG3THe-~lKnONzWMMj|D;BfcN691YvwT>|131Z7H0Od3zoKo8QEP)e*JpC zx~I4@;k%4_b+mrvJo)>bza;G>?+^>_M-2o}15VR8?frr5eDi3Vu>|kawe586f6N9J z5#7k7q1M!BYC~@*YF*L2o4NmDPV1Bfq`+p0WSBIm3OmZ%u=d{!4i|d3=`iKkIb3Z2 zzVrqSG*STiL7n)zzFi?rRAWK1E*N)}~ybWPt^H}U|# zin2MtVosB4dYK;FhaAo`GZSGw#l1QSKFxml4z!|!#i~Ke_OTo@ zu8573(n0`i@)ckT<3w83wX%ac*7Vt5R`35X7u3L@S83cc)F2k}vUTjUOIWN8Nr)-i zz-;?s?7{*lK3=Dx8NZ_dQtj#!m?)XPmzQlv4AZZOH*C#xgq`6sM9uRF-aZAX%w-?y zm6pytpy;ZIqlW_NZPHw5uvgiL9}i2qx!r9Z1YX~AECP8A#jpa;wKWQUfHER3=b{$j8W0R*Qc< z#Yh<=$}mbnUrLIgjq!&;QD{Juv>grkO>uq}nvAs~_-OQUMMKG`Qzwj*uu|AzNE$&Y z50+;)hRn(tL7cibZi6Oxc$P7_!N=qU?&)`e@^+t;No)Qv=By20OEDC{Y!i%&2Y}-&OXl zd-9Abj06qI)MwA23SqXnnUhSjkcDW`g*X@|mu6KS z!sv2nQh~C1sNI1M zw_6l92$qfp-HvCC!NT>-gp4YmeIp^9+G`>XimCyl7BfC!x}pzZbdxCL*==lh2rnBS zuwtw5_`f0mdn#DAR1Pd4*+@%0B8K1=s#bLNlBF$luKCjL4#5^v2eBBvn;17RX%f9! z5g(EWm~TwMh3n~6!0y8;1;ff)Q18@+$7@_mQ{XY~6ijif{j1LS5x`=#PR%Qi#xbja zrr@EqRrt13X6pFwgVFo&wU+f+oO~oGc1z5S&@mk7!G;Yt_Veu6vZ&m5>vIG9g}7WHVsi5%HK*HKTkBd>8Cwj`L6j+t{(w{y<+F_*V6GQNCpB z$0cCcXUrh>JtiIlAA(Fal0iN-Pugbnl5&CxE5apsK0!#udoANX*{X{s&VIS<7a_NO z<~ozD0Cdt`jrS4dGm~bK(2>oUv?VB#qf^#=IaCT9YDr`zR_@C74wVnNL#A)OB8e?E zfb8hr#xaYcHC+QqY<1*A#_d609tv79pkA$ryqCpSH6K-Hx+9+atAj3iT3=7C%{Rqf zMuTiIs~c;QT|GVg;*+(1KN4B{ns6~!MVXm;8fJLcqOu#-MwDPmTJKP#U~I^Y{r&CF z-+|Np_ob1g)CkgP;+jG3%=jb;L-D??;D-<@@05wfwm_CDnS|A9%exbs+mC@$;PmZa z(^H`9?abtodB9pa;tYoYYbqAfIt4ZKC$31|*K9P=ERI$)p&S7|UeU=Ta z6Gy3t#Y?-yDiquYHqmoX(N#o|@9ISrD~>~Z@uy?6K0+SxRjr6_wSzVWCsnmZJ6LBV z`A1uN)DN5c{FrT`nvc+122{vW0KewA2vbdVs;Rp1&5PexSyvTWPe}}!OH9&2p%rF7EU{=S}R~O^ZzMoFJ|m z4R|rwb8!FGo6zT#HUDa(0oXavTcoSS*g*sHxTAGy41S0FOz$bUQ-engkV(7LPy|a6 zS1=!PHEmrQdQd~BL9NWR2UF2NiU<{XSIV}B*=zK;AgbT_!R6)7^&?S)F8)W5iK%Ju zcCYkNHg4!Eq=nOh*W&xUpbLzK{jK&Rr+x2EN>UDcY7PySVFJb71u%K@*qJU>G1kDB zAKTvLeY5-6#7_1*t}!DWszX&%6%rH!bHJ``;`?Jb>p0f7L6jXVsrh|sBC4C!pM{b_ zO3{H}4m#2$RL4^7!tT^unOLs{)HHRO+29;KV0P*|zJo_IkNJSjO*R2p`D1(e;`>v&HqwrwlHFP+%Fa&U+p6Qb{Yai*zs> z>b)V)T=7YH(GOvFm&j@=VD^cm0{Pt5Z9}-@V1tYM+skru_hWu6TXm8{*C7XOUWfCk z=B4lOG=B85jMgnliAbY{jNml>2#noPZP1r+KMUu?4MFZxxNzbAL0Z~0V9`BJyOfdz*j~Pq+%U7z8Ke9E`RR$42i4myy~h z(So6alky`oO!>mqq?SBCRfY9-hjLB&oJKy?eu?q~xIb>|IGR2hqwL<#Ni|VH3P6$~ zzZDy**rzHz+FLCw5*w2aL^3?PRb~`yI65?qJQ;ckOUlw0<768U`x7P6V%H|d{K!X- z%pz|~dq~cx6=^ymV@d*6j^o;2rpDBhGoty_5`FTsr44O)W_Sf&or(oDYoMD5TSD8w zXtF61fbS5gIJ6}i6IW3GtA~xwmFNgjUp5{!NAs^=X1Xjtwi^eiPk@;?KIIlRuyt|m z+4$tu@4)xfR*?Q)qN5Vn#3`~!V`|+Hd^{>5?x}<9`$MSQrTr~N1yhD2b(;}!lI4^S zIYa{~=x6tmo5G^a+x}zR2x+2?6=o(_Eb+E1@Q0)HS%YVm5zb^IZ={uL)+)42wt(;# zpYYLK{7K@X|jSey;MR(wOVK@bb7y5WnS?6qMjI zyIEgE8W1MFDm06@sZ@Z2(@lzPQ2tO3-J1mK7ejJCvfov-IXgEF>9tZ`gAOW6B4R(1 zqmt|Ui1pbz_YtyMXT}cAK`hEMWv<(n&XmQB@EWn_wr`?IEyFBAfN}!u-bU&_Wd|cjk zB#-L*k39x{^@{Fm=ZHZQs0^kEe%qB1u9P(;7*6C zoE)RMe8Hx6%+&driu#8N-58)+P?{9rTa-z3$Sh9z)y(@Z9&KZ{LzO8s;ahDEb+oH1 z1D&Nu@#JzQ?4NzEPjRpBKQJeDfA`lt@4&VjRp6|6A!@*S4M0|@EB|*VzMg8cq6BtU z#vw6%^^J56vJ)5_&HOllB)MPVEp3*0YFn(At3x{vWS*T8kUtS~S+~8sXl!wC)sZ1yD=>t-$5#KT<18OAzGPPyclP0xU21Y8xY38>Pfp`$HXvlyCH zpU}y^;OBv=v_JWS9AX9fN77-}5!@gFjil&Aq;t{*-|Jxeu&ICBNyWcpQJ>sfU=M$`fMI^hy>j(` zTPn(5e_Y8$W@u~c>8;_Q-sWr~kh=5aYTMQR_$kaF+v4 z=XJ)Hj$|Do<-_%1B~)o{x;|uI;LrL7GiyFlRC>)t=VawO0tp(Y2lkh(b?(5ZY%c^) z>gjN&@91s?>#EyO$zx;dJ^TxQP$2lFzP@ac|KM}ZQPIst&Vi=23ZVtl0fZ0^J22!F zD_CXLqZ3LTpRd5YMixwm;s}4+(VyG50?rJinBN5u#Ld%EUy;WZE6E@-(nyCnn{lMb zke%wTv_;;>(Rf5i#H?+^J5F^H*LsbYdJGWx51Ot18di}`ajGsGVWA1D-AyC(U@;Hq zYO9F0B?%f$1K|sa0A4d}Xo9McUcqE@?o{;d%zv^jY==Om5Y@#>vRSWWkHQ-kn5W zJWaqGqf}PzQFNgYB;R#kb_kn&d!rq?SI!4DyPcjVH}Y7cO{f_q^5^>?Cwn)hn*Rd1)HA*l{&D2q0@f&v}();hW1k^?VQx?3pQ zC15vpl7vZFP&={`X~3co{nlr}H%=7|jdI>srT~CS<|L8PAC3~>z76dodD)HZ%vo;r z*W-vL&kf=ix5e6MidY;Kz+RR4nn?$TdKG8NkTZBYl05D=@4C!6MjRg4HuFmTg|kC~ z-s36~PA;sCN?8ag9X@0cDkPzVkl>_#or9AO3BEJ4LPc8UW28f3n!f1V40ofobJ|eE2EG0wN<0h2kp~WlR10*=N1VKZvPV#Z zIZUwe(jIinf+!Jj1}zNgkUZG?LDw*2RNj95gx&rfJf53B-fEHh% zk)D1+9&j?M%0+9HdK(#08m*501R{H#639_9%+Zwf@>B!zuQ0~Ih+mGa4xF+CcwCAa zNwiuS2KQ*?ujX>*f8SV2k>i|{_~d@Au>&#NBS?k@oxe^tCX7Z=!qvvLoklEKk@|$n zHy0a4K%`+bM965wFeI>3jZ%aL)71uZT0I9|GnKin-<_>u|4kF~;JoJZ-@MIPuDq}~ z^Yxtc_SXH2*$4-SuAJTYZr?KVU00qmlvZviFT1XEp0?%h{NGrf?0wh*^6p_~knq7R z^Hfr<3%$lw+|iQqytbhx^or!jOF|u~$#0Uh-aw2G$a!T0s4rqAoc78oE1E6%cHTYC zT8(#ZAy!ByF2a_*uncr_8g3=4!v#j3k|b&{Rk?FrX!ZfuHj7IEv`89;Y1QpQ?{(BT z*Zd-f>H)L`x@ejR5CYh^ir-8eq?VNnEJJ6ojI zgmB;|^+fNGj>Lu%jb5o~(=?N$6?<7}U2#u**KMJx-6+a{7r$n9YEHAox&^uo0^6`Y z+>?F_w<_?=q))gpMZ`A4Z0bhd{)BpAtmofb%ra_QKB5ZQ-s4flcVRLOrxLkiR{LI9 z9azs5lzpVX)?}l?tVS7VxD&}$o)le|NqQ@Osso*E7 zSH;cTTGs|N+fvrax%w4!Acsi?T(-P-XD{Ryn-0%vywnYU8wz7U{*1=lV{ZSN-l&Rhz!xAXm_G9C2g4|&0ND;d<^w>)g)iP>@u#8Sz+W9ol;!-6RO-wJzUM0Dza*T`u#fJyxegmvU8PEg( zrgscWj*UJej$ce!iPT^479*((1M38@3xEa=`QXu7Mxm0Yk zIyLr+_O6zujBt_p1L~jPvOgk7=|Bu@s2(qXS3BY0Pl7}IBethC1P@o+ZZ=Oc)A5>O z7F8o(lPv^ekPb$|@HaU$`ldl#{`$M3%{!oe%nrke`dd?xF&!ruR}Jezv9Q6|wS9Zm zylV*v{)46@S&=>m(r zS<;qRS2>7D68}QS;RtM^_Z`X6Fm2=e_1>O8cY2fEz@D2xkK(0+;?aTpw}Z8ZmY0Xa zx&GDFf+P38?=)yZ*PQX220$*ZCt=-&;{xo-<9nc(J=q8v6y(57Tcb)XLkp)C;t!~! ziYw2fHT=7OUQCe0m>J4^NlYh7EeJE}K>)@?TJ8%Zr#t!l_(OBBt>wiV_|*T$IYcBX zUiz{F#Ux8pL^jF^twJvH)u_lY!;@A=J=P^uKVQ$ukbt9sMRPS0M!&;<&zr6@U5`(M z6GQX$d`_TYAT}%t{;7&yonXt{HrZOM&;j)Ln6rm8Fr{;ES)J`WeAh9t-9FQ)2RH0F z0Tcd#Bb;UekUl2b$gJU)D13KE$nFV-{FByn$g2@IE)pPdvOhqxQU2boI-SsulC7OK zoPjx@aRFJgh}ECqbTC|J2}DSa+u8y~YA#b^?ZbG-a%Jt#Q=)j&P%+}wdkIFpew$CA zM$89DG=_?F%6!9dZEB@Rn>~5YQ@{6A-vk6?|M~+Zm@M%|rD)qU1|- zX$PZzWzzOxCR}maI@>m6)_JRP2<(4Ft~IIGPbAl!Rpyu8DuC-qgU?^aD+V$8c{u4P zBe*w4=hM;Bl4&ma8fYik5)DicXn?32n^`SQ%UtU)V{5ZCqiD=4L#*I*Nr^(GB5P$n z169l84B&GF{xTx@Jy~x8OrVNq3Q=Yg_vWxo@RL~@{(iVOU^Y-uu(9UL3Wh20aTG&h zKVlWVFIh=goH5JNBjPAL4i4-P8cJlQjID_w5e)OD%fIPEHYar*9?XDQ5NwcIem_`#k!xiZW*ynim! zM&TmOLE7mLV&wknHg$>c{wJKH(uChBM5%i2v!+Ul*4x^!!w zF^tqk2BRiJgB6Nb3na6tNC6)`82F$v@lcJAa4x>Gzgnl97Z)%V2Q)32P>u%=ahB zX6o{?xL>Yq#_PMZ^`Lq!jaYxW+VQ`0AD(U=LVK0$T{shMsD8D-*o&E*zaAXx-YfERtQPACUUFO`eX{2MPy^q-pM+en*{W=-Cj7qR%U&OkU{Rhs zOTh1>=@aHH?Yr73Et1zsVuF%UJ}htfJjDaHb7*-mfP*#eO4`$PXV&7WgR|`va)K0c>~9%~pumP< ztEulQ-)2U0+A<8gQN&P>aOYLbR#isYvV2K7_o?ETcPs{{q*dN8oaj$mkebVn5%_Dl zuu9_c=6EcDy7L%9>11x(Im$fnSIisl7J*_9v8z;#%qM?&Op8oW(<|M8ql()c;Mq=J zng}QExPBzm;}P(Qc}%X!;6kfWC85v*eq{sdy-<(p`rcm?1f^7Ll)N?^=X#~&Kfctq zP8{a58;_l)X(%{a#tE9GV((2)^o1CH-D%pz=fMO_a4Z45OQ|(44lcn$9dLRG6e|uq zn{~?=Y4$ySlLvuq<6%p^ZweMbMo2DqusLbAKtuMiqjX;dE3rrEem_4m0oumk^u7w? z^n>IOq8Z8({-I3Vrd=>xhTX-kY`ovtw?f?7{iP4OBbC*jQ$ zPs@|DXNSN#cF}`9H_VOXycGY!fGoILUEAhUfhqyj}TC>`U|_e+gEcLkdh zzfu*OVGOJb4i2(ffvJF_3kD&J0Yrk()n)Uw*TA< zD*oG3ytciJ^TGwQ9`X>R z-8+rG<3@&^uU}xr@RM;qAq0OrZ3OdWkuaHRLW?k$&{6VFB0BLK(neRqaxh(_7JVY5 zxx`aidodjEtg0vJ@@sM$llN4rBYsb{UWB2I^fqQq(J_W+t?@Iy{F^sandMJB=43q{2L@83tbvleLEPNkm4pKTP073q5}t z#~wjTC>aEKYwRu33d>ls+mCA$8~U^+WP?FzK)w9U-)-aa-1)|ag)>;$Ox9)nkNb5% z9i(qdm2VSu?DOyoe6q@%%_b9)--_nBXyAnrL-)N*p96|ZTv2{e(q{6!#9rLR(h!ks zwT6N#{R{9ke(P)v;$KEETuVDOeg6Dz?YYCOVOkt49zM2K;zHYU5*Je{-PdRp&!bHI zTj1V)t>)-&osXs|e`a@;ILCpej>#XK!Wa026Z?=i99>gRa8rKbQG+lJss;uFjYdkb zj)dXn{;pH)g|mO^_QYf^r*?(ec)Fjn_vjPLZz#a>4J*l}KMVyfJ(^dI7*j8li*sVI>>+oGxevC39x#9#K(f(8v|pAo-ocWC|ZqJJDXH&{J}{|pCtrQ z+AHe7{A7IfSH7W;bIgdw_lN!5g9hj)?>yH!r64Kz$NtFbZSS5CTToEY#W7k;XY^R@ z1)Gctks8a4s7cE~bVt=D<>TPTx8ittSx{!+E4llEeqg;3WRy?hrY|OLC7j<%MF2A4 zz|sNlATUa1QulsUqPs{E33-$fYnkJja0lDs5+#l1e}OE4)`^l2V;iO>H_Xl2B;nE| zRQ6Yyv#z7QW?!x#OF_ZhpXCqiLIKn`&W~8LLd?-CCEcEB>|gh^9`;QQ!8wA`awB)Z z`sl|i4IvJcEmf~e_wVtEKPEjZ60BVLzjY7C%PI!q8rZ;)&mUT3Dt~?qcTzb>&R?OF5*#a$Vzv` z_Hfg+gB3wB!&Zmt=7?l%U@-(ghjHkwDQLBRp;Q&Hnd zSoI?Rz%?~S?z!~2MnTo#5H}S-^xgbLmTt?#{t`p^89s3|rNen7J79X~k$_TAZ_z9S zM&iipk{3^Ar$X*uq=C$q2cqtP31OtHfYg;(;ic1d_?<%hU;36=?2W|@3PW(#A}iR_ z*_d@V3vw!;_|XbE|-_G=rr-+kY>}jzKkal8w#U7ULi?fuoMIY}#Lml2BvKKkXSlDad~CL2HBeNT!)6AjIZfh~OLWrT0FHX1a{_rSH`BI!W$R z7B)SDRB7n{7t!+n^8JG(?W{&%@PjNaR%Iq&@NplE5bv12=)>XKgi@OJ1IIw_AseB5 z*0S^g*H6HtCS z7lrLl+F%0!w`QQOnC27Ugb6hcj!A$<-NgGGv<3 zhOzC?1MZI#q8_$NkgkfkgIW3>Dbqs4P%Gt>UJBqyl$6fLkva|)*~&km$Urosbix~H z*STg6Qh9@38Rqj(c=f#^8x_FfNtwsapKFLLA7+35jod&{bwicY4y5 zIHNthiwK07v?m8;og<;jL*(}1oP|w?VYzV1G7u{j)qQkDlzPVy!Iq6=fID#^fP53H zcnqYF+!Jjo!J%x3>;GeNs6>oV=bek~(tMGQQrxN~b!};rrqkHkzU_$L$$=F`2fycDb;utdvak@hjm|$@FJ#^BZk$xW0T^#q=GqQEB zw@v1HGr}j@Ft*_Qd>yQK`SD{{eZ9JFFL{a(#<5v(oR9SB?Y#H=6%)cg%KS3aw!hJz zlm$$FYL4<)AIKnbw3;ncbl$1RxBx~%87079bnoyF&?eRYeN0wrT7$m&OY;B*4}^P` z5M;4G4QZ@9bd2AhwDAN={U-S0Pyc$n#5i_;s!Rhq{D~vkTes~h-eH=_qjsBa| zij;osQ7<6BLoTX?1G<>62Ydkr==^8NVPg`6L@?}@1o$2F7Cje5(P8Jv&rCOzqOh#@ zwAuE$(uN@YIKrE^kNi8#1tf-0-5c;T!dxUdw{I%PS7jAl>V8|g+UtPSy+omUc1_WM z+~Ui`I&K6?YoO(pT9`6q_kwmUt@<01_(?p7#IBCb2byCt`YAsPaHQN%e|$^+pZ<2x?C7iz zEPjx;{KN%3=!V#)=XM^@tkWudQkj_;+yhf4~1`q9v+ zN(EB*R~bT0PlbCpsU!3XWKgn9A{N`Z8!{F6q{#)=O0fEavz8q_Dl?Qk%8Szd_Rq+VB5Lve}BLU&9O-k%5&ntHv^L zQBMW_cKH}7mOP`fLm4N6K*%w$So1qHqG=!m^@Allex$iHD-en+U?sDPK90OHbc@i< z^pfet4)f9rpVJrBi?wstV1u|9vrt^1>FI{P%y7+sT;&`vR=YY>IGk4aBCo2;T@Lyt;NnXZ^MScv zMrb0NQ^2ly#!ywSE{X`6*=VO@I0M0~=|gWNkvz;>MX{8CvTyR{d18M?9}m+*@3(qR zgKaYu8isyI9PE+hoXVtn^ja$kk!oIpu%&|+@qo4lzT{ZWvSq}S2tzIVvytUnlW!WJ zoahGYJb}c4h*Iv4fY7V2kzMZCk^hG|B0(0ZHMsU&FMiJk-c22A5QQDe+DJH>+zJKE zZ~8Z~X>0oC2iO#f-t1JljqIt+Hr}_1ihT`F+a12{7GzxRN(DT%a(mbuvRL2kglZrC z?EY*=chJTHA&9hpM!9zL5*NxpbfM&c7IUXRmwwROc6G9x{bzvZTf&DyifZ>{=IMG1qa+R1DAxI&r0_$&#V%XIA+Au6G3X5nqyK z&HNvj`<8gx|4@^MLK9qoDQaW9mz6E6fyby?!>p5afHWbj>+0NK*ybjqEl5u2Lnw@M zVF+cAtsdP5ur^30dYWfbLY~J*zDtM(Kvlz^6Ci|L^;{mDZHRV$`T(HBtyfz{!BGk_ zM#5s&W99$K!CMO8|C9`9#DW8)U3pv%XO)pyR}X$YQ^4GER>)Yofx`?@RkQc^2W@Qa zh4!O?lDg;{yZ#}SYlbxT5wE+(33?3)G!WDs!b1*8WmW1|@P4G2k27v_d`Ss;PQ(>CZvvVSNy2Fip3;BlmrKCszQL4JPv5=| zTh;qcY`Ct0mXuls#gxYJTDeq6ft1U2sFe_J_q$BkhH+InXteR%M1hb0Jnt7Y*_`J2 zW|~M*iM$#S(-=xQGGy!Tglu?*IKl0D79s|^PSP)xcGZ#qaeF>2@iTzE(Ie;k*A}4v zGXUS3ryyONVvhnWkZJwWf-GPxq%~h?luMR&(D}7E{U)p%{qe*ty+A>XA5hmx)_ibw z;5yy)7?x;-qn#3KAO#jknw*z|Q)wPtf7k47$IK#%jf`mQmv71Ga~sdt`6Tc!%yH-C za4LVp^1Dx@%il*X*yF)>8IfqvzN@m>{nh$LvEvXun}88Odf-5g=6R7Y=RqQM;Od~V zq3`5+(XV76z(Sf2$|~GcPpRCDM+Gy$Tbf`WJXAR)qI- z##Tc}*qjgDWg26DKPIrhSe(&GJw25=vp_)H{7F?rTAogR9o*tHLQWvI)EW5{SKeV-01it`1H z%3B_`&Vq-tV7~&f*=O|xI&HC?;KdCV0Rl>GhQ?AL>vKx)%zSkn|1Tl74Fz1WLu77f zhRWLI4Uv~YqpF*1 zBA_hZVjnwO`F5?f#mj@E2UjilBsoRTOM4xDTXIcTcuDtfw%5WtHmRkV^2K;V z(3J>CxRHxNW>BM33>m+uRwlX2GzCPj%Mqh!!?8gIayj0I$8=$JP-6dy7 z9F2yqkk=2Fn`-bRW~RcL&W*=Ll&M!;-Ku_A*N+(ABq~!x!<^0tknXP0&Y)GY?(3bx zmyXeO?yw4YUw2SH66ugVtV%pKT|RA)qAdm10)KyPIQ>nTnJQUVFQb))Fd)KGCF>-R z>4M8*yegz{83j~Sn;Vu{dLCT#kjs!N-nLQG9-2bV$~;?4-~=2mEGx=7x7%Z<@MuE{9> zpOQ8kDZk($z2NYdrrYB8`AU>8WEPUp^D#{Dl9va+Pk>G__j?@^J&#^>Dm3+v4=ET6Qh|{4DsKyZTk2*QL zaRg)gkqY7d12v||hoeej^Qi4J4*}178|yNPPcrR+&*Z#|ULZaxPfn&7y9I*B+=k6w z94yg*pKWqOEF17Qw8urz$C)nfG4SkC*WHa-(s|;7OT*F#LV&2VPsJAGP+7-WeFgE- z$9H$_8?+jC_8#X-$U`0|Aj8_>%q>=w2{zLGS!jK-7?^Kv%6nAHoh`kZwtv_!c+D8r zB+gzmHh>h$|2y!nIWtB4nA?j_E3I#!7e{*U5ILT3D*3VJl4YPFQCLFnRLJpiI0xQOI+**{MygrxpE5&}Qtt;3Bxh?u zY{@gx(sKT>CD@yq1_KzeT#h+<AE_J%drMo`9TxmW^y+HAE z?*06`;e+StKhDdrQgPQ4pRpV+H~^8SBe8o1`xddy&2zRAB=-LJM|VECJZ5l{34E2D z4(BrFw$9~SS0la`Xkl%4yVq(OTbG$NdH(!Oi^r>P>E~e!Lu1RhQhf|6ESR40=~Bb`DvcPakQ}=7O0PV+0jS(z*$u~;f z00i*;!M+szePgXI_ALW2tO~I;J#v*l#dUQrJx@xUvPp-d*1x71Q-D#|_i6Ril{E_2 ztngrIBB(F24o*e#y1AGE|C0p*tO`j35t)^HN%q-%=0+@%z1H3wDfqfC+x*YJv4k%yK3{&OrPVS zoBnZNoY$(wBrXQ`EGXl5b}0JC{+WKHA4rV&~00 z_qFp0y$CH?ev zZaOQio=8}UNTnc0C_Srue(PmL_!<;a5G<1D^OrfO%M#Jtxft%h3aB>Yj zVs*8`CEb>=lXG3Ce)o&Nv!$&amR>vIsHZ47ScVfp5I}IhVWBu@X3|%G<@ImSk?y+} zN=D#MZ9fN!@xj*~ty2w;cNmMU_^Lp%r`HkFk+5bx&a-oTqF?c^H}sZXL4Do)(as|- zGaOVT&UvWGjLs!rskWS{mA~J0v%CwMTjg^=68MGBFm$Ru%G2|<5b@EB~)2X8{?**KgWDYdSwv%rp=xN zk+e{B;F~O1*-am5H{%u)mEr&OxmDy;;hGB(K+IV$7#OwO@-VANE?4AKe|+ zd=;B47cW|4rgv~b3|rI+@K-?eMKI-r@7~h+MmE@998)O>1Y(Vjy;677QmH1pmPkA? z(DNi$P&;UFjaD#{MDra30w1N-nr8PhOk0~X9q=>ZDE38^aZc@>jbUiXwh0>iL&z@Y%&nFl{;w#3 zK5tLc)rPgviKJzJeob9YHn7fgo{NH_$pO{2 z^~jmpt8U(gGsncAx+Cg-XTn|Eyr%gYUbW1zapyf8ReD9}SJdvNJATGHiiKj+6p)4qnjDto^l~`DBebvd7kc|&DfqqYy(r#`_P+jy z`;Ui_p+7@kUH`6Z<;SgF>P>focyK+pf3wPFd6R}bPlaeAVzD_QPKYv+RuB_Yxsw26fNg>ixI#2~6GQU^j z^k8=|^f6-=hIq)438OSgRIpf&s!eImJObQuUkHLA!LX?>(i_NsV~iS2vH#{P5pwQr zED^pXcV{P1m6wGAH%#D!17|6(xrxHW1kvwlab;pR$_8e@axt~xH;HP zw-AmRFmPPO-Oex(#Qy86pPKUyh6zM~wC(aBM1g|W_omVL4ASS^1k4hdj~NxcZv~?H z3?IYAIGexcC$L{Y7Ex^XLOff++BOQp7L{lkWkIRw)H*-dm3y%y85V+d5;5tebFB~X zK5eOJc#Kz)Yf+((= z)zJPeZGCat$14A!YTUXAR<{9GdoaA!m7hQ)!CRlXeD|3#&}2G};RcE&+xWO4JXxMp zWqhW;wcT8v6J^ta#Wx=5=?GlyLGcU_h>z39x^B%8EVmEUN}JNF%a<#!ai_YlM}w-n zEN$u=EG$B{utBn8+pyBWYflZz180ubwhfsdX50fy-!&Jeza6T{ROFn$Y#Y%j`_my) zsX$~yXyh)HUQjXJ6(uHLbap-_2!d;& z$jtr)lk0GA2^_+zR^2A+IhKC>Q1jf-I$BfvXmsAZ<&0DPKHxL&y#RYR)e`f|v7L9m`;QwOk9oxhB;v=#2|<7j_IJaFr}i){2E z@SRXHBpDSmdzOWps=@yS9w6XwE2O7DY#nDgssNDec!mFlM}wEI)CY=^jVJG9 z*|W)$sG5b=m}3+>o+eh8Vm*iKWathXG81&CZq-$Z-GnQ=^Hc%y6Ys&op`saWrTn}g z_sFYBn(^Omcx&<&?c{v?77S$_CpM5(iut88N~n&SaASjOCsJwOW`BL2%ke`8Swt^0 zhsL?As3IiV&ma%t(xvLy4asrSJvE`fLDRt!Fmvs;MoJ_i=L&!;E9#9FZsGZDa5e~d zxUe`x*Qz6R_Xh%VGi+l-0(`77tGU@JTRT*F1+O5SP96T7-5R8_jL#Cq7j0JbueD&9E#c{Hr(r#zXCzUYY{CDfuQoqljtQ8xq}ZyCS+XPoc2;}rgDi2kp>UP_Wo znWjp)LW(hh%5uSWIzQQxP!c13KyV(JbWPLn=O^$wDL?E*B(^VtyEEiAwZX?vxb>R3 zAU>zF^OS~C=+w(Av24^r+~H>H-1MymX3HRy==F!rRR2EP2KScEj$W32+tX>V3n5(? zDKC!3uA;&7^g?4CS|c>rJ%QohtH}pYAuOoUcWKuR8t{(8UoS@A76};m13^L_ zBWd8zA5+1%=z4W4$xq~v)PaN=iTQ9Y_WDxc{P7INwkvPun?L4%oa$F)83)Ela0h(M z2_z6c38(xi^Se=*2C`&3*|7ioFbwXf+87J$Qg)@TGPy<5L#Cw}>3d{{LU^aRWqXfI zuZ6@LKmT-Ln?^e{XMj2X9kShExJft+kw62$rId=Lx7>lAZ3){_YE-r*m%69~K}imS z2qyi@bIz2|ELos2W4A*o#H;DMIMt;~c6q*1K0qlg5NcZoUu>RipJzmM{7{V_|0sQDb2 z{x+RQde^3$!8VhwYRWd2&TLg-_>Uu??mh!W5i`c7ERW!LXL0M}eqVhiF_0&KxHlJ}U{L z)}aAnM`tQob47lnn^J+k?&fJlRY?QL9na`eYOu(?)AJc+)@ELazfztX5&Ze$*GN;{ z;vJ-xm**?5TaPgn630a?g;%tx(OKqK6Ow``Q(sYx{R_Tym+U&-HAQpsu^v3M>(0~s z0kwCFmS;90Y$$-j8O&veK$){UDl87d<>kc>H!l7rUwUm>ilj@6a971ku7C;{X?~`MY zG-0@8BRD~A(KN|6V|yNf`}&kDR|_;}9LD=G2V@4#mAj<&)8f795piJ}RwCi~dsQb8 z96sot5DK-gkt929S|;YDGb-H91v=GcY%{+myN9%IaZqt#jndf^y%|8+X-afxQ~Y8T zgJe8YszLPfF#B;m^(Q}WLew9!U}}6M1JW%oq{A$$+XvnBuWNWv>e_F6(&SW1PE9|A z^mN_x`maz;!eMfs4=vMGA|Kx>yb;?MtvWSSE^5ks$1rWQSwjQu`t!#5$<`+Wc zWzz>w= z3k`&>Ap{jaoG`0$sNWj-SJW_Cd`#RN8?kb$0&E8QECo-^bm*t``dtt!>uB4Tpj(QQ zVOmnk^gMxvno3A>@Wj%bpEB#%rjlgT2L-}A)8%t8?IQ8{_ws!^_PwPz zE@tMb#yx2?3IP6xiUix@g^AQYwKb5lzPXC1bZs2&(O#UU#F3Xv5lq*GUDE0qF+kH} znW{?c`}HrIl2dKs?179PG+*0b?fJ|edBBcax6Aw{VC`sFv#xpq?szlj>@tUz51puu zPlhfU_rcPY`v_lQ^p}cTkn@@)V-;ms`#9FrfIv;H3y=jNq-=^EW|gvNmw)zM5UNdE z_5-ClN2_nvl2@w5IJMXK@`2aIpgr{WX%nMKhLNmeV_#p@15L;1^m_@WXS=YQMr0D&a2an z;;m8CeT37TD)3eNEed)ce(4u@<_|FGA3D)t47*EXtBh?HFZyeTU-t0JF)fRt5RvH7R`jHaw!a8|Ls1CI zgRUX^5ajai^@czjm+bZ2tALoURhV>oz)wkk3NDJ-qCzv^i{>SDD~j8H69q&z?U2&r zWjsUKa-Wneg?+nzE*RHk>;-%Kko@s|+V~mhy_i&U^T%j}O30#DMzK)?xmWIxDhx44 zT>Xxa>LlPQcgsPvz=)lx>4jq#*f@_L>~ z-=wPkF@rxeeXzkWW|qw;LL49pEfX%sUtexm@eb#Eq(~zwBH9GPihmV0z&@m9>B%_| zH8DR9jp79Qd#;D;`BI2LSG?bFg}84liL{p}@Mho6?DkLp03;_O}%2QG-CDSAo@y+-|G)vH**QvM4HSXuxTc>!XN_c-oRP4~FF_ z!9LjS2&z;Y6HSN~Fi1tj&fk}Dj$Z%kv^IW7 z-G`9#`tvA~sr54&lf4G}t%o5xh6(PgWg84UzW(3$?u^_X7RU)fCRfd-k!YWqOY-5S zt&8W=-^{F5kN6GJr36~+Z+vA;$rJQ&Bnd-r8Lgut&Y(qRwTtD_M|BD0#Gf=Q zHk`3hw$g%od4jmz5YLZ;V`WgXk6m*B(Mv3fEH=gFj;vzQqc59-D)d^n3>-KmQD$L% z*6LvXi-=v0%Nar$rboPxy^t?;aVyw}1sHLT4a!oH+*AGgIy$TVztJ$Fd3G}6;3%Q` zO4g#hU?$KNZQTGm{UM|JJt@b`|N0Iq;l>pXaHg^flkdEbIi&lis__^(soxAWKw*-&U{+r(gIH6PxK+S#B4;)(4Bk7+L1ev?uvbGg=k8(-`SuuEDV5Aue!-4NN zOY^tV5LEOY`=T1s9oi*H7IAY<)p&c5mQ$J8-;;VROIY^~5-Eua*696rwi`kYTIM3l z*{uDOaE8vNqoJ!=wKnOODo*!1(YpJnMa!cm^zdRw{p!kr<%(SOc3uo`%#E-PWV}By zDay!-G+Ms~ZNQ4e`R?Hnq>0h8jB~t8@D9jL|L(qD$8iN0DrkVUmAi&Of+xbG{ye6r z$)AD0PN=iM*ZCWjfVQ)oQjT?i%Q|h-EH4;xq}Wz_)i|)^Sb$^fDOZ;5YFLynk$Qq}hH|=9N zcT{=vgehR%&shI*j6oH`#IzOK^>uH2C?&1^NUvB<43f>vaAfrqE^Z{uM{39z`>exv zoYi&{a(MjZZ1|)1}xty&fV<(Kqli-`%YubMLKgQ6+cAjtHefF_{HGcjQ zN%QqCBi?N#_zoE45Jde$M#zu*WS_`vQO!N=5e~7RiNYvNMF%0odT)OK%}?{ml%xxp zZ*nM|8Sre!rLCG7G!~>Y{g}&GsoVt+Kf`}vo))|MituUk&4kAPvYz^`(ueestnz=$ zO2pEkHp7cwaXr`i_>dp~a+P&jup2tc=rQ5OT90nWy_N`=*aoRQjqS}Y@H^)NJdu!Rakx$q)?C|$mf8Sxi_?K}%!jAJu?Ta*A zT`$oT9Yi^qW8NHCDo8A{$uDO-FO%w+=mW%0@pp)WinqYLVxOX1k6^@#WaK%eqG97a zj>-zxbqrpaZ`n;E@Sf^%=eM7S)#_4!JR6v zZb{$fx2~*|!4S~}3NP#G?jMIM0h4i;oF2_`@BpwKd^QAX(BMb1|l*I0Xuu{3Z;;^V$bZf`06MF z^-sMQC0{2k@w^&|QoZfISC?>>dW}WqHyfySCs875T*e%pnHVS!9>Q=P6Lf}APMP-~ zoFbc@7Xt=qV6Eb(BGEE07;RUImP=lxTUs|W!Xf)pX`orEf-R*`g+Sm+z0{|}6Yn`v zxvEu$QAszp8xO(@0K^fMevy+Fc3T%?s%B@O!Ln6)Bfb(|ov*ac%gDI1jd0qqt}S^s zs5lz+p@oVXP`k-P;iYug7V~mc&yUhEyUQy{AtxkX=YP-3iNwEz68pt>9q?2N7|8ks zM(Akk$+?$yfx~DPAZ@bLaeJB6ITJ6D>$6DMCT=a44R;&5yl7mCCdvac)10d8pJL^| zuhpp?n`3yV%!yi2R1rt8L&2M63u4NL1(Zr228>EjBA$e1(TmEP2^P|*Gf5U~e>l)Y z59j{?7Dy(D)#7fL2PcZseqf-bN$5?Aj)uDkTFp}LD2m9*Xec>S3FcB<1L-KA_}&!A zDz-KczFq@}wCCy(f~DvP}QwPmMg6+w8I;jmlubGI&!Tlo0SEW9M-kGGA0 z1^W3?uu;dIp{mIn+LZ0AH3SIrq|)Qq38h0fp-0^fN|7A3)Vrmfnq(j0q38q#b=LX& zPk%-_c!^(`O|v{H?2Hb7pCrEcGXc9i>t4XOWMw4#sOfGEvYn_h=#RpLC(M zYD)UzLGUURR73lHN)dss;gTDZpaSuCcd{6qH?0yX-4v^jutgWDEMV-oX)vt?x@<`X znLspR9XSRnNF1U|4aOG1bhStzm&l@C`kmw-OlabpZrtwS;?6INy6L2*E4d|Le?I;w zBVgH;c|UF$D$w9Bk}5@ad9h4w;#{zX7q!)+g&5o<%#| zWtf>^(;l<6zGa2h;7ZX>UK)3(LiQa`hDC3upm5CwzoTRS_niEU!F6Yl2ldsCRW;G3 z`c4z!u0z!@a>o9L2PQGR`Rh+PQJ#x=jAyp_x|w;pR*NL9$%@YioHS6KMV;+oF>a2R z1d|*wK{A%Qxs}!YY`=qYvY7dCfcbqAb0GwWb%$4V3d?jN@MGduCQl`TGHui|44f1g zUl{Es5s4&qIz=$C$-{$jOdPB9-U3^xBBg7U<4YJwI1?G}`y*T3FnpqWY$#mLW9FP_ z9yRaMRn2EN93J=skQgWt-MySY3BR8I^MGO^Fekvn3s2vD{L`n%A3J8S`{|WT(2?2Y zVQ?O8#K+gvyHw#^!zOm;3qUwoW3P}US!lhGSX~ZoO4|mpA$^XK%y$naG)#sztQ$tU zwi2xNy2T?8>d^~h_{GjBe+I1^+V$|r8Ce$iK)1=4AA+C+a`D25$sX}rlU|_*uClp~ zf}G(<@)6_qL*3gWmINBIZv){jUfs6Z@7f<9e2)A{eZH?E5$y#PyrJ#tLuSj<`MEo! z$)b*OZ7}c&#PvY6mC;Aj?0&GrrokN_t!zlpHfD3zn~1Fx$IBG#KB%j33Q_-kq`%*+ zo4#FQDk-r8=-Fi7zWwqdHjD&BFx^+mozEO~S-v|#&G!_>6_3s4JpUw+9r86r9Aw-G zEnO86?38?WM)QI7u`r8oDdBw0r^`~x>^f!L3XNsG+Cb4C(uUr5KNL(l`~g*?F?)hs zu8g7~-7L$fpZ;43$r{B$AW4s#EfO>tu`z?K?Vhp{Xg*^YodF@Te-D$J`J)fu^K>@8Tt$^P<=?K=KSZRKDff-GhHg76h6cA^SrQqARh$ zsdXUft5aYkfnz$Yfs?CI0~N!r-HC^sLI7^V-br?i$?d?uq9zhBLDp-5uc)AI>+Rr_ z`705AY%rHd5w<;HF0PR%r$A^#EmBgb7G0CP;-9uq2P$`ypiDu&RfaVZF07!T1zW9U zc8(@FnnFNMhNeif8T~#U;_y7_n)wUcOW1=JU^1xT7vgbuK#Xs=oPBL zz{?0o@}2t`gcnx~@-ShO`{CyxXADWM%{iPFis`jhE_3|IvOF*HdGP%e^fBW@lT4%x z&=i>k$4>7IN$=Pg6t1t54l>M8YlYU#aPBmZH37xIc}7g;_EoN|q`0RpRf1Ki^+68b zAwj@Rjdj}|K=nlm^dX7eEG^wsinp*N(gYEis_DtUmK7m3Jq5x9C__WlDUkj?SuvI* z6@6M1RYH1YbTpB`l*y5V83B+*`9U6{5XtVL zr3oB%gPC?CM}DEA@E*f?3Y!r*s>hq>XSQ=a=_bmtq;sq?hk<8DzPv0DAnGB6Z_ll9Kj;caUk?P$cJ{_soJKzLBgx!60)#ktP z+J-n8qeugOiXtP$i#uYoschg|lls>Lp#JRgWB=oZ+u>M?VPgc{7}(MfeB1;CX?0q-9QfN^ zDMu|8qMyVv1Z#UlphpM5i}ZV=hQNJDLZA2T+5IK^M-K*B;oMfwV4Bo(NgN*{9qj=W zRrJ9uxvQAGhbKz4|37jv_8JjP+7%(($kvwlP*RXH!N9?S83@f$8xrV;xt80sCp{i7 z0poaZ3&uZT7WrWpSD?kbMnMr`RWvhVDu8dzS>c#4{%NVX;k6Ez_Pno(M6eD&Hv-P%mm-R6+ zRiLH+Vt?+ybBnP)yz2>PH!79sOH@K%{#LybrCDfUmZGYaMySf3Sk2i+ax<+1kPOEk|F~A&)2|^~ca(?5 ziX;Lk)^vei%TUa!?UeaL24frudYjBPy?-fd8 z>JY-`s@E-d(TsOg@({%Tkjy`yFMOlOhqz%zW-8E@Edn--do4+SzL+`Po8d9j!~W>6 zWmz!cS^72v45S)xKbLy)iO{&jsRS0Z7W`r)TXAu95{Vn8CPbrCdv-BBg>~vbK_Hb8 zuG3!}!@r>q+Z5=4{mVLu=lQ&u)6){&hHgtdIr=T~i3d9_+GF^oUJaqiz*@$YQ`EIJ zVh*CL7rN5WtnC<{d*N@|Q%i0Jlp+I+i~fO@j0N`vpz^!?{9+JxU4l%_kLY+~J8v8d zm6#+)mPFGU)juq_z7C4=2a=u| zMsj`!@K3gb5v&Pb%w_V`w);0*)P;ybCUpKCni_)nl?oRUyD#V(f&-QgjW7jAQ8YKT+Qm7^+afth{V;pTVfPV*DygGcsW&D?Nh)>XsKU#r3FjIA_L$k%9pxRR?ZDOHVx$uLrG| zovF2E#0f^u2!g(GxIzXz_Z{xBhx~E5W%|2RW#5BJl;QXtGS^u@enaOrX_xb?NTUp@0d$2Qvz30SggWZGw8*cN@qtdW`vXD8XiDlN!bu7|`uZTC zK@5A`?|3>j%TGD;b>--iapXyX&gF>ar-zf3HjF8!n8_e)E7NzJJwNK`IrPH&G2sK$ zXR;!26x+=L!)}2ig!RzjPN(;tSMCS`T|$>>&M$Vw}fLi`erj$6+hLiiAc(m65J zws0F%TP-A`CfjY)UrjL|Vsf9GgwJ}wWp0i`CaU136<>=CHCeVHf)#y0Zvn^KcdQ2v z!s?pp#}=Kx4~KsRF&t-^dGMtj)l9^dRK6u~%{+YeD$&{}`D*H7@D-KM@HK5ny86%F zP%&v~HDCb`0W_x%yy+>6ae=?G{z3`L&j>If$K1lg*~urXH3zUdWEF(eT&CIrb{>(A zSO`Lpc9a$Rc)z^7g?h!8WNodNPD*M1Nyw9@d6cr_FpZDzz~5beC8`cdmvMC=xO1_u zbZW#jc;1hGrL%ZFifG}*V1jdc)m{{h)iSo8u}P_9gG9Dk+d5n9xCBU2t+X*aX>Wwf z{{fdR9{w?F5KOc78HD{5(c@VTSn{~87%C2LXBIxNmv+Idq-YQ@b42t+GR6Hvq2N@- z^`fgPy2ma0x$z$?5t!1Cha#krP20wrKjybL4w&>0d{&H0(`%}fYx9=fxB~QL<*Ks# z{@y4%wzh8#>DE*?h=nLZvl4^WQYMF$Wt6)>*3VV8ppa4zM=AEqNn`_)cW*H@N2bt* z6&@%Fw`$X7D2fkt*tEUycB|>AYOT!G7MCYf)gX1zO?=Xe;xQOUOXC{U}1yc10g=1C+L-bq5R1G$% z$`5y)Xrlhav-l;pdz=I~{?eIK@fd1fw9$>}=3{FLGc7pHaVU|_O)~M9gAClyiEXjV z#drFh$)oy)!)gu8puD}eK3D~c z4oBqAA$`C)f9fiHUCMoR?~lNcv`NCru+UJV^hJG0BEpemBrPs;9ZoZRi3YB=Y~Vy8 z!AkPw7U|CU9PN=^D9V)hJT<^*ldcxqY#N+z zRh=^~J^`}pQI)*5h^qWs=DGJ`h&2K+g1KZh0}qRAzQfV$rNWXrhop&Z8^UJZlk+d# z5YyIF26cY*o`SvJ>`NdPj~d8eRwcXU;yj^#wk@35i|90#yAybSOOBP3`9GGoXAGyK zykLwk%Ug5x4khf4(Dx4TQP%Y4UiPwQMfH_Wz&3M(UXPbE6+Y2z^D(_4vg;T-kxZ)* zyzEvDM*m4p!Io{xvAB+O>5GJPA)+4gGU^@iQ_7J^Al|)W8>x-tU-FE%+~n4Z(5K-U zZ8!U+NnLSP-8OW2ZUHRai38{4hrM@RJ&V3MU$=8iF{N4Z>~f#r2_7%DRIK#et-0G* zo_K{LFz-dNS^Aq+B(CIxVK+ZTOg^$W(jnx(pGACRlSuI_VSE0xm-cUiM>ua>ug)?PgPf1=X$p!RqQeAYeBWTc{sl zky*jgCt<8Ir$pcPj#E8wp)`<_jsP~Z@t-~k)*LaXcSA3X2bhs_CGD>l{Mr23dy(r7 zMp4Qn$h>9XUz|%duF+i);EXXLZ(J$}+4o1iCX>Ma*pYG6^~}G}vpu*^f-6f)gLlfgJV^28_!0h+wX#KSb>lKh*^5*-HRHUMo)1~MV+$YlTc>lgwglLQ?F0!?2Sd3fo$OPcoo2hDa0}T|cXO`BhZ3@0 z!Gi$ib252Wm2+8r7K@yMgeg;7EwBdiZsFJ>N{rQ7%XL=(tLk|qJdhSgqPlo)JTHY%aLUEo7KI9*>3=-X~Pp9KMbE*sF{rnvWAECIag|>*%T_1>`cxuD>ldi`1s-LEtGR`yl}9LKGP305ZG(G5$`Azo1hRZ6^4291M|z{C{Y!R71owikNI?jHRbx6}0&a-RHR5 z+I?HRx^h1T5mmVj>FQF7j@PB>sbuHqQ0@O)9b>Plnu6J_+*Ec2ga3JG&TY@a@qTza~c*a(r`Vr^cR7oBta=j}$y z?s|~aC9sk}ZnRNZD@P=#Gb?l~uTV)YTn1>X07FTEqc`2*aVC6yfA4A315zSfyohBQ z`UuDLfvn+Mpo%~u8W)(@P~5ugvpQ8FvqX-%B@tn_H~&5(gg?~7W6Yl=R;Zvqt@*zk z_Y7CGzMk&I^RS$xEoY^=Y>~L49Yryt9+COCEolfa=oT2sav#$S3TcdkDeF&^tY(2H21n z#JUjUxbx%Xo9B*mEtEJ(%7CprAM#lu4NEF?O|`% z*NXsk*x%Q03WR<9sZa6RX;$%a+j;;jb*g7DhicQZD-=;$kRgNW49wHnebi_vN)wm4 zXdpTFyZ_edepDbKYPpnz!J1*<1QX5nd@c4oMULT{rKgTChxh{$Bm{Pzi@$(U+$+Mb zR|q&rUQ$qk2POyA*k(l8gyp9w(_B4X@U<^9xOo{adxnNB7Pbv?@pVFr>~#*L5ryU= z0b~rg3+7@>O4A=1nO<4D1yu%P*magp{Pp`N)}+&%;A!9GXou}$q3#*xF{!H)E(o;c z21%gS@MI&LAaezYciYX+90 z&z(NyJz#9YGo-Yw>OVJp|G=0Z(|3ODy8qwg8XXr^BhR>&6? zKgNWtRqj8SxyfPw?-5}2-q2HuPB+`@f@^kR|Ij3!Qy!Y^FK8TXa;_+ZWwsw)mX}ZH zKk{L4G{N2$XD*pT(k>E05om@O7pF^=IYO&#X>5b zC2GKu=GVx^VaEs_9h-b##VLfVICFk%?C@>yQ!UhWPz8eI{+-}UugmVr1=-Fx0>y4K zoq3D`4;>jJ^`%y@4q+s{sceoqHGYM#eU&2{OkNKxY4w#u`zuzjgu_PiMf$$e_3s<2 zo6e2K?kV0@sHsWj;-h+stBl}Qu!-oFDl|rS-)9+Zt~y(7;tlqP%@L%2lQtVo+(V?I zpEfe2O#d;{Q3|Ke|It!GtyOGlqCnh>Lc9_y&YoH8j#J1m*L7_J-76c-)#uNk2xlSL z7{8)o{TWI^uQNx2?5fz&Smh>q(eqyFW25w(n`0zx+20Sv!wc z`1&SB2?a!OI@=B;F9FZ!Zw)twmj{q6yg;nI7g*TS+A)o*p4g8ZLQM=uMs#X0ebC1u zrte7q=G~JZS;FJI8}9f@tkOZ72z8`8DnMop%0=}E!uxvNk8-D3FG~q z7CVH5ID7)9x&SQI*9@apt&w@6&0R_7&yun&V>o zbCZ<(D`L633i%hQS$31pZK_kr_uYzFftMkGu^2V1rqLwNce(<6{z{DTic{B5+8lcC zpKe=PVZ+v-@e@tJ(SD>piRZQBTaE(pyzJFAK9vu>(nm$yXVg|0xg>Ysb*k7K3@Y(` z&#f}V-nl;EN0=c99>>iVp%?(pA-j*OfYX+do5?y)4>|D=4P6$$fmR1`tQIk}fS(bt zYtJ945^@D{rz6S{)lWHUCL!ELwh*rfh4v;};&=Qt7ry5OODkT7Z6@AOL~z8Lv#ZF4 z{0tcp_AXG4tw{+R*f)_vgzn9LRIMaY!-x5jt|srJt#8%YThP7(*F)a2;}SfOq4 z6B{IMO&tf~kh2FC%z;;0NC#2o1T4=H1I>qlDW(Ub*(iGw*wEDUQ#tZ)W=xZerXlRu z2hDA%pT$J#z9pfLQlse?a&;!2TIM(vImwsc1(B~pAPL{tVV2CtbFGQnQ(30fag3Rz z*q*X=D$&r(t)*{JX&EmDTB ze2jx_c0JWTw#Exnc<+#vX1Y(an6ITwD8tg{1y?aGKI^|Gcl+)2>BKMA<@Gc%X3p{K z#-C~jt7#KGT*a=e_hMom` z`p3zs^G7=@H=uE{-MwKpc!T@${O(*+JM8bIwozwYRJ)3FTRCDmv`Za<_~d#zYzJ4L zhlmJDc|Dhj?*i-ufdT!t7(d-W`CNodOX0X>MQ)0EmhW!|1eQ4237;Wzh^DicSZ@Dz z_3xW|#tqFLn#!#sl1+KdRVs`KhjfzXK-)EfJ%K;F!F`MUc$f2p&W!XK-vj=(K zd5c*#xUCD;U21sClGD|gs^ECEg4Y?o8?UxrV0%lvJGPDySM#UZpJZCo`V;Wv!s<1% z`1_AWzC~7*QJZEenKRp_2z#p~Hvd&E3(itDLkeR!ljTySQwj7c*F9`;(Gxz9N^1lV z_r?-_X&}d$L<5kA2}4v{Q8kaws?AK{I?=O!qdhwW8&B}+!ZtIVI-yr`aGJxny5w<* z;rmL{{TE`SWj-lZbSNdEiO?PFB~~=L(F%MfVJO46?$!>Cxo{h*V*f|*4PBa)q#mZI z)U2| zg=9pS;D;{X(G62=QvVr{{0Yx5MRSJV80Zh2Y4Xsnvyw?{<1pFU=r~@`@f^M+^p&Cn zmMk)p>diYQq4{>s;A@`Z;;KX5>tH=YlNyCI1u*<0$EFu$LhyW8HclzPIl;kYuX zz>)b5_gxx)R9@_0{_5;KF+S918XPw+f+eN{W0xW^-)drT-@=l$@vXGPY=mMW4$$;= z70NJ=i1R}*t_5EJEbglWX_A}VAj8;zv7f2-%3z5~EDtaCFhO1XdENfa%#I@aPaA9m|<|q#t1A7W1DQA6<8qLKZbj>l~G@E@mMWH+O}BK&(8MdQ6vQG@%sGyvBK?Wi{3yKf9EE7RzQTt5>cK|;nj|Nx1H^*)yIWyps z0(u*IKb^KEbd*6 z>nf@76bq6;)Um8z%G=nz5NJ%L1}WEYyab6!Rnw9-ZEOdZj0*c4<+AqWY?Z*nU7hLc z1S3Jxy@-&7+%INz6cxYfWF1Cut`{%St3U`1MKE?Vii=@REvW-kG!ME0YZe}}@-0CS z2F`La^H@T}RO)Ad@+41mmDL0D4GJdSAs&p2g5=N}gY&o3cN;30e&HLM*eD(ih;9Za zz^vI92+;#6B_Vvi+|e zZlSYg+F6JzvVy}_@%LJ_6NM828ZpAA1j*k5|8>20X&UcAdNIAOSq2!1J!CYB2momW z<2~Y*atIDs;$8{hv|`9=GB1V{m~V@vAJXl>$YX$j3SBolBtjkU=kv_GxQU_j*Le5QqJa?U1QuXgMm zk7sk}n5yZvhQ<+Qw1-omC~ZVq&c1l*z**a88D9a6N;e6!46YRrQXFz{?eW{kxLiug zKTitWhgUART@H;rox!%D9kN{2AMnxV*|S~EI%h*;sax7=W^cUVPcJiYJ8uZhD!|m+ ziR%O61704EeJ|SeriZI#H|TtL20L)t81x#-lhmcuwDYxdk5X#t2kIeU_Hnq2BHNbs zZTA6IS0-yYnnD8<#0ITfgUOxEh2&*kgpBara;M5gSo2+vB2T3ga+q9Wl*D<~)K>j#?< zh#CYMqc`TQS^djfyu4`|LE!I? zqAOkueTcc@K8h8oALEYkLbfQJ9bw#ep|zUA^=vctzOy0Jkl;O5+|q22{p76a@Dg3ChTV7a8#5gYe<&`O=X?_Mf7v4o6ske%bX zx=QpiB`F2koAwziNLStxTBN4p==0OH1aX^8d6A_RRTK#bUn9`>qaYa~)g^luS2~$JvZQe}^P>XS z=k8?R(TfEZ%VmRy{Sx#fKs=spSekZC2U4q_AL#Rm;V~R8{Ap->dhxNa=w?NU$N4T2 z(EU-)`Lv!phblcDb$>53u)#VCLmM0v(fW+luf>q#iUg^i|F=C~5dS?qjVJp1l;Co> znORU(4ZG1&@;1W}@1Znz*FHK@Ln3>7!LyUNw&4%kRV?kOxKODp0MeoenucL!EE0{~ z%(Tc4v|hYktNx7j=xKRO`g&}~-he_rL20UB;^*85>QakoXbgP*U6~AR7OvUJKPEmg znIe>@ltI#61MWjUKI|*4U(t=KgKjMkzLGvCgVCA8E$n!d$0`e`xYL5tpNe{Ni#B`& zjAm!v`~pbjVk0|JKwlq|bSZoY&AWp(B{6-BW@z1ylM*M^B!rwJjir6-(ZQfuy0?uT zhg8i!se9cEv0O;I{IQ9zUuX{7clAdj{j1QcR>->#Rf7EPXl32l3_*0C-}(-O-hRb$ z^9vba^<|khmTPxnk5cg1A(1>NSlonbY|)>cV4M-ZGS7Ik0e`2dq2LvtdmWSnlCd(; ztE7~yV+}$Ym0N$pxP>#Eu0$TUGzXN76a9JbLsWYWCX5b4tQD;3(I|{j$ zrKN@3ObnL^fcsHL#e{C~vobOu563@T*+Sz(t9o~Eu0M9@9`>O2xSuy@;(-(%4~yIW zuxHr64(vC6TB8B3j%GILki#ww!d%Xl;;QUWifuv`i{h%dS!&+idT)X9EZCjw2!MO` zpu#Wfzm~u{Qb(%uTaPx^nlISnYZv8#GSi|UQ+|L4HnndAG45{WCN9G`AcM7TL90H} zZ>ZP5oT*~JPPE?_Z~uY8zx1O75z7Y9g5+o}B}ziO^=k*>q7A{HL#0g^c+awAm<-94dV!Q7)=8?-Nq&@?A(mwN=YCU{9 zc)8Ey9SQUUkqZY8N>0f-Dcju3&2O+rH!*>sp+uj)3)Gw(-x01nriDCvJ0mA8IlLaS zMpSW%AKVf;ew_Wg1^dj>g-#o10&-nKh`m$*5HZ3|ubc3H@8wp22#nu)C%rNGbxNW_ zXlTEt9)ODZN;dF!DJWhiu!C~DZk8@w)nY>x)`L=KyPZvOchmF@B z$e;pqJLevC2YH5fywM;%*vWCs#tfLnbn8NTZw}!DL$|NNq*h#lk_^W-RS7F32 z@ub;s*2_se%5#n3NX&-VuN9z;+8D1H-nG<>fJj197n&VAc7pTbil7O@oACNA+=@EX*6ml`hy!114KV&;rc{59Jcy`N&^Ji!7sv1hYep_bjh z=9JLrSf44R3!`4(JW2q3EvDuhT46DA1!v{0-i&KI_C)-D#R?yS{kRE=m#X zFVZ-mHvd8v1~lxivzfca|yStXi+=8!ru%wN2wc#Vb!Q(rvx} z!(RW;ZT%x7RdCnKNy*K%Jn#Mg5cLk+nRMaWZS0P1J007$ZQFL9*tVTc$F^B3Kdp7#rodmdKi8X%y-+TNuJictRs7Xg+C=}{|Rw-%pbAcKr1q$)))jbyQ zlsQC+TSj^F*AJP^&>NEQ*tl)c$E&*Uh!I39^44#>9@P6Zz;8Q&dCr%-8jc0y zkukJ*j+5my1*$V@2}`!^rZD1@cDsp^U|#D0d2HldnT^bwZOz7BK2AVj5 z)Se!0?kQwt?m!d-h!@}nl}*L6&l(l_Y8L5Bqf0{AWMVg?9YPePG&)B=ZZQ5qS7BDf z0b~Fl#a3;$qhsqBNnrYML^INJmmIs@N|vvakVh_Qi8i0KMystIVsPL=0?(qIGW6$i zV{VMPKZCwHeLA*Gc^IQJXl|r4FFF2g-pbA#WwDL}`h4(KK!?6*g7X#>A7c{G3P};N z=`ZA{2yM0YtK&Y&Ir*A>3qEMBwCu&tmUO@hx8vuysk8R_9xr3qnX_|n^ChJ0Sw+#h zbQOjYEp(XaMR2aqw{DMD$<}t;Xi~UCfug^M2&KLz8L@Qe>?4ST7^@W+Mb65=1#ZGG z`-Ng*Ol-X}xtbjj-Wlt_ZC1w=!?oPgR@+*9MKscUu!+LHK{0mNVH|I+bj&k%?=S%W z)*j9dfmbOyd^MuNbNs(q;R2!Ts^2krD-?b*DBx(csa$GvTOiTm_}mM%U% zkkkgdc0)C7kMft7#(((~NZBg=B6kM-oD}X0$2BK5{3JDItP2`!S9w8-U0p8ye#oT%w}>hzCe86u2gGZ&|9aXjsIuV!n`feC zZ?l|I;$EF@4t(2bbF1G=My;xR5zgXZKlyajxg;qH>27Sio_p?7Yka?C?r|H=jk}#AQ-&q`f``Pz0jsDOBQM{Yg)jN|Oc97z0s7x!RGcAsi4$f6gL^An|zaGH*Wl~zkLb0r+d zjN*f3>xqp-`@Jo(m;1c=c>`ewT8pu-FZ#Z^!(=3UNr}rtNMr2HYC12}vae__rl!y> zbvAnN_dGLGdtVt$=WbAcK_u*I6nYkae&cEyK%*LEF3lPP{w%lXq7-Y93|FSULfJ(D zL&I#C`-ose4|DNOS&kz^+~rc`@G-$ln5z!mCCJ(YOpZ7gxnW@M zVx&PrwqO}H1h$+%vv6q?N5fsXL~|(iS9*y8EsA96J|Qe6fPwbfC^p=1q*bci>D|-V z`ypEFG~c`d3O1^`VOPuhIrq|skoPg-FE*%dk)&?(S4gxU?541d(lM4+%(wH@qwX6G zWL&s(PWj4}?;W6)<1dyH7L2K?)l><{X?zP1M5hmeE})nm%E>HS;7ihRbDuEC8&y}Z zBzAQCZ^i)#L#SMt%6~-H;hVv7q~$m&Wm2=6skU+fwmBR4o&|NIp`4-1GPC7ajp2F4 zf#?3TEQ?S}or*?k8R=5WSFsW6dhG+12H3V?RFkZ2{HF24#cget{;IKN<{if(H@rT@ z__=vaGg-~w=tS-qgrX96HY@lp6$1SQ)l>)LJFJ<_;Q?@Vj061ec0FycOFJ5{TygBn z*jZBmbW65%9B73~;NFf9($u&UyY8FahD^6-4a(AMemI}!$82ezH3U;@^ddiV$kM2e zIg%luIEQIVN{^4Oj2o4K-tJLU6|6r$)Vy(1wN6KDXfPRn+wt4VQS1Z_Jj05cl(mVuAcoXGuKV+4B9T-Ox%)YgO*wf?KLyiQNT^w-% zbf8TAsjt-TIC93U&ouwG0HxEXL@g~!+Q*o<&Jc*oFHg9J>r;XOerg5H7(qOF-yyqztsRey6RUpS;*Gm|3Y$)A-dQf0oiyQCex zZQRjBup;+Cc=+*q@qT~QVBI4*$GS_8F&`^r#i^~9TKi9KmSlH)>WEN*<5nKEvJVnX zj#sE|>;TpUt>p>fqjt3bE#uff4;`E4hAgeKXmVw|5`|W*jnwcr2kXr#5@X3DWyx~+|IcgON z2cC)m!L=yjV2vn~n$1zeBoc&~B`fex^45;FaU(H*3BS$BZeV;D$_J1**V@FNqhNXuQ>jhhjNzT`uc#Eaw4IFCV(_Obo0{ zA*ny7BjDJTvQCyN$T;OWYqyP1a`8OF>A$VveDz+;+_3@sRPb{9TPbkxz&XqCFNz_1 zVkN)4KaO@4V)pu*YzeZqbdBM;kgLE?E@T4gq&}3o@Mmy+fpz0|e((;6BRdc3n?d#P zp&aQ@6~r90?P2>0J0K*|^tz3*Mox}sYu|QSCx|ykt@?R4Te@4VRmPPiupfTd~uhMxp>Sn+H(!Y^{{azHeL@JyfmLR3ci4qt5zHkoR<*(lBEB8rH6(HI4`>f#2ThD zB^>Ge8qXS-mR?tZmP&~ejp5%Nl1*@ZcFGTnxI6DYH@{aVEW65}#{#6y{Nd@a`y69r ze?3|8M1~uot!6srUvR6NR(CGfeDH+%F!4>Soss5LfN;Q6&7)~V$E@^N03NcpPw6n# zghav{#7$?M0XZjYff&^?Q2GgNyxAo0vW?B<^k8*5R)(^AP ze%izv7c5EjtWiyE?yHeufM%arPTJr=GG($&CKDIJjtj{RMm(tZzxy>H$cogV(*ma| z!9$b9-(lNhkWEU`|KT-$2D6g|VY&*n3P?KI1wwV~b5G5+CP`}mwsct`d|$#JNm7TZ z)>+xE0Q`VVxBC5~&2lJWtc+4rJf}VQL&^@0%YmUDqNuh@C{yq`Yon`%?7vuEhr^;h z-ct7>r)q2yJqy*}v#%L3@7lKf6Bu2B(&`$B^H8E>A`mAAWg6Io`m0cHX8*(-8VR*X z>O_z5lGTw@%)<`>Q3ABaL!n-s_%7I)^g?d!r6{nWsYTQ}Y-%Kcolp#UQO{|Owx%m6!Qm()OQt&?#dw$ao><(XZGVYRg zV6@`NhyAo$2bn{GZs3^s|I4v*(#{74!qNn~qS1u+dpUM#Qdx4@25l9SCM^-a@5u5e zt6kJPPfm8uFt>G9M@Gh@dW^9s%;clv8duUVOtcXoj^@K&szqkTgtG|`?GaitL^pyO1JJO6z=@3 z8=JD*Udh7muV#s7uaAWtS82@hGuPG&LJ?}Co>tArFYCqtC7ZpX(#*# z%`Qoj$is6KO$m(FKR?3|_s>Wirqy@>P^yr2xq^UsJG}WR1Cz7t@bSd>!^VQc9`#sI zSL6c$OP1X0?H_>7K#?X6K!}4$l1}Kb6K(Ru&w93GfrBVg?G(-w>Q!17?ccd1ppHA% zhpp@A(JZyA9619+%T(IsYc2Fk-j=^UWIMlvMh1#1q!1aTkJCfFz|}HnH){!}Z!Yj} z^dL-%d;BL-A|6$uJ;)vw4cp=Ye?)&ctLvfo(jj%RmaZ9^mNcd%fUG5|`T15CLy3Vh zNCY&P$6PB!#rn9&8sEsr^x?pH;BMO?%k@Fbk8aasoBh|Bf=|w#p9eEvvZQ!^gFdrs z>P$5|*~0i$i7x5@FBCznvINgvD;gzdvYNWE8^r@k-wvxNwBk;=C5)zI$v~^{1;vxT zk$)RE$4&x4iOQT6;6Df2iux%L0#oCEoH9M`WkJmysfD^QF0i3)IT0I433c7B1VG*; zM{E_>+A_2exa9K>Ot@=)MBb|kdW?{+6?mK$J7FJ$=GW8tPubv*Ok+wpKdPo$r+q2L zOOoFtURSSk=A~oeQ0_RsP=U!4EUINV@4H}<{IxK*?-qbI7|a37;$F`w+Q!(aWs|Sf z8&zv@VD=uj+fwMSX^J#{T=Pwo4v5R4GFO5^;&KwtzYYl%l8}hE-!+-nR6Ukb)AKD$ z0gK>ko9rcJ)?L)(rE*2y<))SXmxLq3rwzM>ilR?weHJs}%n%>K^_S8WxJ2H<@}7-( zj9%z-Rt&)79NbbkE4hum0cjm6N6~C-dxqwl*%G!{k7!u~6{RA%6aHKDDUWvg@2!3} ztwB7G)&2G3vT>lb;Y^J?WA2)OFt3xTf2s921aj+Dkr;0;z6JemS(}~{+P{J68g+k! z-YD-_YxJp$$FMEX5IRmD;So2NHNlGbbwiQTp9Z`@EwGCie$`$6&RTEI=j1xBV#{pZ zYgAzjKiXJP89^rW@`5$@#Zs4Ilk}93@y;IG;&YT}KKYkC30^4K0 zWB338nxJ3YZa+A5h)SB;vULmQE;e%btfrw=l+DDQD%Cl=|LK*fdmtkKqq(MV$p(U4 zs1?W>*@CCAS!Tpb+6A(X#M*?V%6+`!q6mRtVv-?%eMX-lBL7aN!gL^@`Mv&52&oY;+xy18*jeHZNdyJlx2;>` ziR;9+5_1sDY%qR-f^LzoDD)m2NIw1y^5HKzsb5F#MMH*K(_EC3g3Jr^#RNdk03?vg zQ4Y3;h-{ZNW0IcK1U)7}F)d_P8H`8>vyLh62{+r}EKZ0GbSi@SW*P=~(csue2F-q$ zu+z6!Dx9sgY9K%^QTpYm=WmP%=Asj+D0>kpLe?eEcdBv~42m0$!{KAc`N|4MEUI6( zO?Gj_v2)(E?{!5BJ}oXLkD9q}0pwO}b8N~SFsiQz(Ybje1!7=6WGc1AtJp;yg%g2N zV4ABgfy#&s-olp_XUG0vNBxLAJthBmqI9iQ8C1qJP&N2`RV~-IXuHrDRuxx$aZyH` zKcow)WyY9xuw#X~zFq3wCawiwquZ3M)$*X>2SQoPlLb0hB2GrUhX+ zn@_t~&e~$F0L`sx%j4sx&ioSp>iE33eUILCI&SvSjH9i%)s~8R;=|ZcHubM!zRU-G z=J5wMWEi9kF2p&y)|9m^k^ifT`r8`4 z_d0pKrmg*{$pL#p@V|z1k(+lk??(3jF{B5cP6@|_B$97n+a%RWmJ@$<)J+@yemJ&$ zzCH#*9TQ~O>xW!sV%a+yy}7RhBN4loljuLj9btQdd{4Fph?bA4OVLKX8F3{FYAdTB z4*Y0LYJF)?XUg2k33;^M)c#2otw;0J6H%>oZ$f|6hgTH`8AE32MYpo;xpd19*bq7* zzK6OL6HbzFR5Jd8S%bOWhQ{fE>;^xyl;B`&f< zr-oMq8~P7h6@Z*%{i|7WRJW11yTjGN;oI-)h)a*eUv%Lt*hnZldoME&$x>B@%wvm0 z6kw~c_`a#{)Bzo&snKZ4*y5#D9%MgT3#*rt&?;2~2zF84a2P4pP6o1oydLx*L+1B_(FwV%>J6CFMn3Ne#P~^}ZE4urFGwJMUF+AWfOAvI367iW8A^u*IxANG8+5i6`>-z~U`bmlM#o=zI4ezvB1Qe-4gvE)fU5 z><{xA3;IcRuv7V4Tft8Ltox5>p__Z!lrTAE%WoZ+330dGx1$!{Ap>M^DL6+BRKVyw zyBC=y;jZN=GtO#SYM19JbJ}&y0%^lR&dEZ9HPP87msu(%?_L4v-RGg77OP^#n{cAR_pzFC-arsc zx&Fcw^;6TMd~hkAE26fW&Ri9w$E=V3xAt?63b^Kk%-?y>L?+*>^@8FLFo52TWLr#I z#B`OUR*3-16EDR?)t*8La2&2>rC6&b%F^+h1RG6J8q+&AUDv8lI;H8`C{Kfq%XR+f z70J8;QiL@Ipu_1H`oWYBNFfo8Or3aIoP4WRE2vF2MQ|X;`kbkSmq2B+Nvn`^Uxy{0 z4dcVLxa@-KpJ>{KhN^w-5@6ha;ctvjQ9t*R;iU~_Rn|C&Gh(6goBX5qp(9sm0IFC} z<5-}l9TjXRG~;>T`ysTaN&;ETrrXCDmU$X!ep<`S`6JQQLTHM;LMUIlVxkGG;0iL5 zr@u8%;HyA9lqEWmGs zWubGOh}KSGs=U}s)Fs^}TnHr54!GL3@FGUX#U2K~+R1pki&?ukZ)XAMODG)y)caC- z#eyfe2LT=)0t3{x4981`^mo=Uc0k8)0x2-bY7_HDX<7du)ShvYz_5|viSshzl^xnvR@)?5 zg1N^To+@!Rjw$qxLkbQd5|peSIs)uiy8c#Nhj~|3J5jOH(Hb5-b`}JimS-A-mZ-kA z4Wq%w`{nrK^Oj_iNkk#S4!h(UlaR_8|=F-kLqb9pMayW0_7%v(^nx zidU%EWROhEcdc+mC(P8isUa#anrS^jHHKb}ySD%9@bI0bBPNpQ0L~C%n$tP_tPW## zTv7xnM~o@j1dyYf>^xj|;`^1DLHO!gR=?5$_D~Xsz;Y9cBVm<(9Z`n`!-g9pFjirL zN)IYm_;o_RdKB4fL*1AIL{ML}Xs0{%iN|yD`dc7GU*9nKJg?@+>@<8;r zu7A+DY-F)z!M0rf%^?{Ccq#nnP(g%k`w_U#8o`&ugnHH0MU`*BV#jII-C~l-TadRB zDEJGe7vPb%sfDTLWMKcta7O%8o#mc|MHE+NIzXCGhua<~bZ@RK*wB#;k*3Q|fwO32 zOPzw>Z*jeLidC`WD&l3pTEPK0qLL%ECKL{D1hmW1-BE$r{I2tb{fH8nlusxqnTiUY zg6kj1NSuHO{i$k>hLLHS_gnt{FrIZ$L)WHj0ze7!QcNj-O*FpX25YF>PIKR~^dHOF zwLFfuGkumX&5T9X;?6jDi)wcz`=3Ex3tfH}mFLIz)9n<>_lkD~vgnH~)6xuo;Jf5Z z>(kYk`T|}=q|&=V+N1%sYf3Q4O0c#xXMWsPq4CcP9Ri6bCws0W(ns5{=EqN=BrWgF zP=FTNVqW9M*wDfFWa9d=)>(b|*gl(0!`Nd^?4%V?9tcQTXmZwqtb;J5mQ1Q~h&Obt zC%t?*h8fE_YsZ6bY=bBj20ZvbcY-)Jg!F&T z3Um-Q{BB>}M|n8H2Ts*h-}|QFAVBxuf&idA*{K@IfXgyS@Q9_7`-_RM6Ifl#_YTy{ zm?wg&r2px2h2DJ9$Po>(kxKsQKH9oaHHsRO zT0ZSn4Lc0w>^22F65F4zVwp(A*mbm)x$k#HgS0&6pG*+0x5~|=s(I9^QXb(BBVk!+ zjO$|cysznC4-#Q+Q*JTBrzKw^mY;qhFM$Njd{J> zKS^zEyGQ8llu~4$XzJ^iC>f#eoV%#SD8xIvjiS)j25Fnof3#t1ywglbHw`-|j{Z## zc5t>P7*;aPPhr4OtGWlJ4Y+$Kb)E-V?WhvO1pApM__3sH?*+hwy`rZ9m`CBa$=EZU z9-Qrx9nc4oO>kCt;`VKfBzF6+=0to7MHr=CMcz*?ZW6x95F_e3{b7Shm(|>Cl62kpKm~ddC zFcQLy!ffdYYnB8E1c*cqD2*sGgg{T5O0OeMf!=)dk<{VpCy*~Wdrk^0R^D5QVusB` zV9*&eREs^?jk#cb#%4G`W+#0dw6eki5rAAA;%?CicdO-&*wveQJ{^rI>(;w^^{ z^|fh1{2Ywn#eB2I%}yd^SbN8N*T+E@0_{QTFl9VZ$pa-+Uy>vlpE0cXN8^5<7pS7X zsIq>iA)+I~EAYF;0@;8V#BIwINdPHxTwfLyYW9-yK<^g4c!}V5GTcR+dmKW-0f}BJ z@&}3&=g0%V~T@~a`5HQmO&)txY|H|%(t_bKfa6nQ}c?)|{ ziJmzQEnbLir_DuX^MmR5+x9N!4*d2NoVT|4L8SwO5T3Cx5aN)5!u1c9yj3@G=zy*1O2*qtd4#@_QI|&;ANZZQ4<=9PCZ{#xFo^l$`AUhF#LOPg0sFXUVXPy%& z=fDG&{0G!^-eQqK<#RKW(WT3GQQF`-%fU&A4Huhxx+iaXa%XDL2vTkMJ@a&7<9mli zylp(5RiCldEt)sY2v4*`?$Ek=1=E4L^fB53ime{?wSpHYqZ2WHv1;3}_x8S|E~b$j zasNp?>H+G>Wmhi{Ah3oiWx}uvjrIMG?1}^U=KG2quX^*yf^J=b%%>x=Bof(Bv|o}; zV)}{LPV-2-dVE#NTMYJusy>H5+I{>?5OmQkmv?~j`j#!YwTgAR-(?WaAeC{!1BcsM z4(YPIBvi+r;|^)0?MaP+r<7Lk?wk4z2~VbkyGoS+bO3Q2@cD;Xb5WQuQ zFtbw$L9^`aaXcMu9Z%MhNw2*@Dt^rG2Fscyf5k&8+ew9uSPcgCusc4d3u~xY5aVcN zDJ$GICW=$mwWGoU1{%$$R?ezs`TE9RUC(I1r-ZpCbNC?rq1ghLbpH66lEt(JfnU?gvaXn zDj=F#%9i(|>upC(zkG>7^M~dHz&V!g*_~H&3j(ERP3VYCqmOMlHNEqG{aXfz=Q$58 zdoTTJrfO@)QfYyh93SxcP{C8f)P7Z|{mq-A#;Z-~%Ca1LD+z=3C4G>>1XE}ruUn_g zu?DMztmjJp{>L#rmUaRF*P_8eC=V@XJue4eJN~>7K^uuwMpUL1^kqlVm9vu8Jh;vX ztCX>OAlsJl7SB1zSm3ACM=1+fsnWh=C64DT!m! zS=LNQmYu!ah{o$#7!OabuvyOKEh#8cN~KN1yZ;bS$99U)We#SiK0(7-WVQ1(uq`UV zE7#rxSN$ZHodO!RyPVYtt{Y(H9vdmdSb5zk+${ z&FiXb2&z(-B(=n#jaB};7JIa*1g$sUtVs%=u^pHwXWH>!PQn~oi&!jhO=r!}}UY1R=_332&RIr8X$UlZKZ9olzrBV9T4(*hDCMSP1>I4hdxxOgdV zvAw{~W680a`9nyVqJSa5>@XOZ?ADaPQxPg}OD;fgT7hRQb_nHBF12wvO9Sb$&1D81 zp81{Ooqb)B)t;>-XFB7eQY_^uQd+GP6XcIwTkaKgsIID78D|M9vDJ)_tGe{^kTe4D zIQY}mylr1OPi6gTjmP=jrNoo$d8Ort@>T>(4($bvzhG`QKDPqED==w=zxEf(`Gl>( z9oEpUSk&L+qmExZWfUzX-H9zor)`etRZ%?l^Rq?$a%Au0!5MQF13Z(2wF&%-5W(hE z`wf9Y(8WiCA`^nPTaA@jtTQ?EHg}EVJR>{CISq10R{q(5rWo%0BUI<2Tri_JcJbti zNx5+asj1YcW-J_l?m-KNr@!s(tmo*Qpt{%YR9@I(>%lagnTlTLve$vw-Z?vsYhen= z3~Hs{trEox2rRA^_=Oe%*)w6~qjyUAURP<)+^OCt97JEXM1Uan#5PU0`Jn64s;%7q zMQkVc%qbux^tDmi&3RK=$3`2j-Gylf8nT0%m*=9__)Y>KyFEJTDwS)@9JN3d>L@oq zu8P2NvE2R-(53nd#X`M&|X`9$DdEq`ospuD=umFv~}- zoS5Z@>Q6+x6tO>Nd;~GgJ&-NV--6m>7PJJRB;lLvP}PA;ZkltcuX`6M#yU2s+q!y-xs>qkdC{e;RR+1%{N8ZBAd z0Z#8G`jae7W16LcC&j3#;s^;vqhf++?6k1>XIiW*bVT7Bu89GmsmJ|Y!<&urgZ1_V zyeHc~tf!FJIDOYyQkDk&UwXL`3B=Zv{LDJQ-T!l)$q-iSAJ;yWaZR5zW0ow01fcek z-h-u^$9(`c@KzVmCS&UP*z(bRYD^_$=$G&g=;##pgkNZLJ%rWog&H_DL2oUNhLSON z{*hGVH>m-e=dy*%FVS+f(#YQ|NmE1ZZuQaCCX_Q}RVl2z9p>38ZKso6#{mS;iCwgS z>vJJ5q(7X#ZDoF*3RVsaSs3Xh45g;W9}rcETUH?dBc?zNQc;Ol>Qnkl7t)L#G9PK( z7X=-64xBR71te!KGF~+$g>EvpxJdrMv;21Vbev^C)+tVbm(lzaG znM!>%P~JR(8ZQ6FQA0u6X(>&SY6TZC258cVvUV1qz1C-By#XF^@4v}t9nOv z&-Fhn>B#TxHSdS5R~wtO#$*Hz4|6l~W6xvLhwC&8WL9iG58xC5+!C^f$DmyCe6O%8 zyPyR`6%k%Sgq}F8p$w@4@S41cRT-N|nVrM;0RROM!CFi5RdR^zgw`C z@St)Or34e5IBM|)z##7;9Er)4*7LOiW+Z>v;&p`5k7OH1f}=!&E|4}Fq;^wb(3j7M z<;x23qc8lA3TU0oiShiRq02DCkgK^+J>vn(=pCo5lWOYr^2k)1Xr`WzQsIVsXL~>Q ze70JIMrXE^Bt`;P;=AvVO_(=5q#I0Q_2AqkOi`McNwWxbHb zn<$nk4?^T7&sr%s<8w$CrRUOz*AZf7a4`_BjBlimK#yi_ z(^Rl;J``7(>0~0nOvkZjV`B;tKy+HV(U#6QFpmOJe`l(!#roOW`4qrr%w;THc9o(>YIP}1L08<6Dw}qf zYmzuk59(E2V47_7DN+i z;p;}1(({Y^$vlu&!(M|A&tOYjDwHw}ap6Q)g7m|hpzrY7;V#d-^RKmTUtunjMVGP9 z1V)J~`s;kf4ODEATnL$FzkTDC(*tEKk#+VBdJDRKx_ytJf!F4`MvY~Uq=l^n z0x>OK4q)U0;b5HVqpR0v3Lar(&E zz}^WXz@KA#u;ZOa=)PK#lj5G$ZveH80BsKKP3HZ?QQCc2keAi!yDofAjly;`?RJ)) zKTBVqyK&d`Vx11hR4$R6(ut}YycKad;M(;M{ZVIicdIWrLz@2|Xrus`iWXEZ^S}PO zWz9#Y*bga|sko1->BN0|8WscQEm zFMYpZAmtP2uqEz2)px3~+eabyEmN{lY7yf5!ZUGB#1M`X!58}8f2a`>mlr3e+$qOV z<3!nN#)BKm(H*3>=R>Ouz_<|~R-z3)J-NL|wn#cWk37R=Ud-O7982U>0U?F`#%6!VW%i6ErX*qaOi~OEv18W<>+~w$a`F64}5as{u8VbmO)Mm z7im`8FjVxkKpOSO6%Z@}#-6*~1oX&wfckF5j*?M0CO*nIL0NOkPs+L zUJh$uDK7x>XeQlW9$*hB3l(%!o(sC?Ds zMUYz3WnexY-T*{NZ6hNzk;7c?WKC5A#gOjvGe)+DHy{0M_`Fh$*0(~$k4q|M7hLH9 zPcKYn?-bb70eQHzZWfFz` zDMfb#7-@}Nhn4aZq9+PdXxDsxWAunm-n*y_cD2JhjRFMnFP@{suO3g^>G!n_{KV$- zt-<{0|BX%ex^t(+OTGj&E^cLqf1*S_fRQI;rPCV@P(`11}ZPvEAaWk+KL}-QqU`Sx3}U_7O0mK&$At4wh;@KH-N6rGZ}x3TlFO z5odInu>x#UP(okRlYEl9gdK?~n-BZj*!mgjsiyG~gQ2XX57DDWa03en98r~ZZ94uI zaDa1pdm}WEKlXxa(%#znv7qUUVI3-BPv7DSmYd{7i%!}Kga$e$=EA^R6#S({pe&5w z1Om@7zx33RFNgfA;cy#`H)tx1-@CbU#wzJy`~@Id6Fw4FEo$exicK*!T>=%_C5koa zyv+1Ljc*FPBPGySmb)z4#l8UFXBZU@VGSk?!5r|Z4W(BPU)es>WggclEpZU2Ylj#I zu3>J}(FPL$VsVM$*VhC4Ll)VVpTV}esu8L9XZ`2%f@o$h%|bt+*?SEeJ{U?5D-SiRbvy^+QUoUbQiX3ZR-4sX(2|D&=&QsPToD+_Z3)1bV$ z(bGprHo@~cyLqD@9a_3_QiMPwz)E#_dJ6dK{O_y$0PpM_S~HzYN}0AT6&w!}e83Vt ztaX8orqK&^v?B`g2J3&V&|*J)DCx}-;heCTu@9PuFX&z;gSx5t~?)jG7~>kf`rsvx5_G9c_0(pbPc zI5!PmLe3x3XZdaznI7;Qnu6H5ipZyOb^#m?ZT~iuZwJ%yisCPx59@DI5~MFs zGNE5iPw~I39vKz1vYHd~#0y~9TXGcbDFiK#`$R&^D(#h4ZRZtWEk zyt1Apj_i|-PZ5qw6&2E5Ch#l<-(h8dGsw`to$RW-b@LURg+pihEzw`qH5syfInN*I zIp%N@{DVcF3h8sQL@Cej=S+3nwVuj_ygK7a-A~>V!<#y@{7sSwdgrX_z}L;FTT7*;(r3Rs04=qZx|z% z^H*0u0j8>KLZivcxh zD(c0n)0OP3yOqKF;5P}x-+PV2^dg%v7x=aof4YL1ii?=x7%^XYoxacAPspnOz5mbE zXT$(sYm-*;+7C`fET2U`-D-*$2j((FZGPg?w7SvixM*DJ1M~nidki~bvzl)UB3BMF z%*}E=HT7^sF8(gu{l!6)>{HWXQm6kXE3)L$!+++0tb~S?)_-q{t2bDozQ68!t$4Hc zMS$=5Hp#ii=gNw*`5H$3sa5!q5}!70gx7Tv;4=tVQkDLRO5PuL5z}yW2+`x0TyFhZIegQQBDyKMRB*_v%0?g!KNE`l z_3+mPJ?sHNT&56ee?s0}MMHEcyea$=6cs;`fpqgd%aJRof}>cc0_*uWAwjjq2%QJj zO7h`gkrbF$5QY)CSe{>S$FefQ^W7svlTS7Dmgm?Rf71j2>=QqXphC@~i&*9)BihzU z!skjXsXh^J;lA~#CYtDYwW4Rp8`e}LYh`{G$smOp+f;*U0-jX|bK3N0Q+fA8q#Ojc z$e-L~L-59KiLaHte|hq%(5_{A?zIN=g+7uV2z+(u*7-|5KdTc8d12q4jkzB@9>xrK=2Lx_Ny zB4cMjEYFBAD6rRgqG*^V4qGqs95&N&kS-wJS}8ipR#3A zsCw}Z{b%O8Cfr&1yeSbJuVoX+HZ2~wz=Sk_utb-8xq2{nFELf5GMKjWllRF}O|+e7 zTT6X;ZUl8gIj&VvwIzvFz=m3%GSUU*vNm=9;b>WvUvtw53i@DTx&BkSp=5QxgHuoL zpU%I?)pFSVwL=iB-jg$Rv&L3_nunc6reA3Xlp}S|cA6O~{NJOG*zY|Sip~tJ!V}^E z;vO5rjQeFo`2X3uK|Q!Ek+XmqVIAJKFtWC@yt#9 z{=G{?=*#P;a2WonfBl;?;%3y5H|Dnv_}&yblW}Y1_wowMGH+!j1*Lbb=bT;Mzv_Rq zvVN{B)iXxnC^ZxAwbrV)`mmrb=`yT1%dPZ_7O}GniAkj1}Zy6U{Ki#am@14Q9|3s&Wt z+wA?zw1~b3M<>C?xCN&O#yTX)zS5rz==gI@#=skju~t#ZPI%ZR$Z{nWT?*A90Yet} ziuHZ}m5r$eG%aPc@e-?wJ;qmFP`rD4tN2 zxVV-PqYU_^|3e&zvE}KimG?Y}V^&w>Nde-Yc4Xyr=$2KnS4B&Uty@Nne5&Tiz5DQ@En8v)x;O4G$bO;PWa%BGVUn?k7DkSSdvw=-b(1#~#s3CiL|u*rNLQB>>s#{2#@A z0P~eAC^hTf<^xg<;CVbO0QBOD=PKQx&=h`rY{9!paPtmmN1mf>9(@Y(`Dg8>Rf;v4 zK_5LCz9x`|v5YYbHfiTbk*5556$eEqw0s`vGYgnJH70^_`KRQXZgQj}UUN>oBQ}z< zp2$2q5(YMOlqndaL(Jg2xGHD4z&gnpb*mMcA9q=0=d^uTdLH8oAi;{TJE43`_xUN& zMPf@!$Nq%v(pKv0koNx(_Rjx(x52Y;V>fJU+g4-SX5+@@JGO1xwi`Q*-58CUq%qE? z=RV)pInPhe|1j6?wL7yjE0cpu-|TwAQ=&b#A(<;*IERxUqccBJ-a85;UBbD6*A z9&+JW$e8t|MiK?}vYBi`TcPsBKenTY1}I=q!78s>Yah4GH%othDSg}GiCPpZG%IBA zB^OgOYKm_+*!A!DYia|aw(=t*Z^gkJBdy#9iZ;R1L=ju!H$Bg1Zk)P|Nt6AUvb-0; zC27`dGguj6IhT)7UJ8;;N=E8M?aB%JjIBVjics@Yvb7KkZrZG``x z64$J=7d4V%@}j3ts?1gbU>w(g&W;7hhHL}YZkJvF`o=azqlr<$Ocov%cO zSPln}M~uzj`LiOLaYNN;cxB_}OM14|O`Yc>$vLuFJxK_KGo-(ll<7Wz@{kpUrG!NU zpJR*d(d9d42C=N35QNs_B)?e+f4{eZt(~IzttvpX$vkHhNulW-8FS%nf7|h$*1px6 zEvoQceiv$3x7ce9z-rgE=k!H|3nBPS3HjvT+Td(;&iaN$%?`NFEc8)zld4@=b+Z;Z ze(Gg`^N26)%G>2#{LpjU5w08Q z;rb4W(9yTg0!i$TH6II9!jr?)&)6&U)l1eYZFN>GPdlXnQyC;Zw6>Af?+dB&Z&z&4 zXqIr|aEAfN&b~f8509(eUr}Xuxk(@~WQA&fCPI4Es)C()03HX-_(5pgpV&W=hx{73 z50MADPzHnE+DQDIfBBlDLS{M~=?DI__&K!W?D<-f;-CMRGEPgFbstbL^NyXnM#O>G$icU^cx1K9W^G^ z%OcXNN1#wlNfhG5_D8{nJb~Zw|B|!tvL-N39YM9QDis^ZfO`O$2dB^?IUcrt*{6DB z`G_iEp)*UQWs+17!!8}uDpIku?k%*#2p>}%AP@-r1& z3pJr}jJ(HC{PwAY2~COYz*%8BN|#h7jCP}+5*aJH^gacQ0ZF#N^gukFR!bPK0egfv zdyV9K4^v0Z52HZf1E=tZfsLtbA{Hedr?9;eu()eHlh~E8DeM;~LW-&!?ij;d@=7RD z%yR>#-xU1Q2E#Gp4y~FNb;cPl{jgK6+R9&AFpm{2i%Q2-N87ckKftyIJ7&PtVJG0w zHfQPr>^CJi@^ zc^LUI{LRO^T(52Q_j7rN0KE%Pv=oLf@Gr7PMYRH1)Fcy9wA@8>gI%J96?9qJu9(DHl<;O(k7y^`+vgngE)aG-QG-G6qW5QFuvg{3chLtNuw?tA zaYM4deM`*9$h!%<)`y%Qc;A5SgYxqLHHAd3J@TY(X)?{ z&9YTOjX9XB_7~I!s^@Bi6F}syQ8O;2wv)}6up-wob1a`2ARc|aZ^NOtt$-zq)4f`mx}Ve0lJ%a&oRQmDQdWc ziDaDGHFydmq?yJw{EJi8nNb+nnnVi>Xv;64`(XK!W2dn0nG8XglVXy>K!+rj#Dwez zy3CLRuKOf?>QuBcOGQUAQR?ahf82bW_~0pSt-6W;j6;R7`(8fpmk z3askH6^Te@5l+61IdzW&OPUnZrx=FMgPwK*T_#u&OGwNUWoi;8Z+cbobX9gZ+%7c~ zbqyYfm%8=cH5pF?{a@LBNzA48?mfU{l}i7};z$EICVi*62T~gmE1?hV?}JiM`E&X% z8ZG<&jE|k>JIKrS^}VN0I}t5PwI)p&Xc6UbTW8meH+Gg(yKyx^SbVYBp`1;7DDnd= z;MdQk-$vBUCoyQfvuu|>e2(pD#tHTttoV#F`@T2;1AOpVkmcEF;(+nRv zwumBL>-J}W63L0l4P+GDREC<<+pNl~r4prYR@mYyVfd<;&dRY0IWI)*0Y%&;f+<}cyDS+BNYHw&vfNGwNuHF) zt2tc=gk$bY;))U@475kWC`@t7!_f-KG=7C1Y$Of2iGlnelRj<}y*5&tRRha7@|59a z4pX9QKRzw2=Gl)3=q*K4Vk+s$Ev4T);LHdPuL%B}^1vHvXreZCLlTbG=d9`$Y}EPv=-Zp^vKYk%8=arFn)?A~fTZ2je6U`8k3n(#0)Bdud= zoS#O`Z~g^I<~}|iX>XLlkWiAVH%nm|zH^AbO5=h$^!LyA?lgrU^Dhr1F`WyMPOc6> zC!p@GBvIM~<5IP}A*inv+=_TP8);21#86W^d4yC?GN2D<3jrbzy!&Qt=D_#i6 zHEZb28?Q+2WRl`9?Pi-_k&KxPvx9`xCe2?uZG>d1b4V(ve7+Tqv}kzteESCW@dLQg z;RV22)NTI-4T5~-9g}zyq)hS97K)oOQdGn!^0#m!q#?!aoUCd}TaVL(*&nZ*f0oKu zfkW87W9;PQd3#}tY_QW z6lk4TrnnxUwzX=dtfg*N?#$WEGU9So19jqUOV&_5L;=n* z{q3bJl=03G!(aQ$16jb=1%sP$(Ul}%8Cy8;kA<**_0$MAbZS%wj7nHu4Q6;(eD>vV7_m`X~OX+h) z#u_3%M=dh5@uQjfRlpvd!&#P>s{BO``$8vNhMBoDQSGYR+Kn*hYf9qAe>YtZG|XR zK6o@01x+=`hBQ)1qs5}TmAG@h4F<=(GgUIGk;>~y11?>|#FIP0tgliwdXRa;5g0Uc z7&et)m_avSqpJm^*p z6C9RL`xXdjrWek6tP;9!co)98E%sjVvu_Dj1jzpk&*juCt_d~#+a{bDJQ)$C*#6Uw zC&aaol{yB2P_5!dUi{s2S$07Q{p@kTP+l_mhz^<$cVYF`4{=?G-I{^6bJF@1$o0;h znhsyS@G)-A->4Km)8~yDkQLquLRsOw!%fEzbb z`C=#7hdQ;jg2X>e@V0p;%=EE zeIkc3#!pPytDkm$kGY+f)6mHwzsFzt5xJKsYPzbUtB@uw5|c0E4Cw8)a;!gzXQGO8 zSpqf_D3MowO*g;mo&$X88@jt6m3}^?J=N@uWzW$XdPwGQ;*e~UI@AqvDw&?NKE`Z- z69v0+B8{rk z#|^=!D`Or-30m)%D=M5V)qeQx)fcupxd0TXN7uKSSbLf(^#L8!f#3EsWINeWwIcjDc?Zx1|uciZmf-CwIZpzkDoYop$74s1O0M5?%uJgVJ_ zObF_}3?&~eSP)gc{c|C+`v>(s;U}JVE;nunbIpV-oP|Xl1b&LAe}uM47}LsCd+3jq z2-J-P0#EQ9wGF#H=6}B(ISO(#OrTY_qAI2RyDW`u!i0Eum~XgP&NuK>{EbF}mh!W{ zIs$5p#Tv|4qfvCCSspejE5nKsQu5(o)fg1)Ds7Wvw~{#*#z9O}cF7{kKxTmYrd?}u zEbTxu^7L?cHu=3h8k+RS5Gzfgv2jHT@0oN0D^Y<@FoG4%-z-d$5T3nMU0^ER$mT$~ z-@7?$G-2P5+@mQs^i28p-Puyw$+(JqIcIrMf*e85txk+ylb++0vX-dz@eo`YzMf=s zfbdx%z2nOkPI#=DgaKUpt`$M*=%_lXbE?0iaoe{LYNi0Fb$zTrluU=e9~tgrtizf9 zM7XvEP_RCNBBL;b7j9j=F92IrA`R_jw3R=+(FUt@$hs)8$C(SSA_?da5%Q=qbxcHS zG13~rErPiC4d4C9aVJ7nfEN!fNXNjr2q0B9O=+xFW_8K#4;LW2Td2s|JIoG!X@#BRZ@g!;n;&qht;SX1!LAY zVjr7P^TWJo&7@<4N7k+8MRGVq96fl~K>TwGr5d6lI-czK*EU;E$aIIDNGT=rvWjgP zzp@XBcMuMA|3#Jpeh+orDeed3E@3T1n)SUmecoHx5dH=P`I$a zN@cCiSP(&8_SI(Z?5Tcv%KrlcEVr7uyIEX)Qp;G0c}QbN%>&1V?!?*gIE;ncrYo8^ zH^QwbMD)qx@R5)bjWbJX@rmw`8w+CZzqt zzLKal$aV6K#;a3BwG!!!I=O=Gs(Fn(jb0Pq8DlyAh{iES^>Zw$DRHvfU6;dX4}zFF z0vQ0?KC1cGk9WH^GQ9~hnyrh0P7DV!)$)NH66vIW_`_nGY!V|2{IzHvQ^&u*4Bi*$ zt|(ghy>#4nXW9rB~X+xUZLu*Q6A#A{boiOAUGd%DX^AWoC%HHm*7>NVkw|v-P zZ@E~uw;T5vFX(|R21%Cb@a%B!LDmeQp55q}y@<53z-@T_b$1)OpvfvLiTJ*>R6tum zxp{_TVQ0>M^cXv2G#y`-m*|1bf-68rpwDCc`>&XINpTRX>}hDdzJzdAHB4OfCK=`QQHCjt%Us^ zK>xn~g8{fP9T}@AHEO-szI5N*1tw@HaK*i7SE%jkL!`o?mt?TM8~i@@=v!?<9-K6pve;ZUZ?qjCjk4=9pbB+G*yC&MOK|0E|{ngi|*;fub;W45*OOtQ4Aqp0(Szi?h zDTP0*Snw3`o`ZHhu%~p1;b(Mzm2bveUj6=u1HnbodK^)P%fvdqsJ<3%#hIZh0y}S% zJu&e^x3vU;*?1>1T)FgESGyFfr;9o63mV%U6R=4Je(3PbrNtqC*NA?D_ zgo96@me54dVtEGS5m**jRzZ8#?tjs zm2|Sk&AmXl)(C!Dhj6zSUboda#O=#6@xK+WK7XGVPEKXyD>%#d8>aBPo4j)Vrzf0Q z4560cXOoWfD-}&v7Jd1GF7T+XL^$44JIIK(XZj~`2jrnRK*%}0p`PH78t7==#sIHO z89=d~18@o>{p$}Y?g?fQNS{6|n?o>(ub*HEy}8#f+&G?b)W;FOxbIv04>~P$&2=7y zsDzztVClfA6x_psI)z)V_4U*_{5gC;5lhKSuk1#L4+SHS75>hCTZSbkRnv(dYj(7E z-0hmt^XhM8i6FdTP0{=jvUEn^+}^98LJ8qG+kG%6B;XpEY&W@K;&`h;YAVyLnO zI~>g&obn}$S)gqK71)cVTOFD1OT@1&Kf+4cmMotdJr_%M#$@h( z)y|4!g1BC!32WrG0F3J+&oho*^*e$?oQNtl7~g{UV3+;u^8AMdBT1v22}N|wTAa0UANlutK)bBwmf60bF4 zb%$q1qZe%*rThr2Y3s{q#qbTUMlfeWbM6$fl6UV*i=!+dk@ZzcS=xywiTeqG+o2?i zg6h|%L*);NRVOnFo$JxJ<$WbPbhnVUu@x0RW|Y3SYy-M(;Cv(RC8;687f^&S(ie6S zE&fz(t=h|*l@ssiKTC(Ma(((xilhTlO?r?;Dylh?`FT<4Yv`bYF~L!^Y>BQ?iQc$r zItaNTmW#nH*5gZncTNRu|8QIQtd`|>2r3v>I&u|i)IpAfcpg|W&>d#l11zEiU##>{ z7Pt?Mu$2M$P&9cB9>t1PJj!!$V(u@LPxAfznEQXK&pnkxv&HkL8rBk3)TE6zjz&Aa8zFdm4J`J$v{D{*AS#x{nK%n6%q z=6*Veut0Ny5m2O(5|$>545TD`^X@#{^T|HYv2*~^w|A(0bOlS9Q%7-0yWcjw4W^(M zjtu~2+~{L@6pCZ{`s=GaLc+75Al#78iy|i?4Ax0ZM6Ej&pR4g4xiEUvtJGt+>=DF4 zTJ+ZDfjtVehG(PVX2}znq!cpV59>3fd?j@A78f=)Ra_^2lR0g+gFj`6gyx9Qbs>nC z(Idd2mkQ)p)(M`82z)KH?8@ww!}Jr%??~esr!%Y~=T^5_@Uk%zj$1()_z$?sEWCAF z%(G8B!#W+G(2qjHVQ&w*d)u&H2ww4?ApZY~g@ThPJ&%GppY{CWhalga$h-#9s}XR_ z`>?<1t+2O)VI?dTjar5_psdp<#q_sSXsN?xLu?LFU6?HR&@?0D@R<>a=pDs2)HfKt z+fctIM~h~k6lZ4SSn5E0?g-E5DewvWt;c2^!%0%YOEM`yDOYcMARQpO*fkn4;Ae7u z$)N-k_pzfqi3f92N(~Ik?pjrkuUz_U~OoOUx#F@(xsZ6ZPeYHd%?j=O73 z>5j77AK`Wuhkg{4JXX1a`&ybS_V?{*ar>+A9vSE zRD_GvF8P>&$Svjaz1_Tg#XT%0@&Nifs!@YXz7trN&)J6;!!N| zT>k_y?epxjIh(h67l8g280i1~Eh6++L4ONA1U|7j{Fp+x!M)nCeG^ZLyd-;?(qjul z)#pS0PAnYCRB6;0c-fl8d7;Q;PlQ8LJ(11^%^Mf1j&-ox zwZLcr^kOIIYax2)Qc|jhw>Ym=8oO;(B+RH?%Y8&$O%kKJhxXss;@V>OzRNqjvXQh8 zwtbg|Aa!KpzhTq-->@0fk9MIDKpf1e_xdr(_w8vY^nZrU%J@+}!Y#Wt!4HHMy>05;rqaM$`24l@>B&S(vw>nV+gf8u&`rUzdu)d7;C=p@Qwv`Q=DF^}*GPmYO4uJg z*7)WbN-VsL^ID*u!TGOeJlKXqnz`wXn03}I8jji5sM-FTGCR_9jp>w4_VY~-OOhYm&%L0+^koA`;E;9l7IVI_Fp*>a*s z0gL86kZ_9jp*WQcKT?r6+F#wdH^$h-q5Ba7K)sGz@Q~ULMzUz0I<_w^>RYg5xj1FO zAP{wg6qwvjfrQR5F*;#&I3G$?di0zvxyiGqD(_4EU_8$6l1fc3K=JIPG81qigxs=j z#NJD=iTGUeGJfLav14ucQ2VmadQFZvX>{#=*||mPm@iZShijGNGjp%r#8oylqtm2d zL5A04Fq{~QU}4N^4XZ$mvH-zQk|Xhc2^gJ)FYj2dX;NXd=gMbghzOUF5W2)d8I=gm zh>sXGWfZo#`%KkqAc}r$eZI1ABjT_8ps=GtuPM>4=lXk9Wp1OJ^pRTAINd5ZQ7Gwo zWh$mnM9t6mu?U5|Vjt^`4Mp_hGZodSF1Wq@b=cONHL2j2#cb*0KxyA5Tu9_|C}3lr zv@}rqt)KO-4^}%VZ(8%kejVf=wFL}IL`F*Q;wlK_zz3v~6$|f`BxWXxpZ@S`YDLe|^nkj29EkgSImNZ(!`7wegIF4196jJx@ySGnBE2T`jO3Fx!yz4X z8R3}!x=`p!0T(_6NxXUls4eT@9IDizgD_p6f zj1yezCuD(EZg3dkM9-mhR!r!UE+g@kGMT`*!peT zR-dI(UNf5B;;Zxm4k!bmRmFJ3kQp5Wh8)IikGAm449H*be5kx4N8e>OL&(zB#7N=0 z1%7`Ar(KH9pfbC0yggY+NdTg_4c^f6MF!x)x)|E0evJu~NuX6mk<838xQY_H%gIZh zVj(&@Z#csRI!tCeu6acWJPN^qMO=M&{ zb)S*5Kn2F?rSHG7htpDL>Tdbxwoqs>776XKu(=sX=M0~gkCaEYJhn*5oMIfIuth}_ zEYh?o=hF>LOMK_Jf-v?yRO5HSMm7^fKSzW{=SZYFLQHNeP7Zi^eElZK>@dny>HK-P zzjXDw#!YX>{G8(}nLqF}w4UtlHhD4ju+`CRO{iE1$EU=N;Fmj4ti}-5iI&>nswOWU zIDS;GBc7LWq`2Kp0;9gDBbX{eZ>4usk;$rE%@XmhHf!}rNNR?Lr<1su_tg->M_-0> z_h~Est8n%2g<)hAzo@v~Ub_uqGjQjxKOD~?HbXJ@b{6XW$B6-l3~RPH8l)boLX3Ov z#bNS06=B;8>Wuit{myrSXe`q7ipOsdinHHkQ!mttY`h1e-xZXA<0?`OQoZr>ao!#~ zo4dyvQdh0&j$h^avS;wltNFEjD+VS-!cI=SJvf!?c$uQf?{X z%kBuPXT}V7sEJ&=4a?NvE>=Z6TfC2rZi1eY+;ev!VTof?AE+vuneR-@Jd;QBI0E=p zc%we_3?(CMf4=5a-Os*H_*%>&Sqv->zM~ObJA<_*6f6S1RomDpj9{iRoBA~DUGDN@ zn=txs7={zC$9aLoS902E{#P)olKQWU;1T+7nAx?$a4+F+?Fl{BL74g$_LuPB{3(VLEWZG^El4we?uw zos>?o6IYSmHjgtcawV+o?fgX9NYB%kkA(u~oVphVT|h^e<%y?vxkl9&Mc%S9@gIN) zRP@=&oAA=AJmI9eXdO;Td%gR-K6>5gzL3#un-75^SiRn76ozv1vAJudk1>>~GFI(N zCbj&tT4_==?p%-fDsPf-9p1*8I;C7J4&{n+=!oMfZVwJ5%mw8*W$l1MygP*m9c1PBf29i9tHYy`L@zI&r5#RkgVQ{ z2{9j;mysPhhI3`UupK!KW?>pFtKHG~Rxf;-I&e&vCbj6+015`Pew#Ol#HElm?x{5~ zS1@kwiD}(#PBEY#E5b%*XKo@s7Slo^RpaMz(4Eqhicq4`9=yC@@PfLQCjrKyQ#nO@ z5go;Pe=sov3oK!4)YswXXnAAy{cHY`DTGRvH`*s0Bhxt>l~d=skOHEZ^qbS$z6!Uh{kcjIj^g!6W9;`nJ>`pDr-&&sd)r#vo;% zUHz2w)kYfcJjZ>MdRv^!cm_z9%D%HG6%r!UobC0zUPb2}sww~D;z7H(_AtTb6cl0> zd237~;^sd>QEClTvSad$i;1S*_nv_<@9vwFy1I*rq=B4Peo}h}mt9vcm)VL`Zq_)H zEUJSfE&@Cm^9%x7cc;co#yZI-HDf4teW6Zhmorno_bj8YC)c8kz~|V<5=Le+EA~Ek z@-c3~XvY(@kw8FP!&lL5vNLzxW|yD$UEYglHcofZ#jZJ)1c`g{ykMNg_~lKIkAl7i zE%;n*1csh0)8fsSl5!p+0aYxjJ8brEtBQ70s2TkAii~+5_K;al0k%I6hA{5qH@m1^?Z;~$~}MMi14*jjt!Nx4`u z=(K*{M8)WeflPpRT_U_}$B=1}ZicRo;Jmx) z6LbL{`dfaUPx5OdX=g$3u-|+A?f2#c@2TgOiA5qr zTwQu)C5}WgLfRL~iotWM)&0%oM<+yo#1*K|)LLO3P_$^B#rLgz)E~v-gN2Z#guRwT z9Wz5@97Rk>r$S577tiL@-RMBNY!t$iYO#;zwVO|QA8_kANVZWtQB4dJ&ykQ%8Jbnj zNrlp%&j>Mg@_-ujRnK@U33bfQ%`8B<;cBQplYdgeG(G}+rv|CVlL~Xc3+x%VuU}~f zoW4oJD0wiFPO*OdFe$K4o6O_Wn@4x5_JBO5>xMoE@&O+PC1!yLr?*SPUFmXZ-u#+H zD;3W>Kw7sLvof&RDiV?syFMATGinyM`FN>C&!tfksbnBRbEv%%IL_TiI9xEoAYLqs zm4zHGRSV>)EE)kzNg=BW=KfQT7%u8~%z5Xvdp!s^_C8pBJf7(0;S+AS3g*X}2)12` ziYGIjr!uL*6)2UiI*Y?Zv-POSwEYRK93O=Sh~+yxZ#HdLD3o1Jq8z)uQEsT=+17Ro zBnx8j76hXMVMxipxc#_-xD0ypbs6dIFCjdXDSU%~Bp_jgHZC4wU?Nq=v*Ic<}rnhRFOGps`Ch$XJ_cy%SMX|F_)H4i-GU_oEem=FEA{CNe)(pMHgnU9{OMl;i9N`$NgZlehG*qs zj0&)r;_Xm{{gM@Tjw;v`6f)y3Hjd<*9Q{^2s|7Z543{r$V%!LC=Ui{KRNE^J4e`o9 z{dIs+vqh&TFcz8O6?M4|uswTXO6_?;DQd!ShXmxadx25v%(+rpVn|K9 zcBj@vIOAXHxR&OJ34o?{_R;9hw-^ydi)I_9fO@9>Et5^e^Ng11a+LzwRfpmmkDKWd z2s4Ixg`bYFeLFGAvkzO4pqrYbH0n=mpQ!@)7Ky%*n=>33*7ph!*Jk7Q@O04t;n}z> z+U2aCr`}*wM?}A74AmYT)2bJF%D`lTT`IBy1%$6KVYC`eIPdW`au!0`c{Q)Q77)NB z%qscha@H!XhKxhibuN{i+%?9}e5FS5_iC-KhD&y^lEP;>p#8%RjRy6_*WOZiW42uk;n>fgRq-m5}RHxwO|8kmJ(5L z2uoCZp$;RoUwqm>Z~F*ViSOhLSu^P*o{;cke9)6q4(UpsgarQyLVa+_SMo7Z= z$dljx;cby5cf#sc2PK+>%!ivR@G)s$ds19ts?ifJg&hX%=c`}k4@MpX&{K|64w|PT z1kxwS!M9BPdE3yZuI0b6KVf2s6@~}d`-(p}N7Cyp=7dB>(FSgv4B}yk@MbIu@xhHl z((i56?CJV>yt?y`N z+;O=D??F5~kV=SHgYhE(6b~uyx>&1Es0R5OCODLF6JOpvWo!_;39*tVioapDjFazq zPTBP13AQBv?0@|hMm8@#-QW6r|Yo|0F=F$@^!Ub$jUJ`P<$w8;Wsltkp@z$%n z{y;VTjYvOY6=3yYS1m9NF(Wb-y+-fIxJgnk)MG1L^VznYm;aXYX9+drYJt+RjDLTg z z{Aj;*-|=(fy*|lP6GC|YH8IqyBHijS)yqjhfJpZ zQ)TS(uOpEuk6B;UobuB z@v6Ckgcdm5s3WFBU+ce#i6_(adO?$%7q*8r4)5`UV|3I80rdS!Pga1 z$HRM!F9g0(EWO>2xC=~a15HxQKk3m2^5@hnSg{YOfeYENcoFrnuF+sPbI}~@h`92} zl>%X1mX2)2$us4cD7o6$DMF@OmK1oi>mVBQ-|31NooR5!sXqQDSprigqPN}i#9Z{# zJf)?fq%qDWkj3~@+O$xm<>rO`D6KZce^3(~?DnW6WgOnZC^o}3m=aBXD8Wo43CSg9b zWU+(KYCB_i4P7X}t!>`2y<6}2mqRPMmNEGy4N}xCWYc~E#qO*D2C*x{%<~Og>p}h+ zQ$%FxV|-+}Up3e_kA0M@b=W>D6`wEZyXI~mun9;(Y(X}(Tdvvbr}CxuDTYs!(VBo* zu(k@^tvAdIpP4%@i4?V_8JV5*n)2jU&mOY@!R`n$Q>ojAi*om8FPr6@AHDn=TYuFi z)QsCXb`5LP|L*zx1erJBufpC# zG99%Q@Gkxmt2~W8*&y#Kktu@jWtq+h4Zo>QtVz*0K?Y>TqW{2co zwC3c}nFpGye=DG2j=BU2>Y%N%alis>Z&tf1<3JHc7@Ln|^@4Ei#OYLqBsjrTRZrM0P|boEQ3;}-C5Y8qgd`d3 zgIDnT!BlSJ8#8}ErcVU8t-8EeS6kg)YWwUdQSLoN=6eA$AwP*q6AIi{zbD>)W5k|G zuo2G;8zNW0NhhR+>Pco*EB!?Q`Dz=H&<8nXs%@(=S{p@g1W3b9&}V68|KW#~Q%;k2 z(Blrd993i#xFt)4JSS7ONQ4+YX1FQ8K5^lF+5fuld-IY359Jk#Qfr-zsRLp0^Fm>> zWSVS=)Pq@oSrWm#xytBg{@jHKS$e;7p~c8&r!0kj?mG8dmd&AR4f$Uj?DT^KD55dV ztygn0p#4+PDDdav#GJjm9q>B;x@ma#9Q5w637*Tc44(D2wDtF|pp__DAREY|WK466 zZ2g@e$sVe7q&xJfcVrRmPq;vEyR2{bQPG!5-#i5IwQd0>k!I6~bbIVWjm73v<dMNYE@d<`Yba+JA z{}Cs(#}s$v?H2AOQ(UPJBf*D0WN11)Yxl^8A^il-0c@BW&4O~;6%ySU!D zdAf7U-4WU8%{4=&D{{Eiw~fw-CCbPt@l4)-#*P@KP-3bH*;piwqt=Q}M)nt{hTKRr z0RWu2YqMIq-zy8>sl{PaQ?0yCA7Qr&1BTJmcJJP(nBt#M7rWF8| zfma^Id#a`UJTpEkyrA1K)a+&31vsJ#voff486iR9!$)W~v)v1YE@hwC>kd!DiyIW&ttl?1R#lgVodvp{fXw zR3jk84HQXdq`M;6d%Wq*&#!4CE)_~shD*Y%(X_~Tp;7SU@{FkKJ}G6J^vY;Kl@z@j0e@!K$BYVMc`7mv8Lgx)4w} zO2qxp9ez0TR>#CuvF_4C?GM_G%PI?i(=~TtLfW4EcmipDNvbe7z`nAtt016wtO$*w z6aLt(|MCv6dw`1oct$}}YZ(?q`l%Dc?$M&P?fg))?nnCD@*5p(w4u%2cZV(gyNX&% zcfePQ1FC&|wBSLD5ya}v-CRj-*5ZwBsyL0)2Ybp}rYHwa9RtOYuM)fGPV-R8PTNp* zuKZaFy2UU|@q*7>2dKsRZTG#IJwIN(3J?#)>wX?FJ~+i_0R-HW0xW}uFpJ`_20vTv zzj;t?p4$#qzg)wO2F<|ehVpy2+`ceLaJAOYe=7oM$A;B$yz=J7*S*1!Bg)jKc18pe z62D%pp20Kk`cSGQdy=94rSdEGQT!*;`oH46ltkvnT9qe{8sxRToGP+tXCl<7+lvH6!uG}G<6R(%n@9H=M>8$$Kso&m` z^GAW1E?W1gqNr>6fOx6KRpC|Y4G{ZJwr3tu;%-n8Z<8t$O9NjdeVDyE1p4zp)D+Zk z=!Ppu@L1EmFrpMT-i_IV-#c%{ayZ?x<~d>pwJx+~9T%=bVp_VDTtk!#|Nc|^V=as^yQ-sbCduB!s~w=ez| zZ*SogR<~_?CIokP3GVJe65QS03GPl{2X_hXL4&)yy9W;*+%19Ny~%g(J?FlzeqGhC zs{e+)*IILqIp%MyuXs=dve%lvv!Q!P%;Pd*&j}Xva7@DHye1~$*J0u`3cG<#;`UHT z*xR2Q4pE*G$mUChJc{eYE_cp8sx0`%kED_u2FNjH(Dxa4YdcN8wV$AYn0`(c4-pSx zH`4h?Vs1leP8dVDS&4hOttUZviu+qXKYaeCm)Q*^T|rgNh+Vw(;o3xRh3lF#eFwUp z1QG^uO0R^)$wn1R`V;2IKp9zdt{rX&barPYXAN%)T99I>`c(q zIaQfhlUuHc^-Yc}G;RBvrfbHKoBGu3bH|b5kDhruR53@>`;`pmPsbecHBtkbfjQgw z-R$ZSQ_;r^BF?|ME7|)oIPg%=#FIVQCe8#4X3k9lr@KRXL(fPcZLv%g{2SDexh zv(t0jm|X{)YN0E_z(>V(ZUK1XD}Mj$2Wf+~|JNVmihC7eQEjC;?NAIK{FGsPH^OHZt_DH%L!-9`D$Huqn#syxt0MYMClu0F-o3yYuUc# z*9EJV(O$``=}%M4m0R-6+rJQCJKQYTtnAl;-9Pc84+KF9j02Aau;t?9 z+lN-QE|D{;Pme{k-=#kK^ z(@G-`H9!+(J|`pI)BLK$Z~i=iZo8X&U|1n-x%^Ed4c~S8YfhOH7BM%$aelPhY|FG@ zmiSw$st>iLfhvC3D^JhEe5SsAX`gN3<-So!KB#>dq$kdlFXVrG$5_kHTI3fnfdK^! z57?nfZTzC?*Z3?0ZzVSbjYu0TV~4S1Y$NzpXEZs<;mtaJl=!ehpypSd0CS{@&c+k` zfeumO&mpKfY`CALkf#T;`{L)qldY}4sUKOgoXUU8TRV1~dR|G7KBeZ2O-1FbvfPge z?qw_Om4dV1;E`y3U0No09(OYz=hh|zaN;-$B+G_+6`@|e^8A%(_T*)jNwAkP>$4{! zrEHIcg-4f4ecnYrK_`rs@oVTQ`t zar8gLK`Goaa599UXfYU*1fvXT^FxHMNq*kg+!ucC^FgqGy)iN9T1`IGj6(8$H}f;M+A`6*=( z_fXUUh_fyU`gI1dCx9;ExKen>H<1`wni{Rz8;pnFeikbF*n9*m0Az)t&BHcw{48Abj9W#@01?=<1Z2kJpRYte)>Hj!2o{cMz?-u@gCN z8L2{x*zYw{7}@R1_eX6rejReG3O0tf?uh|K6WyQ9j=dk?Wsd8D|J|V$jlj77_&j_+ z^fQ$46(7Z+uG7XJ&75cro_Cq@wihN!I^jcYBAU8gXxuYd1G^0HcH{nplpmT*63+JbcTZFj(I- zS?Dfg-SkhuqNf3$?JLJd0Z*n5bsD#h2~0Cf_WDwE|E(EIQs`xu&RU}TDb0T;QAQ}*GD7*%MS%kj43kb^r}|#}#IK0NWUf#R zP9JVNTJJO5G#FmmZn#9)=|O|m8~ZzpZAd}9EXmX15@ z>B@y}j2PBghOKUyisA`V7EGG*&6mHTi7yiG{HzNt)c@O6w^s~*WS@xpK= zB^LZI2%$6Wgp-5@PLF*4uH80ETUP{66U&EFrE#p&U z`%2f&xk>A^dlxRY&W(8X1r+q}^Y+$kp9|jOdUst>Ty$YO-?#vP0X0%ldG;G>*t_jf zrQ_Hf1%|YyWnMevLak`l{5Hd&2?;YodUUImwv(ohT1gpM`qfal+;N+v<`*GE?*!lN zR|X=wg$r)moPE}_56qSNA<1aa+m0sFM`p;>U;N|yB-TKr@jgShd;grK%@5sUs|Uks z1L(+gTK`OWR-PN+)h`s5F^{?sJLyp^cG=w8p7%41dmAoij9B=T9$elBtnLkk;|ktM zFF#Sz$YN~gzxCoA;kRx{W%MqHaS4Lof4v?LV2Jc#;R*N23>}X9V)}#SZk>8~A_MY8 zFP3Tfs~1Z?9@%7)Vv6*ILLSpHTIP$i1H&Km^!^C+Nx{>RqivkiDkR??%D0KF8;3G8 zcMNQgnw^hfgmPf<?Avm0q`2?wlJP2(&zFqU4(fR{N zS>Os`s({`{6*8=$4bUhy&#JQF^_GWQM(~4@S&W#CMOLHse(*QEfZ18aBG>51&p@D& zbCUEXAKbP^Xeks=kqpYC_##Kdfuae)tmavnTTASB1k{rl0Q7CxT~^m%$}Q!pY^7y~z6N z0*B{^^C{6V7M?uLYy2;UWkum(JxEp#pkB=3`0V+j7t0qHm@J8W9XUu6b}TvDCtA`2 zztM6fXZndfo0#SgDMlxi`gqA#H@!{vgBZa02DbkVv)r{n6v4_TP%j2hq>>PkWjAbT zs{Sn)LsNExg0Uo#e-tc9X0SUgBwv@+&UFuvB)PktM;8z>|P(noC~nYRbI$%kR_Af=hNY40$9}k!D}z-6uzp>_*B= z8HBz#2TV~}=T}v)CQJ5~$`4^O$4WDy{`A&hShXs1|LN^N{Clo3&_G`TBQdv1xpco< z%dQ>{&p9ymomz+=LGR54{tf0l%%r@Q*2amvp%x_&2o!dnW0KQFsdCvy@1{=cbc|Ks zK0*vC=wja`5)ed%o>v7iB!=&8+@f`h+Ild>yXSxAi=ZP7m1nJ9M|`-X;aVYsEg$Mx zHTCVp9o*{IVn8a1#Ua~wj z{|387rqYIM>2zb>)}{ptbin+>LR-IG;?x@Ofg|OW#^(VK`^Gi&D!iU0sLXCY)ZC!X~@n!jTEZW~h$LB(d z1b-fd8pS}1=q0}B=d(XWZ4&u}f&uw+J$$ug@l&=z{8tcr0o<6tPp(Ul4l9y5N#{-m zefF>Lp8nUDwLjZ)PF=L#ZHr(?K@fiO=Es#me#aVv(a-}PbwVH=`G;C#>TZl#|xC6N= zQX`~+N(~iU>DCmNO&-yzJH&gyi_H-n+1)$L_=COiLwQ4_U^i#Qvza1bH@NJFrUB&s zj`j_Z6;0NCR|f3L7gJE3C~+}mR^yO)Ed2H0~Q(h0aUa! zo0)DgsO(s!i%AQKD|;FM3gH8MWO?GP2e8kEsWIIU=-IrCGTnr|M!-YiMQuJebD>Y@i zi$5hm^2yb9wo^#)TP?SJPimO$1n{Ten%1%oeNj`DJs;ckYEfGis8O$EL;s0(#sDYTw;t93JOG+Hb2>CcOFxvh>OPo?`GTuoBhoN=pXZNxqTv?!1|2Ew7R&-; z+S0P4TXS3y^zRG0TKsgZp)!$bnY(fQrCd9@mGl>WKgraH5&^lo(snPyYR%7A2VV0q zu@cV?MaTqkm_CWqnUgT0>xAwfYZk%{ZrZM|D<)p~Q>hqsAZFXm9kLRuI^Y|S+8?-* zk}7X0U4<$2zo$fiPQQQaVeD|`HgOtbbf_`rt*&e!1}NC91EkenrQMfebWzC~rwMQP4=m z!;B(+bI7|_QEO_?*I;qHl6;ZPoH@WoLv39rN-#}?FH40VXP0hHgmlBajp2UMDyqvA6$#@b3+#u{R@3m~rCLYGI%@7W+0R!b0`85hY7&Z5d^y?UFte z=FYk`bKr+r)g0fdor^{1-3;=^O4V<$QY^cwKUIC0s8=6lLnq=%ily#X5;Tnit+$ z@+2}}RuLIFmi643kwNcwT@wCU&D%SMl!ZioP!E06D$Si8(+`@qk%0SG?4|?jJMv z8j|0BIG4hoUe_$&FSU+TE{rH>P_xd*ujY5)TAuL<`6kA5{2xHZ-<|kG$w{Wzh<4BaMD%X@9p4%JO?&pV66$%A8cOX^h>`=*4Wq>9>DXU(%& zwnB>zL-q@S+{j)Zmpn!lg9Q>}r0Nq?gZoTFV}?sd?LRhAmH2 zASG|9X5&^dpcI&F6WgVohiWRAG7Wz-I0)f$JUeZ{A)U9LhmMykTZYT27z_Uf6+VB8 zDs)|(ih>RX#vUCKgM_#ox0?aAh^Q*%V-t$$1FB@3Q~}#XCu(}EYQ*HD8d|+Jz|(TJ z{@Z&z<&oZGe zBNxvhsYjLmE`_%5AwX>kx!B%j7iXGpzPE#EGje%VX(E!SpQHN?_7Y;-12T)9YcDxw zZQj*V3{k_^e0Ui6@`lIESUXRdV5x^3o@mIUa|=Di^D7iJwZ)9`;Pio~p>L@|0J!yR zo^Wrxa;HvhGbMc(Nc6*^(8lq1g*e$r>(}^U)zIz75MPMIuF+8-Sj+k1E>eA)`9Ig6 z6Jb$boN#?+jBi>lUX{P2I(b=te$BuO{u)q!*WxkZmrDwKc?5ZHMseKjW~I^MjC+d3 zVI$`ls@YosHH#LFIW9B~kr#l@ebPtAjt4UC;X=%rqtY1KM+c&)K8U~MlxC2eQdF3# zXJ(=Gor;2+k{_nY(BD(3HDgPo&fD$hA>%_MLD~~=2>Q`L8P*X5kt-nN& z!7@w}FQBUCK!I!UxBFW8i&z^mpm_QkVuA9`LrtP^rdSq`r{6}ya<}04OmO(o^ zU77dfvO-pprr%7Nlwo!gXR$fU4zSB0OEA|Vus)!?`hCq>YrShufn{|VuLdW;WJnDp z{s`y)93y9OyzQ?}w+kJt*8>*SecCB@w8=~sk9qx~}-Gnz^K zRE6CdZfyK&MIPM_;gQ#5L8Q>nR$G|Bi32I&ZysYi9FAQN=qSU{*g|{ZEe>Oj6`Gq7 zOm^h({isO=)sU*a>0%TT5xlEsI30S@%^Aw8nFmXT+FF8G?gM&M+oSbPUwpVsYNIMS^&z1SOkj zswS&d_FF9Ix0sSSa$Rfxx;rQj6~)|7 zXFyG~e4Zrw^xpkZ|H_Ep28B3{`^2u5y98n~E+4+4P<`*ZK@@@~FHsu2L6H34IqLtc zwA9{d#fYq3P@bVcQcfQJhHMVc`fP|*Cvr%Tek=AX`gc{O49}LEdjdOPBEc$m{#lIc z4Rhz4NS)Pl*#6`FPuC_PC)C9~e!``;0Cm33TAUF&Kod>gt&Llb0Pp*hQv#n}JLfR7 zNV3GiUL>%-9_eHdsk43r*StUYnlE7H8HYX|SdE?BM3jd|;c}gK0-NW;ClEs=y z|Lb)41Jr*P6@bRr8}wF8Y4U;+$b2}YZL**UR1_c0Fb{W_s=6arTV@=!+nZ<{WeBTW zCf{?{0cZ1xYQ6=lV%!K;=_c{>$T_ka_Et5E3Z@6Hcz&@wk3bghp&1r~has-%M%=B@ zh)ULHCp`WUUU79(Hr(x`Wmy)n4`rt_^zpN-^aD!#aUQH7?nM0xQ5Uks{dnPC0k3i*nRbg4zob=XFk1U4! zMcH%(?wqyFFjV0zr(Y$1CPboDhIEqde z=Oxixr5exDje*@>-bL{g+rLE+@FYI%u88TK@1LdVDHb_!gSFtgI2ktB>;G$^{ufM8 zv)I<{lMESPcFO12Uo579OAl?T2T+|5fD!O2^WVO;86Z~j-HW9N zy@0ul(YD}{Y$RU_2?E@Qj;khL){2;ax>0WBV~7{X+TynjoJ zAajddxWlbC&!MpIL^7vPjXW|Z1`f7EJ|T8W;1Uskir9ZL0uv1ok>bfL3WD*A{ez9o z---10kP9nEp%#+OyaGxvGf~K~2PKXmsDe`&I(^;q5h7C!PpxEn={X|4+NQ534Mbd- zsDlnp(UL~?6Zv>1HGH+Hq%T3>Tux+SkztcZ#E4^QiJZ%Eq}xr-dVg3|R8}_4W#A8? zdN`^LLJa7BBnh#t6+abJI&PGEB}`lAH$Ul{w|=mSq!YzN2=w~!?kbl!L5+~IoyzaT zCc+?Wxr}MS{a`0OI!|?7e?%=Coz-|R^K{ziHQZyN((Yk7r0TA4q?;)Rq1XG2 z7$pt3wY(SE9jo8`{Asu!Z$$23p@1VKGb~f(=U%(d#9DOWDZdQIPVJ$MkzN#*F;!I` zBgLnTfyrn-Y;E(Un{b6a1SvH?l_+_wO+tGo};aR&% zsN0$W>$?N|8vSW;u(EE|6+)0h4EM*OJnlWi_O|XFlUxX#jSQz#TciCR?;}H9Cr_NB zwEg?X?rfmOCW7cbxEhME5W0TvKIqd|goGdY(vo6FCN_AWA1|fH_*~Eo{u;sbCJt6< zfTU!`dI+S*yDRs$fKO=|aRjlLX0h}Pz=wzXW!ygnG`g8nSh&<(AjlrF&4)dc( z=dw=__3HmPHM0yhrHd#Ke}JqxIO%m7+i7?}H93x+Iw6id3^%ex4F7+l0UZ#Y? zsRl}0Zvb=F)$NoWD~YZYxp^bT!BFV($BYq2*tizXUP)2pNrZFSJgbtV$qV@HV|y6j zV%H_Bz46M52VETPYsbvJ8{zsp-B*pBDnfIDJdjibXeJhyc9@kn2Yw{^5w)o<)bEYF z;uKjGht2Y$(30-m$WVe-m=hya@CRN8hAQJ0_`FfshJ-v4gZ(ZKA+`0nMIPV8NbY{tNX{~YW#P-7t*p*lQ#PtGjh8jAV(&M_A5V_>%lGBF;Z zgoH%@Q;hHQz7V0|8SKwk2elF!=!%ulTSc#`A@T-9d`}nu;a)S$&a5ZyEe%G{W3H>G76)DaM(jIU08uIo zvnu&L7riIvjXj3$qeCY+jSpz;OpXZ^0rVG8FjVz#imIvMH_ahSM* zY9+;@X2Gw^%qBCGVcVjXbXKSB1p8M62U~V$>}(9C!ir5)qu-pHrH(;oL=TLjsjsE> z1>;kp2U=>;3zuQI5Y4YeZ?S~?1Dw9I)VtAKZxf6}Sa8SyzLLdGb@M&hljRPKP^~jY z&+%TI?Ue8lR;)}4$Trp%#F{v*?b}qFs%dHMWifs6rKHDpvh{BaXr}J&7_wOTPKf(g zq-AL*08D9~O+*7rb^6nAVj%**}?KMZS zkX=Qw5RkU(Bj%;|s=dFZIr!aC8i~uONY89x*8*v!kajfPpv{F))rj$c(_kIWIt0bV)ZToPc5*cI zvs|++^S!#O3=)%by=S9WO&kW;n>r*=W3SyV;WeA5Zl~n1q-A7c$YeNG(ODp^YcO!C z01di$i_}7zSopV6U4qC9mcU920~yHTa$AxISzL04Vdl&Mdm;oCPmkL^W}bcYufQiD z2>q>tp5Nf>=(n(kwIsFgQggTGqwr}&$I4Q{Wy;pic|=ZOBZ>Zv`))XbW#t&asH)jV z6y*TJO@ImnuokWDaKEWrexYzZumHrrp|30fw*A%XkjLq=*SQ;QucNzHXC8erIda4| z(XG&2TBisiuhzH7EFK4To z;b`GpM?T_+{iSdz@yS~bs3N`};23d!`dFAm+ZEVOOg6y(h%&Mx=iB=%>+{Wz`#}YI$6HZ|Cc%=d>tv0?%0+Ml>CXICLOgFV4(Ske1B&N~)!d#&2FkD+#y8Wr< zU))Yp24|GBra3a4GF3tuklQ)WdI5U7D#7Y8u6b*s3*dSa*U~hE@cKPO(d0PX{YXKE znc+i&0X%hyh+&vpsSu_J&cyTcuC1ACKfz}f4(&n^-&)db0wduZ9PW*PpRE|YCK(Iw zDj8tmSQolE%*WK`vck3#HXS}LuWXG5*f$(CUg)jaxwCn1PKpb9T>fE5KF{VkapERP+o~}*Z*+E2;IU%R*IAPNq zr9j1^?=YxwFxs5NSS<|qF=D3UAe;1o5YuelopR@oRKCS{?4Ch*9bnA%N&Q{(ua3E+ zuuG&ZC0B_(?!lf0BMcD5XG?Bh<@ftJWmby=P$E3z{K?)O89r@9r~-;pa+(FNFxGC# zM6?Jc)pyUj{xX#Qp|gYh91>JHO}^khj$-BjVT4i+cw?v&k^Ff%Ch%)t*hnbKJ=|o@ zeCM{cASF5eGckFa)jDYR^`P0Dp|_&^ia2FK74^p7 z+De~G-yWG$i>h6jbmC3z#V-TQag9gDbYh4}V;luRbOBw6tKV>hVC8u3pX0fQEA zp4j){LG!N)6tRvch;90@zgIMHsw5Ma4^{DM6dfvF{v*1u-3JO)8njBAHQc?_U2)By ziPju~bo^gL1=1>I+Aq-T(0xr^&`UL#|CGK>8z*^8KXu?}B3!@mMo9+px=*T*OJZw~ zvn1^uT-8jFP-!7y2x-)+XlBf>s_!3j6u8fNf7I`tOJXzK-zZ1xEBFd7B#oARxs|1< z7q>!{fq}CrT|VMUCSd)8GpM)J z?ha{LJtB1ka`UV4aM2~e^_QR=LI@XZZzlS&Nmu+4myOD63+WS@3wf^_ZC-Wn&W^#(-fx?R0vy4nemk}%EL9!MN5-5V~2<4f<0INx!WR-Wg$=}DZ608K+HP12t^oU@p8r}XCPy!c6Ou+=U8dq_+v zhQ6gL;}^)|Ztt8t=-=57&a_n&cbnzROSDtd^X5qBg-eL-Ze()eZ-?*1nMC(keCHu& zavTA=tFt*}o8|((&X>D$p=yYUgLdBW-ggW!>&aZ8o%f_+wW=z&4Mh05frgH{&C6%< zGyYLjf>#~19O`hWe{@M>P6H)TvbxR>G9tV11}95@l8OuJEs{%}YUY!jBWr#vxnYdDf-gtDxKAdNF!eV!hXwk^}SM1akvW88MALH~Oyp zCf&(oL=c}6M>{BTsC3Vk%m)%FHa$KVR+$gg=0TpW2-F=Nj_(zXkq+M?-oQJi7)tk_*Ad3&ZU8tImJqT{8l=h$*oBlw>t_U) zf7zV>`QY)~)R~4}bA1SR>zLYNL*aR6&V#lgPHQzC^@W%X=@G;uW z%Lgh%b1A8c%3c(Nu4c#*f7U4+;Hdj7Bgq>Bb_Cr7z*TfEi>}?eb|scZ^UJZt$8M%$ z0wJwFX#6DF4!6%)H$y$3L&h5K2fs@8d9f(rnTN}}%){e_vXO5^l%RqTqFEN?m_Tb{ zT&$b)b}ogN!6Rn;G!I3ALX=I;$uj7hL-Ql9B6*jFxV~olry2vbDXS=;u(tK$#ADVw z1^o6QYk$A}VYUBY1xct_42;sUh zoRrdDK`{d{oRfz@RXRCdJEP<$0T~j-6djJNGm`vGp0?1^O-r<3OS)&qsUFC{T#Xzu zS)9Tk>B*bKKM42#Ig%0~`){b;|9a?8?!H5U;?WNTxYq^Xp}gtv$^s1rhFp zks!hyuT%>#|Mi0tNV~=5zNx+Dt3tdep}_5aq!{zm$iIn2Bo`kbgG#$#hZ^H z!~MY0JQ+$msUFVp8^k62o@|xFYz1_iP%CSQ;ClGRxEJnWoVKoH`yHx)ehKRwv@2Ue zv%*=vJ~d96A|V3!{NKU7Jpb!ZCWddXo|yL<0UaF45-Ra0)N^vvdV@@d3f&Pc=mC;@ zvr|z|IEE>^bkzPS|EuSiHnAkqdAPuw>357DHcX(1?JvQNr22zN%P3hz$4ap`nDD85 zOx+6+jG{$ol0om@l6vu+3ih4vo8b}?HOhL{)S3Pf%szenH7rI5e@^Bx*H7J=BXup> z4iN8Md$jpZvVOyK5AGiQc(uu6{~_Da)!j#rT#hH#VI?T9PEHW2wWFa|1HF>(m+piR zol(1D@MW%6V5nfwt}b~JNt@f+udDhm1?1w-KWj=QdC+~4SIy^>DR!C`x-9x*_ei)L zZU*w7^B-gs=e_bj<#?zLSol86xxV4z@&XDMqLTF|@Ajx&vE?ua`OFpzla*L`B8})M z0fQ`%)x7x(_a!HTL{e>+IqZFWX90NM|AX%zdqW2obfSJ}MVY-EEX=Gdg?ea0;SdKx z+X+YAM5h~`JLI!>a_#C5?z$&<*t6K3qgOlQWTYhhSqtI2r^Txm$HugCI{KJ+%c4E%sTXS>nj`;&fa_UyGOE5s34Jdhl~&>I88Sw%h)_M$H*}zR(K(l(0Bxr zzR~M9#MzY1d!L9#^K-XHZEz~pG&Bb?SBI75i@p~LzgJ*rt5uKCt(A2eQ^b|i{@8~t z&#Q@D7yO!?{u`@e)sLTK5xH9x2b*$*m>2q79luj%e) ztaXU4ANm6?W|}Y@YEy~QAaV3ACS@bp><7{xE-?PI+vsWs@DmSar#&Nwc9Y##A@{`8 z&Nn)>dYvF7+r72>*MVRY!lyGwE+RSN_Vj6w?f3QIGHhec`Wbf!3eean_uUUVNXA0+ z90JK3PJaC)euSw#v^8h5K21g_;i!H#;bUgmm`#q0a**a@75ozUNoM&7T4v{*OA((1 zEMIa0n@KCWBfs%5h*ljgWFX4Ijm|27hf!~_A{ufi)ls03Pb|3t(cC|(I5Bk?+>@}< zJ|0_RU_sY!wZJ^`02S=tj34Ti^Z55jBC4H0!#)x!>+S(CM_9!Dr*a$I)seFY`I+ta z8e^}+f$xmp`0nHiG2=ac$`~_^ z9&@CO_dF<4q2lFUDMxV0K!T&S4H$vj)xAW;=c0dzK3$3uSPSl-yf#rYIdmu(+xI-z*zO+fZ>1`{XGxXhFTRiQ&a06w#klRI;50}#WwfrPKXL0 zUt!(k;tj+y0L42#xuykDeZPTClnA%$;MsjmU7gYDl@Xpx!I!re9o>ZX4t4g`ik(vs zL3QRZKaZejqNwtPU2a?!Zf8$9KOTs6b#Dy1_!2XlZ|$78TspU<=nV?Q7N82?Mv0#c zA79qU-A&~>Kq!>ENFrOkZ`zD?vC=0g6_6x6PHj-d1Rlvau2%1xh02iIcI{O?3Oc3x z_S;$A4AATH*8{{?Jjs;(yz3+gqRC2U?$*zR(urd4$MF)cVty+mq65io(yy5w`Qj1P zo+^Y}HKM^@1DWbpQW$|t z0pljEO-%Z6Brn|4b(OmlelJWss$eWKd`%I#oZOd#nr9>xf?7)Nv1U8~c_oo)6@6nd z|5YTUG55+#VB#nkUl-Hrckzt}EikBRsXARHNz^t2;?%2koyL@K{`le^n0T$2N)NaWMOYE16j!Jg#oR9+In3X>@tTjY(^DJ_TK zb-B}7x#XXUAsycPhV!Gu*@V6Fm5*+U+Nr_}%(`EX_ispbEknE4c~0C(W&_jPTgIA3 z`Up`V5!4Yq?}`oY0kpiQ2-WF&Yr}f{VT-Q7Iib{o-|;5qX;o`94VrfD6{}tYk9Nk^ ziZDh^8sQ@0a99Cbnge3pD7ZC<{>%lhSvJ8ezp9~V@}sX-O&DH5R#l!7K&%WYI?zg*T2jn{nW3#^M@(ChM|-6$t3fAG+X`oZ z^Pdm^DtX2JW&Y#8Dkl*N&VTIq$B)vqGE{sALJIrfC$=!1)ik2EPgfTkL$S zcKlmMDjM}}+;=X<=gXT;_QH8JT|*?o)t;(@OBeSe{r=Rm8(hc;)DbfK=*JzfLXtYa zUdncX2vnU{9hOz{GIX28kTLH6%zv(})hSgJA?ht?@=`I9=(oGzH&VDe5(G6kG_oI& zI6TT+Nkr}fokT+tDw}T?>%zVnz=@Ooz8v;d6DsA*nm8S3+)_F-5+sr(_F4$oG~_5% zIS4FLQOE~CDlR3Gwo%=DL1L3!#~)8;zMDddmHGXG{dUaH<4zzuSykhFZPu=Yys#*{eCE+x1CB$zM0+C9AldEK==o!LXbHN|{7ki&7K zNUXmdxp2d9cVag2eTgQ4SX{uCCOHz?l$EAwLYU3?tNlR5o5tRAhtOo!m*ux<5d^vi?x zlJ4LUvbAY`bFLs_0E&hFr?RYg`|-=0!-YfTm753fvTCk zG`(><75ri@i2zCZubOhEFu}z;x5-5r%pO;J%_#Jx zZ2~cdi_14WsrLp)pLeHOeK}R_M4tSd_72^US2~$ie(n|x zyF;5mIc}StLPX0q=;R=6lBle*?Ux({Vyx5v_j!w0`Xm|9Y?ddr71`873p40H&jNO> z-3musZt|!aK`*U(@7BBHf4Ay2Rk{2xtvbg)tvdS|*(fH#D_@#_TJ@ah|Iw-!E4_iT z1u*jVq3f*)bl}%%Xej7Nkh@i8z2P^PiqVRkhuPfv8V^3bM@tTdt#d@s+foRJ3Glma%Oov>f|}jp?Auf*Sq@9 zZ)vNME1DZTqCkrr)KL<70g^wTsB2vMHUNYAV{3E}ft_V*t}BBc4Fmatz~+++gvr2v%{J7UI)@$8J?*S|XT|Ek&1;bQ+)vwu(0&v!xt{#~@=)LYDfYVDM=qK@r( zz)AH-{*SvE`2eX#+)KL3-%6l3HN9Tc#~1%PG#koF3QSjNXGCvpqcixvj%WU{u#@fX zioq9^_giox8L^g#T=7poV{^4^Bg+`nQftvQ!wIkwX!m;g@XOV`I_w^;#5k^i91@dE z{S%j0OPmU*)_drhBdp z|Hs)9V?ufAbdj+cYmU51wASP;Yz_hrn3;j2Rj~N#Tm(#y16OeIT|aeAXXI?lf5xY= zNXG>u-(us(F+MqOKYKfG$n?~ySXJTut+ z8{9^C@A^S=f^X{VCY>7vEZEV70(y8k&>i>+pRZe2D{RihdXNw*=Z@<)7G#QPnR9!< z0w7nHR2@g2kc7vZy40y}qcrWB5(a70e3FK}f*x-0O`JccNS2Sxci<`F;#{oc&q%R) zIW=3BQ)vL5)UOZ|yLT_udWBn(%3@cOf$Tq;%sWR-BkBJACbIaN?XRU(V6mR@ODx>X zSGRr+<_`KX@!<^^B`d%DH%eBvAav1E_(N_9Bpj+_ljJs;^g2WL4?Jr6@`ZW*&qe2F zMCp*!N@4iG%w6}9-sEwH^KRMdJE_9rtw>f(S<@rG?H|^vSHMp)L!h!en z1Tbz+N&F$}gFJ$Z&s^r-Fi-W7EFAn_eAn^K(RbW2xo2>ZP+|xN4;k57aUF+i3-V6T znWx7{U;^Dow{JC>jxz8vD6AS-y*cD0WGz*n-r`{ZZRX{>8J9d*xOp5uiaCkMCLk4Y z>Vlbo?KCSPG>E5$t_%a@sl*&@4Qd?)+qWLDX-Sr$Wn5y&LO$o6Ly!O6Wsd%I5!+${$gH+SvbdPMnHxya?}r9Z%YyrOqVMJyH~l%J_o z_fbFjd|kNo#NP3+_wg7%OC_zj;Fy!`i{dGjRmA@yJZ2CplGJj&R>6ZnsKJ#kZC93;9IFa{P)Cu_mn8Fn1*lJ`Y7lm5~GV6>#pL4A4A~;-kU;I zirt2%I<4~TdKsGJE1W3)tT82SYwHS5(Uq#y-N}{Kx_-}o>BCeWoS7-dQcD(PlAobq z1dJ~|xmS56)>z=Y7T40fsQwwV{iA1yKJocW@~HN$#L&L|**a?OD>bIcbj%o8%|N$S zq zlI69{d@%_bA8|zj_vniz7>;Su>x71kAR<@M12!CqpfUi0v@}AGO-3M{zsc8kd4n~@ zm%lYd7WO|g!CSWfm;KS&@2QQ4Rz>M=h30<#~myL;Y2P zLoOacH82fS0}IzqUX);bFvN>sW9kO%Jr48X{+1YTVYAIihL=Ke)J`)AF4jRc_#-uL zBj{K4oFCJ*iYQ2>>$~itvxu2QA$v*YQJc+S%AqqAs>x}#VDhvVtkIK;hKf)03e^-X4G2o6f-j*RmJy01+gdH`# z-|6^gBD~CGNeWH{{mdl-wuEsio&>I#YNV@QDS9pE{Eq-4COj` zJxLnR5`| zD%hez?b*KU(`|y~M7&G3&?Y)QTE>UoHUAm+`+^!7=AU*J9_72rXggkvoI6_7^z1q` znX07f@5@B5CA~kEI*IOq6(u|he$NDD!PsJjC}E7I(@SIxDpHUKA3s@M@!GSc#w?yYuo3vJ&!3Vd?7_m7a(O7nFRo`=hS~l*~D2fcbt2b;peKy&cuh zxkW6Xqx5~+pygLqth|_deDJ{6s*a)>_N<|xnPfdlOrBD8_5f6!ugs#yU-+l3dx6>#I+MnWMTL_9BE50kkB3P$*0=hSVHeiA}h&rE1e~ zXJ2PfKfNwoRCL$Q{d!*f!w{Qfj)bH?W%JW;k(lmp-e?}4fUFj-(e1Gr4L6aR)Jrt6VkO^Q%Vpb^_5Qg`CX6ZY*`CN79iSQvvQ|1u!OrsVOKp_5q6Vj$c+UzPJ zpXGDuYB$#xMl!lgPpGKM*m^4R;fDW6N~Z8UjT?|VP{*&p8jU>$4CW6X8VbBy0m;NtdRbo2}cykGrLoPvlNNvNL@z{7m> zcD7OZ%8i)AH!WX+nwzNmT*U^zXS}&W=M@Yzp$W1}G&OP+t{$r=dZ%XK{n)n6HnYj_ zHR0D#V;X|2*55%bAd$UPSYP;nnZ3Negg%y4pMD?1AK8tAaXh zRlDJSh0Ib0#_T|`*v?bB=71lH{yJTB@ZUI1BQP zv!^ScoMNQ)an1%<*`?GM_qQO(bW$m#t{`2R6@L2zlRNdL$&0@j7^O~IO z_rk)sH(V%FHznvqh?5w{>c!E&gk`5C|9rm2J6>G&Zs?QBao`zkmYBh&{I($Xfm|Gi zf`|bDM6vA0C(POeDeHWrKK#OQ=PzLN$mBPO)qjUBVNyGl?!)rnQ7|uiPik-d-ppxuX`iPtxg!|L7PejT)Ab}IbijmL&f-S zteDb9b2o>aCHTfWB@JgOoKeNT5oB^xnoTrGzk^q)UH$_k{JrSerBoxe%+o89Po)0a zN8OmLt}2FkpCK!9wEAlhz8H7@njUn ze&6T&N62t_qRA(Y4YUTC9@8-UY^_S;X>oF;lAq)~BYy`Mwu_uV4aqV;p0sKk)wz}S zeJj(aH3L|qV9p~5vqLGZeW+h)4(SqYN<9SSF3M(01G}Saj`}Vbxqr6_qgmE_3!Nz@ z1r-6B)<;F85SNORdEo)uK(jRHPo74CJQsrS8ehjC6g^+QR_)pIba2CC0n=C3aDrhy z+8~&KDJ(OslY#}Sg;10MJY0kRbGtdAAL%$?0xNZu^)p71=4Qpr*lt%W%y~$&7Q~?{ zx?-487c)x!teDVgp<8J<{g9GadEjIuN)|w}w}@mR)&O%wk{KHKQ1$mN6#lYGMVAx@ z8}zS4v00{0EX45en~KIX`~W{EMme7~_2Zx9&UT*QHv=~eSyZzaG~S$e9TNIvee8jH zmHr0IL@%fi>1HdAOXz`$jjWs(!bE@`aTeY+G;@;}gvb!!jrwf=> z^u{l7ve=JSb9di#KK0C}$zlI$#^6Gx9=<}n7%TJOVa<@*`}&!)0y~V*@N$xGJU1UB zhCD{J&EOm*Fks!vQ>KR@T!w(l@_eGLQ_$*2c@ z{##MLOa}8mf3M=5E0R<73-%N4&PAHTH?afgNPj|B({{&EmtzMDXT}_s8>a_si5G+_ zkh^z{1ND9KI|!npJ$l9tt&LcFJ3C*eV;qe^Zr5yxN1!dR0%;-rrHoM`9{3PQsAtg9 zYnZJPI11@pI^^EC-sjUX3m#|rqe==XErWeprf*&<&ubV9+b)tkgJbw2@O|Ru*V-M+ zyKBs?M%I$E*BdQf1f=nVGMe5&`iZJUOQ|!>1HopV zzK;E=8?y{(FXRC|gB)&Mw9UIPMt(Y@(Ax><1^8}C2OXW9W;5Sd0LugvNx{58)vKm9 z66UakPhEr27?}`FsPEtds^9|32!^R~VPP<@qPC=#TtBn*DE8flxW`e|7wcx0jz8Zx zrXvtyYLjFN!%XTq*%_82CbX{D_BkT(Fid~_29c9U>oz=;B^BKG_Pn0r+~UpI+K!_j z@%Q+A`^Fgf+D_CW1ng(F^zOQF;~{4hA~neZp*1BpAC_n1ny2LS(nlj3w)|^{8L~>< zR=lWkPv>H!?MN!y$$@KX+5v7?>;w-0z6GpvO90LgMV4cwnkED>YlO7cSV@S>>v;9O zG+JsufAaVVe%axu_O|AoyB}N-U+58*WWf4ZbSfgU52(>^#v@6t@+R8F57?;pr z5RR}xt#`zG{jg~}_b11*;`h61z?U`co#Uw??IW26F!3x8bMexad=}ZH25ay<*K&p1 zym$!mg2ht%kj9;u7)hl-H0A%JEqS295|cxdY2j{B1O2)G$LCiGBu()tJ3H&+h&P1) zO_yDXF8r%(29@gRj8XsFAq!vO5(Uz8 z_?&Rzp=G#4chqlVE@Fk?xX5CFO^m);#St*upwEUvPXR({Gm73TMmf) z51SEh<}5*0DVwR45XJkY^OLXQQq49`_ut2}Fv(P-)M4b~S!3i=blsSftD(5BdyFA) z*#`!nS0&k;Aq}8(_t-&=+>D%s=4nnv0fWR{+7X>liSwre*ZY=FTm&wFe(~PsQPJG_ zy?2n*#6jtfS;O&$pdg=z#ZntF_hnaM1gam!XL4%lT}ig-uzW@6wjGhpY5e-5(wogUFqsL#khN;OYHZ zDoVn4IJ;(_V+HSJ2Jbn5GQ^I4ms>EGMtTe$X3oS*E#a<6+~2g=3lXrFIaJfSun*>A z9b}VX!QZ|lI4AX|rt)UyB1wd^PG|bnh$*lA0@s~xPUW;~(q3+`yIb$}g1?KhjhleX7TF?8!QC+r#fnE_{gw)G$AP4GcM!50_DOj;d`6eh~`c-VC zijZCLDWqaGF(;u=Rv2K`YHJf78On17qX0PJ`odTOTrXHz5ttG9V9f({ka&NB>nd}) zEH~diMvqV#ZBZ@kezhS~u6YbAczxIFasSIj)C?25^xq6(;4pVhV1dW$^l_3D(x%bu z7h*#cbjKBP-HPX3cXN98e-1%y8A5P`G7gpS_kN!9dE{ponSF?~ zJO>_M+-gIgvzK293m%lqhu8cFo-UdYrdZaE-NSi`^SueKEK{yq2v1b};a+vZaT-?8 z5V!XsImk2piM1JOu2M!2o+18M5x5fL@Ng_O$}E%v^cQD;sOB2|!>BQjfV@GO!vKi) z`H$)b?NiF>((S06+L&VOw1uEWqgUXOJ4ClHbalpBA7N$p#O|9 z8vFQ0=4}^1X6E9)fV`WFaAy*^WB(DtDa*c4cSl*OLes61ZIl|Py5P_?6bEM(+kQ`A zuk^Ww45GEzx$g4NRh*sCxXo_~cy&zXQwGU%0T=UCj5dQ)Uw*K0un65O4{5Q(XkVi+ zP3vb$%271NGC4RMnX8jsGC{aB(>^t+`a`Mq?Qs~;*o$3EiU2M%zoyS6#}#r5+AZFX zEANBqcYl5r+IEiSadWuy>IyoJJqG(}&>u~Sr6?*dkIkpm*T*_XX8>y4H5?iEA}A1? zp$XotC{tLsvu-dV(z|{>?p)((?k6ehF+^;pshMDu zi`&c7V(&O=mLQfgHaWl+?77Ow8lAw%rH*%4iF>oXF_cW^_1(4bM~17pLGc?5d(%8z+;?vJB4#dS6BNyo?6f78i;Nj+DL%BJuV_u- z#`+`?A=^H~h*6XiLU6=;4#eH*yu$87LkKh)zn1M}>MH`6BG>?UTCUpf8|anmxdP<@ zjyn4`gNccH zy8%Ge5Y|I3H}Y} zy80hhKj8T9bmmp9S}F&0SB5kz2SnCc5|b)nfZAg~{KrOdj1S*t(Et^QFay1G-*PhuZaHYVE`?t>gsp-}y#^cWH$J_Q| zJo7r;?$f_q3Pk@3!~OW!uaK?Tokp&&c9Iq zhwrS|-V26xx=F;Bx~U z8nvr}W@2Z+aEmYrKQpAl1+Q4?-c18rb zEi(m7V-)N*zEFafrBc1fL7STg?Ht*Gpc>!#qr$R&hgF=)*US+w2p489^-(%HZ=DmN z64PR?ZZoru{I*H8tpqDGqtI@v!HNR1m@vej`@b*eLWdAbi9HTbTa@HxNb`u^y(h`* zrz)cTu^yXXljhmcEX{2(87{e0X9kR~)R^wtNus*G`jN0B(X<}p8z*H0i0q|D+$!&F zXeHjn)qRMh))%I|r&{2X`_dWm98&DGHC986sp2srv|g_>Y!Sx#x#8m5z77C%Z?LBZ z=^)o?Sk=j75pNAuIJL&?bo22Ql24(C(2UYhcrnwv}MZb ztRIdVP(}~IajBw~Rvas@hguaDEo%<*T(rJ3838FY7x#P=-W(!huB%&vy6Pd-FxVzX z_2NY~Q9V*dwhtd6eZfL2BVZunFJ1pi-V&2n_1J^FxYOrLoSNatH_$ZwKmBBmRR4FH z_GOj^;Rdmcb&5>E6W1~AV+dC!Kgs>QY`{<_vRavCBsL1T>^jVLb~+!D;*p1oVBY_4 ztSUX=XHjYF!(UNSi$I9)VYrdDz5zIdXFWfT)`GUB2XXKy#T^oHL46Wl z7GEg@RI+zSNPaTLdxf%KjQ@4jWOVFqF75LM{c;V0xI;mIh7(HiM({7k-h2B7<)WO1~jPz>0TZiruijs0Byjz?F$u zFDV48YGc?S!%UDuM(O2veO^^bFC;h(1`xwUImtr2-JMrsBZri|x|5YMN)Jf0Q~xLg zo0p8*^2fnwWW+H=IpdIkx(mkUhL`dMpjy_W7woEF=mg7B9PDj3PwqkS#+9xkxAdhT z{nv-~6)VuV{nsi+4eIb}W#QSgh&*rgyUV&~%=M(iXf@W2MUZz#gzKqgIgNr<>e2=T zGW4?h&d*+nm##ias@En2DFEWy{%bAu{l`+5l+zUam(586qjOQkBMg*3BT+sj zZ>joMLK3D7%I4@%F+k1dh42kt{{~f-?m5r#j(p}erlCy05ANk5L+5m?AUMAk_87#R zn*PHloTiJdr90kp61MLgdA!qCk_7NYg<6G1U}%eLgzU*@9Ca){18Bw}RRP?;e}V}8 zgbNUUqAl+PXmjb?_fG<%FC0(iBoKnK8C;cs1w%?)GymND`Nw{SQ`q(7r9w zA3$vHr&esORQe6D5_Rd8MwP zldl|E@?}7A)H#KA5rriev^l(ThsmctH!5AaxnrS@4YOE)Xks}lZnk9D=UFvmPQh^t zUI)9Ll@x9${oc2s4mAIIJGyeD%f}+vp6DTs}gm!twCZ0Oy;J8%565l!J@55h@Gxirk>k64!?3Src#jL z7H851E8_oBW@W8Fzuys_rwYU_l}RTZ7tjz_W)K+dxDyRs=?Hqn-2gtvipP{0Di3~6 z&XXvA`jKRs6DQ5tn`sDQw^#eIZc~B&zDJm@qITBViz1cvg{W3k9gUfKN+nAGSPCX) z$FA<~BXD%mF;MUYBX+6(VYdTShU5!~+07(&(vklV0Kbn+O*4Bc(Ls)pMO!(2IARbQ zA{!4?VmfH=qvsj!xJDDhAy!0%1`OODe_v^j1qU(kIM!0Ax^`bZ0B;;UK*yD(&R;ch zJO|<@M2IKj0s%VX+;;(f;JXkt)_e0}R*8|?TC1tqNHEF~%b=tr>J{?bsKKIRRxRC$ z_6(VcK+YQXPYiFkVBRx_9u!_1hwX_?{YI(wwGjCd(Tfeof3<9SH&ESO#y09oGXZO`pO!8E7*A8y3eh;=>gg{oKkSgdE1?vg0;lqO}M5-}whFM!# zd}=o!*Ooc=%Zgm+XrL-8?zDK-)@(l4C3!*O{lso4KG=?;6mLH-^(HNGT~4779? zTn_(s8f1tq|1Xh%pEk4|=E>mtYJ1Z`^{L-wt^dTV{A*d=$MYbqUYOEdr6Ci3yt3nU zvp%`<4e){XhGx(Vt6FIByTww42zDzGgj4J4N8qny=V}DeVBd;K%k1hepR7&y}{2cmi4!mg_oWS&Esg?eUE96nlNKM$-_0~T@wr2mK6>x z@gkEbfjD=|*bp9p3q034VG%Jn)0RA*Gtq~l9Xf_N^O`pG#aEq;VL#P5+FaeZSU7$j z@%Vb8z@z{p_?kEq>xiLBVv6y$fG9Bl816wOVt4BQf$`{@fvBzh`bRHB7-{!#Z{6u< zlQcVZCp%~O0nAC-Hx9omdkUSa8s(e^k~3;Auf#2#;QZ$#tu!cJy(aE%kz~E%o9yN)ONd^v?Xy^9b?mCDW= z`4?Q(Hc?`Etptd672qg|-2^D#{)RbxDZyD&9l7ePU8g1VQ=#25tzte=!wptiBB3| z+CBa(1$tM`B;IUzrQtKyyDe~l*(k6Z9pox$#si0mjMjdgfa{A>uYt_$T7)}IJUhRa zX(XwqS}YT5s0K&FjuT@SbU+D88**&s&`>t<{P60lyDsKa;_0Vqofgg6YAEkl8GBo} zT&(0&F1>qIXeXRNV|Bvhoj){!(bw@sIUZu@?Aez+twFAK#*9;26842j%X}vbXp$5Y z@j#T4+}7YN`W+c46&Eij1Hpp&pPJ>XT0QC}MYMJ4A0E>|MS=!-gWoiEAJFkvWzaDxb^9QE#kjKqJ`6!nYqZ=wg_utL)Nm8=io_lm?l_n zfBJZ9>wSnCcj;4f;l8d(B}FF@NzqoEl>MyZZ9e{3wfwlP=Uw0mxg34NXy!5ged|ha z9$fe*;o-7wC7Hpy2zm0D$&5XJs4BK}VqI0=aLV*cI%6c~VdKO{u$m(-jGo^%03iUD ztRx3ouj6zdYV6mFB4B~)r5Cx2d8uU~ne^c)WH#Lb*lC_oOU`;S7Tubgf2GU7UM3!% zc4=X~f|Ees31J#2;QuO<8n64*mHCQ>P7b37D!}lpeV#OPzsb^PHTdz2MV9*GNvTi> zDV5Z(J`|^nG`Nx|q^F-Tm00X2;8De%Sp!?78wcUW(Kv+fz@(p$uMoUJg9(s9J6I~1 zcnk@t{Q7~8h6G;fZK6!rF{j3=9tW|P8z#t_U3@=yft zIVh!d-60qh=S1O7F7g;o%FE^_E4Yvt$srn^S@xf~D%bw1Re&2O&iC~Z%N+nmP*;*0N^76e6M%~G(PcdJrR zKX7Bak{6^>8t(Tf0L@M04Xo55a!)};9o`ph-`roG+Qwz3WLRiQ#b7~C6*JCV3`$5$ z{mXkUA?1Z|{cjms4C6OHmdS~gWto^ZOYSx(+Wz2Dro+kGMHOogFW*Lq3?tUW21rY_ z+(u#HRhb}DEsQ2qPwCTwf)tkX&ipZgI+Yca)_4I(#87{Al$TYt)-sPy+W5>=f%rW zp^-LtnuSZT$G#kK4LEQ?ZlT1!l~X9;kL>KQY!Y8S09_oAaeE!G!}?pjEd(0x+^AH_ z+c|4`sZKaV0J^CNshpEcb8;B%5li+ibZ8De9F2`Yrlh%js$#OtYBZ`#KYdFo$CsZR zb;du~aCD=8-yWaupWb`0A*_v5B*RwYa^id#uKaaR;Cyt~a8F!YN<6E=JJMn-e78G% zaM+uud?V|}7Ly4wT#v6DJBqe7PM8tdDWlcNx|?pC0Sc-Lf-rleNwZ|?pku7R0Qk55 z1cGn@f=>Dl59(O~*tJ5rSA)OOgUFyBoJS>?MQwCx+*#Zdd&6LTvdA#i1yFIP%}3$e zscWHkv=`oy#l;uyT$#qEniv;yx6FI&skFalWrz=o0hXGPzTc$8+w`&Ce~3ItoyP5< z35FjM0eDVt-OZpp>qTeQBf^5ljNKXsXc*LR5XW8%NN*Gh19QuyA6chQ16g-@Y-$k$ zQmB8H%6b+i4eH!nl8KL|P)obb752W(N{~auSt9v#3im;&j_x zK(E_;b!!pc2Ct)VL38kv!EPYuiX~dl;otWKJU$X(wtQ=A!eiHQz74)74Kl}Aw9H82 zfcuHePJL2_*O>g==rj#s#&Vh-`Z*kWIB!^vdcb{{i;Cpwa*)pjW&rYd*hePnXOPiu zA;Q5SUH_8tWfb%Xczo-}c79P>F$10`@rsQUON1}?pwXoW%fjk7;ie|{t+TKYN^D@~Acze70!g=LJK%gtlpDoG~`4Q>eW&PNx@jZNF zGN11``_PiW`3C1YBfg(^y8sJy)CcRyjgy^&l=(IKOOzS2kIsOEPJ4(dSWV>GOrP)z z6W1qNYs5ikNN`3d@IP@ApB>;xiNAoG10*-}+lDFcC}OJ9H;!?N?@J=Z*`^k89+|%T zdvRnp?c$&Q?996e?eH5=$FRWRq*aO8$TrL%%3y0`hKb(O;6Izf(dbIj5dFXq14kIo zr}i0#bOL|CT-6MjA)$`MDBt(V4E3Umk4esqInQ{$fmRMJ^_^h#s0Z>M7|@m2f#X4N zgg5`rkvp*vo&*XxGZHt>)#9(`Rcw9{Hux^&4K7vl4Ns=GI5l@Bs~bM4YEvoJ1p*r2 zE{C~AVPJ7pBw=?Fi?)(Xw+1~0SVz|`g)B`b_hE8l_BdaAQ`nSj_CX?QH zo~(wx-Zoq$L4Bl`y=Ex}+`s+`-|onwv8}oy#4JA+|8RVrPxFS%p=gJ3#*XOL02lD> z=I5tmZq#vyRQHd4#SAqe2$6smfY z7&rB|Qm4it2$jtdJ|r)#6GPUtf;Q1XrIap;2xoTaDYStzMer`oD^l^V$nM?ssk`lV zQm4Os&WoRJGlYFl)-Fke`fw{$T(D>{DEmJkNJ!hPS)&M^@yP8FDdU_d8uMuW$< z3>2Ma^B9rXThlXrO!b|Bz@;)RDsy*eaMXaihI-%`Ayu#z@AS^2V6B=x{zejTnBtR) zo&U6LkeJ#v0YM0~I9GDRJtx&*yfvAOWy$lGFnFj{#R^Q(eGTVwdDO$;iv?g{6piG9Pz}nI&X0)ly-4LNPLa??46@-Z|GWg1rJe&;AON@g zyUCr8(mYjdJQA{zeT|{QBMXwl;=#s4;BNbEi|&%_6kP$S^;=#U2>SVmfsSR?w3TB`QFf1}UbdW1wR~#!!N>cQb@4XveXXSA=P6VH%JAd$MckFw;BpJ-!Ul80t@gPVlfN zos-}#LXe#U>LZZ0%g!_49K5nrJemGn);%SNrAa{KL;n;u;8G|(-Zf3zWyANlT5PV3 zMOx|LS&pyf&~e1F*vcS{Sch3&HM7Qejqq}Cn&xl+vy)&e#dU~((lz%*`a#XKy4BTU zu8t9Q^ZkO67rQB5v*0G?{Ng{j9^T9#`=j;7UHC;3AkGdU>aUTIhS0roR;^vSY$O2z z!<-^VIRm)!-6^FQi_6Z@mb<=rvko6PY^wN{CKUW-^Y%63x1O!7pYLfGwU-v;KWD*U zq(~_QN(+%z#r8G2T`jetLAF@wY~7vC@t|G%vX?JlQ?Iyxo}a z5oS%u1EB*mE^N4$eHh!86a@3JxZAW!%5)ITx=W$*`d}@(9D^n3x6-rcA?Xl~R!QFu zkG-4ur0FvAZX8@3>juz|9B_oFf&^S{h`d{}QC34xhjxFv2{uk`cQ6y-|2EBPYz@~| z)*gI-z`g#-ovk|qZFI*O&2f%IC_ZICxFdBU3+y6riXjBldn_PjV9nin8_%imkhrn1 z9J@{wiSgDQ=9MUQ=-p@;9X}dy*9ni7;Qo9WoFitmmYk=K;bik1VLv>%v2|gsI>?FM z3iVfXSyhc`e`DIDyFxkR1W5CH=k7X{>zbuivTl86&!%T z2PjBrD5Gd074X%_%`BVIT|d?@(d9WopdQo|_XA4CCDH37A1RhDu8+)Fh0ild=4ojn zR~G7cR>6@Hfh8dgiX4~}3T3Nqa5S#bn8xGq`Ugjg2%X{$ApZ7{HT31_Uz3C4 zR(SW+0Y7M~!1lS!_Ofz;RO1)O8T*A3NN=3{ADPez;i!Oj9{p@}Q&32c>EIAnYL~cA z1@_vCtUz^eRv)Dm@84|JVM9f8Oag0Dnn?aQa^m}pE_AW<2i9j8hVdH>_L9()5fdRK28{sM)Vssh2LL$- zzvWWS%@0hTteV7?d%nz=6qLm479}pd@wHx=q1EknVg-A_5CJwLoMrao1QZxi zS2w%CEtWgoDtQjOo`m#zxmrh4TVmm2)Cv^!Z#7SEawZ4in_Hgqs;0CjBVoK znJuJ`oPLJWNRPV$DxDJM9x)ELO=S&ce&xhBOiGmV$&8=*~=y(p1rh`fGQx z6(Yfej0&y=@OGblhwxg&!_iVinpj@exb^eD`^v*TrA$^l`|6vo@9Dyn+k1T1_>-;^ z#*uXrxP1;>oYfjD;YYC3UM^2ElI`k(Cl7G9HcBd;SAtYRJ_EPKC3wiA&Xq?1=%#Qn7c|p*K#C^U+(_h~s|BI$LQcBZYMe0+#KKu3&{R{?zTh6hM^xmt_&Y}K`SJ&}z zncbrusyc7SLtK&zGLk=ZeI)M;@kv^2FB0=W$(#u;%&A2`N!zc;0>ENMm5xo5w$%|0 z(18!MfJa{YNO{`O+2yMliULM$4zF00qGT+_8%>Q{nV%05+{1YJJ~d^n#H?{)3vHd! zu?a!Q`un9pdoc^mvTrnx$>Z-8t;!^1b1`dvwYAPqSl71d`|=@x*%XgyntEZnAevI| z!bqXK?t=0*R#UQf44hc~*3FR^_r#!zKcrmSe;(XD&Drekfj{E^p)hYc`S5u6&d7f^ zK=qiz+x+@m0-POf0h>`l{LUCmh#Yflc~UrCJ?+xQf6nHF-d6LJ#By3t<`uNw^nG07 z*>Z(ZDSbJRcY~oLzF{6bRIWHc-U2B%v^5OmRFQgUQW?OO-?|HUv=bIK3Gz>QsFe zeO9&q?P1$4tu(|rfLnvt#N~&RU1&^s`&{+r*b5370EG}{rrvI8QA0G|TB_r;UsnTH4PL#zPq~;LESZyn<-ekFdXR+Q$!Wgb;4`n?1TBr)h7U+q z*BtodsjB1gNvL+e-Ji|nYi#(}6jSBR3^p7Z-p-mk%~fP)$T3Zx+-GadcewB3{+$ta z3f0;h0Qz3^Z;pOdem<*oFeACyg`ecB4}2yd<>nkeILFj8<=hMkY2U?UI+b!r+L@z4 z)Kmo3elVqaXdt*_)23cMsJZ%HUUq5jG82s6uTx1U)`LZjE6w|%k* zs2`@p)_1^}@ty*P>QcVh=g2M-J(I(Z_wy3S05O)bv&AYK(1m^iynDjWn68<%-a-K~ zL*XwhuW8W}u#y5;t}8x0;);|zBpL6$Lo7&N;fS?NVj=Oy*idbB7rvARR_0^sEdXBQ zTeee;XU?}Tb`w5|HJ@I7y%^q-82NNzRK;Med?Sz%BUHHM6bGvVeauP4$QeHbPB8pj;O1aB>(Cp{ za+fo=_=okGZSRT1y689=)k3sESFKiA2SB?qDuAKGc0cMuKz`QyMbulk9NW=ime1hB zP>JhC)XVO@-2Ss`$Gd0Uhw51nqR2_Za)_)9t#Z!e#nzXGsYrtY%+3-g8k2M?4D@bf zvr-vc(~RMF)<_l^UqI^7W;DUL72hEn3GdSVsV2dk-rjTfzDv~hwB++`yV~ZDo43#Bm2PHYk!3?^j7REsgE&1XB=QRa{ONGvlR4N9 zINuzRc2P3h{W*vWo)5|AR_|u@q`$Y-_oUkTT}+?sBPp!5!@wH+(f;OJWP7WBjlN1FzWWp->48zxmzBqr z8rd0_8L&QZ^}I3(ej3pt|`;vVz~KHYgc80D*;EGQ98C;;Ld{~;+MG0 zFi4K5kdbjUH*-sJOXc`N9rXnx8hbadv@$RCWDGievo((4eDpuC4yE3p<6P;OErsjN%yCl?*4Bp=$@0veWI zEBPz3Jfa&sMmFj0+E0655$@VMBhXKIUBY-Bzv*KZSR3|J&Bp10Ljm=*U^^-=jwU5! zd(@lJEYo)j!XP9auxwlkTU%!}!i!7%z?yw=sTY#I+=Z0W(z5tr&5N?M`WI88 z<3@?IJHc*0#$Bfzxgr>}w`VRIK~pq|U^)M;t7&a{iZB5-a@{h z;d!Mz)RC~Fe^@gXaRNm9+|lmojxuomiBq6lJN8QMx*4~Pd|5~w7Kbr~$J75VwQg8M z@ny$q7QAfk*N%fIs1bVZ_lz#LT8!%PzC~pc-?x)9CpPs-MXCi}U#{k#weq9;&XB4K z->FP#c_Paw8!*^e2<7dh9H`W?AqY0c-Kj{g3FK8(wxqI#V#ENed$r;wvQjT2KAMDe zB}odI>?GVv*urd9h50vk%$1~X3U*2@LL;SAYHobUr5gcXwTQqL=FTJ1c~GcY3bzw! zvxs8s%=Qy`I*1~YS??MgTYStn(blp-x92$9mlley=y}gqp<0sboKnviAqSay@_2GE z>XlsFxK+GQ%1FQ}*bF^5LE8=~su~FIm1@q>Wake-msl$;*voR@lzzhyaK~Df;h8Hj z%fP3o^UjE(`iv#yH8=I8%?@mzrW!g-3ipaIf=P`foMvRxuClmLcofnNApma_+S25= zPLvU-Cd?;@fm}c*#_o z=v&4mf=V_trj}r{xRFH86M9OikGhfF`;GM!=SDz0UTukGo+2pVNCG@+>x3P3Ma91k zsaUk>L%sbI;YeyHbb=1NV)-8~R2!O%gRxte9ll?FUy{fCKUsZ+q*;KbuFsQ*D?a*U znxjM+F69q^6nzv^OoJ>}NgE3x9~OhFGrLw6GYtIqVndr$o|;fud$O?8Z}6x@BqWyA zQUURA7f>`oY4ixXu!+@qVIzML@EzF_MN!D-5%C>We+Q|~LZ>m%5#LB)R7QVy;R~;{ z`LrW(8k9zkY~k-L0LyYj*voY&hBkX8;4i%T7i|`p7WOAuZA_@=?|a$(@dB$Piwe16 zlSGXbotHs?k$+4I>zCmnLK_ANX75E!t|E;p_DhnaNjFf40}+cw`Ll%7w`!$tBkJUB z0<-aEYzmUcK|%&dspJL1Qs@-!vR?>($&c{t&Qcz?Ke1O(7beN%a*4~5BwK<1vZSl; z=L?txOe{m@@!&B_1S^_Sz$s|kI5U?ib6xg(RLzz4iuyPa98E^VcMvS0h=p9g&%^ec z)}e~H8tvo!tP4QS4gbp1l}b^o4L75rY7}Hh`2$LJ^|B4BVcPMJkG@7cf^iIwhBv+FJ>Q{6g z!2d*>{mD%NFDP^&+@x%ZlSW&bernagwzg$Fo_=ExyJL)CZt>h^t|zHf3vO<_HQG6W2@uS3i>i5}|ThQ+^t*SAducMY=3eX7XRn*S zu9|*!`FSS^;;!GyeDr(PT@l}5#i#YdJQywZk5S=i zk(iiyxp=ov?<)rvL4qy|agH<3*Z)aSnRy`S!e6raQ(`@=g@g6yysYn~k4IdgPgmR2 zX0KuInv|#{8nZnu!-|$4aBVoKMsh#0@q3+4xch}W{@nZ>s~)lDF)#lSWjZ4i+Kt4i?pO2RHVBN3GwhF06+g0m8dXGmvLE4?9yl_2q z(P=kNeXuM|8kT~GTUmZL13aTt;axNdHu`fjBzlkGv$$O;xEG?rZS@>Qjip_8|{0#*p@z4dPD1ZlpQ&5J_Lz?@ajoNDdt zXpt}_nc~QhLKjhsV9ds^Z8(^Xr1dz}8aD+~SFlArwu3kJXvE(&z(z2-(vbqaqW?b+Bjhm|t%HJ7AyT4j*`~_=4FlWIfpA>SJ_$j2aUe$Kfz58GrbpvAve~ zScw-u%}n)nDyEIvlIl)DC_I0kzc6qg_jHb9|-}20lFzRW{uhPEQmeV|+MTUnbWhl?lEbVlbkE`i` zQ@G2-E$F)!B4r-INe#ihSnhaVO8?C

U8(eQR!}-6_dEl+_0;Sy|4yUkJ79vL-Fa zK*YApfW|_MjrKkl%i11HkFx-J*KQf50`tS$9r#O1@E%C8kq~or*seyDGJ3TM&^T zQEQh7SK?;2&7|UUEYlX)W(if@6B$0wIokP(4+@4zK%f~%Yf7gFs#RmQ7VC%<`r}9Q z0qUp+v-s@hi#(%^9R$R~RAAm;S!FPwNB`KQ;dg%<0KeC2JQT&k`zYZfd&GnxbtktX z<92u(CfUx9-G$XKiiW2S``H9xYod-Gj#xwoZGX}R1DptA%5Y2iA(m_Vp5A2yIWlEN z@ti+8ta}qC`Dd^(2%|#&a;sTmNbsgs1WE@2(BQ4p@pxN0L?2vSiw3L9=XyFC-`1=p zp0kO%bpGnsKx4N4ZU4!&yT!1XD%5|j%Pq>%WBKd8reKniw>nCvWu)w!@EJT=SL&w7}ucwEQp{*aJxKJKqO0~f9x zE3{*)Oz`#&0x$z(%i>!^X>QA^iA}L}eme zM>U!%W=jqeb4dZ2xuBG_t8JqQb`a-aO(Sja?<+UWMx0!)Luv9nuhwSjyDpHcT0AwF z$Di_H%0zy#-y8>UmjW`_s)A127rF%r)JGUpsa@P)JzO-2f% zb~G7W<8C?fP^Py^f`|sznFd+M*_z07RWAl*Kha;W>?aiq1Ym0Xpo!xrG=P5p|FQND z&XxDy`X}5mJL=fBJGO1xPC9nd*|BZgPRCZqwrxA@r zz1MZUG@JATsaZbcJ;d-SnTebKC(se>0=s@b0p_Q9P74 zB4+DJ?JeI0gsuNioD0!78T%U>pgH(35;*U!YYWcZm*WA?lI%yXyBU7CoTeI22n*R> zj&MG$uUU{)1jZt1%8>b2G(@ImpXmCRYtnfE0_RxE1DOL?>NTOvo=Ka|nSR%*{e(XG zIYDp@!HfrUi5OL^CDARM^a#yV{-rn~B2?URm18{FadXQZPCn_Fn)^CbZ; zlJgL%K9sX#u|(w(>BCkf5ODcnQSFQS)3*N!bwWqs)GBBZf944Yx68wu+Yav|71-Lh zW7W>Tt2j;KbAsk7wpzFUKAh4r?=kV@d5n6*#g2-_>^BVH%>L%Jp_J*v} zWzIW_(a)!JKbkTWvtb0D(s#$60lp~BUaQFhp?};`>QO^me$bgyqN`7|yscjSNa&y6 z|IW@0yOqH3fBex^)BZ^=xt5*_(dmh#8;LsreWmUpTx)z3M<@A7-lI)18r|YRkzo{S zWSt_@aiAJlNoB%nR-y=p3eF8g;nuNdY+IU;gr4a84AabTba2o{&2Ghdg@ z;uED&`<`s`9M*mH81Q|aE5XJPvi&O(lY9~?6~v4g4$W&sX$dOUs$>vhD=o?HYaPX- zgoKKM+aSD$XS%BQh`1l&t7(Z&&ID#^beL++^O?^j8?}SE8ve?A2pytw69d{wPh}jp z|7Z&IXyQ#`s_%lKDIl;s1z-shDkZX^t*2##jMd*}DO2^_6evEtSi4Q*%f0+{Uccyg zPWU@k3kt-|!m?n0Et$J|z;%QpgOy!Y7Lp9SI@FF?Ki?f{pCC8WssdYcnv1dhK6(c` z-Klna;4Bc9vEfRFO8mUB&jWxkvgI1X3V&8*r|(8+JG*COQCqrKcuMvL`~UgPwGRiu zhXiPL-wb|EhdJ3nM4eQjTPfY{B-VX&HJr{f4W)+!uCFIJO|>rBnO8){LTgHW2D;2= zpa++$-lc!WdE`HF&MKOh2qK7{qI1J0tR}2TxhK%EtzaDwL0u=K2%vQHZab`Vf&Q)`zQN6#nUD~<6N+( zdYpDP(C-(M*Y9AA&p0o0<+Tua{Xb-Mz>bVP9b2idkj`>%B|Z|?D9^X`R_(yfR<|P+ zX@$3A<${}40#~uQT<(l}FS`xPYvyuLc1taYt*0zKMof-`6Do&^Xc8` z7>To{e0W^`Xoct&vc&rnaB>V!`n*K@W0|!fn06+#Fc`=1entSCd zFrohkp_r}jkW>zW_xW<1l(OeHySs37Kx--F8K?mc#CY^mVb;R zew%#?>p2DerSK)ttHH^1NVv>D-|Mwng>JJKOqtJt+(e-`ebEwm*BWW^6X44kdU$_3mPWrejW+FhSeOh*<9&?IgeE#CR zR~_t@G(O39MgIhHTC}h)n>{&wFyzH6?P`FmGp+uS?Ze&jHUF&vLt7Cny_l-SWh?bO z7TwZ>Y^d~EbsYSDLWPX{jF-%nvJWDgY}B_r-_%mfai~L4r zW2HMJ`$9ic#HX5X#@UZZIhzB91Bis zboP~lL`-8#HI=U7wICz_pc&L{N#PHo7qHn=B@?h85RWUEG?Xt2gw&^aP11hD82d8+ zEpNXWk#93)m;^)IG>|AEB_be|WIeb-X~RFn2%p0~W#Jr({xV?L&x`s{Drr-4a-*wk zek{d)Kuwnb=l#)O_Dn{6@Ze~&(2ch=fZ)4Yh+2he>$yuiS{29{palpt6C|woliL~0 z65kz@*r=xMdcfpCQ(SuGF${BuogFTw#j*~~#2Gt3@?am8N@?`a%EJx=^V;QIfuQV% zT!)FCuBNMCGPzj%gE-xIC+y(il;TGjIX!lX702R^_JFC$AdS5v?1><;uljX+LqJ*e zQ;q3?=b!}_uC9C}aQVe) zh)jMY9T2921d%oKLO8R>98Vk>E|>3Jb7b;^NIe=2E)lBnYZI!b!ME;i9OOzu0|*oa zjB>9qPz8MixUIpSjU>cITzgyERC+@mJZViWpzjt8^r^Kmm=r*_#*%anrcuGHS!UqFtMC}z%yDRm{+w{NR#Sy~dCZha}V8GayczP`mWmuK`>71L0w0q2|ma0IULm z*Xq+N-`WlUypwqco@Ddq-eOi(&0C?wG~vV`STc&Gv00||kfs=n)O}yW$}I=_T=^E| zx>#L9aXVhN@;$8^v)k>N%1HR~mB8i|Mj3UbrOQUPxoFxV36jh+Js=koBv@nz66~)6 zFbwQnJn*I?XlfYHk8#L@*d^dul{}2$9X1F_XE*@@csh)|>uMwf*Z32cP8MZ{;8%-t z3O}qE6Rqy_?=7%mfW(uIJb2p9JE@@cI?6*#AnQz$I{Z3~Ee6{Ul-@&Y!n=E< z#fgKua%c_Rw!CwsIUNQxt+{HF63c=TrB}igG0*QjK2Vqs--ptHu%o7n0D&i?ibLP= zCje&k9M61I@l0a3>{hvq5mi!i`f|mZVp}Dd{o!e3j1_5-ii*e`LD?$4)~EB8-r6R) z2)W#Tx1Y6>AKI8)dMy0#(13`u*Mle#DFJMqp-Fz#Q}4myFgczs>|pIx=HljVd!S!T z6mM*hkgjP`2t7eOn=(&+rg>D0nw56JZ^MV}o19dL#>jHwxs|Z&kA+&RUHz(>_t)X( z&iCl%nGY>sj&i(c|D(wQ8&qc5i^w}M0;AnMb@i;;_~3!IzR78OWu*(@$vHcAasx0| zK--8z!assm9?}r^XxpSkM``xXaM|cd4ERz743Phd4^|>F!-mMJIZ}KhREwboS5@go zxzrFz+gS-o+<{5h^p`Dj?#Nxl4G>CKGsRrE3C%}f%JJn%?8Z66C*G1TdV9R2LW zVa(cAnR99mF>?vX^XM;H9lk%M{q{9KGiuJEfP_#V7f(0C95*K4SVLDVsfA8-C)yTT zm~wtbG5!npI*J6-5})c0dhBy+X;)ThQoSA@zXd)oac7F!wtXui0XWWj>U!_M2KH?w z{W!^6{?5m<%q05 zM4>1N&KvM7gq|L(@LkhMV39p3oo;FUz^@*!i|57LH<||7jU!NP;S8?L9wFDYi+}XP zzeNs}m%fduvMq>~0=&Kn!NGph;L*vyphegTv<8ougU$$~MTf&XLlNVoQ5iVUv2G zE(mC|U}j}%?0?aly+zlvQ2T~l0zKOKT%}%N_BRt2eE@3k3t-{IFNY{S$f`3`b+8B} zuVY25oN;8s<_*^?f7x#N+kG_hhN)ZpFJZ+Pw@n-HB#Qc!(lq2p3+~ z#Y-VmkSzvnMc{YTp>^#P2ZHR~w@`@uNKQ}xx+Nkpz31b8=8v7pa6@mCJN|RH0ntI_ z@kl>oTVg-?D1eS5{<|F<`_$qlwT~U@Sr6y*N$E#!+C%fJ*DX|)>VGTUjFZxxgAjl! zaELkttwl>l@T@@*jWhBkqzNF<+fNO6_<2-Flh*@2`#)DRZmt7zM* z%Ed8&X^uDO7+@cY(#U;*3Y2*7eJKf(S)YLe!+7Ou#-!n8C@5*A?bwc#XBuW1EJ$3t zwi=My7RUZBXhBeyDnr`TUrJB!d&~?eM>!WK?Hpd#HrTaY2a>6o80WWb8VIogv(X0- zZkHML`JS6}@GUM7iQ1CZIi_9TC-Xt9q_cmM^IWL&VXplT7C5`00jO3=SM$uZdJO$8 zOIlXOoA%RPuW5fx<7t+am9Xh_lL$^h=ib&`-dC?FC?^a}9YrI1>4J$y@Gy3U++wAn z$w|4N?tGQ?@it&m#4?8iY;>tli_{!|C2t8*dqPL2^dH9)rB{O--p+hoIG|Gm40(0} z`j)4J^56Y_3=Zzq&4~}BK{s32R3-g>AfM0FGm+sUk{|4%5b6OZa#=72S9_-sr}0Sj z8#~rVj#-yXtUZLo)J2wP|GCJ0ijN5O%AyRl^%xRRGbCGzNJ@#9M-F{GmiJ2?5C(!l z^W&SXvk|h6XfXWxti4_W!|W6;JQ~Gl@|Q45&+@O}1C93v(^pF?Ts#4LOQIkHp|-!+ zW5jvTY9B;;-f>bZf}e}HY^9?tOv8lw>gL6b0J0csDYeZ|%ou$k>h1T0^A!Wl*il9wu~_u8 z56-=VFDfMH!D44ru?O%NNCZM~$yYBQkQxyRq*PHU#Y;cJ9P0(1F|>Eo3;&endo0+U z<>^1OsCYLK{E5Tx;}AYt??%eNHhYWOq7aMnV5HiaP&rx0u7dqMUw-W@Hu9l z8Nm3P=rc^n&F_`7GY7c)Lor6A8d(2FjHa?B)Gp7rL=njX<`^3jng(y7hTB*tz{*Ds z-j6pb<4CRIq$AykNbvW!>>qC16@y#Z)X0D(+V^lOm*7^9diYq$oZUo*9uEGKrvPas zHB>1BDaiMPFBD=RC9r8W(qYx>^(p;5vT3(4Rj|-&3cI zuZJ0j+lbAHtfb3orFOQk|MxzxUz2(L&z7AI6Cj#WBTOqGYoLfjiztj}=DTTPUUQxHWg@oMryi|| z)oht`Y4YmJh8rheu3J_iLb54iU`-;{hX_rqA*#!t4)BYgjr>aEwg}d7flh6+_@IgC z<7I?>g?+RT*#wCo&dz~ck{n+q5n@Ec*6I+>zK(>K!r|osZrmfIX}%BE&raSr3^fDo zH(UB6#AP0cXfKs)T%EktU$Yj5tNTMUVfFk<+fUf-%4;3qd8o%m*&a}J(t<#-JU8TO z8aK{+O}{(@;y|ho^QMfWmux8NIH9@mQND7L#y~bc>>ij8Nu`2VK@I(KxK~rpOjzvP zT+x#Si(K>sbgDk7=>28rl06$5J2Y7Os~zF#);=-UIVANRa|i$QZ)xC|fVy>U*BMXN z{xiCxe16(9)cw%6Dq`A*N0c|9Io8$Z+3lxSY9KM$1uP!UT;X2@bqm8RNMQvQavd%9 z)<6k4+?7cS)|>7rxi%Eo)lwF~@W|28UFXq}vnOChR}9!hnxph8YYlc~pPB}jx9eLc zB$AafACk!MAC2(DAPn?exheh?YhAs$nHomr}rII*lwLyy-p2#jDOY8B$>MJ<|W zia4pThG&eNTP|)|ZwVKdF(%#rwT^da>E|zvPCP*>HWz65Q7t=86&XNOgPNJ~Rwk=& zKn(EN6|gUW*%mU!rp#TtDS2<5iGTLgO?o3X5KEr&I1gY@D#`;ae!T2Ca&%&5!`I}& z+1@R-w-()JD~V2|&X3Qh&CA-8cVZX4ZptS9j<8PBf9QrE_n&iKTWA}-H|R@u2z*hL zu7RXG?#v$9o7@eJ_r*hTp;wl;@qyE&{t0mA!gKTHb(N%Q1cl_DMEK)2E)|R-M1_*T zvU+epmMX10iW07z%Db7Xo^jDzR|}nNf~y@kZub4`1a`2rT+xz56%6<6nuU3ijYFtw zD6=1zsE*g@i`H9J9~=Zc-0ZSY;8#GCR!aZe-xYUf6CTDEF6@}DELOq^PCH*TOGW?} zpX&(yTf#&J2BAE16KYwKnFnRpglA`H4)cKfFKr70&yBBSMs*5y$&2wqIM`y@ja5>e zuq9pxFxwK`^#}!L>fMGoZ8v{;f_Q8ivpf6;%VWbJAQ#Hbxii0bWd2?x+IV=G_zUjI zYrg?oP3b`CZ;JMG$w|LYtE4*K`#loS92p0-Q1Dd#@WiGT9xiX5GwwZqO>R;EW^R-R)4$*O)e}g}E3%IWOjK06X0Y*YXQe*Bi$Wm#` z7p+ZIi~G~gBNs?;wj>`4voUYLetTN6%(EOoD&zmXIN{far=JhbT>a$Lc2u*s;dQq(xP>j_CCd=XR^DxRh&IqCh-j5msmt#}4v>>ox!&ZAw-#9|Y zaIisyOd-`Qy-Lz3HQir?`mJ@6#Ho0sEn)$e5=w@-QAhi1S{`B>;Eyer5hzol>_oha zbS_J}W@Vy6h1y}bu&r=dzlEKoM^+JitU7E#if68?TLALlnZ=W8ANUrD6@VpVB-Qgp zr7deXy45k;Ul7XHHV3gVf~@hB7l3M7@9~p~2PX=ub7W!QIcC%S`lkw5_IEX~{)6Y- zt>#cTFVsz9yX`b)fY$Hdq?1xQh!yb-s}tVolA|cigrWhi!hRZW)3*$gHXR>m+juk#<9NIWqjWZZeFlgPDX&&#vTl?IWU;dE?M!X-94 zx?S1oHB5>A&zsBUKQ?0bh}vehS+Y%+;ctb`35R zL~<6D7De>HQ6-#3SSZiAS~Xki74m*b={ z|Dp)%%!@$qFQ2WnX6|vizV^|=8)Fs!t5{OvzmX28c0zAX-R0!!R}LI`BF;g-vwlzX z8DZq+f6cs+KN=C3V0;j&Fwt}R*zKsTaj8J1(t;co@)1fY#AL6;>)$JXX)P!$ z&d@}kAL~S%sHCs`zG4C`0Ht2r@G?{?4(2kIEg!(;ZZVMZ2x10U*}BFSWGU;1i~ z;VJ}n_CR==?15y-Yg;XkV3->fEQ=@6}miydpcUz2xImaV+a5a>k>23+oU zZN0AGA=-+&ChnqtZla0kKHU0Pvggz**#iX3C3E9P02xLX4dgn_`qFR3tix(Q{phb2FJ2`QS~| zHX>IK>-Y<6b!yhR+E!-$D!6Yqnv`nkS>h+X$1k;k-Rov$$@+(i^uTS^SN z5~|MKD&d~4EN8ch?t&lVe?bRSbUz2`PgkqiSQN}k<5K_&OzDeYo+vee(1v#5HYxi* zFd4-N>c6k&Um(h>wO*L{m*aj;bq*crl(5KB66BlHa27}vz><3yo%}-;H;p$A{)a05xSJTzC}52V^P@D>AwAeW z)IXP+{Z^<4LHxW*z*Zj}*_>%vYY@m186~Y1ak}oU5r(4w=)48dOkPH@7tW(f{Ng8% zcIoiDKcis335rz##D+p48z7Wv9#36NcSB*OR?Ar46ZBQeAWo^;;by{GEydQ(y5xHn z|EBy^al%=MJzpxX&J)yL?|vOj{&ojUr`}XM-q#R(OTnl%)#d-{-t`2iH|j`XsQ(59TOy{{oCZ<;Y+;uB)ip@^}UXd2Qm{LQSY@e<~M0m1qgn5}I&8<)VnTZILNZ zl{9UcK$$NGa9q_Wlr!NLVEuE&?V7PUh!m6}Iyx|P^pbVQxzNudg$2hH+WJWkB4%th z%gnF7K&O$pMLtc0f^OcbkIVTgA3wCM9lEo5xfBanIcwbi0!D(eVr?FrA@U#>Pbx-F z6KU%CwO$z)nyRw&SN0B8`iXf+yzZR)i%*Vf77i|e-0H3TK{Qd%zDV(bOH$(G!sbUE z36qpDZXQeej|)cX%pn1~Y3%5v-M!>q8XqJwzK7f#KdfHnlWM%Z(tR@?R=d$+tX z-vbi?a1eSQZ34ulcmlm)b}ypa=#r_CY;F&{(BI;2eqY!8NcPfnzC|Ls=@YRK7Rp~Y zzx2(g2*xIL$Bp^X%{)d_7qy0T<2Cz*PKb7|M@`(sDxR0maZUYLA2B|Vv5D&S04%2> z<1bqQm!{>r>rp^UH(UiIIsS|Z^U9U zt7#Iijm<`w{eu*7)(DnM>K6xiVRjxUfhLlny?9-TY--<+Z?mnxVi&#L*r-9E{1$7sJsgoIPFTrEOmMq*!Cb4{(oe1&G?d z8ohu%n^ii6AHP?ej2%ItlJe5A1_=(lW2!H+jR5l1_;N)}yI9lKR*JPJn>*_S`mR~C z>5pcud5WFa=XQz)k1Vfbh!*mAG6XHL0hNhE`2`2d(^CUe@K!Y%IzqN+alT`ZuL3tG zTX(lNdny7FTz3}3mgtLR4nCB2Hnak8IaaK(nz-6^>Wm^aw|>)$mlRPKXi*0J$P!)= zvB3NZvzaeTq~@!%n{ALr^6={!;J+F~yh`=mHXnvq{Z722aYjT^gQ5+vteUV5sE>BE z$XOvM`fndoU?&Fye@yL?{(I~N^dgu=W5H#M*e^lHpA2YeWKO5`x@8W92~ssT`x5Z; z*VRF**Cad7lsYF7lUOD-xIWGRaXsT1?!$2dE1|zxsS`F4Z5OJhMxpvG(+j4tx9ba0 z@zs=nnFJ%VOt^s>rWK$Nwz_a%V!#(j-)77(=mU3B5AY1mnXwsYh0vaJ_v)IolKEP! zRP|x`vwhU=6TZ+IN!O9!nxRumdz1>?MK{QY$^v)Ms1{%KO-G4Gk7j%HVEo&rhZ#PN zm4_Z2o;;8p(fyj19wlHEx%^NkvLU-6esX+#410|+|AzDhioRs?z@fcMjKd}ut>1AyoV66RY<>9f zwr6h14@I<}jl|r%->-Fm0kb1m|IT!VjGZmdY!G=6GE4f7Z^zoOoO4WJW7(TiYdg99 zk!Us5R9hMV&aA-gTaX6da&_tTeMqhn@_WiG$2qG7Y&$o4THOLHCqD9C4c4uD!Qy*h zOe@zH4_uynqsO*Cd3Z45b()|)1u9?2Z3x1lO>c?$L!tw$;au3w&*d#u-_)?_B`BBH zg15{M)Dlj@8deN-o^1=Ph&B;mv$I_hE}Gj|Tz>@vf~vAo)+A{nmpr{fdv7qT-{|V_ zil+8~8s7gH+d2>+k-~rau)`c{X&py^gXj4~g3CFANJks5L~F4CH_s&sdJU@5M~JT8 zU3a{0Q+xN-|9{lA|ASqN{s+63!E+=bngWEbLE{*F zLf35ng|3A`{1?bI8C&P@6Xfbl_78)J^pnA4mZ0-rIQH~^aqO@S!HQibOb34corr;| zadG+$hXya$Sa{(8@!JAfYzK@3w5ixz`_`6GRXD`U5aWp8%{uM3~~{B=xOj0vQ#|`Rpr#hrNc$)bN`lsVLfFe(72u%CquP zG}7ZmpA`yV1@)2i2ATE0sNVh;w3_P2nESI{v*?Z_G+xZ4;XgB>Q6(jAXBls|C^$zP z{gOC6V{J}!y6%38TWyxN5|a)DDn}tvfE&KWGZa6c3wBX# zDa+KrWHx{DTP+$|0qBJGn)%USxV_M5 zZgdvDea>?_J!zsB5^xl06gDWm@hhB+LrE%9*lzIMu;~3^3$5S(fC@J9#Bhh5J@g)5 zm|pV$Z32c09&5cmmMnKa3d+5P1SguH3RP32pY4?YCxkF9dtN!Z*(H-GuZ!{ zn#lfpY9c3%O@xw|znue6SU$ z;Xc-~4%2bL9McV|1t}H^>zgk_cMtLTo`tj=-kWjLP>OTukaux9aU4?QvAviVMb1U! zZXN~Mj*=Fans*z`I*AD!nvP*J1Hv8)0@*~y$tFU&omN*{g;mf#hbAq*>lUS;jeRF7 zBYTr#q6yVBaP(t043xlWK=9a84v^s-qX9;lE}Eka0h>d8z1%-@;d(ZwKgadzCl*hM zXRjfR9@v+!(pN*cn6{(Fk&nDDR|?@lb)jvftv(I;BM!%Z2(fe17_%?oTG}x|i`(RC zSd|O+Fpnh%GtYS9G^IgRsr}uF<5Ir3AVU+th$$=nlmIk<9wkQwtV0#7t#MfkMhPQY zIT2nfL~x()Wf!raM$_tST}!WE{Gu78*=rfs(sZB)u`EKbTPMW3JlRo&E+T>aFm^7r zEu}hzYlN0hN|WY65vWC>OkjtwPi4a9!+B9U_FG=)3~OQ_rbM**nUMNIZiB8yo7|2@ z)p8|?bGKdq*LR%@z#gJCt{yBw&YH7(vP(*#FO>Gwq87`_9{=;ezs&4z2mmQkk+lO7 zI6Gg}$3emZgZ_j072+o)L_1|d;TQp@in~IZzS?)qQm@&VO|P3 z-f*-`3_5aww$Z6w(PC1*A0N3vpuhsiccuaAZ*}xWO77KzS5{7@BL8wkTmc%*SqBB}-&?<*R>M;^o%CB__JKM0uAJ_WYW^WDnyd_}x$k=(2X zj0V=DMt*N6V-R(Lrk%NLg%&#Q8|XIQ6j!5a`tmkyAx$T+-6n>2WzS+>+A^01LT$i^ z2fD=uTPSpqMWmq+M<=B5z5P~h=A49}3}ffXtlj6k{>Y_k!OEVlGmb3O-m}d;Bfd@y zdBKS>j>w1y&da-xlRLm^jug*Afg?l=usdxsE#bAlmN8&>19>IUM~BC-aDK3}ByCE` zz!fBaIqmEirSWd>=^?&}W1U0-37|Ps2$}|_hk52Rt^|7?BbsH#{go0Myll*v?8NpL zxna+5W$q=r5>TqelXlUqKl*J8Rva6*I6J>qdb!2V=EDHLI^K|Jv5HKWn&mDayC{ZL zv-QijOX5&e)4%#;?cA^7A3<**MZh!Hbw(ubr5cSsv^9IWuZ5`RdQvFqY>9vH(T+|={;B}RqoE7W}Ihe>?K5&1eSjMT;de6dE&(w&J7Z+<$P!al5)M)>M$ERp^&kQ}Z zDPcL^5j`AGAnk($jSRi19MaS93xV%wETewrX7 zB!1N|jf`u82fdCOxc%^GRiuj}^^1IumJQ;sELCi9$X8#E6nNNKqWO571$8TXS)rdg zzw?T7xEmt&SeE+Z*Ftze00NMHH8w07c$NX9ue5_x1PvgOEO z5N`MuUQ%1dmQ#k5)$OkQYYH5Umszp47Q1zUyVe94`%Hm0&7u)VOy|wgpWeSNfTVCU`u?3J?B#9#3PteyeEcAE{VQ=q_<-tP+z$yxPVV>YX*=_s00|~GT8y1i#`%5f zj!~y*6=xVK=b%~~nKXmR`6^&4H@o9(G62dG7N;Jls`w(aX%7Oa0a4VrM`1y3 zvo`V4$&%4nKq&iN;4%=(F73C-IF3PE+`)jd%qggWhV4OQ5Yq3mPGJ5oLo@v%9zDMU z=(g<2^2yNL-TDX0Zuezf!2*^{U|Tte>(QR2n6fn~7m_-czsnCu&6L}oID2SClpm+v z&}7`;*Qz=Cy95xc@VshjaOLW~zu{|v8+_lf;Yx*nT?&{ncv}Vq5;OgQF1jrqEuBAN z+2$!Th3Wh~@q9F^KU+A<&S0%|vdM%$b{D`Nt^~YUPYMXioz!uKEBU8~lQNE}bW8rH zhg-_q{_NpOP5uGp{*G=o0`_n#oE=QK03PYr(JHeA>e#g-e9D^f`M)DftaQsZsM@q{ z+!Zxlb=|4|f-^0K9MXW`%qdlDO$orF!3n60#!dw0-F>%Ilbv(KzdhW4FSigSNdLJV zMIo@Z%+totT^Q`gCsw3r^(7m6v=OHRUW>SW%k{RYKz{=m46*Y)wm#vuyO|~j*TE}~ z&sg@1z)f{F z-9#;-w4O4nwP4p0O$MQumTDvZfp|Z35;C#&XWz3d)&8e?%ij0T^4OnE4}Qx+?!2r2 z?n>uK0$>t9z~kmNPvl4uK;eK=6jO|I4E0!pf=v7P& z_Q)%jHSqJH5JeJ#s{Z@2kN1nqNH*67{ih)srFVJU5dNp@apvDtwiR}k`151m{?*FZ z({+0qTn9v0ih0mC6hWIa=+#`h=78OvdAv>nE_cI#hkEFAZFabIqN#8yqO9*I?R zb%y&IqZw57SIcp0qV|~Wjt*Ky3VEAD7Z7h(vQKLq)!~@_sEdVM1_kGL-3MN)q>1dt z0mgf!a>q9lpY4a-?`@7pa^VcrpUA6a2vkZM_@y&n(QU{-Yc^Jz^S0#Q!s}yyMjpxm zhj1$Oy}4g9$5gNFaTR2Qs2li6`Pn(imq6^tEWoh)|4GUIe^Imlzbx5+|GS#)QfPPu z?V#(vpXQ5$zvd9rp_>F_PK9aiDyNKHkM8x-VXji2DTUHU6ZO6>}y3b-)EK zw*@82k@8hc)&zF+TRAZYN|02J3&BX&&t@mKIe!6p%U zd1{t-0D*hQOv;U}SjY`M3@+<*#Ph2p^WtP)OLw=#dKl7*kh4ajgAVjiO95QCmHNx; z^(y`%SyDh&7u&WQNQhGa47+(0C~SX+S5KOlrP;_&#`hs8#OzdjuyQanr#*KVf|V4P9GO1H&++W1^zb7b>|v}Xs(Sh+mC8k;)4#@39~s)PN3F9 z>HD7Xa$POt`4?c5Yv4}y7u%ic=XPl-2gwf^Ddvbf6C#rTrgd}xG5QqYj4 z28YZ2eR8mlM$$FV{HsM3(@xGN$U|G4UMj<3X{X2LsKjjZ1n~j!7wr&LZ~*Qbfb@KyqM6{ZS~vzQ$>rI0_tA1GgKT zQvmw?$7L+EAHNoL9S!D(k$XtpPhx*{C1a*z5(XU5T4ypzWl9smR0i!_`Hv||b&Ck~ zZU}{z&l&?T74Fuft@roZLW?ANls>E9D6sn3epWvmARG=@{dkOId)Nc28DUZRRELdY z#GBWum0=OB%w+*;d&cbQ7kw=zy7w2FwZH1nYAC?G$vh?XqgTZ{lLO8ue|cHFB2C0QjM$gp*Q!FH8iV$C83}$$#wmy~6`$E`DS+ z<__jTHDY?sQ{X)sGSo)@38K}3dscefRQKtaO&+UEdJYJaw6;YWBQR;;U1|1A`K*0X zA&)`n`I{L+9ObgKHxfq%WD0=dt5fe5V;1kld$Z}Uj1}B?Ke7lCDH^+^GTX^*$i+Tu zALqkrT)e~1G^C-sLi8TXH{iHxiaqD`*px8_tbMvfNd|oUbO*PC-AVx9xca|t5)zO| zD}#ubWb^5+7|x(zjj|dfc@vQV4!P^?tDJ9r;*&57T>+tU)aX%KG8LPaxj=cL?#og%1?30zNL@7MVktXa_ryM*Fx4CdtD*LSE@k&0@NTLg#;&^CE?Y$L>x9%6o9}lGwXM{5Z;47;IODTln zb7G(v_ls^M_u-vw`HAT?*SckxNMg;J(pKFQ5I}&jL=j;4VdL!P@b}JUxf`p&KyZ`s z8+tL{ZrIJ`<-_#ZS0878U7F-Qlh(+_0j!P{2+~9tb#|tIFZ793OG0L zBdW4StVflF^f_X@<3#iC2KJNoSy!^N?*1MepyvT9{JGBW%70ou3er}lpA>n&WIygX z*tTXiSr@Mv2WZeMB-Au)<{wFk!~Z3FJu3iXL*@Nx4ExFYS@Ns``0KYeB3jOB(yJb{ zYh;=$F+iziU%8xE)6NVy+2)^C!lnmj%{rKyv3oe1#?G?)L2afR+bkfR@NhZYbBDu) zutA?_nR;i91Xi5I#9_@{on8o6ID_OJ7ZyI|Dp^f_wXv-}2FdZ{{d_(rXEWM~X(QmrBPt+D^)a~!$O_&Le z#?#@7vNxzvd34XChOIT!13JO1J~Gl3bUdCP`44iH>RqnH$v3 zjmW;vE+$Okk<+b^_LDV>nRIpGE~f -F{u6Izt?|nthJxpP%T-Zbs)d2+fE&_i5{>}^qMU91RDb?jPK#^3 zF=%+z7^k-dJ8Q37)Y&p%3@4*;}+V*C5F7d$?|mn3CHX%Z$RAK(Xp>Qg(%qi_d) zkd8$of^)&D<9;FbjVz!AM4-u{+V2ma`VFZf$`+3iTk@^(rwR5G-4_Z(1qE9bLK{&8 zt|P2&_i&7oA>CRl(V2=&dspS^!-LzJwf!RqH1iSw?87T9-U`G)WtOa+wA#6lr`?j^ zGd(~63nv${VOmXHe8a3~V^dv58bhy*&?8Y08I@#F=aNI_7|XKXBqG#OnCfIf=Oy2< z8sH}A4v}~;);hx}#+mR#arFnJ4$2i;V{~0W$`(VrxGnH=l%s`?8O+SK`Gq3#0L@C7 ze`b<1650Kp4~6|cGdS788e}uYuRge~bqDxn72PsT#LOixxU!3Zpc`vep2R*6GW@F& zJHOzoo&=6i?va|K@L&r;7<{Y<2!4Y}#V>-@px0xC5Pr5K&5T-791fqk{q{pDq5_KLL1? z+3OoSJY`*Acw zu*M)C^53$Is&Cc*cw_C|FaDVUxIW8ZRFIC$8dmue%YDiGjjtkVr)@~Xc4`=VM~QN$ z#`B0w?JSmC$JFe}_Hj>(-_dv`aE`VYzaU-*)S(%DvjeztzgTw&+j?DY$w=)EOd(V8(hZ~RGCa|3X0m}`)1j$NND5a z^xkj7jmw&wegiJJ;JcC=z_AAhoR6G#t|OK9_5(IVf@GF%-w?EqKj`Mzl3C79>ZD+; z6D}!z7Xk_RM~=Rfb=tV%RpE4A75RdXRDllW7-Fkd=SAX+V*i8ieT7-QMz`gdsb`r} zz(A|VgPa34JN4N#ICU@G>fnb7KmLS$#{&6%7Gh_KRrsa%nSZQ1fb^#Dc~CA_X1h&k zZ@c`RdK&H(sz~Juc*OJ1$!no1tZ8kva*3qC5|fXGx36lXRYE#!<~~aP=SCWg?Exqn zFbN_G4o_xCS?=NK=rj)ro&47y1!xwncvcq!=dgBO^D31r@?qQfdj0l$^Z~6iC^J8&*5NfPpMQ zdKC8ZE8=wHXyjR1j80i40IyyN(x7O+3a+u@WZz3q18kB?vxMPnvk}`TXbGhVpD0;c zcY7RMK*O^5xU!DPNiimm{h_gNCw|!+S731k+ zJzed-JiYSRMqE^Sj+UC@e2QFS9U^N?vgomonIIQ6b4VKQ*^2Jeid*!SSIy4}^djvB zN&24wVKz1we$kIh7PKu|Q1MPd%|&JH6C(^!$r)|R4a)M+eZ@608qx;)2H5?*^tA33 z9kbCsLo=Zf8MhCaXO@K=m(f-w=C#pw%slX|Azd7LuAMf`e9Z2I`~}z8d*KE3E=Juj z7afx`uKb$MX}yTtTgkfLC8chhn3g$7+z+R}d2Xwvaf8R6c^wHu2&UWF%!m`QrQg)5 z$l8vxr~bfwKUc66;( zl6T&M?{0zYW8p>QJ8B@0xP*5CW`J~z@91wwFa3d0bk8N=MV}sR!I*F|JXXmc2Mg8!&7LAj6_+ena=>JUSUN zCU8*;V_#%gtN6s6R0ED4Z)<$Dx-L^r6~`8SzKwbE=5$+)na;|LZl=Qpq(Ysh*xd`V z$8r&_3kyP=_z_zzIrt)8B*+spS^7k;@XU^GY@HR6Pe} z6#a}lPkV=`QXaFyVM5(Fqq!vhzgT+&MlB_4ZH^d~7pGI;i@3?V|U06D_$+p@yut->e8Ea}SmHyRmmm!$7Z2!w1cr3J5n+^&Rpq#%zilOk1PKYq z<{(s+s!WtgW2O3JAk0;|HEyNQSKl$0U4BE+DJbD)o9FsDMEKf4L|Pe}UKYUP$L}G~ zI`yB^QN;&d>9EUn+-y*=_&&Kfo(B&3@y>-*xdB&=4A~UgY;sk$(qfZEY%Cbr`!e2vzk6_`rtv3 zJb>`yoi0YDOEp>9dc8Xt?srR99Vko8i$IO2r&F4h1X<;#(Igx82eZ{QZi3}hO(-Rd zq>&ep9PrQ#yny8K`)>=W>4xd{Pv~>uRrlqMkD3y*vpX(*zJLLaaXr;ZutuNp*@(67 z$V@-`G#q>djFq@tw)pphMkua_7!MuGhq+KNiy0A+-jg~UvD?iTUH3bWAyh(+xo?G% zE5zXgSsM8xRK##lFgCG%Yxoj-(F;TtmOe-~M6-MDID%+qRmPJYjz!bR&XGsL$Z|)9 z4Yav;OYM3K5D@6Q3|1j~r~FhU9dx3h{uBgAY>=Gf7NKYtl#nG`6Y&qtNvfcIV;bfV zE!1u8qEV*xBB%c?gS$%`0%0KjzL8vyR#Yu}UaAvKyV+H*TH%3t3fRUw3p4q5dhNZt4f zT~99=0YjCJKUl|DoLoJ>Ue5+KVFk;QwHjBj?T72&7o@#f)ev#9q>TTZZN|Coddem> z-CdT7e!=$TT}-`}qa{&~Mn;O}skEFFLu0Z=d|bmoHg`k|7*9qZ^E0#*P7KIJsjiZ5 z{b|xk-<(nMlY;B)*R!eHp!}B_CB2YzZbTer2H^9;)}&Q^?8XwCKkXDdzV%o75iOg^ z&jX~U{4nV08ZScbL!+*A0g`_OI9r4gU089TV;aj~vCj+1&ciYO&~Xpd;lBskaNW=?BI zX(AeZ&k>y;LoB=5TsiBWEgeDJooqIonl&P1W8HN{S1gb$Ux?H*fY(PGeK*rwgZg27 z%EVDkj)a`$x}R@*!G3+JeW%n;L2aCf-*jwfKNpI$vRgMkz~|dD-@#CO=}GSrL{if_ z-w_Sa;Hs9D<&cVG?pA;G{d7j0rj@ZB63;FiJ0ZOR(;0`1u^Ut>9WHC)B{ANCPz>x2b`#7f}{=lfL+k%~x_6+H{=N=!;LIOD`e6P2G zYmER^ARu+TKlZDtaBF;OxU%hi>h_S-9&;-cct@ORn3npClNs+6K6jl705M*fRsh`_&d8nzktL7xgay>4ARRK$T<25D`nPAMQs;$5{ ziR4f>IbU~|IXGs93k~d`%h2ySGo}2s^iT0>1|R;g^zFEC&B`$ZaPWDR1;Y26vU(l| z9Yf8uOUxxF{ymeVrYtGSi62cjLTph=g8{7rA#w*M!F33Ea?#py6pP0JEtFvsHaG8X zUu_#61_QA$o<7aE#I^@1+4wjL>YE(r zSU8m*kJ7h`_Q>n%>~jHCVQNLaAERp8F;gGjqX6HT<4FkC4*#?Ptr_{#laF`4kLjuKJ6roEv7M{}LpQ|H@O?|2{tGv@#`SOg396z_xfHJt37+FJCePvaXDxSQ zwYcseSGsAzqj*`S`1iT0!f6Egl|LeN^$USGRuX7PD>g5G4zBG$aGL)#Rjwuh^o~-e zEw;YASDs1t5>WBI)Ng~B44-5(1exn;{<%J*cWqkhzeR>t#XN=SW|GHQY zCr7s2l1{*_4N<8ng*RWG9asSr-Jy`>9z+qNxO%%A&aBcPlD4nIbV3)phM$vGUN=%7 zh&m8BuF|R1eInmP0;SKSkxX-h_cFsDOC&;?S6pe=oOa*K>LJ|(bZhIu8D!QBiTP_tATn-GYDv`ajcjfs<7!V%JbZ&3$_P_`R1xp| zwyTak%Ax#gAz}_vxzx&necl(4a0%VUgQ)$%VCDh&qjw}xeOcWP=0Fgl1A)2e`MKfY z{d~?RlO%C{8B}6Tykwq<$$jV6{peyT8ZGv>&|rHbZ+(Q>)VtJEW~%r%T05Qy%^EQ~ zDwgQfvOlI90XFQZvpk8RDv3dFp+={9tsW9$jmwOSECZS#JU={DZ9CRgr}e0)>buC^ zZ97PdZNl(htM_BgNR9gTL`PvrUp>ZqM;esh4c;slMPVQwlB!N@O0UUqy41WA3qTqq zjkGHLZF@FBqA1n2XfgpD$V+_~fB=_Ly<)n1vf#Or2H5B);q)NERzGnSYWE)iseWFOU~>ScyOLvoPC7u&@sKlwjv zZVKr6MPk$+($jrTR|PxdPBqGLjNeES%)_^XD|e5&Pq0(dT-%1B$0zAXU;ODFT2xs( zT=(e4-YdRjmu~Z2;$>_##n@eSK-ID=iNNQ`UnRp@hUgl>bZ!)}!Bs2l*H(EH6)Io9 zPXvE?aOq^GQ8^tmTPvR>nTK^@i+kgmRXe9gh5edP0BULwzv$Y0~2A%0Zy2E|BqfTjGpGW(oeNX-?A!mF(8Ow{bxg88Bpq9+SR$Qqd< z?aBJos*GhG{+P4|htBPh1;C$0Z+5Na=n%BPyY0g=gq*<|8lL=+xbp>L=BCzKZu_Y3 zJ*Lh-R`!fdDVdoa@~@*&I95BxEvn>@n!n-=4QHOALbn-jmrCa93Dft~wyKxBk10=( zWa1{&G{>K)Q??EFq%>O2Ie#wveK~|IshbZa1+3esVPQKxs)}wJh5)oAM=B#l6^Xpi zJJ=7l-)Apax09O7qxEPDP?;^rOuS5F;;pv8_0~ z8=DObK+^2}Pn*ljfUw$W;ow`JM1`xc3-U;X(-QIkhyB1+9>a%M33mR3ld@I>(f7xG zEk1OR<&j?dP?zw*HiKR^bt4PvU+PfukfJT+X!mDh2PiKl9#6u~&|;Fx6J>wx-91Y&igs z9cM^G1MWrikbaB~kCpP9W6-!=20{gbt3HZ%Z8IJNNqO^GaLF?naols7w`d9f4h>8( z1iPA$fYe-kgK?dOH(e=TiM&q1Iu)F_oXxPS#=^{VyHhMq>Qu>g_{Pc6F6aUFG`Gse zmtz}ilC&Twon8n5o#a5e^L2E}Ixk_LanPC5SE;_oIK6%{%=b}zr&v$dbogHg`neJ) zo0ymyRp7WcHJn^Vz-ww2OxM;~|Eu&2uVUn!D|BcIpD0rcw_BqDFEDG138(n&v3s=; z-14U0!E9|~CGJ6(bs!)9aF7-j)wmxO2W-jF150t5npR%b!Zi^2_09TJjx;hfzbwJk z>k_1B+ux0@H66%%suJQ;{uD$cH$O)wEAlOl#qh=qP+QuyMb$)3rY(>_)95j(jLjKn z|6kpH=rx`%Vz**|((9}{@Y^&fkKu1FAd2j)MgFAP@@o4WavNF2T7+RH{mL6ktXM`b zvlO`{LcUOSeg^Q8;9HrkcStBb@S)LVnsQ|^X1_8n>2Hnkm?bfQJKBu zH>s!rMn}4`N0dR!JK+dgi{z8gC8xh7AjOXyuEZc+IEMOv@)xb{?S8sB>@x)f2vE8Y z!!OgiOs-6qVUb(%F>Vet$)F)~&quKa#9RqdqKdSAC6h|6wnj7`u?XZ5Gt$z~`X6UJ1 z9=EP|djC2xDzL|VZ-S75^6Flis!4p>v!oMEQ^CGkjnBRrdD-F!p{ChH#q*040oRmv zelo_(r3Z)(8*s{!980}>gm*kYT`!#_>XhqspdGD??HX+HU!#GW3I84Fyu~kraY==C zCfO3($u2t(`G?fYp$4hof025!B4rFZ21m<8Yfj@s=f|tXkw#1+!kdKIMrEiz{Ec40 zzZ$fU*}9B5!XDr+AE*ofn!`%RT>z1-$&+VVz zu4&l6RUpJliC_{!5jkift{V~L+SWZv%p>`UU>f5}{@K?pKv z$2xzclN=6rwXTDsXHd83Sy?hfqgDNkJSa$Ln*#&CY#@>|0qXzEih#oK5rVpS0Xz7c zV229=W>aa4^}+)%+_Ag3>WJXWA&Qlprp}=v@@SMj$|!B#frG@j}4C>^Bk>{~P0$ zKR&k;Y3~RA+)dlF9V!m2(YTGn$Gz>=RcvUe5Cb=YYR2b2{t+8kzvw@ zi(uf16EJU|nZgvX)V$iJTT`?s%d2pPk}4ZtD)Y{iZH5P&)JyXZ@l4&Zxi?$;`ek1i zeEB)ccs#*eAX)UN1>Gd3dNbd~W|F2E@2y>!AYdp8!}1N!UkS$5b; zwqu4>LmG`K!pL#GO8I)!d6Puvdy>9vh*7*qF!}cX;e~Zxc;WMG302EkK-m`UYbO=n z=U<>#7CxsK+-@nOA=F#4iAUSs4t5xLAFY<_F!qZgL(ju=8oOXGq>O^lVooAShBQ}M zKqT2mZcF0(eX32MB1MR1`C$yudLh`{+bQ|w>QrUeHs=p*^Q4{&fgDOVdx8gc)0{xs zpZ*c&%g(f66bFK#LFNn~MQaS|lS9JZ(d7U%@@juKE^--FN8?0%(Xf?y8jHU^YlcPr2SUY6R)2(Zgf1Azz0^;KWY1ceHb zlNLj`lV>uIE;^wT)%fymnV_~Nn21NYQey~D7llsf=eC-x;gPxcEFOHdHLh6Ika9J9 z_3~=c#*lkU1Qzcck67C4VHZAONw+^kGeje#Qay!TGc8#hA_bxxotE5J{aXyy-Mk!Y z?@%}MY^rbUr2#9}1tDb2*P;DI0sMEn-8OvH&=P#dM7DaqihBpU8cxvxdKuRWzr~kk zeIovn!*o3o%Mrs*sdAAorOu-r>`)?&Jo9b zW;hS-e9fXA6kzXy8Q9@fXyu`E`F5W1l5*+o15yI;AI}RzFuT^@0p$>%i~+5xB==`t z0VHiR!X)t$IG?0}F*sV~A#|}mR_u%JN722>H69>v$H28w2%lRz9F5@v>?pcNWXr(Z6gFo|(mnfE;w0z;qK=X1yRBL< zCD9by{B**9|%(~8g-}u_yvkfzkCV{e)FDi8-&!1SCLM8ouh|_ZYeP0 z2-_i|ag3rA!%~B`I?AE9#@jW#Hn;hd911lNR3y=Ol{uhC=4cs|B7^UsK~a zr_Wo_Zhq}g=e?hann}!+s+qevYyE*EP2!P~(^Q+k^xkR!v0BT*fOx;lKs)@ClDvBm z(M;rX#&E~{5}9ota6#hlfBB1`(JAVk72~Ae25G2m*vKZsSN{&LK0*ndhqvlqe7_#1 zJi;WX+FBF7Lw^$LFhUG|+Zzv05AgxBOmZ_+OIluc567;JXte8l%aNSA=#!VZU?3&) z_Vw`U$*91kz}s%reT<|Il+62RDJ&?!Ksaar}4!+q!S zu222YiGrnas#-_sM6P@)bUk>U%SXkU@jV=Q6QQ=4PJBs(W`^gN2On|)=K2*^KZhW3 z+-+hFz5BVaV>b#Y-n>X!b)NUu2Qm*%pP~kRT$Z1M@I(w~Mod$3xA<3a-yNgd%RG^n zI)vD^`T&b!zkmvHbvhO~A+6xBIZkon^F7y=p{rdEe<}7@+C!y}G)CcOfUDpSR76J# z>I%8%i2U6q{GgvPI3>41uWg$%j7+KOAwW24aNpELN}9{*ThCJM7C0m*Q!Gr?v8Yar zbe3y!#Jj>`A2-6~v`9lHsq7|+Js!LKvtnUgT!3;itU68oAdT zpMGpgG`A2mItI8>1X(>lW zeoG8J`URN|h<%c>d>2yLz{JBxLYjPP=SE8C(a1~1H8@La?uWVG(I%HrD8`w5_dapbcw?a2;-b7B{xz|PDO|R9m z?8z3hK*vc=4^bIuPG}6`xesu3vLS}9wsCD4$tliAuP!O45Rbq0^!QyB#9bVIxe`5g z@#RU=!}J;KMEy6QV+aPfqeZ=NLVurJ)0aVC9!9|t>OY^{J9IHq-{vpJUgKcp<%!;K zFcnq*XXRj}Y03PrDXI11KC=RLSPEcpMG}5GO#tcgPO~~ps1N@GmvH~pA5*qX1W6hk zfu>OuPEi;%@8TjGtXS(Hs@*;YrTjh5djM(vyFOFvcRjMW_`**Iy}b~rYean~VE55{-QQr?MmqNap0 zMT#u(5*Y-g6426K+D5MpQRa2zomt5H1E?m zd{}Sb&y4V#et7qs%}wA#1Uz&)^?TcQUxTB86ycdLVyi#oNbxF_-3I?%FrPb9~Jr>u0{Sm2gsI4HcLu(Q)3Zh$Y?u3Q*1m2JNH!`2Ono;7iU(75hM@5;vFR`R3#pTFad8v0Kj)XocO~EmeS>2n~07V8fe@NLcY_QJ{)# zL?l2EC6x=^zHY9jw=ux+8urYiwe036S;NIhxJ0I>v9p%qZRGI^#)m8eAMceR`jlaz_m`YaF(aBklx?dmJph>fu+G&P~6nQA>x^82c)c({1z z*MygP=V-7+Uq*Zm=;qf$I25oFODw+Nj;fF3 z9^#Tzf%`@m#vv-~x-jrviLr&2{sN-#B2EmMiA<;>H90_|^5pgo4YSD^Ve zedl#!&z~U=goGEiOnURA2`DUq3au@u(8itf1b(iG_Ih;Z*8Fg^}-l z?WG4OZl&?^WE#Zj0Jer2Zev0RCmSRQs*|#RkK=;_8LrBrgR)Xk17&^v0vw}-grWJq ziP^~vXknxhThf1Yi&My#FmbqWG-r1j7u?+j@&Ho<6i|KIPORE$#R<-Oh@^1y@SK6_ zOWHHh!DW^ zK)^2-$tzo}{wL*nz@vf2E_{po??2TKW5=J(l=Kq4ZE+ZM>d_rKbJtF57l$Ldpa=*Q z<|s6i&-W&mZRLMlVF}$ztmlF^_d^Ag# zV|th9v=rZQq!{qVARBI7JBR?_-C%dj$838Fx~3MHCJqvr>JC-3+;=6jJAs{EG~of7 z2n12g;~p#nN)p+-_NGB?@GVcjMvm|1vzC-JJkXcxZ9QdNkH!&r(X$=lHa=|+)wuY@ zO_jMF6^ehmU#N3!oupjtzp;r3=@HvBE+6c0tP9bhhL)TmaAZmPE^+)z5fgz-0fP0D z7qzY&apQhsl~}xEw*W&$FV@D$u3>uBJd$vHp}!?6mn2-|>fdFo770)-#JJUHQO^i|$EVH3XkIs^t`fII zA;>^a<$Yy}n;zER8G5#eh!NW}2Qwv>61N7O?xEmA@dzjmRpKRN=e(EgIL)C7mbBp_ zmg-P*q2UP(kYi}*s{`wOKHe^cB*d1v(ry#`w3#fZ+#gTn&iu5_ewM(8oBiH35 zswD8k5OI=44tgLVzT-3F$*tEGOkJ{x?C<4A8|98zOJ;q>)!!Sd$+3yUeDD_obNnAB z!*T~VQU=fG%3ZWOzTxFw-17{v=Zh<{d^q?9@hYibWk?Cfi^zoA{@z1-|7z;|UOd<@ z6b=NkkH8Em#<-i>2ffIKIn1d5#6X{vr(J)vsV5wa`gP3}tne)UM?qpYk56lmt-0## z^#^HWr>7@RahG%u1EZR`XNGRMiLHt=@YCv+T5MVJ-;LuoJX+~=g|s=T-TB9 z9G%64l^=^x@0V;sA^29X+i0T8RrNu%itRIB2{fU>^H6_UcJ)a^6e0~Ugs#`&m={3a6A>aL$VQR#@RLQ73kG0DIx9p*o5LlL5V51@# zh<|gudmj5piJpXzk4>ys)>n>t;P;B?iq^8t3BPl;V>*)$4Vzh62iK>_Ia8FG!Alyy0Mgzziol>D^^dptDZ=aTe4AK5>SxfmNUU2=$z81+(v z-Xy0NZ&EPmO$s`H@g^c0&(e0 zpC8>~M8c&$*cc=p#BF!ytr6q5=%j2FnsCCNX7G z3uM(05)0_b5JM;ED6G&J{oMrp)VJzwDqpGJosyj9h$x4JeaBnc%1F7%T%Z_g_lu-kHw+ZwP`^6(>z=)*{@&zx}jVIzaVuZbR1!NS9ps) z3VS?!mW1hUx+n?`+?M_|WGl;lF`_vzO8wC1C#0GuYqk!6gk#-=DNJ(q8ln<^AkFfl z*OIN-VvZHIPaZj_ebXDS5Bf4pf0x|B*((r(BSQUJevfucPRY!u}4kqm!k7%r5IA@w-+r!d^#RP%y_4o0N$@Qfwi0?`z z5btVEzO6+s@IJ!zxY_%O7LD%}p7pXOl-isiye+OeEP65%&LdzE#3|4nU*(digW~vE z?xS3pbcnarq?4Z3ZRAn$f!IP`RZ?E?r$26!sOAHZwg4!YOz9G&K`&>l7h=g*ztU5o z&SY2)G|-h(gA{7FI`8%c@y@>$sGxGKXe495mbv8Isk}4e5Tx8mk0K9hJ+U zlI49hlpH)STF^TbroR}dkmgP9%j1Z%v9!%w)7p@IyI@v&ts~34rQAVc--0IbEx}>j z=Obx$42nl|WMaoriTF?Gso;US{J1N}E@KeP_%=$oLu{Lt2FLP(?hae+{Zt4|Y}XLJ z(1o7x)5aBwLtOdXCgR{9mNP)zC&SIasIHGOBc$dC%dzU|#Zvw$VLd~xQ%>2~6{hZ@ z1OhDimk=*rn{%xHsX%=U+|`=a7BMbPr*EH_F zQoD}AM}vdbExD=Eaj5qPV?#uTjF11r98Q7p--1ABDw?S}+)p8K$T(tjW(TGvjBmxy z4`VVKkVfj07ky*;-lwaV!@p0qCE0PmkvRmfTjYwajf?^YIqkNy-`}6%*KZ4TKMF-A z?cZD1T!MwP%XLDqkN5pfeTY6-G~Hg(DBNEzKtZ7Ch&|CNNS&dE$v*$~MG*Mz#gd)- zA_!#Vb#GU52ckLPgiVC72xyf-eX`Fe`cqm+#(nXXG4e+m6@-g?i~wY;lJ(%?4Kuwa zeqNjjKmI_0R|^IIrfsD2&9PAO-(4vBmBClshpEu@;uF@YqNs6rWq70spi zTEtU)3(^0DQpSVn^${DW2b6tf1oZ$X0475g*OrrftKP!9%s6YBGuq zW(=bxVc3tcaTgN#o0skIW51RpGH+}8VH`6Ss=(m9=bmE0$;T%S!ZBFYo25Jm%E%m8 zE#A-*cRf@2Tj9-9^1yn>M$iFVpe@@F9oIX#`L^Wa@p(GG3Ux@QOmhv z+zho$Q}(LNGWalU1`74fVR*&CBe4j0P3kx9`2@S}p)z|WoT*vOI)^$?6+?83Bm7}v zSURkT!nML6TDE%m`F4P485WRD(bd?aqoSvlBTNh}h{<aMD4MB{zz(DhJdnxL2L)x3a~$3tr0%|P&xHA5GEdd? zBoHq9vfee;I_EGjv`#RzRS4evENHZ{ZQh5NsgRie%#bafYWxl%~K8v^+2d3?j+|Iw;s4}mOLwQL=3FZoS0slqjfhU9py6K39 zEeQS|5U%9gJ(UKy!19G%wfA3xsp67jpW9WBz7`y1&xPm3owS_t`w*_Bm_x;=76efr z@!FaG!umku*cdpBVNp$OE-snuUD|MHby>e`{=xA_B^-D2E#OST`ZpyPMaBT8=0 z@uLSO4}cqn04escthwxoC&8WKi_WKDbbi9v&EJU% zD_7=#2BUJf`$o}??osnCJST8IHn>@fy52o6QIm=n+f)BkO`$DoacuBJRu99+%8@IV1qUdu-H_3R)-gKzSWm;- zZz=WRb^~wg5gwc{Q>7|ynFEi|pa}WWZ<%k66|}+H`73l0M5JSZ`>Mrw6O$ZcuH( z;pc~N?0iXFFtp)H^KjAtWfNM)IfgsOQiwjOG~iKI225M10Z}oxA#Y%lND~;bhL3%4 zvLYIXc`!^O-(K;u8x&q{UAGHoLI>_|9iLgUA+$#mePgF5TK`Q1o2#6_xgn5qN*;Rd z_>#8BtN)v}h#N3g>&kj|GUScpgM6KTeaywsF>nRF9da2RsFUfc^xI@>)+Zj+(}4d< zTcD=>leVaI7MqW||90RX<`CF$-Eqm&`eWl*GHpVYz@mHYY zSZwqvXL|8w#V1QhzH+n;B;u7F!`bXtWj9m-j=c)WU91B4;4ypu7~jfL+qQ=Sv`y=% zyPZ9`F;BOP%*r6LfG)W{V zJfCQa$q< zXs$r!Wh-#q<`eyRl#~~x8^jP1&FlULvPJB`mzK|FK`aulogf-mT^`do+!1JN(YE<@ zxD!2#uBM+T25-fj=s;W@eMVL$)Y)MSCoOqrpRHIPT6WDr^VR1ht0`Rb3YQ2jShK{{ zPM6Y?Q}?Q|2kYT4iwC@Zhwgp)VG^!eGGYLM6i!CGwf7_Gh`;2OAqD^9aj*Z-2-~zA zW$5$Ds*MTt=cY^ctXcip*|$wsZrDiP-!9Nasaw!*u2* zen#qckqAdLar5(mn>h`pan>yo*b6c^eY(H4;!8u`b(_xxMUo4i99?KfcWWd|cOZ|C}2A;vz5h&dT^bI{?&_j{mihd+lkugD29Z@YhBT z7V*(b#N$Yi=QY5)=rVYIlU9Nbm5xk%A4WZ2Z6jqHeCyUPuVIJ*w;4{0HJ*0UKi)%h zY4(a;HlZqrWVihNpQ%%n=EK$VS9J?9Zz-wuRuj_Ho1b)#rb;7f!dFdc##lB}#^`_7 zOaSLT`@yU>k7bP-$q*v@I%@KCNjf1j-}DXJqJs-v3~!)55@*N2@P^_feXTbV{^}7` zcbWG#)IpB(+@dcRqqtJ&FzXC;a5$ckTGcsyi<$K|1jPI{k#dId(bnkc5?4Yfu6k}2 z)7_NSOr0$S=wRNk$7eRc!w`s7_O1lO;edD$0`pr^@+YfO`;!YixMzrq*Y@7(!4NLkI$E?Ev#idjM&-kVKZLKog5UDMtQw<#f}qXFEP z$|+sAnfp~mm6FMG=jmC~U5Fdm`@hHCh&YLJfC;iQgqP{B2aKcoc5FgtV-?cTb#q~? zFrhjJC|rpdj!rEho5)D3aDDyb7FW+sfXMY>YWx0VwZ&~;KgA773H`sA?k~@5+boJ` z-@h#cyd;qvHCYOF9wmXwTZwmli~Am33S%|dsTen+rAOIUBi3ncMfs)$NJ`&fiy%gW zFwaYtkhM;Iepyx=OW}!<(!7CpL}g^T5x|-A$V&hf-w{Hqp^Cz6km^3rg4@7iV^USf zU*GH2UoguD(=WVt<#}@uu4f0&rj20wrR0THwFGHZF7$ICP^xlXuHSA8I&*Mvy+kae zdAoKY(_1d{ExiN%BR}G)J(h&+AiFxTaf$67l`g&viJ!pu7W{GL8RnsQ`F2#^jF(Ju z7CJ1Ld|8RN$3Rf_H#mLO0WtgRPhLl~x0K?iuzPpC;mJXIO{>@#nDpd+%VU+xkZ)r= zBaB~Q2`L5K;_ZknZ(u{9Lr(g+>@?2`#lWlh-e=6M<(`>wMGeg7{p!$7o=J#1ZMD7y zgD?NbMECy>&kg)vCc0Iiaq6z~WJ4|Gc=yTCR?oV*D_f$^(7*%Pg&@{nK*}$f#f8Az zzA538TIef1jRscSK1p!|Zq{sDmnuz`1b>Di{o|W8YG8&;Iyh)wh1%R5Ar=0M#WVgG z=LNSTJcs>*+h1V&9n!#0SpK^y=>td;ZQR@|9W#vpA3xPirl!DqJ`zQOio`hpGH`CDS%%%a8`I9CBX7&-b z9DjPBzeasVe+t{Zof99hBGZE12(2bK%`DuwwhhEO&DZhHfOZv$^!eD)#SfGSwNaZf8Bv}Sj2kk+UFy2aSY5$FzKt4<8#6_ zsU@B?9%)>nRjhJ<{#TD8pm9LX9d_HW^gY;k3M0*)Y1G_|+d|9BEXSkV&wAebwi|>0;PpF}%4$^LVkf++k;Hvcy!1HgGojA{7q zJmpM-0J6=o8DGm@=Bct;aGq*;;ApEI$NffC9Q>Nt(^d8&Bs%f&`1dSy#KPA`QOr;6 zTrD|^zQt%4PBJ^AzYA5oTZa-0D2Gb87R7o3tdj&&+OS+9CvHi#kxJr~-*D_Fx&Pb^ zu+(kYf`*KmcnORFBuObwo5>8L+cBu`3$BuX&%}*}O%PKw^Jn^Y+jUmis9I1@hH5R8 z^w+^RQ40+d8f@U7t{PmYFDC9G_U(KoGM|`e5B-cpI=#=K{j5iOCan=V+Osu^~Iz1kMN~Gd+nrTWaqUgIMHhCZ7#J+ln39 z{AX3YW8<1qT_r$DZ|SKxg=Q`s9*9pb>s;|ulweM*St0Oud916 z9*@Li*0Ktbv?-kQhOU0_AH>VdJ6ac!Vs6?3p%nxgdKX%RuGRuast5MDBfiqz#0=!{ zHMlw~SjKz4`WGcSp*co={Gl~HaA7Rq6&@SRVsV zipt#(p_*>p7L3iICL#MwCp=!i+iVE@EF~bBt6X#6E<4C+g<(($!$46uSu`S5$iAip zB#;HOF+kfiw?LgRsV!^4$>wI)c*8lFf~)1{AmM_*9GR0#P2ii>^u-o=hI~wXARzA> z&D~_^lKt(UJjaW0#ApK5deos2%5bH}FAuc&F%y0ggD7arh(UY|eVFN<{W<;uV|Ggc z5P54|9p=hJ$nE+D@`$PUP64?))=?a6;G1qt`YL$^qn|HnOTJ zhz(-)$I18Tg;c1_CgGX}qkNFsn6bD^L62Tkl|+Tv6BR5vqgJb}+?O*QbwD((h*ELW z%d2NX@XOE|j3rVF98We8*fVDOq+ad@-;`%RF~i%>V(|203#$MvN6b>$u7A^*?md6C z*KvYC-5Q3d+1K-0XEWcLcXD{nSesuGfEcD{T7N?dQP$@W1O0tw7YXV!Fmz#*i+dJ< zc(;hN9v>6l9BGDRv6~F$q-+ZMk+E;Gz-xXXMnL`rkaP=GHj_4s&WRrIb33=VY0d}k z+pwpv8AP6h)((wwi0LyX7+UrH<&pXT72z)7=6vzb=Nxgn{jg&}(liX7*8b;DUW99t zW6=A-`#WoeKMV+})&|GVATw0u!$D72+o9%&VV8DlVu1}km3AVB_B1h9u&t;U+d`P& z7!dX&b^=aD>$<}YyTydav#2y&(s(@0Ls4;>|I!4%v?_j?5;?sw=c-wl(77@95J9!| zow@s$7yx0E>qzKO?5?=`!0f7e^VF^;zohyKL~j(}im1_lW>H+d=n|MY(J#rVSByv3 zyf;nL*F1(nJ=EwFFCv>6voMP|pl|29iE*~Btd3ff8Bw#CxV@2Y7ri2NJ>r*$pi3`n zAD;_~Y(cO1ugr}Ct?_$SIvNEvGj-}BH*59+)xX)V1@@Nm7ED{#JXI?!ye5=!JM?3u zb62CUlr9j6QRqvN7|IW7J5wZY4b;)veMeNMr+!L4n@F`2`IX14j4o^sC@O_o?uJ=k zKZwVF8AX*u_M1N;d$8u4ZF85HAGLh*)eWMFio$XC@n5EJ>A=F_I?C=1HtyfDyFsf3 z7qE?!o#Lh4dEU8jLgVBSi>g^wzn>0j3x57}1^YzI2g&|ppw!!P#kjtZ;>&^cZk~Q? z4!8S-f_H}1joVu)yf|v0%}5j>-v*kMKItv{|>*y@J`1<>^i|r*+CaPooB0e5YWTHMYwK5zKE4Inly( zYlm1t*f92tvw1{GvLEZ1C|QW+4?~nBbXboCG$5gSL(TZf7Mr@v*upN4`gGN?os=WJ z0rSj%VFNaInxTE6~!GAn{`wE>XB|>tYmupOZb2p}%DOQjVSVs&x?GQK6~i zv$DTURObi3dmk#qV_3fE)a>b$Wx?f$!rZ5${ZD7hSy7||wlnXFxinnxBSLzhpElj< zp4Txd5uwj>*tc@8*9fA-bJE35fzX!UJigiG53{>d;m=Dc#3qXEMnEU+f5a}(5=05g zO8-gYp)sSG;{3}O4PhN+yEq1>@lI>8)bJUKEIgWrTuuZ*fx5*h7dI>h8%u#xbX02; zlfT|N_}BeKt334RBwZ@``wnamy%FJI^$Uu=E8yV5M|MqLB72an`hD15L)DBd$x3*B zL5aMyA$pBye5pu%!QsB5UYcw3*@3IiNb*M^7o!cD>!QBqnZw*!HzXG+uophkB+Pb` zoF0xg?2Xd-{{7tmSmbULA(M^r5bVboPRWU$QKT>vnK8prJ-ci6^^szoRJ}Ky`lH@h zFklX|Ytg7PGnNg*T^YKfk%*2H191Ee#|;%KET67Y zZ5OHHowV3nUYVhoyeC3Z$u6MuK@uy@sN>N5XLsc3R4tBPkAHuCD0v*ag$TN;e(+kC zF%&5zeeL=r!6GNcHow!iH=-vVz(+)llX{?9Uj0ZqwjY7;c(HQ!o~!9NipJ26kM!!) zEAH&D2m)L;17XnP%R>yChwwabfkK?S@#gcx@aco9DJOGz+LBDQb?wG4pKVmYk^^A= zd^bFXfQn3Xw5d09X!@9kyyHU&9`X&mN zG5@th&>&Dhx92WU+wNu0NnB`M{%ZSw$a=^2JfkgK zyRmIFwv)zIW81dv)rdq`ycLO-gAy|Ue}pXx>M!b6pcZJ z?hgH(FdLm1jwcH6S>n!bkXbXU&4670X4O@x2AEWPXQ*wx{GfS0aOIvSj|8Ui2rGJn z98Z!qIqjgLRe@1=a3GWikFZA0{+14lA*Hvm;DnkqIfO^#teV=Z|2JBAaZ^B!^YOsN(*(f}q<>LsF8GxB zUyk#_gHQwmJ4~9Lbf}NvYO@Y}4hURvw&Sp;%EQKmw}tS1DS_mZXyCAd)4MZ^HwLSr=k7mv?cmbCVMRZ~_ByU#uX!ShzasCnmHzrb zhG3Dznz*%0)?K#VY9Id1$I0UIyqsJH*%id&IdHkP^)D;=A7&D`sXhQl%CC~BY0?2U zr>NcoH`QjPZ1J+fet$4;0353qvowJIjYD7n{vR`WXX;@64+Ya6i~KjRxZzQmsQoN%d2cVeJ-sy_^V2y{ZXy9Tr@Z(An^Up`%41ARkdT2CG;>uj zDm9RTZru`}oYz{{B_u&i!Uj%|5YqCSY&hmvRA4R7BvTOYQoU|>SODx{j$8Oo0{<7! zW5#SzRbT_H9wRhyl>-(G{wpKUOtXM3HXVZkzK}~o!byQ|FruuU$sZnMqBITi-5a}i)=YUqGhG#- zafTAJ=+Y!f$fIZZL-Xedt??jiIT25LAA_bioq}9rB$>yphUZi(tRnT2rL8zN9*X!6 z2te5XFE&a4zu06M;D5PE3Wr3n|K!+!m1aFx*(M<+jWjPttvqj@mu+d&ZJD&gM$t;u zD7eF?Wc9`!N)~e3Zq;BAy}ss zuZP`>thV-@wO@##EEG%NW6DG@F##-Z)zYU7D45iA_5RXPB<#rNWk!Dx%E@@^54Og~ zfC#(%0dYBGsErHnD7#39T7DgpEhm8Q{M8IZ5wuMnXiEPU5cNHAW&2+~e)cJ0#7?nz z0U!_A>MyDJ{w`EDCidW&*-ujEEJ!dVBu88aStL9qIp+Q+Ez{&6L#l3S#e~H%r?Vwk zxlCYKp&8Ytq0RmuG`6B$`r?a=j+46d_}ji* zkXl+svc)U-0e%nO5^$B+pe<{IHs0#qt}val{sTclyTH>}{)fPCjaTIu4NgQveE^Yg zRv^`%4ltBGRN1|@0{%^!z5}I`Uej6Upjyh&!#Rm#a)J^KX_FKKsa7pBWE-0WvD(d! zm|cXg=(CJf`+k%r^*Tes)xNN$p!TP8!eV9Ve{@p!KRU?*hFn&eykfA>vR`CFL?Riv zDMbzR%In+jVe3^rkc!(a9y3M2FRGtEABG;!r+tuS8mp%!nJAc)|B|TW01HM*dsvRw zuu5f1UVw%Goc?2LX8EWS+wMtz81ytO^*}(Yj1gboKRC(#e{hn9UFQGbq#_`k#0!Lz z+*?O1?bLyAlG%UZqze{qO^a8fLC-9X`@)z5*efpEUm zRL*TC3R}{)8;efWc*kM`;t%*D_ighz*iqmLX2|>aDD`~bxv;ix#e)~o*1bNM{ao!g zKrDq7>$j9j7*%oajDtl8vWHi++reY^Tj4ENL3a^qv~Lo42FWCtGy3*j*RDNzT3b=% zVjPoc%>-^t>E_0i0k*qXT-T+uIrbLP=`XnAQ)HR5;SayT>1_a6cMupZ=(obWe%hYo z7*l8YqOs78l2iL>u*^MI?GTvd`Ia{_z?v!U1*SmF;?f(CQOeBA=-++S;}P(eEfgyw zu&sn(m{t8Ud&)D;xKACX2=Jh6T!<*qFkmQ0{U`dYsV1WVA=IDp015$8RQ_LOW`c~; zU!CL%)cB%g@Dw1H2GOLXo6!Ws(!7_~bg?XeW~WNWHcn)S9=dG6Y7Uq4;avMz363#J zD2zHZo2?2y?iL-(g8I>jEQLoT_a1TJ7ngjH&#mP201}E=+R+uMpWDg9Ahrma^v=dn zC|-GIemZq78_on>obBL^lE|r5>zcj5Cc|sxocJiOUnxYutjQYXKR)a%le~%x8j8pr4 z0N;&-{}`?*tXmuahfS|dq(63W6rxucqqZ#x+OQ%6;>ihs;0j%_h{vIk3+xW6Rw-hT zZve-Oju9hWUlMn24dm;#{wXDpU6+igqZ@?gaPVH4X3_h_D-!2-MycYP-o9vhls313od405~9QA_fkzyLexKFZ+}N)pOjnaC&)#UvuWYe)nWex z)fM~Y;m!j%hxgKdbw&0}T zdpEl)gpbDVZ@b1;MTPl~hNk+R+|-7mqWsD-l`Q84dccz<7G{!3OHukc0fKp)=(Jh( zd{WZxd%9(Ak)2keD=-Sjl%3t(8|H?@O#H-$vV#wBwbj39c}jNYm`OHII$5#gMh#xI zF}fWL0;heUGm@dIPNeq0<7q#v;_$4x-qCYrn;miGEM%Z_d&ER!(5V#lGx}H1@L#|g z$ZG@zD5u8!Cwz617l#hH?0D;b1IQK9 zzL|hnRU|tE^UcVqb?%!>f8M^^Kx^5IX)B^I*blg2u=h-MziKM`I(`;nZZSq?=qV4) z9q%&K8tg@eY;qZfed}`)qqWl)>A}4MPSNG$_VDtvGlZq-BLP?Z-dL zv_ERNBrEIG7}<*sO^2<5xU6 zS*wy2t)F22^>p(@zMFgG&23(*^wg&OrjGGO;Jt;>IO@UcqES{R&VjyQ0M?rXihG_i zUYwA=?VZC*uiTm8iMOmVqwE>KnKxiY!&gQ(eX?X8zIzv{vS%BnDmcI+A=|@p(mj+k zuI#YuW`6I9w>vNB;l%W0s;6smZFg1s6w3pm>VMw$Tzy9o8(D?b&_PyeUp$doVh|Cq zMkHC)wz1+SiHlJ;z^{!#Kwc83rG!$s(Op;x_uFM|hxcW*KqOY3Da5h3C{WxEbNahn zYlI3)TyDn5B!Y#4zyIF5KAZfm#^(Tl$i&J2iXI;~vIzkDU>W=HK}z2aNE z@16;!A|QzupiiV|VP29M+rhNQ8|a&}U_HGjeD0scGb3|IEj9Bw$LkLgP1zOm9su+w zH_Fdv>z2CA)pTlE+S;pod2$4XvGz;Tq@3mI=*iVwUddhhy?45@$BI-B++i7Tkbsd$ zw~~`!AMd|uHf2j`oUDdg!lQ|7hJIeKHO#b;WI9#`6gWYc!RrIoNDF^ zj#Z5OFtljo=WtgjULoTfR4eD>K=z+{MHJwC0^rcYa6p+meUP?V=dex?OqGaX+=RLr z6{)9=lJU7{zf&p1@C=!ngBB)~Xy|54XHIBQ}BhYIaJ$)R^YT569otp(Ov7LNlFfxFv4O-NGH}? z8{OhnFKt}lSTwA%#q$Bi0cl`v>3>=3v!@;cq!}uaEW3JD*uAGdn|N~5nh(XA)S)aV zd4N`RH@m)aP&*O|HZB<}?<4b%axSu&9hO4wFKurT>ldBy-^h${BxUQMGlWpicy8P;AQXOIR)#@P_YDe!Ag1mA0uZwbdSFdzUfsUgE$&r-K zB^%!0golzoUuasCMK41!9x564tE@7j$4Q9*_{L%FR@PFNx@^k7Zii*qki6tp?a zQ@CKOUdDaGq|N79x#ZmE3E}Ed4W5-_(u1zNwe}^?Nto$m*FHzZkm_fl^1}6ztsJ%>(^INhefTh9%MVYM!jlYM>4~GvM_eF&NS9@JecKX`}zsqFc ziNUjy?{A2E(NC}{HCy|2cI3}#eaC@lt?6_2OK$l1q{iGN8%WHW<4#vWbk0T>Ks}5? zk)TpU7x9;G5!p!MZYO6}x5VzvWt;b92=8k;gR(FQJeMkTE_-B%nb{Kc>7JjtAh@hT zDX_}=Ba!^h<|aueL_iGN_xKBWb^xhQV-Opc;-^Cb4)BBPHXyO5B1BHK4CX{@!xqkf z`7yezXJbY7a}qP7z&Z9{Ef-S`z-$)SR?LS15L5mY$GPZbWVx~>`0@gKaLZQ!iKSGf zU-sdd;a39G)qk2~a`8N3g}{lf(Bs`+Dks*KYObzjjUJyMpK1p+s8$5#E4lEor?VPh zU__Nx`3`xKe3guYi`d%Q>4Du|Zu|QfNscquIa)eh$F969A?8n@{v`$WKSQrqA-|_p zkbWW8#yNYc8>*NzWp_NN)Zt|f^Ic0H1(~rz&^7kI>uSv$W`}6ong5_|(#;MTe(OQu z;WFwA_SP~RbGa%4?%Ou%Ix4)^`c=Ageyy^XEQ1j8cmG|jG8+KG(#oLVo0mdvLve+L zg^%|&mRb9=g^)DgqHaL|I2{6~&mhzAG~-+SZ7Tk>r&g1c`>(HS2=hzhN{*f@A%0k! z`Urnni1l%fn8YRUX@FNd<@|PUs)Fy2xhPLpb*XeZcKFM^(c~rJBkdi@E%6F<)noQK z?h7lOrNixNmyD^TGK!)GNy9chAz4cf!CmBob3fa?Yd6xZyT9H5t3wVf-{Z{mr{%t| zWk-5s+lg4FJGSc`x%ma`lL%P3J}{j`s*_*$dCHhI61sZQzVpZX>ZfpB;$xnuL@guW zJ$)uyjVI|TRXiGnq{E%xuPz4tOeD1Jc`XZ8(^I*ee-P5sa=T=edSlj(gO}PW&6Y39 z(4gp|7rYwGly|`a6nPt!$FEu4jO#VWoUG}`{S2mE;Bg7CvS6mn9WRjQ#t^uxGr)6b zRcrtc(}}c74_dpFv0&AcEe&q39MEw+joi#6jyttTp?60r{qsm8JT&CTg=*?`sB|l4 zr2)Um@d9b!cB_O^@Ew!!hYlB|xh(F4CFWqVwasu7$h4z0pnLmyMeS~J(@o3LPqH?{ zt2-{Q%ka7Td#PfbhKKr?OtSN z9yf23mEyM+09`R7T|V4u9Aen>(OKg3;4cs}4bE(}95OX_HE>8l?it0tC1C#Fm_Cb9JaG>|Hjnm-(PK<5(TFg*k$-k1&VXWa5iKH{&@6eL~ zISg3G97YIp1K$-!NrotCqMz6?sNRV@Lg+=Fd!Sb1{l6eth~r9 zvL;AODe?XRKGYox0mM{1tu@}ZD9caI!PO3#_#}ke36FA}ua1>4BIDtefvXLZO0#m^ z)hgk;mr5S8z*Gx#SroMv)wXK(DWJ5Q7wSAJo>c>?^YZ9VEw+!rh5z`|BLl_-(TZYApK|=Xjr5A~;8W*c z(uM|XI@|N)y5k7VwlIB>F@V467_pqO^TQGmBhEUAA2&Z44%ikG@Zi6M+8J5-!#3c~ zW@v#j+r2qTr;I%v(om#Qm!NwA8z_bD@b8p{izN6twg5sowdSQ4Y z5@eflaD)X3S>0`aZJni-YxZlNfq3o@=1-AouJA7F4SPeB4Cm1NGAsm41 z{F0WQ7W41(WHHP_B}Gjw_9y+4@N1ydhMcov!F(i+`J|P`eZR;5yxIo%!FScmnDI}& zr$Z7wH2VF-ncxWURE+VAvgaaG~oaPVvRzQ%F(h?gNln6!5507Nk35)6|l&JDJ$t&T$_;x-h}MnhU! zYuRVZNK!Z01lbVCuNA8!7qrRC`YK6;YGtOfIek5el^Lc4lxpZ=*D;jBAY7Y*~ppOusb!IiGa|*9Q0a;);QJ_g>8|)zCU1;Ak zv4Xl)JM&U4G0^*Y*^6J=5ZM2~>w4we8nZ8Ol3Rb38{NTJ?_>rBh^>WTC-GRveScATVju9T8+}M%7UEv zr+q!7U1u3a)s%x%>z;f+^g0UCTF|h~rtfPX@DiVXBJzS%m1Ov@um%v?^QMkZJ|JhY z1i=mY*iMIMhQMll(r%}KRk&g>`lRJ_y8(KbyaAP%sR+9(YHF^+ z1lC?50b(T1xdd85QLB|8RjmX7i{IF-rGzzq*^l%FTwuRD)s{CP`)0^CRg@jA6}qf% z*wsxx75C0ho+Vrc4U^n`Y;GXxD-7sRAC`3<`QjM&cZ@&BQ2&9=w@oFZLrM3SyT$F6 z2<%e#nlWJ|mIiF3`R~KV44oPciFz~y{8;_D03$@xo3%E{ok40)|J~lU2dXe3hLCnD z(n*JX&&JFmn_9GknfrM!`at6G;TH#ZPu5b*s**$#>Icf3e6f7yu&wD{|8)IK?%0|p zPY($2Z}Wfq3uz#*8;ws{VUAxxT=w!6TxHfp0Avn{c(wa0341QTBEI-}#-s!dwJKhS zV|{!t`HnXC`dm9>VPO6osSvZGR;AZqdEps5E!sXt{6e8%en7$0pBt4{cX!$Yz%#X; z`#~RfNV}5=-?Jt4`%17aDz(XDkC~6Z1s6#otU!xUr1PCFgZYW+zRMx3W^Nk+zFSGK z0ji7EJ~2L8V+qTp6xx(=u)VN=_Xb17NoL`Ew7GU7G0p=6v3N43tm{a9pcmPBY%lCjhR4b1P`kM6~>?eR2ooG7|)t`iV9IYlqPLDTBUim+pyURQc%-< zH)T$*?4qOY!(1NF3G|U57OTI%VWiprbikidMiGf^JexU=OYrKd*$Z0-+Q4*pW5l;Y z@5XG_AQPN6A%FX_w)MD6KvkG@2GC`E*GuaRVL4Gc{*a~;UyUxx&^A*7M}Zg6=#Z{l8ChMVEG(S-qYy6YO~qLG03g)Rp={Z=JlD0v z9QcsQeA3d!Ev4JP3E#fFC7wCL{B7^=S_sj1o`(=v9ykR1{c3OVRM`h^R6hJrmpO2H z6TW5s?WnxdFEf^q@@XClyHC0_Q~CpwCrlyFhb~iDAwl8rf-U{lpk8UXnpr%@15W0; zF~}_#pT3>mVsYqV5x{1Z)hMkUdw#Z}B?@bp7LQ)JdY^X4R_yC!TLHqA;~q`dL~`DV zs6JNQ#)dm?_JinvWgwl^T{Zd?4iP%z?zX%Iy%JPk>MrlfgJ~tjCK4&&PijzKp6WQM$k&v#0y}#>Q1_T$lR|%@Qkc3{(Ps60JOQhzSUXS>M9Bup&l;j;fQ5 ze-KBdOFRfW-u&Dko?ZtEemg&wvO^f^+OR?nd3Vyq7kImm$V`~}-Pq_2!P_LM$dOCX z1vILU-j+B3x8LRw8uUhCObwL6S*3bge_rwpXCW|cHAr&*cpyzxP(o<{!5Ja0L7;46 z4r|qu$ac9Wg@M5!C=uX@9btvlwa-xKyq08Nn(a^U--*bNjUJ*ulq4->JGNr z!!62J1NrGUi-%d7_1f3f^ zd_9bhDqwNmQjT{LdL|efQeqr5?^P$jBSg3O!*4X`PKlO<>d&Jqf1D9=)0cQHvK4n3 z?wptpFnzU1Zoetx274G#%@eHKF5?$QySH;*hMkIpOTG>cr6P0x?(}jp!pFR-|X#ItrbXGDDz%xPm6c?~m^VFy|CQ;z6> zUt?96viG}F90USo=HtVe`m6%f6Y_yk8Bl5#+Om6jx0?p88;DDz9 zC8pxOI{vjzQBOSRXi`Uptp8vZPN*KLva-rEIv7F^K%6m|^S+i+Yexd4bfNmhD37|% zw-U2Ob7S5WLYjVBjF0pn-Mp%GEzgP`z<9RUI(H%3c%b4;$$}S4_4&qHb!aa{N9b-6zlOT4lpU#7;UeB-5*evwJY`OH`XP=)~$ z5RhBF$Xn5lAv79Cog%9uA4lSOy{jXe zF7qT=c$kntXvIWEg_H)bxjfo**g>8OiT|DRyqw5m^ay3|D`*>6l~;gmuH<(27p)=3 zA2-h(Jx`0WKmkSq#An(EN}HL>{&z2PeHwgS6%>z8fcf3(N~LF2 zH2|HlV@h^oFR&B5@-O&rn+wfRc9IlrqlKpag0qXPtm#2Z>47_sYebrk9Y~|`4-wPu zR`_nqHn?y>_6=|o{>X`R7vCc@9|v0ht5i&xpB-BY47TUSR=K$WO!@TBMK^2paRLzj z(Pt{1Z`sIpHEVX#FY`sY0K+jxp_dQy`$5?XXnU;CWEzpjE20_CwL`qQT+}t=28ZrZ z%~X=m4Zvq#CV?J-cHYcP9AoGr$e9znfB+vstQN^Hg6uV?+S%LEyzb<*G_aT3@#nG9 z`NGqyDTR`eA@lssOx={((Evh*ycKtc2jduPcM}na?Mx8JakrN$Kvh)$=WtzW8Z<{> zM^jheT)YzWj~5bZOPwJ`Z?VUcYFZ^m{fY&~;h%3)&nruSgt2n1>H~v?JiO$maKek; z1HX-)fNGHpLZUgfJOQE6YOa$9xA~8*dunShs38|p`WI!d78J%Y{7yZx>~N0#bI!)p zis>U9&xKEjVkKE=02niR=aG76&>u{%S_PD5%(@|?1Un=e0v*kI$z}wTr1Z{vuoHlL zhh~%)?P21Mtl1{~{^3$JJ+Thc&m8}1aY~%S)|UP_s4kS*M$}Cu3L*fsDvBCfgYmM? z_0D$W{DdLe-XNqI{qmRa+< zisp}ASbz!rPFGkluB-ce$VnA;5(W+wm6C&sUnI3=cmYU1;rQ`$TMM^+(cQy@B_U1M z5pFvrcR&Xi0Iso@JN@Ztx&+PrB*=|Og-cFEg^9-)NpX+nl@+0Y07F4 zXp~pYq<=w7gGrInTD^=)KGRvk&ZPCgj!~8ri^i-+V8fqf+D$;Q^|)5AxLem1OXd~< zXmO}3y!-U+?5>k%#)f3`dB6H3W}~?T+)s=8V|A^r*71uw_FKrbsVz<8!Eq76`xwLE zw}TZ>*8csr8TUK@gq!@}ySc}utZ8kqJxL0^S(%W?EM5Y)lr0O&HRQzUZqqY9e@5@#Fg_K z$jDeaC>f|W@9m56rphWpm)oEa=nR)$2qN*baoBj)8wD0|r{Htu*ln+(#&&geJud32 z+nxndz|%&6CKAsSKp5S!?e0yMl7RE&Gu;}aDY(e7%8;VzV{1GG8($Emzk)yjywVCf za893Lh0|9>nb+1s-Vcc_mhZfwTr;2P@KZ8Qy(a;0#HI${EI;>>Nryf z$4`j}dHkVv9&X7p4PDs{@)O;%da;P8{f21d z{A5eOGL*?`tUe5~q_Pliu30~d+Goqt6xIBekACB|sbfyr;Y;r~G8vzSgV5}3e8jP2 zGE%RM%(=2N)T1!hSFliO(%2l# zbB5UDlEzqaov*|nIr-KPKqz>t3h_qYQ2#S*3S5qDMn*Nx*h$RGjr81 z)e{TrS(3meUS)SB4$#hZ?CS&FNcjRd;`?`-u@u=K2S>xpIa%CMLb)u8ZPQqe^=&^s zxw;vr?&M_)O!{7A&Gmj^*>iapw;zeb%$I5N+9Ig|EQUD6hAnLd0o9&2JBvf!wX8c? zb}U%S9Lc9uc#3t$D?YGBBE3TQJ^p zI1f09=8>75pHYY=0z6ES0mF(-t2qJ)zsO;406V3(8}hB?qK`)2Tv*jxn=Wt9_0pD5 z%{j-d?VDdNh7QHmTbFGZKAX>N{4YOCXm4{(4RNz*L$<&~iNs6M8^mU>W z=jC2+^8oypX|sGOu*G*t)MlMrNXJmChM$KL@*z1tpv#no?u4Kq{3EWJI!;G;*@CGb zW)%}mbl$!@Em_3p4l}`)iOm@wB884Nk;MGi{UHbDkTlAqnNUy1#A%X{gS_QSTYj@u~w$72D*TLd_Km*Kx9b)QCnNdV0D4$!M`Eq7m^_rEg zuq-92&P$hQZA>!jq?WI=$7fM;NNH9#JF6ZV@Eky#TC;|jk0qIk;8n+p>uIPFofV_c z^xoiPOUY|aHxpI8?x8vl<@hO-Zo{bbhJ=#)3jf-+C0WS&#dN)Xao=ovHENrbEbR%4 z@&r(;`^%!RcgP{>#~`XO7V=_{lT6J%v?4kxb3q?uBDqkvzx~XrprK-=x*%ic#bf(W zWED}WwyaWAGbNEV0(ISE_1d_OG>~=UaLxJ3pMfy^apLl5`#f=}qEty@RDwa}uJ|k- z?)i1RCLUwikTbb|L`lBd(k^4_d#I`UiyB~x_T!Ge<3&KS^M!egD*OH_RJLqcdS^Hq z?;E)$#Q^)NcS3>Ciqw!XezQ+RIzf6yhjjPOdgBDE6gN_B!B+N6Mc{z#3xQP$LK}tX zZTUge9;nUv(zN26T!hpmXT!w>|2KD!dtQN~K3`p7rC{7)y`2d>3iC+$L_;A7Sb07k@b z5Yd<=Td8&vgdB3PHN^~dNHwKt$sRd&4Nc;{r&iNwsufP#CB@?>J_1&)H%ve?1l!Hf zUQJ`j9sGM4ZWlkjKNEcZ^4U12dPu*sa*Bc=Bh{n26$5;8g0Xc=!ssRddPG0lX0uKj z>+@7KNg%k+`Epv56aUkCps1r9IY%#vFlY16H!VB-u>>EG3qEW6J3abD8iGjOiN<=p$#H_*Bh%N1MAwkJqKcV-4*y`YDCSw8 zc%4S&>&u>9!}_{*e({yqD9)hdK7G>9+j^0kw>(7oM^N{u-JA~5>0RY^UkSpQ{-Xl{ zHH(L*yieX+44IxyEhtUW^Of8MaPa=fvq z`r zv;_gqzV-)!+*0_j&;o$f;<0y%$IHJ|p+t#`-H3z$ky#OJZy5hQ%|*w|?Nr7Ai!%xj znW^9Q1|Z{o8@qMuD3}l0Xlo%YdVAyhd%X7p&@*6=sA9vatL)QL6drDf;ZdJ?SYZP69Emojb8!LFkM{#LtKA!uJs7-c&1d*fVaO zL{)cwm;tisreJadoKzuPaV)*$hZ`*8UoT361S()9aPbqNw+I1D>z7RQz$0h>#F>kb z=GJ3N;Wgz4tX_V=uRg% zI|5zI0H*qx*Zsrv6ztVPbqlWc*0Wn^!rnm10@i=g-0nU+(I+S*Po6o-@dKNRm;{#> z?TAqH2=um2lP_=WdM~>kF@9V1H?cG|(yI-9K(f9Z+T>9ft58ot+6sC&3Z|ioAMSO2 zHT)W?qH7%hT;xl#<8i|*ttB<$+k%7c1Ljk==Kijl@v%<`&j;#|huf%ilgol6E_zKz z-=w!0r2=+}zl~Et+OFhhFFfqeLS}p~r^|1!aEZtI-4LfTg7I?FsjriEKgm*k1v$EX zsFpXE8o-UQc|8@eZR#N5Avo@uE%;^oH{9#rSSw@!pF)~*&D5A?gTm|6uhS4(piB5T zoFYUT9m5@oi%nR+8W!$k9mhCeF2Y`Zq{B*!3^`}Mg&&$zGdpc}wPuLX_-pwESQ4`s zScDwykgKes3BF%>^C}*EQCeV$MPR70|4KwnISrr<`K?$(*Q8uawGG}A%P&@MdlZ2mGXC4d zRRGe1MX=gOSfVQ_*BLq^xgYCZr13Y~O1uw^%Yie7K)D_sDKE{Uly?#b>i1|@#&VdJ z^Q+Hq?mz3cZg7m(nEYG>nh7ETZ74lzfi<%YfIv%EO$5aG5LeFiGPHcMzV-^NcxUj= z0eCgLMwW7&T)FYHVU#*-bhRLq@|Iy=mEVY5b~d=^G>S4CY?*s8x3_PRPZXOd;LCID zCC7b3?R9wB`Nt@~ab7HcI-2aX);S*zOYAiozt-!9^-0^o!iR%2^47luzkfGd{VEcL z0ss+*QsT<@R!U=u&nCR=cM*API;Q$>L&dB0?=&GdID9q(fHn^Xt{6uS8Ufa`zinfO z{5S9C6Jwiea5`I>uXgx6>D7Znv>J_1J>H0)>%~ajEiS3)e+S#J^>R1$XE2ZU)+c5c zcb#1LTsCfbNzGH*C=Vv$GHmgA2uAhrby%b93&yO(4M%G zAA#zj+b0;+zT9s`W_!nOtav$k=KC^O?s=D(dmTl5TkOI^8L5%^D^Jv2&&@7R+Z%w7E4q`}W_(Ms@A7g~ntm<1f5vk9=3B4GWoG z*5%pt-XBF;^+u>N3QYW^0fZ^0@)ZSu%f&CaeIp}k+wImtdP)n2V|<=qVc5D4({e{- z#DXi$j6ST{(Iu7K*f?ib$RzQ?Bx0qsqS4_~4_pWwlJAPxtZgnu%&IVPN~(j6(gQGa zf*>-{J7Ri2X?oPK5)n|EW{{Z}_0kZ!9R1CuQxfD3!-gw`IQzh60boBorr@n)HvM|> zEJ7eG9X$3G*vOVNxn8Wws(LoLmRq2~omOcBSp4U9Aa4p@|U903x*-4@@&8H$7`K(&TI& zWL!VR#h)DdVpw-=19xPw`tnB_2Lkw8CgL%!*8YS&D1Bv(?m4WZG^d=LQ63-#sR7KJ9a(o<3CcF>PFZ&)@VHbqQDpOktp+3LR z)kL)t0xh)u-O@rgUYWa$6>hz-7-A`#;FC`RLl&UoNUL(gTqmmOScA&j!FswzS^rID zhCz1VJVDtO<1ibKw8$R<9(P%GM;VI_5&QmH1-vwh)c|{bH-GP!gN@GIwUt{O19z_a zy^qArD7i!D8s^cvyPf0n3TA+PMpi_)J)>VWrLhSuw)`FX_ z;uheKo2X(-_{bn`Y+%=d*x83l&CB~Rf`l-8nmagO3 z_ouu#!knNWx7FsBDU>`#djXrjt%e+!o*v3-ro^l|xqmkn9C|9~7nU}VwMR2O2%Ep% zpSi4<(XB*C&F>7Zv@gT^LTz|+oOO36A*TgVSJgAzLF{~k98oB4r8N|gVxMT8P{&jW#ob%8Sb3!_0EiO7%z_G5L%Vpu=4T2qHe zjcd$4@WEv0pNgHB01wCwk`sKkS)Q`_U=Eb{a_b+ao!6zt)mGqska26J)xc zGcj=Ce?>MLah^vZxV&i_Lf;DpNQWZ18DipCw8BFQVwu6#vCJ|SmHsM;N~Qvd72-&C z1om$6qmc8JI~k#g|0pYSIs5BD4oz;XJ;?$wQV?lwII3`xy|Dg6?Q&7?j0Lvkd67v% zLP8)1j6^5Xrgn8j`dsjG6V@lMG-D0gYeyXMqK3y$iHQ9dB%$*zEq?qQKyhR}H3L@4 z6w806S;>K&cQd5~UMoi(8fKE`Lv%{lP9Sv}5tE05kJ(XHAce0pBDyy#-_4Dwi}-iS zRe4ZOc7W*~Llx$nSAGchCY_nGgzH|)#>6n4!&n{VgrHlBv0QeC8;_n8Q{gqzhbs$# z&p@qeXL0v885;t_@jGNCK;G?y6BI5tFMChAouF#g%<>2%7zhLr>LNT^LDlEh{S6zs_kkeD z^1`i)(NcNYt98jda;GK%lF&0ENqir+-57GJD*1|suZtG7*z6pafay#Qk`acYPURW3 zlfH*|>spqU&B!|yT6@)cRXQBUAx_u(K((SAP{m2L7D}6+BH!DHJ0$qzDhQX^m-a zIaTR2+J>GRscax8cd#?My~hq)=t`q_RS=Ru6gbo3Mi0@sTcNOX(wvx;o34 z(dgOQ!Q}0ra?~~M9%NGA zuYxtxJoL#Z4XAh9=MB!kI&VRgKdtxM<1C?TCxI$Fh^ys~FSoAB@S%$MxSQ|otq$?3@P z0`ja8G^v47>vEvzd2?sd;8nIqDZnRnh|P-InW3Tq^RZfhvU>D?bCS2UteeItU$w4_ zo>o1+4Z~e&2Phw-Orfif*f3PW!E+2S7N!I9amRGtJNajpg{)rwytOlE3z<$^ChGZu zgsI2JSw_4;t1lg#yFm~pPS%jKE1o-Uu)-K8P7pSpB~G$IPK*WOB;FPsFsadMqMFIn zL}<#gCl^Y}5l=;bNeK-UV~(A=E?-+|*U&axosY7mzv+>J8`G{^Mtf}5Z*Z;gU7v4) z8Bxiye8S9(N7P)(XP93kPws{-JaC1W5M~pS(N)jVf}k4$`X~oZVL+h6w;xChrndE$ zNC>0j?6xynxya&XYhq5D>|Cjz>E`9#2 zPzjw(4zgW;9ToA7D8HGOO{u>Hy!q5!qdBg#{9Xl?6~d*?4fR(WZrWNtLPa*HGV9_pVdM(D@qt$%Q+Vht}o zj+VTE!C@@)0<+LLDh7xWt94<5DuHo-%+Sp7tYS)U{P;^)Vaf%58rv?6;6dz<1Cs2{ zD$;rGT3rZd;q^zhFpIK^Xf}NrbmgNV*j@VsnP639iL=snk*El2e{xl%Wmb1-ezxgu z-I@n~v(K(ANt&#+)CXb(wI(aNqcTnF zU!ga_v`JZhRPbt|k#yDW0;8XqR=F=Ott|%qp{Q$J*ln*O6$P9`ky^BfGJ0AdN0Go( zkD?CL^h61aiZYv}7W%E+nHKQorT$bQ%s8-rYhlh$a!LKRKoK;_r*a`}yYp+&N~g4J zf?$rQt2-?sn+VrotGoqX-xC0FNiW}Jc5|QuSXsVNrOi%~{n=S+EYJrbUS$>7NBc5|DYyvh*c18|l7&UN)PBDa#Ct3mjPa?C5RPVk+#X26QgXt2>Th35Rx?0s?PG-v z04Suw+G|lK%DG^HE=6JrrMo#NQa^+ww!S@@gh@)eEKV@;WRUC;s*!GgLU~-M3M&sX zNGPCLG*RfKX3!XyihP0~@>Sq0(yy8E0OU|sh5FMXT0eh)1+u}(3IH2#PRMqUL!(w4 zeH&}7L9zje{h^CDCkw|S!Ky3)dM?pcWXuEAgJ>lI{ecD&xFXf75@o7D@ne-6byY4X z`@K~bKHlI+)$&>DD;}bMnw*|?KQ`_6yj0hLl^4jo%UKo&V1MUX;`s0&t)dLE4Be57 zL!{f?m@C7>gQ(?&GB=R80;YAL>xGS1aY7Q<+=K~YaMtNp28@T1ZiV39$pk7;qSQF> zD`tF1mh=q0ufdvW{ATc$>j%A)VY$z38W9bn#O>zK&VFE z0Tp%J5c&{{s5lhAJ$tA!{XmP#cW>V0jlOYy*|~U)bh0vU^KfB5hYuu{+y`ghTT#W% z{V+}=l*N%eJa+Pbg3kUE2`OF_eV6kw@}ArT)r_n|TULRwS4Ymg09b$^Y<&ugRvVXM zbB26FFYy;#?JEgGmP9E!p-Zf@LF%EZSPr%>mj)P#GTd19E-%XE&M#O;-eHX>r|g&A zW`}i$;B79YJsGi&EiwsJIj1PPNW|&?@Ztta6^Vy*?CE5G6NTUNILM>mi8v~sMvv(h zk;Q(AGL3aW#b&z?z6Ig;z==`x`937cw4Xa%ypm z!7b-+lw=OFj%7TdXVFi^XG&alZ}q_ z=iZ-t{|BvqRZVLfF%Z4)uh3x+4)~BjilJ^WZPU_T+Ry}g$d({Wvuj~}F_LU=Oa6N$ zIbMI%g>{lWEX%O--kX^>(z}VB*`naUBt;+t=TR{K;9Cps>f&r%XsWKwTaO0`=`0xJ)iJ5s%jwfIwz_}DO&f{{AtTpMA=wz)aF zA*Dgl2%U0{5B$t1ITp%S|eQf@+YC)OJq zLB;-@s))^E^_`-w9Z#P@Q8!PmIp2%`fdzD80jD>f&CF7FRAsaxz6xrCc8l7e3HB9W z5z?9-`18=4|M>EB9@i=<^!$M6THqm94z1~b(&l{EKZWLI`HTgaQRGKB*Ne8Zb^T3* zK=%PE)!6)mw;g@2Ael;B%>+pycWPM++z$E!!pY-8w8nEmpmM zv3O86Ibcso+J|8>pN_YJ?~O&Rjib6VFT{(}_4_8)T*9Y3z%t#f5lXq{D9mH=7qyb# zYuhjo$KU-|+(RHXwA%_9g=S93+KlC4EI54`2#hM96M-$M(g_kq|My)SoTO%ZoF1%0 z-}~{oJAawGolBAmRUrm4`26`_}8{WM8pKv32Mf~Qrne0=^{{3+ znl2GIkK6J!TEcv0(@M2X|%fZE|o$@Y1WA+m*W}LJoV#}Acqm{ zbhw?V=slNAv)kDgsqY}=W%fb3hIA~%81g&^@t1{UR~3d;#MKtMEH^Oz$e**%RiU@D z<&mN{J)#bat{tq>Vc03edEUN%V*N4zvITB&pN_cxa0KF@&~0<-)q}25PtVxp+SmmNYWKL2JxK1#>)0m0(qQ9QRH(hW=len*M^b* zeUcT|Ka!?frYG5V_ubw1>F&cvS;!#BfR;o7inLLTng_F!pwpW;2{@^LKubaaJ$$XJ zO}+gjp6L4wvfGFFx4OI5ZGf+to)cTS@{N;&)JlNci=kKIJ z%xm66qBY3@Z^6*V?36_TDJ3z*DVvsxag&cswtp#fa<1<6uF3`9;m@Lyf&({rr33}7 zZPh?)LpCL}{a*yLD&#SLQqDLjkyS}+)P!iq%FrwL9UyyTy(t;(da|Ke6r+V}j`3~d z<2~J(NF_E71EuJDNDt8A6g}VPvLGt_k#r$>lg$04V+vzpx4$EB{2l6IOn}~6W)(iWG>AkHsUXvK5HV)^c)JMg&M}eso_q8TR z9{Zy|t-mRlo-Hf#6FRwk`cV@dM0cBT!N)4U@?6fXgZpE&!JBDyIFWU>)Ibz11`xUv z_nbtp%kxiUb@Z5jLW#?mcyTc<7VWs+3v(xGH}XEUPiwc`FWX|b6-LGS-QcNwaaSDL z#r*{ug;yF~X}d6@%eKLZbr;3)VVLX`_i5Y*``{04QqgMLFcf{)SKNmd+hEuV9fNuy zWUQlm=}ObLc^E~$N(725bmif&=HDmTS?xI0lXP`-&bjA*>dVsZEMqka%^gBY-YMZL zf3Qf4o2+1l?~yDQ2-QQo-?ZDWO(#CrSl`}!s`9OYc8>WB*>J6T34!rF}b7>M=N-|j9 zO-cchgsJ?0qa>uKcZ={+avj=!eTA`>1cp%~E{DEPQA$7*N8fcvxmoDILG&9;}?mrXm~p1G`Xe^*OcVF zRDNP8E(l_P<>a5GZ;aV{dXxO#fS064_Wo(yUCiLfj_e=3SW$1=HV}T-uV4okk~ceP zfD8kF?72nKCP-gWBXPHfFfeF|wuMTfKvGG(!TaqyijpNtv=s-#{17YR@p$*$eRoIy z{wZCjjuTKnBAg;mNFMrfE;lI^le7NVNk~jZN_>juH(9*MR+sF>|1F@w`Pr`l`EZWE zCQItekR|v!jOhJFNE*Xq5>P&NoJ>%(%#vJx01?i~X8wb2=JX{LQjE>zAmr+_#@i)m zwac%lq{)+hdAxD>>cyvNv8G<^{(q&$85Q!HgTc>?|1kfXDfk-JMu2Rr-}x*N5=}2= zH}m_e>BZf}?Au*Knpe_ySt7%jHq6^e-jgN8IY@xV98?1+EvRxKSofa;+e*smY913F z>94J;S%tH?!YPSTBCWebwt!?hh~@nzUb19^KeLxR%>o>Mdlddj7cu*baEUL3pu4ZJ z10)dw8KKtpIe$9{J}D2Mh@?8vQO_s-ng&w<2u;w#<5Ju)J_YOCy=Gj#DAv3lZEW;}VFJzCq=VAzg6wyZpgO^Qeh#v%)sRn7tyB<~PAN^O#7R%LR{+4J5^ zd{eI*jTA@~c3&73w@h9sV>>BwFqe}>7 zTdt@&t&&T5qGvkKRl^amP3_U-LZ6U+2|45{eGR{GZB+3pm4L;>g}-$}P7pR{FZHH4 zc(>Dt%%MCt(`R2-E~xDtO4&mME>CC=F zg{lfzT80XH-UA0#|MqN1*953OZuo!J5>=g`JA_@ggVAVuGyQ)1b+(_`;z6}ySA=mI z(IMQ^vLuwbTjOJP94D<&u%f=qGw#iGx1GA7H&vsNlg!eN(UQT|hd zhq?aJ!$-dL;p|ZjI6tBHKf8bG0pnA*Ik^a*hpB8|q;T=`Okqt4HK3mtA z`D|m!OTy@XpM2?VX-P}i42O+`p5A-Xz5f_jv8oJerxL=LI9biNyp4ZIAI>MU%Bv13 zDvfY^mAfY2eF_`>)}XmKe`D0^i~5UiQL_!cURa0MTVm|w=?$iOzR?&PzShS^oF2*idg-sKu*k!vl@sM%QZC6 zp^JeqeGR+_*_-hM-T{B1Yx|;IX*mfwCl4OieRh2M-K)kSZ~zyyVgv=34_Lwlb>==V zElS=2^){Tr+*1}?d8PPofhDkBs5yrQl$Ydy!2L@qWMcE7=l@IL6~gjr z`9w#FKGw2ysAO6RV@NFdB7-R7wAWz0cG(~pWD!H4nvfZ`At!(7%Q+q=jgfefWaZW& z{TQT`rSy03>Ty=?BQ@9ii*<0ABRYDFBYJUw(*raQ#U{tvahZujw^Y3P9FWA5`Nk4I z@5vPYr1VhvZ$90~3hXc-3P>?b#IF^ViGo}wBRYX5KP*Elzdsmjzy}sLh2*nt>@gc` zxUYT#l~Pe_)Ifg_e&1g)6p!Q}cor&!#3HGU+6VQxtB5obHp!&7knAoylhRZA-@8e? zdRG*6Uv_rBotf{OnOCpv#tKnm)k=pD5<69K!CQ-Tc05mnmK~Cn6+-d8@5=t>+}u^C zHP$D`FKhYYB)`-RR;-N9->MeZTVm`IA$mfnj3$PQ%T<5&=IYbxYq8Fj=_>VRGQv%- z$3R%i26M7bX>OiCo=@S>ww}O*{DH+6EIadEI?hufe7ycKW+{2|nN>R)iD;CTE%=TQ z!BuB3lv_G;t7>%OhX8*()mzCsf#>NuE4<3$WBMV3GYHhKB|$QM@5@$IzeL$7+fZz5 zxW0jBr6hlxYRw^r$vXy56^E1mpY}Lr*JJqir~~zJtSBwXv^`_E&nkj^e@ zSLje^GS;y|$Dmm{SjX6IgB+Jp97kRajvf2~HKYH1P8zzhW|!(>Bk4)+J@oL{Zd*cX zWRe<$#5yCG+qlr8&F5)G6m8J9lp$RIrC_=-v3gucityZX9M5-Fi@MITZi&l2~BO9HOD8^bSv^Na9>{?41NoqsB z3B+i9B?SZSRnHvQq29IHgc?HwOl*&S7N!RZwAV0HaL1&tPfIB*K{zzDlGraetm#5< zNX}g|V?f?U{AquK|O`xInvi>b7TtLON#6;M;&cbnMBV z`~byPZEM>w5dQ98p%11c(2f;42KLgDbqy<&r6e0;%)=suE$bX+CJMn)@ zoGk4M^OqY`@*>m@|rjaiSr%z@O`zSz#tyPszFc+K>%tqx=lk4xLHrg);wn6A4^s1y)MKnRZ zovO|*sT$6dV7Uexr?(5H->-jRJrD>UsM4w{06IBAQ919&B(RSJolB0Q#)Z)395!6n zjemM6#jocLoQp5?NaTDT1c?;sCSwPP(?&PdAXRV@VTvHjEptWRVTF8KSepT-pY1ri ziC&?o<32U!T_oXCl(M##IL`D0J>2%`ID#W2F9dj5bn+t3+G-`kUsBUyAvQW-J z-qixtLbL|2a2yN}&lzhI{NnVe8j>TLvlQ1aUdT1h%C|}N(ry>r#oSdVbz2tPIY-6! zA8jH^AeN&poLa8B9m)#Jn>Q*yNa}Lb>qh339mRhp9Qp7-AhSo?l|;4ArS7)ag@0T- ztxJK{-XG0YU2EGg6n%g9uh2st5@^Q?9Rqu5$=Ze$N>h@JG3H?ur0({Iu2=3z7)nPtmqhGPgNV3uOND$e$RoaIR@cphGf zBo*8wa$r>fwpt#H@fGHYc*0VLBc)*bI@0ICK>VU9bBn->DaQ;M(v?C}A+)j}Ci0p} zL#B{F+fE5Z~Ai(DB{q~S~Qb~Ve4TTPdK7hejUciYo;E!)J4tq*%x|`q`r?Co0&=A%YK1w5Nu=h^opv}3%8Ai4H9d| z6&7pLCS~184YOK-8$rG-obJu^4UmtDy;fB{g1O+7U^ag)O--)9m)ht=-`@tIPtdQD zRu$10^>?Z|y`X9|SAu04Y@Gfsn8Bci^*|taq)Mw}0@z1_&Ll@+WA?k8gNEz6@k_6y z`1P`ZYR&1r&|{JDh405wB%9Ict<6=XMZS~gHf~_yJED%ByOgaIob=pcS)9U+RShaY*uF-Y7 z<*#QKqQQ!sSB9H@Ymb1BxNPlr;kkN2gyU3ZjWR+*G)4rSws-za`KZ0pQGoke&H7SO=-vs9KIehvIr;z8-$F0JkOu86vRl~Cu`N0&rg+XK-z0RB8p=^U@aW~xgG0rxqX$n-udw_t3GAEgq~}fsJJ$W7!r1f&&fBjl3Yi?;leN7e zrXjochOqbi5NW>2egd_T(MudL5XOJs^H&U_>>eDVpa{1;q!pzF@xgoWp(&Evoz*}# z37JWIr})2{&2EpYRcIe>2m~g{H@|$}r*r@4g=nxgDj<}^LDziGYmYQPo>aoB4#}$; z;r?svmhs_>Th(U`HYdlYjXFA!-)xIDYiH$^Hn><5V<)d&t=NT1h)4)+wE2Gq=*}D0 zV3oVK(X#IFa#f@6Ppd!gE>w$>e9)HL;phW^J6v||Nd=aliEy)3qSaOzNFO7Dp6$l* zm5a6kTrt{)K)yu~&jM2UxHP&3V#R6O5VgT|StnVNjj|80-=@YCR0wJf`@uP;3Cw`d zv{`Bp>`VS1{%odz$*s9S$+v;uMr7A*eClS;X5R#{xQXd1AN!Sp#G@MAJIfx_Ma zrFB?Le}fOwFrUxi`wuvWqDb^_4BlN56Uo+PQmq z%9eY(Okxy~nD7%K?Qfb|giVyCmP9T%RcijIlOd8XCHUxMGel z@xe(Rs?b~V+eMm#W*vFUIAL{+T^-xKx${*+O}1DzY@U@TErI*=2i|77q09L|5nT1k!~>ItJ7zclUZ7H4AUx(w4PuJN7ae^{ZZ5D9aR^i{Cq37*57+sgmV%L`bQHS{5?FQZrB#;;0?`3~9 zHv`Zim&_tboVSAe#!m*_AxkMJHlj0(BWW&SY{PKUFTU-t%d>w?$JTj$RXuVqw5kgs zv7DU8kpcwwhoeI03mX%j+TQE4exPLo)|HKUbU~Cx&e&+t6om3<`}vnyiyc>Z1Bqoq zD+MQgPz#y#%P|pguvQ{j31xy$$&UOa3Lp3arBq#O+b|S;_pi_(5E(pJp<^&F9c&}4 zZ)3?@U5p}MCt`oHBqX_w8Ts#%KjSJ+XjVVj`Z(v@bI>Cdv*l-qA|Pd{al-QIl6$cNkHUgSV6lOkC%4y(#oDB>U}4WPUf z%?=`3lPb*_x1i&xt%4|T9rlXL4BFKzsNJi`KqvQ(idcWClixu2FJgDghP_{YCGHxG zU212+v($f*@AApr-a@k0&X5-3CE!Z&T8aaZ7a3MnkxNlI#6n2{!k);UlI(h93|h%j zQ>ba$eZ&gIp>QAuCD%FCLj->V z$2O)ZmBN38s-(8bme}^V(Rrw_foe6?&&=+ad4JdGK?{_O1BH_zLwN2eig|>RE&IIoiN-ggtxTEf(nEF&uwk`}hK$uT9!(W)cq^k>^xY3p$EE zOv#_<^R46BHV8f9|iRc9zn%`XDHXQI3)>j*gJ6u{sCQ$u?oU45J30) zij04{S*SQv5n2kmICL(Qm|QiGTte?sD&oIeSBJMf-aDStGXYpMUQehtER!=b$SWbA zifsj?19H*^)o{t-o*#8w%)z29i@nvmvcJ-ZMqH%6rP)o90+Lh!nNf9_#06{@gXyPK zFgns+tutoT#O&=YN{1Z%jCFS2HjxAuQ7eB)mR0|sfH!>L3yqG!YQr!PMDO~FJ>+0R z3k{?c>ZXO1Kzi;qU}Sl13*?oMRw1F}-)qM?#6gtKb!Xnbw-47jA!<}cdW0;n*NRI% zISlJ%UI>ys1}7Clxr==j+l@V{mm2HU^0}5ztNj->s90OtZ|R`Dr5=e3AsS86z<_@Z z0X9*a`qL8Qk;RXIAD$D%NOmeONp;s-tc+IBM7lhOvQ(Ca zVpN=^nGbiI{KA=R#w@tg;qiSwf^}N$W-!sl;;r8~X*ow_IlNw_?p!=_^psZmi$59s zmpk`8i(g%l-AV&75QXpa6hl$Eg;IYkR0LO%Dg}!mQoUR#+0CR4-JOJFQoBgs-E>|2 zo14I#oXmG7H+OF9giu)3(j#Pny{UN3t;29T9p!>#gTcuPVf`4JGH&kep}JD2X46Y0 zFJ{G(G*)aZ6${!MZ>d4zT!<)kS(i>UU7+`Q724g5ACvS=lWEs*z6i8}&XTZsD3`M`- zY&ZbxVUSvVl2Q7@6Z=sd#V3`KUu(iJ6vf~3DXt*cg2)8Nz)nWhZi?WB`XW|BY;QGK zlai#)GX3t;R{Y0acHY9_{Lan2uW!jJAtb~gW(vX5M)ANW zbhAj8ZMh3xLJS-A=a4-${Jw}VFkA}X6I-sN*q|^DA*n`)QjuH0lwuiOV@7euwb9PK z%{4t0i={&%E?5l5X|#s1QP~=moA3cJ*wBQ6 zo(GHgN#*=+(1KZ|KYV}pI+OnAkhb0KhezG7J{@?|N);;O$!I$8MzrgWd+kqm)V-K< z=Yoo)LKdvRIy0Fr==M$BNjw6p_(NyozQ`hJDUb@c|vxYBO5K#}!_$IW~RwRNQJe z>|?Rr9Lmiv)p1Y?#Uv21wXpC)7O7Sa*X|CjmMb*Dj{xXtj94*;kez@56Fx%f zZ}Yhn{7K4k$+aT8J$KZQEH z?;b6AHJg98Xv657D2#$6C8ejAbQ(m>+8ob_LH!}eBT=$$qzpj!NWB_u1x2vErMcO$ zBuN6(>3?G~TLI8bZs1)(A2cHC{w-4rMQJN(Cb;Jw{4M84;TDD|UY!9k?;HO^JcG^~ zb%NC2v>l4TE7)h+;|SgaKLMSRQA@)x6oudOD=vRy(iS`1KoRV!pg!ocuYr*zw=>YD zAxU9V`rl33ZtI4kc%OQ2&N=-q$?`$JYeEF_k{N{9IwQGTxt&IvFOrNXR-x65BdlJU zYTaxe>n*<(D6SVbg3Yh#t16H?Su6T1ivmqXNMjL-Ms-tQ#<1P0VmdpW<5rioz_Y2W zzMFr(u>z^pMk-gF9eH3~+l+XAYat*!)n#qu2O9E8z?W{;rQ}BkAI`g7)dr@*n-aK# zzVAG}Gt{({3N7S74~uvsbK}HAQqU$Nb0}FrOnb_>6QmH$q6G3hhxxfUltI@R1$4Z0 z94!OoOkjC`VV75jCQ66DW+yrAuLzg_MPPqI91%kECxjuf6CQPK3Uqh}@r0^LI$Xvm z>IW3=EgmC)be|rg51_*f+UIrGw-0PdOTGYoQe8{KFcf{yuefNXn@n^t5mu`*H*m0_ zSl^6}EWOzRZBvp|CZqm#o7K&Ii1*>pCb{RHbCT=Ze4Y~$BTtw{Xc(&{w-fuBqX~c8 z&46SqMUyj*FnK7_X))`m1;2_h?zAsscG023Odz*XWwbAaKphZL7z9ydt5t}YK$>fu zO;Tq0JlNf>=HC=G98aVQ&GBBvICfpA$&x@-xt1TyB5;)%3r~+xH0+HA zlm1{d91mXx&k=<1>L2?p@J}3c9Rz<4LI<}F?i{>3`10R^nzooGlK;wDNky}YBb$L2 zSCU$={xchK&p5+H6S^=}Dp@hrGF^EwCNh;4b*0I(b7{_QDw}bCz1%n;3O3CeZJ{%u zd+9ZfmcO*+`x&L?bh%GcQg8cIS{$`%2TcgW5Zd*WawpG?^Ie7iIIg$$JPUuNk@0!; zjxZ73?qB!A40zR*8#zsIGpM=6;Ytc<(E4p0q}2Me-#Md#B?kAow&FZ&40eu|i;v)4kICX;Spn}kdvitK;4ZQ8?% zUUV+uk$K;HArFuK=!H-uPZ)m)N{+$E*v1b}yx&wiVR0b#C<)rEbh2}OXj|#*`2Hkg`7eAm<8$9>ig+}9eaM%vzifYT{;|unG5>|_ zq0qq%SFoz+D!5<0_iLlF1i981~_%n z#7))!%>|9KKE#2cNVH8DF2m}}kZgY|bf+kR*DFlma&n!O zMFiQxC`%H$pB399887qqsJJS!2Nc7$@Kk_vSWNyv(1m^`x$;{ZoD?FV;8cE_v*nZ^!V)kO%hWt~ki4l=lgW8Yh}gxs4WOM1mh^h5a9Bc{||pSlbSmoEFvw z&kk1QN88qt+Ay}8_4K&)i0H;Xdt`y|%L85OG_pCPkpf`omO(fJjSV7oI&{Yn8=z9% z&>0?-;|_mKFd(nnE1-?!8HDN4%0Y)j8HCqOzdM~ZDj}Z& z(Nlk{Ol>2I5cj~KMKI9~O?xr}M#ML1Y@miesT!xCvOnq|kT5R@dOgK=>dr70*@nj# z?oS1zGJp?ItOvCjH&j$Sno>9tZQ<|`sC;O}Y|vxdn+36{9v%#?K3v^goQ)N>n72qb zV_dmh4?G(VL0TrszA8zv&lJzk3;~A8Y%qV2QW+Ts0*_ZW((2p7Rs~py*c?j(I$|xc zstvv^cQvini@m<#O)3Go(csi$JPoxX_PJT;7xf{!r~`e)m4AE z7NPIl$zzn1F+0?dl`z z<%Z}k>YN@Z`Q5s}nJ3Q&Ybt<-eI0+-Ij;zUx-w9%X_N;RTvH?jX3d~r(JKc%rPtYf zT@>nXNX2SR`0B+A5pG_9cX>z^Ddv-JMN!ZPOY{ii1IeBwQi0TvRiF}}e4O!8Ab49r zyk(Xp{p)|IT8F*qY8)1E4fRVMtrQDJ|e83+sv zU`Vs)?OjhfB{HvZ3fy+z#c&pu3F(620hrK+7~VB;{d<#4a(3N10dR(_q$Nc1@_?TW zyjhPk?8N8hTH^Ugb2;x&v|A|L0+?X90eWJL%blF`g(P||NmM4}?(6EBAkgS)mh3PJ zt*HAMZH_dkCSFrx5{p)YD@%XQK3xtFX`64ZKYxKM|yLH9X+^&EGNs*sqqpw9sGzMtB@_$A6u4a)}Y%jEi> zsefBS+M5^CYI3nmr5hz#3N@RNH&biV>ikG)j^rALsW&WBvmvWa!BT&CjSs8%oUPK2 zvOSYI+X~%GwJ}K>_d4s$&3JRz?Y4@r zN)2uf+8C>B&BJJO5PX08W)DGM9w00S(=ZOUQku8o-#GdEISN}N1s^L`x8}Q&m?_Od z8fv!@QPs$plg^)We?i3~0YTclZ^hqMYS)`A&wTd(xnaYBUbET^LF{ev( z%h&7dE&1%~R_Re@6nz*ifIX#RbFL8A9l(gSdlxi_uui9nyk>uR=Sjr;%S_NUd)VXE zCpd?XO$4{{gkV+>7BqK$n>QFV<3xt)RJlrET}~+qDj%JVW?etvj`XkJY$Ae z?>F+`QJQ8|iW4w4l68tr_+R0~-uKSGt(Z}7+cpr#-~B1{5Fie~4JpuJfW0nQT&D}r z)IsgFDCQxMCE6w`lNw1i@rHi)k(3mlL{ehx<)KcXlYf`^#0n%?E=NCt1vK zG!&APL_WxUj>Vf-7vlkqcUa_cf}@Aui`}Z&T(hU-=M<-}U;UKEm#>$%bd3{97+p>n zU6W10WBu27Fet=J4=txu^8NBX+lcY;$M3iKAC$;I4|j!(CFAvH;Hd=`@`kJ0JTm^Z z`PV|%uG4?be7{>Wx>w2Xaz-(g%Ns&d%$M^#yCE4?VOXbw&v>fe~bs} z7KMl!MH&1%h}2Kc$+uYIC}C8{=>6>7!>8%T>)HHv@g;f_{dpc|**S{Nsme!xrg$9} znLPh%+&I0?SS+J6Np_eOviU6LJl;oVf)zZ$ZwY@_m13OeQa~#rF^^Xnt_}73woG&n z(oMra{iDux#4}dYrz9)Vw!7ugJs6#3rW0MssVAQ>Uok=C-fbawxvIkdkxSLk(OF)1 zwxbTavVT44O4y-IldIZh#h6sT$GK__kg(?X?~sVo0V@=0amdwvVDblId>U4!cZquJg#$EoWvW%rzII2KN? zWJ4LpcY=H-a{GaqnPR`^RVAYxp~}=*x#~r>?6KcRm95Veq1sH4d!P0BT2L_ zs1Zc;@L)z3FA_OyjvwS5ImkU`kbktGj&Xuc9wEp%Hc)F+92=)S9#DHEAh!^aL;9#s z=N?~B)W|7hD_;Np;pPpc= zjcO%b{&-R!ZCcFPt?^f%0WB4h(_gq0knUxgkxE7+M3WkuIKG}Y`hz6>h$iJ<2`ZAa5WL?Zw3KD z!0ZokUk-f}qy*s55O70jj1EhzD~0D37Ftq!?RniV z%<2nu3>T$eE9I^{p>CCj&Quy3*_%r}E&@BGxx)QLgUd0vcJ|Wu2DpE&x4vPpR_Yks(r_VpU zvhWx-B)Q`d@m7P(@!u~<+2j9SD){D;G*wYSB4tvEA)c!vB53Q6@Yuhjsh2Q-v^pFP!JZPY0 zu&gW1+Ab>_6xzKRf-GM#tF&SCzt3_?Q5?w*?fhV4taE?Q)zRns^`cofQIrF# zr~(peRGi@ow+-m?*>oNWT7zyV1F~A0Iy2=$KC{m`xSso0X;ar!ZO0cr zYAME7<bF6PQu!BVQdVSQH2mPWG})yP61)BDwsr}sS2lf5i0OjnC6GyG zAFl;XR&hoOBRUmXtypV`$}o&Wxh6wdCc*rYaAwI+PRVFC$^Xb>+U2n$%U%;)bN%UC zZ|~$hfSDsX48^KK*g3*pU{>X2(2?|$v>HE=j_5FBD+_-S>IlO}U<-`F>lEq|w;Bh< z7Z*rv^$wRzLCgJh-QYH!k}pI*;T4~t5O+5{~IhTMB z`v=}N@CvNI2R}O_F82q39BmY0E9iB*kJZseUL1oiS3MAqw(%1j^tn4A_h_dO^nNc5 z_$LT?JT`x(Y)>1>bN`_E*uNFbW}si&kL`Idpm!U0vvqe49~jPqz3mN;m*^j@kWEX( zFc60C`4u_rp#=pOR)p47{8-TQ9=sGvnoPTaG%1rrw#xo@vt8}hT2aAVLYT=j&%Bq{ z&88tl09OowM%JO^E_ZDMb~%qzqFD{LVH{}w;Ol?FSGQ)%F9e9i{9LfJMfRvm;7%Hy z-5FiV$|LJuEA6mN3Gw#ZuTN0a=7pilZmfm=N=Yd-Q#2@9OV`FD2l7g2I1S2Y=72Ip z*3y}f7-k!kVAH8OY`OBHFZx1BPD`&lUz+FK=&-QoF8T^Q8AIX@a`4!n>~C8o2~%nv z;?;juG@KKs|3d67kGPrJNPBuUm_?TpnGIS$Ap5@0+3hA1tiatLaZyZ@LujL<5S&Ln z;qwD~^{((s@Yr}q-T;k}L2JS=6vyxR6z|}ng$*V+2J4)l4z`<@-Gq`RuWg`BL-HcZ z=yzXRZRf0GzFWvYzyI%%mxajn+$B|5_eLj3N_#AnND zFPRF zI*tXOgzxBmIF2g+_Z|neF}ClCV|IUs+1cUa=XTY4UWv3J5+PJtGOBa^+M-GqQQ~p3 zM%5CEkpD32!qiK#rSD5DZx?qZWW8g9CQY=p*=2Rvwr$(C%`V%zyKLLGZQHhOblLUR zbKaRVALb`yW@JR{z1O-{+Kw4~r%-v??iza^wHmhM=2f=UYr1>3A|$-GFqWEcQj;d} z%CmO3jd~(SBhx0L0CnB;H%49^gl__LgHPQ!UfG~@SM@StWms{AQz^ib^q^g;Gu&bR zZ!HMK6;Wp=f{Q@ui;e** z$cC_ChF0I~tT1(5b+5EC}}2u8t9rnbC%L@+4UeN0pBt;`%+@8L;!s zPjcblJuq#~M+uQ1^*w5!__+xAX@f;ONSSW{A~HU+i}{8ZdMm)mC&*Nywlpy#%HN-U zIGmCLbVG!HguyegHqChe_41>I!2F>Mc`Vr;Ng3+Do{U0cmp&g2m%h%)L)W`3`ji@e zofC`%3KsIfaR?tJFIsjXz4F%x{bp<>MesmlhDXyopw7Wh=XmP1SLkiAjNB*Y zaAeJ4j87Lr$4E?$v(O3cBZP@@8wdPck&uKl{}0$k@|)PQ*XY^Jc3I0Ye_JUbzpxn` z2uZz)a09@D#9$XPWnAoA%`iGae}gOQi_1&N8FJ%GRN5sb!PoWT4^GVW_1b>{rT;5z z_2ZcB|54qWS!i@5!7f+Lc6q0Y|5*C+r>JZt`Zadxi)UKop8?O@gUTo!%1WRDSRq%}hFt)iVy|0iF@Uc7;;J+ zI6yQGG-bWOlA|Y``b!x$Y@ArZ!Yc?of4JXYx7!Nm<7Jov?!rwRo~~MsPE$D6vrmUp zx#>8}oH@^LZ)Z{cI$r56?UAGaAXX~NNf+K*UO#vZb}m2Yugcvi%k(j7ku0bn_;^{9ko1pb*TJWYiTt)@Genn09xhy_pkoVN zKN4k?M=8;FR>>>-&{;g+sp0h<(HW! z*W6Jpg@=0wG^vUnDz57RaL&m0l<(uuQvQE` z2?u;66XEpAS;pFvNLpD*G4ToDcO-~{)sw-YxJZ%`7~=1)`pZ?h6oym=jI9Z$XP%Px z57M3EWK?57qN1OHH0iuV(0OdZgB|XSk#h)B38D}Owd;k^ebjd}-w?*mmT%-)NQc2R zQl!ebCc_?$BzsWqadT*MYeBXtDiR@OY8Vg|C~qKly4SET*nP)g~?m|BIFep?Zx)2Db`?NVs-4FGGCTbo0NtLlN;5)wVE2|A} z{&ybvsgnn=mQ$quPR{(nWK#uG`8erO@ux0}1=l>p8?EQ7j{8U5^;1Jc2+rt$ezJ*f9YOskQq09)((y3a1qu-LmNuR{ zq+13S(C4BT47_mD&I{1;vODRP*oDph`T&b>_j4z++lq_}G2khk^tx=WB$vJdm&Wa1 zRZ0I=q~;E#5NV@bIDL`( zwh&b$9JEk-J2UkdL4~0nS^M^B3ate7K3%bG$Nr89$c?4n<~Ee#ne4f1!olzUG)n;d zQF&BoJqiky6!*i7J6Afj{XE_;c?YmDZ&@d`5l=*Z4+%~2OG#z}h6RN%<>K(76H6~k zmCbMI1>VNMx<pIim7-ChQKum36FWF==5SHQ%cVb2r+O7r*Xy{4 z__L%$v49FXWZU>^|BR)bjOom)0YhZ~^DK9lOsW zu}gB0Xu$lZki^qL&xf<}*%-Qw^WP5Fnk8?UC?&(`N;!aZcHCmdy~CJfmxBmXDdR+x z$tMh2v^qWI{LrOe?F{AI^q#0KxaIXO8Y*r}dGRjfqVJo?OE}1^9VF%4#CN~RE$syw z?auiaInMI3oFy^tU)~P7N)rgl(1H;{brp&n&qnZ&wmB(B@NjWf(W^LasbFS0(Hs!Z%;Z5 zgsjX1Kg~Pwnz3nHACkaoX5_*;P<*US&eBVzuWI@bqRQz#uZW=Yq5E>lpGT*pxV46m z*s8*#y}I&AMKGhO_H{p55PxUogYwC-kLV=V0J04<|ohS zhZ1fXSHSZbdmmx3SxZ(jk6tBl1z8J?hOOE?1a9yby2x$#0pCsW|1*~lzPYD%RMdc> z`Vncmgxgl2g`=|FK$A+#uSjGhdWQ->?bvjvUS;NUIK^cGdO2@6XEHMNlQqK>fLX|q zYO5MeR7N~C{jr{K(H)fjQbB>??4%pnqOI(wWs}AJej|tC#1r9@_p>B(XF=jIg&~%7 z%9#HRy-#Ga2ye-oJm6f$f}%)3F(=eq5}`CK8C?OC)Ni#US0WG#O5!Qls#TPB5@|%$ zI`7W&uNu!Epvm)8(%_D=?eQgh`Pv5x?-0{e6@#bRL@INZ{oXX#vSgEIA}<0G{Us1l z)j9N)bx3z#fNQ%{wGwSe?GwR$Shg2M7JV=bYEjz!4D51yLm&rI{{{0{?>xM?H&hIG zbk+s%7j{}LYHlo7x?&}&V`k-96On2fRiI$CnvwJX$hnl^_%?`N(DFcSNWNthg%b*0 z$F9?Bp$HBUil3fJgr1)&mDG82zKYD;%dUfhZ{^I#0V_PQ1l*~u?|?GC5H+?Swnn~5qGZ^m9gN+WsbAqF%KYv+xiY%xt0 z>iQ)`fT?+@VMY=%C|U@1nh0I(XSKwIi@*{d{n*wB=4{x7Dc3!+JgwJlHaG%c+qrmZQ%ayYmEA^Qvo}idhDOptux? zaYt&5>x}t?xi-^K5#CP_q3|o->8JFj=SU1OxzY8D5Ie*6(GT?&e31W}Xy676lt|cE`9Jn`S!WVXOmNFK@^7X{f)e~{j z;46+mnw|{#jqUNVNr1mR0Z_-VdtNEC2yvR90C-x2JfkKOf$iqnt#SUMwmbR+Z&LbC zD}>-XQ!_e%r=`)?CsJGOA5QT?0LceCPTSS&M@Knk>NNV*VZm*B_3#rFFL~{_v*n|I zecViEHT*-%#W?gMB?c>MteB%SGn_=JoLeS{Es?kFavaL~LQuy9nBA|Lf}`IbHH<69 zE?RojsM5jw$$i`w39|~tyick+%G!|jNJQ;6ADyk0AMRQbv;7-O|Gji>-ziMWOknde z_yqFLUG|Mf;N_f~Z>(b?FGgEc>2|ZM8B1O{FDYdO3VK?^-cwA;P`doRWSC4v3Y#SZ5(DTW}#U)E9{Q2SX^uj(t9E^5K9jEZ-V6{{a3;W9ee+wApBOtl$JX(?Q2Y)>>H z&`h!BtPcNzc?xM7o2dvQTOfjQDV$#@;0Z<*U_TDA2Z6GF{}1s8J_k8)le5}DpY>xe z{W*(&_yrtN5x5c)KlO^c=9-u|_b?XZ6<#qS-8?7SX#6Z-OnZIqn{UK*frf^DA)@ex z`>gx@dRs4;3NlYpGZK`u#9T$IFhqcd7az6XP!>l4k)}GsbFGr^rOC5EQa`h2`Q=<_ zyER^gX?rYYJIQQGcZ%k@nDFkg>}BhM?^W}N}Ki?0K?r3tAB? z1Wl_Tb#M4n#L8KpWR@##;rE?_&_8W~4xxrdF`$xVqDLYf(SDJ(5BiXhEBf<dl|;JQR38J3AEflL2^@EiSK_g6QH!X?fwh_s_sr=BCh^`04v9Kd`=%V4|yzi zS2g@oTbjO*C<}wb`8*Fic5JEfaCPn%&*f$0$jKcpq>@1GYxsBT;rou-%6t^aPU(p+ zw^Kzi#i06X{*iCb6?DVDi&WoG$x4=CVh`?!QS+4AN9jDv5cta1qTHv@pWu!J__d^_ zXqUn8t1t6~YgY#8(;!CD;T-k%@2!7rMT;fxi53W?{3B{UsfMAoH!Ay!q#%=8*FP zMbO#xjS-qJ)1!qWIF{JIOLG`xawIs8k>TJs0Nris@4UeUe}8gR1VmTAy%29oJcf-y zI0j(J3CljWU;ks6Nd8z?@OPrnL-`7QtNdurU&otx#!@248Bvg+5cD$EE6Ez*Mf>p1&7ncwr9ap z0pgO1!>HlLta?gMZ*sAfYy>D(h;VG|{!r|@@Uql_9yUZu#X1}=*tgMx&w}J6Ts#_z zq#{a{m%ai0o?<@yBpQjCL7VdpmK8r_&&#zCMzacy`liWMPqyu((8=Bo>NOW173Z$a z?2m$oVoj+LLX6|OrJg<;MI;MW9^4a002gi)yj*Etq`Gw05`A6rB&z0X1AfKCl6M`B z$_9|}L0o{qGWLU6xnGNFX zjS4WyJrerAm#ayXK~8*)^~$ukS5o6ZHB@n`$D+$vWO(E8$Vv#y?1?09pz@>0fY2<; zKTRi>p?P%l@3t{ABPO+B+8ttke^AinaZ1Ft46nT5*9tpc$8#nDdi2#bVgbGL$b=$_2n7<6X_k7f2j&6V2p$ilb@HxVF%qCG}Jw58M#NyLek?yta5j z#uFz=8(ZbC0G=D{Rya}NI~pn)%%gRY=TOJ)tEjbzTP>!eiJEv1P+jPU0sKvBR{v!_ ze`f3Nsp@7(TrEmvk@c;I39XhlfdP3*#t|iKDp(ChTbBg=WYBZU$0KMo&wB%rKRZl! zjjZ^76S_mPOo9E0<|NRSki)T`eMn{Z3w!b27BKBsEU}O ztHeI{BZewi)}>%fvXO-Wh=N>9s~q)5Xa0@#sjlZ?{93@GFB^nOa2n>8hgN*&?31d9 zjsSt`H0&k(0|y!BD5V}&gFe3s9#sdC49Sr>l){lxYto*%F>%6c(1{}Y7#b5waYQtWQdWD=RQoHyU3@7z;q0! z;NeXu$gT@lE`vP+7@uz=LAN`^yJ(RffZ`Db@k5#-RO7N=c@iW{8iVnmcoxxsCU?Rxdad0O0@{tA)s!oZbuZl=KVnE{+cksJJ+{Rd z*65Yx!z86FaUxi8^eJj~Iju3KNzo}hIwi?#2q$X^+GaWcXwkB=aQVM zswLxHbbCt*xRtTJp3LTbVJZ{8p8;VG)=vy*BVbx{JB7~5$-2Vr;lzR!Yg$DX9f8nF zAk-kN`wW%Y4$o`1Jhh1bY#G9F;~v08T66G6cB$)K1UmkFek}Gp5fK;fpo5JQfuW;U zPx=@0E_u??)pRl=cl&z$#8&YprELND)uj4AwF2Nr#5)=Qk4?d$0D3`|K?IHbylZS| zGG>E*86RJ`K=kF7;EKOxy|P}%lQ{pAc-2N;a(K;`Jp##?i>Ubbht@4OwOGh_>RWR` zD2SG8ECeK^1lZBC3xZgv&@SSE->V*wtB9!rLmqvaA6k3KWxW2RW zQL%GBQzwMsAM@tn6zmg2A7gDoUQ?}6)4Z#(aWqnb6U;ITOG@7F@8>2fT0Rwx?e5K+ z>-TFsyvGzWkzX?!Ko8>vgq+3hvjzaMPpc4$W{?6*h;+WSt#x0yJKi320`O1nK3fQC zeVe}plS`Jiag@%Gb;tOP6N%#vz}-x$877eZgxF;oViOF*vy=u?!=tlUcf#hc<$GIQ zs;V0WW|Fb95eW=B^e;nx_jpnzisDIAiop|EpF1xxlZ7_yvR+ zxG+Ho<1hN}E9aSv0d&#L6XIjeVn5vynw>7##M4qk?48=4Hxry@rgYmV5RC+!@_#}6 ztaDjQHPX|KpHu)r=vmUdzY7rBlh&^E{AZ{jY&behj*K#RLpY^-N+j~j2!=#~mDd_u z(D}AL|MDZl=5yoSs@vkI(hijb?m4gvjR;lIQ*G`WOm2%u0Z1Pe#_~UFRJF2|A$ORW zoFh+;rKD%MHQ9dOpoETk3EGG7Qm*VJ9;0{6{oItkqi#Vi?(fPE6Y`Gg>JWA9wP_F> zk?s|Th|~50!1td*ssThWtTs_Hg|5yo2|ju_ZSEnor(DI=Bn@i5=mapXR$2#)k!?5L z3w}>V>|>&n{s7A5^m0U3V0S zYd_b@Mw+O0F;(g+?Lxg|D#u8uvtLSD?okRIQ@Ozja1K>(N=2NQw`9|;dy-*yhX2NCvN!Zv66@Uwc`Y(ndRzv1 z?IatR?WtGoS&GgRo=Sti;Oi9`vYzj>5=o)Y-;a7ssDpZZXxj4mDe!}q ztBVG3U@ch)d=|rE!doOg)<~BepRrrLERdzJ1$p5oLZgs2C!!30UVu^`YA296-v53= z_~N&Z9vCijHV7W|z@}|aaPA8eoCFfpUr*x`i6aRU#q^$U8zmtbey;64fb1%3J~{iF zmk$MIksI0m~+%Mrz@eYj4rQ?H=rP&UB@_j=qMk8p7oIhN*?u z*q0dB$;H)T0rawI*a4Icm)Jg|A2D$cOSEb}`cRcYY*Q)YBmgx(UXXs*SHu$LVzkox z!IWa2j2XM(Y?*Y9(FC#8I9y(S5rR4`vlObvT5dO%7k4Er=Gh@j*EY4Alxnz}zv>;} zKgaMlvY=oDh3-mQ<@tTfUB0&|N2+_zpTrjZ8r&h49rE)}2BD68-Ms2c?M~n>Rdpgb zo?Nd1ZwfHflb1QFLxFAdhC`Io`>2Z{+Il3PEyViy3_GY+%WIP#h5W#SBl@7bvzxa4w zYdFwOh=jojLP+1EkmhSEz1zK(8X@=@5_SZOr}r z>eHlU4=GDwqT>ir(`-0#u-OkT70Eg^(7IuW#7@fphOH`;a_Mxc#E*_}eh#{SXc9G2 zD=D{rNIB&ErrmB-uxwL1mqG_Hp{to?G9bHc*FBaJSy=4c@PMiL{Zk*MD>FVM_>gS0tBgsv-C5zaF@V%IZa$w zV)*ayx}jS~c3T>3d-brt-;&oP5?(PNm?-)$DUG(2aNr*+4{0brltKZ*ZOSK{by(1O z8BN3n>iSmZ3`bBc>R|EJ{urfEscMQr*ce9E%KL9Q3Cra5bTjxugA*3`qBP$1{S4e` zV1A!3>vL&oi#x0pR@Xci&TGP|?&E=p=3(2mkkPIk=xm>SL1uwF*8e;D%z;0a&szyO zB_8|Q&N;eWzUnask4FK#P`-(^mFwF?OaFW=l%VH(>g#^ddI}W<&?@NgTo`rKcEo;{ zV=_1r_JK)U#qjSg$?{q8=_j7<`)21qC5eQ(`Q#G*?iHj783hdZ#mqw*iuR>Y^){7q zbs9_R|NBr5Bb*j>toZEcMro8u+QUfceFz5lVA}Tr06`jbe2i_du2{t!Xe>@UdJ52F zFz_Yf&T3=s#n*o-TCg66(LkETRn`0X+OUV#0~7n|;KyCLUi8%jYu}S( zlrkGN0FG=D&+8%Hm78;zE)~Q7+8>`k(Y5$W*1||?rx+~KVrX1w7}%4>pA0d%qxHm= zIg!o)M=Y_g_d*VGn>47F4XkKVwtLasC-S+ax z1$4vHEZ4_nshy&jA2^WZUFaX6W|3nG$@+P~0f}0Ct0@^_v7`y@Bo4OPxOF*{eYwuMwndh$+>^_x@;t1 zTIf5&_!lpi2Z!t9WqsnuZ1<2qcXJ_a$*Df|lHF2nt zT5r!5r;UU!%FAx?tl(?_Y96__*zc8DinLF%2x2VEF& zA$)y4XaAIugV4dBl4|z)TOawMzD|$xTfYT3zVN=!FWFw8n*PU3_%n05r@YRCr{%C` zK&;HzRoP6~)q^3Gt+C3Lm2$*HTXSov7)rJj9oiBW61oOFzn@gwm3JD^hyoPt19r8U zloVuKf?PS_g^Jz7n)iVTeVtABU0dEnb&6Bzj?pRk^+m9g@(9XQoqNPZ=axy;Fw%0N zFrA)8Jgz*+Gqgw?Sq_|DvX-0an5)jst0tr>3f8r#D_|nCaa5z*Z3-Y|mumxQ62j4E z1+-y&MrK+Qnmq!7yO_-LnE;M6P=s&zkhk_Sk113>19My_N{=THbP^d@JlsZ1F6!f? zK`61DOVC0%5yO;Ba?!a|h7 zPJ0&1Q;RW7wkVn9`9m3#V=_m@KM z^TTYKvw>Ze(*ON)e!}bVm5hXuwN5b>ZJ=SVuvS-l@t^YO1e0f~dy^xt6X_y9p2u9J z*6V}8sSxVrd~ddSw}({USD_Vi%Zr3VL$lO64_zXhJ+R38N5RXIpbb4vGB(v$o?_m# z3>;kFiekzCtn~vDe?0LCTa~l+$#0p73!LpDkn;G$pSLs}7wjyjZ#6sdO3Bf65}x_< z8F;_SXc!BYEe1^MYsA}arL30MHrc9JbyM0{O{^w;J#BgIVuB2vO;Z^Wi`eRe4Zsm6 zAGKwR*Y|ri%7t36QJoi-R|DZd*ZRa@gSK=(P!ZHH>`4KbJET0$To`NJvA-|*YMR#5 z+I7nRnw_AE=WH=vbHgdSSPjOclQrxi(&@u&e5hx$z60M??+Yt|6JLIX?cu1Yp}(`p zo5{;DFO#+7$HW+R773dJ10egHxvs_y|IiO$MFBV~VktpWeG##4(hmLWqyNj zbO};)$hj_Rqn7SDZHG7mri^Uz4{J2OQk0-1t)L&IIu$lwM`~akWBOl4aq^j}%%gEW zEZW%9q=hV%cqSSDh2+XwvXWc16OW|%Bu^^TnLH*j(8s6t8?Z5{CSM`Pwxa5`5OB>z zPBc_R!56y;n|we6JGg41m~E@*?(i*cx8xX1Ys0qpnhi7DIDrI`E{`HbctJ~EGrMph|>A2 z{vgm_jTj4R4D7F%cq&M5-f1l)^-RmM)(v3$BtSX;$iyJn#qd2};!-Eq7-aRXaW@eA^-mLCeS$ITjmzvYVN#W$q6rYk1psul zAnKK}BmF2-rxuCR1d7k27+P{TC(=!l|=lTKi{D+akW=Mqj6o{+-`7 zT^lWK>Z}gu@(8@Yb5TWECFYk=9Rn`ZC86Q}+~y7+7|U2GIR6AfqDvKa^w+B{11~6V zRu(pH9D(=mMC=a>7(56AR)voA`jw;4t4J(@*>4nE6)2x0&l7 zS{WG#mVonNkK8ZL&|ks3)c*e`v6Yy%78Zq-#`qJ!5btM0i7q9^l$65~`+g_kwpnD6 zOK6@%@Go5GaJ$Ji0eq^-K+j0W9*YoxN=b`7YS2TgkcSw~9GHZc6QCG+tI8cPaU(xJ zNc)e??VSXAbA^NRi2leE=Z1c_MT?nMmYOh*XP+clhWM1!jY*Yuix$xrjj^NO(Rs3Q z$w~n7X!qs*vc>`ZNsrsy&qNOD3FSgxAQF!n({>OeT|hgHcPJ*i8Nsw5$~pc05_w3& znWV|d`VajX1*W4*ugISocA#SKW&gN6TS{7QZy>Y~qfCgYdZ8*&EW(27g{WQ#(pEAH zTO-ccImpA02}>$YQsq3-dZiunw0KdpECm1nu}x3Lx_{_QbchddNK@LS$V+~&7ER96 z@qkFRNm>#VY;3td4_jJ&zwq;j6k^V=L$u#1&m}Dn+vc9r4~MVnzZ#^wwd0hZoyV3> z%b-Ui3Q_YXJ95m6bP`j)#*U%38;?KVEl9HY4sqPD4Kq|VvO#}udoEf%pWy~v zgIWVO?@hgNWmHVEtt+l+x>g$ab4>FO8uc~I_uFW4`vkoyjZ)6}@e5W+Y3h-0ye*ymDFrOY`4NwTDCD1k`j?)C zvw8O)C;E=vw5B@k_-$I(%Kf0<@;CwTzVE)+ANZsvk$-wENqg(TO`A?#JJ@<{!r|A zRFWdiTQ|SZ4@sGWsCvxAM*33aY((?_LH2ru&ST+d7 z)d9K?lTn!d*OZ!S^&wSSsT8%Quxw&u`QRazbQIaYN$7(zUB-K<+??pff+rVZDB0`J zumBwiHGlSbEqARRn)TD0a*A1N8DPaTBkj=4R=E;-IkOYU!er4qF^hm3@^SOec+JS$b$aHQVcDSol z>pAi6Zb*#%Sr0#b?14JbbSh;=Xb78zx18UVj>8KFRKlY^)Eh9TPJbfhHvu~}t3H6) zeZEUn?J?mjz;or7?mD`sM$S(_QnHju2o6T{O(X%0sXI4DXTY%qAtF`IfZLQgi)Hgy zXQ6r)ug(cxG)!R?%#2)O0*aXUk8v{mvT!{6r2uqoufLu&0cT)EPYNm9m z%-!_8nWN{m)<~*IUYocCr8}t*rXJ3`S<=zuE!>!cpMu^t1^+ zBWrkWB_*8~OP+fuDpU>C1E+Bu+D=D=U(6Y?l0vb^zH?DzKALH_%<(cC>{|`jvjjj9 zB0Yk$B54l`yg{V)=5QLUblTz)T*QBW#*V@6((!5B0P;k2280elXBQgj^V&8(I!O)q z+?))ELfUYOVVOect>&t}Z0qt*BuQg9-1IS#HJ`Fgk7>j4Ng4g$&#MCg|AVmKa=9&1 z*9Te4Ebo7}>e;&zbpO-L|Bp-suonadfs7NtNlujj6#&~jAtbq=4BIRzA?M8WaU;zg z^5{fm+(!AzapJQ>e&(Yt&q4@w8;P0g5+Pv4zzoZF(i3Vy z!dZfETIS|is(8n&jIJc>y!Pf&#B;?nZn06fmRHbykC#k zdM!T-q>!5Qy)e9eV3lg9C}rOnY}=7u$hNnj8o%H9`k?qn&{s6JN!!j{NRYM#W_G|<>+va}h`3lvgcY`f9Z&VouV42GcdicY>0giE{to11& z!x72kd*pnnEjZE`1X?ZU&_Qc`kDCTZ$pMR{FTdt!f!tpB$KxhHQ|%DB zM4`QhSTCRlkfthg!#G~(G!S#f$c%+N^13X4c{S=e6pnhd_SBE)z|_YKif?57a0v*0 z;ZhUy)Xk&Eh}b*dY`;ll<<(!G)@;bo(L%P4_#lptaCTP|7Yf9Y6 zS+E^Qa^dwfMUZswNepRN7_4DT@#ImdMJp)E3@NM$7!M@DCpG;zetZGLBTE=dOM{>6 znyVIDJY~?!d}HWA*!-%Xj54!(33!hX?@XcB^LTkVdWnA>R84I7_ZrW@iYKOg z2F*pfU$_)bBIr9f$#(}bZKzmtmFO~@b_j$C*b$+MTm(ahsYF3MdJdl7R@#9u`{XzP zLVxHPuB=lGkT5K^1#=5a1Q>bb9rX}1K_`NSfY&Z$ZnZLbWbz}h&rj6VCK&bqu9N>!1SL}TG=h0>K{*)J!;Iwv zX6>EX+k8G<9bJ4G%X864NLnj_*ns<+iSVn@`2J9jj*5<^!3i+3CybB=I6vgc$!YPK zatJ6WDCH~FA}v$%Wgy0>Lgz;?5WpbN&AH!jMWEL|FQ1_KaW6-<}r$${DYvU8^*~^a;Av(2Ho;F7YWmM?3;HoF~r~ z<)c2T>RGm>S3fiKPKi?TS`J0GVPf~Iyn{fpbnwL~DibEgS7IXdHGOV*t{n#U^wDi{ z{HM4UZisXVD}-e^)i(~Z=zo~G02|hlyITBr2w+``d079+g06JWi8^a{N#>=Lbwgk* zfP3Yn`?MvuwG9}{^<1eei(f#y`B<4cZn>kyFi*%QreeTH^3^3YQLF4lQw1n@N0tKX z-Q`gL6%e;z#P~)UJ!Fs?OmJNeLUSw|kTjs!k3`Jwzm3dz6kncnmHVZR&ELNDeBx$j z8=O+mL%zc97OkUwgb}Di zaBos1sV^Yc93@-KM!p0~jMEnMep5)1rbJa);ovvjSoRZvQEsiba$y@>O5896eCsKQ z0-FJ9?{sF5>*qF_J=HpY5w~;|J2WC!#c~hzG3T?j@?Lw znpW^a;ErDVmAvx(=If7WCRTf7_MBT&FjG1Zn@z)eqBj??txLZMT$M6!|2239{kw*g zZSHs<%XYi@z?+6tHA+?0=BD-rKn7sfX;T|a#A6VUmzz46_LgC8=~Gm7^k!USO$7s}ufqz!0HW$M{G{{(K$_9pd*fD~i zruCv8=BLD=((|uI%kBokvd{Vb`uqzVBK2C-%fNUoE~J>c@UONne4%6vU@e$AsL5}I z7&`jl=3vf=uyr*!-rOG)$FRDX<~hbL$fnf@n*UOS0(LD1lq(-*Uod1RSP2Lgc#3~C zDaX8(7>reP9C28p&?qm0f`ea_nwP39Rq7J@+A`ONABZfvjU~SEYAma!7sQc4Xx@uNB zFR+eqf?^i#R(JF`IF7CZE<(dI#2BTP#AJmVSfY?jLu3UfClPu=xZqK1dD6{B*N7DV z6U2dgUq-1IUmv_fJByGr#3NDT_&{mQ_|W=nUIEPu2q#hdqy|?i_UuDo4SHnS3SqH2 zpHB~#x4xinuD!1r@NG6jEc(Ni-e6q)g((5U=XVQ76(P=fT(ldWA{u{UM=|L;q4u2Qi?w?2tC8Reeo zOw*CyoQI10sfGz3coWnz9S>%Aenb4II-<5EgJSuDxnPbKeM={B?&ofaQcem?Yyr?J zl~t10YUUi8fs@qpnDZK;yWB1j#dMVx@o80Atk_4BSa#GhdcYmM8>Y4xWuYH+6peAH zgJNAFC%uj!J^}$KZpEABIo6s)SLv-O;k2x|R_cbhjCk<{StNk-FnJ(GoU88o=iZR<@WAsbCgy&DjYS!~_WJiL9BQId^9eKa$haP^}@02cNi;)K3;TAOg zq)0}XABBY2^E)d0xmn)6f+zy0u8s}}Y1SglC z!bDf9FPKkJH(FzzfXj!Ykwi8Il=m%e7<$hS*V|+?Emf#x9rUVfVl4gZt1Go)6;oBD0*=U8n}`+h zWnvf0IA!&a3=??fQX0X~!9c%XJLm|w$vy0Ne~qeEh-KmG@f4DMB|*{S(9E5{fcYBn zN+_<5w7rWftD3u-iu<`&Pu_s62}GQUA-7ZA{mJl)DiYdp?{5dROlpv_sv`_}!V?GS z@UP!fF>QkHSA{}6kUUz`G(9-cq!EzKPKyW*K9s!gB=72KVU`{R z73s&FO&2Ezi?+Aub4!0@o73@Y(fNhT3&sk!0C7)PP0nD!T0{0xKlH{0?l*7#!~qdy zjWMjp!3n-XM)HDmvE7@o3tH><0Eva;1%{4Y(u&5wut3>rW6pZaOmUFRuS*|5qy{MI zlm@d79j4<5Uz4n85O4bokw(StGSMxloJ(7%p4%qr)dODt%de|nlFK1mENfKeA+!M5 zRRUsv1@jrlWVO_1bfAyzO^Q*#yXm58?y!R{2n5BAu z0)=i6Ptmp&`7sayLK_fUi`3MlM}0Xeaknj%8ATYj9*Lr_Dk!Ak;TDvnZ3c79PeB5& zuYC2G#6G6kYHzNOed{@BjqL1{ZL}f^#)^Y06-|`B(nge7d;XnPqNjIMbKwsLhfM?jl+j zd=^s_l_#ek_xW<#6}FI9a$&Bu&^Sy2LRTJQD(gnqlkodjl>+a75{0W1b(uJ!4oGmq z6a)n%BU8f;0xu`0c6;`Q%jt0OQ9ul%)VxlL#Wvt}*XK4{Z=VpDMJ7u=GQpZM_R2am zGw06&^x$)50r~Kj*V#qA{&^T0Ec^YM@WIWAEiG*V80xd931bVbOEHS29IC)rLHpHg z3sr!&1-@!`5_M7~Zij50#wD~Bqudo|kH5XwKlX#E1PiQPkX!G%MO^~x2pud!(x+kM zXL$hXtsMOz3ckanlXo=!{tZvgEm)JPY|H|~f7|xUtT2(^pj1RGQah@4Y-wX6Dwub z(%gKrWvD6vS{FJ>WGevCY2`EtA`8gg@2mAbZ@+wJpaZlH)}Jhg<2Jjj^ZC1)_W26& zSGcv{?>?cTo5H|jawzC=`!H)-^Je2gYMeP))qb%J5~-Y#tRA>8a0&jTTwrwXB+qP}n-mz`lww;P?S5mQUp4`v-wet&hTYHW<*BpI~es%a? zQq*XSh{(U@eG)j*xM-*>HD?hpiDvyyqAh?RIE9!toH92N!)$W{=5>NfV$}W(@LT%8 z&;up?hJmz_J)Gped~@Itw*V#%HuY{V53+a0WuGZ{7JPp?@Av#GMZlM`^0nzqSor%v zVJ}VE6=MD;kN$B?31dpZAVyglaJr2qgzG?Z)E%Qeg`pKg-WXOfRAN!y>GS7X1WT3B zK`juFq~i{U6r@l2nE8-h+uArV;#Ljqiun}U!L}m$l7lyzw0?KH`8j0ba~q34AB}s} zC(loZ&0bTB>s(4%?x(HbgF+gv=+9MOdjNMX{E`sX$R z39&sPl%9YlHm)g<*UF1R8(Wcm!puZ+(*ebOs^`*TRceB(O-4_;g6yaX%fixG5}Wgw zIWx=0wQr@BX6hm13(T^mNO?~m^Q2OWFWYlE{Iw=S^V}rAS!L_a3^l!)T*F1u{}73{ zsaFK0&|;t-2811xdE1KscpBg@iIs&7{O^`Oe=i)t|RhP zWYbJq(yX#|NsONiRu?x5#rJ}1)lm<{!V;i?Pq;i#_d)7dH>grTM&JUz?L6SFz#lTc zR%SN^xftrrH(|_?$m*pfDIV)dLq@IGHn~_Ii~O)Sy0NbhzeJhwH17uF*VO+o`VhOH zxx__w=+yA4U;~9gyGKfttCRY_iY3QN3d65!cR+nMeZ5GDVQ;ey(X|?r7Sh}UuPRN2 z11Kzv0#4=cSpiee!an08gDcA$ca>K&hQX*9!tOrA$)Of50X?r_l}F4N_&i$2j>bJl zlnNmw2)?I~Xj6hPg92~@^S*LS(%YKl?d8NUXuJVgLJ=8D5T&PcQxc-xU2f0+26hOH z34nQ&`y;j|7D$sf9%606jC2F``q2~CT2^^@?(TVJngRD0lSb!`%53bH>4`r<4-6|R zz%GTDTL6nAIVK1qo$lO>J7o9fsB(>2e7>6y0<`}gTL8}gAFuq+?Aw2jEmELh4w)tt z(V>D+yE=DJOx)Y$_Wmyj07xza@+b{Q=}Or^9pmzbJulEuk9ROYBX!eF3iI~M9?fve z_0>YSeM>y_Drxkq|4-ojr?BcOG>&n1yq5mj zN#q8OSrHJy%OFBc{D2jRAly%hqH=ny@&0d|PMea_i&BE2hnCiuyc6{Nf>Bb0s@Hq9 zrH2*`hAmBi{9}jR(vAJf29c#&wJQ$bgYojxE7l#j!y z=-=ATbqHW zXp4(=z1nBaO}O~>-Kz4e2^IhtbsxZi+!5^mTUekuUj6^KuwVm5VRnJi1%JAle>I=Z zABZ4*>*f%2e=@-%5ylfZ616F5uW4J?NqCK|fJ4a@Bk^`TC6;=h$=@$tgM{#GLTnw# zlHqyoYi8aD{ekh11s8vYRn`5uYkH9VPW=kiYOIGx-TejlX%l`;@&42lBE+1ZTtkT) z1TnfIm~j6?pe$i@m%fYP_n3?b(sk`MkUfAlPUye@be553eq9^yQI{~xYFl9sips`t zfA#a!8g-j`G?~yPih-Zp2v|6pfq|rSaxm~Xf_>4DVc5nqr~++ zk>s<#n%Q33RD29m=fv3YLDK2386z|S3^2%Nyvj~z zwvT@SA&Y(V<*xDhyxtxIIDG$45&-;96BtA1(I|(~jcSJ7Ber2cXMmMvs`NQ8h@01-(p_LpW7lL&CNzuneP6QZ%0pFjwPBBNtqo zy*!VI;j$!;kdj>2?(E~c6`Pb@T{ULsSOK?+*yM%a3Au{hG(*AlG(xC08t-UKJI%zN z+fFnLoz*P9sbEb;*h+=ZUBV?1VP}?^OOpm}6rE8n56*$}qR{uJ`U}^}`Zt^oBU2O9 zOaW03{vcR#f!_X*xVn@Oz=`WM#QiWnkVWC^Ig%pD)KQ-nKZ;tLHY&`8qLZ^;-OfGl zf*2mqxW*se({at=PAOBs)6s8YA6Ig)v5!A~&5YA(c>RA&`~Mq5Gep3V`58lFGau-g zqJZs%QWMM6=`!$wmgG`5`7c&OHJ&=XOy}yZ>-{?^>kr^3(HlAB2;T4_NSWA1*m%Cq zEQyRnub@qb(1zVLW%V$JGu%4DiLWd1!zp)LIe?f_So17e;5sdO*{|NmmfD)9^Fq={ z#-2kGugJxGH55jb9?(68ic5H;_dfHkLvhKG3NPZS7kjE$!`V}A0+W1{<96# z+Z-{i#u-ophWb0FIS64Z#F4mtg=ZD2$SuwJ7KSEY>zs;oi}Pl3~T~PC3M6`~rUYd9~G?x8F3bmvEK!9SQA? zxq##=SxlK?Rxx?@*aWkYPZ_trUP>C33s=Qh5pXE>ISa{n)4#P)Gv=cXHc(eAmYV6y zIJpH&o5uoh4tck%M5PYU0{W1s#i2PUmKKB?={aA}fcRUp52(TA179?XOlMGI+~g-A z_@#0uA&;$wSgFwro#z9EGiOg3vKR5K;Q+Qb>E^CIRh3odtIzNlbK3;pcb}-IG@HbF z9j-35tX}XP2p!1;(J-pjVTBK1C}1Um{)di~yfvFqHq&s|4f|--(dRJwAvGi!-?>MK z%F3ubvWmlRCkoc*2DuVM%^!pHinz{gZSM3i3_KjoBS>}ObKPW-goo3RNdqAtX@ID% zB`%IhF2g*sT1`X!Rw6SV5@rE;C=5Pm-t`W_c#(btLaO_ z3b;c40ftUps38w)B)0u-fWf5$>lf<_pIumvFn-L^kzYs9n)^(oHO7eM+!vnnA1r`xn1&JXlZUD|$=1F`p9z1|-lc^8Oo zuF!w6c&(TzQ+R=pzCP@6Fux>0R)iQlQOXwe>stEEP??oP+HPa=%peN+_|=yM*Y_>E z&S^G^NQwy(6>40P^w=pWsNDl2*BjNG&CSYH*@=i-(of|9i1v0%5>Cu3ISeMAcsmU=zalH&5xU&c!uCXm z;idu*JO&*nB11Jp<`*n`JSCUL+@7k{Ol7H5%#BC=BPKBxz3D8kT7x)ND4+`XE00h? zb9{g$EzqP6jr!Vw_QHrm{}G?p@{ecwlKRX{v&QX;jm|RtOfLrX6=2|=$fxEd6#XHx zEpOc(*0Hn9l|azNU1@1Fpb_b#H)kzY6zF_tYV|Lv7*6^?IuV%0oy-%q4)PePU* zNt96$elv`;)(=KVAJD6V`kZaTp=B z{(TlYd>yh^z{v&%TqkmF9?_K8+h=_FH%0EV9*%Nw7yiPFA(=ySDWNL{#=)4mx?&n* z24SjkZhnlVmrTnZs`S_vr%^$)9Ik3Lcm6?K(NB6<1GYnr#i)8gx?4GLvdU0&dDPy~ zJ2ZQj+N0}-0Av#sO~k9T<&k~|Iek*Wfvk+rL)7$6ao$Rr<{XwpHsxd5<{CTgDiO=! zc^L4~%MW9&Cx$_gSEIITq||yh&cdJzD{YwhyVBS$xk5gzGcbsMCv)+WiCAud%7(+f znC~m1EHuV_Ng}3JnfVdzX0!c7y&EUk@P5$C>h^TCfZ2Zqmi4{Rqx+R^6xpWF(JS-n z+F8xP1**&pyYHh4T-Dd!sYsE^G3)gG*CH6)Zzegp-xMOQFs1UOvjFggq*x5d{4;Hy z6MWP&9Ub5!tHifcsZT$AWle@gow!*#qZ3F3joOJ&QxpiJ?QS=^=?Ot+__X^J<4oI` zj-#$Hz^$8-xUO?N%XW+?%fD?Bd(H{4_lSS9vdr9GY?hl|+SmMalf3_l$^QR7{r=16 zGbT|n($fO29R{!0oAefEZlxm^*E%9n$3O*65wLjMswxC!69w)VDjrWB1jG){D zJR6H_JJ~yCdC$J;{qY5>H|drOPB}P``Fo^Hnt^bRRevQ>$QHb5dYakz4lT~oU?M)$ zu&htgvX?637O>0(E=+8t{DV*j(i+{^pQa7$JAK%C$I`{%b^W8M@Tpw$l@8d2^N^;E zafjF(L;zF%H(@H(c^e$GhC=#V?iMlImyy>~9tYX7Y4q$l^* zYvKOQTkriU&L%HLj7bC)RsfKz5-4I-6pJ-hmC=XElpQ$b0A_Koo@;l%{hMFJ-Z*?` z$}jHrLAKopS|ri|-4C4ygldR^)0hywNRb|xjFUzm2_1xh-ANv~#iCDy$NcC@elAMH;(KcBR!qXETK zX_z0j&=b3j@)rU+wGRUsD*(MHm{BGnR9ET&3s#0op{NxEF@d!x-U^fqMjy&=Es^!j zJ@{c9%yST?QX;=$&OZ1Oj!eQOT7D^3D}VtiX))(o*^#z7zRdeO6$^wE9b2wdZJ;^!itz74Ly$hV#6o_+b~sh zw#Usfo2Sr4%L<6q^;cTl(Md$oT8puIS$!&90Qr5#o~)KPdY|bWTO7WirayX_ksMUX z>ft?JR6k2`KnaBaOW$F3j6gZfXcjo{%?q9Y#1L+(sOg^v=odgM1$Nd*N8m8^^M=Jv zn?s`w9h$4h%(_Vh{fvSu+|pm4+9YT%8)Ecnae3?oKV-Sp_D)k&VPAAm4&kS8xz3%4H~E#oipqV$kV z>uj7a^Cf*D4as78Pc`rL>5F(p;)XpAJDfc8TrVp?LJI($U;HSzF$G^2Rn)6Ps8OTO zG0CwdIfK0%9TF3#Rr|-T*!p?os>kC%g=DiGr5@jmxO!DMt|dn@g9Z$pb){i zK207^hb{rrUarrUN~q5!Y*Y{nm#dFvzR$O>peY{_v+Rr43%{5}* z7Ygv8FY_8PsLF=bCl9Mi7sIAgRZJXHtMZ%V(HYOVAx*vWGi8VH@=xB~T@)pIbodOV z_Usfhr!t?W(;cy@oboEauWu%TTM8A@Z$Z&Ux;p_%(hHOrLT!v~Tj%BwVJq5Y$dS71 zt3d6cr<(ejmqj}hF`9XK5s5uDY}VIR6WJi&%IVpRxX^PNaXh)$`_{IzML(K%Jb%;_mPws%}DQLZq1d0zSOy+QFtnZs2S`4fX8a@xE_yYyoAI zi2*!C?<4kcQ!+@%+}FVMXBg_tfEHOP!PYqgc&ry%-VorTCdp3qgq6@x|p( zo9F_ek-8*xl}8z?-{kXQ?=Ok5JO9OpWeON_*#_M^n`ZD@2>7w3lTP%#Y=EFgjP}*3qok9Sk=>6XQ zymESdlRcz{Vm1I@77z-`WXays3Xr5P;y`qP7E^>U@v={2>1t15xF8R@IJ@Hl6zSJ4 zKr%sw>O?+trNTu^j;cY;IU;H}2QE8+gShv(Z+Qx(2H9Qj&sy+8#b%@P_wV{+zer9C z(5nJNt>>M|(26s#?geIjT)UD>Jf8kjF%VBKSUT^_cdVZrJzRAEO>usx6X|*uAn`A# zs(I2Hw_S`ev{|R!3!)EXFLl8OAc`dMW?w{(*Rr{zrDxK+o9FDNgpmN>ylHhlJOeW` zwiQ`}o*|ckdL>#9H{@KRdBrf3s?{uOtIpELmF~QF$xfA2jHj^0W-;y+RfNbcu4qNm zN+L>|olC;JV3*A!{mJShC`*vSZ$b~Xoax2ZVf8mpQZqi*bI*!UJ^vI0K)m3MvK}_Q zEv8g@<;*2kwrP&7^PaNu&l{^dwg>A;T&L@^`hx(*gRg_;FFu{2%Cjc<%H@0DMU^vU z49+u>qccghoYxG^coQ~#-%IvI+=JK9Z91u>(mHz_+b4E1b+xFAMTWDpB>)85fbF}1 zak-6zM?n*aPfG<|SD{4$z?#2oBwyz>z&2oCq9XfW0%Fg(`jjB#cr$50vJhTdjISg- zS;@4b!Aey_lgRskUvTE$cWz6I^-3gdmI;GV3A_E@?u_|qgva8>YOxK(7zNBKtQO}k zH4Ad}Lk^VSBE?|hscT&Q_GOi?B7N)Xy1L$_gS*a74C&%jNySgVN@5|?KCLr^;flmQ zYpi=(QbS)h*K=ZA($eAigIJswd!=KV&3^Jb}jPWzl`%<#Cht8Hk4yUd;cbt_9wIWw7mq@;X zqDOm$5u{njq%!iS<0BFNoy<{2J#W}|oOHPY0%lxdv#?^oCKG-#c8Bsz)O@*U+-@0h z=FLkJ&BWa4=K|Q4XdQYCjT!Bk_)<1>pK5_)!sR7A{Chl{p}F;YPkm1Js0}^WhpD32 zhU^nei^`_e&*J&6s$T>}kcMwU=)gE##AgOWz%bd4CG}UU8(TIscU=rOP<=f|ldZS- zD9Tzs5?cZ?IGxRAvU_@zGw!;1iw z>5>hR;*APQ{`K5uWv8^%bI?N`s72QW1KQ zLzYRgycL3)v$D=Je#&`-mI3{->$~61P}1foK>!T$&}>iR0p;sDh386>AYslS37-}Zq=EGirsj= zX86{pZw_T8`Zdq8bhld3L);6oDzLrmn_yJ%wjqq$EZ7Nfv7SPL&oM|Kn_(=OWhD}R z(>eUFH4Hs}7dAxt*=M7dXfVh91*lfb)jxn^V$kW!APomP(SRV|lFUU*_z{HhWwZzc zIKLIDW4kQMLCGcl0DEdYe!FZ6=NsXJ`V-%i*O%VMAqRWa%wMgDzn(gEuX|ZF%7)<$ z&vROy;ah&tUO%Vz547$E)Cw26Rn;hSsaZxB@~l`^RC~EcM2MWT-^xh5Rag+^+ZT`q zrbY1!u`~q|IqQAKeaF}R=+3!Q0*@k)(F_J^S?qRBW{L~k*Y)Z()&Tk>IYfZGO_O>0 zNdJKP2kf=P|Bcyz@VT3nE@;t?I-oI**bFa5%c@l4J38(HyY`5RAUeit!J_1`m823U zXzGgBu;hQY$%#uZn11(8GrA_*4g^ru&pS95H%n*S{P1Jp-3vSi7op2ZzPa4jXB&?)DnTj_+MX1gt8-;e zGQ!&$BTXSTcfn9`=9pYKB^B{bF1gO)^f1b$PpF94Wgh?{4# zh7++^51_}UUMNNuq$-L*T~Bk}q+qEMVk@buIEb=Fczh}*z|M){yJ=Y;EX z3qW6CD^(`uqVJW@NpeZvUH}q5o{;Xbv4+sjPUxo{v5TB_<8+$KHTKu4R!QmF=4<@R zdgS6_8NBk_dj@c2u)y|E$P2G^fVPixJ~G)uO7+s#vPkfU(lbPT`Q1|}BzlZICm)!S zxQCB*>f84m8HRI@`}WG%=P*qxIJA}vO{dL+AyTq}uW(%=Cc&-ZvH%4dPGq8iw0w-i z>#PtlXuRAcg0^SZDf7KFCwm}C+w|pClZ8FA=Bd#G!^PXC-?}@)$0g^Usc@AQ_)y7O z>vnn?QZ^BI^9x7;TG6)K8;2GaS0lA;gmsx+1;?Mf6$fU{)g}pD`sSF4@!6CdP&&T?BT7~&3MCM-#znIh&_UwGh$NYv&-eA zd+R+74S&(nWg@V>y9PQOzd%aVY=4H!5x;(n!U8-J)QRQbT&VT?aFR)E1DRYFp}rXq z0SR*OiWv(M)DcWCeQ^whv{gghqU|*)~OMb z$EY-P_sY_3q<~MkqZbON0uj**h$LAKn%Mh;yw2n`*Y@!JAESeR;mUGQGLmI)kV_ zXA|UB;$MF%9p5BK*}UX>=~y@dH>I{k>l6A7VF#OoUq&;vPEbbhmvkl3K&&ie33M0bB$_M$a1 z2+QKK-vL~p5)LiKIacl;xvj|MM((|&cT)cZ(7_hD^mucRTThZp!o_#XnbzlR&#kqT z6cCK3d>E{&{yA4xNmVp41sX?TGx+ZRThE6Uc1~6Vn{K_!F_GCsVB|OOo|ZVR z%lX5ze$(nd8Y(s3R?0%Qgir71SG29+`4r6-F$1Efpr`;51h&(#tG4bRDboR{`qDym zC9}ofkj>TBm+M8ZnytG0*=PH#xeJA?J>yJCx8+!$DrNkd!YezrOJ+m%;&-PP6dXN9 zXodgB5Gr3c@qB|PnYA`O_*U4|Wp^Ek77PHmKSj{+h7G~amD-W5Hr3F%wRwX@m*)~( zIc6j5kQu082g5%4 zN5yw2cz?XPN2ZAm29a8XykTn0KEst@&km~uWSQu@QWO5&UpK>3=JH25zW@5Kulbzc zPW`x6Krp3>%4Ws5iwu%U|GF}jX#sG20vp^UeoIC6ixYInRSIG1hVY15vRdevXZx|Y z=7$@U_3@56hn^Ue!mn0bAGDI8SC}z1I1v``)toUNTnys~ z{^4Q8o$+|M%oP^HM!W)5|7PnU!$v;{bg+$_0y$~!Be{p9tX+`UAwkjHb+xHmqI=Dm ziQYTS+xICbHG{9QN3G4ca{xeKPJj&dM1-maD4ER{1ny$ek(@c}ZT~G+LMrIQw|^#| zOy5Igg*|Epg=WDmG^BNks1G<X#$w0Q6o_1^X+pV!F0_lnN1{t*_Ps zYtbFI5J=7%wYMB`ytLV-AskNCEAL4LbD-04+t3AdawaconI&5iu~C95A=?9_yZS|7 zOM7xn=)I)F=cSVlkdcH3c?A~hEi9DQwd}EVf&**EW8H@}EZ_ncwbK7D0b->9AFBZU z=>BdPKU~mtTakg2u_6M5$-?D|%!4MGPv`oQ?8EaOLwRMCAK6>G`50U7h5d76^#Ga0 z#`X$kD&h7iz!T*{1od6nE&OU3%H~^8?8odu6X&|F6yc#O{F)f)+PKAH!>wi2^6s2Z zNXN0As&fAX4_LkP>as~-bnna|Xd7v{w76WbK`Umt>5hytvdov+hkZT^7gs0reDs)B z^F7!zJ`8Kjl?>Q@g8l(^ot4hN=h+$3R9g-9c~v{^MO7hcnFWBlHOC zKA6>5xv22Z$NAGcgU0;u1Gq+c;77fN>v^Z~p=1q!2mFV|IfvLZ?WqpagC%lJUfEqE zO6>}r2juP3l5IDlC%za=j(M$kC+6xk`ie=w$%t?&$Q#dKg=(1OV<__zGD``XBY|S~ zX1Q3q)t!yu8;6@OhH-S}*`_iBhw6+^XC-PuLqRdU?Hr#I%O=xa?6WE(ldc$|Q?h7W zN=L*4D4rJc5tcTb61dIX|7c>-2Jl5ArmQ2BalIvK8!KL=?C63dI$%LtS(pFTt);|8 zGO0c_19G?%E!WkYK|m6M9Bb`dK&qQqK4qH73^ILxX#VVqo+r;Z?CFf*g?HqN|rMYmIc>@ zZ`CfcpvhnL;meRX-XYf(R2~y)zQwg_J zenZqM^;AnphdY1lFZ^!f1~r+T@y0&$9mKg-j$HHR`>R!AnyowWPR{?|E6MVien|to(7oB=wgrqnrWJ=_F7+dxT~_rD5gui5?H%_I>n5p_g7L+8QMv4 zhCM0}Wv*YmJqvxvDoF*rtzdDAWLv@-y5_fB-W*9d*GX|-w>L$zkfT>BU?-;vFwZ(L zWF*BBiKh*wrZ7ZfBE3+#Q(ypaZKf^KgolRkUijIN_&2yRAxnCfvEOgr{!BZlNO4;8 zyE@!eU7N2LMy|eI&MleT-kZv2mIQmbkSCR-ze3=jQYEsWhV|kfBK1jcKvx?+rj;*q zsY4#EZNLk5k>anU2Gr5GcuLwIM?t*c{@(jcTP4;M&Cy8e>FDLm*!TVrXu2lvPd^{r zAW%50E{j}b>pD#deoLMepM*qytw&&WdieYG0bY{Cv8Zvx1V9c5MTL(zWhzlcf1|?` z8L)aO`Ek~wfMgIq;|HYF_oJcaxq-5U%@hTnVe?|qa5YwK@2?y&mLnQ6X9%=)#hKwF zi-!>pxt%>_RFZbH1#bZsVyic=pT2b0r*o#TJJ@{k*);y>$QvoWVmse^_t~%`XvI1=HAEL|b6r+?wn$wl=fYw^=nMfd{X`UNVGK$`g5r3X z>KCNtbPI&8={uAsfI5+}Z>-6H3$2~f)~h7x%7ACPL@Eq~F)iB%gSnu81~=#j|+UE@0KX-I&PQ6a7C?OG~GnSOkgI(OI6^shQ~SmnNO$7>Lno z1MC9JYV-`*i&7Ei$I@k6iB=)yMmVAl$Ev02ovP6b_t=litR0T`$4lB&PBS%1&T}eD zm4I!rA*|r7@%mpzs_2o6tvkHXcY@Q$d=cfZlyR_K;DNrrpTOsaC zx&=i^ytBt16v80=?iP?#D*70=;xpFGrbqIY++OjsT{0ZxA}Rjk6~r}pP_H}Ub70gd z2yZOo0|4L$Pj&`ZV(J{Mlz<9q6@yKyY5B1U9g_{mEts+ELTpl+fHiwHW(@(aHu{*Xgfe#lfA_8=<7_Ld9gat z6k~%-WD}`O7+&$}RkzU_4y-^?6@uw`i~kL6%$FgaGv5w{;(72FL zcnP3{p?XkaKiEk5oNXIRVsnQbEJLY6SZE|RZAr~pq z!@kvBUqYc!4K8=7Xg=?R4s)qvxWoM|WtF0C2uk02vyC#4b@^OZIzZgl&9ltE@gBV) z4i}5y9<@TVzjj{( z<+c#pSMKK7+`xNwlB)6n_|HRxM3pMj3}oEkn@#%B?7X+Z2CS`E7g83JWbr5EW4wQ` z1Z-e&=wLxbg*uW4oTtWuOUohID|+yxX5Z9Js`>(~Hc55(S@E2qY*mSMhIF!a4&gGZbH3br+nTPSW= z5wfe+H-?@pj{e8PlYo;59=ypogoJWSM5qz-`rg{9#nl9hRPKO@a9?&ys@o65b!x+m z&s!GPG^4KHLLD8*cr}!yz62NpY7u-yHvQg*!w^jhFF@e7c4^8d)7BPwfhi;WzGFu+ zPI!K=N$2S8Hh!QBIjQd$pPp|pj5{cbwW}CEud@e_;pDbsR!MHYX!6c%a_f z7OQ4-!6mG8-b`Ske4}Qqq{a6OHV1v`tvD3$&f=>VdM4ZJJHF3=Q@O7fO|l6`;sdNj zs9K^Nr_6b&0#4p15b=847$aOmH`RlCBS(6ImoTWJr2S_kZ+B$9C``^0rC|MHM&=<0 zrFd!!QrDSq1;|)s%;0v!W$XAO>LetH6n9z-sy?6H@(GPOKj#S}xR`~C{C0R(hxFPz zjmQ+!cp54Ng`qK(|{cS)q=jZGoVkr1-5P9z<1}2 zIbxe_ph$fV=Mv=gYu&?U-mPp9?{5@=5Is06ry(Pw{XcraHCW7glq+F-1219Nd)Cma zdUvpteSccsSy*heX=buq|1N-?c8>J^l#Ba&6zA5KT<>2!xiUW*aZBuqIS?><{RCU* z99H~i&h9k8mYkh6kDDn^w**E~*LU%3$d=s`^#*#gT`uLklV+LCH^RhIYtt+W+bkm7 zx;A0k+pnH!+Xgp$;2w3`AJpxCFSmBdQ;>xPmxW5n1JkoinW)ZCYROeOVcoHwLgIs*p6I02n}|$9R-OVL7tzLGyhaVQ(m$nK&!Az@U5p_YG5&AK zsI~xy!IFzSjnY}zP2*Y2kdSMpNQ1jujXp6rVIyN6?!-&RJrIaoXH1Vxe_&taWKGmBv0gq?@ za?aB?fpEm&$f0D3`dY=wp3)WKazoR(yO#m-Z9SXior2*CD zsQEVgp@2;7Mta@DNFH0W@ZworfpLKF@o&Z0mJG*QUjn%&e=TQhcu)@xUjD8PP@Caf zKDfE{6DJPF=JWL#1seDV!+bdgG4=O9&4s177WWh=wv8-P8(Kd3GcOI8+i0E?GI?+DNj9g1dhh|+Ce8Jq z$ZNi$QXN*fG^svzzwmG-ovl8e=(^WmXj1nl{7*OalAR{|Xhe7u6T zU>XfG_x(A2d@-utj&8`-i!&FU^nzFy!{!7U6E8~*RFP6thRNy$IWr1X;~1oW*PC)= zc_= zpR@FssNA=4FNm{-lUk_{W~HNFMN)hKkm4bF+~~8b;{#Qo zlEO4(_up&uE1hFHceocDHyH@F;m~ldCkosT=u(Tui0*poXvU*m=|zf3E@l%-_Ai~< zM9^06V3nG)VL4?jl$b~rh}+j&xy=JA0*7JnP?EpF|6UH4`Ku7g)hOmCMi}bwpcS8~ls0 zlfemeZSk->d9c#Iv$F49f;~kw1MrU)Ao!zyp~~%A9LODGJP_?>IEEgr=hmlaL@?OK z$xDL@!VUj~6L++L{|xmAtrCB!Q`R>B)zK_vS?6NpW|3hA6iW1U?W^@z$PvBvJSQeC zz90j`S(YLHODEH$tLYZs8+K6&Q0H}2$*k|0{v@}b9m?WkGcj8vDS|iuvHVFy{p#(2 z$_*+iok4EW30tB;l0p+O?{U%~PQP{c)6f0~TCXyNWB&Whh|oime-A{Qe60Mf%U5HW zy{hW*4K{)bV1vT+J(@$82JUI(wC$rui{P;Hb&}Wjd%TyL=%SGzx4#wdfyx?79>N5$ z2k&+RU8Ai3gO5T4%$Bu>@u{T$2ftrrG9BWLj=5}6F!EX!$O=9np1A2^IO8f^lpDQ6 zZr{4zaqQ^$%`&7BTX=v@MP@^7v_~)PHGERb`Xzi;0eJ2G*KC>qaY&C1 z7~$Zq5Lgaw+sgxrWlfZFOKjyZ0P!~M*DyeFdzrRp1W zXg%fS_TKEakYti1d-`;!3BZVE!QDMch;C+@ktK{}rvuPcrIyaPWp z)Lou_hzBtWK4^y4WxK`u2rY7iD*?@a^{ z!X53uwFC&|gt_~ad#_iXqHySvWaX^f8P$dqoUNoSX1)!#ynCdfz_$biiW=|7`BTIr z{{{~G_R3{VGA@oc#)$=9LL+m6vDcvesy&=WKHmJ0J(b092eh(@e)fPe&3U{k3EPo7XuIFSuy~_&GnI72HK%bmUy7=u zzn(eePBAVm(qj`p9{whMq@S0N7mJXW3rbY8WOsCETQ?W^Wgjzed$zeBEpM zHiZF@Ck4NIi`|3vRMp0C)f>}kAA_-@N?&$UxlNgcx<$*oqkjp+6r6XcadFSE9F|x+ zV}xE5?5ITGX}QZ#(^vTCFK9uzCfijP!%d~EKLORX^mD1uqU!dKBLpCB+@QIxRR-gn zQ@#fx$(Upg(bnBHv9p+WSUyh{NfG_nQ}@6y8=v|q^Wwh}l0E>gLmK;*C^ z7h@F4+Rez7qzEtCo}`Qou(QU{jJqDS7%wV^C~mfMh7;C@rzPM{$UP@AOuz0EMXx3FeBEz-!<>&VrnVFM2Y849R`j>NmU_rO9v$n+y8^FKYn) z?LP0ta00;sKlO!rBcQ-$(P9KY78gM*kk0h6C&G$tQ`f~x zPOQ6GWdiS){)vkurI*Tjw2$cg6S}Lja0@~iR1}i#h`Dm0-?dSU&q~;1`U0H@_~p@P z5sS{uS>MI202nfo{2r27BcXr2uM?a^fPzoRdV#88&xjDaq4oE`T@S+qEWP!G9H0zG zF*=wsBhk-orR!krZ=O!MjHr`LI(;#J2@1Oms#U7C%R!i~R2<64T62Npmm16T<>_K_dgRojO%v-{pPFxJ z7&nwcJcgt77z9zGEqqD^$VeMJM;*NT=u1`wwk6#VQxO~hx15h6k5u&4a6@Sj8YU$h!3&KBAy4|biZd@I}rG{=(j2Odk;Q}YzX zOX9cHTAE%ePZ`^C3Drj0mcSrPXy_tQ+WaA+hxgC3$R*)cgIhHN#9-XmCq29TB4}-1 z%__OYYyFui?PE7Sz?;bw-4NE!^l_*TW=7h~%h1D_($}Jy;FSTD#?*(>?G(@USW3!a z$6&^C=m9w?;ifgK=E%bZkbY`dqj8>huu)WAOm_qEB*f4$&TKdXq8E|x0{0OGU&owRbRRMVtLB0JvW!vxLQA6l<VJgbQh@B-_cH8mQ z?5qH(DQ?97^zbYvD)6p99$=9x;ot2O?TGmT>>(w~EUjaVEaDiB)?WfkuCF_7NT%3> zU@5K_KaMMVX{3q9l`x3oqeMka0Q}pZ(aAuiuuw+Y;*`su+`*-$TK_k39cv>8`#Nx zd%((#tWJOJ%lV=NC@uJv-{tqG>Gj4R?jl%t!{x;LoCKpU&zqQop*s#n)7jhDbk3R9 z9{t_b+FYmUA=o|o0i}^oO9L?w#qaqPbC9w<2o@@W^$+UB9+ZOMDNwS>Y&Wnw37H8f z((mr>Mv)%&)CXD-%yOAT7_f%LA8JChibe)sGpB)vUQNcb8YZj{PA%lNx2yNxH)!C;9Q z9_qo9vGRh_23Lp)d>=dPk%U42%h;s&Lsef2hKjlFyoDyybPj%+ay2J(>K@K$=u5bU zI)s020v7C82_+{gE8vO6kj2oktFc5|B`4w~Mp?eTqSP@)TK`-t__T;Isq{*}mv`Lsr7Df8sZ4*IPTts#bx#Z3F z-kaNd-+3W4s$LR8$$^Xt`|#$GH_OFZSUGEskBX>x4?Z4xdCDB^#&AA^(N4F|{j-t!#Ku6FhN^vPgz=k5hHphB(i_{8pkGf7yFQVg(}Z>N^Empnigfy*6^x#l^~DA z@7n8NiI<(Rgg2|O0Eqr4L_Lhu4Mjf>5oC2ONutV}PdPxxPKwlULA z*?~3I4h6j71Er8LO9U|xh5P)9DJI&}Np zjWgGK-P43td?I}~<%21VMZbCWl8Ww+lnTBihn-TDR~dhs%k1RI1ehZ+Lr;QbngcAb z0zT$|5lI;IzcMwmAFBFPFe`u8F?b78rM3>fb$PR9bQv73Xs%nhgE6JhfD86p1*H~R zM!*w`A&Y5Rz2OqAUnPqE{l(BV?pdAH7oCqiYXdP1hIjo64IPrLfs{bqQkpEy5;A2v z2tHfa7%sB0WJn14?{zLMoeD=aXwjqh<&&OYU6Fr&n=(qZN zTfpIoJAdRpuoj2{J(yf}@S%%*5triF$V7 z`b5$#>XI^q_-nP@RN1HEk-bkaxx9Fn(6^V-LZ-+JFJyF=mv?_uX;jg7uDL0cPe`Rt z0Y-~V77D{6!RR`tGUGC9Us=v0l+Q#p^e;-gzQM-&r_8j-RVkL6A6Dbaexg~&msYY- z4Ysr_v`^IhdszX zYhC{`huvTrC=IH*YBY<(UkN7CK3$l?)t>=+4pXa&vK)V$hR2&{Xs(Ox*2>V13shUD z?a|!>)r+U#MD3+&omvTq&N z9|P{k?#-z&)@y6EhuM*rJB6lF5@aRBv5^U+5BMKPRwqAb&)y?LxzwG(ex8Gv1VZPPrIKB1!Y~+x@AE6(3qgeqCO8J|oTyCZ#YBhOZVHmNZ#58;E*~;C z{O?QEZs`1|TP_;fBBqJ?M!9Bg3Q!2Gevvl|~i3FwK9AR6ZeA7dY6VLP*obp3sI0!>Ga7 zKX&xTsV`$ZV{6cNI6>EPz8G4{S;9^@y<#|%A5@v3rJYDV`6OY2a&WC_4cmI1>|5sZ zNCitRr>+U|Nx+TFXg_SWnkqJTZxBhh1l?hO+!~FZdhO@YJv5-4>~|?|4%?8k2%M&I zQ(}L`s#?%!x^I!F1cmB>l5o!pXcpVPuT3Z=&aVm{%q5Fg(bnwQSjk`Bxlk?RE?Q^} zRy6X&^R{R&HX>`Xg(vVxEVnV=dWFjjMBXLePfx$k#F zB597MpbTO5;_}$dAJvlGB$y2P*9pBEM6WVMX1S8lI4j0f8`RM!H{2>665`AmgKvM% z(!E1?!JN|3yGn37`iv4at-?>-(V&*I7qr$ddx*U#%4|qdE~x--&luP;JSibOqSAFY z;L@T@3`Bp)Am0Rh6`C)oMW9;K6?F1#R_5fFfqR%t!@a(?tTXjB2|Grs`&}$JgVf3D z7MRVLlAhEt8~lG}x60fYD63;LZhC*igFY{y4S0PNJH}LL{LplPUVKnnl^)A<;TA^K zhtuH)>dVq-ot7Y-5U1h=`ruMRtF!%oVuMzZoi}g}`ea&aYcbjz&NoL4HrW@yagKJo zViT0;-1_@s@tdt&1Z5cn$Nf^%tk&Q6!LRmG3k)r0W`QO@08aQ{R6}!!Qtj z&tGxE9$IkVU?Q|`LxrKBVyv*X#kl?I4*h2C#BxC~%cSBtI0weS*yj1>+45Xw64N{X zHgOhqH-KwGl^RI?!o)rqxGA;#;Dj)02aZkHyowz5@Jn>#t{=j;t(dnAQQ+LLfk#q`t#CM#&EXu4Z?p+elm^0z_^Be=#qpB zmQsgp40U24a3qCr6G=_J2z4h{{d=@Lt2AG`FB(agqO-w#JoOg?-=9y0FaDVJXhjvO zm0h_FQyx*Lf-WRh6zJ3dZXd4(rC8~WaCd|D%a(74s8NruC69|ywsiR^#F~$8hyl7E zA6kT}fi&^FW1fG;L1~M#DehLiUc@J5Sei96o6||rOf*1|sJG6+FRy~nS<2NP(Vl8L zu_B&_+Cp{b(TbT%9@Tc<=Zl>uCD2=M;c~(~m2>v8GF;WGWmh;7L3p|MuWJ3;GkDY+R z-1{o*C>DQG;ehiiYasK{10iJoI6+{jnqe4AhQT0oMFeWD&`c%E4UGT~ry$})#0^4@ zgh3U#?ly>--Ri=PrN~+p@+G7$;OaKX{X}7gQV8cFYr{=2;<<4jq__Air8@<4%x9%~ z%&Kb@f~!kh^}-F{1hwSzSGBh(zYhPp)Nh>~VkdutW|K-bL|#Hx!q>B zsp5Z^yV%V$DbJDL=^Re&&XwwKj!-=npRW;LxO2Ws?%SzC=Qqb|mALW%&zy9d^v_9P zl*KM-D@?h2AD5bQLj+vo!vQO`{h06%$hiBn=a9_r&ai#R%6oV%LZPurtOe$#XYbj2 z0j-fuO9L?whVS_mbLgQ93KlBDu2uBp9@Kx{yeur!?5qu>*^rOcD*f+f)9%uiRuG*_ z!sN{}@66oZ>$zsEA}-Mo46QSQyV9*S*~uu$n8F2Fjhvu-@{5^&e{4SZO-0psbY0=q zxX4va+=)gN)486av1BsFyd|i;iVq-ciN@eMi|I3*{&(@xRP>|tjb@AH6OAh#Z1{iB z9T}^ILJ6T2YvI{DbX2u4_QfECHewl4Fj%7Wp~8Ny_ga>`QDF+6yWv)tMBx_EhNxj! zbS-t7WKYmW@jL5jic;n_50z1IdaZZdi?g7^aiwW&I>~wy8z31b_(xabUoG{wftw3^ zc^7#wIatV6r2R|^4xzLQN57nvLEV2%98$0(>!alua^5IVw2H5t_yoI$dKIz9Yu=Ie zt#*_R`v#R$(Q3jl6n)QE7jl$qaw*s5)Y9}~_c_kZT zV46}Ty|Wc{=)Z_jgLqOEV&s1cZpZUe5+;4(<5l{mVvzV2+u$f~PZ69!VhpJ-WI0ox zy@fE$RYvypwolZ-jpuvjmP$I$Yf%)%9mEk*;%EU8?rtk!wa4g!tO48*R|H3T;BSnG zkU$Ykk_6(M2)_Y~i>go&HXVieh5+IoWus+qL9YB2_(O*2gZ$v@Y?gl;Rj%cM2%d!x zs2k$$e9|*Z+B-giADvRmYQr!Pyz49WP>6GDAf-^Z6q*+5L(?BH1X)@&0$DQBDt0OP z_sV%w`f`Lo%c7Z`8TR(RSvHJG6oz|*ERffN7WCd=xSNb~W_gXF;R0dt9P28+J-AL> zOO(^emE@PxvakvTX=i`SS&=gq!;e2-t@Qk*oaslT1aUr<=@ypIt27}W3f`9kflqcd z6wwK6wjTA|(YBBB(9W6CmK#VRh5++u%n=OO5n36bJi{6LV31A|E29Mj;*=g0?Iv(g z-qp#B_RiL5Df|C~gn|n^LdS4(p1xk)R%3rWQuG!qwh+*$EbV_!-(H`ZIH=cQ&x11S z1ys(N?+HuAO~BvCf?0%zKo`&ckRZ?fLQ<7lWa71Fe_3xeuaJ~npXy))wE0_ zb=WnXA05J5vrnBPuNV@fqhzLMVrh zSU{tN^{MZjC$6oL;DZS1rK8&s15I6<2pj5Li!SiD*G?#yVTKk^zK{99Ze%~4nVRHS zfWx2Q(P~~)*}qpZ3!H-a5Z%1c{D6M4S(dvI6~%mchvAC49w|KXqrJ*U|7A2^dJLbX zMDNYoB5!{JMSL6Thp-X(A0dwamN};&43S(`Z1ik@FG4r`M3qN9hSiZMrK!yg(gukS zV>>@YrTr`QVs=IYpM`tl=gVRL7Sje6dojD-a}4xipi`Ewu*=&$U=> zZ`(Ey{_bC)0S0OVF|Yz11|+iw*K^hYO%pW3_F;b>0!BL9L}XInOB!Rye;-Ln4k=L< z>8$=>NjC3=ch5a{;xE4z+hQ=tAk7hjWW)u-skj&W0{Ha(_+miN4tRl5NbWz$-GkhG zq|fQk8Dt;c|CFI0Kdi3E8d8BNxfl#2hh!~@c}(EB$Y}-_=GQ*q)%-!3MydD%xVU7> z=r@1L9#_uOJVS*57N~GR$r^7YL+z(<4V>msUvH!+qzIHM{c~RszH8z*ekV<{? z7vh(gV7`ScN|*Wm4Xa#;bPKHc9H{FWbb@((U7$RbITAEl9+PX17h6al<88mnULu?a z$KhHEqd;VSAXN;f3m-xPZ3X&RlU<+Eb7O4}vQP4w1Sd7MZn z!sR?!k_{#>_;-+~Pr>jL5|FIkLT<@0HIEmOD#Hml8KRnr<4lAhLT{h}kvKC!e3=ZP zNuY67daE`WVoxQ<897>q$#CbFI{N`9e~ErJTd&Szs~f+ivU(UO8HzrNGS=mT8eU%K zx%+#)eZgcZM*j;#oqZox3Q>C^6NRWgjeSBipTsyJiep$NL|+uMoUrp4HVN`KfI&j^ zgs?`GKLJb;kM_5+!`QGxIkD)^P;4=u%*vWhrtbVJoPq0H*FSHr`{gt zgrEt@X=nSg#Cjm5l?3&q7jI_*^KK2JadMtKQJnb!$|SKU^G;$d(ehNSs_A8}#`HbM z++HQv-qPF^b`@5AQ`PUND|VCFe+EovgG}2bf-k5fVl+PM47U-f9lT4`ThJBB^brGP zy<(=jLAFruO1&B!6j=LzNzB_z-VudH=}l%?bw48TEx3919Gi^BwnH{9s(I-E3~$Q) zAi?Wo9>{hF+`}gjIY%r?T4+(r>^DK)d+39MJK5`89#Jw zLOIXxWU6o1GH<6tY#9x~TJQ1A`T3gBUA1gZvTD#Abvbs{=yWZV2Iu<|;vWI(9-$E5 z9Sc*}yB#9gXH39^`q0RAwJyRFNWm*QnAG^2w?? zTOPej-kp_))?_nof~?cVVf)>*(e42qy`^r-R&BLfymqC`WV61^QqU((7CF0xWt~fM zZ{B=UK~>BL=WK;#KZVTcv6Ph^s4p}vhdL5v(P=&RVfFHeND6cvm)!jUA%8uzJRX*w zF>5kgo9kgqRjHrY80;i?o%Qtcw$EWk>&(3j{sUdkOAdlC6ouh=S8)d>=){7e^3eDk zNaDy1G*C{E1Sr-v(cLQq9XP$`%b&a6wzrls&S_Vmfldu_%3gG~b!H1XsAoT>)~HIQ z`Shdz$r`9EJ7@!Elfk8sG&3{w{V7z+{FLhI~z$++<%K8b=j3USEn zbC!^BdDQEr^vbbr{DLRQ3 zcoLD2$(0DN84ec|*?)IE@_0^J;<)T0BrfbJdwZXH2>#-9?h_YzY3TB^(QM{MAxuwQ zW>R_Xj{0vQ!|01eaw-2K9x@FBJ+Z88+S8}#i5(|+ISU--u1sTZFEs{wxZf|V=6`IJ zL?2OzKi>Ub?V>adHG(dtzwZ8wB!;2UKguxNX008zB6Rmfc7I!iSWdmIl$I06pb{;p z;c&P^Q_myoK05qzH7WgU3YvofOs)@0B+{deu?+XnLi^~2g={xULuO`x#z-|UM^|V( z23>NDB#3>W1n6*}#|yII+O5;2KJYtMXo6XqgaU1o65UlA{$;{DLpweWmuv-c-sc*0 zlEk^GAUw!dPk(*j%THHW!bJ*ckWz-`7%da*fLVg`oe=$vlc+`{>b+Y0y%yay!KSPRXm@{r?8*Dn-)85N z*Jsn&%hT6qZ)PXQlj+6#Q}lUb?CrbR>6^*)&pvXfI(JJd#rJEeNhQfhz?WC~jWSkm z%14u4E@Kyv#&!`IIG;ywRLY=vfYu;+?Bmna8a7!BHgKGhs+7_s;HUpv- z0^({XA&;+tYkLl0sXIbZi!4KUlP38_MTLRk7bj;MMPLiakBvMWquzb8Tj_5XF zRDWZXo5GezM_je+-kaD(!UbNx^UR$PC_0$@0L9vqMke0=Rt_CF_^IDfe*p?@bYznGYh!AzNJm>k76_w>dR-j=;D zW2rs?VwZA30lFTypkRrFH!mn?KoI}SW_>|HP37@dg*(y&`|np6K&!q3Ig&1@c}Wxu zkp9J@ht+QJQFA1<0X!e93*YO~&tm+s74v?15@vuUlvIyx-jk_2own;*F4x}c!`q^mGMkY zk8*+RbVMk^LCkI%AdA3Ncw3>lmdrtwwDS|d2ML2Aeh>5}b%#~jnp{|qFMq8tVxaMF zV}PJkaXd6(1`!P=}(YU-^CE8-836hD_C=^Ax78 zYAI*jXU?upuym_q&aR>JoV@~M_nf^#9&KS>2072vWmlW|QVZ+C`YbEE$GUubWmBT) zTGP|Q71&cTCC0i#f##p#hk%sZ|tk(-7pMP`s;D6ufB?#9^ zglm%FkW2Zq2nXQ)#aTSXH1wnJyIku1=mGtbG<@;}g7xG_8J_92Y!-z9aN!I3x5(l^ zge-^XANPg8$W+X*>Gv42~8IDS;i<^qH<`5Fhv7T{h+jAtoIncv`i1a82x*f7xV_YJ?~ zPpne*4PyKT?)@ggahkH!aXDos77NGzBM%KuAfaUA90Y^?H{9v(!#d*vW(YnMaRE!| z?IHJK0BaO0Hh+YOAUZ6B22y_?mf;h|NA>_b@8kIX`u4r&5r0ri6y6-E3_L;JR2)Am z{oa;OR)P9HLk&VhmK!46mXqBIr2`nYNuCB$(SMX)y- zfmsk$vDd1hO`nIuR6?rSoIMu>$8Yv}Z zwy7tEL&EkhMSmeSpQz`Jpj&iH!xB|WYgMG`ADPV3xNuR1W`wleJr;7ia?pF**V=x^ zB#u!99c`{d4S7@Pf9X6_VHTzx^X@4>gL1P^VGJ5hvy`56;j=_(z+$vjy!bnIf>XD9cobe%k@4Y=l)Wv zwyqr_GZb|GXxwphU8^fnHhXkSbw#s~gTl+y@jL{mMS9zrC*lm}bk`E<+ zOSfiyu&>*)a#8{FDyWS77u|!g+8*khEiiXoK(niN@ zr!une={z+jONL4q@h4G-{0<}n{1NEmwzj%A_nb00IltuYOaqqSrDEUaH;oBUZu+Ih z+8v=D+7yf=HVo9zqnOG~FsS(t|LxQ>!|acr+_({!Q#eRa1bUjuE!L;V1XEgc=5 zbG}bUm%bVV^Pti2tOX1M%Z9*w7cVa3*`NN>eldZQ?X8`OwYfb$yIxFv?|Qs{?=J%1 zgI+W~i;&~ZdW}XLuH0%oT-q>*9N$Yyhh7BH6syqtMTv*rH_LSNg9Vy}(-x~lwL44^tHkihqO?n2VY5N|o9@~)- zvVJ%C|9#MGwrC^Plsp^J+zC5>uVsy~=c5H4(|-_|PH4(s6N5`>fq@jbt5laoS+ys- zai+i+Pc0W)yWj7ty|z;7kSCfW{|b2UYIQ?Zd&X$;FW`Lirt=ao6}ruot~ZV3U){P^ z5MUPy!*;vfjWC{0on?#I;%D8;{i!(yf5ZN;UEGA(tEYTR`Aqd;7Z_WA;5GK7?Z;kZ zNCk=8Xz^n63m6P=ED)WYMd0F)GMde{_})s{qC6ZD4-R&Lp=nhd8nRhQfGE;`$M_%* zf>De-s%)<$XzY3HeKi~}0vj&$X3-p5XNyFPg^+cv`JEU7`%hH8=fRKWkf{r}ri(a? zz$FAT1T9ROxPQw7*rk4dfk}w^II=21&P{jmB~Qo(S`xB)YBZCtS98aOz<9p1^K1va zDl!jg*~LxA<4@md)ti(ET7i$N(+Bi>QTIYf6XQv=>4N4>>uKEV)dMNDV~9Ve2RZez zA?-O1_5i_|83wL{F^ZOL)m&}R*=mFF$?5Q|d3N&taAY0~-ya@-nfrSuqw~`t_@R6| z{$LJ|PDY}7d2^ryeds977Z9{Qpr43ZinfS7_P8DYAk_)Jv)@dM;3IYQPqh(hbqg#}R_ zSO_b*yPL6w-f^LS!iGQ*f0Y}yIJOqJt{1y*8i39W(=Xh&u=oKOA4^u=-93JDK;{7T z)qXwpr)soWr-J{5wnfyhw9&|4kOmimZLLfP+y%MjWfhCqC}V{JDVwyX@#4}XwhsKz z7|)Ou%;5r>ICCRmWoQ^3;{xUe=}!FS?djghyW!E$9DW*qotj5`pZ@$j8lI)9s-)P- z$Y{xVxD7Vjph>5pis^^jov6PSl}j1m-xzymCx=RL-1jtHt8GuWp43JfF z1qRTqQON*8;S>Yt8n1}~ctj}-P@Vjx+GH8vQD1rnJbo+~Kzmyk&`Fqb%Ta*j2Q?O( z#lHp}seN64SaM_NsZbeO9B%@bAEw5J2jRqpZ9ua|e>x3egw481&@;gA^3cPY+$DN= z4}DRpi5^y&p(jVl`sm46hg+r+MN;tuMeNnuQ6xu_LXp(A07Yt>f_an+(dJR%id-|3 z0p}ScLf5)M9Z+BvIsX)aNOv7ET)I)6HfeX;Rz%Z(>5rBh!y!UG0voFiP{|{hp&UFI z8UVYvTm!N1tuT5(tzu3MwW@_4kb573q8ddS)vmt`{Nnb@Pol3cC zExom>L8@I$0@g^+r`d2&2SP<9fXW?fEl%R3RGW@adG+3{aL7Nt;~5lo!d_t;h|OCU zR-F^FlhEGrz730oxtEEAvTNqL=;k`9_t}MdRv{D`0A4IUtKd~zWPdh)ZhJVpxP`L|95k+FLwS@qMgAh0nygQvu$ zL^1A5QY>~Ntyr-2KwD}X4@|HI^2l;rpt@SaFM?t0M)b^8`@-|#f^4O!ub@ciH?%;-VF8I(-o0a%f85yv0)6(tbFp_+xAP#rDf* z&$nOvgo6U=AraX;(g@7Bn;zVzyN!M2g@I)CD#vXK-?fON zFmL6vmMQWhy#pm8>IUCK#(E1GE4xx5kU4>_vv4Aa1P;kB4nzKG>RPifh0L;BIffL# z3wq?-tMSgrPytg!T-31u&JUf)`9`*DBRt!o8aH*MmDVx<**kDT02e`YU7|AGP-BTX z@ms~-GrwPx^w0&(m@FUZ@3s(slGj-Y7*pn=P)x)Z0x@Y)0>j_P4W1w2P^yj1(iOj0 zEaflL^Y2OB@+yh1khbW}F^ZR3>!Xy{s`hzSSSD3nv`QPTaCMYs?9>`5H_ph@>9B#< zNUF5OQkA;(Z-dckkl%nx_MVDvgRmNRc{0X(=!;U#lQE$>IT_1Qvi`|`SdKla&cme2 z$$1!iwf6HcriQxPEVV6QMYT=Ac^DU>orei0prB9@d?4yY&&69n(sWw`=_cd>7V*DZt&g+d zUWWa4W|`&Mo-Jb}YV=k}gwsCOd91ePB4-5_>10}namur%E)6w&XKHH*Dex>fMHSC< ztSWR1#-jf{y~%xWLWUzLX$tJ@Q zUZ+F&>}Z7(!8lk!GD^M&ZKTlHQi@s+U=I9G{cr3JwO4IZ+cq43pHHFYSZ!YuV7u;i zg8@q^2V9}-Abqi6=2M)1Y&D9U>7g`P`RB;mu+;$=D)1&SvwB0h8g4Ji%_2B)@#rg2$dN91Yj?Ukr19a=*nTHMz zkvEv7n3K4Fq3tuThdj(JgX2++zO?iu@DU~-F(Vao1O@XAP|TGem^r+}@)S+9s~U@y zYAnIju{XB%#?T+!9G{;X8qk7v$^oX8=mZz!-+gg;6Yx zi>>rAve7(4er7!XoZ-l0GnWD7Uh|17{ z++wk;<}nCv=;+14K~4PSOQexqM3{5D@EuNnkh5IT9Q;@e*#w2hG!u$L;J9eu_HZ$W z6V5a4he9XM^kHpNGsz}ihGE7MJz9Hio`)%2sW>QiJjcE!7gR^Kqk`TXkOyuMd4 zs5_Ve+WYoXto2gVEE8>1#_7byR@U~;S-WyQii6;wviao;+RX`}jz}NxWz+IABl3dg z@VB_A4i(4Q0|F|*xD3l`mp3Y}ZX$AjKf%javYec+I`{KU3d*{~`f!jitVylLux(dN zfa?qJ1Q4jB(S`*npD>RyQcR>|BK<}hX0S9wJ7cMrJTMnOciDTJisFucC9YK~je0Z> z?Wm#LSu~~15$<2z(S5s9LC`D9cou1y{749p#cb&;0i z*G~Er7Uj0D@Wi&DaWzp{GKCYYK{SWwe3eiE(>zYOgVP43pB=wRz7-Di;FwE{ z@ud4xm=qh%2W>4qPEEwmHYS5`3GH5 zTW{Jh6n@XIIO3_5vaaiwQhg6A3m%>xzkUDm^!W4$m!YH%8JD4b4^Myh6G>;9A+aM+ z@2v$F8+&(-;7y3$wuF&_9oymDk%qVSV2}33K#A2XgYew2aA77n^V1^+<1dF;SuOI5B8IpdYK;tcJ*eD8+AUC3JN#?F$X@FPhywwj&$Vt!|J!^({w0T6F7$>e4x)xi$rq9H9A>P> z_bi2t&`Y`2fD?+9dJA#^tlYv+QRXS|UzOr@4N@gyRTY9`O_YCGvCc*L40GHorG`SR zgho&;fe3Flg&jT^fpZvLYIWOkO~-7Olgs=3#Oo2t4h`!>2riFMY&MO z!dJZ156Fr&;4k=qddZ4{s1mkD^@{XCCabLy&r1zUS>zmxbB@Z`yx>_g}#RLFJ&?khEz# zBn=95D6j$@Ff7YZrf*BiDuJ$bpI$EVB7U7mu{_ zBFR`>33)!7CA^>+i8HDcd0$**T%~@Q@Vv}e4m%ZDezTJ9*N38FG69Qcf6WM7rQ};$ zF`_D3@tA)clvyol_A4#P1z9X28Xb|7BeJYy&HQZ0A?P|ettE9i4)4~Dd zCgW+0+8d`l+c;b!2Bz41B%023)LL+)(IMpRUmbq{yMaTZbf{h0~Bg>lDKuepC>AEuC;_8qhjLJ=}9Ld+yQ@d zXTUiXdWmfrd41d50K*mDs9i}ELP@;37q+~OTO|`PLRrrW!BL@HgPl|qp#sEhW{Wgt zXfj!x3Kt$BS&D*ECOt^etfFWPX$8ZghjGbKS@1ppO?c%2gN$}9)g$UP&9dFZ9Jk9d zy5=50Y`suV*JtLjDfT*WK4v5rmfBCfqP@mPUG@E9{1dl zY^WII)nQTrUDz7duuZ{H>VV<3*zlMe2GhS;?(!Tu2imNKM8!}eR2cm)< zJR$QXFFqMNhqxo6yY|^x7+!yykHf>jA$`H1Q_F%ZtO=`5#f|@!0E5vuC37pb`);I) z9OSed3O!JDlJEvR(W{H&Kx(k;-8G<-A?P!#9QWT{!<59x-0oi-d|r`@i;H2z_4}bk z`g->4;Pd(Dt&XJDrR9WnVG;uTn|{)!(8d$^c&t9CKSc~*{uj1($diAIHqWI{^N2Do zGy`Iuj7<(rd18Y1d_|r?5L1Q%KQm-MB zuC|WI@zJ29ei-ByH$jWM?48`x)dVu(QdNJHFnMVGakVSir&>P-1rFH*#V1o4Y)e?V z685@BCE8Q$XiI6noUngRU%qAor*yUYr}srAcX#EhQ@2>@n7Ek#2y%lEyd}#zHqY~s zg0qp%Z#i|AraF6YA-Dj~asR~pzU7BVsK?4eF1ZgoOq4@kaQD>x!dd$UZFDUpY;!J% zla0;+2CdHT8#cSk5#G1EKvcNRy`E@!m*_66=>^DdYJ1L*do_Q)@E-+_sr3axc&O&r zPvCcLe?xEnZ-Do1fG#U-3mg>LLpDLx%i;HLgDt5&P!qJu9!U$d);#(Kct3{t_bt%r z0jDDWwRbbSnf(oIjIj#BFcd}i_Z4q&&`qHtSV7Rm&RqkNrY|*+yo59XtN8C$rQ+Zn z5BHqiK3oC-OGkfwkc#kp%C5=X!C%#;rM6hDTe&PmJvi-o5J&HVXW}I46b*NxVr@w! zA4>qkiK2d0zO^3&5k2A5WeRrd>AQ-G_VX>gfzo|1QKEnxv+l+4wKoH+wCMC+_u+0A+va1 zh7-B-26-{Qa(9xROu{mYXem|IcKx~Pb9KJ?&Mn+vV0a^g<3h4`Kc%Kh^Y86Sd|k`> z^~F~;|Kj!Z%|kP@=3)ASZJagI#Oa&pm6=a(%uGuWt-l%!X3B8QgytczAH6hUvD;;; zaauMo3~Yb;$uaiQjfv9FknrI50mI|GTJk7ah&(F6&YVu3YxP0?Ea!6N*fqPo9ljcc zyviTOXRp-ooDHYbi{aflqjkwsZ*|ozza43A>L*)aYjMKB8JTjWK{o3~9<`LmEi10G z;NI|MD{w)4(J||ZSx;=Uj-WFcq9R?tSqnugcsYL(kL&#!Py2X0IOTIiPAOOT^Gyym z(Q5R333n#urHX#c)d?S!x<{%?Q-*miO{*?O{oVCr~v7vZvE8!_MghPAC7>>16Bl z?&^Oi{sM5DH22RC_>#JhQR`memF~lJ^&G{#fe&s}lerJ*Mr8%sWAJk-5=BU{kjpH* z3Ng<&YqMGVys)&r*!)FI)tfc7(3`AP#7)Z@UYgthb!b#Ez+sJ0E_+@pk#P~Revqr~ z-IF7k%A>3Q45w8ePup&yxub&?j>AXrzs4&uMee$uxO zT}@8nFd5a3Oj!eg<=$6f^JmChw5&=Xy5iAW2pHL@0{C2W;wf5EsA#eBvI4_sdY^0& z0?j87tLfDm0oah>9nm5`I8R{!suHf2OQ_Z=wA(de%BJENYY@!bQ&0?kFEtmCR>gm4 zrZfnJoNxXR3*x|cMv4KbT~p!;Hpugy*6$(w3QUqI+(2E+Ifx?thL;!(DK;onS=+2p zHgFk1C{AOsT}}?)j+a_EPH->0O&&rmLr5e&fap{j3CXIuP$CJr(|w7uaU@yM*?2oI zrEy6`q5;>bqCjmJF9jt*EEPT@4OxFu@xZFDTTZJ=L}CkNtZ3`urNhB|qJ{-Xp>u<& z5NO!YaYJe$fKNvv>J(A>B}$-8I4TJY9|7tMRW|b@+$we{a;u{9k|8s-2scG;3?bK4(Mx$9U4TZou!lc3Ajr?|#Dz^{uj2 zAGEED^ZfK(t$QDh^Ul#Wg~!3)?OX3s+&B{d&QmDdZ0tD(0$aPcTabZb$z(TMgitW4 z+!f|r9$Uj0JhIo4A>3|EePeK7L9_P8wl=oCNjA2VjqPk~TPL=?vAMBr+qP}%+xLET z-?~-j>FSy}Rp<2l7& zdoiXP)6$Zq8m2)Ii+#!scqwYX$95uhMcCa>EH)`rzeKruaAz0oFLFy9X-F~s-lQHg zbf~GTRh;&WxfQz-&ZyxaUuaSb-0^~?JNF_RP}}E{*frztqB@+;^}4Qcl7sEt<@|XJ zfi`+eWJL7~RBER4m0COxaLXc3brgsr!Tg2FBd|HeN?yzn<2MFe7bWSbA$!#t#P<`! zDhXk8@nL@)6JEs(|ABPirXR~jonmGX3`N7cH;C^PXyt==d*tT#}7BpwhO%$6A@5d z-|;&=HZ=1NRt$dN=hgBm2i_*`#O^>pl!y!=bIP7+cnQwp5rX?F)VV!#;K=W-NqT3*fnJBS;Ly~x@FUk2z$U<{tE}%jNX6is0WC?LO=t;698}lo((QY%klW(kElHbA@4vm)Fx^u@?`AhN=(f*A zQCFH4ViPOU&oE`m8TjkW@GvRNNA;rm^q@DYHiOnm#B zoU6-~sW{F7pueE6d!%zfM0M{m`AwicEYlTnJHvYp@#DW$MGtw#wHKz#er5tlISuU7a`4#Ctz1p1o zPUl%^4-!ZxMqu5?t1nuRg)m#Y?kVLdrL7>Z{9b_oV1&R>U|E^8PB*^A=jDIH=vG

?{uQ3D6@0?yh~VTDe2;|-VV%Zqtcs>RYlS7{$@Pfg}5c6DVCA_j2EYL_oHIAvk% zOI50cqb=5}RIXgs_OVL(NA9}TrH;JDzahVs28;zTIxdYlc;eKm7%FMg_WI>Jy;4(6V_@lEDYf$$Ms9o`PDDQyOgM7k`GOo{iF49X0z>YoQ67esB^ck=}k|9W3sibyz9R z5{sGMI%zp>Vjig4m1hHBOu&tHN93WG9N44(wt*}A2C1WpBCQY@0KU)Z-{bIRTHZ`{ z4Dqv@$*Lu)lG3gIYqL{U95w5UQ){>YaxkBSsXR2G=_{*|U|+PEfxA zBHD2RM^z^OG3K}XMf6AbJox`AiWaiGBW7!@W5qx($X~eHt+ziHahe`Ky^+7ih-|<9z*@SKX zY#wXPi`vZi#xPUCdtq2FTx@G{eK$867fK1j6eG;wYr8L$krCvl8R#--V4wO1O3j^6W30Q zjx44VC-X3sK{sCG*m?XZA#(zWix;=FOB2S=#p&)y0)`)hxqiOBx$v#xYoIk*d_n(C zG0UHCPn82<7hHfI0M%7!Yuz<2$0?ea3Q@IeJE*&bXCgU45EL4r`bE0FyAi63Qotm170A{iy8Id7mGC zw(72+B=UYcMY&xOQFG92Aqo~BC)yHH$kU=NDdUQ{QbH2}_;9Y66-qa-UM}9pbDvoR zGnJp$V_O+lh3$OLU)_?QLF` zldRM2$teH+AeBhFESaprLW|lc^Y)$0@R#X28uGjbbiCZTeO@{o`C>gz?pPqq{KVUr zl@Kbp>uDN+9~2)KOV+mv*u{Uo zDNC8@Fe0>U5}kUyW8~|Okz0P}zo}>Ndgm)b-sEHk^ki^Roj307JdZ4fc$@`cdMh=3 zgsIs4yk{i}K{VbNMrOgP|L&pxq`EL6*nPnfIXA9@>S-UzlJU`zW>LLoKHv#3m_XzG zrObvJLsi0M=^8##TYO7P>LCnoDmdvnud+yPa(}6kL~32s=OAw)#`I1 z7K}h*V@@4B=XzP|JO?K?nrpIZhgZ@U`7Wat5HwwcSKBmErCZULEs9d6lHsg6P=-F! z@Y~T3&Y^$NnN!rLgS^kBp^kWfH%Zw%;#AF5Q|jY}$YzDa93&ux&!9Ps^jlCX2#tlt zTi_t0UFyI1g1)-&ol`yuC~>Qspvd<$BAC6-x5gihFk}=w_=%@~S2XGW+Tv)TqWwb1 z0i?M+3!jaxCF>nfO@l|HoLcTlOilK9a?}Pb&2VzGYNOGLAV6mQK|Tg!LlZ^e3f5I5 zEE*1Kw{}Hj7-EmiYpD2dwidM~d>Sb+T_`qNQG}|Eb`ActgT7Fj#$n8BXl^Af;lKH_ z@r~)s-Bmqaw@yMR8nC|IlFp6uLpDWi_FsWx2_A zSF?)m)X)VKHY6yHs4mUaS291n-hGw%la`(f98<^mcR-VjondCfb)Ut_;L^^Jag zyWshkax>Vl^+Btz!aQO|dcamouCi!An@r9dK1#tvC*qH4fSLm$pKM*Kg16?p+G#bJ zRiu&G{#fWOLsRoWa)ZZMU$V!g2b}se-GSX=ZH{*YfCzvVka5dyaxZdbaD$s%t~(!Y z{>goGJ}Pq5YAjJy{pp~nh=~eyw=(iR?_>S5g`2$CMZ~43;2P2X-0f#Y>Ck{KefpfT z2HOC$lG=P}hgRc$6v7kgn`wf>q%!M5B|=%z-(naT&nvXO94=DhMCBO1Bw#8Y@_pcA zH|kJDX=D`9YqsF`sp2epJoX4vAi<-vwo1IFlo+@_kL9SvC~|*Pv{i23ztgG>%CH^- z{~v{TAw?wwrSAmC7+etc>T`90duX+rGlB#c4;IU68`V>FJH$wdA?@}Aw*nr+y=Am4 z@ziyVyoMbC0R{E}M6~g_X+Uf8NbxS(h!q1-nUdoiOU22^Vf18jew>}{+uo3=a8E9! z$Ka~iK=3CPA`-#MW&=xOmF>{`XM!hWw5aO^0Y6jw(+HZ}$NBc~T$r^Mk~9AuVGJ*A zc;1Wl9Ah>XF7O$l7go2!^dd4`oaxn=Fok%#BFWb_Y|8#}j$+zh50oUN{o*sX|0(1l zA`t_9fm>@SDx6~4^^o=w{93v9!I>ybP&f&(Jgl;B@c z+qB?-*fkdTSHLzdI3Qddn&Z2D1zq`#D(`Ou)fvfXYp4)IUTg%_@Gfp6%sPFZdN@_` zZgHc|Iz0)$s8K;^Bzjy9397P)f4GD^3JeXX;1N| zOYDZ*!|m4$RG|%sbq6JCbst)P-}F5dwS)hD_b-a|MtBVl`Hl(Q?hSJ)aA56}81cGtsUAeCa9XPPSgR1A zXT?;EQmP&(mEZnRd08*huBOpbPhuow$})zVstqy)R(k8Kb~GBV>9pLE>3PPG@TT-? z9NsJ;y9^lV#Oa&2wsdrjkpA6op|=b-rZ?5PwUs@_p!eJ7`bR*Oy853r%=N1|b1Dof zmS^y;ZT7zUG42RgSa@B1WQqoE+V_|24qjI;r+R*iDxg`>+HJObpnP+F#;U?cHd~ZY zcdAtlaO|ONMh}q*Kk~+KZhHRHRTL^@F&r-AXlPh}(futkKpt@i?cINC(7@%Ts*qb? zDRa(slH`2}H6R6~vp1VjsoBN&d;k4rg=3SQZoB?MRy%~{aE}(UL%&T=?Z-X6dR4aQ zbim!eXyvAV6Q+2Xg6&UK>DOE3N3R|5Ksa%SV|Iq~eUeRGvJ#|fDfhz}TBuSu{VZqtjHvKz z`ql$w9J!@93&BnLZ<{LZvw>5-rRsT-%W37L}E)w-w07h8>)QTMF zR{baC)nTaUK!V7-^+4ar?UGQxTfm&xgKMXBgGlLrkwXVc5rv?Bw}-K62B**l?PBy> zN+F7;79>*g=O_X%w}HtELIsB-XX-$0o{+gdPT!tp7rbQ$Ig;safgQW1;n5hN^!<&& z^cOT(1)5V;u(zDav!d6d6E?U5HW%oo`Tjs-W`R*J4=I@}=wY0b3!k4N7;hYFgiWRa zd6GnYPba*u5!_t|KT8{MKT6c`L!t_v*a-V?A$*Mib~9DL`e@F?53@RWl;7ASJ^$(a zpZD}RjbnAO3)CPt$GV-dpJ~AKjJGWjI5fe^)xlnud_UQ${n&Ec5v%}x1S@@n`!>k= zO2PIvNKIX^(Iwwow&`0O2_FP1Jur(UCM%tOc>qQDLo|{bi}_N!|2u$UIv@(qkHuW3 z*I(j;5-=kgd5XoHq1S)niUM{c3g3^#e5l)>>WNZ3Lr!J@V|YX!nVG`mqT9Rd4nz4| zScRg$-5Th3h6-6J{T;Zb-y!RCg6S~^AA=U?bcGwX25F(!uU8W&f*W=M`NKdo2VvCe z8zuvSmJS-8$_!e-dgVU^hB4kbd;XY?LZXg=|4a(`*)?vcyPPkaFM`+b{Qr^vVAPR|EA ze^+Gv1ht;(N>E-kzl?H$i4K+{l=iS~dT?7(H>jRA=uP2kK7SY}=uh8okZ(31 z%67IOZH)R)5a*q~8(7tEpe}mdmvDr{&yYP^$SWbxIU_37o#iPtAmK(J5cStM{!1wB ze&7CR3s7J&@x1^;OVIkMSByVs;_k5INI3$w>HO7V1F=vtgzWx1$!>~VWBR+Iw1;ea zgA)>=RFS%Y^@xI}Ak&em3(AW)Fw3`velYlieha+&_%Y}(_Rmgm5cN5>>0`FkhO12B zoebg3Y~jhN+?&h*^P|l%KB|X7Xcop z0669Ea5OXaiEDe1E4XQJbspHg$L1FN-2hxX2npkiJA_%!c+!YjAy*}?k()v{;yVJR zc8+cgb4$lqC2K5=$-oNv`NB(vybOo!pK=k{vTHEx(ooIx9o-uI77^&uXw}BmJU!&W zhi%z#Q$J&U7_x-%&VCc6(((*Kz~cC%0hV-(jwgl9&MV_b>*K3lB!zR@UYvXa5Dc-c z)`_|$2n=-^(V7mH3WuYkcTJFtOi(yN?BjL})@;6E;GV+Y^1gWpT673>`)A>9dGPG(~|nx&HWWzSg&T@p}s8(u8SNOfVJGpqnB6!UBvjE#1B076bk5ai+E$?o_@| zbWAL~g;Nt$2CY7HZr5H`p&YltQJ}3wZQ|0J|Bj+*WrON_fiYG88@prpD#wC6ny7yF zVQ*M=eyO?-ywZ=Pf@!nUcnc$RC18#l=N24*{dVK*XL{7W3nnBkudEneK#qSz_envFsu?o#gmAA>=pMcwzzi{bR|m z#Cl}-sY@6*oxi2m>cz-e)<|<*^2U}&ZWWpSsTqqkYGzgC8|_4<@GHGCaeyb{We@{T zIy{`?vhMLIs!LFy>e&Rr+r&?y{YR&$-=v9tQ3!NxkkR#?F~7`fgSV*6&qzowC=6p5 zvEv@ooUG!f=@-~^e%`gxl-x3#R11o+opE2Wn%j)U$0;Y~6r9c4=PFE@8r6T{nEcwL zWJ#kz8~URf*%9r!k6=ALYYbF78kw@6nFqmzGC7e{;mk>`!jr%_T}T##A{O1eh-5rY zA|K9U60Q4%;v|~YB*mIy1T>p;U#!6#sd365a84?aJ-ER|&i~{rnCkseLuwObgcP5a*icV2sO|B1n2|<#u{?Y51B}M13%krCXEV}d-#NQw z6epKKs_OEdJhfwbWd)#Kz9m&;Z-{jHwWy&dcQV7TaB%bpGazwoOC7QSk8~dtc!}sw zSbuulQ;t!=OV@h{i9ks8Xl(USfWP|PI^+~Zt?%J9AyQ=D$(<&5tR*rrF~IMq!gwan z-${1120>qGK9#b{oE}cC3Rn3&2R@1)XRCLOWdH7WKAVe+XO{p1BkqD5w?(F&C3u|9 zw5!_^q<&Me5L%4Qoxw(-tjHm5(#fz&G)=~3A>jD)_!EGWLJz`(vcsX#9SzOn%@O^o zVVc0bLh3*J0d$@DKZx6xzWfSyFTsV`L0wS9mY4Od-V<_dLjJpvSLZ--b}SJO9XF{k ze)mCDS5mItczOn;S%%55|Md55;&KlOnd;ydykiUMRZ(Sj;Qf<2*XjZfT85x^Uj{fw z{e2)qQJ8RIVyYxiXfQ0>E{Gm9$%zjhiiAviUk`!z>eu~Es|^Kjjr>5}Pt z-?fc@I0e}Nsfu^>*v6? zN8<~jVUpa(W$x$cL$ULs>0Ur_>ATF_K2t!_;1p(TL}y&)@&a(;Q!?FMR_0ZVw7ukD2aNVZkMq-g;)mu1L` zt2XH|*j6D#^^88+(b-Iv`d@yojPGHO58^?bmY7#DI|;GX6F5PCM;hbEB;W;7Oo#Hr z5!6k5N73y~TTzKlx8{;E#-a7)d+@a+v+8@l(q!oY$@EOY4`dic{gRLvJ@7_kVV`DBWTUsJmclR4VPq~9>>qA+{132@h)Q8fPf`h`3bHUm=#FXq zJ{5^Qsvf(|myvm|BYk9?Q;kRh1IR9_ahDQ;;CcGHLrFhrY^7k{Vc5iv>6D6Z>_R#xrxAZuy^tu6wLcfWQaAy-@A`yH11K|I>3J? z{gZfgdiKju9SS;+*B{mE11(ydDyTCK-2F%%*04x(yO|)iNsvKqH94@`5U8QjsC`3y z6E}deBsh#e{IEEUlO@QL%?p4+96Y5q9#3?-i_;{?(+qxvvak$-xC*g{+4K9^v5IEg zyx*cQ|_v_lKB0m820JS;G(X>$!rer~9d-iZZ>c|V3$3_ym-?k~xy1zA zEj#M=@S+E^8Xb4TKRg=0hFOOaPf^IgP!(JAJ&NTkK6Gc}MJlNb`-fEaPXOgtpPF-| z^FRd(Noj`?%0rfT`61zs1>vveC3B4Mzv~yJ$>~+0J{EHcM>a_@=D;T)tA$^@_Q+~w z?bLk8LL0GA)-+03SQs-qOGr$=(e0vZcz`hAY{J{hLwaW9=T4**zF0|**SJ$u6}093 zh>AX7Ds;x-dvZpI!;^7*fgKek{&r!_`?NDo;lL}L6g_|RX9DzGy|!>n`4?(*;QLF} zvZ8b5sLZ#emIUFK7oaFsrLGFUXW(iZ+*2Ut(v9>rnE>;3x#_!PsKFc9dWq=IoA$8p z*K=uE{^iisUrn6cBUBnemq)A5tznfgWuaY6>^|z2A;0+IP|>=*GaFQ`ett7ek7eeK zZxXuSuLn=L$Nk6ERe5&h|NR;RRQkMs92f{sgl@FKaW6yF`vA;v?H~4im_$8{rL}?n z^@J0a_l*ds9j;0V32%>EBS)07B&{!QN^==^5z8FeSC-Y6LR?-JN}5G$STX1yq%^M~ zO7u4VJc^fc0}+IYHg_%S0enWHiI)xe9`1foXjf<7A1XD!tGMEy16GEaB@$JG{APHLW~8Kw}YY~79T#AN}`3JkgLb|8M^+%hQ%r7Jt*79ksJJF5ql|^ zN=h1yNEl_Z7B`BaEX#JScR&fdo3_r)cQvd9NGrl(UmyF8AV*tw>j!kdCxIlaMzfNo z^o${`6d%`{i=A`rc%w>W2gg$)d)9WBg+_!A{vyVcz)o zCHb|#S5!b=*)8(-b(s!znksfVn6QvI(p>X;uK#p^6a>t=E*9@FhUwB z%lxygY7bQRo>S}o)}#FS*dlzy>E6;*zamlXr^736sF`BC7#O|e-^Xd_<7M99IWAu)UT@@gv; zbm5InFWsjp9{5zHv$itp#nj@FAMGTF#VnOc)&U`>=&R+fx;W0p7ONr);gT97;1!6v zT?K}khu%E%<7=(8r>~>C99ME=k>mf!Yh3x}uO4o-uk-pNHNPsQM=(d<_Nd5<3%v&a zE}jdAzd>hG!(i7bHLtDt>ep|*40-pXp%H=VVOiw=W;f}*tW zv=qyVOl7IHwF<%>?%>VLM;vw7wlt5Z(f7aPik9l1TS&(+n~t@WDrb{7ZPev)rr-Lv zW^sehDT#zgX4t>WkR2yGYbpP%Z_i4M0vZ#Iq^y&zDRT^W!B1Aw(kEZ85VgQLjb;uC zEJ*N*`H6^b?dzA1EM`)(=Wi`wP0ZVU&bCWML;ER7?5_gg%JrH(gbce@8|{?Rs#~rY zeQKpfvs3~wZz=q8q2pRAI|h-wGC=L@#jjuOoYRwckBU!oa`L4HkJaI=)04Fc4c^kR^d=838|(5AOg_~Zo)5i7 zkNwNv8Xbo9Aw~}_LI;MA_g6iwVoC`txQ<;Uahg3c)YMlditc9RqFX}!q)+9RuW#5>K7H1;oI*#kUD zCr&@4U))9?qefYOT9qfwP|ehKR7i~*3jGM_O~&a7s_)e6-EOHOf)1|!_DGt9UyaU{ z6ob}+Y^FwDQI0I1^|>F!$ScL&m8$&~+^^SHRPzbyvCRIqn*G6L4x_yc#Q0~u5~Fk- zF)NL{mo#IDeiw;@6RR2$&LIG*%5Pam-;ixZQv@eeIHW62+qZ+hH%g=~!p*xT>MT=l zx2i2-^Y|i+wEEqjBX?v6SFu0M6GkL|^dvNPn29Gmap;9^7iW#@#j>r$ipNbgQ!x_c zs3)V33D!n{?+K+l1-J~1=}lK)A21HT@@omN76@;$qO>oP10g`3dA-O`#6LHD18N&~ zr`(jXCzGcgDMR*cH>oSwu-_HW zw{&)g_4nac&sfaWXLfH@!FUrj!C+G%{}}E!4PG0uNU1lw{){W#Vq)+5@2SuEdX|08 z!n)g{nANcufA;}|&3!PweYl^s0hxIEryA3BC8mN?d07y=5gwTLbpN;EEFR&PH{5Hg z9>y`sDatX*XVtSFwjPQewj7GwKiE3*;ohy_bus(gz3@&cZ3TBuJgljA$?!sXAU?(3Z&m=d#Cu;IBT!x=kpI4@_sIo(=6>b(OES+MBZ?6C8hE4kB}Ad#-w_Db5B zNZsO}I4S=H2G zcUHNFypvhwZigiFFN%ELRr@Cy5$%6Vy)IN&_VDL*1o|A=ZZE}U zj0dHc;8mKj$M)-|_m(uMmIDZMCouCV)$uec;XImg{;3%(2&PE9d(l;o5AbELR$qF_ zIg{HV@*18VkLAUd2q}H0`*_MMbf!8t9q|`F5BiA&gNly#;Z4dG+Kx(?b47PtEzCqO)p$ zc=%WmW;8d>)@f_F_q^ZUT-fraN+W)6LI{513qslsB9qDsM2DVMxzYy@!o|IyD2-bb zh|&8*G8Ud>PZZ$=s3+eKj;_95KX>}B^nBhPv;WDD$D1qQ?PiVN=l!ng>vOB>SwQXNN)urPU9t+j zEQDK}%xK;0&R>$X2yGbuY)eb&`@=6@?!eGaSaok*y-_r?8U4`qXh*q92NS+%0Uw(; zBbXn-gce&Qqu4>PU?MpuGQwAEo=|B({9Me<_wNE!0YIcA19u?7pT&0NA%I=K}}GtSnLOLlZF$FZqLJ(8pjHiV=n z6aXGrp463-)+c3ZAt{ckLr=a!^Y*GmY90=Sw05p2?@9FtEF2w|b%rA3DaSu!Wxwz^ zt{k1v7C~l3(oH&@;uS>za>%F7UEtp>&0P^Mt#27@yL#w4RESK&k&Y?5)s5!zlE z#UG*^O|eCAvz2T3hQ8>(3#H381>mViIss*(GF{<#lkT@jb0J!#k9D*r_yTIl+iDcJ zN50w%G_r<2%W<(qFb=dWW?GH(D@8B_UNI`eeamwM@dUF3h@Rd~gh`tP)>83ep4?Jg zkLMAY@a94t8RwFo(y!cboX-_k~l;Dt3EqZM0*%=DTwT#ufLUu{RWwI@S zLaeY&T4O4tp$91_^Yr*c3NksRrr#%svma_2%5W4)r!of$>Z~-(>@w5?A$*`9$Wrd( zsnB5Ze09!ZcIeW)eEXMX=?(hSkeb(oL~KqY z_F9INb_<%DS^EQWeay*gyVYTvHI1Zsy?7n3|HY8gM{}*-ld0??85j~ewH`Do5zc-o@H*sMK2h@xeAM$$w zbe^sN?E^XE+Z4Uamt~4UXAS}34RakY)j(sikPb(JlZ$jH%On-EgunvFoiekqm9U&gU+mb zK2(K_!J3c-Fv^Gdc1ybVKz`TRd5&s%UB}$f9y<3Z!2X1&w2E2bLOc zA3@^YtM>WSI>FSs63+nK5!UE~8kXyuv^`gmS~M-e-3?~fZN#TH5V5Pf^E{P4)mIL2 zY9D^_Rr0A&q+ARKgPeF+?iyXC4B+jWBkJn#YWrLZolnMJ>py<5`C~0ZZ#kpXi!T!- zJYM5#A}PI}w|?7uaIKs+ezB4E3Qk&`>NI|OedzzB#bC((z34U1*ZrQf8WW@bnES!G z`H6?0ty#F9?UA|*7!MYMCB4*sPP>UE9Z}-QlwV@xZQA#`&M5GBnN{dKkgm zF{6?g)ZQW_$>bPYMa`*t@<_Ge7?M=^{E9ao27#R5FFJ)T_NUtki^;TD+monW*~}%!RP~Oe{kfg=wST5d zb=YU$)W3_Fe7y`d@bF`NLlj5RaTOZ6!b=W&k}F3PtezU@+_Z})68n--eSM}R>lJno={ShONP zp>Gk;ZR6g?x|)n$%WQfp39FBq(97ZlZXC{*7B@cy-yYKY{vC^spEpLjxQaLG0O0w8 zpK!v_GW235_1&J?p7%=$dG`4B^!2c=k^V4j65oKB+kt)%3kUu=QqV|&7d=vCA4rug zzfA!bc`Th~hB@QD`IiGR{h5|UTtFcsX9PfP78te)+vcIAC ztg;MYn>L2+%S!x&&X+ln`^8#4zEsdE)Rd-{L!!a1U|XIo>^H`n=r*7Q)fgI_D+cVf z=34|iu~4NLnB%J@pdWV(BX)lyRD7~(i;}vXR+_U7xHq)o2YjXtvy=Pnd$^`V>1L-pM8Kw8t++t%^^~Ry>Tm7~!*S3S1vmwsjJUpzLlmhM z1?HKTte`7EU*zc$N<0O&^Z=O_0OpUmCt|Pi)TYKpRT$DWiY53gTgYvT(Hjj!4jMlP z?mN2Z@SI`mKRk=9lUbmrPTgAkBUWk33`pJi)3!~kaxdI)>3g*qW! zjT^x2KDB2;N0x$BgJuU<%HD9tuqo2qco;payfB^(A>U8?W*VWJP^ah_s_xiB2&S%+ zyeW?BA`wzZJq=eeJ5IiWV~>y7*q_o@cm!~WC$2pc26H&1xu4Un(BJJmKFI(<6RI$D ze}lz>{v2&z)VjX#C}3w`bm}(8O1PbAj7RX8nHH0z4%0`D5lKbIJ2cEcWH)V4RroeOD4|mei~dVDu4psyT_&Loj40y^SXH0skgFN4ZRin6tmF{&iM#7eXUH3Wc!q1ydkvp?$?A$6KIB_ zD}nuHDUZeA`^|VM(W678)EH~Eek|J!#&ElBc0(k_X1iW`q4}C)HzOludk@9~-W4pA z$Lq{)Pw0`}6=2=5Yrx}_BQI6R5sFoaP%jOu-ohEKX7fARL0?H{V-{~f|9A923ntSL zXaY@0x@j`=bwAxeg?o*xAY;(Lx`=rOspM{IDl?h(uMKdEJAcN}yS^XHZf@zh5Yo(6 z36j2jluXpZF!wb3n1_x=LS+wM`a&9FUr-Zf#M~Yd!T{`4Nk^evm`@8A^;`$oLO7j| zfubcm=lfhqY|&KO3sOuo7dzI$VqZbRk#FY~2a2roE#}k4JXtguk-zFMj9$$7L&-4m zq9Zm{9uov?yp8Us_xV_{qS)~vD3xf8c&vxlG~Wihc4Q5fB_(@FS}>}KRujd8xbva# z$li=ZV!+pL$5QY0=NhwkJE6+ynN%BS2F~5LLCN9|6T8_{m$gjSfTzp=mk_p;=Z!fR zwRJxyx^M7P9^VG$t)lzmR-CAh4ib`8ZZs=f_; zRmzO=j!-HL#m+1JSwf%z%)rQcfU?a z;~X`Kn~-N~uGO$LoOkVbbd;OM%uy{^Zqu~Qp%V^Is!?K=k>T1|X} z@qB9!X&nkiGqh${;ZV$Z;d1_Qg@xwA%EP~5;6GN(u}0MLdtz*qi^Z@Qpe3_f z!tW;`O^?^>8D{;d=~d7`yFH3jH(lGAVC^zuF(roFOTBK@WEtG)hZIYjsn;Tni;tq( zn$7QBZ=e4?`0+y!{+78PK9;Ui0FH&5c>~XMn<+kFFFW0BS!|(tX)EuhPlu;1WlDU> zFb-q9&=&-9e;DSNTx3FDLeHA(Mvwhj6F1XQ8rEG9y~6Ot!z&^=x`CE+(Y6X2d7JR& zT-Ira>WAT%q{{o%pNFXrnl1bg%Ig89VDA@ro2Q-6L}w!_cz8pla$|}vpwESCZ9|6q zH!AhrrQ+C@_L;>H)8iLsp(zpl7WngJqX7_#|AQDEDqQ1H<~Hq2m-^8ZpL^O6^p*ta z$q$JvWCvtu(c3H)c?ngk#O(nUrYR z?E&-HUYM}SJx_vT^?y6-&eemNkb?Wn#vVqobp!5Sh*tlqovi(C&qIlMD0s}Y77?9i z>CYKefuZ4(RG?covOgW5i`A`V`QWn{RW9jAvv0sBL;4A_etfpH@adU0Oi zFp|=cDZ3`znfy^7N)6xVYcbNFs?}+)k)d zsD66U*MWwV(c%$%nD0@JUq}*XJVqwYZ%c)e?~V0m-~LFp0=HiUKa!P_Z61wSH{#!H z7xv}sW54KK@!5wk3=E4H4^N3ttZ~p2pff&Z-DXi*H_hnPL&>-I752dtM@nA`GGCef zn#`3bUItw}@b#x0OQkr|@gcgLZi79;O`p;zqC-z9M~)k4!hEnLLQ$sXouu~6I2tanGQ#7iM(|N z#peKRDNs53$od5_W#uRPVk{@dqCfYGog>v|K1}uSmm0js%r7XySjqFbiW=I3|28t*y^({|w;NW}{y;eA{%q~u6#D+OM77t^q1(k;Ey8&tt7 zAL=y>Y#|r=TR<+3sA)YGPk#*V7hg{4uG5NSdcheFdte=Y&A4AFB+dJ24^w5+;)*T4 zZrA0V?&KvrI}P@HO8iC%Sa0kCOjsf;sq8~%Hc<@4aT0v-xg9AMx;`@LaVxWvPH+G#9FAwm|h zju33(_B#)h(5S=kOk7fNSzH}lJ;-!|l;pjWS^~?PS%mF182DnOQG6_a&>hcCo5k@J z@z%W3AV;IxwJ&A+x6G-Ye^DG{@aZ=nQ9i-kT|q&4@Q%hM-+m)4u#JgXD|0UaS}gB=&j*CdEaH!R5M-=Ab55lY07M8WP6=zsc&b@8}sGymize|0V)`cadi z0cF+%ME22Byh~5dT!7E;T>BgfSw0sfO3<}Z+(g7c(mPH^jQRWJ1tBx1JJxzdtw^{E zQ=C^4(`0~TT6R{3D;Eq}pm2ZK;`Sid7MHJ@?l@H(8Dy*5 zm;uc$9}o7l;=}e|JbMxH%no$6AXK{@z}B?)s!j3;vB`(w**}e`C{@QymGhwuDG+O3 zY)*{1W*M%S@K2cHHCR5K#Z#{?$_%e8{K>-oq(l?Q z2nz$Mg(kR!QQosDkxv(RL^98GSor({h5igrKJ{44FPXOQ#tf6 zwhjYbXlD(P7tM3o%s<0An$(pU;4vqO!Er$YI5iXlc*ZAJE@4-|6#VTBo;i8fk0m+`M7cus z#q|x8k=}*j?eF`JwhlC_hIQq`+K}}3m?B6JNu7LFH-&V7`x7K5)2W#!a<$2Y2!A6S zFwaEySWCty-?|^_E8?ziCrNKmen8p-m-uT*tV@pR>BhO8Ygp)OZuP8Oes|QSDL=kK ze?mt0rlUKb)hPnm_rhwJyqr=iok-B%i;6REXNRS}+ki8%VgvyG=fQjdN}gEs#~+#d zlds96_i(Lf(s`A*TLQh0clsG~;%%*sjre0r;DsaYH8B-PmaxxKkc^3AdA8-10U6UD z&><3*czxcT>eOR~n=6@3YgR@(K95_53T^IBCMcKW(xEXRmUp3X4=28V;Gi(=*^fy_ zssI(ZeZw7=`eczL_l2i&>32_oTsnp$jSNPqWSmf(%AE4SbeDt1fh-q62j z^4i{nh9{#z=$xKma=~|0skU#t&cZ|e-M8ZPb8$T7p+dmM0VnS3-3uY-$xH9FbNhC= zRFo;QIz=Q+j_Atc;VXuFwZKoY-@6Y^n_64JI{ge80vyF+ zp>CReBk4cu?pv(oOjqw4c<7OBA%MJCJsV$UjNbKo3>}eNa=||WxT_g|23XN@Bq9_k z5xYJlf0td_k_cb-;&#j|N*-;~8Ef2slG!+?h)~JlO@d+{)gUpsHyDZK&y}vm={IW* z;18K9|2~1TdH$FHh*Lwhx@tFUJ z2V}!~3eS!cJKk4LbM^`GuxWg)8^%A5X@h3jY|YN%XvQNNzu6%4RB1!Xm@|)9A3tTS zk`Yj@s0-t0U*Eb>tQDc#N1@7GKWR)Jug6mfDgQ7yigNAR|FV zfCt0)HxKQ%c(QldE1F2OnCBSqTQZ6Nuw2%4-Ly}aF>W7VM@FE8{D?-K8J|jpmz$Hg z^z!{2Pv<+fOpIc&0iwQqYjjom6|$Uur{;j(i9`?We$-D?YP1g4u;3vTZW4a1s>Yib z1V%5zhX9Lb2=Z}%WPfP9pUI)42GkEU)6d_v92TDuYpR$As5iETWJlx^o@kI!;W-th zX#n)rfcxSyQG0Q{qBL1TB5@F z`fK(8x{krj6D96f{t4E>RCO-%FE5vAUdi5-g5l>hkFnh~!I>1icfAdb<&6U*+MLU^ znoPy5f5t9G@b!$Ix>6u*Zz97N2WwgG&$egAj4`53$%GO?+uuCj9G&7yv*koPlkj^MEhAU*B}*!{=j-KU zaK@Tl9Bb~3xyJt?G8xllX{M)q4X$X_5WEGxzNUc6pP6}ElOnbcjB5$UW4O1J1>K1O zfBxn{dqI!qW6kJQvmMjhrEO`V9#jsZzWc{N!B554*8*}a#9sE@9qTewy$HOkpcTm> zN8JNs+>%Fu$6Ge&401%lMjjK*(>Jr@A)sxXkZamj%O_5d0a|3!pCqQSukJso!Q)77}=aPX_4U6v{emV z?pvBc!Ry;tz4$=jdS95~=~V^mRZT+LssO*=vt)a&fLdL${KhX5&qmwsIUfT79s64L)_Xm8UMG7>7vi!IWtkT6D`ZmW(ByHr*bZeqj5jbco-`u&>3$ZvF5y^ge4 zYP*xof8*$W%XEb0r0VTQ!nE7334tOmbNkm?jP_eYZx6Vt_IrCbN+|q*6?ZCJTRvpr zz}?}LRFjUq_obH-omTeSJ5^-f@$|Z7#&SG(9^X^XtF@O^juuFVTm^03Pf^1c`4r?G zh<*(5=3l&dwBC_7sj7fSIBfDSsFCZ&ek>JGzTS4IuWxI!?oj!hbuowrOJ7GY36(cD z>MIn^HVqBho~F*Qcjkxyq+5i|#CXE`o2YNv)AaG5@~k$Q7Y;MSGU<}fez!x3V39e; zZs>*Q9E8mtqwQa^J`JklSSB(+-k-nI^0@vRXC~%zu~E(?jwl=CK?K_8cVbfhWgGb3 zfh};obe~}0TVs4&eDL_EFN&{w`BLs|M3F(=!*@;VWM`;VXEx#;KpW}rTBi`1JHGcc z9-&U=-F0P5-b7Kbhry%@_^geW@3oC6D{1HT6DXV6s~&%+XfoWg5}!4n@g&t`=1JAD zr}`y%cpdLeLlVhf(3pQ>ClIoHK5{*>1nJ-YYSqWDz>a}n5eVr_WX}>u+W3SpNr@|~ z@;%@Y_V(2tu6vegysid>)?N$Z+beU| zSNqRDO!g0s9VZOZnCfCcbOl5|hXfY3N1vx`ibV0=kpM;;-=+KDSX39-d)@mt$UbNW z!VT}EF5C&kP~h`ssLIQJn>q(9*ctOH^Zbg^tGX-;Dtbpo1+yQk)Fs?}ip7&ZWVl*b z-YVi5dR5=NGI1mdgergj({j;=;bZj~!mwh&fuZ{OBjz{Rujw!PpAt_$LCU9wZ0o=0 zf9jpA%v_M4%EfAy#={r?9DKCc{{Gn{ zvAWb9Z&fafYihr&+SE`lT074YY7y4OizJS9^g^HKBtA0^|9g+j@gD_1z61lOcWV{J zA(D&rN%AgXqZq@KJoIX(Y{(d`8`FH*xuVfK+aaMm>4T{vS3Uy?hS>o7nK)K8CF~z8 zL1Z_;x?b-qj?68aY-aMaSY@eftN^W!I{ik)j0a1EcYtW zTM~aXM);X_9>q4-KIK3OWN+*Gwbh!XSjH)9qQurtQTBaoPLGYo6P-NKN0OR%njxPd zGzLXx>-h~tRV*F(|1!kbbe~4sH1D}At}_|~_$qo5u|Ta*2%F)7xwG$Rw=pu8`=X_SiCoTEtY}?f)1P)0MKl#I9V<62uv1?6EJjNy+hhq4PH3iP(h1?CIp$ULd675I z4)ymKvc)TwY-Vafoc!<^V1712cv`iX)`q_IJG;lau`!G*+dQLy)y8#nZz^WbBE@0^ zsM+AS+5*jaHLH{sT?$2%E1G5uvBouBW_M2uf0GwTGPG5u;6s4_Q%_5*6@wo!dx48~ zS?Yvld`~Wb*ket1-T1yLbn`L){Yu*Pd_Yy_txjOP8aY1OPo?Z%NlgvCAGt>1ydvEC zT<`HE(^kpn(9Luyx>i(Vxs$`hig{jOfMkgC`F6e6@A@vH#0z5g6r^-w6)2xtSlcsi z@Z~N_|mb#Ci+j>X2%aM|B%~ z^fHQ%H@OCQP0%{oBxS%3GnzL-0l$JDVy@H)6T)JfJ)MK$(4MP-rFfY@Q9~$Z02T=Yh;nPopHoAg-v~$41#durSkiJY88bsCxD=~poM}pI+Ysq8RZ}!H6MbER zAmwhtqCGLeK{MFzLm@RMHoISZ|Jb~8%}Q3i_W^11bzaezvBXThP+ zVFW^{EN3q0>{@}SF!D{a)mvZ0#l~ZQb2$b+dCEz_~Sc$IWalDVY}y@SMZ`eoF1 z1(8~+j}2rf$C|LzwFv%ZDd(`PUsD>Fv~}X{4i18eHJM|3r1gA_;mgz)pVx{Djc5ue zW{%{o=mrnRnZB;NoKrJ;lLIOPA*H$86&$4ADy|Cj7R(0gUDx{@TnVWH0A9+wnFwt& zEkrhs@+rNpspD0s7$kEqKMX6*&OC{n^{Eu&cC350pmN`1pUkrAHn?L-{10paMsX%z zKlo(xKrvPw1%A4?=fGl~QLM;6_;lkZ_f1i$(v`7EPl;4YumXEJT?^=kjjoKCXn0+9 z+4`Jvp@W?~4=FkS)AkdE$Ur(=m)4IsBVweWqBa+cm;Aq`dgmW3f}DA<>pb|?uDEcT z3rT|2+3Nz}74JrRHO*2bbchot>d89i8OW*EX()pplO>YO=|B_18ih(d59uY)5jI@^KZTcE_oY09$Qz&z4M*R=h0}&Nc;3b#nQ)@0<}V zOSQ$lcnliCO(F?><#AHxWk%$LSjP+Q3-rNJJKp_ z?=Igk7K2$Cw3t|5Y&BA*r;^d>bw3}4z~7O!u4)Kc_5!Vae58ik8)WCy+efMblU3}U z;t<3aEBL|r&d)!htT0hRe=~C!BMs%VqS~#5HB=IrBZn>{t2<6C(TbK$&ER3Ni+H&V z*-!HuZ{-_*Y0?64B*)@h=bH6XQX=@?^O8X`(0{GUs9M=0@U|?e@d6xeZLdlk9+rdr zp1U&?KU=H^R&ZQDQZ;Ih^3r#W7Bs_v@JCi+9;)oisizn7QGUPDEeR4I5OhIGx}clC zAnn;Xs}0&zmS>uKoq4{D{I#Z9K^)wwb&3tGBwTP<7Q+Ty+M3kYWz;tk=@R}%n>1DH zWQI{NCUgCjHDtsMXDrFXqKlxttl*e{!I8=3z;rS&?_S34wXmGyNgMDSDLd?HkWkg^o%ttdi4YkdZRD z(3A+;NLme`mJTH9tY;kB8l|&e=jtZD3-(0e_$d-W`qMzqAm^K}f!raQp;xf9VW2$%&h@gJzo&dWCGIi&A*_j?b2J>Wrc=QRDQ&UXwHSO;8Ge&{7E2P z^$rgDcNk;L1U*$1lAC{V(Hd5jKEl`5s+Q}|zonvUN?TD9GE@zBy^bPk`ub!eZac20ka<0i#_J{-G7~E|9`2X89dr&(z-}ZrgJ~V3}{pj=-bo zCpSv1iJFUH5o-!Ct=GW(RQ}~tD$Fo#2^S&1^HZkax;P1=ZeiNclQpK&*A3`a^S*fq z20BFxh9TRGVKB2d66QEjgNvGu12QA|?zQdmR2u zmF)wFqI`|2cSEsrFIqTu*Hx!Z*xi%z!h??{=dVuFuTCln)>>k5?2FJK2@vryuXcZb za}ZxtM8M-DZJLo$e2S7N)&OPm_N*)ZX8@Df%!>rVy(PPQ!d3h;{8wk7TU}A{SK`<& z4TBVecC}(0c{}+kEA|?4e66|S^x!XBLpHYP8Z!YMqPb#!a{cBen>6m>hRuh+`XBgw z!7M_vjcus|53hU>dGZ<}9K3_vU+zJVp=WN&`^p?87bbC--!)pLOb63wm?? zd`Y>J#7LIuQ|N^ej@22@b{B#7I?A$9OU&Sdv^B!Ht@0eh)CI1M(Q3XT+U+Ff5r`TD zm!Oa>W1O^u4B+*F9Z2r3Uesn2+0Dk)w(yKm z?aQ$II2WN0dDWNlOh@3wCNZ67d)D`pPk5Q@#q>)sQt~iXrXsdwRw&54^STPg;qv5deuQ#AgBI`;XKy1G6GC#?Mt=bdsD-z4 zz9ry`cErvo#cZ^@q&g!{Y!9WnwLL1SJWMjLX##(JI-tmeoJ#5%bh;4+*cN&9Zu}6v z;L<1#o+%7il&Uz$tg@nP#zdLBe|_>5UyYqdcA7?z7E;MPCsNKFs&gqAS76TW?v0W% zwr3#l;WX}xD9M}% zSz)}ezYBGz1%$RkT-n(mRyK-z0;O!0Y}YrL4+ymRwF8_VRFte#DJ&wdc)H@VztI|Q zTIl|jH0;GY!}b(zH4y)-3cH-?F8=T-c2*%|KQ1ti-afMTgQStA@)*59LWX*3iQbN_j{#6zNV8WNgr!~x9;?@% z*$c7RM35At3NDa?A`iqvDsx@rZt*auW@wlZfph!!!0uBI>L;^S2C<3hZGIdUUUrM>XmZ2ypi|cctQzc zwmy5ab13b3h%M@WNXC)bHTT!XQTrsgywSGPbxZ(RUMtH&_dC33gS#b+mpw>li^xcW zqJdX;h0yydlb0FyA~aT-_y7=_QdTWk*z~sba4vwpXYfFN*@M}^D2%dmT*ML*7`e$QVk%Dzg!O6cfG21v{a9{p%)T0F^pdyV+M6)% zPg#)7Jid)aS>yZyyoN(eqJO73<9D%gP1MmwZgRvfzHIOs)T?3`+8UOKa^-l08$xW0 z6_>BzRUUDJb}o`51W>1G^>$^@%c)-HdkHeg&%YcywR)~Yt>G)*otU$G-G33z%!?KO zoevc%V}S4sBFj7I#iEHxKS2)ZZT2{A+$Pl9;j+18&v4ABe&^V}N{+kit!M0*f+Eun ze8u!dub22EeDBFh0t@FYErSIcQ-zW)MH0GUSp%07F7OVU1gNAA%j;aU417srPnOC- zm9sc-V8_(tqs>4|w^}l(6)w$H^(8^d-a*)9C`w83`)=ZJ*lS zFx(__%9YcBBjxLXYHj}^f~tE+@Rt#Il<`K@q|HQ3*t2JLSyVqs85~DQ|K1LNCnAEU zBLWv9ZH-8WZeR$}7EKzGw7&0faq_S7(#E$Jr*c*%_Ws3MsLbi=51%BzxW*vE=70D~ zHH_E{UH4)3>bpNYGgo`e4WTra;PeLcj~toAcVo+sXqhAA|dDRs;fchihY}C)KN^7O;_FCa^|Xe8chU7Zm&X3E><WqZAzKKn%9E=wil+AvHeDOLSOV|G?cef`&^AUM;eEqr>oQ6`L{*kkl* z>l?Q`0%-);YL;gk?&Sjpx=S(KXadVUM507X=Z3zM5=+y6IZ;)Qfkeim)NW|iT3eRQ zAC%K82AH76<(EDTNi>eRB^pqku*+A`tqWiUS2L^B;x^6TeBVPWG1T#j!nkdFsIhn) zPJB)0*I$T?re{;=<+qHR8ZIDEaM;11R2*{DHRScEoo2goX_BRjqm^ zfLAi1#w|9{=l(HjU2d=LfIufA5omjSdQrF04I7&r9(oc|OOcMnUvvt%eWr7tclO72 z_9xIC5dE6I<3_|48Q;XPSe@%ETTM|hKNHJd)o0{!)!~u^Aihg!zZ`53as#!3yzW+`fV07%^{2aM;Q1k{ z?J&RmL^_&aX&WRFw7^--FkR*QjtI_tb=8@t3)J^R5(0VKMbTy3(T*wkXox*@# z=WNu>N&*~C(SMVQWL3xI zb@JW6|Am{CRpC>G$xl|TkkiQvl{@)zEq9{Kqw-$O@-NPzduW`Hph;+*V4HsEtU#M# z=rwFr&OurA!-0ocyjr!JIJ{bNOh2DC5E@OahxY>Ij`PR6cf`*z- z?}*~A7tbMSk4m>CRp(^;6$?u}A~TdV+X>n;tC4sFGpp0NBfS|%`Xd3>~%VS7o8% zQ-)7=VB8}{tp9on?6Z;b7Tx9|ttwKp?dgc1w zFpnd)`xC*KLONPC>)!L8lY^G5It?!l6=uP797A$$Ch#^mx1jI4*py1i^#NsE#42hd zxZGjM1?se-xP$XKF(e;V)!)SM$KVyoJAQj&+*{N}z!(-sU~m2GQ1PB?CU!-#&r9qy zBg?nqjthS+hv?OL5~F#8O}3wU4=~$ycN8;%biWFGr7-VH$65SIgsIBu+;7NN&mM{2 zo;l!b+3o20f{n2l8L@Xa#Y8Pw+z0UG4>)_yVwgpq4E5#m)a&A1MzhtQ;>NDu#nT8H z_F1WTmWK1?C(cw+ILR6OAmgO0szSw&U04W?khZjxCS)u6ag@#y%Uhot3ATIs$T{CS zPcBsRIJakldtFZ@N)s-A!;769h~cHosbax1QN39ph+V+xk)eHjr35^c6plahe7B~W zGeNIT`)W-!a?(Te8+|GjXB5^=%jyXVxV zi(P^K8GX;j;6BCnRDpgIJ>SltMqeZuJ%>m6r3w5<4A`l1d03MFd${mDe|9PfhkrPb zjD}36+5)F)}Kt)hMW-%dM^g6@ouOhGEL8NfcPq3Jq7&B!eVK4;c zZ7iK^K8IIBlO%txXWsM=60!JuB){*N0d!clI<37nt=(MEa6H&>bLBc*aJTZpxm_@B z3CRn_Qgb$iha@Xula~0TS=&CqB57G*#FfFJxf-{ibH%tjd|KaFgYyU1s3p=kH@@*7 zted%!{MGPS1LMZzs%c}+N8?m{w&on%M{8s4S=@qwkuRJ-u*Z%Mxwqw#H1~{;2a`I} z&S6<`Y*^Qs-kPE|B{O^(+ZPeP56i|9)LwwsHUy|eJ~ zm`110@HByj{oZiJ_{Qs=a4$hHKjw*Z8u%91z(1y$(702d7ItHez z8S?Wym)ziXCrPZR#?#IV?s+wBqWva?;q6qnRBe;dr2fY1si(93`%xaYeWjJvkutqK zx&4*9QQZCprSNS)JBP<4p`9Zclj@)=T@f?3sq$XkE}ik%OpT=hKE)Z+p}EpTqj!bT z@I?JIbT@R;63)#Jo^~Km3zY(EM?Tm zTbT_osho}YLPJAJ=lpAc(%6{t|D+c%M zQH%c*>ZPu^MN3)EDuLPj2Iv|-s2-L7z28DKJlMI10UYts;k!eF!3$P=d+2IY<&)aT zde?4a;r(5uYKzGB z`?N>aV@(f(qh$P_fYVO2h6y$8EvzO5*%c8D;}GowEqXh6uOy9C*Jr7lz^}TG#VvIn0EiJ?1u58J0 zj8|)IF5}{$?C@SpD{*rzJL6)R?C^Tbb7O4}!(z1T@Is8hpITLhMJL(e$%N<|B%B1_ z8zd^;_?=32Bw72fctI3A^bw-+NOfurdjzEnJRDSdR+>dTN9MAUqlfC+MCM~POK3_C zzO!?e946{kI=TrjH%Q_MM7Ky3Y{^gN+YO}cal59yRP#f|tD)n?aqYSbGBkMyK;2~9yZ^yiBs7BIE_<4&YoRD;jgan*>tm0)zdRus~v~0P6I0Vz!=Wh&L zdu_HXzQHe+pLleHJ|=LKhv&}UMC$jhj^NEppZ>#FBZ8wmS*Nnz>pqk(jRX8Lq3WNs zZgn!5u)032BNxo*TDnDr=m+U#YG(26TU&ba*wJP=%=A6`x<<}nEi#kPHX{`P=&1%Eg^!IW1aOe_TwZjZ4Rk(|=V@|bF# zP;f`)jYrBv&a3!LEUg#h&EN(35OF1cAohUeNW1Dgr*YNI>B#7X-}LKL_%=_})XPTb zSOhuO3fim6OXdOT%IvUtLVM~qvmp;8ni1{&ZuOTp@X<@*f#nL*O!gL=@3@^wPh!F) z&jXw+;g#1R&V$bt$(86K*@5I#MHaDayN@?%ny^ruLRN;f$;5b`!vXfxhb!4b!7Cp} z*k>8{ccU+l7w_(u52eWfJ_Wq{<&eDS_B2tm9h-eAu;s=O@pRG>E%D-v29~Jez=Rce zV+mje2POqfV29sR1M6eLc=s0RF%mDy1>gvK@$47#EAe2XxfbIMu^QtIw;Jya?WO&|<0$#?!I3(`ldE|OX5w+GA~PZU0f{*w`T>a&NP1;T zetJr07h0FTy!>J2{gTBl^eTmy0b0=0vn12A*1)^B_m~<;fX|I)a*+oc^LbzbPTijC zjmUxtgW1k--J78eHVDB+0NDRX2HaT>EV#UNe2a4XM&1-;Fu7F%lc?Nifa&%tm?^$V zs$eqyM!taw(;N8$CNSV&9uyItJlFG_7rQfh%L552fEAgZ!gJlf6FnFrJR7;d&a%0a z>x^*{K(id)^U1^1@j5t)9i-U~)#l}P7}WT%p)B5b|4ul2deESz8NmM^%#0%J z1C{bC`9Xr%b4;cX8gMP?>n$~d47;cOMJk6F?OGJ#rRc6;BO?@m`~QOg|H_9Y-I;7; zgaFVl|1vq$_}-BKs|W3wbY}GbNPvIE30@D$v+-=VBjH~rTPb91jsF4s0LB-dyZx<< ze?$Hg=|4LCM}@@uL)!}$cJ3r{fGgJBgZ8%=2>@eDd*jH)P8{#~OR$SiMZ35P-m^-u zp3jM0)`^*qH+4@<$IYLKn_A&FPkoPXrXE_EfF9gAP31Fv?K53RGfD--^0>%yJH!+G zIo&_SiMRL*-dIa7mzdY+@zsk-wh5f~z3wD(8_jgD=Chr6x&vAc_3wu5ctascBU2rLR!4!gouL(2TAlKLL9yrdP zBkl!&H+5h5`tSD93K)O9AbYl+@fvI#1>6fMwL+^$jp9D%??I3=?ei(M;5>!-kK(q5 z+ANgx$csv1M|{)*15s@xBOVf%A$mH$iK3>2I_!~|PL7kVh-EopefV!S+8ca%1J*aN ze*-u$0PGJFyiKOR-(aD}!9l%ZYh3Gw%Y)baW4XvtA<06(oU&*oOj%Cgr=MVEi>M`u z*y&_S$N|Nb=`@3~;{PVXgGHZ{2u`0!JYUXQFf31i`}0mTwSRhRpZG@%WH0pxq}oU# z-{y(^JkV!7@a2(S$`8Q%D+;qKJzLEO)Y?c^-~I`{DaFi`sd}zuv8LCL&v=I~WLFls zk5Lm9(WgQp?Gpco;);chdqJj4o}ws7+U7IN)H3_TeC{M@(&-TT3h}UJf-7(Q^LmUR z@@h=qS;*29c9xB-p6{uYULX?qTZBsbr%{3U;! z{lU?7BTP!K)(_@@rBjBH&UQcJR>%wd9e%1Y2VX|Ep#H9mY<>=0rd9RUV6kr2cMjG32wa+S+9b7+QreFbyl7Ud0duIPM}oDH z{MyJ_PCbk62xVlWb1J5U-|N#wj|QrZ+#agS+#8fZ^?z3-T9=Dm@UN{))~sfl|BVRz zr|N$u@)hgBTptyB6V6oRJUA(}NB*7v{LK4rM6$IpI@4#v96#^V11h{UGSg@BoJ(je zq0WQciHAXPs-QVVdR{Nn=iKZcm;1v?PaJb}*U0feLmcT>kCW+bESf0QZ||3_QMkB5&jim_%eF}C?n z%qI|f!sgg_2r+yC<4wOF`U^{QUN~q$vhB6*gS-GupH9!85*!!Q?Q(;a4|`w`4{r{& z178GEjM!xA=k<-`fBD-2_^xEa90vJV(uUV~ zavgg4BpsbwE`el)X+E2SZ`TSUCi8qWX#yZaM+nf4W4T*Fro$?q7cWCEZtF-_jbH6F=*url3vlm_p3>b6gs_PEw4 zw(sM@IPG?jM(0T6W)d{^1H`_0EN*}1eU>(TsSp+kTq3DdVted!rip?a4+z|-axa(o zba-uAY80u?#|U|gTu!G3TO6VkPSYM8;XwSE)3;-yym>A}len(?EU6v)0{Ux^8Mi;( zkUiHR_XN(|kP~nJDvk6tft`zV|X0Ysp;?-~_Z!M4WR;_&n> zqGIyg0n>(bjmNvZkL%#BF|+|4M368CgRBB{-#6kpSRY(3@&!4FwzGKc+gcyQE&an_ z`-j1?{11cUAI9uI4X!tXTWJ5s7~=lE=Sbt`Q)(0omouoSxcOFb57WtSCzMX?hmT!$GbNXtGj#r}U(gf4W zU1Y$u*m>IeDEvI_Wg7)f3Ro!sX9e>%Lw>zwl?~472Y7~D`oATW2Tp4IEh&e$qy3?Z0;ZE+CWPj=CrZahun0w+b4lB*No6=P{F~m2YB}Itu1Cd%=0Z1KV4|7KLX-O z!^Or8s1p0n7-Iv@B4_cnPTkNsbhtZ+DjDovb!`GXp7hdrU*hUj zAI4qQfrt457m)Y;*=7H$=fl}{Khw)g!nn}u_NCBcJMhTzdUal~+?yfz?G|VNtvx@S zw`Ty)yJ1Z2_kSNjFK6A4x9!iMCeN4E9#+)kkdM*{A?hgTRq|K(KAqNSUhUqmmnnE- z6K5i*zlCFURa*1qw-YSO@G$~-O+Qf@kZ`s(EFxfYibCw-qoQKPDOtN?FNHGPGj=YW z!eC}S1R98`npjn(WK^ZV*a3wnJwrVV7@s-iSN3eD45p0IV$kgo4d2V$1{^qs?uiW5 z%72Na+};yI85a|YL5op`Fv@~37cr*O<8*MYhqUjw_Dnfy+>|@r)6>06cVVuz$@*{nf+OutT6wKe`V#0F=&c^>mwNvM?jr`J5Lk0rxnR*| zG8&@So1WH<=$dK{*e{2cVwct==g+bWrf{-f>KkJ%)OPeiEE|__j)i+C!KZz=5sp<~ z0^u9>dDJ3j(~+e4I|BTmZIOjaJDra;++Ee@eoU?_(uF^hQSwPWTsDS(F+u7$LE0H}ze^{T11JASJS}onqRmA~bdAI7UIm{S2s3e&kDGYDQ_*u~tIs z5=qL0D^BIXmu%qqJ7)DTw>LIxLhYJ`P%MIYh43xV;QeCRp01H!mcN_2^NiJi^CN0> zy|159a$)du{YPw4MyTfeZ_an=X}IHB3P_pM7=Bswzdz?b6@DBN*^{S?aYM=BuVQBF za!(k(8BrF&YO@EHE3>IFvXzoQ)VeQ2NxCUv(FQ_T$$Ue!nUAoDJRQYEv2sQr_)MFE z>0KV(5zh}Hq+R{HmOvOh+|$Y8Im(bk9G^L5_k+2Ix+bNykwZA0NvO(?oTLAw2isCb zw+`eJ8kKWRt!hJIX2HcUl-TJs(C&S7(sR`NTWhw=xp@XS3pb&Tlx6KAwADnj@K!J4 zq3`!!ed65v8jns`FNukQRZ74wGS|?^zdI*~HI+2lQCjM~KlMSzQBnHiwz@gN z`yxDzpe!1IJ%DoH!U-y0YDIZOZt%FmYE`nH-R&lT_?Sh=GU`4g2mO_jiCoeC>B44< z-!U6@3zf0tOE)F~^~CU4l&xI~!K|>3>CgNL)>@bWR#)>LuA>uU3!>}2ZXWAESZ#G# z3@=Hy35K3Oa<{yuCAG5@VigQISp6#6zSXjU-0V?6wa;Qnf=Q-8j27buLu3)LZeN(okmP7W%|uB_vHaeO&r<)g%Wk8h9O+H-#jWF!UMju zf)V?lOZ?2##S$|j=Es%eL49q!Lw?yPkSC=4UB+fm@!ENHNQdd?HznPunuR~(fAOpw zOPP-XjQev~`1uSINSP7WR@TlQ9fX~Ktepmu7)jx_Mt4rFlR7R{;#wQ4vH3uSRs$c< zb*<9t4^Suljl4i~WR^`<6^pHqJ-YB7CQ$4B$~e_qUc_R{_4b?gDaj*DYEelR^6jyI z_BrliJ~In4!$!hb>nj;8s{X9c+`Gov@@~rq_T%|uc%9enttBrPbZ&5XWG?><>wb{j zW%xP+zU;O zfO1*aJyTaSy2y`rx{YmH9t%z|{}MVZaCSlzb^aN`06V+|EfNno)wdegh;6KZ$_6UI zH&yodCMVq(R|f8zxsD8>nh7!P2Wdm+C9QAfl5S;GkJO381N^&-eBvoN2d#GGC{3@wGA2KrY?%!T-bV$+TwT_i#?(h98+9v|`FR=@>HV29QUg z6}TKk%PT2j_A?<#_QE)4+Pme7Kdw;iTu8wWSn}>rUJuKfk+z0YwJQ>-u|K#OaBQ(? zJNVuZW4gdW?(wj~Vtrn_kaYS?C#Ofte}*N8T>Ggk`*tr{PSxggimYrO$^D-2es6zR zJ}6t4hjqF%3^Z{0^L}|=uN8Pb1S)KR*Sms>_WP&Z2G9%g+n$SMSLYtkGtI-Cvp=$P z54R@{)8;wn+U@n$L6Y^jYf`U(wMQRSNZu4om!DncvUwdhL!9dOY6Fc>8s{ZxPbK+D20K0#k zpXWt`;B|BGynXX7N&$#`CF}=0?VpIbUt(joL7R7qijnP6+d_OiFYhB?pLXtoxL?9z zw_khC_0kD|!0mQko)^@}*N2_EcH1W|s{V}aI~&EwSNwj!#r{c%`{glqn|S+8X@Zpd~#idXorAbze%_+(p7@qMeX3LK(td|$aBw%tJXI4>?qripo<$i>#An3UB1|ROMB0XBkv@FuAV^Jykxa4XYBH<75 z;#(@?=5%t#0m`_kIjl&2@T%(fofNbs*BfwgYAzefngTG*s_LDe{f5jr|410A;jLs= zHzC{qTRa_3f;5LUv#G{{#SL4!AJj6>hbSJglx%T*;nN6A%rKr6~s z=|PXnRf$4dsiajvd38|Y_~!?EO>kU?{>`JwCM3`Q2sr#oB5nH&5<^r}zLuZ;I8DmQ zFKU#9m!4ORgE+3DY5Tvs!Qx-st^ox4(4gVtRgr`sMlAf__F}{=p!7WGC3TW*rQl_w zUUF8qL?kvu?^=oJlR)PW1E1qF6v}5%B&kGy zJs=|hChC7t_m2;qG;me$I@37*)>be#?vKUegguV(r){&HE}f?~$RXvWp+;-j;F1HG}SL@S*rF~UQ}`1C*J1U^{ZZ`8^lJH4fY$db4vVJ`_Wef9v=Lvs$fhi^RCB%o>MaP zo9mtjckot*ZLUo(LxbCB*n9b7K~|FX5Y!Y~dU;EFdG2^h^>Nt#sh++m{~u=mjkdP{ zitCBDgb5lv!QI_GxCa6RNpSbz?s{<&91`5!g1fuJ;O;>Nch{Z#-#)3Wx3zEgdtVjx zyJt?H?rEyJ``(#3-9IB^i*CWs|3dR5(0m@~onqhANLkQGiCO6F2d090X{4;hr7(@T z$a8i!18%5BVaIs5aa-`tpBI3(OOa=v-8wHv}bcB+aQHehy6A>9Z_BHkk z3#pD1*mjr=EgOR9ONHtz6*Z5GRlSBS70Z^C)x0ccGpd)AOK+T|MY_d>SK|eFnrJNw zg{dRnEBF}_Y{KFJ1+iu3$~pL(uw0EyaS(vNL7#hFe?3EWI~q&v>?sYHo2FaF;J@t0 zzDziZ_>ftM77$qDfaxbAf2$TKUa3cpUlo^6X&F3x2Eqtpb_PAomL}KxUWe}@t%*}P z>~kfQg`QOp^XG&3s`WhO6YS8BNnW%X!UqaK`zTBU6@W`eCF#9Z9&5ulhan%6 zw(AsS$1u`tf$*`-`F3B}7fZP*(GJ6MGoI(Qvy}CX@r4e%Bfz^y8%)?D(YC1qF>>sq zdU@H7J%#KfX|s-NY$tP%N9-qS-hvt-zK{5Czh6hSEc%_27X>q`o;Xv{I5QSUJ^fr3K()N9VQwr_K2oO(T@TBiL%KHr>761?j$ILqNVQyDn*jz>?BIQ5t_62G-B zC3E*jSoMt3fFkHKHB(0yaXDLzNBL~b+&)*yeS&db(mM1QyKHb^)j1J3XZm;X8%jq){42r8qQ? zJFpPFcbW<2G>nq16an*u>>dq5+#@93b+o(bw|7+{;Cfk5Jds@IQ(IJ8&EakWs0na1 zaRbMRWY_v@UeNwZ@cRq35}y$Bsk2O=W#vSNGS!#H8I%2{FqAmnK*;T;UuySph;+U!}(RENUTCwINhrn|cu7L1z=F#fF~0Dv6smoPVs0 zyk;Qh6{2wluf3F~&&HQ8e+l3&ht+3i8XDPYhe?v5=Ew7$743|FcNtzoaUSSP$dV z(sWTz+hI)gW>h$hA8W=2Uk?{7hhch}URw7(l`#Q~yLP7c+OZI;Nn-Xb8tGqq2`%uX z)^GRGmvO6MZoFm{7;8BD3l$q0xUJfQ_3_8*Kz(bgzwcLSIqI#_laI-*geA)&uC%}w z%cCjiUl_OA=QNj{j#8GNhno$`tSSowxEmhhuY0xBO#~((35u5ZO~zhywAbcWoag3P zty~Y6raE>DYU)okYux5}kmpta2rp;lda*>)^N-wWtX*$8O~VOdB*`pW+_6d}u(IX1 zI&9|l^0nbK8Iw1&5o-JfJ?C2Z6!5q83*=oxo75HDG+V2~an_`$IvYoQ`?<0*?G6LA zx%wfWuAzqdwP(lhk^aO@w5#$fmaB{_5@(6#H$JKl3|HLyR=~u3{{5xxr**$}dLK+r zeNWP6`qiLzYDn@J(Fdrd#G7pGDds(ieTlv0sfO&+PwW2ej6S#z8COD(uaj@Hqw}J( zNI!}A`O-bVdx*WF+#8sR&d&TK;_u7wjP;Ow#kps^Z@gFUO!&}r<+LZt?|1UaElXnm z9e-R@R?C#`9xgD&nx!w>5#&q#jKrT1m5sR%%MY=ScufiIi8uS5$SnumO-*;4ZaxS; zKa!M>{{ve;6U>8mrW%D6Mb>++gFW%Y1jU6S$xyRNq$j+yGo&Z9vq?TpXl>p+evPJr zBE2AK*vND=^=PrX+#SJfEpHG$xae+^7td_p{&NA`OzbWtvMXMV++kfMIHP)MKcHOk zS-iaB=8a3}$MxU$s^_svcul#Ok0s+d(a!1o_%f*BL?uOSJQj)PL^YT8o&AH+STLRw z#T?Ohc3h(!VfZi&zUbITji#tC>l%Dfv4k+EAEe37xs8ch-YjB04c+Z<{qM%!#^ zAfqe5^tVpmUXKP}*rZ#PBPOME)dR1TtHy1>LPS?^=ZM^e(X@QC?YkW6T zI)Il0nqJc#7{B)B57Cq3wM5i26QuZO;REHs+7jkE$=ywF146sd`LVy9qPN$^@_(QX z{M8k`JvXK?qeTZ zRj}H>1mEHEzKTB~rvcf>?InuevnXYXKPzVm2Vdxt ztp`68i;7@-vI0s58Mp@((9fzx9Y|N|*)I$e`oRySqCUvi>i!Qn|49jeUEa~zVE+u) z{GWFM38i>u(==!;ubknr%LI^W~dWAlnIOGCxT@s{Hw|FbYl;px(%@6)%`Xtz{O zaxO)n#)nXAU1FgfhFBI@501(^6?235-#TK11AOV9p&sI|B=$5O-aAt~oDz;Z_^eo;cu;-pOi!t6+Z(HIk+jxz7Q?d%rx34H z_pu&QoZ)?R2?Pl~F?V?AbnF(vb33R_iXm9Cd~3HBr<=tzwyy~ zpt*wE_t^`dlHZe?YRF=hBNf$;y~*az48W;1E9)+!f zf7r~=WA=+M%xG!U1-^lv%dc^$%aYu`QsDor?LezgU#IMK-)B?6{2U%NHNCkg9J{+H z^mBKSj+l4_mH*%+s;zcqk9mhia_LIX5tBmK6SE01mZr^XCFql4(aGD`1f|t?6vWwk zp`Rq^mdKk$uynomDiJ?ol5zmn;*&k0NU2J-XXM>9Sj67u5FUmU!&+RGloZKYTwcQa zZ6%_rPwUlsP>QSjPzNIS>e*KS(=ug~`h{lZs$1?+zQ_*t5A`#RV1m?#pz(Y$ks0S6 zxm$TUJ@=t@MDDh;uRfTTTAS1lG&9cKa+mT&7D0*IsY=tdy{mLHwLq8Lg*?^E`#b4B zr2fEv7swO*IH)|6AeBOS9@be}YT6b8$=3&o`?IsvdOaQMv#uIFR|l4w71_Xgv(}td zlAbQ}A@`NO`iLj$WtNv7!SllGNIJo;#BC1OLrrO-5Vwy0Z8g_JU1_2Sw~k!{OXSP( zfvFPevYPs`4eImCtgH5+=%HbDzvsSTHjWqsh4`KxK%&R&Y>znV^ZMVotgTK;F&7hB zuE#Q4+2(RhZiITj2OO9x|7%HNxt{R9mFypws{Acje#E($nZ0QbKF%)VRu#|WeQ z$UIP7VMC0x8P3F>>YfPA&q1`tB# zp{}{lwb!dK#Py0W5uHyeCIVR#e3)$R-IrC`Qj6S_uWfVIy{^r0f>w!4S_kRP&^Oq-Lo!>r-HzPmGK2X;R9|?ZX=G@0>rcIZ)&1deg^Etol z8pjnOee(Xl0l>ejclxCDy#GC%-*heG+L5;U{O3S1A9GKKKM;qNv{mcREObSJdtGNK zwI1`CWt0AQsERq$eYuGe0QuUk_=S0na(---N(2Bp`8M;icfrsIENA?$yH zs{aNL*2SN-hvkqxEa+L8xAXH`Yhw}f8g-DLH8PREBDZr_KCW_sP_e6%Mu%0W)3x2 z?GDkiAxzW*@!^imGkdMx+T7&$07MBO{gqtZRzaBP?Cbnr{149>q-!%a`ku>k?HcG= zb*ys&6HB;Ac z(!ZMM_)F}1Xg}tJ-cLdlhV2cIY6}BPkj6$I>u)}eL*8M}@CEV?o-KbH8_li10X|l| z`P;;EHYB#dmnANf?5b)%=DNXX>GNN*bu2xw%`At`C4vM;YwCrGu5HB*<;+NSwY49M zz!LvJU2W0~&(MkCj?kxucmVz0j`5Y`VqNV;XuG5A$!ieMzQ2umt-m;hba-c7;$`_n z&TtS|_Mu0)w`*Yy1|alpKHGN3aXVJXQ^RUv_rHs4o?btb?mjbh!07&LM{c9`L4Sz2 z@`2osDEDfn(6h#6M1q7_pWi+NTp2^|M~YdjkQ;S7(=*CL*cH38ZZqn!%%!JW9?YKZ zKH61=^V`*!sH_TEx9kd;4!?GmXN-rCE5JQ*hbM zr@q(ftdI_31iL#MfsZC+(rV;rT|gx1qkO3RO-|)g`+Q)6^lrZS{i}2*7|;nl7+A@3 zTHG6$4!n}>G|A_-uj2?3;!jM6 z*c!0GM3cn=;5WqMeCV5dTZNgYM{v$J>C@TM&I+Hv2~HIJ2%!C`^YqIAg%Lj1eIkB{ zi(nb_V}Hd#K^$D}lqBmzcMSp{t_3#*1@IuB5I=gF@`T4;nlN$VE&S!0y@ws!DeC{< z5MVov9kCeXmu4v>KO|~O3;FG|?MP4!`u|8yMmcGiwJ`wTO3-A+UnmTKi$Ln>JrLjE z!6^}FcCXoqSN%HW8Guj(O-=6|%cX2>gVIW4QwhnzmfO2hga2)`zhb}|pRMf%F7H2= z>1?;CRKh#zsDCa%?_T=WF1&B-*58ZpM^A8LlfVA1JLK}-5hVS$PnVEB-PP`cTW)_1 zueLPor@2D>NZjDR4wp19XAmz~INb&^6!;F)5S&4LVDj`!kcT8Vz=>qKX)le|nS~Eb zpFRTekOGG}MeWa|PZwC-@V4VXx^ZZqvWNEPh7uj2$l=ATc$jDvW6 zT63JH`PkEaz*NpDAesFYM+GTxCm$d2I%KFYgRz{^(gRz-*OJApQTjCQx9b8RK6%Kn zvUEP-`)dXQr)4{Br`bRTl~V#p0-Tn6Imidz7jy-|@hhe|#e$Tl;3CkV}_g0)h7W}vA%DIrPF#qjJ2&5|z zm(q4xjWdY=m?)hV0P!h;i=9{|Ja*H>9FT~uG51GmyJ84#sNv>1)lNSsR>B@(F6VPJePk}<2LU5Y4GZL6+VqXB^ zd77Vp2hyu)kl`!QY#L-HCpevWUxn+xZoIxZ7F-5ww?4U^K4Z_eX(dqBXS%G$jjqVDK6fDH7pQJ{~%I$Ln<<*{!mMx;M`G z2s;D(R)IAw=X5A1@U+>$hYN4O-Wi)V7FWkk$b;hodO*7Tw3i)YOtIZ7U}GypEG;Wn z{pMv&b6uF%_mbc^t7~YU_GWY0>CyZ&QM-1T>OzsK-{<9`Uwh ztkZn$4d@0Py^Pw#$H{kMty1fusvT3O5Cm|CIH>teQ#pFetxqFk5WU&=iHeLc$hv;k zrR_(^78#}c=*DIl8#KGDqDUT%<~?ZO`uG(m^D(u)kk)m|<3h1CAng80RlRBI4{44nxKAoYbeK@vN! zeLY7hxnyX7FnhN%+@@d5P!ieaAqbvwAe!B?8Ab}ql>>3hh&Ia=@q0X3Tyz*;|BJa3 z=68}muq_N@aCzGJSzbYi2mCP=4#3p7XiBH4dR)xayNkyucMAGL?9XA>+{nj%f>?(1 z&iy7!I{wdP6>sJz5MgRCc!@bNjEGlFk*LJ6pWZ7>(GAjNL95d#K>N z3nGkNwDqDbpZly~)eO|$s8h?P=l!;8Gr;qWSYBPb%uxMx;FCEVIkeVvFdX?1 z+vXT6Opa9+WE!q5m7p+l%MCpLL7=@zV$^g9X+> zDe^svj(R1z+AsKWVGGB+1<)*Uol9^ugsu9agIIPv#qsE|rpX#f4<1oi_#_)5MmN(W552p*>~)MBxdhNW{ygnloYO zwFQ!i)uQ(EHX(-cv%2t6_W8MpbU?wPEaM`80oc7BD#iH@0Nxp$8i$(axM9GySTTAWjtA~O#@>|113>c z*ibQsa?~fZkbV5;fQ#&0wt&8|K=yQI`w;WgfULxDfxHHB5(JmYGZqbzo%b#nT=^`WDOc3T&YWne(`#7!|OPj^A>`AegWGg)Cw^^Sjr=ljG2i$KB zGq%1@JgJfQL7AKZJK@hvBg}~OMufkq!l!(7kSi1NGjTSwknL?2g`S{ws9VzHY&{sF zf8UGo>1+|{L7smlTf2;_@05R?8;5g9e*JLmV87jaT9bED(^al=7n90^K2!VF*vhCc&T zLuw|rh|z`CcCrUrlEtIlmL|4zP4_14qopb9QA7P9S*=N86{;*$-~TKr*;&ax4mhG= zd;R%kTI+7{cpPZ@81a*m>I+^i2EwmND3IC6R3HKY2J0vGgE5@ZL6i4G>YiI#*(fk~ z@6J&Ixr_m=D54=YZKA;O%naVUA@tXUCpP)7VKCj7J(nMRB&oz_iaE%2c$oHth5P0! za|n0hv@2({8RIExKl@jt_gZLO?F!@JA7;^%oN~ua*xj3OHTMd($&WRqMa;{zk=5HN zC_EHORSo6H(P9!=1gqf?9a~-ff{vqLTWVEYOxguf=q&xk^ti-^v5RrN6z`jmZ;CQOzDTVnPr8DM1K7O8rm#I;JH;dTGpA4#;8-+$_5*hiDAv4YUsw+c2l zlGN?6kq9k!%w;}?Y%{fOcE$%dNBZ~=Ty5giUu8;$6%jtNi88!A%DKG);` zob4(f^~y=?CG)s?itX|r>29F!nq9_YJeaGcg-z$bj!uMleY*LxP^bx-7;8+*#$eSktFgO@B#*$jdMyr9E{;|I>6-Uupx=V6jIW$^g zJo1w-(U@FWsR&2ADrqf}oZZ0)QCfl2rreZjm17qM+3-xRM1HiBVfAYz+t z*A2O^vU>v+$=<5PFEsTfWy5jJ;!N03u#-ky*9y zJD;HCyHQGub@sigPU#Nx?XFP>1_Ghy@d6HS^)sYgLwn!T)6ljf+MNv}E*1@y%W(-V*{&>$stNklVy>A=5YXK5Qk{L9sp+HQLD^@n-yO93rJNJVU_XkT@1t9%ZO0lBl zW@oAY;9)88+mf@KEDRI5Kx;|89qLT?FOxb(*frb!GYYGuGRgF9)~z3>)XqQqc|5N= zP?uU2Z2i_wM&YKgl$t(;do?)btNG@tlv9`Ze=A!YzE8(AlW83|R6Z#u;Pu_q&D?Y{YkZ5WRx5zbR zzI3XKt}7o!^r!dPbyF%gT7uw?m#6y!C&zZ>m_`saRGKMN?GrJvW5r@Kw#(w0SgqMk zlrW4eGAq(n*W8IVqlNYUwRl5@cZO7h99=3N(+>__zGJ{NGrg5h5NOc9T_+-0eDtCP zuczHi7IwEa47k4TZ9l0$h*Fi_8hVj7VbRqr_!G4tg=U|tr3C1~OUzuUmH7R1bf9Mo zli={5R9^W7Im@*1YY}PjCP7V}V^7A%9TkTU>^f zs855j_}*cA&bsxGZBet^2l)QQcNpjGA zeN;$bxAfP#TLYl^g{atK_hT^WqyM+QSEqpox{Pao;!?h{(mTBUSp<_k9d!LK1d&aW zHgOSIC9)Hi7aI357Jp!CLWQ2_ta(0t3p)Buyxt%iN1lAr0vUFf>eQ8Jn)m{3eQV#8wv}7Aq^_EfLf!gF zGETRwLbnEsFxzY%zQSj6^h=RMOPM6mNyou4E^X9%Co#Cij+YOXW^g@zActQNh$X4z z3M2*Ld{>$W)QxajUx=@aOK_=NjW~StI%J!5l*o3V)$mbHl}+zCO~i`xJ>KAH+3r(w zX5zBcY!uIiWQQw2S8kf3*3fQ?T>Isyf!nQ@^BbYt|0AvNK8c3y8FvCvb6R*4kukhgXp|q=cLEgb3-`#t@ zH!hd<3L;oYA>87dVX==}9_j}aJ@gK1ElA000|n?EbM{XF6U#_69A5C+SX_TAMjsX_ zCkg7QJNXjzky6Q&f%tlO^(!17-p@GGcRpqB)m(>qs8{7Qj0CiYsSvbH6z>wivb)~& z^*l!D4aHq77%RAKa!ajUDPB1qsiML5|O+r6=3{e-y ziePr0pet%dZVb~$^>8^lw8p`&y)!6NdOw|E4|q6ovg?pc zN!^Vrvv&W!wf1u46iK0z=$SVb+)#fEMl87SeXa?32rc?0bk$$l#;XvZM z3N*_G;z`v0H$b||a?~{2JD+j&QQ29ZSUPBn_g`fjjKckVvRW)hl$Ae5aau4pDV)I- zExZW0rWBmWi{DX$h%(QUQ$lo(d0mp zHw&smUnyskBtlPwuH3#4@#bc6P2MQuiE%T+F@0&sxahA#qWtdvNrs2p1-w)ivifDL z%Qw6dTHKH~G_`BPPnu+&`Nz^HhaVj_Zp?3CJ|)T0Z>E_L^>{Q;U<9AE2XH+<`3R;6 z2}e#lzwZLxxqc$jM>lKd)lvI}fv78nhx7zD1dANy!Y`FZht074kx02AI%loz`X2SV zWHg;JC#$CXRl(Q^-#lwgNO_uHHR1dMI^*8B;GlpPrag-pdoo{8;sEVkP$rbx+yW2A zaG_Cv2+GeS5loBJ>5O_=#hs=dtpLQpXG#+YD=bzHqxU$h85X_1GSp%W^Wq(xIwa=@nepGD@s4SF1$_rDN-b6TPBP?Ug2cZY@~0JYkJBmf<+ zXjJA{2%#G7WI`UIF?Cxogb(4U^(mE8GUa=}^+_sjI)(hzrvi)iC2sk|_1R>k`Iac% z3vkXCVY##sCP1t<=BNGD^2`bI)!>YNL)qx9p2bns4x-?-Drboaq0 z*t@OY$1^s82T$rp#|`@=`swq6vl8C@o>xJ#Q4y2>^ozn2hR*T5G{FsiD)apG?7fJ% zt0r+PnRZSOyJGV_7H2ROQ_&N2P=~OeK_d8HoUM`-bTqbQ zT-@x!`+xSyA$jkH;oyInXEF^#9M<}(0wpXa$l**L$so|IqHs2M*tkN2lcy8IbVx(r ztAyVyi12)syTmr@I%5dyWPjlKnFa`B3fyt@$XQ*oX&d(1<*Gm0m!U3EY?!EFd53De zoM+g?f81P+>}Yhuvg;}Th2kP6TUVjRXF9ZTm5)ukd4ogasvE77!+Kugo()DSBtS?! z0&O@+`A#n1IdIZBxJ19@Kzo7hK%#B*?7N%A$DYJ}BwQBKYwQGsLpKXtKUDxF;O)0r ztc`_>w<%f$^1kXx<2(IX4A|8*xgZ4F!S*|B{QHiBhWa6)w)=^LH8Xv*I;x|k`qO1l zP~Ms+#eK6mFAe?+PVbqJRc&_W?-`*`sb||zbtHM7Iixr9ovuyvW;L1@5{ z+!`#GJke3oOw%_&G&7-!Q6zwb{4>NKYeB*n=?WMUBsxAX-k9KAsnW0_sdM&hom!<}9>`8^XXxNaezK}0!;I-9_j=kzvxUf0Wy z-3)<6^K6x$+Tjyq&Tb7$IJ@PRn;txsv^rcQBj+FdrFj)!R8oyXmB8|FbM&KV`>$sD zON9wrXJM}AqxZVEk%%hl?P*EJhpB^{x2CVC6*yHat3Sv<#dtY=C_F|93(A$I#fTaK zm$_{Uv!xA`pVbYdR~ayKq8Ag)0=vyRJc_PkdSwhAAA6|0x%O}6roMjcd@_CD$!gRPCRpW+xD6gS}Ik0cz z6Xki7tK20_@5tT#lYXW)d11wKkMC$n-q44|-kmP&6~XmS2$06ZAp_xWy-m1yE*2D_hp$wZA}1e#c-l@GJTP z$)ifZCE5wq(O0oA{JKe#j0?s#)W4tx*FElooSGlELw`!lhgw=K>qDfEFZc(| z_BT&_CD*XnysjHcPJa9{aNV17Zw`2|UnB-EBDV$@>CozD8nbd8Nuc5klx+SyuL6Atk#NqgGr-3yj;duM2z z7Q3Y~O`mxjIgGolc@7v5Nw}hnXyT-s_S|<0kaB@354}~=qU()iqb&Ft18Q;vO4Dje z_^l#pXauYhjDJL#@*V=MHRXJSziYC23F|Lq9EFpkn0f0@tQ|oG2iEMMgd=NBQ2m}Y zVdq(=xqW!BHquJg4mnIZ^qr-3;c%zO8hK)oDefo&&2(3`CGR)@{tH& zQczOhDkR-aJFNf`J*%^j;15WxRbq*vA2!RN>|ERjx&*M-IM4J#ZgKD^@Zgy)D}Q$( z;0V*5b%jJ@cyo1Ob^T2VB7o&mFZl` zSE;&SVxSx%k6bUgz+sRYYJ-Z8gAa#KXeZ-7(z^`3Hs=8R>iL4L39pH-i98@l#A%;4 z;DAc2k)~wdEu|n1>J@-qn{ueERn>`~5zr|`b+o}zkra^*6 z;s@FD=Kf&{tlbwG6_I<>d?AIdkR`*%q_0}Ko(3>*wN!tc)^JLWvROEx)iGU@L|rBuad zd%@7c^XG7(tSa6^8*=#iT17vK@bAI~)Ctr+SBYXsjW%*958=b}%>nt~lCbR$uV?-$*Y&6;|`CbZNe%@G+-ItS} zWxCZIbVy_SwlRB)7EPqsoYQ>7T)UC}Pl3O-pshvY*q{1`Y(;If;3K&rs&slEH&El|Jq{&n`W;{|)XHAHGfSFes@Tt=jxw7R}bz|!&79J23&mA2YbVb~5n+7TGo1`f;E(NOixHeLEIOly@`LL|eQa4P zF{x@;YREN_7>m+=wh`#Qr|2w9YiVUku-E)^+s-udo?T%78i~eZBVCGkZNNC(u-6u;r61jOeG|1O$Ff(Y^r2>R+Nr+rW7VK8z*v`wA$4TvPv$#EW zY}EHYZ;OM+%~~kIAZc;p^wq>-AoXLi5tu(tN_q%1#vBk|=0r zsmSvyq%GoG;%Y{xti_c2FF@i;!YqeZYAPD3koVEVZD_O_zXJX(isW?LJmsXjH#*vI zC(~1PaYVQM>4rT8F8?i-b4SYcp`uBx3VP-&>>X|WWg%##Owh4@6?JBSV6_nAwlpZ) zDDtBkw_49H-N}?-J?4#g1E<8tjaJBkk?4U3Z`ftfl{7b1BwRYwjDhc9W%XWlj;}7; z@t9Kzmanx#?b<>|Wx`hsy%pb76@07>=!6%*{jjIe@?6OgYv1!$E@jM;w7ua2yM*9# zv%6Gw$!N`&%7#|@4FDjlT;uH9oBTcZ*Yhn8^75c0+WMTN=li5)E6J)3;;++sD~ zmTR1O9qaO;H%~hkngBWLA;aov!ZY~E_GRiToUZ%E0ZZO?Noc3uXBBioqHw+<|IM}dLv|v!c;DFA|eI23)vS@)l`P5q^0=ki}0iJ z6FffQhJ-{P;Rp;KTs7+C^x%dnZ@#pj4-!o(cFl|7v+X^MszAzO+x5=yrKxT_^1fat z&YyE9W!H~zlEFn`j$Tc2;j0@%Wsl85d>Jb3ltvlFGTY=%f2Nmu4GM5ze{s_^L=zX!nMn0bzZHZWfdM(!;T8)j3X?(kGo7~=OPqX_ z&%4ZRfIn~Z>4Kpb_p)=DI(DPQfId#ee)!U{FW+DWDk}y^gxkxlVywU%m2mkM5rb}; zJSa7?+ov71Xuj{ALd`zFSH>x|6C&1K`Rh#S^+hUx6>5Zinu~kAbo%Fzh$lavDt>Kp z%9K%$5wr|`V$aS}y*&6m%f>I2Zl|yGh5hfmfm{nA=W$QRQB_Qqcw4-d)lHJtXq{!p z&!pUpgXjl_ABlt(l%X6~>z0G2+e+XYD8}MVJqH<$^#jg@Q_I!cwO7PtH1iJYh(Q~o zgXh=8L7tZeqCNV=;yWc>-|Hj!f9YSg5^NAYL5-=~SS_=?d&$tx7SG}_sT3Q?(!{B+ z2Xcca(VCByv*>R4-qXd!ZckZXbtqOpQ3&|{ShZmywUoOSx?KrZa63&r=gIhtx8@(= z0JXQtzgYHjjP?bq6`5Sn>yoFpVqER^QMY%|*QLvi-K_JMuW_6*n}EP*_q|En;QK$M zTS;+HjNOagMBUsIc#=1b2;3OEA$>op0f3d9BBIqVF3_b1>-#4!SE?D^9FznfUV{|! z0=g^>*(mK@sUM8m>;#Mj!*{N_9XT~@1grmQuGb(vbi99tp$NvRUJj{<5HpvK(quG#1Jn7&{dKPdsRsqo< z><^71lLX)z$VQHT_CV^|ix-i&a@e zieg|X_AcSvVLS5E+$2FwE+zAhEg_JN20aRGRZ(%Ys7$4C;K~LS2LV-BNJ`=J>Yv-? zTIqi>v6uSO_E4DQaCC)k2Ucpq>9Ftc1p|79P!xcOgK@PBfHBY z=BL^Ok5Y>)jOoQqG4ep7uZHcEQZe#dw|P5fLu0u=AypWi;GxUy z4{a*iklBmndt1Q^Ct<2lkFAAt9#;&#b5QTA4^Q^Uwd z{$LT`dG}RWb64iiG1TP0_cqG0ILKl&Gp{`R$-=riPbIXf#pC9Njxf$u){^7rgOPiYt? z`CW;7`!#)qp7H=xzIP*HVPoTP;x**Vt-{li=)K`%NXnX9+X~Y*lQ};<>ff3(PH>6& z;~eD=R_<<>kF=FJm5vFi6UysLiD_-$muS+K{b*@JCYvf#1;s zn(fhUt0P}VnTh0SVw$NNaxJ)?M2_0)BmA_py2+SRMPX}!x0g@iji+BFY|ZqnOonSeo90(*jsQz@J=yuWOGQLg2&^4Dy*>{q*-Gkl-Hz7?V+Pg{nCba zT8Xn~+aveMZjE$Efhm{XR742<%W2_*2e)VTz_&3k$3R1zZC7lfKkdr){dPNtJ>dgc zqLvc92slH?K+WV<&24N)O0Os3H2*!SO_T^SB)eSSt#=p-8YEfbTeWx2lTB7)kW`59 zadLyCRo~ZFXCR*xqP=dtPHzx^%ZT?H5hPR>hkV+xp}AgzW#Xz8ACS~s=A-J}xLj$? z+9>l>Ao=O+mo&&`*$U_l_X=aw&|%?&x+=WxHIIhe0sPG1$++8Olc}gXzv3~9;Vih4 z@a=CXXPE6LKhWYi8q$BJX-J-+NHT)<7SN$iSyY|aA>9z3l zZ*_dUz~C15w^ZIPI#1;?@a#q6AGwQptU{63t3)o}n@elY7Co%{71#XAQ6YQRkHYRnF5gb&-a}v9kq)LVKz=tG zNIrg<%1gP=*!+8rtp`OA@6M)*YDi*pZNoYcD1PAV+sR-9-xo0Kbfip%Ql@Xh4GqC0 z)l`y{C?X&HA-`xZl0~C>)sUpt9L4+k&HJnZ1~yZk8v$1gu~jQ)e_(og$T>_e$83B# zw?aR?!Khj(&i&}n-?2K zynI$HUiu}lsy)@xv(nL`$`irN5_9j-8V!eHuC#wD{uxMfd#Te=;^6Cm&$93jpVkOllS=Ey&HwOA-{(_rR3EkNGo zt>S;@2nCj_1j8CeudGD-@+H7MIg!7{M$opSp%Kc#!X(7qZtAqWFB}5Em;s;p^8fm^ z^_wZSl%Z6wjG&xqc(vus<%%%Qv<_67yRWnNhC|nG zI0=$rK@(Vucyb6&LQSUTzZr&F>a=4041a&wWDq68;NQWK1h-b!s|SHt+pIK;DUEL< zwjzr%)M)K>EIBb;z7d;6I0F$k*ANqXvEBK1E<0w4S8}%RwY#=B54AX3@-cuyfK92m zP)at&9*oU(quSx5tu!~-jK{D;dKXuCV6_XftSHtd<2P^r#@XJZBxv_G%eB|H4%dG| zossMlm+H5j@43@;RncMaYf+(f z1w~VFgDE8`hIOzJ(Gab1xhhgba`7A_oq%Ha7m>FhkpUbB!z~&joVhsJ$5XzW%zK!D zAOQjTpZ`-PX?Xy#SS3ghzW{v3*Tk*)B!Ikv3xi<(hpPbA|o`wobrT~BDb!U44 z^kjwh5K>>44GmhU58opXdy@cPk|%@0z$))*UAx~jbZxv^VOq|fy!Wuquj~efkM^0i zsR(}|tYl%3WF&%ZGE#3wC4V*W=Bk4Ezt6mHggyd%AQ~t*i|J>Q%j{5;eHYWN`9d<1 z|0gG(DJgLVLGc9-Z=lPQ%PN1*c|G#TOW7k7GZg2j%6YqjWOxZ-qGFiBwubVeM6B9u z3d(~AxY|GBOPSa_|2w6CNrRiuiRrr_KY2fwTSq}dXROBHZzDepD>*lj6nVEFWrB-EmG9|;F)|k zHq4^;lhe1TEYKVyo=x$u$tup5*vtbNATigrz|P{%EwpsVB-@Q?{cFfEYui;ra=7-x27W+;(V-Vi* zauEiXGA9RFR2UTt^yo1gjZCiiNG6hVF~sez1PGq`9r1~eR7Q`}W01YmsDnTVN{CVn zE*SBbTsn8KQe7+nn>py2lEi^PV-x}%Lr0DyeX`J5;PGi;0^WZnd`k4Ro5_eU0X_hH z%7z^9K0D0{2IWZ0AUut@*J?e9;?Z4g`&8Jf!u|jz;13==P)3+*E`kt{W|)S}{%YuZ z@6Hp;+v$_bIPXg+f<_~mQE@huZ*}g{LKulM=49tB1VM@h+UO!_MlmZPZ)z~_Ve4+I zL0Qf!Xf($e{9}Jtx_u_plcLUxB0~c?fi6vd$7f!(0kkS>f4BHvZH{l#IQ1?k03c*yy2SOY`udH?p(F~!VZBe?NrJ)X>HYM%cYZ{yJx!HHws-Pug-bVS~+#D1g50;+7X)^Mitm2Qu)%}e_AC%gr(V)f{yYJa8|J z+=H0+R=33vCE5-hRN3trQQ6k_qwce`so{IKz?y%p?lV1kR4&tVdC98lJWk)hQq%5F zG+}DBEoXBUd{4S%A8fb0zSF<$xG?bEBe_>DVx6D&^3+02M=?m)6u8W=PFH*tAMb|w3XaCRPA#^{;smdXEXCp?!By~B z^}v6QIRTGhH>jWR_!!B@*A@iD0z^~+96|@VCdrUgM$^gVr^)42z#H$=$=lb#H5&OJ zAEN;NJCYLC>)p~J&hbkK(2^meq3ZO`ov5DbZkg&Se7#z)ggah=jvKquHeHxWrcOSh_Fap=c#YxaOLO; zBZ<0~qi6wbIscclwqQ-wolq5U#hz)dl(q!^JHF*okh8`p5MKgdCdi6>8Mx`eAptim zbxEr)pI&j0>#o+dJ4-fY$l9tT9y9cq)vaUY1>UOJuqNpp?otrA>u<>lKk_@XCNzJF z8??SE>`=H7)F!lK(PvVwLOIuAqAd_Hhf81!?{eK9o0M03rTvQUdl{WzcAL$~rFMw( zq9xj$G5Lzu`g+cPxps|nUZ?`2l;9hTBptGdo#Q0txALJRrC64Ao?2%WqXCy_p zP|@;27K=g_tcO3L<{Ae)<8`gQ(G-7_KV|%d=7_!vBHyhT7bJhuxPhiGkBmhrIcgcj2-8nRJ}c($#WH@IU~=~QO%k1+O}?)3RPfd0gUF@e$PInt zT4ZQX@`xwro>%Aw>Yp%^s3w1xsAI*X5y~B$H?ub6vM}zmujWNgcZXXVa)T0u^VG)^NqNscHeZG{_STlcv?I-`;Nz=#feoj14A`7Cg2gKrDF5 z=7qwbRf;%4`y81C)1971Ga^<6en!CjR(WuVDdWuQ2X`Fr8{pef;J|-hv)6AwkI8O# z{P|`$9`&!<;NL6|HvM70`K>k_4Bt^9@KtnAuz8VX2ZDD7yWMa7tJ}eJG#(8scmbm1 z3y>cwn&XEn$ukC#3YACZCE~aqe7PN74=$@hRKYlZ5SXQD!!jqAKega(5DN07ML2xA zdDaN^LZ}xBa8oG#i%EY-%0W0|d|p>ePke|fVrswjqi!WPFiUW@_t)Z8uh}^ogkk6p z#vgsp<}PGB6}{t1?v-Woad=W5{>2OpQI@UEbv^3rN2)0$VY;pFdEZ3=al}bg3rLuj zS+oK}UTZtHW)Ojv7_*eco0fXo0T|R~x0i|w)``8gjIfi5aS(rWrYe$Xn604DHlbEB zv@R%v zeb2AB4^##F;8-fb3)MQeldO028+|7l2n1(@4OqX*R2;^V$;)9a-xgUbC;Tz z+b$M{I3|>sW8M?RFAeA&s1MIANzF|Yxc=LqcDvKB_v7hgaO;D6zr;{FfznAy%ZHPB z*pl+xnDGor4NX;=p2&Z~Vs^WagWHGE{BHE^VSG0lmP}Yte_;KACs)#kRi<735{&x5 zIAl@VP}Dnb%8;X%|3Pmuos0}MRx#6lw&}8I`dQVV6{+GjLn87NtqThi3_#VPvRX|; zdO;Alqv;pdF_8-hjamP!G&?t?a28w?i(7}0g%$g_33agOv5rYmzGsjU zAxlih`N0%~hyqH*mYviWDX<9zreAoONdb#BC_!jam;?q}$FJY%*!|$5S^;L`_wS2T z=X$y}Uf)Vbx@1{+GJC*cK+lMzXpwGvMfi}X7-^|Aaw)d~+ykpj&mA3Pr&N)RRVTGb zNw||Hosm-1ypw-raVvyJRIW;9ucnxrW4eh~I8+ihxY?mO1ubIUn{>(H83Qd_JaxJx z2G8^(^m@G-_x7II;mFv91j|95>r55nz|*axH9qnz1G{}#sM~upW3x-ZviSR;@teuc zk-sCa29$Nt=|_dp0()h2{2ECgo+?#_ULW=-)ihg+q!E9&xzuy}n5hvztwVp!$z4EA zB6iyxOT{T%R)x25{s7Hae{b4282+D6;j7Xm(YoGk-RX3+aH1^RAyGJ`+)figkqHju zF4&Rnv_&1?eRfPj2uT^aRcfS4!Fhi^exBFv)gRF!YBVrhA{Idp0r$^%IgRJnS2zkFOd3wG53Ob zA!H0}tQ0-~J#d6)3^+%@+IVaL@kH@73_Re8h#Y_P1|Nr@1@r*>M8DksZrS$GmIjDY zLQ@MG+(C|jMv`I+i+6}l2@CitLHGtn!hL+G(sVE8Mqk{)(7x&P&klmOEveJD?9t09r)&2{y>6%faw^)e# zFzbK0>QQgjF$F2vKU+DqYWiSZ|NU%xmIR*^CY4X<67nA~rWgwSjS6bbm74zfK~OV9 zrretTIjN}#l3DenQO`eRay{>ib6fW!Ns@yP%>+9fABGI=9Fl&FJ$dN>uA7{fH1@dh zqxhSiuV(;K3Re{;>m>WUPv?o56syjC`DlN95wJIH6<1j7oZvZwvP>oEUsu}iMcgZ{ zSnlg`OBHBc3VKN9h89Z0GoXokDuZ*Bp&|Bzi+fTj41o`fp901ZH>w&KtH2Y}%=yWO zFDSVO7~LPFS=9~IaF}2h=Dwki7D#phl3d{Al%0SXK@4ER#U(Fb{9G5UC0|W*i|K!Q zi|%$S^ILnl(`ruJpw()X1D!Qo=vM~VrA;7+4zY)bUw>4WU!9A&3mvMrH|;s%mQodM37wb82FGEj1Sbr@*RQ|{n9DpELTV_V%^H81{)@!H zq1Il#0?rcg1(~_Y2w=&&=*o3DxlO>>Z*Q;u@yX+(tZ%(OnE+KmK_&o+(<~vqtS&F= z4`OFV!4f^K%LCa`5*t~#X4C%Iy|}pey(rkMk|Gwz=GDi_8|dI1I6}j2^563Y*mIyy z^s>}PXGz2JRfL`hUc#{r4JChbIn8S}pU+I?vu=C?tx!!1fgUYK4HVo6xEn*vUKXT}()Y4ouN&jL?7_UuS3>ps;_GP4r+Ng5*kQ zSK8-w#cAP@yGkJ~!R?JvW?%rdd7bvcdb-i zOT#b}eb2ARLmw(AC@8|}2Y%u}H>cY`D2%SX-2!P+a+A#=`|oD$T+7hbRrAn~}OY@;ip}9BZ@Z{S|WyuPy8&wkkam@&J(*H7QF{4vB?9>No7c z`n9P-J_xldRcsb$piW%q%J$8evyjF{gqle~5ela6?i}h>ml%KSWejqD%Wv6C%52Kv ztHomKI(o|R;G%#mov)SxZIqzfVcsTaNoqprITbK(U`ORpxqDuPY-_?Tgi=|k0nO?X|XzFm70soa{MdAwZWFHcvG^|ocOWzc-=?C5hQz@p~Nb}zOhpPf}}Z`v>v{hnWO zE1@PxtZJoBlVEJ4EL)LUf&$u9Et6#u2P`Fa%|@4gr6c3-QIkR@bzsl-KH^T+hEAkj5ETN*)hoz5_no= zTJZy$u)rJ_HM*sxYLs*=ub305M-` zDfk)~S)ak`eS~wuRrL4^7H^3*z-Ib*4x%2i@LfFcA4S9bv9i{rkp(e(8M*H3jn6P(tt1xG-|A;2O z_tPIdp2juiISCtlANlTZ=J`*C%VgjW%yyT<4g&jRp`}!aY^YSyu_ewZT2mJBwL~j* zbA63up`O9GyfiI49dXp0Q}PYQ)6viy+r>R(HgzS;ZQ-Um4=N+f-+)LP&#&+#v<8Vvo78C%6i~ae4XG==K&xq)kP{qg&9S4{ zp+hVGeNI9W$0P(;yF5Vf<(%()H=EPG|L7YAg&yKQbP$++4Lv)YpR?c2#~GTPy#FwR z?@p|{rROrbv_3J|j3jy|gf;@@Efpwr0)?XQw@y7u2@dLbo0)fT?1vcYYEIY+|ua6{?{%qW;n9Z4gC&=F=IQ=tHXF5rl`?e_iP_Iz|V9Dko)jc&i4UABLK%@_fV z8FE-4NoI1Ti~K6UR6X$CK?jbjI|^lh@OUc#QeCYnjS3!-ELPE)UOZ(+8h2; zP*rlpl71gh^z@Q~&1Ny3ZSNvX;nOE5*s z5wpK}*ahYr3-hUD2%t?Anr2g37fVTJB=nE$$IrYouN2iwA61wDo{OWmXAk<&_2t>{ zs#8RZiZnren``X1%NUfMX`r!Ujb2pGRcGJkM4GLoGux))1T3*D?meoJW#V+hI)(5l zSiLmeip@$7WKtw$ag%>d7eVI{?#QyiC5-wN49idxK5Q zQP3?pN0Qe}n{ua6A6vTM*XGpgXpzZZF66&j5!YL-LoIn3#{N{mIXCN_ySsN+#V(T| z&)7qu>qVE!qoY>V^_qJ6u3Klo1ahK_clLK9YojS-B!kW~WmF4F&QcU#(uo_v>tdHLQv^6=zJ zCj`kFy^{)IzX^2~inTqcdyRT|d#B~iGJQMNxus+JY-?u;iMtzlTVc8l>;fl3s7iVd z>yYQzpzg(8)FCLoz~?owvXW7K@~JLRJ|Cc_78c66DCLj4#e! z&z=-1OI;uCz=%uZuO9oLWO^|l&+<=dkV8XbNN==5G0UhJ_0&My_r@^Bo*P32MBN8_ zS>PpP)>aS^epZI?SHmCsuU8{C)i624BR)g_#M9kow|{@xzD{^M)NaK$%~t(un?M-; z-M``rQWY}VLC3%>>(;HKg>EUe6v`~Y=-J5hPVOUZ8U5e)suw*?G$ZX`{t)!?emu|n z-22{rIL;TjVUQrhJP$&QW@j>+%li}h7`~5iboBOJ6dWG;-cuG+^5lP^SxyNi0^SIx zDfXvQg1b$*bG&aIC;2bHB$_(L0fl0)Xzaw7X6ATBL zik4(~iZif!LBJNi8olw`K=9-&Sq1_llZyy5Hf}G5m8*wCkx)`a;Anz=-YG*lPm>VE zl9UE$HY+>?lcBH^B9OVnY)*M1p1_IYG?B5ZkrPcO6Wu~fUpy*ZrAPr2KfKO%(utfhM%gwV8usF0SV%^iwdeZH3_>A; z^s9d+qRN%D=hc8*)X=#D_c{X9@(&H7_Zf3f4@z=Qy`~X+~EU*6rOpwKOk70mqU(;<%BqErQ334*Kz>(+Rk4k0!Xi%sJgM#X}ZQRD2uM{mMUD}@K<@G@mH=h{Fr}m z!EFofpEFt9KP?9xBftK%Ep8R@EDP=^uv0Ku+Sb&&zP&uPVD|WzXP2|7cQ@`~vzk-vE|p;}4})U60c^ z6n*cnFr&hxyB#ruKr1y{&~5?Eu0|T90r4zjNc*Y2v1(DtTyY z_xjwgbFTCEn_^WA2At-g3K|2MUzho!T>dK_iQ>{T-oM!zW$Bz^v3Qq&RhO9u;`s+lDk05i#X%-IR zj4DO!{vE`c30? zpzx1NZ(r5XDQ{ahxtQ&8k+FZ6q$M}TWIjhvO3O0V!BCli#)L{q*W_7)I3^538GZw~ z5Q^#bm@I_I$S{FeNOY2nPbk8#2|$La+Z&nS>l&Ffs6?#Eq&NI_pzRo2aAAWKnPlfB zS1XoQAWhCgy<)0mY1S97odKCX^K0I+a#hDZadvZ)<(52+tG&ddW+PQzmmR1!QGI*ZH zhGSqArs>#lxm}S^C>EO47(+#%`KrW^hIox4ZB0fu|o3IN})N-BG z_@B6D*{qb6u^kJp3MhYulwt}88z+#X548gvz=|%x@0rWTba_A39ir9!7c%X{_Df@zozF#EMJY702a;_e9r0WhZGYX&#c5Kx?^F0uLf+wbgWo`h zM=E~^k}7a*--`1Xt?UxIMIevUhr^C=`X99HMAaG`~D&}$6;r@2C2Vf&R{}!vXW*0tH%w$(Cg{keYZ&f`D1pnHl z&891i-Xu}G4!?h-cQUHA*Vwmb+TMGq*X`@78;4a9DdYs#X>b-jUM=pQCjXp``;+j; z{XWDR=<@%w9{X+3eM8t@qZ07SP(GhWhl#v14c%1H`1XHVQ4*8fa}WI9i}z&mU}oxX z!$`>SuCxQq+_KG_Z{8S#stK4G)(BILt72=c^SMjO++4ij zD{|3`3cFb6Hiap&xvGV^?$Azz!sy}aEVM~!5@!+ryP37y1XD#Y7v)R7=Y4sb!^Ktp zlp{p^3|N2ehk)02A`8T3L|?+Q2%@ghi~M%iTb5Z&N$FkFET;qrmla_&1s>+mLzxxw-OdFl^Mtpy4j@((&Go%W7b4)9kgv~_)T-~l5pb;p4gvKB*zp5?& zY7BoNEqo442IwYp0AP{S5WG_g&Vt3ZDDgO7ae34}<5b!+cGP`qT=A3hPUn~m8 z5iCbtuoxj4nS5sE1G$R7B$(WO`kb)tZTNq>&QmGY;WwEVQlKFFCA7>ioERz$1&(9% z1=Yhvk znxfiW23!$}L_>HX9s8H_&jA~S;!8#dt(>jKDCV>XPV=*EZ|Fn2y+1LtjK`1~5tn}) zKorFmpOlHo<$`KRKHP5;OH?zdIjt><#w_jieh*&;lh?=T-{{xm<>_JU!%WHyS_#Hd z*|v$j8Kx}L=wGns$NWMoJ>+aBVY1BI?zZEk44#5}+yw6W(DiD^Wza&&HxT%C!H6Gw z%MG>FKv3$oudcQ0U0LA^j7b9n%Qk=@SP zRKo0#cSdY9Z1}Sbg=CbdKu+2#NtQ-yv1)=u{!yIJEol{VJ2q;~=6EorRX9fD0vi*a z^zZbmy5Q7Ahw?M`G|I#0(Q`DMjNen|eAiH$nVr@>$@|cSn}!bFVfl^oAMHJBbJNI{ z-}x0y%8cy6HVMqs-Itk44oiRkHo~KywtgOkn?LnWZ>Hlkx#_=3r?WJ{NkP6Pc^c#A z4<5|(+gF1p(=Zu{zt2~L@&?DV^*}ld|F~Hbq$n@e1L-unO2Rn2j4^+5kQ6u@li^wo z@L?K`aHjuS74-hK@{2>J&(;BNKg-f=ZO|B5*9PtkXVWMN3%nA<&qIGaE21*G{vg|e4S>~ups2?AJ2=~yeNM! z2@mua0k(%ptr8Y{xEjQ@0$U%9Q@pHza4_$(bcpkO9T@#K$2qXVO0W(R!Ug@^?CP3+ zTMiB!byrO92Pk=D3HyQBucJIzgBw*QH1g68fQ6` zCl?CL<22s^iA(!T5h=2{2{)V<>Hg=a@Vp)=%0+uIk>*FQP>!wfqF`QKY&Q_j!Rd%nV+SC8!2n5V>!PhT!hB+WJoz_Fc=at5*iJQCiz29 zV*^F11n-aj>*)9&M?o8jH+;O*mn{mGF%f(k#U#o*FF6cl(3O`GjLrc{5kXi|Cc&R- zaJi{0xW64YTNZ46bf7aap=BV;MPt%o7~S*g;5X^?-ghfel3WuTa3>8B+*-XGWzsb-vwh}(*iv_QEK!!CLoe#GQAc~MNlg8YZk zzh=Xvi2sG~=K?2GcSSjhh~f<67>^LB5n6VGmK*%IQIc1-K$r@WG$V9*gKpA!hGvsl zm+1L^kfRO$a!^*=AmuYmzF*^R&@$x+J{d0NS>k_I5)0V&)G5}@h=_K#+x1ux594`N zga=F&YQ%q7LWo?hK3Gul8G!|)*_&o?cyP3Tx*eddY5zJeiFm%j(bc3N_Tjmw`m5u^_ivB<0R9n;iiuYLtA;Xk z1#N$CZ*!_ycBrJ~QetRCzs(wGFd|!cNZK!jh%0JxW7EiRLeyrdFG!OmlQ#Qjpp!sc zQ3JOS@$s7;grQRcX{s%fAx_6@!o1{3vsFbnSvN|2n+@C+RHTeSgCIc&gT1~YO#ITN zV4IL6g>@&ZK~x|Q!N3tFnu*8^C;4E)UNnErv9QFbpW(bnGwi5qAVSSfKgtIoBvI7n zTjel=P+TVfF7;r!$7HJ6xOjNnwX5Ipun5D#G_c$0i-tWA79%o zNygC?v84ycO{PX%OagALA?ieT67On6g9z@TrNoL?0Qrh&a7g4+ifzLZ4%PE8f=PcD zX_))bFvmp4)u1tY=!KK?nEn7UZd=EL4B!3yJ1Z9~4I>r6QT*G_EC=y+luc{&|s@kRnxr z3?&tzt8%(^NppL%Oku6npIyHr>-1p33Mu|z=j9~K--TH?#iTaNfj7^CPKRf2f;I{| zAA*ZEvtM=|LwFpYvZ%muB1V>|!NWAU`oN%A4hX09rfVD=7K5XD86_j70Xct>p!>h2 zu~_R|sbO#wb0`vGC1PR*mptc2O+oKgqX1b;Is_B{5HKYJNH}Fgr2Hr-TVB@`0Emez zf;G=h44~lvZNGHq<}PmOl4=QRhb!e#G;YEeL*~lqmPKVoSsP=O`Mfo#3KcVPd9zP_ z(*f}St_WkO#jez1tu`vDNC|(q%Ft+&fz1-^GTO!gu-7|&cXn`mw0qb_z7EMoTby$F zFpC(EldiG>x^PFZ4qd<_6m2?!hwR2U49l0i(wOQG+MY{Y=&_$e$cO=1E!JDS$OAIb z57*a>e?bL}ingeG&>xaF#5#sCQ9elsd8u4_v%AVu$YaxBifgSXr|N$(q`53R$t?&+ zgMaFXm>F5WqslW)OJ)b%YlqATqm3+g-e5C{sr=q#$Sos50wbuO_j>y$C&woq1XQmc zinExWyC!Z@i;rzw)sOAfGJ+$$B_LWor?^%erSKLsq_P@uH4VYdVFGyh$q;KUxgxTZ z?Gg7PPKO^!;4#Zc$Tfd%ZuAqOUiur4^8N-ShH18!O&@jp$%as0ZJvt^sIMQmaucEz z8a8KB*-o&RLedz4g+oOOnNmdB+n_oChoc=tw6#hx(i)ps{I|fZQQ%7V-yv;v#DLfL z2E??J9+RXFt}laH)?LXoI99t_&XIy7|EhYmo~)|JEDH$AOs#(>{UgAO8g1m4+ImjF zZ34OsR!%h4h{-#{QZ8g$BET@$!YS(#JaaJRdmxvwh`~GQCsB08fDcX3p2=ygY1Q!s zXIW`t@eEciymQT|UdcU`a8$3B*?x^0Zw3t6?6CJqDBDW69%sf;<3^O@zoWBa^bSkbAx{+62 zw1z-0-MmcG7&YL39QxSNUIry9R5cdmyF8b+pU|o31^p12w*?&#Kx<*HEX}HeG8rhE zA*n`Gt}^l>Nuj7KoN6yz@*-ApPbF^J3MVgm0+zAT%7cHTZvmATRgKvlil|)9r8{*(mFvCJ43U2u!Z&JdETE{JmoO-*bCNkFIVxK0PtTNMdN^z>D&5VI38d0jPD10C}O9&rtp^{@Et?pdz`@;{;=c*VhWvB&r z76-D{a51=Iq;m$j``XU$xP@f?>^kn<$^eU8Pi zaRm8C6^B+emq6CC#7Pqg`ovgg1X8uf%@k^=~`Qg0;%|wW#5$! z7>eMsKq;T5I}Ar(_W)H+*1F3d%)x+Uw%=qLSTFB*SQGd9H`^e)PG`Uw==aHQ9Ls{s}RCe|AfXPZzj z#}y6O!l^(l`EG*)&?jK>$_RBm&W3;Hwka_6BlT64B%(s7C?#TPtUCCr+F{E}bmkT# zu5dSciMIGOHNd_bU#p_~a)J)LEqQ>6oTLkUEucMp(%> zS|JKIbUr0;i%82Ry#C9XN%x0IRtm~qQ=*wZk+ZS9YwqIh7_NZNf1@(dlw9@^-{j`- zwCDz}iuY?bvOfDdl)bKDU0;9M_$jtk>76_Kv8a{E-^|y_2Ei}qIyZjM8TwWhq0;|Ry4sGFCU;Te?Pw0LS73`tiQB{w%ltQoB)wn^vp-k{VK02niJ(LIXTXD znGuHVZ9k|zRCHJy{UAI8zqMAXo~xjj++XFH9`K5lzj^maDY7qUP)i<$ay_@Y{n~2Q zIUiL*;ncJ-RlwWTjP!pL!(p4xVsa>SO{U`DD`i!yWQgjjk};>-n(6*iNpIKQRMbIR z#$v=qNZo6NhlT8Vux(7k&xaVMMGZ*O=M*5Rmr1`n4NM8BPrj|Xgs0d0MEfWjYzz3+ z2H5I7cv^~-4yPl&`BWE9h2&*RAgFSn+>)xZEP;NpDCGv9c|w2VkJ82FxaK&_U{M|c zqjHzIpkI7M8p@FXwke}fhr33DSvV4Hi4F%Spgt#}PMD)_<|=cqSgm>ZiJWL+v9o#u z!oOoJFb_{{qJy4MT6DYJ089rfXKw_3HeSam5Xmcmqeaqe}&c8VbPS-S;}CAEUSph%rSwI-tEWRgDvV&Tne>rCs4 z8STEim-pD+w?*VuDJ!=4>t*$Pl)^-EyXgl)m zV1G36m#%-)Xk?C$xurQ+YPY1j?OyN0{>d-Lrw3>MGx+WO!Ty=!47>EC*6}N@jXwI0 zh=rTArOmdNYTmxb-m{T=J>raqGc4P4qDuw$^d?DXd6esGL&ao#>wZS!o3eqn+%iiG zJS^}?J9^-|5R*|_G0RPyvT2iVAbraoTkCr1QsaMsSq@PZvh8<3V)ktxz1Y@{Ncw=Y z%QTOQ8+Q!cV5hTg+sh7JhNV$NMXcx45juaAKgur<-N8qp5jD%R|3k-_F)b1?281ds ztR?SBVAq1ME-)8E(H6N8SW^s3@vprrKXxT!zFGs^XBIyx!ibnfnX%pYdzcX9rX~{Wl(C>f#+qdak4u}bV|6m>B ztrML=;$&Cz0hFcN75OVQd+gd%EH;3sJ4+hrc%0KaEft@MZ#Q6@jHfi^96ag%xzz^e zYV+%pIkYM~%7H7JEz^}fFmRD?MZQ z<~*F*KI?zMEhdcoSlnJGE(qwtiB70I#a8VdX ze_)R>cd9U}u5C!n1wpPH(dsw!eSPqMt&qV=13?Ui@ADKnc&Imp7Qre)1+f=<=ygG+ zv)S$7Oft-5q>J?3o!!O7Lj^15^d}_WpXBZ#?1NIIJ*J=y!s~PPyWFn$U~X!x=hur` zU(Ks+=NqQ3dSoA%kfbPoO6;(D;^?&q#-&n?CGEgCof5oc=QdeFmZ@VaokOrbIP?XP zp!&O8b&9>FqMCAs`cP0JDPozXDxA5pS4p>O9L?wz2{fVVGmnSP^bv5T2K+a=%LpINp~mPK)%Q%)gt}xX1AY| zr4*}k2>E#LW!_|RJ91OUnBf}9@e1MNCF)6R9_&|jU1L4GysG)dupG~|ux4I9TJ5Ys z6Vl9(Raib-uXzZ6=nKY#G+aTYI1#)>rQTz3F>DYZwNt1Qo1pytMdhCCt4V`M$+K?; zDV&!x9uP7LbA`onFHV%KKtxjoX$^>uoR27YX&T6qec}xc;09(^)*WZ5w&>+I7{;x7 zz7}XJ*s}l7S9ihI+%}~)q<}mNQ%UFdoz20{SsNZh^agf+A;ku;UaXdNt0;}G&7-@z!vepn+kPd zwU?bsW|(h(9`BLOHk^YHs6E7>4an11@>Oa+=*O%q*u{Kl_4`5{dtVdwYDYd00&?y! zQVZ&nIx70Kp^U(LFw|)VTUJD^EbKVX z)-O+7{Joe!vg(oh7Rtz-!$uZE%r~k2pHcnEb(epCgp)-a<_R}v9iQDyu+1yy6Ks7q zQ*K8z|76t7KwrfT)m2?@+AtJ-&#!Q+s!60G!PII~8B}e>Rys-~V0&p$WD*CWC3fW4 zjEM5zXD1;fQRoK`L-PyK_4T>uoNHgc-h_)#Q7{Zp6ha#T>wyO|KEER?`?G_b%hr_x zo0sN)I1XHbWAmN_A;AbU@r5JeBl8=f0b~r(wxaOp0Dybq6LHw~VH5#_vyihKbIf8N z0WS!B6o@ksFc0Tv)?xRt_;Q7CWvu|QLh3CcL*UF#S(Rcgp=eGC$4+Hq2JPRq8zf|& z;8BS#C~~VIh#enA4`Sy#6?9zg`*D`TXTE2D1D9i4f&t621tg=~W}5i%@Vv+jbO07- zFTi$d$1UH2l)^YCC&JHDJt>uXAlDgNcu}L9xFFA=KL=Q!bXLotN)(HPZ?1u=UTiCt z=oZPB({|jqGW67~O|54Ul6}uA=C0-Hge(8rfE0M2_Nvae#NFj5k1lRcC+qaSQ=EK% z6uB%;eH~nbCGnhkQSx!gf+Fz^Tq7x;Bd2WkSd~$Ip6+g3`&f2<$UlzXtu!R^J(2wkly?`oL!a=JzDHEp!oXvk>XKrSsm8a;DpV*;; z5r&~3=NE&a6{`x7{gpEWbYyq4H&*w5Z&mI3Yq^4+`Y6U0g&vL?kI3;Rhz4qMgUmT% z2ro5t(i=VXhqnW(_w;jcJ26J84$jYkc9LiOFot7e(6fH^M&rIQ6#FkPK=Uxu!7Djk z@Tu8qHJi1UFPD2#kSj-usQfYY!b>6Z)LgY@(=YAzx&XG3LDO6(NtZ}@ok-mY-1V+^H%;A92-agL^p&B6B7R)Naa8zonnxDBSZIEbS)&LSWs zhrxCrPSzVq1U_d>W4iSibNAAJIazjajpQOt&}AZ^CqNar`2VB$70zCaC%IU5y5e=j zinK*uf5APfvE94~=r>eD>6e+C|RZ>;ttK+iu!O^qsGmrfh9DBq7?a zR!ShKmtXm5);vCb9c2{^~{H>?N6JOSn-SoOk@lqZD0dEX`O!5QWP$!u%#h?!)3r)T_@pHK>M@MEGwde>o@VFu_mr(8OwkaHC#I8I=J{XL zL3S5~J_@qf=K`YX)Q^BY+YzUd9RGCLBBVzbB{(1#H=8Ht1yGO>?D-31SMN~dQPll{ z*JyZwx}fI_I~77YF*@dVCnY%nQPS9S%D+k&$~;z;2~*!ou}v9&3FA2+$1Bzp4_*Qd zHzjyJB{+>h+qQLLk3YNcnT(vliPb|^_tbR<@F0Ip*93bGy)&;96 zhXB204cnHBoB(D(nZJClf5ZcK)$bp`eS_LcpyLt>d#nHw+#PA$IlA>L77#ZKDy}*> z#2q7<&+NM-i7G+FIS;&u;vVt{@z%9C+7b{|U_BhGu8i3&$7NfXkc5CLVtoHgxk5`3 z3j6&cWSBcD!85C>s0JTl93+p%#++arx6}8NB~O@-#=;s$QF7nTf5Sf+rraqWjfp#m zfG^w}{@SbSqfCvJq{xe($cp0Kwyc=5FRu6U%chtxCGE!$RN%HvnXL#r;QCD-9eUh7 zAhgUxLR!+$krw%(j(Z2sQqy_fl?wmAwO3U4+>|Y)myUTVWC^%7Cei~OUK=H3n=lKH zHig-uq>zH>_D;I3e+HkMl&90fX;5B)NZ}_wH`&pkhLc6tlp#KE*Q} zgfY0Cko*iC{6-IsdGV5bwHBWp8f#NnAe_P;<@$m?n0oVVCQ_s%(93wnTSq&G>7jnB zZR$`u#U27hpzeJ*V~d6_CP4tc0Up<{ZrJSN#3hJNkDr{yeyt zJU^`7@iRie4(~zV?{Pe5i#lf6jsdU!V(LYaeeiT(+usVz8wY(yC$$$N=i+I&;+;bw zO;^BU3X%Ka=JK!U_0`qw<;UskmmfZUy16vwWCbzqPefi0MN$?o8%a4$cz+-d$EOo> zL!^%T+A(+ke?EFLlvtiU6Fn6g4h!bT;@}9KPIS8b1C0y|<7zWp_sXhmpubWs10zPX zel7Jb1J0${9r!@SeUzDdNYPinonDTwr~IR5FrnVx6)q!?9k#ZbTqE5i6)mZCVhP>w zYh$wpxZw-+g1t^B<8C-<=y`)Mbai{c|DMC6(WvIke@(^8)FoI2!#&}c%p7VZ_~;@{ zQrj^x$Wg{w6oCf}^Tq%bcJskG85S11BFXYr1g$OTHj?GOmRGI(&l|O5Sg2rM$um9$ z>HW$M3mNriMq+A#e#QTP+TV-Wi-)Ec#?&t0@cSYGFOhvx(_Z4E5( zb6`!{e`-)|_Oj%(YKf6m;@+!htA?(%^ymZsrnYD(P@3H~FFEp?&$6ROYpV=BhpE9) zyiB&4$b8#m36UD~(j|5Y!^xpDgzt0sw$HzJ9llghsG5a}SE=ipHGF$VUb@y|W_}1oulokXBmM8-I5_<~}71UcXC!*PvMo6{*6IN2DHXdtHU?vfaWx& z2&ctn6{;@xdY3pu4kZCHmtI2-8GjB7H8oczY9Sewn@eNy6rGGgp?b3qaTcybeo`%i zv{t_-h6H6G-Y^?*9YYTgA8gy0*6?-1DwihLELkyItrEYs^}}}E*y;YrH?U=?scpy9 ztfDX<>&x&TVi_J!zFBalBt1sf#&KQroZ~)lyQd&wbIogBAaiYSt=N_JT}k%cT1T~? z?fEN?QoJnmS;WuLX>;|h*b-33+x@Q_0bP;0@G6ax8Q*D}#4IzG1mO9KKQ-t!#W}2O z;01_bERq@@42{lZC=WZAKST}~e|BaEgEm?+ugm`vSFw&u`i=6vyxR zD||pANM&lJPCKN4x~kJSOc2ZfmwbS&m9&yssRvxT$RUPNzmEKoC!hQ^@h83+0s4B%Kew5f|M3V6

Hg#M>k@HZgtD4oq20_hm9Vxs0xC=`|}{p!NLK&84k=aHt! zrX*bTK-d89^=dZ$Xh5sQVGr$UyKMOMT4XTTM1RB`Wm>ax;^S}1f48}vN)3#sB&=R( zn1eRZe0fEvn>44#4C!Pdfdv^1J%rl~ki=~)9(PUIA2Ox#GVFGH8}{9^+U357w$`j5 zjVts4;`LRd@!SOx6xWn#PaH%zL%uAGFA)Rqz8Y^AC;5AOT#b} z#_# zswPPYYV-|A6mOeQ=b?PG2YI7Vt(Mmc7OQOA)`g`ud$M(735nwyd22A+a%*s%B$^mq z(McRDFXwIYnTYr_AvaozB9LTlNw8*vsb{CD6tn2=f1$*y^&soqltD1E*8|LCOeBVd$K7Q_vn9b<<5?WErOz3E>#a1jdlZr28}~1clDeMZb4; zKb8#m_n*W+0{X5v7w3w?0)k<2Cny**kHZ+#8Hw2rj8?$b^=ISq8?6-5fXTnbq@_Z; zdO#|-f7bk-He(k?1Ffu5qoW*j$e+zjkBeT_qb(n zd}^uT5E~W~4G(GuBzqUn*j!-ptV#PSjnr524XsvNYuhjse)q4?zz+_j&_c(c*;>}M zBZF+o*2|N@D9UjvkR_u_TQl9oi8?Y|XKBh0XrZFTF? zhW2xz@DkJz&4pknw0@YaoOK+hm?_&_We8p5>p2B1Jv*D;-OlcAlV8(6Kfg{o6}2W) zDGVK{-y`F7_yOEB3H>e<=zEZJp{Oq0mNIw*=8svV?Tlm^0+WP7&s`11JADHNvFoWC+VD>am7mv@-XyIg~` zm;JY)pgWg*v$~zqbr^Ie-LCi27Coqoj`UYx+u|R3uUy@rltKfs?bz76Ybk|vowG+y zQxtt@o>kNyk(d(@Y5&9i?LRDof12=n$wu21D}ReMl2wIR1uyLy>u%e+`G1~*IY=vc zv(vQbFu-jRB&pj3bK}f)dp1OYAxpF^M3y{}ij(c+A%+2az&*)6UL;WxCC74hwqnhX z*yiQC-^h>ekC*f1&Q4%2Fj?9TM&t8%F^OlV;l1;F7rSp?|IW1!-dbNCe-_g)c(BgG z#WD5d3xlc090z_p7tAf;jBvE@0voK$@ohqoT*<>4!uJ#hE^Vb(d#z{@5H*uf4j3OMtfeswU`_G zOTj~PlS?%m0O-+ zPv9#$JUm2(Wf|xgf4xOr^roF~(K(u7`VB{uka+aLY=NAnwoh;yIX$ti2F`4u<1QlDpLV+i`z?tyGdLi^0$8Rbse?=}pe(O3qe&S0FlM_hn>aV`C_i z!1vXuF1k*C-IO$7$27c(@DiffDQCG=TC$2fihWRx_~}F#V!~-rK3p(uDT;Q&d^_d1 zo$%NyV*u;xe}g5MwHl!w^|6`ARwAzOJQv zRbaO(xF1Ef2Ub5jwVhi6`DC8Tu*Dp>h8Ey_%viFiX&g2pE>}`^yWG*#M5?SC;6z;&Qu0}Hw|roVE*~T3b++?{!gvIfA^rc31%jbco0^6%w$B?Tfqp* zwVV+oTUl5Y@pEA>%@mQDENCfU*dJ?gMZxUfAZr%qS{cQ4!AH6t{Y-JJNY`g7+h8< zb@yr5DZ3#_qV62qE{>q^lfR>IRgS<(T`UeHjgt(&n(1~Sm++JF2dFFqj|;*eVsD3I z>da!##fBQ!#P|`xl-&@WbD~8;g6zt)$5Si+lH135ZG6U4=@yx=1e?<&=z+)}rKw*v ze+1E*LcrR2E)-L+s#yUCAeSZIW{G7UM&4h;fZG1(hx)%q^)o!F4o%g|pU+6#R3&|= z&CLD%{XJHs{V<3p8HCh6K)+TG=%De!P*znj>GFz-*JH(c%A3LxJ_8AgP&;sNINg%$ z^k%$>Ol9HvhFza=%Y_EpIjZMyrn1oU*K2oN}ArlnT{y;wa)ZesS63mVx$~;ka2FNB;|%f7m9s z>BUEK!Jl0=$`eX@3F+9r&tujeS1QwioGV4;1XyD~DYaTmg}{U|mFr}d3+-D%pP7-W zES6{O&)=9SJ&0(w-lqU zRj9SQdhU4pQp23AYsEZi7agp~e)*hEVRi zPKIvK@o_q@3w{4Nq3622IdPXHRWJCY3;BiG5oOIDw70NXv*e)SP^+{pnMl-Tgz~__ zWKhZhR@n?b!%;qox)b+~R7OeCLz!eS|`mf6UD%W0=bI zl^Nwttt@ioNri)yBwVYjJn*FZwpLBdeRz|TxsSHz_scKHIDde0%;4=m3uJ+VJJT5T zhM&h*!@;NF$!DWf9PQ;5k7;kQqz~}pYz}pa!!D(bfBp0C#p0y2Eg@amwsubu%RdZl znUeTwsV!fb&QkY#h9s1Qe>`18Qyb&(L3k$}81n9*R;jqft?Rlx=AiG&9r@P^6=3s= zwk_$kFPZd|?%4rZVI}6|DdFKYC#beq*haei-c+iE3b8Pof0`g~(#@Z&;HO%X6P(rF z0}cENs?b zNa9eD9oe?l3zaVx?=zGQyvQlcdKY?bvHEc!-}CaG#1k-;)LwiWszB@N{A%1A^xH_9j^5Iym^x6=wc4oj zrjR&xJpy%wDbQRW+-#UE1oQf86pnQ$-f0eq-6|&-dVmHgH6@n;; zfQyv9xg4)NIyVzA329Fj$YUK3YFsM3HBq8>pU0>)Xjd^>7f|v+uU`s!74)fZu#(`9 zlmzpuJysLVZ(y9CXN#PBfeYT8KJYtGqO3rdz5V;%p0Nn}b8p#L$|_#s=dT5Xl@u*h z=qP*iaQ%YZe=r?r^JYP$%o}{n$keQ51YPj;w!FE@Js;vYRCwBmSy2t#;sZH+X)_H|X(93n~dt$A#ts;pmrvRit~+bQ^Wr(n0g zEek(QhZ&d}0(g$a_e(!?)x2u0!pL1k_EL?jCAwijU>OFp2BNA+SRBhZzkjRXy-69t4Ya+I_uZVX}s30hcf^=~$ zNSa*RKyw$G1X{#@w;3u34$@ohc<PA9AmoXOHe3PkX^IT571nV{7Q$Y10GN#c( zSH(}i4!=$?don(j4P~n(uL8=r$7}G3^PR?;FJf5B?5C^|?jPCcmdC`Ck$@9CP{-S1D1 zUf(8RVi=6XC==o#xKC+3O=ov};a&OYk1j5Kaz1k2mvO+^(z)kx!WlA^WlZu2^+`;a z|H6rn!ZwUlHV%1{LboYG8CJ4qrceYKf4JS&+|1x%;bEdEXB#dPt{!>H{PMy!yog8% zC1i~>&^U=O&PGab{-?kGRSGkH49Fr8^qVMzuD9V~Z=dJguOulh(rH9J2vX*08Q{8E zr&J>Kl-b1ekjWMF0T3a`vWjcvxNEvPx+yk84iySM2Zr+_Uhwe#n2yZeh^fHr7bVa+l^yUoN?=?8 zE~r#z{XrqY`g3MgW&%|z*p8#av36j`z>j>=r`2Yiwxi9u0+CADh5)_Z9#Xm0$B@d@ zO!VKxY+&Q$JLi7kat}Z`d1d?pf2C8|N&_(zea}~1OQk8OC@4OR3n&%^>5Gq!3~6$w z6P!tgEVhI6-_1-HyV*j$PucD{Ip-ud_hnWRqF8~pWE>%R_Qk*tAM}`C3lx_ZSAv~i z#&1=TYE{LLx+t|m<-$l=onyUHFeP3!6KEnrygdNqY0R;7QmZ*!U%Q_6e@ZMiBEoZK zE%X?7+Egp7Ad51`A^=*5|0iH|_M#k`G}uDE34|(*{9+EFoi?|SXrt-6ALNol>J_i= z3Q58PxHFzR%8X&vQb)JxnBvvdcA2!NcZ+?v-GHBLCCQkjfkUbxwCnuVfekuu6i92) z(RG&hrsbo%i(nY~b`i)Ff9TO}`0mp2x?E=T2o#PE$Z7u@p|K4KDVNgD>v9cR}E`TTG z2gOuvYuhjo{_bCKgRXWUD;sPKlC>pmlO`-%OX6;nI2gx1J7ThAeckL+1L!c0jxJfFtd1l9n z4X0;dM;He=RdyTf#ml2I!kn|5QhlTgO_({5NaIeYhOF(OE_1*|8mKC2-l#(b$xXeK zHTn)Z}xHQtDns48}5rNHJbI6j6~Tc&(` zB2vkhjv8T2;YK6>kHYVQYg$Ylpq+C(fp5hhq`BVF#SV7|INKwTZFl>rtm|m2!xTk= z4VASkHJ7QL_bx$#s@zkj1syQ?8p0Q-a={wl2XeaAfBHMkJu1_crN@NoZQj(rTTOeL z&^gj9H7CBwLzr(;8K+7p+xy3etQ26ag;^0W-z8cPr8k-M?)|}N?Di-A-L&t2?%y9G z@HU7pR=r|&ziYNJ-`SpaE3MBDpj}p%ubJ4nzQMHE{)k)0*}1(dtY_;NwN`C!n=lam z&ad#Ie?)*v*H!8?X-TNmty4ct?bNQHLR9f`P&8sA+pLM!{P&%C2?;KR#qH_q;E8+lD4OWmO>`9HhBm?zcxDlSLN`mKJ|FL% zB&5qF1nQ`!$!8grXgEGC4Vjn3J_$4G%a~D;FExbZF^$MD4lGiQk#d1p>WP#?7%y=z zfBp9US~v6UijdVal#j7Ewo528+-hEg&UgS^CsUgo9hFW6s1b4Ufw7rYe3@kg>fsBM&Ez^X7sATM$h2BI>pDiUiG zqgfoe?qn$C4AUhH2Q!+sM#x0MG?%8&C$-0H>O%E^( z<`uv;QqT)2;Q!QCg8p*mw-`6u0lo}OB~@~iT~CC&I3<7Jkm7$2#vm7Ctzw7ve}M0i z?KXI;(%x1WYXT^{!}Rbv+7H%4vF+dJ;dMf7>LD+z2Pq;wNDMiu|00GLkngQx-AZVd z&MhU5+ZWyq zAHwSLs8@TfwcpiS=~LTC7XQv)At+}gDmF(Zvj{CM)w5|{rxWy4g71rJ64y1V!cWs07;L^jH@)-vK0`|q zrK)59p5#Dl1kUgzQs;Gr;z@j!p=Tk=L=|7zx96pKjuK*I_V8&GpNGAFOcADjcr-53 z1c|RtrS?QRUr;qk^EhMEN7I~YZE-r_7Z9l--d#zu7-LVc!*Ikye|I&?hu9031S0<5 z%GVVS{>mzy#WnJJDe*z(lDo||E*Z1DO7uMAjxke1r`~*{j$Dogy z7&pDj;C-W{7~ces7t9u#T%!IGdb0bd*DL6QWhff1<@J8&pVp}!m@&v-I`RU(l9%S7 zzdS+3Xn85@c(5+5e@Onsiu>Zz;NTk7$5mBSY-X^&+e~;+m|bOx9vq~yd4qL*i3-)z z3IwmmDW=rlp;0`|>cbr0qAF+=;#!EU^E9P&Bd_<RzM3bSR{!tNj*d=`gN~%G9E%$zgE_LDM*=e@%}n3zY4Y$UI9Cs2&(@ z;xAbD0JLn>o{f*)4zHLo!Oq%MTK<2aWbrOH@lDJOB-V*pRr%dvCNPINR&s_wg zT6X?$6lWM|k`qJc(=7A$_xHigU`TcqCpVv($eSA(R&S`sRdFk^*kyL1ZFOzkPamw% z41E0xMR1@4e-@|d3oiX#lL$`(4Xt5{N%WmV-Z1E4l#O7x|2|I6gyzu+K_ zuqv%@-@H}XP~`jL^(88$ot<%vi8CC|;xr?kVFF(dfBa1I2boVvv=o0xheMRx!P5lb zW`!}Gb_V-A;14Mg`9XOlnM$%i-&2_QQl*m#mu1(!AQQpAs&o=)jIDb+In1Qs>KNJ8^3bRq(@0*B&WbXyeg_14L5uXkEZI3V3GaQ6&XDCm^TtR=dIL!d+-p^ zkQU53Ffl90Pc3k0gqu8GV`<^oQfQFKk{>ur(dRGFmCd!IJO>R8hcF&CfVFOimO)`H zC_*zpLFShS-WJGAU+rjlfL9wj^7nGmHObQdf6xk1o$_n*%3bHT)7`9!vG9LqiZ^Pa z@0**4Y%N1GYU^L6MDru7rmQHLaC8-#$=qi zq%#9iQHKb|q6X!nVH=Ke)%s_vyC(?a_}Z+7#Z&_Ze{4JmprD!z{f2L0DaAVu^jly#vXspk1qApIKO}}#SfN5V9 z6ct~)yn^7+#ig`?n#6biN{98B#6Em(%n_G?&-OpJx;nw>|g_bBo3NJew!7re_|}tQKyU&N##C$>KmEd zy|}+eryTg+hG(M*kNv$(K4yNne*;800$wZOl-m9eo;3801}UvbHuj9&0>cy?O%i%$ z3(8(@$H$I*?M()`B{TwGWr#xTDjAFK0F*~5JlK-H7b5~sgKY)u>SWANOWld7<$Eum zPEMPlVNy)VZiG*k$C1v^DO5`oS;*;8gziuRz)3nrgKODqE$`DL&cP@He*~Z?50wun znuA>uKbW-X@1bV$#~Hxja=Pz6Iu87+EKY8Kx_>(c@AqXqg(u)5!D={y5<%%Bm|&35 zRu<_xXbp#LOTjBQ84}WJ^ZlmdKoCiMO~{vaGh*Mm*a}ct`%MmDW_W=~MiG{@b+Z01 zy^VIivi9FKF1<}MGGdFpf0w)#)U?GwK6SM`27_Me=-RR99vn=H8TyDuk12u0(QY8c zF7ez9{tpJ*@R6lzetzKU8!Ca%Qaqks0T#)0``#9Tj)j{-Tun}mSP(;by&!rha~4FB zhH+bNvlH7|L~M?ess`biU3HSrg?HOmU2X@VxZw!!SB_31_&?XMcj;QJ!1 z;Sr7cx6%V=ua3}CrvkCTHv0}H>}tbu6I*m=*PmF=h_J3jk|M9ue7bP2w_)rhWHd#v zH$<)-&*hLzm_YW6ms|xeWM=2~G8?;xMFr*ri|=_qzjDFNT3D}1SiKhJU7jLl$y}0N z9W&bMB1U6Q9I#Skf4vFB3o`N2t{XmY5~n%LIU2|0;1X3d3Y9nzO+?;;V1?_X!1WnQ z0MN4gV^WHt;csLIprD$uw^VJTZW%4Cbj_CVZ)4voNXO)~IYr_Ju_#Xpv6q@$MMFe( zC6RclLMq9weRk1howjB~lU0%&T$0c+-vFivs$J5xK+5-&f1@-bC5{DF`_joho5#=Z zJI*4+pE$RbY6);xx|_sxT-7+bP06m2lI?pPFi!p+x+Hoe%s2D8GmaaN7Kk}UU-iPI zgO@8n@0&+K*5lKW9T}ZTk7uI4ZLN8GU7~g*qYIdy!2JCKZ@UjrbvKm1Aok@I{W4-- ze!jdQbtZpuw>BOQJOY2OxBmVY4Ml&b?Uu@Is;|jiXKP{i!yCWaZJ8#l4aaRv!!J%a zk0-kW-4c?H9Aw;EZ%>Sr3+#XJb1&mqoE`&`bF8WO=?{Gzb1{wc?bGm2XKP_8II;uJ$r_*}#kgV*0Xt9R!@d>h!3 zfF+6&Hie2hVP}6(`CZ7ab5+8&>F!BP$rP61Y1L$kB(LR|X@7^PE)+_&$*TizbBJb} z#2I|~r$ywqDpPExfvy$#wx3Py3>eo%^Y8wfLd&g5s7-BUUsAShC-S?dPe)KEl=O0l zRwj#|WXvysBt14a?p4~btkGna67_^IOxiJQfiqAeyO)2=s3jRF=cHvIaNLqLLQKoeh2`OP)svO`r{bFe{G1}MT~TBOcwi)wz2At}ubfJGWI&fLdJ{>Oh} z%kGr453EHO8*0&QQslEP#q|}T=J)A@X6g7&1$Lu=Ufi-gdJ2WcJE$|H%-T_ZNFk09 zy5a2~jnsuN-mywWhmPKaZK{oF6s5IZQ#Tuo63$2D}9?=ubfX?cB7f=H9schum+Ba`8^or34^Q;0JvdpD@ z@)uT!_*dr;Zc);Xis~Z5rd#wCarOBlB9K0w@#q*T5wi_7-CCL;ocm$rf7Mu9Z`(E$ ze)oT`;DQ*E7iV*VZUf{x#?qv#u?6kcB*0*00xi)tQJNA+%8A$IzmL?-x=^y>G`sl0 zmPPX1zK@6J@bx%Y2AvLtE5rlnBH+9WSF><&?mxIcc*uKo@|_0U*5<%5d?fqj2!Pv{yF?ET0V;Y!ZP28PcS{ENT9?sLVx z4@D4)s{+ku$#Sol=Ghn-ZNJVvK*-o)!{ym`R9z2~FyOWP;T!mbKC0rvQV@?p1|4u<> z6o?!G?h-QSDsF#cXhWYsl|jc5nOoKZC3sz+Ii@&Ln4&%`udOFy^G4Q*$Y6ibCy?Bd zEJrB}h5Sva^{Cya9EqzqQJLd(S0$ONW-}zC%9cWk%T4hx4+z}s(5wtKcj#2)$~%U< zm!VVf$T5xde8>?85{96+0f`;WylD}nToRUPvSwTdq>dlkRKHC#lB~%wqTWyF6($68 zB=fSz%^o<~!P5pl$5N%H!G3?xLvIbKD;?6H{ndX2?j_`a`T}f_05gQ>4&3vm$A^Rr z7{8FwW)c|BtfWDPM98R?Lhcr|wrCd9aY4fC2C_WCs7Au&^|j~K(NPVv_G6XG$b8u* zqx?@fws!)~jilVXXILO2%`&QU^yOh8=t&Kj#a?$Xra-7xMT9H!VFPdTwmzGZ>EAGH}9MyR(Jdy|F2O^8krB6J>-lny1jemXMLPFq-$Rag;+U>Kd zKN{Uu6AGT|Osa`PMNk@p(bmLv$UY$s|FX|I?DMYc;7_`m%;9YBXk7VHos4DOUjBCe z{^R8Ocjwoe$>nui;TM0msEqtAVl$s(v3b(@k%(C%7VUD=4j5WE33Kh-B0Gh z=dL-0$A8-Pv2%CSGsl)~TjunSuKd#*cOUUVe;XC^P=?Z7R@;u~yvZV+uatMtCKWh6 zxvMyr!*VM-E(CM97v0XUNktFx-A=z$)JrnR?AL21gRWHrR??Th6Alj`dz>@7c@;lh zTD5^~C{}YV3O8 zYjyK9&?cJlY1?q#N#)U%j9&TF$jV9sjLve2Tjk^2wSoQ|$xW!-I!v`=X%pD3Ui?%f z^onWNNI-eEp_TGi2}cA59C>>Qe|koVFVmAB%ZiVd>lpl~X9vdxle4bAR}RU4%4eIB z(JyP|Risk#HTrcV^_?)f2#RT&H}I}4ceBcT7hBV;CH*x(Hw#b~bQ4g!>bkO&(308t z8CkNe7X-|1!U^kp-tFa9)d|+G$Yu7n%KB1T6^ip>^W(-967e zwr_7g9EX<0X@DxEF2e0;6x>Cl12J{K4sp2q`OA=g+I6mHfhYLPITS%CIC5=9TnQhY zQ}jcWUCWBp3ad|q45-#9oy$mvkFNRS${1sPbh^( zSK|=8h`aGLOeE8IC5;j>M zgUY2L{*aXUjE@eed#_A?nZ_i~V!J;=y-1F<+ub6cA$m0OQbX~9{E1>dc7Q5r(#p7LXq4alrX%55Sb)q>?Qqe~K*7zPD}ulTOMouMgB|$iDo(97>%=lWUB}Dpz{@k{R9oX!r4R|7A%N_ zGL!9hqpTOw&U-CDE~*9f1K8g$)!|8HSmQu_E7%PHi*1wL`P==ZqwqOdKJr^((q$NA zHuS-M=_Qz}YZn5|Gc=nnW87XYbpf$|D)OwqdIE1GbCH?O|J$}5 zODW`QbZy5|7sIsq!Z^lq=ap0}wO+4Y^|tuYQgNJ|C+$(Uc|J*$r1>VKUzi4oj*u)D zNurJV16go_oYQ8@%}Tek-!{=UzBd4`gvXM&l6cSzGQcg7 zFaef-hT&KP(q%|p@KfeW8Z!_?UKc>?CxcPGcHFizw>mm?HDy4>>C}X6b##pDy^*fW zNUK&kktt_8#`oA0(vc+sBo7I*u0&QbXzF{_J_=VW!WSM%IB^}NX|;r=rRQogS{-P; z?Y>dB8zO_)gOeA+YM%fVQ0QS{9Ol6t4MSLe5)3gVA;sRYJnTg4XjqLmtx$7*|uTL2;E}j?ubpYZx?P-Zl6wdO1AHR zgn}5ct;6j1bq zs8Y?4tio@d^5tFfzp7u+`Tv2^8R#PmCsOs*s1~lH$_7oJ$5H;M$vAY*)~x8?N0`oH zOM#9&kNQahAJsmRP(S;)f29#YgTxhoRjzV;QzAkS0s<+R&H8whU%~*-Pq#Jiz-)l) z?P`cCWeqpMK&?mp>~%z$1`pL5R|+udE76-#Ut*PX$~-4nKZuBEwE|6f0?RBO5YqakT&I z$~ou{&)}7LJGfO7++@O8~*7f(aBM*Mt zJX z!DeWvQKub4|8#+xROHbhofAXzbZWdY#~>4eXY>}cGwW`L0aHgmTE^5vP#P7sN_qt3 zBndGm>!fGj50Tc0( zS6TYj_nqZ;Zo)bI_pgUj$dyCV3GQQOHKu@yt*HJVYa%9p!lpea2-%#NHbY z$uwqVShV{q5`5024jGXOKK^YMlPKRlrY`|6g_rmje~rENMvmg~{yrnBBX!3=Qi*jqy0}s15vzk_(U&Fb}@B zINPXg=o7_2V6!>Y8MZEdD7|`wi~*hxNsOH=xp1@Ow#dM6qa5a^Z6c_n50asx%n~E< zCg{Zke{_wPptm=e;Q8je-OpjECdIhjq7rcTgZ!=+^25o&z82}r44gpUpW!VOA5(2RJ8JTkY&L& zgO)cyM6z%AH%>DYgcGmLAb3IUZAKVL@93D5r!DYG&C3j;y?oxswA2@-ky~Xq_q~0h zY)slvF@){B& zIK$$42I{~y6P=FBpU^zCRW7Ax)C1wDLQDr6`Ib9>*}rd zz3+J&{U{%j&fCy8~l8vFmdif+R;}M%8PMinS5i3IMN*Kg3wk$Wd zAr88Q%@__}JUx4MdNLfE?EzVU+|{IEw`JjQGZV%r$ao(hA}nKw+F{C{q`;Q8)9jcv ziZXut22w}0ZJQY}->Vd$L+Nsxe^=K93mZF<2x@nEAX(sBi|i{lhV&!8ew9gD5P?ss zOw>XMNExi<5O^lCSMBpOjrDX^k(KjUA-9)$FOCftAbp%sbQ!@50DrTEZ!|A$%|WSA zQ(Hy`OOJn*Nmkqs@MLg&1*(~Z4)~x{)NEA zC@E2$h)MuVsM4$oMi{fBW}l5r6aE0cu?*;;I7gfpv=_|K%6Rew#WD72W$47Eho~)| z1qp;!$4B0M8#xrc#XONbr0Y-YRg?|_eqrH*d$em7#mK4oNHjB zJUa&SV9G1FmMsxcq4AE6tZQ2)M^3YAZ6s2NGOsr>uhe&StZq+{kMZ`9h0;=f_z zWMc*hj(_>3%-Y2$sGxLNLRj64+c!OB`(?f)b6t}!vQJclu^GvQe-f1>IXyJt(C)B~ z2JUJiWD_)LDVW+Am^shhnz%@0(63X3wJ*Hp)L2?jx_KjwR;vcK;UG<8gVBJ&^RU(t za>RUfsnTUe$V<&#G%!bULJi1pB@1ywQqI~o$Di)^RVs%0cx+QpbMh42N!}7?#KiWC zvYG6AieJpkpZ1jEf6d;RvJ|^Snc^4&qMS;vYdfx%og1TNJ5Mv7XVMw^n7n#239?-G zGdFlY?0(=Rn7F^s?rUO_r8&-FVsPz65DZyIBZ@NA8j^-tptcCll8!-7a{58IVl*x= zQ228ijo4pVbTJ`Mse@aQ>`Q3&exTm&s<#gZa@J4yb0!_Se-2zVZ1&V!jgkkAaTS#i z>qq&A8U;EOd}zhJ@^}h?RE+T55%18WtNy^- z+G5XY!5xFV11b#k$}mGS1Zq$vmo6b=F^5P-Xi8jyD^NQ+V)%I5-X69df@9c7Fh<&P zJy^YY8%I3kf3N3y@Y7FGa#2jMI=-okMlbvOWEwtnQOIbvnG)^f997)Ixo***)yoVf4A#1w!t7 z<<*5+&Eo4K$nebf0ci;8+PVbDbM1Tg4Z=jdX`(gy)AQj76`*~FC<)UMs7emdXFd_l z*BPZs=*~VR7VEe;2vG$>0GB{$zhk#A)8H$pHujyXK>>HpWIo=mG6H6+KH)pYellyf zoOsz?Xs&GDW`9wEVrd7!;>$^)1zY!>25v5^+HiQfYNaE|v=X;g&w(!PY_hCtbHYpr zRc;A3RNR*D4X~x+cMk?lSb-y_Dz9I8?;!+1d>Qj+V;pck5icxWJ%$6zxj?c%Z|1v^ z*HRoqO|!(^3$i02C#mG-agdWmO{_TgIr0v+=caTIhksrrg3V3{u^l??5E9VPWizrR zjyV%{bS?lC9>E_!qEy>n?=TV!V8f+(d2bseN1bEU71N;5l9F% zTH%;>S+1qB9FvgSS2%7X(%5`!tJ?+JC`lfzbUA9~i)tGjWPsHtyfIik)9vl)vMN?X zKMN9^Q-5aO@RqkHqy{T<1GH@n4X>R9U9lo4<4T~s*^<|=CP6eW+#yE8#lLEx!F+=v z8R-p@Vc@pevsi3QqGqpaZoHrcM#oB)eZpxQ%jR!tMb@|H|X zN}dscBY~L(qciI4NWDL!4{Q6c>sC*!zIC-j5TLcy8|5!kI^O8<^;v*5!A5_Up^G7K zDx9=i_kMcV?)TqreM$a3>cPMMVC$gU`LJ`mvvt_--;-bCf5^M;@#ei&ozH@W`nX0l z8Gp)tRgFDjg88)8qcTxOMeSHywr;ll&CP;vp+6~#*^q4N4S!yu?7D460B}Dgl{q<< zs}|7QI?%%{GeNDx7LFtEa1f;(e~=&EJ8soG*0)KC8V8C`*==@nDB@6B?|_rs^p&lGiSG$Uar_cI-Kw&}=RmdPsR~|?HKLVGJga@o z%#zXMP+y*}-W6N$Kgu8N|?^B zdF7AQNX}<{lR=xZxUu_O^M8St7fIqU2*(O+ZJ8s%8+GcyvjQD>iLxAbwB-a9f0i#r zOR--2IzsWtTa$-Nw&MZvzU(C7CCI!}OE}DYipAuxBH!3=US0RMk{NYLtUr-tvtjI1 z9ZmsUAb!(*Z5|jfznS^N{Rk{Frej#7{K%KFs@PrZywWoVTE( zWm0W5B0L_D1_FDvdjn|vYP=7MX!NtU*#Ch1qMi?A97gtfz?qHt{pPajhE>S{G%jsvKjb5;! zY{R>;UC;N%rPtMv#`Y?ES3Lb*ANqa|0Auek9+gy=RF=n}45OCdByjaT*1`y0T*? zh)o<^!!pZZt#I3f^(q~L?U*u_0#SpG?sd7s9%WptK&1!V^O7D}#g7~_<~}M+p9W^z zV>(*fz_#*0hp-k=AV{xG4v2aZ%LUsTGgDj+-8szDo7K7eE1P%qWL|x?s6|tb)>|66 z)4!%pTdqD%8Gq_{ht@)W!z38FMZF9V0nQ~`mJ|QjYRzYH6e0^jz5qum;Fv|2zaiqP z%&~{6H4)rvsveqVce!}*FMP0kq&ugegt^k7hT0W7OUzFUb5P?0<2=068Se<338=Z= zFO82#=z$|%;~{p?XY@Fg)yHkZd^I&UFxYNFm7Zx{XjMBW+F*60?^Bo)64eH-v^Uq8zt(G0%K>dw=SNn*c}C#Y7ax$e z>q-iQ@_$E4?aY(vXjQ%$*N4P8sxWqa+xD+&%jPd0<3{;6t{`QKspT3)&k@B{Otg(1{Z7o`?}4xn`TRSyve2E z1%GraDv4=++RAy_37iyo_wKdFQ3pGud%VQzD`>3uT~hq_qLa*O9BQ&B^Pyb=2yR z*Po*dNYGw-?BxmFw@^NZfnUl}1K0&&u_js=bQd8vrh~mRs`b_fxk4pThCeE!(P}D; z>V#GUxMKBf}$Cv>KxTE{{f|tv2Fq}42JhSg$IUqK%x>=hohjj3(Q?ls&a|1 zL`s|}c2rQsyZ5+51qPPGLu|$N|9{D1m9|MK(g8VXgYdO3p()?*ac5pE+JE`ev(>YC z{kacqq<#GnLyCkXT}2!{)@$?$bEQ<_5!)L|MTYb3M`zrSU~W5*>TbOYDc!JSZ3K+h z%y70F-~o4nWEtv_uRkSlA$bg4e~i@4uTZ}Vx=1++8bJ#acO0sQ+tPSvpeiv_C0vL0y?OJ`U9O*(Q4Z;6n*zs+?I^m(2fl{2J@1V zjY0FWm-ej=L6xs>MUr5dJxh%WJM1&t{L~EiHY}r1b2G+DS+871dLZc*F$az^xEQ!YG zPXuPPlD(KOm{fh5f+;*L)8Q}bnfI&RbIm9e9jA6zSgoj`sAWfWOr#|1Aym>QZTGUH z5E2QkAP!MP!NdqM(|>g4bCbOcJ0`kf>Sm@;`@Cz&m|8Jz7W(7_?tpi74c{DEk_LoL zw0n-}TgdFpig43{8*d9+S%I7JgYh!x>Y0t5aGIPAPcHXnR-*oGYBf%lCef|#w6Fr= zUgyPh>XjZgD**RF2f;QwGJbdCM<}4UM{-6Uwyz>8_G0Y~8-I(Gs5{AlDdpkzh}neY zNqFPMNqFnVg@-j%wn1YiUC^*M96dx&@JM+KVc)^>o$MG` zf6jB;i9+Pi(*;m*o9Hi>@hJ}+3pP(lO))VvO-VE`m(IQo8<#=y4Of4yRbgw}FcAIj zUm->yHY{UU8B0oAw*2>u${dH|l*kN61cfu5-s^`i;wkzRllbbx#~8oA3T~g%MDXWeBGOE7!WFEz6pREj z!ZMQkj-%xn)eEgMt;&Dtnk$kg(1m{**iW2KbqZYs69$p(bTK#x*wxuU6&|%K-$^LP z3`Gn}iEPaI;~*GWPS;ow)DeagzZs0n@U%~blxQ9)DmV(m2n0~M zj+7f*NVILoZ_)oF9%pEKR5ULwy8Rp!}g# zXKHt+Y@B*Dg5nkroIGAcde;hmzU=$NOn=O8!tdALW_RIuxg7sOe=i9G? zcsagXEIrRZ#$$hPD2bW~CUWUEeAXLMIVF+E;oFVfLkKxhI_D_JL8{cP@QT@Wn~tlA zvvc~H;_uNy=l@q&Jp&`Gp{ zugh$FAfXr$hCK^=p}_!*4Ve9dc{SR*MS6E%l?u*mcmjW3k^Ul{q3{Gilm8+jm7(R$ z()c>$n=X21c83XG4r9k8!J4U8(Msb6@Ppziw9YwVkYa3(TE^Ku_kU}Yuf=cD@=5E0 zFB@{3KJ#pmU&3#ke{GIUO9L?whVS_mbLe6BAShG>*ALW7y=sqvC7Ye5fqXHUREzY# zn{{cC>U)2hkN2Ht?jF-N2@#aXoRmiBSH%y-JjYLcGvc_sx*pZ#Qoir~CWgIyi9W@E zfom0VbSPKo5>h9Gb}DCBtHI%0{K#N^a_FlygM4Kq#gU$jAvB6ndA$|A%n+mt&BRuQn~* zf?Si@A?1m8&M?!}Gf;P06LO(YT}^ug9>h1bSXpn|I1qmKuV8@&wz2L7v?x&LK%FLa zfGip$!oJi+po6lAl}Lf2l6ZIX-%Fi5bdYhfez7FZ^$q9X@bDy!(#Zt73CvR0hv0Ud zCtiQPU6BX>a{z;nA3g={`;VKOT@n(!+nkalB^YAHpKwNExLLzEg>*TYC2>)-0x=(b6 z*rz1RBxrvO5jZ5hM%#$l5dMh*8?s9nn#FNhc6wKYF_Jum*2c_=($-Qdx*B;U+0vc% z#H9la*Z+IzZIA9F#Nd*Y>5(0IBo2=$rB2HBOU9kYy4{;1TGdC6DRo8pH;FngsC zNQ=dfMU>nF4DZ3_#VX)z>O>IKN`Zf0#7&ZC3}C{52LVh{wtG9BFIz(%+o#toLfM;R zwL;4F3nmI#PI1LieSPe8+E#U%?jc!>qIgUu--vZvbVW_f+ASefZC!xo11ifW2ZQrC zo`Wx3L>y|S)HaNl|3>t3n60N&H~LRbdIZ>dlB52s?glT7d8{W5A|7c?FM@xUM~;lM zK;Tm9?)oF>r+NDpMz{;}Zgzy|1iuV>cq%n%v3q6F7kkI5wxWFCokMvqn}hh0)V)=F z@kA5VKPs}kwk;~sItGYFR|l1D-teN-$gBcVJIPe;=|o`v@uM+yj9i=+YSYJvuN2_UyP)6-&!5|eM@aJbr$99>?~@TIIupXSIw?I&0}cPq#3|FPN089yRi{z2Xqm( z+JYV;jpptFzr(s$*Y6l+h|yl1qp;f{L&4mB9RVzlCo0q4P=zsOoSHThNM%gYu_}w> zko9q^SHyE1pc-oBhaTO7?pR5a;7lBQs42v?2~uHs#(~xfW>?oBysK)AogvKHnYMQn z-5`8hR^?ekwg5ld(f5Dy?A%#sld$x@`r)j9@pndZIRAeJ*`Yha*|c71$6Cg1e+$kY zQs^@n04@*^j!=c7A(4U1jT3NvG0-?_-^sV!7~|9{Gz`jG>-RimkFA1vRD9=x$TV7a z6g3$WR=F}hKKEQl)r@<&@La!=vW4Bb%QC?3DtZd+zMC^E*pGjc-@R1ZZrd;nefL*z zMONEDR;)ma0nOTC3kGzrOW&d(P-NN>CQE`YO@kr-KKYtD>jf>g>BXXC9+HQL`h2a| zI*KGM(Q3*NmN&j!`Qod(XP+|6&Q8xW`tgj+wq>s5mP}Qtl|<>nPFf|9+@R2CCQ;<= z8@#{WGt`bNNxpx}J1Thg#T32_fAklVhzV*f+|rf6DGCw&iXbd)_#Jf!qu}OoGCWhY ztA$IL$3|^JX)=b(D>xlP%#;||)@=pWmh?g_S|q;`oI&m-tB_#1WC70^&s-8dTo!HM z5F(DpK#if>LEJ@J12xH3Yvk74ez@wq9_C#wo)Iw#L#H6w+Vrxo5NqeGp1IoCy=z3!2Z8sMw93R8GKaPQiCQ`{z zype-Zcn+yRH*Kc%DWoI_FFhz?-jDd=1@Iru)9^a*?mc-4 zyrw-#;R3GzlGL6h^HAztcDv{|oy|=Pfo+NTbspc%t4#2D{83a=aO7m4xE3YG z*H}taea|!c0P9bv6IDnOs`Gfm2~}pj=^qXHMGM}(9*_5xsh_Eso)q&QXLL%uA60oY z+~-+>k_y4&8~(`3B7LuNQ`r;E#(}`!3`s+)sZ;2rWLiV(x04mv)F4ka#0TnfHFJuQ-wINT}V6>*J#eRgS^HS8O^WD+C`d zE+NiXsWAdS6RKivtybGGY9Ll&FGrC<@T|}pDOhQ=Blf}CV6a9T4#TkH({j*6iRppm z`TM;Q#M-tYr!4Tlb8Vy)iZBJ|4xByLXD|IWu-4D86XT-IVH=!HhD zji$2Xt|Y*1`R}*y+Fk8R!q9)F<%_Yj`@FyJdVjRMS#E5^{sN{;KY(EJF<)Hg^TXsm z_{S7ZU-#ck{oU8&&#T2OiC5!y$zqwrFwXFQahgPM{1HY=i1s!%@^p>e?{btTc=uYH zkM0Aw%)%rdA1CuLkYCpXcbaF*Tz+NWKE)YCGc1^Af%zE*gg*B0X%K&(hrA1j7Gdm1 zdmA(I0fNX+Q*efoIf7|==%bBaHvs-y=GRdefBACArsPd^`lA!y%1 zbe*KIy;rsP(%7+@)Ngx#bok|8Wc?IkzA6^}n|vITm2rX=ek7Kn@Yc_um2kZ0)J;@hSTf@uY2{+^1F98J~E!d z#WGtRvR4Fp&jh*T79kcKmp_ggdMDFwNl74z{$= zN126I0)Q&X6f{Huc2ENQr3szM_&AKMlEDEy_2-bVaP`&X0b3^(DSkQ5P;OF_$uMAO z9o~jXo}Mt!#@m30ZuKE%H^Z*UNyT8(s`shp&$B$H(Gg50)bvpvWZw9h;-k=G7ht2L ziXtNJf?1UKS*3sJ^uZ2z^`=89Wx9E4vBP-hsJ!&s>ng>;yXoHqF!{BI=Y@2t&a@VtBU(yCUJJ zgc4cqf_=9ZN@8HdXb~jNqiD~zszS9+gf<}(Dqm=l>>YoE>3h5#VauL+9S4<~@6G%u zg;p{vm?=wglq?l)&MKEMe8xY?Zmd5(8 zW?tuX@+B|4x+qjefRRd&zi68YQbb=~ zl_;`ZsMUm>fO(mKI((dGJK7ptpG7?Nh`MlrPzitADCyiBh*a7HsH_~F;6zi_kVd%F z;PLuP=bD$GjUg%pYb}{)tdOO!X^~Y4otM2euyKcSI-6nZtb;nn?@0ENvIQdp6Zl>{ zkloS%c*HTla5%Iic0kMAYfG;x-$yA< z@~nTzaPX}bCk%-mNw{2gE2701VPdDA#|sM3E7^Mo^Qhn`cr8jrCky9r;p4a!&;M*J zs7BJ$^i;`GO0AK(5A7(@@E7Qafl5C<#%R2LmoKk3_vZd7kkk`RdU!v;DP6|a06%fl z&U=2ks-EHkI-%N``AkpacpOUC9JxJg7ao75PA)1eL&s7hqay`oV?h}slqS+D<8g{i zXQRxtlb17PaMPFD z!O9y^&!6G%4k}7b9e6=Ze#R1t3-604f-%td0`o5l0SbL|EV*O;=w*SsTfC<_@0L8GV)i|j0*v>gw3e# zyBJq0Zk5k%wzIA{I2BVL?>b2$WdiF!r%s8A#SMdd!H{)KStQTzzTm(#W8w>$l$w2^|dUa!GT(AF91f z#vlBPD_b^8h~2MXw{x^UQfb*nqOnxOn4)qF6)BLalBcrN~X{w+Uph~-LvnGRAb;)ph9%)D;i4;J!vkL2QHdTx{qNzXVb{%DJz}~2Ehfk z6n>OWU9yz(FP{7L?+Fp%(!fR#BBzOfsb0NglMR6dnkVo8p=p^Dv`Kpez3l= zKQ+X}GGjrY1&cMZY2vbnu7h%)XCZ{$IlxH;YxB#}0n5RAC5I~Di{xDr<%`(syPQnl zL#4v%3X428?BA3=S1Cy?QV^Oa-gNfyY;tsZjFVb9D3+2#DIk}EYpFfZ8b4c)SlS^h zgBM!m;IzG6I<9}J%s|!(#x>|o@4}1*t;bZbfsgI;_o%4(war1v25e^xtXeQGx(=+5 z*`3V2Ka7bda&lS0&gD1ZiC&0ZgBf-=cwl*GBYz5Keja6O;Ne$`2ezjsrU#4jm{&$B z?&Dx2K0^M=a3oIRRr}gUZ89a6uslK&z17=&Hr8Cl`sE4NVDV?Y972+!C^xZgzu`yEU(Hx_%wwwZFvl zY${8{bPMBwKr#Xd`-DvL6bHm`kuN}uu|ouKpG8Wc6oe^=lZ?zAUbdU)`Z@I@g{Ryq zF|-23m6^Y~RwN^T9jz$Wl?<&ca5O`!Z{yh~6t{mjW;9GNos*p2Fl4o}K`A+Vz#tz> zDhZTJf9jP2surP@n|Bx$Xye@d`Qm(X_V)ec_~^rhDK!87kz`oRSO>|EtRBl9Z+1=I zimQI#gZ}QWic7zFSy2$l`>Zu3kgYPqOte9ZYpk`?!UAi7s}?4+^%b-@uYvqQ*4aVbvclEy({?Zw> z9>PuaWZI9SYd`o2?<@Rq3$q*Cz|u)3EroyO#e8wHMu*!qKRFN(ulir@m2w8}mDx5a z>L~24K2R_-iyW4ODd_@4D<$t>7g%f1R&2DPw15&3Q0&|_HE1G9abJsF!~R z)ycwNdWwOi`L%6u{9K9m8;ys@2s`FNaz{>9&}PTT@aEt?GG@t4e%ifVRixUijZb)u zqkG%n*El6naO@8aK(5?Q_EaBn%g)xkf85i!+BOmHnc4PfR`{^-uq zUvV*R?Lsba0MA_UVN+l^f#*qKs%(1UE90jii!lmjGpE5dCqN>=dTXnQ!GsTF>H zDP+Up=gG~7>)Wfl-$QJfAMAfl1~7cW8ZEj^K5bU@!xHe00>fZP@0nEc35jjF9uAG4 z!C=F`e$-s#OWOxBm>e;o5DKkp7aN!8skGF8%_?^HIHbX98Q1e_L|VnPqpH> zYP~+2Q8m%}vzFdgu)QP~8Byp|TdFye#?I#PmZFvEd;ORq_OPD48M+A=Wq(+-E&d-5vcOHM5-T9hc1C#I1tMl;rsaWQbdRMs z=t5RXqb7o4(yIV&YNCG!yLHUI?atVO@{_&~Vff4B?(+I$82X1N!)*rifEh0?i6LklFF6FK)Pb_RY`d#H>^L2sRQ-LP5s!lvmH z;}n8-jvK~uUeSOx~x;&OpO^i{V`UKQ^X&Cs>$o=G= zVg6&C_|ZS7JTLY$?t=1n#Ow-LRduj~Mj^*ha+v@KS zrggj>pP;G~ybj7vdDwad)#u91f9D$dl6S(*!fP{V_C^z*1-5;A?WK9o0srFvY}T56 zCfki7^YWA*%-lwu+bfM~aLeuge|6t=l-Im^J$)xb6;I0~p;&M5pYYy8#NUANghLb^ z&4j*cJ^6neb-C2m-Fi2-Vl(kY^)cJbTGQd0v4_T%5^O;f zUFW_LXI1X-t@UcVEwwuG0vrqlEmD*g)_tt={UFdUW4vz{qdI;i86JgyvqIl-(yyF7 zbiMNodw}qhrwY?%)RF9>#z6aF0zXZla`SjvZo$wT%AnbDW=- zrez!pl*o$oNuOk?>&NVnSr#WL%8Y~vyXPX^7s-=2hF>C#mLESyWU&lhPH8OoDflYV zOmO5%OI!+u!85W9bKkNG`3CQAB2S4@m?DbSWY^HL%{-6bzO53X;yk4+YQ%7@s19-lX_!AT1FQ;*kgZw<$ z3&CK*NS>6*1~Fk0hsn|yoOc10JCf(*)PaAwZqKNE+AkVv(;l{dYjkd<2}7=}7Jg4d zdF9!2&?JzA2k3$Vksbdl@k=KE@7}FeC_|E=GbsD(#5dbAYSYiUqK{yMZYJp0O8>NE zUvzI!ksu{UM&0$x$mWV>2@*{0)M*n8s;)y?rM8f-xtU738{Z(g3mf&gTFdPo6bUUS8`r%k+oDR0Oe3vEGC_23Y zqBmM$Y1nrL6`&7Zo6t0qcajsjf-Ruhf3>rFmT9NXphB-VQXQ8B1+nK|P%so2LK){c zgvW@)7&4(@WQ2bKnR0xD8!SYy!hLX_6SK@6w+k~DuMtjl2V5AAY)V~l?WU5kplic; zo%>RXuT-gteNigKlCwu@iSvw7O&zf$323Ou+Ewlxo`Q8X#!~$c$nF)XZV!?7%C&kL z{a4AZiM(VXuBp~q>%u)TSR1E*$2q?0L#)c{xznAfLDPTInkO<+HkFf>OSn;mUfKp* z`ft{(#lC#0%2zowO0bz;MRY<2vaCH-yzQwUnp@hd3&rFGv%^JMx&8b7@nrIAqB+jo z>hY|S>z#i3dfz?Z25Z2Wjwd%)w-?iK4QD$N8?5_Eb?p7Nr#xkCz4sO=Pb2ip@t*)MmUE;znZHTsUDluno<;7 zP6hHwNT)1e{@mDLQ;M3i|%yKb9c|_%UC_CBmr76qiD{^!%tf+?DCsj=bsB! zoS%Iv=;`@oGhdyu>j<(Whqi&}3)D zQ~XOplJ`G-NbtM&lbiW0E!cc=Ud+mZ5mv(!<3&y;7o;RCAuOI>vcE`N(}ErLdJX>y zRq$qpS<-$V?xy7m|2^M}rmF%cq!MpyOc|-H*RNFVL2GhaWz9?oZ%Fk>V{)Dsys1e0 zdJh(af0X7j2K8`_Ilp8zsZu!eeHzdqToo~{i|Q6fG-7mF!BdUNd>R=0rKsbx{9JG1|aIH ziR%!)D9hG4gpN=UE6_%IMU=}W!4NrH!K7!ovCi~buT)eWu_7v!$XISiVsFs0U?AgD z*oqHLQTPshL=zEf#F|-ztBi+(fw4w>z(kgjDoP00g$x8#!hoxD{!vE&t^^-OKZ`Hm ze@#lWM*8*k2mTgOj@qpx8Nre$I=?!-xrw5|;nL7z`P8qclph?g#dsqfx(XD29eNlG z9jHBoF&1}#_L6AfrBYcHG2uMiHFxZyC1TTW+!Jo2)*x{OgkF4boKgu$Mv^6pJnW!1 zL=#{?G0v)=ubSXzT!PlSd%qOw3U|ePe`(8+q(wz=JVjy0ZOl=h!r33gDd3E|1nnmT zLZK34JHm|A7fV?PI*cfsod?G_5#fd&R=B%VjqI4Z#uYFCir5*b85|r}1XAOX{E731 zgqA5-d@giAve~LdPEyWE9m+`W-re5?ZE?8oWTtcmnhfUZY`a@*?F&S5=oeijf5PmW zuwQj!f)mUY@sz_V_JP+G@u{a(@dYvRWycP&y^n?y4yniLGz_F`s@On3OazmVrkQ#h zW5$XaJrEEzOco&($WRc=Jp>7rAEQ2?LitVeAb0ykpLC~oS%2VALCb+8bJmOQDLOSb>o_z09{)r}VT%v6U=;-Lk(&SD0 z*IQb2?6M}$Ut~=&->hGhU(4PW4$$*6az&~kdSp|~jS6cw&b0~9dgmRme@3duMl$A6 zfJTCUU4m#m%fbc)_EhW$SISi-kRlzM+x9GF)Eq@FJtjSzTy?&?d$HT+sc@3AhHPYK zLU>%!vTbz;NBaQMRJbw9DX_wS%ION+642J#2AD<+TolxUj17KZ%v{bZzx=z z?CE~id-FaXuOM3De>Uu#?qKMSDJCbJaeR4q5_U#>nusoLOwWV%l5NrZ7p<0CZ`v>v zfZy{gyoxSC1yNADPGyv~R9d@r7nSabR46zn#FDWi+kv8~|9vMHATZXcfxM8|KIi-F zm>hrVMqy-G!kd7OJPKrZ8&5{@_*y>GGavku=Be);pSb<`eda=?{S-&lUSESg~Ge9ab4Qa18GO=ol zN1Ra-#DW?o1sM)0GL4FfCLaRV8FaBO^c=Z!`hWY>tTj_hhROa8KTDJF6X zzaobTLn<7zYh*U7m{0=`UURQs%oH==xEfbnn7}!3pPQq>p?`Hy%Tq1L$)&)=N@OYi z=W`=xVxLCWI~zT)acD9nDtSB+yG!*FsXSR(t$PUee{6NL2dhWfOA{2$c9QzMk}B`? zQ)-qx7OiR|eNb|?lVAJLzfBY|4>=;uon*B)g{A6StWue?gAzyu+DNqn^nz&M-YX_fwjMjr<6C}U~A(U46QKzXy*Mmilj2&uaGPtPI5vZola+S6nXz1 zD|!wc!ZXuGV{KQG4wEvEHN5~zC%O^eAo>JT``B?9W$Njs^J?E-pBKck+&S6NS1qd4@^4YCbVJc89owp~7m;&#Cgd`35l zO&m8+;Q1S2&EwWd^&cY33X&NeYFxYJq}GEp$_7r#Td1T3=OHgRS+V(hCl8Y5Y{=7M ze?z}me*o22ZExE)5dQ98!4z2}197nw*$d*lKy8i9K;U#vTVR+5ftDzn07Ypcl{9Gb z-%C<2q-aTYHzdIHr48@77as4PJD*==n`|_qFhMMXAp*hgMY1Z^Z__W~FA<7PPkxHv zkEj0aLlUR-!GD(~SxOP*;(wH-1o?BCe-(T>8WrqcD9^rxDC0P#!pt2cIP&s!kqAU1 znEqG8*XbIEhPjYH#(;|YMjeg5j)3^GVnuKWLScY|&))T?S+KZS%)kXWnf3vevp+t~ zm$UZ*^rjbd^Wo$CX5n26&}lDdej9kprT3=*{n`s!%zpDedT*~)P(N3&9N$5Xf54%9 zLhFca(wv9#by~+s8rjGQ#jqeYFhVTMag{eCrnsP?JOn|Y!pn=0yW$^A*JT{X+P4Um z7K9uFOnK?LIjJ=aH$vt($4xvHbgZ10&m=z_1J@VY0pl>|EV##f<5rHH$;26t4Y2%_ zOc?W7u@ZVU_RVPgu0i72K-haw9>)WLMXlnOqGG2tlJimXqke?NR%WuLcr z*+OdWFjP$K)OVD`g)9l#!CQq@wKYQ|K0DLgX%rYhgdu6E#9mt9hS<)}!3lVLtW1hO zUby>wCfJYi*mcU`08|{WeqgTvWBQ5&Et zu?A%u!ZvSivvvJ=6&y29f3@ov936p!>JWzV=AR)cko)3HHy28b;T1uEr(gr`5P(h1 zs;gVWQQU@aP>qOER6a?02>|8W6lj1Un@lXw8geKcm)ZC~B}4a0I~$O&w8{kAk&3zk z5r1FKS+^dz75u4l+OHA6tqRq(M{$4qxNqj z*Lhd22jY@~LF(%%e*wQut!6>lY0p|^x@`&u7FSUH1P;rr_Sr3^KaXcPhy3>bp7ciiD z+*xo#V5u|-vo!R%snC8NLt}eI(JJ*C*Mb|nodLB+UQ5LmcBtwh)1kUOE}ury zHVj6hZ343BiBgkb&3_+Bi4vcZoUBQ(1PC07ypMAqJePidy4&mqgA{HN-N6Wf<;P-s zRjhv^H_?wVir>EZA%?Ht&M$7aE0W&MKalN?q$thVr<9Te%|E5PBAYvdHrLX+f1aVg3!I_&11Zwnc*o@CXITbsr4Nqxe+VOB;#oq(Yg1{8*3k8wZb+6#MQvnp zmEZ`hiZtS@!Eza~J$ZjtM0p6gU0@j34ufMbTa3iM(slkb%r}^hPbgB536)KwQqi4L zoxaObXz8jU7N$&_7ZnJ`;}yvej5a{E2S5sjI7i!&BAEZ+62xoAP)*d>H}*JS!IY&`XeP<5-ZMT~qx_tmKjCOG zG6Bdp8My{2y1su$_41_Nb%5Br-os`VO+L(%^M0EoGPn}iQUR1SclcKs3 z=ICaZkQjx*H$#!SnU{$yY}Ytwp+CjI`OwoCjpt>S98C(&P^w6g! zcz=+7C7I=6-RoN6Ytr9v_>zb!vd(}GOCC63^q{kHx@bF2{?o}q2gHJx#kPFrY8l;J z;)%OQd-HG+0AB-fdDn)k%ya`+`FIap%|n5Gd~#g7y0Y}L2e2;pI%@IaHYGcXX~?@y z6-Iu4p|fH{)xPsV337e4B!h`C8BR2$p zcHD?Xs|k86Y_AqQl2K^t z4zCR?P}(is9>zR^V#|rZmOV>q8`k{y$?})%I9b_<9ujkpbnd<9eq4S?R*7Ly6k(Pi z55xSEh!$e`F@E;Wee92h?|t-c539~*{X|L}P7 z?BRrym`a*Q6cXP_mm-okDq#G-#JBO1cp9A-BE~>PT{<&<8z4_279sJ#lN20glP}+< zv&jwEFdT2g_n*H`@9&&j37>Vq(}%e;n>pVlJSyOnJR*+aB$K*jiekTQ@^OHFM98rO*D%U7G zBmgV3gKgV6XJ13JQ#xWe3@$E8t;W@z4d9UBj3>W&1?TYcQarnaVVjSy()bA|eggLZ zEoQk)DolA`nI#4)lH)h*7zhJ@8go!jPcv~;!hJ27>g$BB2zz^#2`-b@Dy@NqGFr_w zuvv=ja%)!^<~Mnjtg>81OqC*J|iX+FXD2gsQebH9MPIO>3TFRhD*2&CReQZ`H)L!ashF8*sfF zj$Fd#NO`Kby2uVAq|;I_lMPW&@yOqDPYAi~7q~(i;xz@_+7q<~&2_(XfXn{eKf|x( zs&>m?`C40OV{D8+&01T3Z`(E$e)q3n0&WBcU}r<5$^ z%ls}11GLKH0K`IzMZleH$;?#o+XY+MuLni3)Cpd-f_wbGr^~#QdtPoJhjBRxx5N3{`xQOOh9YK zgeDbzg{e6!gLSd&VG~9Kd4NAUnoN)!=1^Jd4K(aUN#*slJqQuQ)G-_j0#%YBavCa%;%o!Fm!)Znr4`H^E5)L`%3J_(z z{!HSvAa;OepqSEZdNx-tk2<4zyGhclo&A^Dre}Y8wo;Al!=^k8)-YZxMasSn`5J6R z^EB6v`CQJi6Rq%7qE?Ol)TO`T($F?V3oL-zI5w z)94Zhkka4dC}%<1U=qAsS_Y96hJ}{!29!L+N(Sj$BIT<$m5XA7m_w1E$A{S(cwr-Px)b0URkovx799$j$#Y~SmL%>RbP2EXEqw#!KFlRe`Gz#muRR8ZS1qRa%V zwll_m*NltjgFXTP@URg&XZrI>cTtWxw(g`Fc<|h%1b^Hw9^1t#MUxF|du$oh4@#pi z%V|`&im3m)gvwxKpAJDSQXPmTYL+^1x)MOK7vX0zfWE@>qj^faOM7vY0!?6_q-u01f?aZJe4L$4(fO z98;iU`0`w~(xc0ev1exVd=_L=p&;ZK@u>`UCmkSS8;Wvyr6Izh%5yq<0x+HHM!wCZ zFiSmcQc$lf02QTzRf;W+m)9bs!3C=sl$A*svlK0En<$$0Ka!`Sqi26CR$)qEMq++{ z%*QD1(Y(P71RL3VTI39^ok`g#XazsbK{KujS%QwC2uqcQtorW6@K&sW1yGM2>{*cxx4S4=5^r#f zj-hC46H%#*qa@YVpFKox6!kEv>IR#CZm>J$zD^A3w7}31+OV%#+m?pl>fO};8iRJLilNR}#8r}kPAsRZKp&=nifm7(I6cUJwby{)Eg_n>CK zQEv}NQzx6JeNACDE6%2^X5Teg@FqUm5DMu@pOK;S*DQ+0j9* zsSt?n8Q~(w7s{!@%nC87vxra})%5gwpto-qnt-n|t~hHc1A#_zj^g~fjpp`t*JiWg zmae&2Zh8wdkRJXj!+0p`s3Rw`29)4nqeobIpMxnsZ@R2Gofk7Nzg=;E9q-qTE&Ku^ zNa75KF)eN%CIcU0^GL?9DacfuX1UKd;Q?x4T(+leNsWU%Ln_I8&ZalVxsrLZCSQ)q z6SY#z7Tva{^wkarxlSdE>BDPe!T_xQ-d)sGk7qRw0CjOrVOv3>=Hy>9!kMmDjXSrU z+%~P|1x?%;?hQ`A4#H}N0=hnw4c5g)WYg80RN8p~Y5i4*BSi;6Y8%jgM6kNBs9aXc zo`YXj!s)-r=ckZA;Bc;#F)jV%MR3ufv1l2{?m)3@x*%1HYSWN^!lR3eyNZni&)Q^P z>qcxQHt51xxT}sw$ zbrx*A!KV-2X!>D)GC!I4-sy?|tWU|1f1A0wN^=pv9*=S?19@eiOV7Av}KhDkLwC{qx&o#o4X@o+l}1z@)lkg2&*WvNV^I z(I^)?O#XNiKq@I`3g!oiY4|pa@{7cG0 zY}1@{MHNLsBs5S*^`|R+f%*qDcf~gJx*TH-x82sa0WB+AfhoyECBVjUWmU|T1dVW4 zpIT3MK}|X?MT=CV{LkK63wO1!ViPI^Wsx22lPn{*ixrJkHDUAZ8{7)p3`esFWHk$W z-eJ9e1YFgrhg5I0ryaWNT<>Qf^NgXrI_&~(s8A^?&<>2JPf;H?i_FoCiZAdzrx}C| zyIS|UM*V>2dZMe1hi2%7OIWTme!XLP_MZXR7ip&2*$N+=afyKOJX)jL%-C={LHkd{ zzW4kgv?~GZbBqwLMd*cUeriLi2gMojEmJU>DEKcHlvO z=|zw9iltg>{vU2ZpY~Iu$dH=03PVP2Zu78?4;0Sl@?3sI`IZPB#cPiI?HD{*xZR6A zgNPKw4yaSvWL_=2 zr}otG%3*p&(>Q4EJh`u>lb$x#km$F6nplSkhg#T9W^~uGrRQ|(XgQ`<)BP9Y-*!;9 zAGYkRTXdSi&f3rq{ruSz=Gb6}6o`PNaKXPpO-t%;eeF2SAX+3u25Wq9_w~~EuaB;t zjW=4fa$Zq0`c4&zU&4zu#IZV$unBpf6w2Qmu=&}b=Y_Ex)WX}pF7)&-w zf3xegMfJh3#d~?~p5yW8-(IGhbTVOhM`Vg4g2F$u-EFr1oj*js#w31m@k@-KzX-1P zyA@~q;5FZ+oDrtr8a&je>_AaRg^O@bB7ZezY^?;|5 zZ+_LxMhTV@y%GZNO$dlQD8gcig40r9KPMk22%c2XJFEzDQY;{~iU>Kg3)yW#Becp` zq+y^ijKGKzS)@FyvD8)0{vVb%WJMV@Zk)LKK1VD|65qhFX!YZ$4VBY>tI9dZbZ~C{|n$9Bq)-g@a{|2hFdL1Ds~WuW9Osu0YYs zJbQ)$Dnr0W**bse>$mRIMe}(P+v54MZA3p1nW8Ksv&PC}R6D&tk306Y6fKK*U zPBvJ6D5A7Q>RFpW|1IZ#3350~_C`c=60C3{NryeF0qeGk{Nl~**wk)qTKiJ^L}!u$ zTh7++%a(JeYh^o@EW=DK4nsu2M8|0@dp6udrUS}C6E~#ptO&gqYhf1ZcF<~v!a9h- z!X6}1Zw{O#swD46;k8AGS240hpFW`)>utV9GFwD@n6lBD`Z88H$C>Q{ctiw}-SV+L zs&bsWqsyk5ivGe0L&dLclj?Av7PYZh9!+XV=&T`40IVf^u|zMCm&K?Jw;-Fd zb$(C;GP?ykx$e(?(T3WIt$Nmw*F#RPH(aP*uNRk`sSQp6B$w-{4Ic-Vi=Oz6z&n=_ zstp)bJF>BUl(R0oEpOkZ*G(QxouX01=JsQg#U{6qfBs35WTW0!ua4M%^aQaw+@Fc97S zD?DTf5(7v@3;`iNMJEufk&u&IQcKR+itVZq;=gloo6@0%w0MZ@`1#$t_wMS(EDU2P zTChfxz(1aSTlnTqugc2`s@eHPCC+B~d*9X?`}|(FMkAo39a^m*pQG_EW6awl9zU*1 zFivVDnx#;(y6qa@5@LUQk^PtW&7+eo><~(H(A7h;LHm3>vQNfo8DA(_^4eoL;CTb? zNp{wa($bS`FK!|1tLVr`qI(IY(u8{QU{86Wwc?3J)dz^>*F3LHH>plixJad%%B7o?b!PFztd)%V-=VV;8j^F8T9^o_(=zosPW8CdI6~)(Dr$a2rS@3Dcz_BtH!>7SUU-+4pExAO+?~EwzI9U{&#;aNz-QCV4?_1k(Aric@uQtmhPW7dYpdeLeaHD7pv$8r)%7G z%BrFxqZ?oIEuT&FLo(oiFQvcSA=N6w6$&+R8%$y@7CJ;PLlj)pr5hnZE>$Wqq`P(A zhEdFc*8fgwAgfWa7||Rk%OqcTiLZl@k|W&h_R$&Xtm)!h{^>xsQuN#okp%=@dT#HYgs?9p|Z2VgqSge_Oqw-o!;2s+393MYy&7s;~m)#kxgsE zFbsz8{uMgp&_V|rbPUpcz)E2~?XVpK#kG~zkjTLwA!YQx&&@}hgcipzj`yTy=jcAUE(IN;<)e5ZMLqdmNj2p>mqkl_U_f9 z+qC4_O`~~s9$iDf;%{dVL#dS%*1Z)#&%aldRm;*yv&n4 zGdK5L(=kT8McZ+KP(J#$^6v|?5myrBJi3(pd|u?+wl=gamZt3tA-T|zH5!X_9a79# zt%z$7np+F|S%6zkav%UV4oQDnD2_86(h%4OgHWBXv=Sh~#6gz6t+JPL`I@9<@{~U; zp3?+wA&M^I5$@HRJA|1Sx5^viwah#PsBpc<`1hZ+C*hPKkjnDv`;?PYxQ5CYJ+R{z zU)7`YJ;BU1%AVa#8EUTWUa^}LA^nTz=aOm7-#5pZ4u&231f7vRYr}sq5QcaCiW@w{ zkU|S71-l>6Qb?u_Sq(;!Wm{mMgg!z-$$zhG#cdM2R2n4RNqThmzRz!}RfHhzxlxpH zDA%svx#nFS*i*%;)x%>&?^nh4*w+$|#fR*bM2^<)(8!J#pL-wWgg6uN*k^i*)wJeu zlnp9p!@NPub?qC8M16lbJFvoX0jmYl4p>Kxf%Dz1XnbyLANav?tPB)!@=ehgkZ%Hh zC@uEXa!6V)Oee4j|K;J(?K;7rcF3%d2xZAU!D`3s;{P?=xBv+Yn`J~lb6!9qhByW{ z?*}AuOe{fo@oyALM}>ljqgGUVVwPQM^w;53+L@TBrIE{O!!Qs<_xcJgyhx#i7E-!MAJ7Lht1h}V7)2V# z276?rQAjBH_sW*tIwrxXtA%8Zr0aXn+&@)W#TbebY$YV{@Jd8a_lZ*G;i zp2wfNGS#??Uvz(2X#^zyg;p03zis?(!I-lX9{WluP<88Kn#vL@M`2zffk}OkiBcbq zYOS#RRSd}pNj4yP%{@?(8JG@{EQGbZ{Zmupuq8lcdHg?Z_Qkj#mC*!}K=DX+Ktny> z2m&7EHKIXHH&NT7TNSzFsY6M*MxG?nyCvf!&BiT`H1~hU6o268isJH&)aP`%jWtE? zc(*$y7Y&nuwjL2>xxIS)O>s!Mccn2@U+4kv9S8aPybphWv;}LRmfvjX#{fBl16w0n z4Z0Dfp6Qc10ojPqVY)s02AxvfOXENgf6rer2SF2PLBZpowJmodoKGir;!~h(Hxs+C z*$w+qTf~3={U+O_q_HZd4@q`A^ZS~)UR3KUiWDo+R*WMofBSOfpML2r|B+*Ub@@GK z7gyQ8U0GW_(&`dWaQ+fNI4nw(9m3RB+opNXjGBObA zk9RfJ{?!31gklo7WY$7cduxm~!9C#Cp~@{}!_t3iPvH=~L_ojFhz)ZHG1fHG-rZKX z8=Yfw?N?H8D7@lMXa&n9Cp>37cgfckoeC3TQJ+Tx44w`YVjV6B@nLQBGh4~l>JXCN z8bQpPj~OU0Wg24I=NbZIhPo${ZcuH@=-{=Hm`)FUv0Do}o(Gu(-5t&A$w@q+3tN(; zFzJ6d?a49dyirH!AA#By^i6a%%SMa5hyP{SHAAyuiJ@OA)1Jk|H6&klox)Mil&Z+af8@w6MNz_ly(ON-W@Zz~>|^w>k|sY^c_SnIqt zOYT1&R%>~&fFu)kNexHz<2ga@;Zis|g9{S)Hk-ja6|i{sp9x$Zguh1r0jC{|4G@2I zk6mlRFcgOG^D80~+d>BpHU@T1IvLx=uBLZZN}8P7K$?VnfU^1D*H)|U>s+1l<~{Fu z@-WktMo5wxtR@t2{_5+(Z=Tea-ZNmgH+PJTZ?na&E|uJ6b5(04LAs`sRtd;b=L|2r zg9M?g)p-oh?PRh{-(Q}W`TQ+iETVrkqJmh9Q`@A~L^AY&a8ueBf>T_2NgY=b=Q(X| zIOC}ck8jPyL3m%ZSfL^gWfb6;Xxk~U6|T3;JlH^N!y>gjLn&X7Y{e0xJmcU^+d7tj6n~aK}(DZN*F1#|A<4C$Foxy?*R@c>NFc9_`T= z#aHW3<2Vri-oL`jl}mC0wk<8M0xLl1K;n)Qp!?EPm6JGWM4Ci-lvca^?>Bawhn=KX zcC~jAD4B<6e)F)$J^vEU!%lz4#|sjN*d%CnmoALdxeiw5u|=$5e`Mj_P=8)8?7&~^ zH^CwdeBvkY<;Q_X#+^Y)B3(zP8IpqwS*c3$busC8Wj>uKvEdf4I7SxSc)z z^>Y9CC(m@?Wtb;QOp<>Bed_1bU@&F0MWWaYA|fddMdjg?mBIC2CB2cTH=44#F2Sg5 z@mSP6rkW6eNw6nro`{+!Qz`DQ4S1a>0PvE)fc9z>1gv9Ynws2L3gMW@PJNS#&}_!i z8Kq{T!prrYsvlUWD0?UulzzAXN6j5ns#aS=(<$j=ecYHH{pTf^Rr%{H3KLuz)Jt!#191?dfBu)4SM9#Rza z>Efc^`Et(`HYQWlpe`q-*?igjTbY-S3ekMITZD3M*fW2UlT0Z)(`uE?1L&a(z^|Kt zB2fziwJpW#s3=W#xUkq0JNl|`Om^eNPPMzowCPI+o2tzlqP5;k{=*e7t+0F@p8jx= zC5yvGi{DXK$!<~EY(i~W+tSESt8UeWP+vX+ivm|BMt+Q#l-ff^5O~sX({1d`G$5#JRT|VheYXx8e3MEbr0HNk+`_ef~tsQ1r2Q`oQT(faR6;=zs^hm6K z_glUP!uO_uKw%xR9^L}he?B?soJ0%{n~NOTrg(TotG5mG1t~)XdPF%?v~sk-g$gc$ z$sJj-ZhHx?{Mc3XIayi6RO`OP#;D#uvitcYTT*|&b8G>r$<8*Og&znX1<>y?1g8}Q zjrN*={EwY5Mx^cD#J67awP`^jhp6>CR2Hn(biESNp_O;5mZPh=qacpr^l6(~%Km8KMhi;ctT`8@?JQ0-t?s zALNr367q}zBxdbb!Gk`dQLimIy-mS#`vzEmf@tXc91YO7g6~xL{R%(g{Edka;eI3m zS*vj;a)UWFHtQ>+#$M8ax4^6B!k0-_yOw`z+tkJq?ZXOJ$nE!}l?DsV$jttR`n?`t z>n`(Ty?6crrBY360x=N1=U3!Va2FI>uoT?ZV!hN;4|;P&Vs^F$c9W0~TPgncCcCR< ztx{@pn#{a;?@cC;&vGph;-myE2?e}-wdKmbzlcxzkU`eJyU)mNKb>yNT<~o=7Nvg_ z9Jp~2*P?)Q2HJp15VHD;?va!Qqr@=5lj|5JTw0Tklp@4g zDDuI8y4XOIYV(|xJ3yFuv!;5C#%usrV65VM?D6mUZU6WJy`kT1DBazoM5TWa?|;P( zeFLRaQES^U5PtWsP$4ujB(OoppqV|g?qPk|9@@7!1XVsK0$VcDscRVd?~`RYc3f|; zPA`^E-`)4=yVIx7^`VX;$to~4<3M)bZ1rUKU(^f#m_vT^{zJ~*-DD5Ps!;Nn-KnZp z5+u5vG^&K`5e$M}MUgdc$aa5`ipjkDuHIJVUe*?~wbtzDx2uSk%oq}?wi2UX5pk;_ zXakR$2?uS0wHD6|fy{WP<02~Bq8BlP46V6SIfMiIR0>WCD>(`!$!^D;I@FdU&HmSy zv#{86wKr+j3=hIA({M_X(G55?1N6I{5GSazB_kimjKx3ah%<+(~PzWhn#4(kV6H-3y@cb`kR9)w$?tY<5Q=;V1d`&W>l5 zz9JmbEK_Ip18QIuHBf&Rx3}Ew5khDPHSwTE)2Yy?(9q3XNH_G%jleUwcD?d#%zEF$ z|5#+orQwjA({kWSJKgyd^AxISV8KcQe{F=o9~Qldp~gUw2DDms*#5arOry5)!pcR5 zP`-NHJ*HFi8_ia2Z`(Ey{_bDF1x6*KZo2_31|&^`Hp|ceSsi~QL4ctO1X?=9+$2&X zsW@KY|K6i0Sud7sC-boBgDjc6=bn4+bjSB6=`0-#I88vMGyvj%&XQ?%|4BRsKZg*$ z{pnpue|+m*FOo>`g?B2FRB+%LpSTh+csHOl$fLm^Q_rwI=V_+x{hT9CgdC2Z2Q|sG z!75(u+dqS{KYM@Tb*&}Pq@<-KWtv#+Zp`!G+koJeO7=iCkfA6xHvVKrCq<6Q*SpqA zKvSJbuujxD4hKM+_2T&vwcj6ju+ZBbe-dCriD84x`_O+DoHFo@K=m%yi*&82&eW+0VGXUT z6RFkqCv_w11shEW`)En3g6nBZO(iPUo77N6ew0h4#Ih(RLR*%4n#{N;wjFi)Zul$a z$;zQop~z(6(SB!rF1O5~9K-(;7Ct;Og<&|oU$ir>e32I~Rxe*SnA|nLt7mktMqMJ~ zyjXwsG4fq666n=+@Vs^S=1l^LkS0cFj<=!#*UF>}fhkP6Tg4tiAWX2Kb2n;pU*nHe zg~PqH=s{`vTyACX0CFl6(~F%M+?EzSD18i;1W=WKGeM2BVmCW-a|B1ea7|)%4QOS5ITAl-ofAE2~ogYqozT zfZ5+AKn-SB0oo>=0z9qUmmSm5%Q7s|uJa_}9^R@-jdI1qjJSI~eF z$w(U8L5f}2>l#@%MFX@+5x2W2Os{{SNVH8rA_bDl1&#l`Ls61-O`YAB)k9*7oHH|r z=ZyKsEZRn$4s$~yBiAFy`51?H@#atd=>6ss|9te;cZcVA@f5B(d%|-bMw}6*;1iQP zAd^nV3tTDDS0X~n+@SNLgW!n-y>}HsQn`wHsP{m9wVgCBZ3*3MRr8uu>M4I+iSGh< zvyPdkC}(Ix)ZZG@?kCG8tA0!>G({M;5O!}{^P5lKK3^}a{v_W-*T}|eH;@E%r_(g1 zUqI21ASxCN*_5e1!b;H4PB-p>b|pv_2LYM_pd`V1JZ^?HYm`y-o`!@;=tkO&kZA!$ zFf<#Z--l-Nu8o+F38Qsp4AXx_YCc_EU%p6;2|0wBbmyVeGz0%zZqm+xoVQKnq;kqR z+PZQ9%DT9BY2e-kq()U0mrGbAk3u7w*#_z9g zFXvxxZofN=%P$wV7x1y#Xd<;pkc|_%%G=u3;2#@f|G58X{@HMv7~7?H829_L-T+!Q zs>_9ZalN>j-&_NoKth5?WR2Rr!tx}jbFYycX`rm+U~&5fn7}+D%(mdic{~_M<%7RL^VWX@===3nEl|+l*<>Ot zz)fsZJafH&&VxAAR{yni1vGJLJUTh`OkDPTK=p{)r}<9~t-9z1A+?!$ul#ZkleFMd z-Aw)^ZRUU1#H++yH8E&;<_h6HRj&w?t$8j3L0tcX;Ncg+Jt9HVAq1mj%$9Eq`H#Da ze||>YGPQ5g=NNxuF~gXh9?!CY-uPWl_yp?(np5ZL+%H@ZmNn{6>eQ|dF;&$RnnRgr zp?M^6CCgh{>v=(k`abft@@S96a})`816Pf z0;C0k1bKfFV9@l)CPI-8No{sp_}@!PB1O@_Z7kQ^Buivr;|b z{OfxHM+=a><9C?R-CFL;!btcR*WU~LUhF9e;0S-iN+D`(A^F=x8*b$Q$s4JN^FXLY>biRBHER#rMKy`FO3KYfI7DQ zvPfHAPjMi8|ET;G$+F*Yv z@k8Q-;$&`~w_Z`TR!R_mz*wAB5Ss$z9+KwI7kE%!X6Z!g|ADd>18=UoMg-(4jdke0 z>1?I~T64PQhaA@uUF1_xB?!#usfxYvnVM;XIRTNQ?32WIAeAMwpQ2k#4$usrr&_;6 zR{_|hFSW|m%3178$g0qrxxLY%8{U6qGhownf`-_|z=f`Zr-4$Bv(hKOhe|K0y0&&q z%B(Dejl^iP8QE|iS4du`Q+Gzgz_<$rM$>7pt}1!-)6Go_^8cF~y_BNBrOVr^A^o#k zGXtXi>N&p7g<|o#dWjYL(2DUH7HJvYk?{Sx+1^br=DJcPBnv< z#1 zVHd7>^~|qkiDBG+4L~;wS4MwC$+cSsa>`7@=&lAe$Pz8g3R2(Z7U}3npz4#mNIvd1 zFUsiTcCUfW|~hxZ7|>vGND_s4!hhh`u`H`epF{0L+sKwj~N7 zpt&b`)jUmfteC_Yse*qgL@N?Y^h7dYoY}8KxQ3zk5ryF54N6JYXhlAdSR@fsOToDtk@sjE|9_1zr zjP_wG2+u0%k@LYmY9sgqr1${QKYYz-orZ8&BmgSEkZ7r3L$-eiL_v(i{JMm~ERZc> zF>&%gHQ7|M!pK*aoi`0W~$d-xY&A!~i1?O?2 z0DT9g;A5g%L|vLozOc2Di( zqDcC< z8uMKin^vg{AD?mpinBfza=Oc1VLF{22*M9$X4$e{+5xrc={~W}Bg%DZc8=2O$SiD^ zKf0TS?>A^hFW)j_8b~T1P}tp&Bn!6IT+0h6mPUWM;W}Qz0>L-~zRI`A3)3(WOUm{+ z2QJ{;_E3fJ#GWj~ZAIp5yW=!V(*=<5 zC64Ex`TiOE{IZx9o+n6-x*!xGxwHA$POg9DjGm>K4o*%}ay*Ei=XoZ@Jid{6Aq5KK zc0x;z@uNj;m=uxcQBJf57s!~(NqN`=0cQq9sv-V&{dVJhdEi!|*gG)@zEKvhg#JMF zgcF=aRn(3-qmWraSNtTQuAY-p6Sxl(6Y$^af_)fE$-z%CBbFN&L0s1CLnGWGI6;5! z=yiU?df|#y`B_nka@L2#F0F%U2w~J__-4xV;l(ate_NdtjpjkRF?05bDyR=9Xl^S; zCl=Pc<;L9F(d^HGAyC3O8FSofvNNY0YS3*>wXN*yaV=D6tP*QOflpSl5Uj?a!S(Bc zVaH0jSO!7NbW+}7o4GCOU}{OU5nq39{MC|s{o*XU27I#d+PZgHUGgx}xwOH+s+BO*f&R^kGNG2Ps zoz!Vk8Ha8=P1jYT)lO|c5One-20R5Pvz=>CE&qG{k{3I1AO)5W5bWpqJ@0>yAM^V> z+h&6SMLWzh6k%|Go9`a-%^&IK=(iZhFMs(pMlW85cTc-@N}s|%(_NNQOoe=-JWX(T zgL%YACQ>#X403(~!gZD{8@is8gmey5kc#9@MQqxld)9bNZ=T(a~dh}Al5Vw*m2b8 z`^9?P4Th+A8w11`dIG~#+swfXELVY6$tb3tq1X~Wx%$M2z&A*sQL(VW!htn=C3G;Z zP=l$)+V?Wmc>g>@4Mr*dB1RfWvtw}D2C9dwK}j&VB7A{2lI0=6qac5=(TM4jNvjTqyu#Dsp7^7CGOY!~@ zB{}BpdOgx@p#Urrc~ zn`DIlQ|y$KT2eNf>{=~r8Y>$#S(q`rkpi+rX2b|S4@3UrG7MQ5(v^CD4kZ(iAFg(G z%M1+e8s&*Fn6DRqftS&54H^N5m+Ws18UY!X2XGB9G|wg-y2(ZO447ru46jCBNq4x0 z_OsHaxGOeHN@#$P3s$G&S0(%F1dcn{R80JCtLV+n2bXGa4Xg=%Qi5}iHXg~>mmhHr zA%E_PrWq$nr?IQ-d&SO`qx?1~4{mXiwat9TQaSc=9N)_A!qcVJhWhZ|4Q?1JdjrR9 z%`3x}#4)DMg+UeHtzNdT9_1jR*vfR?5557-Rbg+_FcAHoUvZj>mPj1}X$Yxdn+ijs z5>PZY@qwVqaW1VPu`S!7tI+;CPSP~#R)6T01Pyi5t|P!fhSyMrhHbA-I2~QW`CUZ z!)n?^-83^fP&rMwK^5CV@*NUtqX;!X6QVWLbpkAv3FcYQ5Ok=w#&UD4^UDD{q!I?H z!3YMT;N_REv(Q!=#2Kf#V2BEU5Z#B<*sZ!cZU`d$ZVA|ZF%N+#MOJoOWLm=seEsGX zoJzv^7?=gqN2eu%jo6}|54~iDE`PucjLOh!{Fx6*G*-s} zRvFxib~maky`FyuAXG?x`2Su)S=;v$P{#gO^y_PWKM8gG~atz<-6QJd%V7 zK0O>lFh?_s&{CP@p_OFMYe>Cu>Syi58`oVbX3(|Gf$=#EsIcbAZO%d=5*S2Cg(7+U z2?Q}oH2&2lk4{Up8m9bd*hD&Ok-pvjJ{nE0E(@t1WfZzpim zQ1A4wZTIcP@nJyLtKGfJe}5RcwX^o%e@JrunXIDu32(zU0QRCha5B zj%&(S>{EykX0XQA~yWqMW5T{EB&$lWd)1aAr}r ztz+A^ZQHhObnK*qH@5YrqfUn%+qP}9W7|3T&aGRg>fHNx|D1bPt+~dU;~5GyelsT+ z?;xS&4Dzy}5T@?VIKc+GWO!#!K{UaL8JHVTRSu;(j{Z|tlzb4fc%Ch_BT@q8Q{JT#<&A_CHV5Cr($OZV z*gu0cJ#%(6js+k}JKULUl4kXg9SONx0)(pIaG;uF;mm3E;hbRDjuUX|@X0j4Q8^Mk z?uE<~khY6plO<76?Q`a_PuvsipUV@cnRcd#HGt|QJW~8fGgm!mfNhU>)Vg#cuPnMZ zrd@yCkmg~bENtmE%$+*89`Kjo876aviI@MKLev33ZUPK80ULs{h-ybx*;U^CKvqA% z>0nyzf6yi8wQ~mTd%feBh4ZRVfmFj_6SsXhOl_$oJBYC01#zpDTdeo0El-p{0hsN) z>aK=T9v>af$%~YxMN~NE^JYKDt8K+Blo}QH6V)+(5-aX-M?yc>fXdr$s(N{vbZe1ZxNYf^q};i4N=LLs7_NgE*q z&wwH0wc|6R6DPSAY9O9_&E@x-PA=>d)^so$4c9Ne@fnyG(JgxCJE6W!3~{4)%@JPR z=Yb3vqIr$;EsgshpE}3oM6FjaPFh9P5F8aBz5~z$j`+K5PkK(PiyX9h9Rz*z0+n;G z+loqW7eU8=^XTUU-Kg_@1NRM<|qdh|Z z8lq=X&T7rLR%4EFmn`*H2MjKEQ|OfX$A&!NcpOI)_N?}w9TSr^*vGich{l^hkCRH( z)Bv;?<_$t-yXASFHkq93n~IXU_yshlE1!MG`U_C=%?HJI*pqty=S?lwxEE^5g4uHp zYZHpc1&mv98Oczs=j^qY4MD4z(4meZQf)r(20*+mp^8B}&P;m<7H6OIG}L|+FP&>V zlMpt`9!<)Y?9s4~`Ca2Q7tDYDm%x83?`KKPXK8O1a%PW2p9YA^os zKd)3!(9Pbb(>b;xzB~VmMb|?9*3nDOX=VfYgYdj^rY(+_kU0=1qGP@8yVzfKsJ?(S(2S)S}dUsnw{$qo({LHlUF~aRTMtDgeg!Kj97%;jL)0} zWM4KSY5=l;7=W~9iUqN=YNDcWVaR~O$v+X?un8*s0kJl1K&*`0+hnN&Eg%H89K)6$ z?Er(Tab5g-DYl!uua!sXoduB7oa2@N0rkrdbZF0mm|%DG#rCs(9$kdyHs}U#$igaD{9?zK0%Ys}12Gs8l-JjA!2Udjq=SL@kADh1d$Hy7pOE7#t zgbIpiUBy|dE9qwQVU8oQ`zF1AKhx&V&M;|#2D)(xXG>#CKfk96 zg4Ds>6E}7R{Q%x%Q_)DVP|lyQXiD&rD9r@N!@zhp=cq3a3MUwHyKFj({RRdZBeH=) z0vn7Gt;8c(qH7c6$8*60&EjVbQwxox2(Q&}SNZ!4O$gUO{dZKjl$tXNR<58JP2jpA zB2_(pb{1eWzOS5xq58TWyMOM_jsp!%5V=5SfvF~lG@yjQP7_3I&_dwi_eU_M1t6j+ zB0qF87(ojNvjR}r6j21M-2|9qikJc_4Wu+fBn2G>N}D0lh;rW+N;sg6+@WuggJ4EfA>*uU-sB!1iLjjNB3EeEtLkA47uFu9&dkWSmMm>jFb85H;aobAK75;&n{B zYXSEx5E($pfykDKgrJi^MoUB-u-ts0v?U@vXbI5G5|NC!nR{NDd%2)|cleBZel}wF zc=G{9Kx@md%?IG|cGw1Nutby=rB2LdH#lotnjD|Ut?xDULYnV`WFFLn`D_G_@0H)H zo3=CT`s9*s1*w4$Ibj=eQ%5*}4E;DySyU%hX)%#7LIDa`A?gDbb^ouvW)cFT2GTAQ zgoK~jD7t2UT(d~KG!8c)N+RD-DVolaB!_SRa>Y*}c|)d_&TPXiOi?#-mjjPH?IrW& zZB#WjOOvpak*XRydvW$tuo}o5!+i4utCTDB!W5x>rVX%_jXAaFC>uqB!M6NWZpiko4sx@j}ULNB3!@G5!!2N{3j9VbLs;@IuzrnfK}Nnn)-P8 zIN4zmT(kChEE=EE+7bFa!X#7mmJHzrg(=P(0X1L{Pf(io(|!UjggQYvgcVMxXT9+{LXuw!ak9tZlI=B*cQ(ysAhzznL|8Sro z1`E9r>1N9)d}N1$99nK(WS-Vw6c)N8wqcP(=DgHkjSU0!C}i5o=1H3^a=#z5ckZLl z)&v0Ouvy0Uq!ESixW2A%zgDENq^+}(rLsJ`oh+Q#uf3pD#P=MoJpIqUjzH{e2MwFM zf|jHtX;r;sD(X9ClT1OkHD?y?;h~CI3N}PCaE>l#86!e8Gw=uR6t)H2JvvgVl}2O2 zJDnn0Ha-lk&!n+fcuoN|%B(tZDr!ciggjsa_|Gg@m_dsYt8C_fVzgxg= z9`MGhe zN{!ks!!hQ^aUjY%ZyorU&_YIbXQ01jK9Gary87q3gVSXp%nKDj+&@Zd#FQ-GIbAwH zGZ7s(L7}y3exEvqlH3-VH#%DK{+_wLdco_G;RGXMu^o zy0c)vP0#jk%)edq8k2$OKLZ7vwPsV$O7hC*WxLmLV-g=uNtW?0L4(90p#Cv7N0jDt((o zADQy`&OU-fl}_I6d$;Qp$@iCQ!<9`-X59{OgImHCat*=mql~97^G~q=rXGFV%2=`Z zP^a_ID!HUoP+{9o=E2wLi(QBECAYSbcHWaM>#V)w9^qKeKB#)lGV}4DV9Zm@mvgRjuK4fZ!p#JKdYUy zwMW)b&8$U{WMjFWFCl1!vzRkt2^2;#n91=b*{zX?LIH{Am`_P+M)rqA0Sq~U!M$o) zQ38Yv$7P}VvUY=2%9nv2m9kBYcKSUj5aexr$0N&vJ>xqtyi489UcNXV@c#o--*)N%>cvq;TpK0*W5v}6QV7Wdc43+fUihE-MbzYLdGG5+EAd5Q_Ijt zM9hsoglFleImq#YF%R0U(H9bk8N%k6{)Hq`e9wzyo(EfI>9k`k`B-94tpQVD_%JNM z;R|pH9kFQDK2`gdD^xwz_1u0OB}Fems;HmDLG9;l zuMnhs0Bs=Z4Dw1jaqS&GC^2Uv3_?u~Vhlhj?PoIrW#Op51xyT;Dal8Sq(O>KDM~ zMV|NyI)rS$!A1L8)W-tGxt)Oxhs$zloMh4L9~=Qv+Qpy|wOv`AV)0y~r{FHSfH;_8 ziOygXScM2O#p$NA%(2{oZ#P2gojubg;Xkw1SgnPf9E1!#oIoZHT+-wDyz)XgAG#_{ zD&mF4&3xxJm3K?__;1qAHD(cSlPusHUT^f4pRNUrld?%O!L&fE55Q!yz@^Y#o3rg? zO9dIA(!}o_ZI)&_%)BE0lUm+t)9za3tl?I-Y?szpMJ`mr-BkP6!BoO+^)CT~gIlYl zo$W56thh^izuMMZjTC8LN#a?7-X+1!033a*X zaNvu+XOUElQODSGk#}nQ)yvhX#4;*!|DNHjjkG5_@m6)D%b&qDRHnwI8_w1j|9pLS zUVwcJ*AL7UiYlnRURA?U#6k5PsO%Z)HU{zO)n{v>2ala!wH8;NKxX-#olH->#AeJ+(DuzkU_q zRy{na`0A`-AE8#sipXQo?rR4BKg4=ELx zg-9vkQCy*@pSJechv#tPIy(Ijn*1PsrToKu*&zIO#Q9vWFUFobqR;}s39P~>{iqJ3 z4L26{;F8PI8?zzHke8-Eb#Htbu?giJu8j`1o^xdJOsPK8D1-2p_AN2x!2AZbmpWMk zTie0qp@043a@U*X9O13gTdK4ODEZ_v0UR|DWS3=mY`@|V?#aF|J-}#uu&!u7MBIk!GVtORzcdx(j)r} zp^+8OkvIo54p%e1DnELI(9dZnh78e1qjDtVS2EPNnJE%CV{#F)|81?|8MMp*V@CBl zGA3QMG7h?TX1d7Ox_Dm8+{nV>cZ%x-?*Mo+tMJViD=m#`Q#ea53K97Tlp!5dm~LtN zhPyrc+`b*$Ps0K@8V?D|CxsorbX>0Ctvb9T8l+AyU229k`Ck9|V$r=@hW$9g60Tqt zjzO<+rhAsKg}ZnIzHI^0{)adS8GXR8 z-P`Zvs6@o~+*me0kWY7NA_(pktF-LV@kb~nE->;pi#~#KmRP;c%4)KJ8Y+mi0CiH2 zXbQb0C$XqCW3-~arKwpZMZ){<>=;OoS8FSGLM8r@^`7pev&6GG>=zlXtc1QzyRin* zA-CrpC>HoXfe-Ts?D+nay!G8T8uT~+yv{sI&WVV^lL+?iNl#I%0^p8zh&xja|HI<{ zkJU|yUImRd?Re>jnvMu7XX%rJCTtCWV^zN{kts z_m|sVKOGHF<63A@Z1IAl7Uf+AyQU>(M!JJK-l!KEH4v+$GSm{_HdU_j-_ z&|MRPrD|&n?QOu0hyL&p&JIKA!EUz|p8;)ux!ii(;oDmtY*^%0*HaXKJ1cVCAGHz4 zmj@@9GI%YIju))|tghmtK)_SY8o(2aajlPu?$*hioD5O1(=;`_#c7n7xQ zqvqvlcHR|FZNYGss4&$=2bwirJ?X?{I%VL|7CXu8r}i&=}J*&02zYftVye*c}8gBJ)4qLRmfTglp+2 zg5K*;2&4AWMSK*V1zLJ&6~fD3E`*}U`gea)(yiVFsXJF8gy_>h&0BVy2)Hqz{!yZE zuh%G!zj#wj`f@FZCZbntrgHAEA71(VhyO*7I&u?SeC=v}Thc_%vs|^t#C6(mw0|@w zNQDP%H*EQ+Jof`YyStv5-THj_+BtoIoN)|>t^9T8Od@Hp4nMO5ilW$SXZWrXOm#jz zWA^SrH_B0wmj`D>={nM$FhyppQ29gV{$1T#Z04VCMTMj8_%c+a35}Ak+ltLAl||HU zzeXp3S4mmE&91Si+&Bc-Fn2%;tWuvEI~PXPc;;#f;<&TsI9jAi!FCQZoaRpFHt z#w@cN)8ixw@sZ{@xmd4<5lTYYpvr}|?Vq$jOR`zrU(=F@aY9i%Ba*7%lAnb=_zXe5 z)7${v9V{Usc@>O5C|YJ+337k8wYLIp!lp8(%**-h*GOq?1y7<61jyO_AYn`iC zT+#(cYxo2h_T<81+R@pq$sDJl99WbR@sXUsPCd9*mJ`frE%yofniNcTAQD(#>|~>3O3sOFw?bg%S~1PrS;Y4@a~5 zAK#Ow(pQh383yfMMm%4_Qh9+jaWdK1Y-%$_@HO)X8eXa`kmuggOgD|VZ(0WBbZKv9 zQV8DLTW}}FRMItl90mBC#wTE!Uws_+_vSr##||QKPD1;4TVY7Ny2C}{;aOuFij(i8k$z&$#X#!$CjX&mo!3%{y zg63WabLS-duX6l_F|suM@5T-~r!qhrCH-ty9XPuP|251~zZI$vVj_tXGDpKStgyUs z5Z1(p+Zg4o-w0v%u!1Dx0$;;VlL-J=8uQ zkhtx~fB);pyo3%M(zaIE=Qe9;Iy#b}KP0kuAAC*%|9|Qs`PLlGAZj`wCaMDA(D+@B zEgO=n5LuFt7B6*MQ){oC9>I+VsVlgic$V@z8>R@k<)7rrZGybOR%cOV*d~7eNX8&To-|;Rw>B_ea6gSJkg!#?wO~ zh8yQnItDsOAmReLCOS7QIr}O`)M%r97<`i0rjBmdx=%nC6Qy&9)nN8YGCJZ*>PN@f zf5n>c1ZFu_uOsdbtA8)aBsEv1VV7b?nW~|@Tdf`E4RXj9VumyEH1)ZTN`bx6TzAtn zAM-3w%FCtY52jaWsdR&(uc;*EDeSta?{MUP&+?SdCWC-C<4oLf*LWvfVz&vE445Uy z?D=_yG*eynh(6_U478Im5YmFt)I_DTGP&w~Ge=1yBkR?xx2i0*CnzWs7E`eioqP*j zdX_On>Hs1^gVt~gmC8uUrJ}C&wpX_>{@c(2ZgqK-f@wK4823z_)OL7JC}5;R0+oa zZ`H{pzDEGd1Vy_Lk?*CdH~PaJ(Rt(sR#+R#1{E15Q5hvknDWb|Fpsp4K)IW4uf|&2 za|0-=+$VqQ+-8SGG74u!jTm^aqnuK=yPGvXtgPfz(;B*3Vyoe*;<)3whFwC-Y-`&^ z$8=V)RM?3>J36#D*2nNcl}iWNn0XvaO}tI=ANc^%Ad^Oe@UxOer^PSP9}<6b$@7vk z7Y96Q_%hbU*rHp>wrE~tamG-8tSnX}PL3GYJj=xfvbE05H9iYM1VJO`!IY?SY+_Cm zfCI{;iLrLnwoEP%$LU9D45scr4LE!@D8=vhhG@I~P|Qlfjm#PT+#*&w+W-7OOr{7z zX)3^xgkVCyTOgXe*OA+3jrTtXc6DqQ5cz{Q^D!VhfdL#6RsUnu|4%1gO4xv@aXBNn z=dB~0yBt4a!RV$8u_%boVTrzNdtEHO?)k%g+s3A(bG1#0VQx-M)KtPiU$zLk@ZatL~ELjh%EIRG+e)B@GSeNXkXn^ZXvx z(do4~5(wzE)$w|M-}Z#hF!4@j9SM50^d?!uKq+E6Nwb8&rQibZ{kI(N^e-G>|FS+# zyd= z^nUY?8UF2#nBA@22n10C!QV3BXn_+r@fO60q z;OacG(eoSeJ?^44hDcY^E+a{ZNB5fI_E-B*2^_(*>A-=t+5Sl~lu*9~tglzw-y7Pg zIPxLL(Q5TLw$*gN*wNlFJtVBR6~4Cv`p^4ESY0tNUMtG4mcP8YinMrbLNT-P*XaG9 z!TGDDKI(7Eh`q)#VBv(}*pX~mtw?3efa|$<0j}V4DZ)aZypB#tyM`F=p!Ql^sRx!v zM(!4bku|HZ-Y|Lb=`AD3(7-aMst8+KC;(dG1qg~szwk1}N=r<#H&Cgjv*t?BAOmI7 z*W``umat26q>kV^Gik(>&#(0pZqffFk=Vxwoww=8h1FL>dxEh%ftoWElP$jwK$InN zyza1wWGb>xmZNTs%;ezlbRvv_EvZms%fJ6%u=2*?Y;rkgC<$>U2{aSLs23_ma*tWeJV z>)tU-<_tC^(?kzX0t4l~>wyRqAcGpz;;h3UTO)PYAdEA37-v3Ak=)Ax8=QiW%C>%C z+_@WPsu&B{K%kN$j?EU@;W43EEUBf|s*x?AX%Lnj$rc$ovxu_( zLFoG@z{kfnwtKOq6Ij)a&}JQ9nB>+KWDWd1KoSj|gk7-L^yH=!4h8QG7#QZB#{>6~ z2dbopz;C`z1SJ3EtzL8tfpMLY-phc(%Tr?z!TgId5Z04K(0`)TWEZGsTWrpr+Jo?c zExH-3HV#CQknS}?90(V%J zY{Wy@sE4MV1DNemp4`y~tn&0gJj3#%_P@%C$Sb?&k$t}5Y-j;t{xZ#K9AC4U`b4#;$wAF}+Xi`g^@cct7411?| z4jc6s3F_0d6C64IAqm&cF|({az{sevc5${fz)?|-@5c9OtLO^=aI50`Pc5{|7jD}! zI>htk#G|!^*SWnXm|&rH@6gzb%}99Nm?WpX#>&_BAk&+IIsYTI2fRw)sk4B z%8}%{adoac!1tg7S=vjQUx!qjQq#Tj1M9%&E9dXEjt-Njav zp%a&Cn!WDq;qssX>r>!!nAvL_@cy%gxN&BTNtKQm*zZF)lQbB9Li(q8(A){~o}t~s z1y@P(NyIEJ;coQPjm3KzXeE9Xx28!|V15!{wDHBJWw$&rPn+4+^QH=Ns<2q*;$CYR zAI;R5-{~9_Oyviued_heXgpkHQ6z1pqNC!V?We9yL}(oV)@PS@!YN$kg>-frLjiZ9O*+bk}l*?ikp1&-q zSg*dRtJ8J~y;5ObQe4g!iZF?OM|tFRGVz$HK-)6@G5Kp9cI4<|I@w#JfG10~1Bbp? zZ!l)KN-8@*Cd)6o>>Z^fFjw>-)!amYt)z1n1Fk9~2(v%0%}fAv+r~?!GquFU=4zm~ z{ErfM6xNmHK4`X2_l|F|c=!)8;{i8ZC7fvRDyCQ3i2EUfhaV@eGgMgMg5)@3w!!dG zYO?>@C$-Llwa})YsQmjdoK!zaM7i^uqGTh?5l0FDJ;?X7mT;wGV?`~DNWza2Zu3l( z4wS2kzca?X!rYVhymjByd;n^>6a0`vPehicPHtltZB`me{9A^Dn16mw%+er$gAKOw z9J!J*f!YewcuN3~nFdTXqTyWP`Cs4T=IP=4~2-H8R)ebsJq( zA;-o6+5&Y{d(y4+3iQ7j_IeGo4czW``*UC0>M)!`w1CY<`6IxKm1pSe zDf%<_5>lmaUdCN3tw3O=7M%$Sl(40LI(zHb-vnYe)sDYSnY+}Ebs4LYLl$hgdE?5r zNBDZV%fL|?46k+)y2Y$$1s*RWO63Izv!hu+J5se64lH;XHt_Z>)=WNMbE$@Zcd)dn zLKqOOjp?}2H(e*A+MNGaA0k{T9-NB4_QZ#XPu~KYTEiWz318dohB4G6n4#8HfMiFl z=zNw+NaJU8T}M8&Z-|@TKoR1EEJNb5_mS&cT7%<1L5K8!^u9Mt+vD&t-!v_HI}ud? z$!~FlX3@{UJ9&2#5Ju%k!o#}Zy5-I*$dlICkpl&~6t4qV(r z&8xLz{lgmT0B!}$0n1||D2KJ~GQ*9G`;-9Pp15xQK(5w6-rho{#%H+BhAJFq|1&cu z(sB~^`xdoJhrvESk|K4@UwX6APchZ}V|!knM_?W7%gqu?BVl5Hd$%)Gjci2$aexws zWuk5iY^R39w3a>hqgTmWKoy*H?XPY9P}&QutCe`46rI|z(V{p%LTxgThuv~!Da=V< z-}LNsac@Q^*Wk@Tc$KV#&i=6!(e1+L6JoBw1)GE8VkGh(-;a%j}E@ zu5Q~G!Go%FRMfuKc(nDu41B9TkS_%7)Hh_3w?F8kBPty;hgfQ{xq}=4FcUkvjtJhM z(;ES%xR~Tr6*Q`M)X!JGDT$-6%~G(R;T|i4?J%VWYJ># z{m>A^IiBC#{Wv>)asu!^pJ)g^9L~C>dJnhX>)UTUGB;k{PP~(;Ox2#dq4%E$Q>f=V z{_%hImYDL;=5yR^L+TO%qJ@noW|n=N!N0ac3yed&@w&X(VnYO^3-`}QkEmgcQ%*Dq z5NBBwZ^3e|J_Nj*y#fN9f5sY-R@c8>TB2^8GZ;R94i_PA1G+Z5&pkS^U$d&WbI-rn zc-FUl+r9Xn-+H%{p-X-!`|!Zl<;m0&ZhzfcmcTy^ozS$!_c08A1Kf=Lx)Z*Ldzl3v zoqm7tpUy&EJ9W3iUm?xk;3#u$i*}~PHC{47)5m-wM59z1Nq=LqOE#3MtM6)hL>%al z(PGzF_*DH&hHp6p!Wd0I%l&y$~MXL~UX3#O8Z|ABk|AvZenEaGy;Y}S26rQDT1n6{?&cqdTi zpsnI30*O!meK>BDx+f_=2Nw1_zhmWkDG6d09(1M?DF6!!P_T1KpV7x6V*;j43YLhc zVA|Lccl(Lt6pAgo$`0{(uJlV03u~TX*9jf$`1yKohl&9zgAk*Jp3=R7oh~s*WLXvL z{_lNdNUFlV4&>*SQgkrF7exGWDAdOp$x!ygV!8InZ;RbY69SC>_4udv7Yr4dSD#SK zhbbrV`?syxZ%~aC11ww58|R2hQs3B~^(;)MFkt=*6|1GYQ3<7?ifpQJ3yzpnc}N?2 z6y?q=mKXD1U;*(A`$F&Eb24E$GM%G%?ymg5TY-=`g@AC~Y$$SNam_|2fFEZMVHmE_ zhv>+q7lrdK8~5!{i6I<+{YdZO^&>TMtu!$MD*t=1{2)@qD1U%G?OBuJ`vNDw~3|kNNivfV=wHp znZ8fZ7_|F_7KJU(Uz%JcW|9sr9OII%NNBW)^UPxOl$s zc*GD7AoZh#DR?0WTMt`ieLFs_q2Cd+^gNB#istCV=%x;7<1pqJp>91F81RD&v&QD`eT^`A}r?ME^k(oo8tQbhHnLB(C^)QOQX&5kTi z*-r5Q=iwv^oYosZ->7R>^ORMjsLvxp{07ud+Gz43`iLBPuw(!0)Gyn5tVdKDe{daY#V8<=9G1V_UYzkyJ1R#{@14)BwJDClWk$ptdvBd<=Yk>-IctNu#Pa;v7TI z$jdT@9V2O zE|)c0g^2HX7nea`DcY0iQv}$_q?ZC?TG_6q2Wjc_jO4Rf_Y6lmpN>sL)Ze~fEujZ& z`(+VfY|!^sNIq@{XOOnL(n;0QO#WaNv+J=OrH!mhclkssJu3sZpV+Wg*hH&kMQyuvV=nFX?k3sX z1K|;3BL=9BY4kv&D8}#+nN^_Oky%2b3I#>2bbvZ7BzW$<;{Ai3y^}=*jk7!be*{~3RB{BtCrzXl5N|XY^=R} zPr%CSUo5Mkv;IOKQLMwS09sgPF6X`vv}}S;doQmSt*)MSpQv+7TlOcbr9#;GWWojo z7&yM3`Qkd0urWDdIVgyAIrNF0rP;9N*kQxRbmqwl(fQf1wHHj<69u5EhdWYP;fzM7 zF8ustD``P@3BTpwo42aT(S%fbC}}og2+v5WB^TTz={dTB)SWISpaD;BReWW;7p&#p zbTLZZy%#s=8wRg-JGHiqqx*Qhs{bMJrox6V=-hDIgPwqP} z^ASN^7jR2N5sg-t047~$-yy#zC|lz|h3*igKrg;ZWP3d3)wJFssHWOUoNvtMX=+WG zIP`a5xY0~!{o@c)zefsgm7NymN-5JGE#W-6EU`YQw+Ej=;0fMe`Mdn}_#Y77X;23p zxbhrJUu_i@3uUQuFO-~xHO>$)wog7d7T&9|hVpCB+=4%(0U>rt>jA=J;p!6$s8B2u zk<_Pqv`ZJchd`ZA%v}^W5ciz1>D`^I%X?NqiQex1-w2>C90-hj*h5fKTFve86z?_L zZFj&wx0c#n*m1k_aC-`($aqkPSEuFD;37A64;*o)8whQ9_?47fJHwBU?Va=WA-$t# zU%V^A#2vi6078O`PVs5)a}X;6N)-}Qu-JinJdC+nAqdSyJiuHkUnpPuzfN6eiUDqQ zFCXK^c5l?5bOgpIo=TF}7-r!@QiF`&8MeyiqKFDy>suGaAG-k8<<07mS4aZek245zGE=83TDvH7#N zehq&X3;J(wRwj*bQ4SK@_;}C^;7Q>G4vs9dkGzNxnH980r8hXgLWo%9s|JjI*xbW; zZPFnaIC6#;h?bZJ4-`8y1?DEe(1v_bNblP!kx{`0`l$b4Jet*dunTWiqv13}_WeCM z5X5G(4(POUu7*pXWR(L_6u2jqG&&oszfJR3Ga}F2gOIgETC12~ z=oWgoq-zGK^U`?Ek3!l(C3G&@IMyTcDY?M(6TpuF0|XYlsD`wC-A6sC zeC^i5eQD|r<&j;xq`8T9X(Z$(XzUt}um}k3$k5Dd^iJjY9BJ$OLIW$LIn&Ljl@O^~ z=(+Ug^A)shTBEE)!R+v#4)HoT1N~rj9Dp_JO)hHRmNHy*MYg;HNhZWQs}rH^nYQ)i z?EoOPl-9@&KmU*Mc&4uU0-w49_FN?n>wtl`kEz5@GK47R6|eY(U~=8(xaBK-Hv;0M z2Li=?vdjUMVly5}P4DbhO?U)Js-bO~YzxwrqJpRIF`FRb*ES!$_T94muY9tQNx;Tn zf$6K=h-peeXsLND4-2kwxO;%e8a*X&l8Dbfjldb!deR^i3cM<=&|9Kd;*g(vh~i-> zlQ+qumW?JDi@K!QyJF(L!FE-5SX=8d?&;~bD&ORvRVUE^f`C|CSR{42mW#?e7JO;g znyBsky+;q0_rzh*0R3fnYMI6rI6(JUAZpaH%!17M&RC({3X^%;xy*U)N~eMZLgc(w zX~b<|qY@=6P&$#>OF_{RR9BSKHMfjy@3uww@Mpt>{@~=731alVM)W?Gtr9D4@4D23 zd>ahu^gHYVHxmT1i)RW7F9#H7p0X#|=!YGFXuXKQEe@ouIY(@r#jjtAQ-IENdxWU- zU@Q9)UJdVV0T6t7IIa<-dw(DJ#|yeRB*gKNLtB(s8SX!Lzi91rrE@`x4-3Yf1gWA{ zAQJ`g2On?kT_Y#TCCuJ1vt`4lSfIJZG9e2Eu_`>C9sj_!F0T1x%V{*80oote4(u

6@rm20+&&%mAoTdE*X?;Dtbp`Q~_F3BK7hW9w4oiVt_BM#kv%t0-zsK zy_OOCL}d6_dPv4nP#ZeC6fX(_13IEF-FcEWft)zHcCDCx(2*SUA*BmrxOdvpx*ruk z8AD|mX2v8c46_CureI`rNop4zsOKSA8`fhhVngX%A>NiaZNL43Ig|k_<^{$N5&Fbp z&vltUdh`wELGu#L+JKgS(Acw&KM$t}2>Ks_!*pAIbY)-#{|z45Pa{#BQmB^?3~D(6 zG1kan_0D|Tqh+44_-6Ixm+EsHQevfEipHr}DoKxJYW#&>5vf35&;OrM_gTkFUEdx$pet58t!b4L#5&U#i zv{j6hXA|5iDSEoFHn!KnznmzeALI&{w;bJZpmCmAP(49HN@d*&=b6}tHB6d-(8zb) z9F%FR0!OvCkY)7<3}iflVULepi;rFRN**i#D}~v%MXM!DxBAgdcyr&-wo=!@zk?f%mS*V?S_&T}O4lQlcx~(n z8}#W%Dlyj8;1u1{r9FSP`>>YmWp6|HKm7|cMxAFzUL?RSQj-r3@2(&9N6o1Aa>yfl zxi{)xR;8-sUaP|n`M45g8iPH_qTE}ORdDUf9}fFO)%zqbCR%JnJ+;q^4N^SDLe$VX z;0lgPry8x9wd1EGSvI}$_Udh2gg#Zc3LS8$Z>b>%zv@?nn?(ac9ZdGDNU(@>c%yOq z`MLd0L9+m+`X>MIVjYia=;XPO8IsHvbGKdmS3yncR;0=>^Zhf6Up?aF5TKWW5%Xkz zq7WAd_&Y0g$;~pNUb~X2pFbUOO49a@z9Od1fsT@ED^`Uy%4s!k=9rXAXwj~Wj;Z6f z#znsFR-|;+O2T`Xmc90lFzY}3!;>-fi+hyHvZ zCbziW);D!Pz3bqvC4;@gc3+T3H_itQSgdQUFt|jkIKqCe1?R-k3G*^1jXwg^sP*3` zy_1e29{e%#YW6#R)uM3hc-=@D>C-AP*YxA7i+#i>Vjp1tt6v)vi=6ja^7>G5%H2N} zf^P({*SaU~vXs3RLrDrt`PSmEDtol)v_b4xkXg;JxrQ{i{%otJT;jV25RsA&(Ffxv zgcmX460hPUH#fLrQi^&GPfWiyQ-EdORAeq$GWIQ7n8fqR``i0_OcT=UVA*#*v&1 z`tjH&{U~lNuYn`Lf<7uvOy+T$n_|?@L!qLA5|5=9p=aDeCwVpP{-2y>@hyjAA(Eay zG`pOHoA!VNk+Rf{c#V-_9@3}DO;P~wEC_0}c4Oam$=I@tX$BN7I8X<4euUqdx-=4u z#|~1WJvvde3x$e^<*jl>ahm3|o(Z2%E(=hz0H=5>SH{;x*)xQ%#&f7`9|6;ot8^@&y3$03{@Zx}+ zVTEa|88L6=Pm(I(;?#do+>!=BNYl&bkXShWXs!1X)zVADX>o#Ebe?P#>*5#b8jGbC z1>KIPzB_n*yAz%{Dk*qF;^O^ltRSW9VUXj^SG>sXf0Tgia3jbk{C9ZjZ=;JyCJz{l zS9UqGbAICAd9B)la0aQ;wZ$vi_2**7y?7>dK9sJ%l|#g4IkrwIwZu&TFOSFt6)IT1 zxD3Kb^(M(Tq>($SVqkWSwj;dx%)mN{_2ag3MPU#rUFl6>2jP%*q{h6s|4Q@x0`KS= zH}XOa%}yNWLs^*ilnCeD7`5RPTiTGPC(XJmT08+1p=8jv*E$4|TWf;r_d&9R)C%FR zQOxV!uClIGSF!j6%D$#|hQ@czh!iou{@WrvmNrUJmIn**6C%cBFY8#oB^8!X{ zzkVKs*}~i?*5pnsKDG<9K1eFIqpe zGc$Zcqvy|&CvGNRd^;VTMCD0uwQD(mUCsj|vew`R{gRlY2=F%;m}yE9Q}> z|5$G@($wVu#(5l0TaxIcuM3df*m(GR3q;pbfBMyzX!rC$1E<(@{h=qphx(IkfUHY+ zP^RfczgA&o_Y&T{zC{saqy*9qx2ubto%{QP1+;t7HZa9A7EqiJoX&M&L6L*U@FIwG z%49LT*N3f7=A)A5;hl@!*1v76>G_HRQj0ldq4H z)!k7SJC!;VG8Yz~N%+)dUtz?p-`y{@xCqjsvASSbhA`dV3aO~V0l|=v&)wm99x0v@ z&5gK($DS`FUa`0KVG0MXC~e*zmxT7NVrpV_LLaH~fGJ@g^&vIw784_>r!)<050b)x z?n5qM;!7nP>5F6ujsZ!iX<4DScy@p@DbpaA7ISY*18HZV-!D0p57P|q6^jBq^)bsw z?tw4v9#vHO5WbQ!iAB-ui;DnGn3cq2IUW=jRKm&@42AX@h0u#X^ps84jlbf^a) zn45+=AHRYQBdu0JrtV$aJFn8ECp1vT$6(xa~#uQlu zt}u7=nH0?`@O?vCfxHCbt7U?ATa>lMy_*#>f`1gTBGyoSG57jUOjbvQL$)ScQ-jI+ z#1YUb6s zy4Awl4ng6Xg#)#%BK)vQwx(*q`s^*GgWH$jeNc&Ddp7qX;V>c1w#e054elhhO)U3< zK$I$U#0Bz#t9-z|@NYF!1bMz=V;!)1MpmW;VyYkFCn7Hp&+Wb*?MhDJBA~cz425`E z21AP4j?*0fLcZTzcT(4g5gTNpeoVkRN`I4lIu3ukjfyaz1Vg+_&59)3f%Ot|Au5$A zQByp%CTmKVD`l8FBhoH+>y#C5+XbVy?$8Nml(YP5paRtb|G5o#)}-bK0B|uA09w-U z><~!X@ZY&oHQxpj;Cd?#gps+TALga@>0-=|Zc8|JEw{0TB-$-NeYo#x2>jHeLVt9$ zt9pp(%=%;5exLR*syllwUpYzQyYuuzm{jsmX7FGb!GH)5>sZSBrN-3sm1e2#CMpsq zs4tChf2B%uBdG76+&}q$T~SMq+At8l=U0q4ZKZUJRz3A*60=whapah#97AG=s}LjG z6z#w7Okj7rl_Eu+$M>4donO5@_J0u`+Ar`lpMU@QG=G}Ive{cRLgk_vTWfrhRK}ld z2-b~Y1N6q5{VN=OGe*;;aPY=}J3!kv{%BH&4w~^5&c+8^aQoQU(T+!Gphd<6Cu5H= z!5!kY@dk%GXhLwUZ4eJS*IrI$j7=oIgB?tOhu9mK)%T6rmx-h^&5+m;sDJm?f~$?a zyF~CNL~mQdNWqTnaOp_HTYIo4duO2aDTa_B=p~>7(wV}^b@o7iGub*{_Ja+53Y{hB z{Uu^CP_Z>5ZK02E&O0v+J|an*Y(^vy89 z-rNJjV_>|^KXyFPhlq!_%>ZZTC%*q}J|h2$LoJtj%M=GuL#5=4$axMkR^xk?!dB>& z+-SfF#Y(*cxdc}3;HN0_6!@=7@wx`760xod!LcUFtk~qDe1-+?m48x0A=W}8sFpy4 zcPPPY0$X#Ht?v+n{QE>Wo%LK8x@+$3MSSmrxNio{C_enWJxwMS!#vP6kRI)zPc4PPk|{>Qy@zv*J(m=;)a|+aIfSy z6p9)?T?9wyy{Y*-Amp4Ch=u1VKb`L}`3r@RPiw<448`yM6gu>f!UijJ4E7hg%kCS4 zK_IA(;u>t(#Bx~~{qA$p9+EPcE(Ynn_mlki5_eH4Mo%fCCVyz&vfpO23E%pzrFOl# zZSiJZzaM-T_)xzF9|IFh{e|AuA7~zw>MWxJ?Jy-M9YgIWx=iXvL8;i=Jqp1>2Jx)3 zA7tlV-a4zH%dEu)hNjVhlk{0jRUXS`47fU*mZRwe7-}Iqo35XW0-h$M$!N34sKyc!8 zQbLFVMQZNgsIFrO~ZBA z>oKySJR~*+>s`EA#;c3q-u}&@&gsdo4mmzGKWsN{z<;*pWv~eYMwu`_lZ`*_^Rh5P!{dZLy|M^|Oh&fF*@hM2Vo0bV3;XL!;nGGscDc$Kq}v)*e4RufuJ}``8(^ zBk960!dMI;3)}Y?l`f8p2k5Et!1c+B)n^= zU<#(Rw;~$KP<0KoVLpYfYqkjVcKNr==8Vr1h<`UEl&(yfF*>eg#oSFu_%j;4{dn`< zy1n@Q>T+StK3F%i_i&JhdT;<4N0I<82(xM6f;o#KvQ06;!vl1z;KI2?RT@oUD8r$f zP;7Obplc&@*_riBeo3y*WG)cFp6PKbG0or_2z{>u*sDqnohky5Akql3_qXECgmE+} z)PHcaE1L9eqft$|X{M@70rh21>7aeaGv$2SYd!vs@U`Ab4GuSuHEXX6wGa-2FLVo& za~OO@>Y98sGkHFN6QuXsC4BSodNH@I=YL+wpT*T*vuo?(`u6gVnwn83Y2oTQE_~_| zq-<|8Ny;(|cs4tPzRCL4HIvRYQNNY&f`9p?AJ|{!WmA&3o=rp$VUv(o>M>qQr-et^ zaAZrJf}UbEx>{YmO(?Wx@=!VuuHN70c)`Oymk|wf5e}=$n7&SsGT((9rMR_`h8PcJ zYtyj3DS0ruqbMY0()-X49IE$IuauhX;6+R1vA55)pDd0v=)?0B6%x8`C>Z`fG>Zge!mNb(WaFr= zd`S~&u8+{-NonuiR_gC~U5invs9!diUF#jk(=}hG{{{80MEOH{0FLfHfJ5C2)OJ

;uNuV9Z(b~ z)Lt43cLG{#Yx$Aw^u07{LhBhIQyp? z{EG;?^L+n;roNo?`>Itf)sKVn%=hd$UWG!rdE)icH_ti&)1+)ikaf*gO@B1&plN+v z6MVZK3KR%KZ<*t3lTD*RTba1>E}|liSk7ktrT*Ca51o|XQqw>b#_#(S#|Wl41-eiu z6clUi$c3W_%&5b5;x^sT%%s_v-PCqy#T(v(OL+|*#V2u-JzM@MDw)~y`?8zt`R3$o zws(?#QYyu4z-7XG4&H7y=znI%FU82O_js>H)_Sa3qX*+bAmTA?i9sS_9xM8Z4Wg}5 z$&Z+n(3U<+cv?CsfxeQg8-+gjB9;pF+ppUnz1D7Xzu7u$?|X;uy!Jt>xz~ng;2cpp zs#X_uBtd6#I=MWXT%J#Ue*dAzg|lULOT!^k9He4O?>fheTwLn+kAGZB-3sVv>Ey_R zlW*)8666YU6H@OwKpsQZu;QVp0JvMA#V z(15NGQL&9VTltl8m8CIMVH;?Y@?&qnl;1DA%PuT|ErGk7X@{7>Se)Kx z)HKM4Q1!2@a(UOOnfSd|Ds|h%Dk!_oyv&=4>ZiSwCz1Z?l#S=v$*#bSiQdfYzqqw! zJX1=xvJNjlDp6et32%E` zOTl*c2T_!6MX&`|rL<7U3W4qoGY)hCu0)vL)rD4fG{!%%IVM!x*2laLr)(xs!KHSn zxI_boMSmDMvdcLM*Y&WgKh-9{6~3x~>*mhLdFg;D0hQ#aEHzezHZ^lnt8Hj1WHfdo zaS`U7kB>(e(@_f*Sh|uqSTGAhT4&_UI~1^xuB0!dz-n(uG}j_9PDy2;G4aX|w-@XdsSHj^(rhgL4ONQb7$P#6#D>k!la+FtI;J6swl1nyj zol=O^Py zo_|9Ey);RFp5(QzG!qGJ)?VoJ49FW)LYx1K`SAQLejk?pWyQishjBK&IvGtS+t3>; z>lkfzfelRz39;a9y8vMkEt;f9t+LCr%Y5|VoLp^z$a@#>J+PQp%-Z`US*7HkHrT;I z!1@E{YwbZHC8>?bdKcrAFQL}ks4UTGXMceaW6LMX7$4l(^sD88RW_ zjV`|M8lDEaDn0>uj_y&jouNf{f(7%{kGlKLq56XUvvGeLGG{zeIe8M3)bFKKTW{Jh z6n@XI@G20A1Qke~CY7aAN13{*rKnjSCPj)&V!%^kTe00zZT$B-5U`0!fh{kQe19(A z|04 z7cpW2Q_^>wIE9>pG0ZvI9s{%xh$I|@|JXNtltkc6cXa+ZKz%I7&rl%HUmTSwN_tz4Kc^ObG6gNa>Gh2 z=~?a=iJI=NRYr<7tH{bs-;6BD5@qcpV!7+-ph8w-zPvOIEep1OcH3HhS%13RJCzv{ z!J4C6^(RL{=A+$d=3hu6h+hG9yT9K#G_rb%>(DUk;+lz4J zgYHSJp#W)7*i004tKT8y&0BH`qDv6W!C8}^c^Y!ls1{Gn@i2G(B4~S7LO^1&r-AHdF$v@l|J_tt*x3y{m|=#E+y#IQVG?6e zT@Hn=<+hF0t{l3)TROAo^=YOl@~n4}BrXHWP6g*79) zr1Xz?l7Q5@8vZ%^O@Bwu_?X%Qc)||#E z-nQFSb(g-$Xf~fNvP7T9;jY|NY!@3FN9c&jhSz~Bl@m&Xbp1|feU=(~Y@YHvY^9^ zaHn)48(YM-TqJK81<)od+cUl@h}kLjp2G0l5JOk>VzwBEHKGuE4#DtKD3y!pC@^w- zye2RR;960K=v#k;T%&7+J{yI1BimMTY}saaa{BxbnTtfo$EIbenjTQAVYI^m+p z*%q8_WS|E70_04{ut>ICR?^SAGW~?9b+(feCqFRy6T~l@lRp^GcagPaJvpGyS&@G;s!nxykx2~o_Z|5I??B&x ze`nN`K+@=b*HOO*+^*k5y~ZA8PcjEWn-<3^Qw;*y&iDVn5AE^WcfmL?42GvP z3NWECI1zu-p}2bQ$K+r{NA>Ef5q9dRe=~J`c7wY9H1HW^9DT!6uVok_+L1xMn9zVv ze1=YO7}2|F%OD<(A~A~>L-ach7aff#xd0>oz#hqK;?-q%5|-|d|Cjt1S6&RM7X zrFRC0U?MrJ_`)f@!6mm-I=;NEEf*p?uP+zp*?E6sxhUIaE9>G4Mv^cf(iHs(yYlE~ z;d46b^H9#LX!Qlf8TJIVp$Y4SmCQPFGD6Bl$NO{!9hd{!49& zBVTU(Pl_VJo;SqgT2|;z)hbRgCu2MFTqbdmk0(*7y|M0&afk`0VM<*%mucix?AF$S zgOGn-ZB9Jc*jr}Bgfc|bbDPb)AF&K(MI?pUQ0f|mlNsi8yGZv*pH`b_K9T2<)mS}t zQN4Uz5Q60&x9OP82dkO07EtUsg_Z)sdgwq24fRk%32`07RY)rTL8}Dukgja^a z)~=AKBoe!c^V|2Fxkw{vbO9STyIVai!P02v%$ajPXNH$Mv+LQ~nqy9>KQl*^41bzW zFXvaU-J8+(V>5^KJk9b~8PQo_ zxlVt7KAnYsy|`Cbr>5uAd-c^dukimXI{uq!&*_V`k!|`uIdp8xp=+Pk2wb!IrEQJK z$aVaHoE`jl@Q>lo7bo3={o#4{?C|(UvQ3Qo&Q`VFdtdFtHF&lTf8w`xbf*FTRX_I) zXw)}E3!`s{zwl|_Xc#Zl0sVi#4B(&I3}-oh3jiI%)TjsJwKj8FzOihIODmdq)(117 zVH+yZb>bX4A57aCcW-AD`s`0k+s}B(z5FK~1?ThG%=Lm&ZQr=wkvS`9%1~-LSslkF zH<>#l1e;in6<7fGZ?tYX0jW)F^U7}$_FaQ2XKvd~=)|*}t0acR;|6~ljxRP|KD8%X zTiKYZU%IZ{Aoc!Yw1yvBTc^8c=Lf@sf9xHcb`MXEhw$Iw@!xje9_|mj?@kZMH)2MO z7fE=Mi|_zooV@XC^g}A!+iBWsC=`E{>OMxIse927cWcpS20yTu>yp4fpco6uK4K8K)oBvb^UPaP z^XP|7^rDV;E!`@xq@akm1o_?m5ITl2es$KZg}U z{%(*y05ZIyLEV^M@>#ZV?nCzj^=#K18;xY=wdv)7Gjhj>5CDI1dO3uSsOOmWkc#_t z1z5cFjf~y%y~9JJp#w7TZj-}Wh~#*`wZKFeI7Zn@fwmF&YQh`MG#RoL_-F;AYa$x< zYSth*N4!QR=sTllY^9#Cp*`x)?I1q-IsJ8x3m<_X#3utKqKgDP@>*Z7S^6iJ9yR}! ze#Aliv>5qrmL}=@bL0Yrgc>RO$1Aw@+>gYeAIXB!GRwNE_kB>` zPB5t(7Y@Cdfm)zrGP*WB6TW#qjAeSH`qZzsGr(+Siokz$ve_iEsa6aZA}*4{$Z_9% z1IP;h)Zs@6pd}ELFd6INA|s{b!YRfSO%yfce_V#fh3?&9r>xj7z#9Ch_7J) zhNwhZLn8_Avgn;N7Y=+343k#u;qnL#Z!sHeMBNGL?}O>ywWjnC32g%MDZN~h!r9BM zR}mnoFCcVvv7!I0ZmEYU~EwG6+71Fj!aGa8c06 zQ0Mw3xgTvOP4}WnfyckWv7MYo->055^aM#g7Wl*6^OzTaf?K!VelXr+j``=$I?CKd zv-X5dPAeYqs=4!EHV>G=t2YpUTB#XXUBvWB?O*hkY`~OCMMqQfbnJnOAF{7Hlm&L(ZJsW%F_=$}M3orrqK3sq8 zOt}uu5(ZI31Vq24$(}7|g5eEX)VVqUB6w(puG!)78x*STLuX<%d7~_$O(-CaqtJF; zFC?gtA#f?hFj)Z;9YjW@!cfE%I=fj`YjBVXFj|U@im;xsy7#6f`Pu^VS%V=So-jzU zXsQ}URr9V0mHDs1f%9(9W7x_TbCrL}C2P+Xu73#~efKSQ+d_)e$)p9+(KXmr z?|Yrr4}**P(#hBA8=H1T!+6&;^_lee|1|R=U`7O~%*$itdLRQ(n+VVUXi< zCTW#k*Vl7`VhOn7utncwYb9kTP#sV6#R5s(jum-`R7@!|o`e&Ta|U$Z!!J2H?Yy(TP(-~u#mywgJSqavO=Lw=oY8f+_vg!q!B{;)$hSE2{ zNzk9udrLC=3EiwP&`~BuL!B`JeS`%qO%mRP?(lAyuL;=)nMXlQVb(@sq)gf-PRJ^{ zDhfdW%6gqa0*v1mhf05%tNzq)#4=n8Nvs%IiW1iOZw!w`WF4}P4*oO%!13$c^#vH~ zQmSSI2<~rSZ}dpN9}L!?Y(z2~zObi&^3$_}ABQJz-kcwFhkLuH-HWq>67k+}rn0|| z>=MYVw>c=rd*r}Bz!cxt+s}3yb>{koT=zM_c9?ExY-Es`1YdtU_h{Z?j+>frciClC zkjM)?v@J8E39IDJBh$w85-_L5iuHILmn*ofP_7BI6)~nL5?diY41Kw-hK3>fA^YVo|1YW7|O@i$P8Sb@CWbHaohkc4=*4lnc1f0 z5RUm5TqtR<AgDHW=Zi|J-(NDURDbK7t8hT6dYaf} zYf~+&n>#!l!U|UxN6v+OT`g~8)@YT-I3rs-+pdm)XuW@uUzJeaSOz&$sz9p-^7~an zJ~{nH_=&46iAbgGl8hFX#f3~JZm2F&!U@W7c7Pq(lLR;Fo$MOSgD5kS!zwe17qor6 zW@RA&!%OzEF5qJfgtCymWz`Srkd;Py*lknOEmKaUW)>0~PEL5zxT+yTkl(1&lmUD?EFbH>j@T)=!I~0y}Q(_Rcs}!k(xW1_%wJ;F-P%NdW*ck_j)980kRyP>$H@z zQpHM&Cq8tlDWv2`Gi{+}B2qJPQfeacri0O$6G1^|J&uQO99cdaR7{1yT-!#GBb4T; z^fED{k=32Dtz5!LgzmNS8&TZejuqJ!W4eC`$*ILly7g)sn>ro z+fU8$vfPp;fC6%0A;yZ_5fTb890b%2cw!Z;fMd^*UkJ;M;zy5L&rS3)n%rtc6%%FM z9!d7>xi*LfGM)PYxuj&`q9%rkUfvRu@U7{tM@&Zs9MPf(b1|fDwP~AFNfn@P;ztiZ z2Key_KkoR}i3gHoFJBf&u(TPGS4V$=SCL&2j=d#@RcUEhwqn(r~{ z4J`H~Ol2j>6~%`TEyAn88S3*4>XmZV7MK+uV&zVo9tlf;nO9mIc3uMa%iw=`l|JMC z9JMC8Z>Z*3N@q+1milJSB9i*@I<6Qq8PO-a@?&9m<;KGvliO8REg+OX*pU3ehW|-y zm>USjD=&Vlaow5;vva8+E?$3d=^tF0zW$rJG#x$Hx6jYEC8L76s)es0Of3<$;wW_@ ze3D%zTRJk$UyTZ*EhE&qSa5aA?|nC}e8&JHosd8Ndrsk+DuL{#x4ohkOv@;HL!5W42VrlxPdjYVYHz* zlJMa^=a*FajIf3vJ%;qg@`EVRs4Bw8uKGF)QN#tEOL?4(f!L0=KdpZZH__fbiGv>R zOiB3MCE4z+`;p2mn}LfVB~QbF#b=c88hcUP5cRCtdS%2~=^A{=X`xIMM|`1qoo%iz zfJEs=6MEwP@Ez6*bd*SiMLktwy@2RS_mPX?SZ|$h53@7Eogkq+t5o0~1}?wTY&}cB z8g52SiKXu{G;P7yIPQP*;&D^MB?W28;i4ltVBF2koPkprI&nx|8T(Tju43IbpBI}` zcmZm`e)NW8I`b$G#nug<3zm&r5GQES|Eax+|6H(y5|(+Y$Btlx5D4NLEIDElv0=_9 zvcrty7P4@zq08izZ9}OY&7J7{leF`a)^N|YC+-xFsjQj)WXXTWH)^#fW6VSnvfyNl zhu-Q?jKE9@DX$Xj#WRtxik))Yl{kcQ8UET_Ie+n!X&;om4C6kmr8@~Rc`;jXOea7$ z<2uK)HhPd|z|98R!V#Uf$7O-u?#-BAUoNZ|y2uIs-MmdKyO*$X8%$&>1?rd$#;5T3 z9QhTBv^eI3BgcO?DY$cc%ushpd0EmJ6EbFq-Zt5{#%#L+c&1l0!1VA8_je*4G=g4MQ20SL}lut2vh_3Mm9$bO7p59D6F?>=~?`p)2%Z z5tUZbD=9b_uhn-)!I+Np2Tm{?1*x5oxSdhUEJy6f2 zisttqhh~3foOZI_8tkwmPw-(r$6Yc>(iHo@fqgCbYI4#-cufwgeiPrxXO@vZWhq(VZ0?`Q0jMZQ1xlM(ls7P=YbEx#*IyWhn zXor7n4gh=oYkH${J)Y$z%()UA*S4HVnINL_hGRNq-%w`K>f7#BU3Vm5)OBkSXq3K- zyMBL|?f$LLU?DYPdbEze4a2^|gP2TN!029_L>}RkuyXo#`5*Au-|ZfB508qEkxihD zS@7}%>qwl%ZvO&f){Tqqp0T8m3q&W#!DHxjDBO!7KKKnDu-~!B={w^sj3;rpvR`F` zhdGZxndNfhg_9{3H>_!%5trHspELo>_lE;YcWNwPb%ta;4HtK3k zwO+K6Wde`uEp@Iy8FPG({FxISyb30J-{}oL-C<2KFTYmzc=JNp^baJ6m_XRK`i?_y zf)ln^gl%$xrV0%3p1!HrE3E>@YQU8?8Nb;g_S}WBOo6HBy@BvZoY+Ceu@>md3}k?~;hGEP(h*A?AC$ zxL-L(i=9tWi56HMEdmsxtUBIFZrM@qi~LmhAhno9yn~@(1=tk*#rAy0!F^1+!Ptx% zVF5x>g0FaP55?`VA^?kscnrEokcEGhPA#moW=HH4z?O=4T3BarmS6C3;DyNU%G#|;%ss7^x4_s$&usRo%8MQ#3AP~D?H=iWC2Ab9!%Sq zN5&MB=kXH&-}n1Boeq9{-@?x^d~CjkkLMlydomepMDLdYT;r%_2_gaT%a<Vv6IIn%=9>n^!&>VY3#tn*teJD-CxN&&TGi{%L(@3;yeMgTa629>L=f8?o_0 zGI;tIx7e_jGY{x19a!wS547Nnwa-~Hr;Uv!NUwlA-t1YUv7|i)`~-p=8;0i=;`(CDS4M@1|?3 zQ-<%}mq4GF+;h#Ho)^=CG0k(Nf(wN7+UFxbxipXBc#Px2gQGFuKTHPmJTrQpT$#Ku z8nsJqtr1AnVa(I_Wl8T*VBw_ENvvmF$?=7q_&hLPfDRLi6F~#5xO10b?hGFRq?dv2 z3?~|Hx1p@S4JDD3S|sDGz^JCZ=apsAd8=!q&X>aO3??Vp1YPXVa%Y+-Cnxc+*G~sG z@on1c_gg>cw{iUSoY!~{EuWz!K2nzt?+h;ix|cui3>>#^&<%D1e^gs*+b|S<_peY& z*T~R~4O#}tvaxl6_F-(a+f!YPA|KlVSu(mb4Q>AWBwrHSxs1Zji?Pn_)A>G~PhZNs z3<5z4&?TXO;%i$hZ1zn)(T@ov7auMY^8O;aTNSAktLRD=r4%4c^h-$!T2F((>er`5 z^Ct?WVNyi5Rv1>mf97BsP)@W)H=?xW&L|)SVnxZJaQPZVHwF|jQhm)b1sO3AJO{{G zso10YL#I;Ai_)yn3<=BmwC`lTs&m~x3>>lq;m#wYEHo~=;EbZw3hHs8rY@$0bF$z& zox&=s2IKA2+hr@J}E4f4hmMHpVgUJb7K{xOW}$>fo6mN?cciQzc@G5>x2^Lrehw^KdFPz4*_G2sLyD9CiXDfZ#4VWvtJo0bDu z2polnZ`fvq$8NJTGIVyX2q(w9BbF4G)4^H&R*$ ze*ukDU2mH(6n*Dc+=r?LiA9^#X;QN+%i2uc)1o8~n@SWpa7iqILAI%g*8KO{5I&MX zIzNCh*XNvj@3Fs*(_Ly=oW>|q>LaY5vUrnie_OI86B7dr0Cm z;mDOYe-nw1QVuQ4kEoO|&C$;k-9-44@c@PO&jLMC!Ct6BxRF^HvK%Fh;F%0CN8$n* zY^W;UejJqVBqpn2xii~D%!e@JzG4XniE44gu&EGq-(Wh$hLX^X8?|Hd!?zY?9a>@^ zIvHpXlnl01g7Iy&>mB&#RYPzMKGb!okxj*2f2h6!3~3fAjl;7ja^aXC=1R~#oa-lDQek|JMksKkH?;yA6iLb60E{N0SIoyPJC{B?|Ci?)Y(8YO|A%qGjH z^=V{NZmx_FE%khhy&yM){@rP-_l0M=>aCK_L>3`&m+2MTG8XL`Sd}v{%r(Yn9HD4YISl5;z?SWl9zF~-oJcNOHofBpHPbz8SbSGp~~Rtk(;j~BvOLQQbd7Za!_ zS6v-4<0SJmw$;%v=&YSyE{!;7$h9Z07aU$+FI{W6oL<{jmNiiw2dK}S^{m=|yveG2 z@L;_GiTxSR=Kh4U@ehmH>Ei7B5 z0S{hpyb1il>(SBmY?{Q^qwQoiPhuYDqk}Y=@GN`#x9qqFo{RI@ueSy z!H4v0F@qMxi???L{3$sLC-(hY=6%9qdtf7W)qY_&A*LV1IFsbUj?eIRL#Y zz=Lqk<-fae&eJKd-E6?+nu2NBaDOODwBXFk)LHuwqW6G9&u#SjE!~yWj{~S z4`*j7Kl5|`m42PebTBJ~$k1?;h>$(+DqYEq4Lg@!tO4`1?=$+duB^{mn5Pwfk{6 zJQxGq1H#G)?&!x|Y6fjye>b)f6Zo@ilZKZ-CAK>8qv+J1T+|+)``Na91D!@wKgxK$ zXEK}laS(;E@#ZS1J>l_X?MWEV7kTX&EjDh*+H>IC9QHkQI5uBm`@{eh1`$8DzTscP ze3ArpFjG0(qukFI8O-_QORdFRY@OYBnxr#dh>J>tgizcGGyfFCf1itNSss{3!9&I2?R49O*c37y=9PilF}acBSF3W=``cH#{ZUSUGcs4l?qoA^x)Jx=^ZQvf7&j8Wv?*G{Bvkm(7Z#)K38Znw4 zJbg(|e+n~{;>ncJvP$p!F?+*54g$8nM~{*_M_Ij4qyqK4bD z0lu9ki#VWne^x-y{9uS9^Q93&@Bc#YfoNxoIX-wbkR3o=f2NB$HF_nc@IMRe3?l@K z*&OgmY4lfOCc9At3L;{FJS@%x7na_>qPNE>=)Lt*knR`rB#d*Gr@k2OHN985$3IO- zrsJD8^yYhDXrkFB>-ZCDlqU>k$EP4&0yc*ZFcy+<#%D=-&63mq<&(TaFa!xdMhPrY ze8$AsT4l*CKL9h1vz`OfvMWFn)|dg>47DZ9 zi`t515ZudBKg*(B%# z(YeCWPK_;K2$ms=&evXg?$b`tlrfD)`D3-iV7AADx0j93)TLcxGM5cGH>mIWmj%<$jV zCa>*Fix83eXsH6imtmSOpaDJx&es1-0p2`Jc|Z*P=8f8O(=ei`>P@JHSfqm_5_960 zQe3=Iln+>TouPry{ZbKz(?v{spN+?4WS}VUfBZD{uM4XHnJ2|z(HH<(884!!&tx00 z28u_*5GelKn&LJtv^qThcF?1-g-wb-z-!*hNFgx>ahK(p*Tv->!>*3Iy`I(@fAaG* zxneQDVxxQW!o2SBIWO#KVO^&@3PCjhWeQ~a?CLz6oUtvC#gC7n^o&uR^ zf5X1$_TCoA|6csInxBW++I!9D0@^5Qzcrc>(Mv;2kqwE=-o1OLw|n-Cc_S&3yzW1T zdpqOfAJCo{AAR^Z?Dp7izp?IU)TMr-on5eUkM|FM9v=-4J{*34Uk!3skQklu9Dehx zvnp^}L7adu9H77s8OE0$wP>IYG}}dXfAR!Z^$fZ|18Eg{ip9)EhK68uaPk6BKA-Nk;p8ZRr?k=`O;&X zAWL)mz~o(e1q{L2J(D{{>nlIZf16R8EwcRZ#^|BfW?A8Zkbsgz0JVBZSBvA01 zRnY20Y9fvx_6!KcZ+AG9u#8tesuFUFSkF6N}}p zhBr`m%)&{UU?Y#5U=xZ)PWc3#%0Pu|O71bcRwFy5@~sAfr~}BPNgB>`e{j{yfk2(_ zl+X1UYHMcG`rP^bJ@lbH< zy)FX_ctlXgGk@-#5Uf7y!j%0vSE2nbsYf0D+X{F@kF16jm(5he$AVKAJtxv3W~j|1 zoLzid>5}q!1fKc<{&Sv0e*uSO)LR;ov1+e1+k#7BFb5R;l*<6MG<-gx;nR!<&5_K1 zyQv1IY#}s`WEf`{Q#j5P9y)uUy!t``Ds;Yq0lHVp<8iIcuRw>|%D|ssEPwax6?^sF zvo-eW{d&MJ*J*=21JvQ+;BB`7>I(on4}*8BD{mQ}oF`x>g#mm2f9%y;hRTTke9JI& z`EGSfHNihc8;bhS-}OP}dG?Paz3_z>jHW3%Cf<1bare`3Jcj9}4ygv@Kk&m;4~OE< zGy$0iJ`LI9%+J{B1$vCD#-68LN;Zj*F-C*RC?~iE01D{%j);5dWcHdb2!bF8Q?K+p z9!pbTZe(X5Q^ zfpU4aRGn*>f!_9N0>S0hR!<60W&~a2Tn`wb2b&9YR_3`^e*+=AM62wT=hyYIh27OK z+r>Npmq6eo_ngISIOmfKo=hAFa4aXEVq(!Q)SQ-4>zvPEN<)g(ML-yu6 zYnT{5<^A$Pe?3@tfbqE;gmgh&4Ee&}9octtlUB6DX5`&7jCn&-#z_PT`Ic-&Q-k+eqhXBE#ue4JV*6d4WBA;&yi;#l#mo{ke;O@B;AvwpFasX=qX{(gMEIne z$?O+U38gh^YlsIe&=}fjp1*!N`Jf)Zk)*Sv&kv4U<^0?&&_07Kjx16Q8R;}hqQ{kL zx0F{+vg*HHPSFZ=T#E2kAqJshtI=<5hl*&%f4JZhX&kzF!=KWZ zlH;N~f0bX)IeAog>}b=W$kMN*;DENaCYALl7Ryt{ut;`N0Dy4f1wP%BzYh-&`w9h^ zfdFReYt1W{cC_72E+wPYEYMh?-cyMj&CDjWEVwkNT@u_h2ix#c$PtG&DQ_W6)LJ$G zs_g(1QlqA^%T;hK4#L2QtXBoJ&iY$T8b~-Uf16}vHpX&k;gIf>9D}OKF1&+8s1;8( z>$7_Ja@p{4Ad;wrG;2B%`2&0kk>G{WNbXo6+;R~BQ0|73Sn}L=o@7}FGjd4Vs^KlC zR;I8$&Uv=f9TPt$lux-@hCogcULaCT9Vf!vV81te;bu}?b%!m>5xRQ&4`T?5Fy1de ze>jO(lPb$nFU_uRG>P5G zpQCBcqo_KDdl@9Aw<4|R+D2WOeJ=FNe>C#XF!*AoDJ(_eJ~KmKlZgAWEdXAT7Lbu* z{Y(z7cRh`g$%U{xEBz`d+_sL_A&>B?LcL>=tnKVHOjBzo%-*(il7@9%cNE4u+HD0g z;E=A2raYO}7QbwTquW~XG&Ob?30(!-8t4%zC-=_bIs($-1Ry5^w_Qo7YJA{of2T2; z*1GN?s2}T*n+4RZw_;^5>r;>Dui5VCG}wW(n#PI&>}NE@mMu#Oja*APeG9B_yPxBWIJt`DWus>A?`T1{YNm_Gf93fN^tA8_ z`c06}{p@?rV|AL~-oVwU{&8{1#I=#DYu0?w(z22`n2bx^8+w(1gOO>3I(2PBCurjV z&|}3ZjsX?AZUC#sPGQ;by4gIW_zs>9tgVS4%bL0Y_ktlMWc*K$3&HB7A;08-BYe@m zdd1|I;VyBp=uw$V-eqdze=S7qzIkgo>{^MZ1;Q-S%a#+PJCGuI#v!=sQK%axti9uN zAmO{NJFzpdZDS_p#I`23ZKq>rV%xSo@x-=m+dIF#&OUYar&G0Red>RpyWYE>_qnet zzd=qOa&(2F1Q80KWW0k2?q`K;4R%+Ps;dGII?vtd3Hz^Lwk85*oV_C zg$_{V6W>A2!OB;a6WXjd<=7=gTsb0Yyu|vpqj$GAWDBnoIk>BuFj^XVv}i;RGCD6H zd01cqff_oP5@%W%;qpR!fUTJ9T{#uY7&IEq_n@%c=I1KTdW(L>IM@T6vK9@(3&PGafagTSa)WGnU4meGfJ%iqZ5a zY4Oo20zbL>LtB<)0D7B%Ljl^XTN56Eq#a%Y`Bm;;R}xtT6u*YZfn?I+i-Y{uWt2ZO zevMNze-+x>FLEj>wR&WF1KikaV(SLJUc?3H{Elh8EovK1adIAn{EXtP7Hr*b*Qx>? zsmD<$vFI}E5iU5D<4k2(wv7%_H;`z^Do7d)*6Mzvl`D4^04#>8XGH<7km4%AVjw21cEwAd+g*o)fnaiW!U~W#e>Vw zyrhJ3Q(bG9)!NK{@%ehTOq-mP*PNRl{A_%DH~V|=Za2bXa0nsaI>n@1_un#JYchv< z`e#7ocs)}N=-dBkO0Dsm!;1}&>!!*P!6Xzbn6}IFRSqQ&%(JZg9m5Y1q!h}!q9zrz zVTq2O>ENTQ1)_o@zYhHlM&4y^PjH~YXoA0uoE3od%R@i5V!p4{#n(Kk>Qa4maoY*DeU{~|fB|4v1lYOy6+ zMzfCJE*2z z`{6Nj{Iep|1jRJ!igz`uy*SXEzCr_wL;9kLXyAdL>HcMWLoC{ZrjlQXupYaYWF>1pW1lmMem0j zbcUiM>BUe1U#cn)RUWoQ@ga+4$f#Wtl9ZxZ!YUStSVLa6`|E zasqRYh_g6(dQzNT72rs3DsF^)kB7}4fJt*X=QFJWrp%p1#gJK@l>4uzk1pl3o-gkx z87B)*hz2(N+Dvx}5e!M6K*wP$eaDn%zyZNOlzFRfwu$Nwu+OsAifmyabIl*dvimFl zimAdxvvEWKMgep-Wt0w8A0v)#7uR8K0S8KIj=jZF0xX@?@sI@akIpDMQ^}z-=YnQg zNs(eReW8!a_1KrF1qMvS*M5Z}IPgdPj`g6V1dfowGF(d{Ou{^j3ThSl@6*D8;IS3S z`z#RSXHHyh0JY^@`0u0>%WpbS*@oe?(N#qX#+D*;t$(_Cp6YE!_?oL`CI$$~<6-sL zL7a-u(z$BY4VIfQ9IJ!n->!?hXk{t;4opyAkr7~M znqlK{ktfCXf`6mHJV+}%Dl!rGd|d4PbobRi|1Cr>zw}%ndg9b1UuJK+y2h+^c9kv9 zF?LTH0i#2zmozr!h7J#LqfUU-yu4l$U6AD7)MRHzvHEv8fimp;II2O;kk)VnT6Jry zsOLFZnPf$oVG;G^rl%cw8D?(O0XT27YoKTCgG&@NmBG$2(0iJ#c z=W0*stwNSqkjye`YRHc!v2ZlB16SnSr=*Mupe-BfsyJL;z3`+I9hbeo;15cdkRK)0 zN)V!QD4?R5xZ8_cBYkZ$qvte;_+!hKopk-pDSdcahrO2WA5K$zaFEb+t7R3Ye!O~4 z*$W@)=FW1$W@hQCDx9K2z6jn2+?-~!CB}j;WzK zknN+z;kJJNr@8SMJHqEi>hO4kQMb$8ro-<*wJZ40YJYYJ{Q*}fCV!fd5<0i}zN61$ zf#8DKW3qhG;~ScWkkZ0w1#qsa2xdwm{wci&&qsTd<0GbcA6Byv?{geKA8wtUl^ituGYv$jRWzpxGQXKy8|i zz`(?Sba9G#_I&G4ZaMDjE_anlkDBMFi!_TaF^M*$I~{>@Xa4vIuRk^Lx$xQ5+C8)o za(9WSxrwo3fx)vFt=Z3WlILyQ{4%?fc3lp>)-aWyYgS?a4Z`tyHXpH~T{A+i*VW zht@Qf9OUR;0ZQOKJZzy(etF9oyCYeLZ1dNebL<_&-z!XnT+F2vRyP@Ipj1aTN=3F? zK_5N8eezn|ck<240deQmh(+VkL(j>n%k%TBd7A3AP6uRHl2H+%f><42CB4mULz8|k z2<$lAq=LFlHn&k6$fXb}l~xzeEE}O!&XEr*AnBgNC`C%2IJfcXDR~$cz79isj6yVK z=cb>SHgjfqah~PIezp7rK58B&87H&Lb)hT)5ZY>XoOf9+RrXsugr3@XZ0y12NE|Ef znaVo;B?;XUnrt14e^yuWAf$(WYSbljt|iB#BE-;iDG+g+$%lGGWohyg&Nnt-rQ>;{6QWHwmF$alcIPLZq2l1%w1~BEUFd)T&^1iP>U`_sTG!w&~ z8UnVzuweV9aa+i!n=<=P;T)1VQpbNhok`r zN#UPJPAXP5c!D2=q4lywlYi?I=!Kq;p}!YgFA}w&U|ao$Er3FJ4aahy-0!7N(Pz*&6~(${iEpx;4Ds7HQ{^tJ<5S7!HC2& z##6H|sc#oWkv!^RKuWxGBE2 zjj*6u;9Cd?)RQMs4@^@kY_jlC!OzS@zpNhNf>J;kB>3He zzt_}dV_4|kmUov!6D0t){eya$jh)Ww(Bv0^bQf$ez~@68H{5r_tW3mCbdRWXlSF%K zFaNJ~Ilj&!(JVhhS(ChN?sCbs9`XE3k!jp9(;eS7KWuL?xlS_fQdO*2`Lm?H3C`}+GG@xDf{E4eL$F#Q-ji&4pE~xAx#hA>5ONh*v~b@%WVZ+^>{eR zZ1n^(fIAC%2BW)R(dY1R*4TVG&%==({szldXD2b$>Z7M-rU2E}L^D!6%brt9%>07* zMk@p;@M7)m1SDPuo}eoKAFcRgbxQ&~_f`^O8^TOs;VKu`(eK~w#VybxT}>j^5=Vv- zSnrqdXZ@Xsg}*8am-#T<0hgx5qn0eu&ud zeAz_d??OW3%7S0|v!zM!QJe(u8SWpAcV5Ht>I@pP`pKLerFw?+hfXCW>?kdXjEoh14-D_t8;` zO^n6;lEA@+TP}J1sK8I|sDLcTg(b>hay9 zHsK}DeaaBy?F0sWlRAgVW1f>@9vYGV4wbhUcB91PY+>8n_Q~TZfkEc z`P#lN;vPngQ9@I{oTC$UfpO~gb%dp}gUQVR`qpLsYciegQDe7ch3uD4sLl^HJTZRZ z*?>f(f|FSyxBH&XxbJzHdFx1x19<^C#%3WK>s#zWe`Nk+xcx8fDlx=&j9sWA5{*O* z0jU6J<6JAYcqjXx^=CHyL?5oRp<4pOYa83{{3dEPhk-=%dVrlIsTHQRQo}t$_h~)K zsFR0cS-$dtwi2_m!$g#!V7SA+x*@cKFA}uC?Pc;_}$@3FAhQ)wQve! z79nBNvx6g4G7~Q^pIrT>{CwP>U>J+YW~>HwhPv;=;0(XqtJ{EMPec2J+maDW8r_bt z6tpo6MA*@nc|hJ9dQ(FaamhA5u?|G+CSiy&gk|pH98luE4?gYUw9Pam6g$%Y^<%id z_z5&q&D!!mtg;JTW@;Py0LOx?%(yO07^|YD` zqa$_oF}|**hv%v8CijolT_aFn6AL8{7{p`zsrS8fz-7PGom%8|$RjX#b|UoDpiSv- z+viz30U=h^SFI>qqWr`vT19ORT~YQ{(ft$XNk{TXYS07I^K<@l|^q5j_tbZ~3^j{w`rSp(f7{uEKH zA|Cb^V1f)rl8Ye9YbdHygd*<}E8eZ7uxF4OqL{D%%|XMNh?%F(-1nIWC4+=L77_N` zkW#J1QZ4NlQjrCN0t_kXT0~E^E;m3#ju0tEg#t}TtydI;r>4BbI#;f&y@7^l(kOoR zf{;SJwn`GB*tMp~^@aXQ)ZM0L59nQKsWh+yo;Jrc6JUY_eyWAV{L4cJ=N5t(lScPt z--V7Bl(JuH(7bL|r{_*Cn8Gp_?7FiUn448K*V?S7YZuz9`Y0Hdpuy^6r3?Ir!$(Nd zZ&J&&M3oj!tD zFkrcWS+-OAq^Gi?);`PFa2Egh88p<@ksU?~5opD$R&qFzP_9kO=|{_0b)Hp*W>UWK z{zA*%Ha6GS48ARYG<+mlgrnWK_I0i-Brhq){%kz+YWJ|=)S-r{_9VwvHb`B7&lF&S z*pmIY8I1Lrawsuryhw7a6ct41rR6*TZYX{zqHM?eWP|W)5#*duoN`vmCot9<|9!Vw z#whMGsFPb`=!`P}!(*?;@_#4gfJT?0u8P;YJE-&kTSfb+hyX9XL4>sAkxshw6>*_K zdg|%XE|l0ENMMuAmqY96vL7L*XD}o z35gl+&jR%W)UJ;0CqeR~*b~~TpXt4etrJoekz~#7wYUh1ZdL4eHi%*5RvN~oC)jxtp)+16K{sJge1t@NkwV625wp94 z1uRF?_c))lt=#^y+_~qvP?8V8GVwQ}6xntytU>9Y$wIx<4A`+#a#hur{O_;(w{OSS z-64M#$`uP#oalbHV;Jqds%v|J8(Y@&RsSgC&3brLfPS3LK#t5NKa=V9XqOdR%Z`7L zo$h7{l*49ieEgukZKvI^$#c|kVNR1vOx~0o_l<_~JZ$oQ(YZSWwZSC@E;ktOAh}Ns{q*GFs@1tdn#Efed~Lp}mpm1a$*M_urs9z^mfny*O=MYQmX z7Rz4eo?WsPOB??#dp-xgK!&>m>EO@Fj;BZd9U>bRsw`w=!)T&MsUPWNkHu%x zuj7;-L;1SiYtKjUnDx~8aK)1*%=v+mhiN~fp|`a{n2|e0Ns+nn2zWfml8EysWCV>l zNGCs!&LLCYFIYRE;rzOS=1d)Pt%dg#P)^|X&RoO}jY!CbvgUNZtcW<`l_??oHDo26 z2&9EOSW$zW<57$$FX*etw*(eVoIM}Mf<@`vSXmzzE+NgPYOc*kPpBsiuJ*q`Ozj-= z?MI3rpP*V54iMuxOtehehsj`hS!7C}6hx{{nakEv+-7WoS!9iHWw0XH{xsiR&kfh4 z{eT{Ll_RI#N3Yibes7~K9~f4G)<8zH3iu>NY<|l_@=^5K_<9U>IztVsdto^26N}LW zddd~h4%4~3$E;Syl}Pe%Ze{p2Bu+t%9H3DXz=>8mD~M6yf#%udDEY2V3M<5F_7_B@ z{j}c{EW=oOrQLIQW4r4ub=Dq@OI0E-#ws!5?j+#iFbf7K*zX(qUtv}#gum!%m0Yp*(7i2 zOCP%1;8X=q4Yj=;*nN!CU}q;D^w1{I3b#FP{}!!;m5qNdr0L$!ZNkV%^ondPBUryU z@Qn*&q&>h!Mn+lPw=a}$m970u{O9}ZjVBUBGB<<<`-h09U*U;;nsvbW6_c_r_ta*Z zYv?-};2xo|HN+6^9miR0@Jk9?6E3ePnT(5 zaLG-hlL#2)5UA=<)Ds}U#iV%m0o+1R{POl1&>WKC{x0UPd_0aup-jkVqUeZNnr?I2 z)Y=3C`PCa97vIi}hk9Agaxl9;SW~w6beef;@fQZKLoX_6eNni7wvNtNy{!gg4Q*d! z5BT^ZiJhRl`~Ttcz;}@}(jduuQ*pCEqsbYzpp<|c1dOx%+RJlY`V4rtdbcW}*5(HR z(cb6Z2D}?Z#J*4I|Y$`>ED@X4N+{FX8nl1$@37+!$f*^MaLp(9czPSN&Y0zmb z8SG9RGJRSf9G$}2pI`fCVfvAK%IJb8rOlTwQKQ7-#`Ur~cBK+!4rWtqi--u$eg4Di zH4DLkjSHE_p42H}Chk$7#f#|0iq?w&>vs!9>*1e#FXK;TwYmcQZpbz-W2>9&V?Uj_ z>Z;WICrrZ|v!G80u(7b}tN(T6_&b+VFZ4HMras^#RhHO5!jP1@>?&7PX!qnaXCZSL@LBy zRH(VmbBwVq$VH*01EJQYO<{3Htx*Q`g6D^!>v;~CqjFSX^0r9O;_>)Pvc*K(#mEil6#=c5X%P!eIc3sgTuqW$qLCw%F~u zO36V@1DNCJXW>n0zj`WK)r8g+%%8`?rErTGSYWVP!@dw*kyeqYR>aX zi!4wtZ2ttUU}|G~#F=yr&okqD1EWBj^}%0I__5ji%u<`ZgBTJM6EzzaV1f{wSgHvv zSmZu2tFN6h>HnTD_0C71ES$U_$vax{5r*Qg?@e#gGVabD*M?Ldo2M|v3rHApRV*#X z)9Lakqzd)*0jg^h->6j4T|uY3b~fqN#|5ploT}|H**dtV5L8)t$^3*A1^FOM+`;u7 zu3ZACHZ+U~41W$Bn*6zX$WGA(UKAqT0Dd9kMe8EM+p0LjGHRMnbTW#W6-q>YZ1~{p z3%*ZW*}>0f4Qm@?Hqs%}#A4Mx@zk9v6h=T1&s8DP_hzFu{CdH!3LviGqQ0ogqHZ*!|hbMy|j0wGSTSW^VUb*F_k zCVF-pjMJjQ3r&}7;H}xonqm3fhd%ZN|LlH`hqL?troQFa8RQbt_%FgVfdFB{8`$D( z#OdOQ*PBsMs%$QOSK+Dm6dNSpsH5=`MeR8;0Qy}9mFI_p{rb#t#ctZsZRd97EuL(cjoJTrbWMs-@x8Z-PU2eRc)n|$m*HSyasaIXjUYO znf1dI^qeeB8uP(9GJ-*7ts=^%?~9B&)!@jeY$+ zMW_WYL_#rz;F_?O00&%e%3TPG^Q~tZ1S%4#w;F+83BYZsU#@jczNY?;_x}T|gP|Ic zlci_)^Z#YmNlr-6F{oY*%S}oL!_gM}A81`pnCSt=Ucmuq6sTmZEv^54s#=^z0^}W- z8mk&T=C?v6>j+e4q>rv{13LQkpn9qdyav^29Y91t{sQq0h05H;1@}xgsiQ%&;B)<~ z{PY2h=TIsxb@-MiHMPSh{qly0C@Xik_1BV@)AB;$r3$f)L1eXVSNL;;r3)~EB0|}u zs9psYBGkVM8dYz*x=FK6?TkIP^&~NXd288M%2pXUvxm7dY!2n_q(k7E*8m%Ff9HL%apmb%%b7sF}ZFNsX>b%1?UZ8W>}%f67s~!s}E8KPxnXSv@N5VFd6il zX^X?rqVM8SP-LW(IQb~Ov=^Wmly*uN${E`^L3EEK=V{N^WRvS-AsCQbz`P9o4Ipfa z&=c}pt$XRB^Re8l_xbGNNayyXMc917)PATb9js9Mb24z>$(g_Z7fVK3CGKQH7nluh zEQx2-)g)=G71K;|Jf}3|yNvds??~or;ywmhRsW6HHT^t2xp$l%1|PyNknfxZSwp|T z`2>?W*$E5Ej0C>rlT8x+zrT1Yf0sP#|BZQEC1m)*JZ}CM=Fy9(uY&zW{+mmnM5dS{ zFIrpTt7@4pB>cJ;@>&H@pB(0~J$wh^7Pb)Kh3Q5#&hr=G&7N zEA-<*jO5sN?gZzf`%Ok{g5%*Fif0?bHZwu@KP9k%&39^Hvl4{k-(o|5)wv#qoPuf+ zCp@vR{Asj@zJS9O<>dN%?Q$+?hC}AR%P<2ySp^VBaX*M6s*Buy zjLKPzZ`g0KFWPc?d&j>mp_Rs^@72>tk_#Bz$WudVP)?@_gb5Cp9%8?P`nJpRCMi{h zwMU77ytVgW$mvB9wNea^YDyDC3B%bCx&gcfYUWuEJN#%^yw9Hu~H@%8ndK? zfHR-D?xC$maW`LC-puzBwg8}o9`&n_mXFeRtD`3-*K5yk+D+i0^D)D*x|)%vZCEqU zd`@$R?%E4p2RImY?{W*@e6I#Uys+&C-x%lhP^a%pshV=^kTwXX7TSbCu;W?)Som-1 z;NL=bTALQW0dZag$b?2?hHvNxbEafPz60IYpxwCGQZU-zyn9H4^$3QLrv|bnee@Z( zifoy|5P#8)+s}T42>V?Y_Q08Xm1|4>{U&B4fhF4t9%i%`GOvrAV1EoSHr@-*m3w|+m z45_Y|!b%ZcM%_YS8yeIU3drj^u)pz+Gfu%aPWub$s-z@I2=B7hcMQ)|8zC)ru(DB=ivVnLY}`i6|cxZE=2K+{%P z92ukyjQG^(J6bm^m{@iK=9QHT9t#?$_b*q@?ZRgC9pR%3#$YLv#Oi%LrN8g-97UGh z)`aFI$4?JzaJ4*sd43!3+`CBKyHL2He*`(XPo1+2vpQ>UOML87Mf*B=U&OeplD?ff&Ao8TNBqQ5pZK?c0RK```Y+h%4-Mak2c&>0hYM zQY*qJ*r_-5k{xbtA8G7d>&;FcNqp|zw);}v7}@hwgQQ~RcjUT#tvXr?&Lpb=LpUX~ zpa;yTcx}0W|H8wD7#Go{ipFE3iZNTTc^N*_VRw(y1TZM66FFh1=(56{)cakR*;-)DIoey`ho8rQ^+JU~*AMTc1MFh0=jg}~ zWo1N?(2@SNI)C(7ls^oov!LD%JqyALShOStWe3`(NwYNAOhl2>#2R#JbiO59eg@c3 z+7GJe-0?IY2n^9VWk_1}s1$OYE+Owk5^Q9p;9vXiK-uK^x5lPg?8-jI5PkR`r>O{n zxEl10Rj0G+;E000%r^TCJM+H+BKRJvIh!V*{GkP0WR-pdx$fms6E(9CRPoV9&{`Va zF(0!lhy7#wdkpzz+C@Q&u@T-Pe!uI!1j)h};^bAj38EGofJi-6f|vPkIyIOODh*!Z z!WvBj7kIL450~7Jlv>>^Tw_8f+q(Pvehf-dssqt>;l{02xxIzZIYt16OS~j)FN5?* z2%nGgNGNGVI`ENL_xaqH0O3}nXM0}BSeWqtB6^FhDTp*_XN=QSC8zo3*R3#DwZ~!% zWkVD7NLT4fzj~)Qg6ea^N+T0d{1e-NcedfO*3f>36P^Iv9Jw*{v9*eH`CEWieKWSn z?sR%2q~XnORf>eY7~e=<0%#DiZp%M;R$OHTQk5ePD~ZNnTUC(xP4KOioPR7aA3NMi zhtXhcBNlCY@Ft0R!BQaRBL!2UDr0W7_^to+_2hB8sW*L;p|bs41to*rHRSt%gDlU7 z2qfOSyrU1Ywrs6UGKI6D@dYvtKVmlsei>oobgyVMQ<v+`u z`|%FPk>ATqL^fg6W_7@uJ3dcy?063p>*34W;Kporl*pq&FBmznDP{GcB**wb zbxjVROcTj{ZPPYrZi zdECmJ1ubgcC?n`tnftWVhUMB0n>!?7N(p0nHRB=$^eMH%B129}#G_|<;5+rZBZIIf z#Y)Jw8OdNJ4fN>(Zh38{{5PynDZ}A9? zK`7u;%RfJ}cX{fr1exzj8>OPgm)r%*s?@VwSs#bYq7B7Eo!|taLM_1K99c@_b?apRUOcP0BpDY_@<$7+b989UAsDTA=!XiAi_1%E2Z-Jlj z{Yk$Z>G@l&h`)@gGyxz+&6Y9EEnSuOQHnal-^9pT!( zUkRUGmfY{+J5IhBr3qW7yN(yUt?U`Pd*vOAyJUqVl*l6NnS=+t0@tb-h+U~YI`<b-`{UEzpJ#(SH?|WC6ttmMm#GOpHf2MLF)Euv&Op za@9gD;Y@o!Kj;5`S6mar;(OQ~OaklrDLa6nu?G|X&5CL93WAV;2ZDJLTzJi*=Ge;C zZJ_-Nz zZI`_A(#vWao;6ZJR??_JQJsGVW_pV4Oq-?%F&#ujhhn$|zez?Kox%(yT2zXr(UBp7 zZrx+tTIJ&({!`YDUuMYmZjzkte&JWDC=J(4SQ*pYL9De=HFZtPCn)1y@@carCLyPH zYgPbU2$Tp)d(+9~jg>m0K)C#~vSa0#x2QH_^N1eVnWeTiDlfnrzQwd7T;#{2l1|sB zIC2Szg=^xk+K>woB5di!3YEvyMyyBN<{NGcObaC)NHl#Dt4M^v@!b$GPPdX%L1%Yu z(m+>E`lavcV|U(W*L4Wa3cInQLdMpTzKZ}LopqAOHN6z9b5vG6&-y-0^Nhx2%Bw`D zkomhb&j{uU;SGAq8t#Ns;DGq5X(n_+gN*y!E4?E8E;}0qJv-E(+WvNFtbx9ilS;Da zr_;S44zq7f_PtX;Xp|zoM=q-U`=B}gxKKla10tT4VsHrktZcdkTNI=|3S#iU;*tqK zxt^ zVpc0a3K{0Ch~8K+Nxih4X^d{v3Apv@?lidXsiFZR)C@)zqC|Ci=&h~&w?%$biZXeI zLW}Py&p4e+bM*r`SoF#Y=LDTD<@pNO&3n1;o^c>C@|4zlSa1#Fmp;M9Ru{wfa|!h3 zv8bGzXUV>bsN{o3cre$PXAKE^UnTiH3r)u|Hj?9LJlDG8QstIO`#qC3`coPiQ795p zKG~F7cPb?z?9KEepMi1i_0Z)TTf}K8wNb!e^P<>-!R|-|C0*5 z|Aqk%_`ei*QL);Vz5hwlx3m*M;&7-3cJL=oO#HtEC`#A^1jCMx;Tt3*W^&;_UuPDg zH7HkGhlkuJ-8V9Lx{cB!kpz_Hu#KU&HM6R2C)HYw<&Z@?FARk*J$oFI2Nlo!W2Jvm z%ctm#hy>DHA<$S9oS^oilmV>L?*8T4!7h!ZhB$VX^1?X&qnvSpH(d~H61_0AY6^5?y_lj}kPq^}t*kTgmoukwCOK>XB#h3=~h8%ed7y~rK- z-p;+%t9);xu8U2VXUwMM8Z0t`Vi}4el$aTQIKP^m)|P1VSx!8HWdaPg<_);SX!Y0W zsTd`dgYLAL(na@7r}SsJ@+S0bnN(>5k#Oe^*o)W>+HbkLZLI7fR4lD1Nc}9+jmeiF z=dJpCSKbJ4^XG(D%xa&e@kM`S38H5=;t8!|Wh}qOL;rDBI9}Djp`+13oYTDjy3<2m z75eT+ZX$-z5+Czj0SN!>)MUM&$y9PPb=z>KoFuJhj*O+6#wJF-k)TS}e=mEyDgB$b z=uIbFJjDNfUvk#3`*_Ao@W!j6!0~1i$RdTonkb2 zSDKmcOeG_~8&L^zRcN?~i2^3J)?h~~<7!~ZI%mM$8CW@O1Asdi-5mIZQhd>k`RYQ3 zYAE?V+a3j!SE}o0qbxc8uAAjiSC2a0%X>BYZiOmdt8Y~`0=#JFD?%YYF2s~F3`Xh; zO!xxraPJ!8mMO?hZT8)pkshoqWB8xEe`4wk$RCmEUi7Fb)bq1Z=7E?3%JU9;*uFD9 z2Pd97-NZNrDWH!DY3OTGExRNHhlobedqPnH?~Nqv{qslNT^r;|0U73UjJIpLwY3^M z_$77g+B@*6<>08fk8Y@ua706ld=TBG^|YU2G5euMC9W|+ zK*~%>u^az))f`m$dSJ&v?u6DjN7@IZT;N`+%DBH1EOqn*zki$mn&W)gHN3yF`}YzA z)YOp$8|Kcb$qnBDnEVvU%d{!ZgD*4R zAF^HVQCLzkaB1vhs!+RUs2Gkgy9z<@j-2)VxLxwNr5AHQ4GA1!vcMPxVtuZz^k>XR z;N$%10akXqq#I)A4@*Hi#EC*Q2mENXMigq3SnrrrAq1p%M`joB zGRF4QeEv@q z38#aj&(t%tbL|Zbi*_|OHu->5swjNT!;!wAXf1xF=W$gqmegc2Ld^9bF)t>e%(N8yj5z}_3p*sAdHLo2Zh z1Ds818$+J1FrSNA=fTJ6WV-R6vaR7+Ska}SU9>bcBmHCcSCTY-VW4q()Z4A%Xrrhv zg5cf;VT1U!zg)v_ehbb$azjDgjffOcDX>7Y4}@C*QwZz(Ctt6J8 zb5EE7cF2C5krw7}r2S@4&xf8{swgr-Gqq0 z{nHn}3qaW?=t5jDD?TI)Yn2tEm?mB#bB-J($|ENmNe0xHBD z!j>80T&LE_lsI~d87aBmb>l?dYVV&TxuZgp{dv=rOkP~Geri)!N9>|n5hXu$JzLlW zE?=5IudmFN8T?}k9n^Sy-h&v{EvpYIfLRdpPQRd;l_(?qDuD1EG#Hh|{~DS?AiJ}? zI)nIXBv{4KS~hdCyo7!3CRdKALn}}zU*xF5VOp03!N^%H(6#6kq|?0OiUTmib|N5ZcyB^64IZVqUXg0 z^Rw5ACnx3y3BUwlrKoGH0O7*35r)KjtC&sCCL*?!0@15VS4$^oC zet-*GXXd1-8vE$5fje)jyCbVRJ1M`owJo!!Co>*~!9esfmAe@D8u3vqlNTK4?!=Z! zAL}+Yw<0)qUOrR82oeN^B1sios^UM6+_Wb^oK>t$4ysSVXN2!Fq$PKISsgh84P8^Q zr`-1H42n^s<~XNwE8`lMJCHLUJNzF$Cl2YvVe;+r-NE}CDv1+ss@xSLCm)3vR0e%Q zvsyACsxKxh+AJ6@>kL|V_(Ye2Fm;`5JftuhxKZRWcdE{A53-ttk_6^ys*C!rVA%qo z-&7A-Uz09NS_~71@z3CB!ccDL+?O?TdMC1Upq^ZZ{y=qa;kddaSQ^Y&WiEHv`jbUq z6}~CrLthZ1j+Y+YTXFliAo9LMNC*ou>(aj8kw&QJ-Q)l`|# zenFucqY)+W!B;ZmlVcubAXalje&QWr?7xj968k9F@8g*iW$yRAJVn@E?Dh4vF;2U* zLI{1iUs&KYh)0b5=3?-sTCz*HVBXwwK)MFW;k%qdTUG5ckbG!*(Js(Ljoo?=BYZcvB&FatO9Y13pr6Onh@aF&|t zc;M+qQy<4129b)wDZt_^a)!ZZF@A|E`O@qPvvJqgEE7x93Nutjl}KjZ7Zw9^Y-b{o zuj26!YjPS3i`!6z8QGnjg=A_aP8vS2`1346K&22vssTLHsTc>V=M@;LNz%%ILoAJ7 z`$~D?EpdYuL)KFsLSkpS$-Wx9MeB2`^rhNfg_5W@@cs+1GP7&kC%5E^&geYj+|j>6X3CFCf-xg?9a0}m^4d-gbmc^4IKpuKeJ9y_D>U$LsZ7ugxyEz@qsP&M=b98zp~x;PTUca| zbX;&?h=HmiTc1&bx^cwk2wfvrQW@Sq{_W3hn8Ab?k(-+eh=*mBwb4=j`wc=30SCu* z(xP?RLeHc;{|E>dA=LpYjEnd)Ua~5S*0CINIz7lEV=uL&kHPqeDg`;#P!VgNby?65 zFzLO%2RGlNHf__EyGq6tCePr4lviz5nc%%2)oR4$M}MtY{R#mYUio&aYGo_*h-Ko7%^#}fpnmwRMg7{#-k;Y>+X~y=ilt^Q#p4$8y^Q9g5&U7z%jMC@`NwajgIR~z| z$)ijzTv%L~IagwS=tqXggOTz?D%&VOBPgY5`|%tm$N;Kmo%Pqb?{%vID?9fDTEBIK z3Y&F41bfMGRo#WA;QN_{@X$4M)ud3AowJ<0kqMA?1ftsg<&N}-j~7S3XzH%-*K78e zF?9ePTaEgLaki3PYm+k}V>Y)WR3H55P|5ngnEL8~sG_ECnx#9XmhM)N5LmiPKpF(3 z8w4aSwSdxH(t;?`-3?1fiGXy6igZbR7oYcgpZAY5bLRZ!H#6t#xuAD1=eCA;FY#^# z5j9C#mi1R|EEdo|a_RocC%q1>jX%dV@@=%(d3v%jojEs>c*kMjn)0BB^?x*umzzdfF_sKZuQ2qIM#D5;Py zv0d+SIOayUs(gfg`HVW1_^AKA&{tdBW~d<=IjNWB(Y@NtLd9p>jv-^Xy^k4QTr1-xcnR9Mr(bDF*cb!==$i}1LVVJ&*8E?6Gz63~kB`iBA z=bAb_C9?@vi#{T-!wr05_gyAq^5lC>zQV4Hh0x{sUbf9w8=6MoDgWo5(&@Y}K#rEW zV=q5$`;Nh`mL1BkXZcoDyga6}HFN_iEhAloCW^{9UOkxt-5jr2Zu$vm@6VZr^dD|F01EYB7v`3vgS>k}8V;PB!ITiZ`+ zm5s8$%g9$p<#K4m;k~)2MsKQRkH$a%k;xQn+_NYKqpK@xlLlzd>J}hl`Cdte70g-# zS_`6BUr|5Anhl{hyn@1WmyTcYzZ#?Dqhbqlhd+^(;koadk&li}o_q_8szzOhpF-7j z88kJ}bLv1Xj#oPR^w*sBP)>q-V z9>zaY_@vG$^4r&)kyV_%*gnzVkd3)tx{xS`KmGB9Oe(j*w z;k2~XsoT@sr*+UgrqfZEl^P59z8~G+KN>rHUzFAFkaDya9Kiccfh(1iGF}u8d=?zj z`u03i&mjFB7|gG1XS-aIwoz2hR#rTnV z{1e=+Sj_=&OZq1?k8m4MbqK|N><_C%3Se&>77gpedeuxSO(kp7TZ+b|LL?DV^{w8~ z1!LpAQG=PqJMj67{Mj&8zRerR+qh|YyE+XV27PgwdPK*qH%TW3FELiU7KOEjqttWC zSdD#+0i2olg&*w{4hPrUdlk8OINYYzNrQ)FS!xiL*+Nd}6%BYTf|i*(FB5v9s%fC^2}nc(-G1YK(WX*JLlU#2w9)$?>wH}$+z6^fBIC8hEP2LBt_8Xm#?PUYYa-Pt`AVv7UpnZ zRzFu`a`q_08J6*XsIGLY?kZ``f0WF_^u>=ZeH-k)S#zg&F9|!`QPdrLLd2dLUV7op zPh+~*=`--xyApV;K(X7~TxaMbs+@hx=&I0sH0UyaW3?zzMUPA_X7+|WV%)ZPd^Di@ z;yO|g=*GbWZ>-^H$z@f)B|NX$bs^M&s1+sfpU@2YgYQ?!OZoB@H*!@c8A+yEVM%Z=>jKrA2dV@N z-4!qSzICFWi#N)iw`On=z~v>PO_Kkje)#1iiJ3_C8E+=kmG-X>4X@Mjou`;8jZ>N4 z4`n_ZofiMg{K~5Wt3+Ki)>4kX)NWK7g^*~I8`2A{M<}m2D7c;sJz*7mx*k}%Z>_{O z9s~?+)*JQ8+-n@1D;VSqxlOBvk70EqeSs19Uns7PsefaQ%2d{lr>#Q9=RnQtej_l7 zuA|2UiP^z;w*U?6i;p$=^}cjbYe_1&$!lGN+)rMO%*xriu)~E{*tB#J@;!RgnJhKq z*$`Su>^Y;W0P_~R4{_RGwp42ASESQDHbqo9)k2+QrvZR{%fck#kYC4T= zF?iI=;~;4kmtu0gvHK`3md*B0pKE!m3Qv;lzSJ7{P8ZCqtF%=>h>G^r^%{S54PCu? z8|QL?`A)%_Gk)Z!GcLhOX>5Te@uOa9T0}{WrBAh>yL4Gif@a}8_b%Bdsgmuw@fXfO zg&*CHmtT6-j8+hC-Fv5 z8r(yZvPRyVkcwDi4D&fgSlG@uYzff=uZrRViB=spMycg0ZVke}J0z!Kp?+1>E8p;C z#>YrIU>H-6!5;dV9plCq7iZBa7Y! z`F$jq7cn>--)z)wjW@!4^wOARN=+e+lchfbRXTTZ$px?3IV*$EN&WX$eDLxgFQ8(; zstPlC`H2JHjGy&o+4p?@sD@>Z9Q1OYJ9fBtM?I!_;|xXm>Ok%9%-deMCaTx|v+d)BkRjE;Z{=Py5*%tlExI@3P#<;pi?cvj@`S?$wZo z&ScQrZlr0w6@D>Ff86&{}>&)x&N@(PyM=ukxWLW}2JRCpy3}uD8!c zuR+{Y&31PkWk6)FKqF`qL;)orUY9Jz_=i$j*MNJIAmEv{eNyevL5B zyJzOND;=CZMq#DC!LB7TJQ+?xS818D(@lKQ->j)vlB^N07*02WU#t8v7F%?%LzYWW z(q}uQcI}iLGm+^i&ZD(S#q)9Vo3Wp#i;9O#`r;Xir#E7@K+~38y-Ep&BsyIN1=F8k z7~&1{wvDNOD?b8~jKC@bCiVQr$@J;6QA}ULRiH1>_3kEg^%XwqYkJ&#WD%Ri8K@4f z%-9~pEHe}~6Od%aE#2D2_>#Jx?s1x$N*kRzpf-QQ;r59#z>J@8Dp}XzVr$x`KdQE+ z+&Xo#j+K+=9Vwe?uz(LT_#|7=%u6-lo+q)#`nMZfbp`fpY*J+(0lvZ5#^EeqG!Y)= z7OsZR{UVLB8inK`jK%Y6Ol5h9J>_{utipEjY6ChVLnSv3hGvR{%CITh>)x%CePQq4745>t7cAY^;c*rT!0!8f78_Ux5j<9l?v zw_QI*o^*gOL&lGM0KK9p@43A<0UYljXPj7WX$>QPf^E`OFKsvcj}2RIUzc5AkldEs z=8>)8cZ$iX=V#{nKUc}re2w^Pt)3A}{r6KWv0A5n@SxT+u5#>RZkfyjv_%w*?6*N0 z75u69B@F#}dO8xD{rFZc0?TZBZaQ&uYt=$18oaEX} ztI;3Jk1U0-qi!>n6h`$zg7%km9!c`H6gUtSzr=fbolbo>+ZzO2x&{XLd^^AkBBK*{ zt`k!pZQ{Y;4i5=)so)$JR(Tgi`$0H;j_UMhcA;Uwf?Ceyo3}=vW5QFTirdJzW6SOy zHw{es>dYv&=t}{zFzk@P1`8>&n60%G*4BDsEd!L=OyraS;pRurBV~Cy%=Eh6hiRjx znwJ*L^O+ew<-YlOW`TTj`An1QMXdDRR(hz~P;pZ4JC-(eo&@gJ5GLstO!S?f-1!BV zFTS9|+!!9)T`kr3I$Ips1R)#Yf531K_~ItoR(LcL|Zhxet$*F3zG9Or-9#<<@Mw2DXf;3*-Qt>j?V0MO!B5ed0E|jDL z59!4I88Q5+r{;w=&tocDrJgRNj&JPzNXy`%D}}!`64DmsI=&4WH12CZqEoFfJCVWq zI~DvvUT^uX03fcpMAtbUpg6W6|6Bg;TjQR)jNjB=6&rkdv5K_*yZ^4IBG`#b|LKP-fkHvI<%{-_ao?Y{uuV>0kFI>bZ zVTeCD(PZU!VC3s8ECTfbeo8CW7m1dGy9K8)RoB1F8%J9E$33cVo^`g~3Gm&mohp>A z;w_ckj3TF5lsDM)>U|F_jugw<7(i=o^DGPX#RN`emt~{F^EJP(3@9P{#Z;*`s{E!w zBaD_Aw)jlyZ!oA&gPBSygo9rXPn<-9I>HRU8dFe*fK)zgT^4GbiH-!`UQ{cxOM69&`#mx-b5a80r5cwsCfHLM0a3 zpq?8I4`7yQYt>(nT7FGori&aL`;jz;#hd;ekaEQEy&|#7xMG4^EYR_eWARiwfRJ^p z#V3aJtl0?r2bL?+Z)+VLHj1HFZ}&Ny(|bfoHO_+6?(cjSbYgR!MW_B2x_dB z$MZx1V!tgpgz-}j9G#f-i?dHJ!^G#hT`a1;!LWE|q^Zr1yHh6p&DE)d4u^|u|K1#7 zs+g@b*`5JgcDtS}-eGxT^kLazzZS0~)t!_S*OPS`infbKI@DhuQV7jwysUNI*(}T% zZ@gWTmik$l-#_*H%g%c`A@pRA!@hAJ`goW(P}tgn8t32MBbkP`SlDCoOV^FjfE=Mm zw%zgjJ8L2r&gN%q&)NKDisl;WiqHHz5w0Y172FABoTKhlW_KAjAtrjxtJ{NuA}cRl z3@v$UTw)Qa=pK6T=Fzs}gJG2B&pnGxLBs>jik75fJ$zqNSHQ;`A08zzFkzN6cGlMg zov;1UT~kPA;W-N4F$Pvo-EDYnFO4#Rdc8%*%=+r zYYl{$2ydw;=jnMih-}m@P5LU-ng%qp%NJ8z`WKVKIN_bm@HI?j#t$Xf8HL_>IXump zT_WEW*@yC9PhZ8`347K|bs15>QeB3DyR;2Yk=-@}0q0*a{O~L;fy^qE6^~z0({WAj zszQwzIaS3n>$|#FUW}MpJ+?4Ro;Un-QjZDVxva$8^J+=E*dTp0;;ExE_%6uR_v{zx zZT>E=tT}-1pJ%E2=8A|xcY-|xW|#3=UtS^XNMa=6K(WWipE2B#)pL(=16#rkXf7^^ z!ex;MU|P@5vKJ6qC^&;12+s}F#A9$-&d#Lzd_y((J7BYvE0NXSe5Te;l(SIw zSb<5hc)%B?wJl&a{&Dv`u`o3W6}D*H_T!+D3&O;AqJTSNp|z!RZF>A&@J4!YkRrccAN^!h0ZrAe^^hOV$sH-Cu#k)&|^ zzP|2roYh2Rdl2PFcto+%aeiK38MuGTWw3I&JD)nc?7Qlkdv*DPar9P!Jw zEyxdidqAax@6~wcc|F0(<@Z7Qj{B}u0;#rR<5`hsId=o7z?A_(0I(6_dNYK&a_L2N z7oPvGI%DzyjJdOKGw+3u(RF z`}g1z810fszh4KsOV2sG^*x&V)r*|pUm=1Kj?ubItwpORWHjNxITyE*|&;x(zk_79+its{C^3Lr*i_)rmXcQjBK4)J`1-9g==E54cS{p9b{=4 z?HT|u{>pfG&0;M(?nz4r3*_W)y;jI0J_yDBvU`&;iaz>CSJrCX5*@zJnzP6t+M3G& zrgMNoadH;0p+KYL|h1dEA8tR_qE(@I+{NrK$_TY?D2)W0^_TA zDJ8ba>?+2jrFLbKHM3W4iK}KTT%qm5tUc{dMt?NVmXLLuZNKX>^-S^X5bxn4rqJ^`y5(F%bV8w-f?VsvI5f%KGH^m zN(#IqRH$$tftzLNK1I0Jf)p{#xs(05*7N7#iG!-+I4^gBqhlW}x)@2bf$^%2JRBab z9=BDj0=(}^#^=vZd!##<&`@P=d!gp55tMW<)K%TR!WNw~q0h#d-9!t6;8PlVCyw)~xb0Ab^pvZwCsqI)8H*yD+jT z%X$ZcaCqJU0gAYN6!nZRA9ZAqQ4!Oh^p_`GrV`B4H83hWK04wtAD+h`Lfj;gg-r7q zCw}p!ahIS^I)rj1H8v3KoREECV$!KQhoM;|D1K4;Ar^;Lvd?%7bPUTRkDGZM8~QzBd6)+UKPi^-Is6uc*0s37VFe!Z@~PEiQR=5%fNEq3T!re>Lr z^M$ZGVEV#Q#twppcT2r6^LACT7b2~2prpCxICqUl|7KgW$~hY1vhZ~jQ~T|w>lPIX zNq?#JNMbr+4)G3+*z%m)q6rgmt3&hAlYX}dc{N=^dGUuv=hhZ_n|kQ(MJwI z(cX+>_9y+s^d^?kojIfkL9OjVs*L(wA@Q*+J6_EzNPl-fL4icmA(RwiFBDE(fD)m_ zY;r?596m|~D@b@M%T7jYOIZwCZ;G(?B9i~v6w!^Kon_(o81$x!nRb^%Q~1+Fhr#4; z5+9uStU|F{iGJ3~B5pr|PA-20Np%jeLXwY( za3@<{IJ|*t#CJNu(5!aEhi3Z%y8-x!+s~-3LM#8BoOzU(6 zMtB+z&$p#=0pC(<5T5^vO0o~SorfheBG?vJ=HDusa`Rbhbh&;2*f_6vjE^^xAcT+J z$$@q|{8fYIXR2|AXdRcSAI)%TH~5y8RO24e=UhtxG+C(?68QbYJeD+XQr7}#98w?k ziPrs9g|eT?La(FCTir{ayU=Z%D|Y()M@;OvhUaTgwe}T!UBQ;g>?8^0Ev7e7h|WyJ zzKzVx@DJJ)u+F6hQv+9u2(B;ki#%2ls@%>!% zhAi@62l^VJ;paHM&bV8bHONyI37LWOiJl|MF)8`9LBPU!cg>gP3|XEA^Q32@&%G3i zt49-=+@tKFAu7L25%DCBsi=p_Lq=59j3@#Y$L1F3CpeGF`81b?f;VX=ydY&Gz=-n7 z%|!ZImS@njlzw;1mu@GU1rxr5Xj=BGktnc}6&b|w7+Hw$h!fc~YsK5AaV-og$lc(X zCOGwM10*@xRC3A8n5_Iyod(4PX&)mpFAEJgzx+@z3KPN1NYWi4!laWHmfpbV=0iJPh5)Rit!rbEUbO zU|}+!m|em_T!~NIxA&zTvKtPsgxnnz4}=4f)1yiVK+Q3M!j8; zefE0Y+9{8rs3ZSAS$k3!^RE<@IhjUsv7{K4hpMP*TEI`~dp6{0AeTF6fdfd;Hru^t zZsNtg%~L~c#A#&G5Juc-uCGhwP#qWYp8`n;$arGEl-P-N-8c%>KGtpC2dx!VYrmG6 zkUPzq(s(itMasWYLvK689j(C?1(F62ChnD~&Z?Caf}9c)2`27`+IE{!Z}Yg{b$W4H zPr8Ej7|Qs|-m^J2b(jj`925MN`q6y_*2chJZTv`pOJ^8N&}Vm7`e*hoyn?=+W^;!St&rz3BI z?=%P90&%RT4;ZPgW$!;KKU9|myOp{BNOe@i3-(C@y=D=Gl@DEt`#sqGNBQ@z$$$y* zGGjEoSL2Z2@=tKgrp^c61|2;Tx+%iB&C`g!15@sC4}%jLE9kgDAbfW3y|f3)mM{!& z+83Ck^Lz^KzvsM^%`&)y z5S0`f3nV=x)>P(4Bk*qxG4yYAty93&-H$SRBT%#3j(MB+TDt?y@VGvmnII1M(4ir^ zzHrIpzEMOJcem-XY8PJA8D)@B)QMPi`5DD0MK9`M%c8}>AMze8|A6V@GSS}+OEH&D z_B+$K#dGgI1DnWYqBU&8;qG+X$UD6?>hxJTTqb;<@T<(iPR2#30lalHs}UlP+k^r< zmU}X4HWGEXwEBaGhA}|g*Myy^=OXN43Mc9iZ>@b#PmXgN@rAyFMI!TnvF9RuP?t#V zvgD9?LOR?WXR)%X{Hncc2*okX9G3>u&-CWi>c|WY8zI+vVhZDR=tfWZU#dg_`uH(f8~OUEr)AexrPaZMa-XBRD&vv`d2zeS z;~qI%K66g}Sg(jI`hAGCA(E->@YpBZ5~Ei(v?^rHQiihYkVPg4>9rwYA$^ciLSB$0 zH>7|-iV^abK#CLMP9Vh!F*JXpMHt!Imx9d*c4X?)wKz{nL4kkc1{9I3b`gjO zB7^-R;)gElzb+v^s?_r;s!L@>YH$$s9tksu@)A?@uvc2DD})~7FX+TSLEyF;84?tX zDusKB`f63Ar#i@D#H0|*IlD|4Dui;HnLvg1R~-?9I;e)gMMq_|RtSTV2%`2>VPy)e zg=1w}u6@7)G85NQurj+Xr^81t`Cq}Duh$4}{lhpD*W~i8xV~=ZX9$iFcsaAA7rfHy zB$UKHhOtFnr z0*i}fFb8on7nU&ocdF~ZWHS0#j?NhFVWt6+5YHy&4!Upw6LNEc9#Y=uN=!>gdjD(~ zf7l4H!tNngZgA%)*(U`b!e5@bQ@q^wiPe$v-qk96|*suCUp z8?yYH_XC<}1$PIXH!1wnz-HQ`Tdfpsf(V!ZP-AV(u0ehlPHe4h%&tuCgI$a$jL^#B z7CA4#HFW8dHLNLxrZA0!WoqSeyAX0F^gF}kYf9OkGx~&o-I&UKh(=T&{tDs2M4!bn z;>#ecsIWhtEPq>oUQ;SrrX##BQ z!noUY?UK0(@L|T*?)MW<4C!vdUnACM3b3iJv{{&>9IQ77d8w|tF<0r_cP8klu4*(D zI)o9&`RvooOn{N~re-$xAG)6jiJGQ05~YxCoDQe2^n)LidzchZZ0mzI$7ucLot6(v z_Z#bLRir#r+ryU{=s(-m10D3jq`>)HkmJd4k6F=|+D*}wq4xfde=YO&8#z4%ev8bD zdsM!^WtbEw>Z<)9C56au+Sb~b8Ml>c8pq~o#9j;5{<*qYnC><~?kt4U11(yYN&HaW zW6AaNDOdd9v`*i7@4%1k?e`=N8`hYeYmBUC1bW-HbC;6?R|H{sTal%I*V;@l+~YFN z!fd;Pj+>S@ervUN->>e3J4-27xJ}U|ol}``IIt84osZ^k|LC&6JxObii23?7KC}I@ zcQvE*yR6$ql_l>u00_<^fDsyw|V+=SGa|1MG>BQ=|Z^{4673!-~(n~e+ zGns!A)LR($e2x0$M|!n7ZZvXPx}*lK15m{jm~%6_3_BwsIwc{7^i%j^}qm z3GjV|a(Fkw+9j1Nj4XQB%Zl_7=tEmQ1h<^itpG`II)R})Jf6VN1|CUZ2#5O-7#73b z2@Lz;_5_Aoa9aXH^zFQELzZpx9z*$U`d&ku2yp^qn+ToW+@r?nSh$DQkyVr5s zLuNU*|4VxA*M<~%_@|CHTe6l-yO<@GmT z-ntdNaW%;mP_PKU5PU>~s%Q~1c%m9mL9`axm-*J8tU2@Dq4E0O_l@(-^nIE3y?sDJ~C(fAwTXl-Ig^ zq8!6vYKm}PML9s_`r^%RvdT%w>!$u(3Yo;0{>9FiMN^j^gUPBX1Dhgh4{Aj_BZR=0 zer~&m^V}ni>=Gd_P%D2tx9#eRq zu9Qn}hib(lhFJ?P*`&ITL<6%#yO>GuPhHUqE*gt%*q-7I;)G6Iiyz>?{)|hqLF%P0 z+8Dmyamke4N^18rPv6nuqgQucAgg@c6MaS$K2zDj3Hbz=2P#gBD}MrzB4*5e6$p(w zU;RuG@@)$)g#F=bV@Gi4e(=u>pEv(o&oF(5J&aO+zxid@-JbAfLq8li8B0e?zNz&g zSvBv-M!LUTLc6>;0Jm$12=X0S8`dGgntCvR{_zZ_P|P~d-kZ*0=>8oGdsN+ZdUw=D8RO4CW$UYBn`MH-ch~YVq&Ei` zE4_jBAy$EUFP;$(baxo7kSGwFo0G_40QE#93R#Pk6101jy}io;x`gEC+v1^aRU#`S zr*2j^zgaeXMCTMciBBEF32v&-)6H~n^#LEWB5KQwM&nTTSgcs(*wTUp)9$)~n1L?} zFSc@sy4waq2MQIef9#i77;e-JP{rD%E=YDijXj~J5H8en5kX5A=5;iggh;gsfv;wA zH{FO(@LkQ3@8*eJp!N~&x%lIYUPkRm?enMI1FBW>!wh3}m+CR3#{AA0k7#ug>8A~9Nb(8{s#QZ2aBMPNqN@Fqj{DESX?%LxQk?^sg46g} z@~GGF9Q@dS_?$Y5gEYgexHy-OTf4iWA?X6LV{0~}Zjo`YvW30OU?=T@qKTiJUZj8Z z`<+pArrr&rZRV3zVy)(Tk!ET2yQ0k5jG|RVyOXB%dXUnD#jPvm=yNM3ij`9;uJI0N zYkede(bmF$Xkys%1_eM7n%{f|)@q#>>ATJ(e&qKvqS%^_H1Lm)<6cHYrN;0ucjyky z!`3CpMhr^3RF=t;s(s+gJJP zT0R{5Z&-_hEKXfCtIW-*XVL_2MH08o=|%iM0sy<QNt%DV>N!R;cm$4n!y7seVK7NLfOS)4r4^_hqyL85$0S=8>cMivsj z7`VgObHd{uf+#(Y%|?n#nm8c=17bUx)Jui+2#n-Ih7bf3*AwB~5JszZL zNL#CO;kgDpnMlLhPmrl~z30h$^iK&})VycVfGYSAp^K#-q#-|YLhy51qy^3!NU@RW z6J#eDf=}+zdL&)s0TC~cotDt5Mk0oY(4OSP)^9m|akhQ@N3<;QLWJp+v_W|mp`zFK zEG%~=gW}}h1>>J))TRHv=gj%g&2z4fWIUmqwODA6GFNEBNo-sP4tS}_zl^THvWU*D z1{{ABK6!~!Bkw%@;#q@RHd4bOrR*TN*+W{Dnh~BG)?l8?ln-M(10e5^Lm3bD30++} zTn8sJ7*b6B#DI&(Bszn~T0(n6H;EJVfr6BmG))yHHs3(*S?A32$8N!>XR@LGLy@y1 zhvLG_R9r*34UMz$2+c{n{Csov)vjI(EVC*u8Jw-}?!k;V4R zM12xBxGBGo3dvnvUI=Nu=AFLsMGlLzsOr2|ZrWXUHTJAYTRq@qOjqOiL!M;r@i^{R zNCFN~E`fwLIj@2pL4P@+k6H$yVyH>RVO!@~9EY(|MGOupKFq_}r1-Gy`68#kfE?T@ zgN>=x&seF(bM{S|or>g!%(FIh-kjT7x*q67>(a_J^PEjLP zJSMo>Pg`f=(q02!A>vtVm@|*T z-(FunVs2BH?_f$;EuE_+6=)kPVQc#=z;vQo`~>~dCX?WR_d$PxUz)|R-UV33ILV9Y zzn9=ZiG{Tuff1CB%NnQP)RLs|@+T2jA8olm%Cg-|c`J(UbjJRRqz><2napP|8go^$ z-aWAb%1SwmA@x~Lpt=>K{aQ2RJ#lR~huNcRp@m_D4T3%>`pxesWE(zWNs#B*f49pn zi@}G9wgG2q-M>X0aV)tOB#|3yBn?;fy-K_txx~J;=$WfFloJa2V9rqOskQ2BP}Rot1t2!ci6XUHMWSlz)zNL#xWiycIjh@c+WrejJ;3Mkz1jD&qMX*<*OS8Xr=x2hX-~M* zI5XvXdtc4dncN*%^SQ5-<&X1RZ$-<7;{`#?LF!tS@ri~XlhJ&v=daZ~GYI`NifiT8 ztRmY#W4##-J8sWv9;=OLWijvly>G-OFz$Cgmn&|Y^HJZ~;wyA=1) zgwrQTF1ysH9Yh$Mi%89SOiYbG0qf0~+^0w=*NaF)GyIPjCN?n&;}k}mf~B(`MVV03 z)*_>r%w0A#c^BC}Nsvw^sD6cZ1##SK$bfy@$Msc{rf%Bv#tiu`okM3qnm{lI>6DHG5AKVR@Fuw>= z+f_JhO6!>+3C})0o-vG|_^KY;W|P*K_tiOedotNV-b&9(ohg$0_{gTV!d-KtLqSNG z$jQOU-pO&3iS?>C>Xm_&rX}Dg$K>74wmY*sx%(Y~yxEa&zL7ED9veW)v$D|`N-ay> zOZ^GFOV<3jz+Gn}MWLfFiMNLA8|7@q1me*Ps`7dr>TlFS)PB93pt}e42{jJ2Ul^y= zu>ODQziWr%@)*@p?+A}MZej`@lSw;jZzK)a#NJ3NU<{V)#R87hVEGuj5iaFm`PC^Q zCXU8Me#k5@CSQDi@y%{Yx<=RWJ72`P6Le3@=$b+n&seFYLjUAtsSTWY;x$?mVNOhc z6Yf$cQK*Ml^nJY{q$dTLb~YzDgu>uK%)U?V29E|w zwxpZ|vXcwg46?6vq3p*p(24@izE1{lhC%Qfz6~2_)DaYFcVr1wIwFFyA8A7&M*`4Y zt%zhZJe(x*1{UY7jG8 zdpkQ?b2~FyeLFW=_3aCY*!5dN=JR)i(`UL+$S+&i#Pm3vfvuTiBg>6))l*rtS#cxO z?cNj;_+e4cU7+b6iiU1R6pCU_1~w9~QG}wb5Qd^`xpFn%EEvNGR~KM}`M`}S3q{a1 zoDl7@f)I@za35k>slb*AKERO)2I~o)4QJ>w2W|R?h9whxEb`uDecuWSIh+L}xPquA z*ud`|gF8udF5*q5_W{t$Lu3ej=`NlS&DTf!4KMG`Yfv%q?hIh^n2g2x-2bnbGEp7d zM=$|%eOrtCfLY#1vn5^Ivvf~!k8vzdUY?6ke%ncp=n>DSjZBS;9B!Z@I2SpwwgiMk z$j?QREr+5)KuS_BNa-~RNH2SdOACzGjDx}QY#xGz7C#^XX@R^u5kH#$nvCI{7@jx3 zf3z*|%k!y-n%(yu50{Mp5Zv`22)tzvgiVJBLT2rM39Jl19|-uf|0Vn&1{EGV;tXB8U ze?zH}{Hylt^TYHM%{v{*Te{D(uEw@B)4+7(ZypNdKAnC@N8b+mR88nU1TFaZ5cFp6 zAt*fe-;6$8{4XJ0(F&Jd?0?1^AI7&`5B@jMi``ET$vXZ28z|u5Uv9RFAYp&YbjtAf-rOBKuy;e+3r`a%QCSluQArayQE>&CF}4Fo zj$9H?j#v^^F7J?=(6r|w7(i6*1S?e?peCA+qb8b3Au+ZFLF7Ezk>tz|nHX9^DMAo! z>A^~E=^=<#dep?%Qpk+I%#a!Pg0SW24}}<7g7Z)l6Aglu5C$QL!P(%d``Hk;dy!!N zdyx>tQe!aKKXa!AoVZBb+-Eojk^|&JIS1z>tT-#ymENS3{2IrpuB!! z(rDL#=QM?!m`Mfat#&ay+}IwvrfsC;n@UdntQg*xp>o&Pq;e-G%>po%CP@)#@8ztb zRY+HOqrKPJ%Zd7Ys?qoS4cj_rI|)|m^4pZ*9XX>dPsXC-r-^!3zC$$ zCs?2(ocWw1OYIY>dWqgURw2;U5QN`@uvxKPO}>t>AqaDWa2g1I1e+}w(H7J@px)7Y z2e49r9SU$D9n|TdHUPB&sAoYv3u+NiL%Cu^l8ia6k{7@x4mPr!>IAZZM?+Z}tEM?! z-Z@?VVj&maC?Y9PwrsIH!% zvw*MH7hu{lFj9);;Q7$>0+~O*E&-d9=L1Xy=Tp@bjI*#V0ererNgW(2Ng>yH-%LZP zYoyelO0I)d41ca;4^7oEQYr>bD$vviO%UAzO?1%Iwugep{VJt`<~J}L=rR3e3g)0; z4}Dx&mtX{jTjUA)hKz!LbLAhn+8~OW1zNB%KF# z!Mt=}h4EZGA5c|r_VTA-VjqCI1bom2clI7Qr_&Epus169P+C1Br9m)=dokP#W)IDI zZlv@PH0?oC0W?8$2Q>XaQ^p=@3Zm(tX#?`>KtAXpSyq>j3#J+eLsNiIG#H)*glj+; zoJRZSx&$*2uH@nYK8S#LHi+|pcms$lf)T-s%b=dz!3d|-2*Dyd7LGB84*rH~8C6vNe&?4cz3 zMhH33Bmqgv#qiOTDFDU_7W0;a$9f$c3!j3qeyU4Q2F)fX2tT-XL!3O;9w5>-1uFq} z2M1`XfF?MRS4Ln8&?8gN2r>FV5F>O0SEIJHF2PX82*J(8W33OSDg(VAgQ;3ThAaq! z;eUXz69~TsVF>uatLZrw{QHRo1rlh%ImCfUmQ-*I{~ujn0aZoR{Y!U9cXyYRGzdtS zq=ZOGNh3Wph;&MKr*ugw-6;*yC4G^&+&6ypf8Sg0zt(W>uCven?S1CnVa?1raWk?D zU?Oio=TK$LCBEXYlhzqoAutSV&_WIrfs<4SoTS;BMnmeL2&_>(m_9pW`e-2K^D9L<^WE?Oi)VbH&EB z^Qes32Ethd;c$a+FhL9OoNEK&aD#BR>2G_$xL1=w7A($Zumf0}Hn2F{;Aq?JCOzOZ z;|5bd3ibnw)7CkIK%x;$-0Fqj7|#J(kAO08uC6|do{{|ko|nRKKgVKlin3Rou=X@=0|+*hM7)(m8M(6<0?NAkZB`c%7xh|>AqFW?9>O8*~%NEtOx_KkYj3__Wv5gd^+W}d7q zye8HAAmTtI_Gr5>;sZF%_dz&;NE}n}c~b~faOnDZXgl*m<|h>Z%IiL+{NnLM&MU|sb1gIf0 z!g?P@9Afm>5=pxVF|X_M-^gBpfqhN_A(y%%lN7cieCAUO`$2{LN`#yDung|MoQ{Dh za|8R=bYq7RAA*Taz=1<1{1@>b$^V}KG~c@nYf1i>zyFT*uWHqmHMw$7J73=DFBlN{ zzX;wS5i~H&f5!VZ_;2p$sRGdz!O3v=HwS;yp_%Uv$KF^<(D=N7p!InLk&&x?SgN>D zK2xpU`%gFkTu|}>T-g~uI32nE_Sf#opVHRUcV;W%s3Tk;(u)$o;N5ENQBp+yTaf=T zGv;Va2B!;CldQ_$;a{Q#A}Ifh_>bg&Bc5-w()?>YrT=mHAK(8VF5;HTrtrD`Muh;5 z`#(e=`ga*H3k6_pnO?vVMB~7Pr5?bkilj-pVi5y&BKVDmuQpTV@*N{&#c;wrslXIS z(^|cNJL*scOFH^D#uFFtZ=T2)a)`nC;1QNGNQq3kNMe9Bt8<+D0h&c69&}nw1nrXdMlrwR?Ge`)g5?icW4_nY0R^OhtF5 znEhB=?O1#KKzsa1d;Cy){8*doK%47Go9j@U>sY(`K)d=#yZTVO`dHiXK-=+1+woA_ z@mTxxKwHx@3fXnG#11MvcUrgvknbr5%* zAtvHj+YtHNnsNb*J%`|qx9W;}C~lIyRJ<&NRYCL7!8T)T$csH$I?e=RO2{p}S-N#N zdyT;lZzni@BDuZer;g)Ly86h?B!RfMYUxl*ruZ=NVmXZlp+?g?B2MTTKKJ*>a=P5eQi|XH@jHKl1HP)+O(u^EW}o1xv==SduvLrKVbt~ zQBs)lZpC@WzCWQBTd_-s@@~m_$EH6a4rBx=@8+F%bovvdK;}8+-Hh{&N`C?m$T-L9 zAAQ>z$_-}#$YcEgTanA+t)aAV1~ZWRUl1f??I)A!#ghKGOdP2XFD`2j z&n?vNMj-EBJhmO4@0TzDnK%F_Z#x{?|7#Tc2r?aqLudbB{G47~emgwhE@6QEqx)m) z;gljUyEUj5VVd#R-}S8fLE+(4M0#$@X~X9GIC({1k-xIi!zqo~troS2fD9bybE~3CzD+eefEr|Rfu#Ig#i6OmLd$3;Y6b?FNgO}`kJfX8gs2$^?qWd;zo>&H zjaYNW3y0U*H4687(_$F%iYu+h$H<0fCOcI4oAc#zT zgS!o0qI4?43tXbq2*=~Snz`efUopfAxUx#3=yi(ScSGxO`pq*=7r#f$fo2JKMSCM{ z3g7b2f?{<`l*R_Q$34@i-M|e>RC-Vp+rdftxc76CYealN2;n?)`+^>9lT3vFwlB%x z|BOR1YLNrn#0NwAoMKDK|2l6X_}e0zQ*NJU`r@H%3Y-0oqpcf}hJ!B}KYafTerNn* zogRT=)e1344G`kdL0W@-J10e`%X{ePOr_dWrG)=EHT;Vefwv%u=(=}X(DX?Jfw$0C z%@p(Gz%*#Feh}{Cl1+6(5w?&gGW^dOmx@@p=)<{)0h}*Hiukt}#{-3k)>{eR4NZ*9 zTZle{SJxSaGrDxzt}It6B#O8QSJh3vu%i7C23=UVYXpd>8)B*0jka8lX_ZzMbjChJ z3QFIok8IX=h7I^Wi!7l)DA)=Qdf%)f{e0PqHsgejmi)w=HsctNmi$qt44rI^*Aa`KRi_9ueD97e}-3#Mkv6wakoMMfC} z+Fq7F0R(`^cTukk_{7c3w<+zlZ+5je_Nr^}i)TVxcs>oj`a^)Q{igd2ZVgdytqBt0 z4_Wf9ZMt3B_q%O*8o%wng4X)&`kn!|A>B_;4;%NJm9S$9sr%o#(1S_ftoG^m8`%8{ zjo*VXux;l500r(c%^pVd1I~MKf$NYn{~IXHBd`gjfi>JpQhJ|Nc0i>JoDM|Ojr>cGfJ_a zP@$eE@4K^+m!0+lAuGrsK$(yY_LGfn6Ix?MYM|ac|5QK+LSx1v_R~k*Ciun*p&-3^ zfEW}yo@)?x+MN6ArXU*GQoq+lmbRaloU-GFb0nk>*_dG^#16>AObPVN=bz$!4R18A z8v@hsmVjG!!VQ9~Fyuj-t2>)^K?$3`-H{%GmACqx?l=%6l1S4$N)~2`wyn)oi=R zY1FjsoTFx5(^#_#il`mB(@bdEX)53O%dqXP1RK7z5pEqipfE0&`{10e9m0`pB%sG8 z*s4&z_Vl6{MVPh8+Cke+v+wS<-5-5_68R%2I05~|Y1=ErYKM3$Kg|3ASo7xcEN`$) zUe({nzQs#AoE(l*9`g*bQm#H`PbRO@wu^D6A`>r~dok!?dHzMa1DS1CszO(L1V)go z-Bm8u&ijWX7=ME1{eqGRz~&`aj=Z65cOI)vQHWCP|A#$j7gFgX7z@Ex*IceW(oNJ3 zVNarQ2(Us8)U|>yXFP{zTyCsunl|G-1z)U8eyMC&*D=N9gMbc+&Qm6qV zj?uQ?0TBs)gJo9CTtC_Oaw$K^LF_WML&TDo!#qLEisdG(isdqDXHwdAU{B;*wx&&l zVwBHSdeFPaicm*#P93{7)BL%&DcZ*nL}hGh?PaqZQz|XM4g^J!OkRwl!Fp=HHP2Rz zQXD3wx2S{(aCl7w+n*y;3VSKpZrqtEkpmTciO-)*&%J8r39uI8mwwhk~8hhtY$K=K(&m9>a zFMz1p0(!me$N&=mPGUvUuhfbL#S|`~c$qFQ0VbFiM=bBVh==|9j%&E@)Oc)oT?xVQ ztdgo2DnvBleRTH0g6!|qcn!X5VyE)H4zap#m7GKufm0o`hUuL?OytwgW0Q_nmXp4 z{oy0?IT3>Mr4VtX=4@|+Ti5=}r3jUNr{^fR9uLq=@x~$uagVD!^o`=!% zuCzCPy`$Kp*VLY&yFR$s=4=NI1$BhihDrt)J|fRjgV)E&p(Op5%Xq)r@#y{eg=>PZ5K=G!JzzH z#^;y2e<|0I5r9eJ$Quk5FGH$(ggjt*QTDRY%x}3{umZ*7WR7f(?X@|!-BP(n z8BwWFo?iBH=(4LFCj0)J(ChVbsYP%?o)A!j`OG)SrpU5V_uHpq7`05Eb(C z={EU_f1!@7_Z8oyu52r0Kr#dOvFpIUEY`Dw5whWW95LKTqTGqcB-#)+IT> zps>7YM`t|4rvm-X-4*8E?vT6?SUOvza|o|2l|`O65IuqgXg@Zqzm>Riw^pkpFwhVc zq*9!(ZX$^u`f)$|BU$SW;#`*2N=P#5Z>+iw|08vkwb`|wI@^6^WM#Ic^_rOK)w0zh z@?yV*vSrIYGHArKYmNQrSe{+`q;&&-G{#zDv%OQ!_il~}Oqa#;C%QR$Ekp9@JOT1I z>bv=_>hhZTfQ~MhEPc(Z_WTwG*M=5`uoi|0|B4E(wUwjqD;4s(vzlzBC3(!*8Q~)$ zf|!EauZit?%PGq2OMmBm$j4F0BUg`+T@x!7y@0&MI+~%G!w82esTssVeVfk$e9PIN zu*B89-+BeRZZYl(_Op$IK^w*Dxh7Urq|QAR*6tnvV;!G+A+HQq6Sr_zbE(?}LFnci zubj)FbA;VK!x3C89&PRuo9*ppE??in!R?8v?|ki*^CAk-xk;6#QmiD9q)UtbfY;oe z^4^v!)h%f&FGUzi|9rg8UPy)^LIkc{`UBo`bNc&-c%44$LWH=v-F&0T!i-2R#a2wl zBw^DBHquy0xOF}RcUEa~pOhXS5lESmK(20{f1~cM2%hFX$$Wb%{e<8r+xGh~*>y`` zM6mlP8FLf?7U*?41H<<_+`Ya}QS31$D16}*`K+th*lj=7)m)lXW7kU2b zz>OW)m2aeaTpxWTY!?%F)#{A2Z-?2gfW4@gahPuYhsAyDdO9Tw=Yxf9}4FX*PBs^-SFC7 z0)Ugtc$DRdSX`m4>F|Y2+quZ@LJn{YrX(qOrPZXAl|)^q2BNCX&6)cr_d95bBd*p~ zBP`ceC;m$#GEMH0loR-)p|z`bYyJe_EZ*KTaF zcsj8b4lhjgf06R(cGI*!_MD;Z#eZSs5~m+X-xg8es`|nAPW=~Y)A{pQJU8OOvalNw zg)#3{>y=a!v+s_?3_(D)OG2jJMMw;my`?x8^^qM!cTUCWI#uu5A-Isu6yIFWcvk)cwZOWGYD5u zofF#YTqo2}e}PSjolJO}dY5RQ_k6K<1b~gg_^3|3G8 zrJ}IR?;;IEV5lpgMK*|GHOAum_u3X)^T%)sW}3mW#SjrdVN4P;%{j+lC7%Ln)>?r1^Kq=N@IabS7|K}8<%VC2QEZhLcg9lm6t@r4IC zJup$5Mx|VyL7XV(N;pQaHA8EDhkm*@a*Os>0^V)X(H=uy0S?l@l&D; zCBFind@`d7^StDnr8AkcH8V?op^?XbvdAkzEtm^T4`S77a3RG0@)@+K)+<%RR4-Fo z5(!4(9N^PbLDaJAxs*<3WqZ8g*MIX-R(~auq0C1hHfWhVQhR;{QLCV6W0Ay|Yd^Fm zHIAX|MWjU@1hwF`hdHhCYf{DOHZ4kICN7}cv{;RaWv;}PQU;OT1?#m3tunR<7@Y@b z5?CmLq3i=L$B}6V4$R_$ge?+dkvD+?hITKVTy`ZAg<||&OLOM-*kjp!H+0#ZN^vSM zQv~J66Liu_5s5z^S@^!kpOWbaN25(Y^S45FozPkgm+O3e#wdyi}Be*Eb;UvJ{c1 z36q$@Jl+TdwV%=GH7yd-<(F$;3YbNEOOsYjCeU@W{|B~vQyd@p8V% zL-}h6J5vGhuI~roMC)t<$$tuhY6?(|6E6q&qJnzFov9~Kj|wk(hIry=>^!paC8qG# z9_N4yU)%F%hvSCSk?yWm&f{UmRK^~3OWsujj>aEHR$B2Ce~d3hZ@+W3r=7`cka%{u zGqFjI)h6cb$bxE&Vb@cd7oLUTI#fv;u?l|F(ne5Xx(+qaq8ek`^|XLGOjls215|?2 zZcvHkI@C{VLDJA4p>Xof^ZBZXOCLpW+&t}s_&}!fZ@#^>n9pBmQI3r^f9b0q{9081 z!YBA4E1vJGtzn)vgaulAy}mwL9H9ML?Ds_(W_PYHTkL3eMY`>gFpg;V3(O1k?3-8gnseUv`=iee!vx(*}Bxh^B`E>^H&f`DN+3rIfGYfD% z2o0b&fjP;sTxd^Vy$A~y`K?F+jqb$C}gdmk_0R-(+S$Va)#k~0NC zn~fOj^_Xgkzt=}|;&WL#hGod5sd>cNMnOiNcG!0F<=AB&rOkOl*~>x8o_4r)i{;|4 zC(04#x^w`%*9V0D!ba{#q(?*L%WzHRb8K^;6tl54qh3T*_=5lO6qj+7sl>HY=Mj2f zdTeWbL`;^CxpQXxL|%wF*oiqF^g%3T&Gs-*n+&kBRG_R_V;IpP- zoDq2*VHhDkci8tMFb0n@!MJ5oQ1Sx5CiXi7u9%euCwB+E#JF#euh*F|Hv1hhv)_Ay zXw5zr@8GRhyp-MRi_VSqw*9W>dwc2TF=`LiBXyp8r#e4IH!_7W!v&ou(^$frQ~)5I zgLHw_(`PczKkEr$A-;?7buMH-JGriTpNE63fA)K^Woo&9jDnChEE^HTz&81()O zp3^4Z{tV93Z2NxxaZhJk1A$TjAsd6)5<^OXDi-M8Qi=I^zMd?!8htKfg^$z8adLxf z!Qn_X8QY%SqaeflG%csrLt?x#4M=Y{SF5o0Sgm_3Owsf8Y}-KWzucZEUM`$JFP3yN z*jqhujD9fSF!%KssDr4S_H~(yeiRU}HRveyv>UH;==|1VZ}8@tWG_wpTU(Qz!LfNm z&C?Y7%E&5tDw!vKLwHl4q;O*RZZyv@X8$s{@QizR{qSDFy-KBgL;d?dp}><4@c!_< zqe6J`PsmW&)(dFm@u=F$amGfX+rzJ+y2jO|L{r9{iJ+06}CHE!MxiR|iP%{V6OJ+;S zBEr2?!xPslShb3Y#{F594VFzhk754|;H$bj15+6pXsN?$zF^CP6^u;7+U`-Ilj&Vb z$%j>$Im3yzG_j=XFU{I>tIc6_q9rC;P_aK3DdvZ;-Jv}vnR~z~_TZ@qwor9vFLUq2 zMMD9GU80s7=09*X;0zD7l~jW9U|(&>zVscF!k7WBUPHs4(#D-Itp-%KP0S^f{=#%E z*#{vn^GgsH!63ooFp%NS%q5(HG~F@emy4a_q$|b3lc!+G(zVii@PDm86WxkI~%&4ZZi}cdnCu&38n~Fdj@H zpigUIR;T{}R$^yx?^LsVPgei5@dgN;0qi&Kg_EDeIGWc(t6)qi4Nqn(ei+lRm^<&t zr&0$fMlo!!ET4!AV3;NV5zu%6x^;XH4$rgvh-L^=boW2(7AU+ogv}mxJKn2Y zfMr>Lkbr|I|MbHthI!^)Oky81j0rrogKK8g-Z4OhZB$`&$1ng~?-tq;D=1Y2ONDUc zU&H(?9wIdFfu-l&7^D3GLZJgF5c$fH6gZb`j&%$MVGjOi(?Ho1I470nC-1w>14xu%<1Z)91q1RSU{%qZ zV5v`90CWa6`t{BU#H{ZCBU{I~5-Yg}^>HZ$uTrCd%rrH*CM;D$W3I z{r4=gF#Clr)*p|JcZ5o?amP$4u+OR>>{AiUdhIcea$>J3Mi@P-+IwC&WMdhsZ~}8{ z24ei6!cefk;;~|5AWf#3{DD+8qyd1LwOm9Qz!YCg9mCRVc%Z^Osv3Cr-9)Aq{*8C| zpm*@MQyv_3@|wyKr*_h^(o@JGAim;0vH6ZVALe}pTlTsAo&$w7-syk8&uxC-s(&hVlq52Q z)jCSBgXM?@#^VaEH|mX7%}9!2X>u#LgwwF}!}2fRamUW0*!H>)zYRS}*=(CwLd}Gw z*py+XQ}>laPcVhktvjIacMB`Dy9z^PgGcmgl-|cw-`B6Z22yXTktzB4WKr1h8<%n| z*C-pzL(9jJ==uS>?yxY@R4(&O{<^*TX~nwJ(Vr8z>|C$AX&<`pw7$w`m1ySJlafEI z7NF<+=7E1NagXlMtyL8`ACQxK>li>>oIBBWzaM|^4k#Y3;wym0&r zeY@}?Il$CiQd1mp<=zY=txq~5uqT-p@qyg-LX1&W(WWlR;uY2HT2LvWV21<_qq8nmhAP(5vt@vrkaB^=lnj zDUag~{QI`XyEmX+ONGY0t(w7u%8Ukw-glxhg`YOpr;dH)kpb7q4~?v>p!eeL7$J zPH(3K#8IC;mz=TieF^;*Cbi;Y_Uq1jW`W~r5qU5xm+Q+$+SGp6eF)U8>`A&-w<+SP zq2g%!@nr6?icz9va&99lS8%LbWx8%%MSel?O)VHkN3&$=6fEb?QR&_(7Fd4jV1$0W z708h05A<9nPR2**ZbZ%x?MbTWLH>Zimi-QmoEJ$lA4hRhDTU!YnoF7qDd#J4MQD!| z91~Jkrvqt_eaIWxO*EV!dwABbG7~E(4U9qEgbw|>?}9kLz$Y8hs_2=eBiGyAzJZ`x z3LNmGS_&`Z@MG>|I}VND{{d9`nT^SUSgN{5(fs<5w5>zLKM)j*p%|jP21#>@NPY@S zGVOF!ONpsuQQFLg2QD{hAt#C>e%v9@WxBp%%cNu1V|^V97JG-O2YB26q#fmK6>FAG zfd;Pbxuv7-u)X0O#TTIn21CX4e5=0~=rBxN>`RCrq~PCEx&hx?hC0^CSGh0PdYN_rl?b^#0lY55V4$;6&i*8x#QwPMNBRz zN&^PH*(F{3tfg;$qEpONFkZF7(T$5+(=lcY%A=Ll;l!xom_{ ze?~QgeW8*HrK-JoqW`Kmk@NjT6~&Wz-sH=N$ZTp$8@-tE^&ab5AE4a`;u$GHyh8f! zEZU?k+@$RUO7-c+N5AG>YD?lbVBQzdJA;I#j;wd<`2xsaJ0@zd>wNni&dxNM+IWBz z%5p|nF@6oDUwKhUB9td3%RnhnY(?Gl$EouA3tx$zb?m``YBizoZB*so-PaUrigr6H z-Cq+6B~rxA)<2PkwG!sYr)H~|lVU>4)IucER)yJ1(Q*(lLyQiNeptq5tkxY15ld315 z&k=uO;u+eREaUetiY;;AQTC}%>8X1p8mAFiJBcz_r^M^xWqoJ1{j~69KhqYE;^k|3 z2iZA!@Yc{=4e5l1PN*|&rg~(2z&h7uk_0`eMAz^a)u_$lv7Jw7>m#Z&wuwJFfMP4W zWzQqNO2zYc3pnq5ULy5EuWS{N!C?7jZZhg7hI=e}q9eVF9aEDyd-G?4IhHh7s_g19&2U^N*n=jA>rsjFnXm#p(Hy0Q`cO*T;?Mi^UhF0r zB)t}gmj!4!Drp`(qSUJT1M-aBuQus9E+Z+q>kC#Ux9B;@J3x|sdw7ff4F|nQkBJWI zu1N3N4CRP9{c#4rsOooW8DAvk#D$#+bNV1kzCjzxjs|*Sx-vxEr6j8z;5?p6RN+Gy zS~+(_*okeOo53s7Bu*C0!#!fA3QB5xO>}DfSM8$f2ft_O42HT06Z>T$WC5l}gtP|! zZWO9ydTXoJhFHw_(*~+Vt!(dTWScYkUls`BeR;)3*sI^3>F$U3OAm=zd;SC*9+Y40wJZ5Qyij1|($!A$p z&0hIQbQIo*MSPxXG};%Ls+gAlGISV;rn(baKBUL|vG;kO{E>T4b_6fs&sW*UZy7ww z1><7o1ckgEcIa6UDB7k@cdZ!CAdQ8?77Qf(`{F{b<>_gI3O}!QfUgOaiD*kh9hCYB zG45ANYo-BF&oZLoj7Ph!{tPt@2*-gW0Z7JRNlq4i@D}1gVQ8D48@;N^%uOA*TH@jJ z!%tm^-~XEU=C{q=XCyOXRQ@V)+|J%)y`av{B8n2mhsPI5aYpBfVkquOcDsk(okcQK zUc=u?^r(5-(pG@Ii$q_?n#)c)aJ58BrZY$r&(IY-tV`&;q&IV3&I9KSz%^u$^v}C1}mkWYFNJw zkfcsmu=A5hl@Stt4Zf?!IBu9cfLSN{B9tZX5l?NK>SrhOyB?J~QAaGq_26;kU+}qq zNURj#&w7a?H|2i@7m=JZb5?R=h_IPWDU-$HY0h8}JL`2-DJBQ@Us}1Lpd@NOgn_=xIbi%k*OuUg9OXb7FHyYi`&rHK(f8%yKJ%6}uTqf;93K@eh8I{k@= zGttt>iIkP)^vXKOxJbg2R+jrxT(Mt7+=hq9*{7@c6RERb7t<*2pC0!&vl5$_vyRo? zy+ZyXrJ@A!MXu7g!!I*B@ZSY~I^mW3Gr>3reTZOw37n77a60??*{7yuAgWqwh+V@G zETz3ifG|X;(yJEbVcQ0N3XPUx#|hgP4{f?CE_Eh z=zZ16<^U)K6Bw!lCS|?9CER2zHIDpvDEOO{L3FksZi#hVAU&|OaIV<Ya*@@>T4p^F8(Iv>qT8;PjqzNXvHJK2teS**?_HdsI@E zsneQfI+RIccTH5T_cKI`j47SHT8oRjsG?DUjAFfMTamHS{WcZj-J>I=MNs;QhO$b| z*Tm%Ug!-Aa+ z0G83LHOQHOVnK%D_@0>zEAseh?`pvz9Ruq_Lj3!h^slI9jE@|8CHPK<#0QL~vs~{J zm=lUqic5zr4K1aIgFC^?Ej1$*qoP;V;B9t$8@U%M_UJ+HSRPpTT_<8w_@)?~ll-)~ z<+WApW2Sr6AQbhAmqtEV{yhZh=CAkhfSu;fjx^+i)l2aLKIRU29u42`;3l_>Z}5$M zqE%A}(>|CRkFqLpON5(Uq(7u0?Rs;+X;;*6cM0b4Xr6}^wTl;OyP6nfiNv2=inE(1 zonDGFrzHNK;Tp3KV%RE9NfPrKP%-Uzso{-IyTdw(t`uJcx>UnWD*ARHkW2j)csUeK z&4ux#=cFSr;btc5I4FL{lo&r8;7y%2p7>NS8RUbMqg}A*)ooUwJzFC%#Uy&X>sr@lks-s*1Y2q{_4a-C;VDW>8K z*2<_zMc*6McR%caEg6kQRK7N_E>A@MJZAC9BS7xmY9p~azl9OWC84&3QQ9?Jj_Z%W zg)&6ZVV!n5b=3e>;jAK~wvj6=yFT4MEUX$=76K-f5{jehpLpK<)!}35FVhz!y0_#4 z@r*u~hkjPoQe`qO(EmgJHhE&-mc@80_781f$UAN8_TK0swVAQ2EONyKK-E_@M|N4& z*Z7U~rFG7Ju?N1*@^-rgzm4gLk>9KA!*H<-6UNDF(sv@F=+;edaG{@U^i+`9o(Gu9 z;HZglS==yYgs;YMX6z#?1wGGzBzyAjOgEOc(%{>cTB=&kbgB-^DHYpZ4XJRetuUn0 zHSW@8mSiXJB&g3~SK@cG0CSd&?LG?Q&#~!>KPV&xW@SLCAY6>|jisM9D|-yd`)q>T zuzs9>43Y@OMYJJB>%!WBB9sfBir(?IfvrN6MN&Mt+iJ##Av$Vwp|$hm;fQ=rygp&b zXLon>;Mmms#x%>bq9u0*r)sR?Z&l;)>7bDw1%<0)PTJui0~%0$WVzzrkD|6kD5N}u zJKXART5{*7)mXEJASygkev0R((>U?oYoVGN<5h>Plk~aaba*oc<9cIDoA)2tE>@R_N#NE|xsQYvSYu6|rb7krnTMN1~jUyX=loaG{C^*+grB&8I)O_7N) zvoRR>tal=l6!n7mt~tU@lJN<%+-_n9O7gCZEQ+~rZ_pAi?K3VdcijsKu#vq*Pr>$+ z=&8;<5s&CBWKqY>Yk^U?lw!@!SJqSgqmzc7Qh@q{EYPJGto~pe{xTe7j#1fOtVx{t zuI?yk5Lq4`6xLJsVrKuUu#_!OkIT>8VWCnt8J<66WE4vDc(Lv3SntvPgG(X)G04Ry z3^#W6c^FTufGU%u=)^%)zndrXAwnX~-j_a0sxg7UFG?4YOA5bwF{nPLhd%CoK^ws2 zVY^5B1u)^wCR}H$Rrl|lb!OQYGY6G|m)$!|Yxt8@JLm2ywvL=bzr4ApWAvZ#f4KB| z(J|)g$x`fX-E^|krmExhi_OYv)bi?JyNlWdh8*mdGm#S=8=CXMR$h&+xRhY%=g^^d zjh!fMd1-?NlV2n0h{mhq!)$p;X6MW23 z3MRI!|0HFyH2i^Lm}>B%BezeOMH(lym@JOZFfi+qI7mP!aa0wH1tpO}{uGl-3$sZl zIpcv|`PU4iymneW0v0ncoMdJSdxV&snZm9ihi0(Lt^IEQKM%REyWCvUF7F3xyI&o` zwYeJ5KRd$@EwHEar?k@Ajcx$Cu_68-cz$w7^YrKX$IjJ;gg@lCk-qGU))@O9;Z+p! zkAinfU#kqXs@P?t;-Un9w9{Ap)O28PCS0L5{TbQnwKaFb>Pcka8|8nx+4JN3tq@Mr zQUZO2h~9TX7VaD|lU#NzM`C?OLM3@+u~!`Y%bb-%Y?o2Nzf`qeXK`>7rbQ(doV@Mh z)_Z(6&yx}Gb&uqDSy9fV_&vK(JJE8KeOe777AyQ=+9Dzr6Of+OxP?5jlN?j_%OLYd zWWS@oF@%qObz9y%MLZcUkY%qQc^H~6{VK6jYzJxp-> zmQMzhxqn-|o#FN!p1d;`eo*VIAH`<#ZJQ(uNxRSD^Gcs2>lay+NS5+l8mI2J;b~j4 z_*3=f@+wPpb{`oa6wa{v@O*Uj0Eq3Jrt&TnyHxnNqxLdi>~df&;lt8ed=kWDt@UAA zNm7DGWm#bUDzQjnASaFCbm`Fl`r)wp4tl*%Omi!g@x+7bI8wgPbyRT2l0Z2Zt@&Spq73Ue#fi87hGsW4(>1&VY{#1b4Uz+yJp7mBR z`GI@{suLFOYBuX;mgH=P*j&rEyhwU#9}T$)bUm)lr;=&epE=TtV{Az?($P+CGL*Nk zz|hH@C-f0%b370P+xh_u?F6dz%TdY;ZuAigHPvJ4q3=5C&N5hkz5bpO((CC!ZDUC+$PcKXnp!??_I!@k$5B4$!qUxSZx`0m4>@|j6j(D=kKU9gRAlJz>|?FlZ>}xL zg6s~Z1GabZKc~#p9SU$L1lXX(Mcsr0@u_-bwkavy`#WdecfK-DrpcFKscYwd%twMK zsA^9L1~vh0ANFCQT@E&3sH^<)m(hT>Jt~A;jTaSi*xe@n)0Hj(U%QaFz-$&J0eo z_E4%(j%xCl=d_y;HVO~RSiBI2u;43yoqB(bD=dJjD`~Luo_6Fm|h2uXd?UT(GgV0c$C3!QP;OdIAC(Q zD7FEC>}HT#?cR-;{$R=QaAatXFejnrM-(EuF;n;k{hkvdUSAtSfYC;@+gSC!kjr#r zLnYwOxS+6zC%s>rbUARkHpC@{9l!!fA|rno)-Z;Byw&j9t~5J&vCh=KTqK|MsK{4Sz~|x zwAh=>aK>>ES}Az_>y&YyK<}2hJtlF8mcHUpSiI+Aui%y`NDwYW&9I!Ylzd5SnL3 zvx{i#f|f0f-p0SKg1yKL2LwuNpDO|Dp45IPn? z8i0;P^tZtWto~gL6B)HKX`@gbz-$)a7O~&^^B*Gmv`rTDr0`H|Hlc<%2-UvAz zgP%1S*?%X66&2XcM{q|mr@|hK3%dJs+&!pxAztKdx8q;#Y|VM7km#RERgCboaiPcG z=R1UUMpsxB5KC?K6{!CywIo#Zm2X5%P8VSO(PwdIzrG>{v4<>Xa6=ZC(cLk~G%1y( zm0rQLZktlW`8A10WW3AZvbS#Czjjyi93Y=>pRtmWhJ(>Owv4XcDE12BS4I z>-r=l*rtb4)m_#5_^sS&FK1mTo2-PmS%wLJ4kdWk3C7Xbam9aj=zPhY#L?-Q(v;P_ zpy(Q7tRG$qb%4O7H#^tWycZAOZ#l2(f|qd4z)EB~v~K47!l9Il314n#kecx$YK~K{ z*qW(uNEv9D=O{OH#E_-4CGI;4mt*5svmWA1XSmuC^_DSBWU9vs4{=4@@@{K#Cd3wQ z+S-eL9(}-nhE!y&Zx5-&(8-|MD`GBrU<8l##0;-D@l#tx@3fN^s1gmIS>7V;znD_i z^r;-P8_&vX-)2Y@yKPWp{FvYRI+@T)hFXPu7%+=Zv;4%FM1+qn=z97zb<54|M`^48 zy`UWT{xo`b{m{dhK2u^VufP|;>ZPCkHHqF^-84R}C;-p@ZIVNR<0W|(Zv3oe{M;EQ zZWas4ki6?BW9vx{%hVV*%N))?6&cs?Ib6k!f*?3iHI!kpOIUjb!~XDJD`x#6UH+Fq z0OR722fylv_{<&RHZ_GID%Uh|THIjYGkBn!G;gIB!7_?V1x482pYyav-Yp8o6rx)~}? z7E2ys`!^hRdg$>o2qHs0aX?S3*x~nB3r2NHU;N|__TS%sdls%zbx0(>`c(Al+bgBH zj_ZP#M=}Y?FFzG|$@dUehUUp>m3^X+NT`4X0w-Ua&m7`As zX2A86VjQ*qpX-qQ?x%x8-$@$SU`MXsd4op4Q??lt@~ztk^0>74^b6q0m4IH=`a`D+ zNhYP9c78;}<#u^pT+d2*U!G2e=ZHV;wNOhP;z-;z4BomL?DATwT4C|m@Z+Rwiz1}! ziQdz~_8JOCc0&9j2#RSP3;14TvSQmZ*ii3mTrIo2>hMIEsmTs)v@fOJ!EN0;33+6} zNeOApx2AP0GX%9bf-?#eQbWM5=I3~!Is78*CM?^<8u6iAUN3L~m0iu__`MI(%bJ<- z%@tg)DB9p`HOwDmx(3teFENvV94+j&1LL~K0#5`#nglddsph3wI>AQ zq|eTdWGc>T%3F_APG%VU`^lA{fM+YiIK+O`05n6aNgdc_HcrykJ9DLHtGs1vnYMJ- zFiovnQTyH3GW{M#T+f9#T{g$8l3shg%Gvap80&ALT5GR%_GfkjK)c9?r+B} zohYk&c94ug0>5UMt(7cg)>&<&?R?U>$l;76+0EH8!Ml}te`}eZWHTfA6v{)X+ z%ysJPtoFOVsgb5f&@jAmQ0MGf%`k?sFRN}Vv%PZ@v5z7+a`}ZtiMrjEaIyzwE3?M* zky=jg{KSSmSdB|ECELf?dSre3x{o-EmJ~Hs{K59XB|@e%+2#BTq5NU&)x2Sh4^x&z zHc>b?J_t5ZO8%#OqG4U;;5u9xWA99pM91u1QLZwQjSgylA_j2%m~zzFpI?0J%+cSt z4!##!FSsvBn_Fafys5u0DQ0eG$kM3Ddy|*S-@2TiT4YL8&Q!UE)bv_*ak~Xv$J*7? z8RrWpQ1B^(GyhY@s=TQOZr8e;shTod=lZs)HfHT@c`>PJw#)PKaM-w({?w$J-dD}h zV{~G>`q&9uL;F0pjAV&bDyv3^U%!QJ+L(vk-y~TYL0mot840D(=O7>3zSGtqz+9O9 zzC-BKg{)DypE)=CJ=o1zZ6a@#(~Ef5+7+h;d4DS-OL1~Tt1U3c$raCJZ3n--U5Tyg zqobIK64f`2ws4yw{}VgZ$stQT4Vkz&4rqUGQL>D%6UBq_QJ$|dSJ+f`VXExGLiy+r z(4^)WX`GqN-}=I`ajsW4tUdg<<0aa+wW2J{Zk{Fe)6swwGPrDcIxH9wi@^G#pkUh_`h~Qc00PxU`yB~JRFo@z!md)n z-uK!rA;eH3s*Qo9kBynF;~yEUJlx*h_%YOy3wzjkFOu$XJz-zED06`;HvnoeH+tm_ zN5}W;J9EMkg?G(=I@fD$+j505qtlo#!XGZi>uV;jqiQA_SI^$&82$d}tnjU561<@~ zUa~iOoqA7frn%AB>5F5kt-?TVtf|7{qf?N2@7OJjzTB5CB;DO=Ax;8Jn_ZL;UST%bfV<>dpQSTkja1OB1vU$F^E9ox2T+qP}nJbB(9-+I5Z&W~9=)m=Tks;{2zo~f#?Z^aKUh&ROa zGPB<@U;GM6mA$I+U5Zp7%qNgz-7Sr zkdn3!O(`9lt%|A>STs|(aSmPdly>9pVuuO2pzSpoh6%bFLqY#q*TZr}EZCa?i369p zx*AfT=pu!+PMZAzW#9<6VmWWOcb__RsVSQ)_}u&8SoPS`EmotZMmyQ zflGFG*p%Czq*FEO+~IpRw^)rleW#vtebCR7-jqu0F3VExsEi|=Qe3vQSV>;Bi9y~8 z-|A*7vAj+=L-3p7{ZpvazvasJ8OqP{*JtB{&*p~hw&sS+*23vAokC~#cUdA9?!Ho=&^C{C29`{t}lx z9~Q8DEx*x?PUd*;vikfQt~iGjJhOSBp69tK4Zlf!MDaS)eNhXEh2rbRd)de5=~{2KAuZG*^mbpp$N!{UElg!Z!hHPUr`dzW`FvwWB57|nMK zAHzy17tzbCjTP{Q$Nwyc%iq`#3V8606Oa-3yXj}A(D(~1+XJhsvK2c(fqrubl7Mk@ zM`Stw20PnVAv4hKd0w`+m>}T4w7)n>Z|0DY(pAm^VzVs(IucM5xty^81#$}6X`f`L zf+K9#C!|KoWiC$&RY3VM)7TIgtux(grgwK!`iM&1=tEkl7dYKP-&>sI^EbNHF^!gJ zTwaYC!tou&Sn>Q=d8%|cNAaH|gV6uQ$Hat_S{7a>gJu_zv8 zBnkBtPQZaaa~EK|{C?9~1^TjJ`qFVN^0I*bvSIxDr@vAg4Ya!Jl?nTsc4QllXx#DblnJ4k-kiff_wdN3j6_Y zC}8{;dSvp_R-%Q-=0@0Fn#b`|;Dg!D(xe5>=7!#00?bSQ$kKIlO~B~A+g!zZ^J|;y zr!I`Zt(yf*c3V=`jmrC%_i|j)4bQUXi;e;U|0A5&x=N+y%Yq}IYe<85fI%bYQtcqO^A#0^ToQlk?i}4p&p<8=8LKC~cr-1}1R2WXLkPMDc zO*t~42~pbt^7zruI$g^seI+hnJ<7tNeTAe*b+|K$Q4OWj3M( zSZ|H^O2IL6BvFV}pqwXv9x_;d%RNN)+^;WytR;KqNwaxW8DW0uqgBJ1+G!)87sX0m*odq5N6Iy4~Co@8-j`pr@qrX`J8C;qPWR;hsRh|HKd!*jz( zl7emMIBNlmQhEKet@@7^uzLI;`#e8qS3^U+{2#ht$7wCN&;?h(l$n-dPb!A}qYFPCfqQ+2Ha@VkQ=`%+Ylgh!2+M8- zC&7KXmU@r9(#}tIAV_paPd9I)tj9hTn8S8_YNdl@ju1} zJLZh{9wW&yoP9?^%ZT`}EE~L*GWg6L$#&x2&?X>%mCa``_)Ru2dO0qkb@?tOa!e7I zyVw(IT*tg(>y6N?I#T(E1bpWoqVI>0qLku!msECniaq(2?vi(GJrtT%zc2rgk@+|8 z_ySOX%4b%bA-gIi#9~7U9-7sVF8@%l>5xZh)B8iL%PWRn;!~CkxXg}rWTKP7x~RpR zxOW_jPVakDdJqtD&EB_MfPruDJNXkvtf5m{shN|V|6E!NLOu;80Uzc{kgv0O2zU8n z_y-c<+#?FJ(vbxwh2nXpKlC{FNHieHIfjt_oJc@x>8D0Tz=wwBI^hWBZ}6woJCI`+ z)kiDE6Lv@k>*s*R4D&$eXjr^i%wht6Qtoq9PPD&!MIh(knDjt|B5D2Coi@%7czlME zl)*&@f;d9kj&saeV)2zeSnb0&8Y&E zY!7LkBJx7k%AUBnSgo$7YRJr=C}K9T%1juVE_gJ{1|JC{skj3R6 z2X={*Fu!d03?_>x;b4_WzJ2hFl8nsvyjBV*fj*aq;Yg^@2K>iVk1 z8HtTYjWMQlj!~ifpA|O-L&^i{U;~;ZKI)gypSi5^2P(-vDHyU-Fa?^<(*vM_g95m^ zb1)vt&TG;8{b`1L&FBp4ow5p4-hU0(RTCH?$4vE*d%q?w0y4N}*_Sg%(z@}cys)*w z-W=TU%t-{}1yz9401#skRFG__Ihr}GK!<)upbbC`SUKc5hd`A;l@KT7Gg`h&ejFeT z(5g@~95eF1VSo4;7mv*8xnCb zLFnkPUHbw5pMSS~D?YvmzGJ}LU@$DmA{0iAK=?m1E0G${e^FjtdK2M!T$l-rH@{z}lT zLHzJ-;9f6aKV*FW#h9bX?YkP>?OR_)I=Nd|J;4?bbQKV_aP^HI8HGo~_XbnxD^K>F zg5S-=9c$0ctiX+sX0`RbZ{2$Dt0uJ$94Yy@br<;#K+k_onmbZ2iPA3F{@!m18j2VA ze9Qlaw3(3kFRs1suD3k1M9tb>Uf2#Pl@U!Fd;%b)Kx-tQjlLnwl@q*IIAigK`JPd2 zF<*FuiC%ZGCD3d8Oxsg`J!(1#%{~E&BUB}@#b^q+w((Dy*BFk;vLq?q%s1o1+Ie4E zR#xR%xH7c|Q)FIukGU8lm`@9P6>wZEJ{_^NL~#8$^|nVQga@7*#?6ow9sy!TMCuNa z%wNC?85h)Bz1?Lb{~-3L!@BrWRkb;D2#^M@piKnXn3N=~64rX?r5lF7polb7;sTz-q$xkua_N}BfwQp{&}P9!0ZoY|^htB|Cs5W_w*KVu60c`) zf9s_I+Xq)xqXOJV?(7yM*fi>>?(mWu2b>P{yV%qEZkFd^i+YQOG$IrRe>*U)z zJ0>=h_LoeegG+1W>|n|Jo`!)_gaYnd7kM0e=26k{oAESy3K1*i#x8*&ncNc0M%96@ zCmj@+O=DQjizj;6#T2kjG&*2ZsSNkN9W|s8eIrpJ0cfKx>K&W$7d$8&wc(xrT-*Tg zZ!1Cu+vf0AyIAlG{34U|V2H+Fz?6ud7lv`X7w1M(guItJIza0XeFF%cR5zP$yeB;M zt(NY|)zx|zvf|pqmzULY`STsF^)rnM+wVK4S7vJay$`#Ck6Wv~_48L>m;b7@jv2G@ z2)u7+^Wzn|+`p!VqrcfUG_E(l?~ei3UxRfOC)MfOJ{Hv1fXB>6CO8d>3W^FojrSS^ z1N=U2|HV2z4OCiR9ylu_df6N%zdkS+RI2~)W&)$)*;%}sd1wPQeuzOlifd(yt=ZEYKtJv2% zd?5u!VZQ{aoT`KbE2ccu`c|?j|5;z_SK;o<_>Yyxp^DAfl~b+PHCLYa+*I*fCS2Sb z_p8e?D|;J(WrK4OKpsSS=BBw4R&tu7&*M6NSyuyFl04`Yv_Dwowto}M2>n-3%ThLV ztyV;b%1y_g8C|oUrk&y6BUJ?nXS+CXQ?fq+L&9Zp@@y8GpCRMPgjhrM`KK)bCK53OVDSxK3NkQ9sN zZ_|Vw>YCng-DG=7PsM6&(*)4Fz4ig6t~qjC__ zJJCJs>E{sRc4Z~J&iSAH2?@c&KLq?5wUZVEZp$(2haSfd<{6-NiZwx;TN3=+-M2FrvpOI4|J4vj@Z}Jg2 zykY_=Pg4a(SAjwmbP5JIZg

z69eBoQ4T-1 zBxyZjG^D3UVD7^BKd=;&?<0X|6Pk~xH{#qO2wX-zIh$xGcvmI2yb}odj2Y#=!~+db z8fVxs-UU&|%Bb_Jl+A6~tk^RS76f?ydg4OwcVR79aml_{s+dX$0e3Le5vZn2BKcjh z&WC+TfXs#P$ES%KFodZpkM}=D#iieMQjDXBXQU0G6I!rHmILkT#5F~2q5=jm5VF^K zx=9=hd$K7zY=?OnZdzgeB-RVP>FF?~*L~;Oq8(?%x~CZSaezYE!d{F5OMiU@i6cg7 zeS2(Jd0RY_>FMtmZO~31IlHe#gV!WrL)KkcKyBBzLfGTyHTvg?G3(KO#gj>8f&caq`qs-P8U*+7>O|LRMCg` zil!@0maIzraS7tF=<&*Zjcl~efMd5={9@Kzju5 zo&9li7DM1~Nk)uj>y(#oh0~GS@$T<*MASKR*0O_4C#^K{xP{6IltQ@_^14!DMizqZ zw$Uww5{5fsV&~wIS2+GdSl?T%rO^3)!&hzTVB%1PRn3HR?nS%Pzf5B5eN2flP$F?y zX;LP|h?*1;w=gQraG<=yE(N7ffHB*2lq)C!n8c7$IaTytE?p%JH(#@4w}@QzrHrEW z^>X@C%75QZF%pb?zfZT;C9Bb~yyf+%z{x3&DSc4mC%0HcUZWr7yTvIfO^QOOw!G@l z9AXv5A5dJo+TdQzQ^km%j+z`ROEWzmOkxt4%I}>7Ss|IS+0)-o9unX=0qIoP8$bqq zDPX=LnQ{?Mo^~-4j!}P&Q;#is@4h6{;zGC#|Kt|JR+2NAizZV;83Fi|2d zx&0+t9Lm?Dy2RU1n~7olxoLOkvS-Q_7PpDPIcGv z1~b&0aIi5L(`nZ~Jf@eDKrEsFFY4;Oe(zIVD!xV_pYlihiV0zxMF|bY>xn@Zh91Kf z7zoamXwH@CSW6Uk+W@I43|+;?(#GbId|cdLKC38#&G=gujV?4WMv8oePMs}~T!s0{ z04(kp1Q3AWX8!S*>7E6FgIx(GMKE{&dIQZ~xIFt;_qZMOrRJBLaVJyZ;wHn2%_mfu zLv1iHDHBsWt=XZuFX#S~PIR-JLUH!AU9rkZ!1?q07pa^GgI64F)?bvTT3=htt*#&d zths=52TQ_~u=roND?;9XVhre#Wkl1mRjj?&7JwY00_--?d0(Yf(AeT8e_pAVxI*MV zuC+ZNV&oeD(L|IsCRH^Ee9PUB|Cc&zEh3g z=m2aW`2|Bpl~xYWArp_({}asomtmL{HA^Q&wxqk9E;W(4oEjC}ydB)^%7Co2BQJZ{ zgt-fbFa|@k+I!9f#)Ad)MZjM0c=!JN`_B0#M7KLZNdcf09I>RWLD|Q%-+iQavD0M)(kH+|ER|()~ z?zs>~Qww%21;MS%ysRL%Gb?gsa^7Kfe$qqZq^(ivRjUVgfn-Kp6F2fw&t4ndy9k(L zx|406cN|?5?w^@6m+D+|7KrI)ZCkozE-w}brRZcgf%T)8yQ&ilEBRl(K~hWgiuT}e z^%r9l*`Q!*pl5l@r*mu@I3Cqao?d{*hj`&>b`?SPPU=hBHyv>yt{u$Y?~7TYqa7bo zXxK}>9B?;S*Y2znXWYvX$M}~>(REUGRJOFeL!uDA=lAR*o!5{CZRTdkNs+a)4xgCj z_=^dqi2QC|g?^ElT%64(owMQ=xtxYs;VCHPs^NskfBX=BBe<5d0C^(vQC&e%kQa;UXFim$>sD}0 zP_0~=%Bql28Zfu?%qu9avsD9phjDcD5v{u0e+P2~AnxhLMaYZiG6Sk?ed@`9Zxt4EQBOw1Ow@G1EgU<(mai#AoiW9$jB`O9~4K#vR_F<)utL6<2~v!#T;f3%O^w zz1FU(@}qnVUM_M@YG?xN*2R&0maA7_#3i-Jp3}D%+vxb!B?G1beV=Rd7^dI4-kowGfcs3(P$_d)&*kJj!D@ z*;@-}w*(j;^TA_GW!sNX@XJhT(KG(tPmw)I60iJ+;WtfjcfA1!j0+g=){953o#uKx zxrzDy#$Ff*9rtjx9f1BPv8bYiGlMnNs&wGP3~AydA3-|&x@o^R6+27rB6J!#d7AU= z@Z@aSum9C(oEkMh-35}aH&v9mWu2jdcZ_2S*BSvCGs`i2jNnytc}^Z4NBY749tM~% zUDwuo(AyvVx4#KkJ~bQ0e!w%cVvOC)a^_w#EbaugS0E=PRQ#$HT_N606-^=8Z52%+ z-Yp<|f$IPOBhKitA;<|mswFpgAAwt3 zY%4MJ3vE}3t87tLxt23|H%XxeH6f6e#b6MtNbNdc&wrSE;J*-LIHB78Cii|td5Ng2 z5ih(DFC=$LU-&C@^4oko!Tkgt`ednrOQHeZ2Z03YS*Y%Af9n^h#UBi~j~5xEFEF5N z!*@3}9h74LGvAq)32Yk}B}P&Kv;eZ)T!`PC@@Q2dOAzyh2JpH?r=NzNA%kpeT$-^k z+;MKW@)jA#AA}Z!>LVP?_>~FtSFo>~p)p5|A+>{Q;0O!4+zyJJStiRFOH+(UBa=uY z4Q`nn0_lUf=slCDCF~WT8C>j9*Z`+VF66W!Umi7ppM6+FT*7GSdV2kDw{MP!R@g`7 zjS!syDYobn3g1|RCj2Fc&A*-|UmG(A^jIV;cB5Y&bDC!qMY91aQ)`=h_rGX+G5vQ4`E`5crd2xblB5xPI>Nq<6ys z`8a0UCT#vP`8F|>3J&|Z`YK5WR6Ecyy0Bz`m-xnLRf9b}zH$;^hfxfup}Zc{bS5IG?OH6=F%tWL_Q!=-#&pIeeHt%B7sWhl&aUlLeSQuv{wRR$zL zP3SpZg2})m;JfxJ{csMqvk_GR9%5UO+!E#jlt3mcUjeldExxGC` z8RPfbd*?&#CO%&*%2Vn3^Hh0s?*HK2`A}y_ z2JL|{0KT*(Fj@Vta;le%zkz+oz#TcEWW6X2K1IBwkQ|CY zReR=h*u2RF_F#R_vGmM^eTRId+vjcM^3crjOj{@^$YW8g&*GFH!;<8a-ocBA?Z#X-Ats$EPk{<25qAQz#GbW z@`&x?<0s~g0BK}-o5*TqeCE~+l$M?MZYXT?NqQbnS-Mv&6h7;?j7X&8pd7p2#we7B zET0+VOV3M}I-d&j-{RH{pPeVbg41Y#ew4VeaC6r&MBpB2Z?XYX5?0Hwg;wPCo%da= z*aECw$~U5{4qcH?({?!OVsnZuVCwmEWS$9N1}`lrIJUN zqtS9*^?a-q$o^*4M)8`OW1iVECDG*p9L70KHaU z+BiyHUjCcK%hesCQvwqoFTz;sE~P&I-qy^`o}2f~MPXa`n&Ub%=qeLcrS5EYnvJf9 zBFhmU-9YIg!WOoM2Y)8smobaa81M~s2U64Ra~ueFb0G%&ZsdXPhCFi|m|I_>%?1}R zLsG35uNJQ%;G!S^aM_=Etj0En72FKJ-;V|uP1-Q;ky?Ws#;*arxxMbn9cQq+&LL;H z?hUay@j`5y_RGs_7%RYepn?%Nd%6E8c62lJT{QZ)0+-(N5VT>!jAvgU-g6?71$Kya}4e3Fs|U5te1><0_38g0;3{zmtOp%@do*L zn_eP7y$(bHY`6B|d`~yA`&bJ&;N;msy>9$rx?INCghW_hK+27{Qu*|pE{8*1wSG7Y zV_Ltw6c#Lx)qI!K)`S~JwOq35K6SR`5ys^aWTI{{v~#J3R$A}OX#|LQ?R`>Dz>RtW z#~TJUw?jC-7x;#hE!?K} zO}L?JCN(aksIp7-C_BiM(wjKi4kknT zzzJWasZGHNH?)!suB^p=a%l|cixxg_c0p_6$R+`y3K89>wTY~6VBebCvin#fGZ6?1 zgqfQG<9e!cZy8!1SqWdOzC{93*_&t1-;4FZDOuxbP31Z5cuhQx8Zo)5haLz3 zG<0{Jz16#KplP!2tXS9d@~#i-<1rLqe5vi@a%uti`r8D7{WM?z&n5>0`MAp0>ZJk? z(?GZ;GnvyVqr~pz4N4lE1-HBd2o|x4!o`Tc*si;lSt?1jh8uV6_gc0}zmFaQQb=x- zBapBT>H-%g$KW*)il(~9qXpjSDA=RDl`ivD3EE{XZGh63f7{scOu$?H3I_<%)KH=mL&;Rpv0-} zH^6*BR*2fSfQIWs=b-dfgvwMJ4R16hc~Wj%;Xi#@ifC4Lxr_RKE0*|Ug!2poWXMv` z_8jg~OXCd$eiIp-oKY8Kn>nG)*A`L2wbx277UN<%?05(u9FMun4icSvR13fynQM?~ z1XQ4U-mq}4X2!JP_EJ!i-Y-=Q$0FhkirxD&WTxxiWGOP{;aE#bl|g3!HuEy}MTuD! z<6WtA%L5Pa<|_tbX4X+pAmJSVlG2bdpmW(=J@S5HVtw1>=RTj(amQOng2RM_S=gZY zaAf$(6R{uZV8qTdz$Y5S@&gaA?3&Ki-dGk|48-(|O%1Zk+L^$dR#qW!ef2DKzxGo3 zN;KK)gc`Vj5js7FZi=sJu-mu`l@4^uhigZSw;%uM6f_q2>sb9^W96?0Fn^l+pbr}I z*?||IIHhYqOpa-*O9gyO|mqwUjj{X#^2*m)u&vj&2f z+Z!54ouq29u7f%>=MkqU0x%wOQOOdcouU4wGHNnO3_l zM#uIdGd4i43P>3MMutS-4IzD~kn%@r2|slTegYrzg3(r=q|X=uP{VALq=OQz5){8GeFoi!*D4+WIS)2_57KRk4zZ z<4p)arzU0TThKG>M9-W+v!|fgWv%8c4?sMto|EYj0kwjmE{p`g!9*Xy$IiCTr(#A} zZ1%wtjV@qQal(WEHVLFSpg=HOwbUP8Cqnl`qti_~H%O$MmWcd+EoCc)bcsOLkwHG* zr}b#2azh-!b5j7#H(NYJxAmH&xdl34l|UGS0B9-Jjy*gu+~b1RY@hdudm0n9R_bj$l;lE;(P(!D z7ntB?C+33eO{%Cf5>^|_fP*a1LmQ6=P4{!|Xk87@YBfq#392x|#(Ps&r5rFyI>aZPn3vUSwp z=@f(|5Rgm>6D%54rK~p6C4^HqlbQGTE@*(PD`ueA2hI^z1upUdepwav7d)X6tPD%vDH*dVT&~=LJqY^ zzh5{GSipAN5x5-6q0GlJXgQ;co`GOn{x=sq zkEDD<&6v2q zS2oHZ^sl#D(h{KE?W4qRWf_vho&}*rXC9p>=`7htTs5+cPC>VZ zN{qQ%nTO7kK_)*#F}aw1&;Ibs7-NFx3S*gMcQpN&ObHC|glvS-F_sC6o3>gaIL69) z7nlgQd@>0~hEnyfRQb-v(55L~l~AFY6@%$ss6MS|{$|zp`Ct<^u~qc3GmI2nNXNrF z5Ev*a^Bg+wE<~Gh+s-s9rxR-L;};-mSAIa};A56*71N?~7!zz0oNOr(r%#Ff^}cKU z;&|Kv@br4Kcl(I)QgGqClru&NBn0<84#5ORHbCo>Z#L~6Z3?dN=WVD#)4^)I;7F#^ zXeIifJt<>pNmk}plw8K>%~D-Wlsd2OE&$t9CoO5Sz5JTvFsgLh(kjxpNm83nP{wH_ zEUK(5Tgm#+-EIZX^p9q)g zb0!AOhgZR?|4(@P%XKCMZA`sAUMv_zKTIL7a8E^%8 z#_ONG-q-PX*{c|t$m*FJ#8Hq+;jy^)Ibc_*l_=Oz(Beee-2~KOWsSh|kLZr3$zU=A zvU<*PC4eojzU`jBFfa5PH@|eX_)X;W&c4(ey+aMMxhdAm(@f~%MK8YdLY1uUwNdg- z>vEE+(hA&22T^~Qyz*XHz_68WFv#{)}8G&_6avKR1Vy_0xxR+rr?8x zHBYMT0NP9vKLV;slr6(P(n&pjkl-|g@vhFz=5#m6+GI&KSpFH0d!?KOJ{Q7HEJdVG zXB%sT{P~8Lo)?+T5A++Nq%X(0OGQCZiyjv2Qr-8rMlZ+X^WpNC+zgCc)z_npDI3Y9 ze_Z(XaJy2ax_%>HUy2&oSX{~bcEWY&*~OZH#Uyy4gn7k(YvlT2(q5=<9I{t>SJo|^eM3eGu(RQaQpGbi&puCeI zGBK5V9jlsr(4_2n?tXtAcU!s>s5ql$tJZ!`^^jO();0BvYhvHz$bR z$L#SWxdlN<67S?7-v(f%k=pSOVfr(AV9(2 z#*AC`Ga-pRzroPM)yfHLNm7$}D=AaiUgSY&7DFjiy}$UMi&R0N z2x~j7z;KiSjYlg;mZxqm5$aEHOVqj-2Nwaiiu-JrZ*n8YP!A)%L1nmw`&HQ8aDTs! z8c%B687wbHJcR7gy7qH=h@-b^@f~U~v1-eB zH$9>J(u(H!Dj1#TV3)p!=wkXB_qI*K4=Rt4D-&=rbw49+H?O93J$7^Z!S*_yd7|0| zD_1F#Z>bUSU^x_|kc_GP zgDg zEd3*cR-i#>$gxug+gy;Oz_nG^ty(QxfjVauWcrz~AZ|SQ#SnO`nS=~UtiN*0oiQva z4M~KB>K<$`B;(@>+KAt;hJN3Y^y|fGqih|2_By)HTjK>ojZ>odyF$k zQ&E~7lk;T)(4v>nQjb^zPu93aQu}3RG&ZSDfk`?#Fn{C;M_i$s9dom$3jiL9Yq zR=(dAV8ZV3%aD)%7f2V!>w~?&9VyT*UN7?Ur9hJiFwmj;lR$2=m_8Em*Ix-+8av)8 zaY$(i7iP#DwZcI-setn~6NelPF~}=QGV3UOOSaH^A4xiu(R*9Uu0SynK}`0(-PFzi znx7}(h9gw~pV1?lAJ{u;@;_6u!2k3XC%NE=FzARhd6bAG{DOi_qd2e@D0igjr|q~G zo2`J!9!}Qw0DuRO45)-c+^x@)Nb=)oq(i<&V|inqDXlGYNcg-qkOh@^#~jZc6vEZ91)lJs(>9h5qxzmQudo7lKQxfe+PJBry5RR; zCFw`Y%$#yey_lT~{|iOF3MRn+f-(1hVARDpiHj@x55^)~7DSq(I7|@Ye?K^awsu&k z!3)P#<=Rkzet2wGV&Z3)!MB&>;ACd1KRBuKH?>WmWfPgOp+l_mK^>OJVST!qZI-X9F%g0H>92wYYSAcI2xQTtPZBl7nM z)-jX^G2m+!oQglZ?`ptOun&IF2aGk1YpKh-Y2X&(w$TQp-H|(a zs2^AC2K;-55B7gd8TqwBT9QYUdAz$@^SJxnmk!pqj4~2IN!1N3>t{3q#azTbm%zB9 zK@*vkw3(N{V>cl76OaNoME~x1CUWcR6!jeKXrrWycrMvY7~Q7AokUkbtZ|L(B`u5S zDB^r*T^=t7dKpbOSypWd`9iEZ-5aLd@(CqsyRiWBPy}xl$aiEJ{RhzhnS25NzsZ-1 zA?$Wkq4{WUY=TybUK*4d{BB+)9B&*oT$#_%UuRJVMo>{PEg}BLX;v*QStl+vyI3(p z3q+|BIbhrWXOe4ihoSjp04!%!rNsc0sj_YL(?vel`u2$a=oD035N$M$ju(b!{ZAw` zaYe-tmdbGpfJ(UU=fQ_zE&IKsWRB-e@8?b3D<32q(qZVBU{R75X&LcHX-Z_8>dlj1 z85fFTfg}}rdzplG!F%yr;8;#;&A=AU7%BvkEPA|klnauLF?_?Ctn$K43DUjoY?!GX zVet7=$)HD~ahIXuIsUZp^|QEcGgp~@Lx}aeBfgc6fE^Rdm?No-IZ;*^_E6kEmQoSp zUYgFOmr_{9i%n6#7G?ixRMNFZl)7Lqr#kj?7w<(E7d6YWzhkgsk45}T;CvDxB~?+W zQ3<73Pa)%PgFo@_`|B-CuQVK|U9c|qx%ps}KHI`QUXRwEi$sia^>&n=?BKn|1_Y7% z$W?6n1Q1A73sP+d^$5>UmAa{u z4I-aRFj%IbE#Wu{Kx%u)#KP! z%xz@SY4T8t;ssfFI8h^E#%f*|faR#Tc(W6AVRvNi+vP zx?xuFe5-dCF7e_L(}7#|4)Kb`Rrt79qK?cr|(x>jH(Bh zraNtCZ-$zZwUl~ui|XasXD!402@Y<65T5_53%!s0h|CBa+7<`WI(oOA(Hj#IH0*K( zzF5+tk{%X>z5@IhEuJ+lnG=XLcxi9PZE8az6NP%y-SqGApnq|1m#S*XV7=cHCS_wo z$L$@z{&e?nXOedIje9rKmYtGf(0ObPp~rqnH%PD;iQRdp!mJB26&4$Bnsy zpCC0-F&PZjO13f6`b<%fbeg6^$d}j~IE1Sv|r7FIxiCuS)c3ZT6 zdvGq61HTo0f;vZy|F?k@;whW`GmBJrVg-<7E8G- z&E2Uqsd$p1sjer~svY6sIrZzotzl)WOZQA#36(7=5(Sa#_LSg;fGpPQ(#197)Fp{* zMtD-dA3qE1lD`CNX$S(g0q@;^!ANNm(<|DWgSG9RfD03Kt=5^)g0DYm*`NlxpekmV zYmy_@-c77n+peYzOkT;5DJVu$UawTwWh-c80gs*LRw^e`25^g3v6#>W9pqp(5M^MPHUpaW2c zRk6pKd}Vo^;`=b$_m?AKJYv7p+N+J^qz+n38^xI!9Ep)OaCd^lPob_JXk3#FjZn_` z+(z&%9L1sMAaI{GHRa*Z@su`Ig?16IuZKiXch-S|Mv&{Ya$-xPK#b9=^(Qc_n7-Jm zDMuY-G;hIO=79j6Dbq@AeX=5|%a`pj3QkpAxtt7^-ElwBIjg_vIEFHwaDqpV>AKpY zlE(o;il37#F0kEn<|+YjnCC+t3~tTpSSa8tJ&@#ME95{a@2K^;9!*^Kx_)SBZ3ykM zWf#Y>pF+{!_KB;JB4CTSeaOAfZ>RSU>GJbJWddkCD#`%ArU~=q67^eB_E0Jr%c+C} zxcl{heV8Uyo>1bq+P)0yuPTAqGI#%@PDfYL6{5IjsIlRjk>)xP!H!o2| z>H7QZgn*p>`|hj*O0sv9z+Vh)Qeb);W$vYZFK*qICr)kDkw$a}jQ|VIOBH+Ll(?8GqSzC-P0X(#5)-`5yd#vpEyyow!u8{#yAJeyUUN&xI>4lAzofYDu;C z90&KgsyRtpl))yI;=!o2-JS~3W}XMIhMgGw`X0-a#f#1{RCzTERp_Y2UHx*qlC{im zsHHE1JgIiSj&v)tzq&>yOQo5R02=4+wX_?P3GRpWv?^t7dW|WJJGCn?e<*iDpLtFS zr%DM@H|zIM_P+Omn0mY)<;4O36~^n^rT>TbE834g!kuDiBDb7>;cp^qApl5R>xB?`ypb_u042JK-*vVY-B0Mr|(NDY}rHOnsqP9@PHzWqAJ)I8^O~l zX~4#*24ka-NAfi)v_?N7b=u4kVv47_$MC}AC-c2&vU>7Ip6q;C2q5v+!IbjmkjYO% zhxV_8*&QN$xrHsfKQB+<&xvZO1@knF^-K(J#4?)t6SUzEbQhHKvF12M-{~CFbtb>b z=lM$%jpSXD+0h1n)TY2&yqu&~Rbv1X!dW#?XTzrP#!xSdi{k*A2 zL)-5v<}<{&X{JF@e)T2;Rm(*O`k8LkAmXu%p~0l?ad=AcEg3cu` zb~HLm&^F$)Vh4R_x6y1tQU!aemnz#El!@`#&~%5rQ`q$lU;ba?5-xQTPjm`` zsd1jBA^grk=>nv_ShW-03tr9Tx>N$u@I#8VXN(8J?JK=9weFN=e@_axO3UMM)bGb( z@Dv4;>8t;^@E<#8D&XZTO@;;%QuW_TQV@h}>AL0C^TlIi)vtIYh=3mbn_P4oQ{ z^WBWEk%DyLx(B!8`VjFAE)2$_c+!vVv2%RW?gYI%?3}~DXWAF*HPi2O%pVN~z3ExE zjGQM4r>o;~Y=O!Se>rIAMu!XAaVmRj<9T6s=s%Qr{}5{@sCMN+wxfp)Arp$38?mkR zGMomeRK2!rowmfdO!s2_1(lD_Y63wF#_xHG96acupkVQ^Rk60v9;7d@u*_zn4(!eh zGnrBm-@Vyw4?Wh9L;jHO_vL9D&k?{fbtW-Rvm{5-$R%=Ke=lYgc++!^h8UZ-(zoUG z9KL8}*)A84*36gnhquWb>b-kmVUm!vtN=>BksFcin{`4l;L=xz=+1gi+GLj|2O^i~*Y^42{_lbE~= zi}>A5m5CF@HkZ7^@Bi}4|LnqT9b*cl79MyO$fKk+bq>P$bdob8S_n=^;Opzy*0Cw< zi#$=FX4AP6$Fu6*C@=1+5-)*3lJ#lK8H-^=Vqtdqf4Ib>Mf2hQR#83G*_70_#VT+qU5Qe||E4GlLLc{goN+D@d)Y!We6Rn8{g@72HBwKXd z?ykp$UjBR6h-rG)M&%a40cZAod}nq)eWp9AC<(-A!~khrFdU0e>?!ckwLVlxlmVwv z3@E%SvURaF^T+sO0?Ezwha`G`vvNtoqS?yAe-jW8i=4@Ds3-;RR8fb+ZiO~^=vc92 zm_%&v9o0ekn*UTC7tXBQ7E#Uz>u& z0_Ox_UR6P&wclUY z>1)x?_Zkdh29ba-EYD17K14+8i5=$sac%hG=+__HLoaZg(6_$@_F@^%gPCcUt$0(m zLe(4kU=}z{<`NWGV>6mK%wXzFP5^C$e*=~_j{v9gqu6NbTYg1Z{zIB}B}4hF%RS0S zefJ#h3@h**Rlk&ASe6^irFF*4zMSd#?pNDdh6^XSy_{KjF`cM-lM%OASb3IV@oN8l z+jB$9oz14pM*F3z$s!W({;%4jtV%(nM(Mvs@Xj_S6^!W{bL*~#DHq~G(jeS=U5v?3C)f2*`)R2TZtfEwS8e8fo&sv#6`F*Ehn>;mybzm`zm z-+d{`=ljiqmy*mkA)A5*s)e+rkC0J=I*z43tTEz`13T7|aUu_i*fHuOyR}kyDg_4& zPa1fs@MeJQ&17pGBUFbBJtJ&SW40BeSZSi|^~Z3knc$eI*DfgC{`2j2fA|LY;|P0r zD@4@+UNP;FppE3+i`$1CXx9m2XN1S&F?Py!CCBgHzMKmCugErpEVb#n?f5o#zIz`q z#E@g@d0|{kvqc)6)4<=evpkPVAR2y1Q3uv^Al$vtd!}w5 zjz+IKvs|a!uUO_uQe@HZe>_^Pt^J=``<>AR>jT58GPUwRUiAMgJ;>u^TBP|rh_Zgv zTvi`}Oycy{Mc_}SLs8dEUq=iV^Le~3R6Xpy02c?o!vQ$SsfN^p#^Dna*qU7tvngDx2d z8b6slF`JVGPKv)NRFbAROlZS zq;B*6c0k$z`O&2wO^PC`4SsC)M*$io>lc@U4WR2RM#D)sUcAMt(QH0`nL1s1(eKk} z%`y#sE!-Vb{^D76D5iGX?%r$v59H==w>Iee+;2tO_t5z-GIg#rMcbl zZqG$O?&W!00YjLuDzWjLNHH)XOQ+Tb)X6A2xE166Efr%ee-+p3$8s)3K-{T~p;OS}FK7xY z1eF^)YhiqLlewC4fuSU?gt}4LtdN2l-&IYmRzM6jw zX;YM4f9U&Rl>WE$nG0#2Y*8@yXTf0Yq&e-dpt>4IE*}*O{x%ks|i3Eb`c4 zKp(B-2`;2Lz1}r#RHyD+m$FHmMz>xg;zSqUft#?$qr5wbVYysN{3`G+8mD1097f|N z%)aJIEWU%;XE$+pf0W6fDvflvVcqCiGyo^lf4F{;Kd5)+xw(Oa4W5!wG)~xa3%^Y+ zgSY<;-pD(xlTnMCKoo`F{S{N#MTIVHU`ru3TjH#3T#U(Td?*Mq8E=vS9qr7xY$*HR zJ0{JNLR*z|Uc8`ZzH`sLe)?SRYQxBZ7DNEDq!Ns(OzmrslacKhoRlDILIGv7rd&5$ zf46$3A9KiWM;~(X{x)6kT#$K+**z$rsuH?%45N{Q6sOV|CiM8zK*dThPQ*T_wv0N4 z?pjKOnVSkRqilib+KQ;}gid7sjc~n7e^}k=Y zhpvD>*=UT`RaG1SM@)MJs7CO^7dLlXe^8c*{Rjsh_DvhTnM_c+A%z6zAb2@<_i9V4 zFbnmJt(MVFpKt$68IsDW9FMV|9X4N+L+uSjXZn9df4A9Y zZsG^`S(wcGF%wbz7hnCM^q z`-5byU#g8|Udwma(tO+DVi_$SJiN-1*o(sH+%xUIipX0oj*9**T)q@7HTGAF=-cm` z@nZZ0ty5iV+b|S;_peY{iyc_;e+nH1XX%I?H!({b<2Y{tqsTXjm@RqwC=H|keM;J7 z*%)<9rx#zauFg64ocrZ#y{Rp$08(NB$dO7=qH?vZLH2GsU5nugWQ_@+e59+TUiqPQ?+*Rr&1)p01h?HWV&*s>!Nlwq+QfAcjZUCXGJ z68TguHTe!Ip*570fkg16fE5xgT4-4Gmu7sJsDN5OEo4rumn9`gDy+$5>$59;4-eN>$qRTRc z9~z|EvpOI7)bRJJIDO0WhybkMLGa2qegJ09rP@$=eSh#^wjbT86G@s!gI6PLyVKx; zuW4Dth8u`RD;lBwc{Cp6@qFTk>3PU=Q8p()*5;>LIrf!waZzyQf7XX3ayPt!4;QWg zsY@l@D`|iHo98LRVU*>gEKBlf8V#e^?!0;XPd!b7hExT-s;GMZAP?KrjOYu@$mTy- zm-gde)QFfu%_TKC-JZ3)jj(B$O!J5Nc$~-mN!S9uU2vq_cqeEG?SaCeWHqGqfvNG z+QiJX7RqThr%Y$%VFS=bFZ*^dMFUO%0VhxwFn0c58h`H6!8B@n+ ztKbi+sI61rfAxc56u37&W}%H)Fa>%Q$)#JSU6T&4e`I+QASuY&oV*Saj)Eu{-FSYu zpXf;D^;Mt*e$=UDzE@4Wu=;0ASF;T04`m(^1$pW?JB@R+%etZTZ~KGZupfRi?Uz># zx~^&0d4Z=vr{Z~I;3~0tElz^8x9)$m#oM}IjrM5#2CbCa zYTG~%hVS(hTQEq1gfx&+kgAwU&Os0#Q0zNXf3aSTE zK|fzCr=n1FyiE8A3@{@VhN0tF-78}shW!$+#6!=Fx#EJV?VT(+3mxoQYm!J|xUkY{ ze;fvZM+2hJWZ6Uh^7{%WN0~{u^W+dbja^lo5pAf!$Jz>JxDKR*CkD)5{W!=O)w1Je@42i~HH_%=JkWMZ{&@F5R$Af9`7iEfQ-a ze1gV%JK}C7MEPfCpBe4LAV|{ujl%b|e{emsRh7X{3)-}Lj%Rkg{;2+Ltsr0usDW!G z>lpn2D!hT&aD95Y_u#%A8ajdP<+ChLM`**Roei#kVDz!&RWU(XpbpOeJ!-s2??x^7 z7~n!x|4KUuxZx&|beYOEw=(8911l>M)OY+HZh;I+*&!CZ- zJHG&}l;LZeKp4iq`&Zl`pu$R9=olnRLp0Yl%*IS>`bBnJ^o=>t)7_nI!)X8ZUCdHa z*k+_XP>;j+p5MLCqhChVx-yIuf0CREK$cX3C5os`1#)<94-8HVkQGe;k?Xox)|pd2 zCZAJCFU~)u^z0(`c`E2l?6L_cNK`5GbYK{@>{PLz4!RX$e&4a;RxnP*#w#mpAwboFH*cI=W}qz7^(WYgrrw0OQ`1HthC>vuXf9#U z6g?dhzM$z!m(8@>)>dbm1D^d|sY_?}(|+HblJQ+gUfBM}!sNWp^8kLEEFhci6f1{ci*>@a)#K zKO%D;c^(Py_Xvl20S&cHXLgH4O-5%LA4IE9tw_83EV^-UU>>C$iTu4}qrhv`{K}MD z76nsp7Y%UedkZ`vp&tbp<{Yojn6e($HqV9@r(Za3I*&|WvxW}U-U&sw;Hg2eb+8_?(_ zaje|--7mGyy4kpNAJ0MwOAFsdT8EqhDgnYhScsvngvas0*6i}55y&M=uDO)jKmxFdh%pY1ZLcur@ zYd2pqIxuuV zzQ0$$PX!PKe>Wn}EZsd2-aS<-CeN;Red}}+9E@=k;O}!h3nORrPxI*M2^}NhA0ZB= zrW^Tl*WHm1*u9#;StU!8sm=zXc6uj}6>5E$U{*0IOLv}Cx$mLtL(4}{TJ3F+HFw-m z1#1#uF49`}Z)^F1cZcmTng_0S^$B&(yrVx}e`tqQ)wt5vft_a=Qy(wY_9hc2 zjAplHU9tPf2IU6$rnX(3!xDtk)ql&ORimjn!41Rg;LQ@ffNNp}P~?*7-*w&S+NwV~ zz8T)OP;GKvYYPpq@6DXh3w~}-?)!Znq8rued%IB2#vi4UL2KhM5QXph6)F_$910sq zS+JXyf7lJF+t@8`ax)lNo+hG>?3G5PVd;Ng#oa7fSQ>kyi{_v=-_yLgx@p!8AtmsN zDWI-KB{=4|Z9tEQ1D{B?0o^bTG`};O!mNV&oqsQ(91Sl^_HC3s%2Kg73&kxUaIBRr zeL{@xrP!B#KjBoq^;9gBkW6jo^-6G`*k5Z+fA2xQ3aKf)Bgj(ItcUSzQrMX>j-enw z3ALv&MI|`Z$k1LdMsgIjq(XnHpme+UxBsK(Am0YmqeWd;E#MQgI||S!*}k~AUIDt! z{WN)qlIMJx&Yb~08;@!B!YU1ZtNA!I_{W(Qh9a>!yF1Ko1LW%8pgx1ym!20!`EOfa zf4LC)$y8MeKMZJWoph%ihI*>=!(N`p6)=RDZ3{b{BSQ>~sLI4*KpmarIj)7ixZVf% z+&*=kU>VJC^JEzZ)70t2TdL|bSi31lNHc+9z1ax-U(_sG4ID z=Rk?M9~v+}BsWkI-(5lIeBi9N>5+&S_GvQItVniN26-ivO*8K(7>|;Sg&L04-|BrA zN4sKh+br2ET73ze%}Mue4}q1K^>oB6VK>g#W=2Y{^y10uHlx+44HO`6amvUWGjT;poSZ9sY3aIP*ku7A(LU&t_-u zFK3rcw+b#uim7V{O45#slUhljmm=imU&BE_y_4u77}m%_ISD1S%D|4D+7X}0}hp6W%hIz}UT z`$@{B!KV7wEc9kt%ji1OT=n1tCf&O_NtsmqXL*B`X7Xl5)_4hLs5*!wMoPt|?}$#ThsR_=6)*!GQq37WSZHv4+Z0-eaU z*X#MG0eZIP-j1Zh;pp=G?fK|m=4bb~WPf@UJxH-&y=qzT3a z@7tY5{UfvaW~SzUWA`@F3qLLAbIVAs^?D>Dp?APDs#8rqX(mD@Lys70$yPkK_V&tM z6;w?g{wWK?-y?*a$St>yxaAa+3rwe%TqW^}7$fI0dD;l*&U{Ksw31zdRyC>F#qd2j zfq%n#4%`n=6l&SZfs^^IjL20!U7ej@UiM)RDRD2}(CV*-=zbz7WK5a_9xGnsN)TQ= zk$tV{){FltK`pquRCH0{|wqdy-iL<5f zBQa0hX=|G|HmJlffW4+y+&6qsWN~bK-WsZ{3VB2%GTtWN@MkU8Z7V!x`8poJvwxmU zz2$!YFO5#m1EFaDR}NPl?8d{&pS@Q0uqVFVyUsiv;q6%Re=R zncd0UNWH$%t-gQc3I>rqW&D&5jOQVT8i*rmL}5&y z-~iF}Z5&$i5DuRZ6A?1D8ms3eovJ(~gs!#)8ffL&unhxIt9wb1MiPbAI< zj`Oifrx9jUpe_!QIp_s;HGfz#B)3>GK$6-eo^PVA){6CpjxmNGVjE~D8&9o&%M`Jy zig-(x5?wtrTDp3sGuFw;n>BY?bX#6uh*z1tN(^Q-)RRsRy+|SYa^ro!$S4)`TIX#Q z@GzY4m@-DhW+Om9HpABrK{?qs(V?K5{`)f@ZC3 zDArio1<@`r=vr=IZw=6`(92Sc1jjkQW6Lz=Lqk`&w;!TUph4-wwAFMm{j$4 zt@(!{Z(a83zkqxbRDW)BbPubVSp)2bMFQR4$)hq4Xj6NXaeRakd}x~aGLea{zjHi}c-d5EHs=A3rH%lkezs?yZI&8IC9qQ&>*&|d_xu6M?lC5WI5zTduG)G_* z_?Q+@O|yL5Dy?X}DXQ?JT~57daM-9WjmGAtg@~KS*h57!J%0)nDr9dI*9_gkwMoSt zc1?w?;ntQkZhqS9YL|3vfsHz?Q*awkr{D&god8q?Sf}(a+eoi?>?FD@thNwQuH8vO zvvTTG@M0V3O+Gt8*oePQ6hRk?$2*{AWbJ~ciuX<|qph&iuC<z_1$&?+*-lC_hQB3 zD1j{Om*Mzdv`c7prTZGNk=RLx3=U2H#miE-^?#q>bkWh-XEkwa*b+ z6z59}c$AQ_G#&fF0{hw|oh_pP<|$Fj5Gnwb54nfdUxC?Ch8j^mt+l^Q5eDGORWI{U zrYGQXnqsG47)NtxYdaB`dq`PFn*dibqqg(?*UyR0 zOQxiM5PIOiDVVrk%kf6wHyEUpMQf3}+EM1Xtx#tWv*%-Q zqqZ9{&!^OX%5BWuN~4G|I!sy}QPReziB#V(P5b(K{XM^sP)s`@}neRZG*>WA6q+96aP zqTQ!=W&C+UQHV&CMI-qPS`R3!hFK;i%@wezv=y~Esvqs!-Gw`1*Qx~BrnCHd;2s(+ zu5>e5$(u{2zt?Y7;lGno(4(YX_`Oa1G6Rrf5#p3_m?8L}5gjW(=BO)4HWsdE5>K*! zly;KqS2rr%4ae?Kr2368?vnujM0}B?e4L2?G!3{MZdDGdLif4IeU@@$7O5AM?M{ya zJ_iZBD7;GsiSBo&R*h=^-J!_7glNC2O*2hfZA#JT6GVzeo^whyES<@6*f`0I^-w?aItNO>wH5z(mn<=rnL( zbbOp%Pv0@#keVw_o6OCa3ROvP+;B@{*EV$)LU;7SUyBhTQR+$}kxF`u=qCkP%ZNy# zMkDB+m2cb+BAt z^72@xrn)&!3&{PlRXb2)6t51>T!nB{V1cfCqiWVJ;~#MkJP@OndHbepoa=XWN_9%{ zs3X^P)%8|5a$53q0*>d153y=quoakxn~3oW1!i^f?H3l-BeYEIbRc8?&tP>jZ~i6^ zBzY9tEiM6W^SR(->o%K(I<}1gf0s~M0yYaaPf1NNF*Hp{G%%OBvI;PNg-$&S!Y~xv z->-N>2L%TU6^B}cg3z%)pit7}wGE_6cu7DJ|GTX&Zr*ku+}-8sXAhuA8o`9S5LwIE z$A_m-<@*w>SSWZQ3Hv53Lz-%LmuE$)$WKZfi>{r0D>x9B0NO_4aSMMXcml5QX)s#i zn5>N2S@fIvnX(gR(kVKBVE3=SyD>X%gjI$ZGx}u}+GNc7_62W^lF4erFc60CdWt#t zU_%cLq!j9g(v==cFf>O)kfrfLWJzc#HKp%f+XuSCb7_L8|yNode*Mtz#W9Zcn9lZUuZUrnO*)WghEW9SgXKRUVBj(vokj+!{~ zRq}Y_M(t1*%Enlu+1dQo35*oSqR*=DQM#C&z9@E})9gHCPoVPBnUn{z97B-sV=`=i zbmNs&-eI~w7f5!0I9x&UMTN&etflsBY#O*yN(AQ(72{Y_FC45udLaT;|K~3**Pg&L z2njv@j3s`_AKg<;OT$1Az3;CWA%_GkSf~ibR`5{tqCJQgBW1fgNf**h*pF(F{&%za zYO98zB8YpM?7Vq1JMZP>V8;sn{j*)T9`~lQz5yKN&Ojqhd^obo~3w;*5F_+ zgNnQoC{At{sbCOW$&AP(#6{BgWC7F1z-XG%MT+3XA~mQ2I0vc}-IS#jfjc4w|0oiA zUMB1EAlO5HxKmxj7#^$WDQwf*HuBchzy(a=GekewoZn2n>*EWD_<^+MyI0t7N-?!6ZR5&8*~Z0^M}pcB*zGwV{&XUEJ#Dj4KoHO6|ME zYx)v~RO835_bZ@r>|E%>s{B!@wfBp6= z7trg$Uhf^M|EmVvk~g)Fu?oUK42JhSMFxkuDJX(f1Seg@L7WODy-W4L-W|DXQN(w* z)w&5zW=j72`I0PF{_FuXs|yKZ5~3It^LX&bYk zX*9`y_GiB*2`njqv5}?h%sZ#~Ak=Wz*?wfW1GeGo;$jq*wN=qLi=_3@1QVSk*{>~G zNABG?Xx>SC=Qpl!ErV6O(>F0GX9W?~n&n`J+4TcrQ}ZW67j+S-EP zK-f&q?wOM_%wAlonIa@ZCa6XTjMbdkiCrl)NjvNlN#|%3WeAfSH=nwvt76Hz8D^b! zoYB+HIGw4KYJ<8@h$k@y>hzj2Tj&*kc_H9~71CHp9|qThhe>*qb|Haw|4S(L&{-3@ zzZ?F2J9GXOP@d@2fO1p88RSkf%L@riBefWCX`%JZWfsBsyZ;yuafupQqFNG=PKXGo z)^r6eRc*OfCAsn7=rM%e0i5+xNvsVigXa*G?2shMYrU`mm+`Iw7l%q859UsPP|N>e z5cW50>&=^4aLZ;8REB&k$f!XuDDqyf(XHOro-#CAr{#gNUY9>kSgr&Hqoa=b58a?P zBKpvQFgi|w{}At@dTf}r(~0=Eo!BY=cqew6y2pvlEdGoS`&4|Z;fH#$&(v)V8RpbC z?sHi?)5W5$IxLcfb!5E5VigJAfTL`vS}pM&jP$xU*v#o% zj1~fMLzBfb?@OKJr-{ETov#B7@Bx+3QA@)x5C`!0e2NqH&^`zbCW3Veim=DMuVbX? ztqr6}xJ$$${qA@e=1>!WKZ!av6g%!7S5UT;0-oDw8@E^ zPQl8cq+fdK^rO%2L?^xh-CcWE8^@CW-=AX45)0h`hI{WOyFAQdkYk+-f&fl(5927q zs0Fhg%_uV?11I)>{p?#^J&&G8tGnl+?5=Zi0I931>etoPRsB3Tnm^26yqFN%wE|*n zgi+ww(KvdZlkjl2zyHFsW+a?jHZjKU7qh#?{agRZ{(eFxf8YK0iM8{0^YUSSX$2t( z%*%j8(eq{Cco7NqU%Xg^3PdA+LiW{*nuDi#pj+NN4nyaE-n*D<6TWpkD|oI!cw&W- z4$%l;)+v8&ThL(o6y~{g@7O24rzhTZG*c~~vx4J0Feu9gTClG$G_E7dn^?ibAWsqT zCZS>0tMA1hFAVrM5B!MO5t$g%g=a^O?-`WLnr+DIMZK`FvF^d|eXNnyOaB4eMc^6h z(Ss9iy_p|>M^W%Y;4kLk1{U9XW2K*L8fFwMNZ;5_i=X=wXX=n3Ej@Lu`;eAMKA>I9 zI7$ilk7=waUTKtDun+yxK{-qiY|pd5rDcNid6Q07r^9SgQxQDHxR2mO|TXoc(hLn zP`S{mGL5k_sp^b{$IC5_(|TLjDr&Ng7OrdEx#R|{N>xOjW~rdPqbkABfMs%h@Zg7z zP$_{@XC2PwE|lU$f==4|A~)aRgm@A5Tvf?33e{GX$?%gEoH?I}z9=Qa<;}N_&8IFG zb%D-*-6B$Mw3I-p(fIDpcUCL74{2B3;H~Y%pUtdmG6(++Lh?n?A@qBS-YSt09l5q% zNVOc~f4fx>8|q_nf9y$nG@zs0lc@_?CY|ZT9i?ZQz0JfHK)NWDyB4T?{0@A@^N$P5 zrRFx#k;}}JE(Z~$19TcodqrF;az1O}XC_2{%Oy<1Opu;q6c5u<&=eE^fK|z2RH98PHPE& zI7(bXeHqg#q^&$UJ|A3P9-q|1@+Pnxz^EN z0^xM*jqgd6MKnG79eCSvxp5=>5T}|JpOXl7-c*r1wkF*B!PVe@|Ggz9 zX3)MJu9MKV<^&xStB!q8(Q=!H2f=d%UP56}$b`YRvG%{jo=-16yp`K?Z;eZ#mVg4~ zFo|00WrAk{M-PGjXn5q&Fb7XInPd3X8+t(OOpFjKG;kD9jnD@kh!U!&Juw6cS@j^r znPp_dlTy~mhU?@R>sG@o`SJ9%ID7y%8w~oC%Q{>DEqXN$8E9!RouN6J1s#}WL7kj0& zTb+%d`P3)9;&zOwq@5~j$Sw2o{pEN#x*4Az|6*(zyTx`*^xW9Ol%6kt4f<^D_AC8N z`%z}BTH-SYCtNSYp3$k&^IA%i)z^r!e(Ae&P*%$(y&m@2j1@dniyE~i4 zUz-PQd6_OwZWLr%CenX@v@O#6!7mCTJuQ=I_q)D+2;eaXq7?$1*78-SGGF!5bi(n} z@tla{L-wLgRysCwIC@t#MrE_9P@vFLSho`RNlATM;tH2aF*+U%2cPc?>h0 z)1~0)M(>;L-S2+LCRd9&O-YxRpv%U@U);H*pR2X(qQo4(U&3*JiOf+j4#?c4lR>>r zsG+w_tKntHs!8VN=K;AN&n$3A8@<=RZXMn3Z2jlQZ`WTJDe2NE&kuUX_6}YD;6K$2 zX|rgkW^l`eQV4{bt|t-@cCR-u5$OH8q24Dx_U!sP|hZdUQf^?A261qwgMtjF$k6SM7jtp`373%6B2zsnjAA7l8nYFYO@li{A_i zpkEmlz)JweuMNStesHGI8JX7fk12WgP^7E`NE{rr0mYSb|Ih>rq+byj$V-66n>P*7 zxbz=u#;uTloOK@@`;Ve1scD#W;#)2W)wf<02XaQeijaYE65w!jR1b&b*n)n3lu&k? zALY0db$7u%V1mS{9?)K*sk?rHl#11Df|O??Qh%$d`kEP1CRK+S63;}W_+J_-uA3sI zGIg0E@k~UDziy~_jT|WztK%H0z(<6@c2k?zOp-ExbL=ol;+cpP|E8hhZ++h-mZzH~ zrJ`l@-NTUa5~1^6z6;3b0N z&6|dQaOh^yS$5N57R@seM$%0~X9)sT(R?UnXNxMe@*@yr*JZz}{$d4L8kWhDzLc&P|#LK2Y zu;bTuT_jTS?x9FoiH)KKt7wP^U&BhQLyF3O%f_f&(=&bHgHt!=Nyt|aUL~xA!RBGp z@al(vSdsc3%Dj9rarZ#PjD$gEJ0M&H4SZ<6j+H?Y^AjS|xUH#rKk3MP1m5~XKOS^cMXC4rL zo4|-@)034Twr@N1It(Xz?q??zvqIp^fIu^vs%bt9Em0Z+b|nx^GP6(pp;%Jz-mZ`=_>LZeK_5+d56j)YD?k zNV@YntbR@}PBD6|qN-ld1$FrXNvC>2{an}Es-u@5M%oR=Xw)==vNcp=9IE$!S3&!! z>!#gkjHYAV_;$ zf>@LwrRq+}ltrfCGyTYzQnvN{r{n1bZb%`yo3xpmq4j49vV(nfbfdQ`L*ApO9wmZ& zqe~4_7MYS8pku$jlBalHRbL2yMpvzAi#HS$8RqVFDIUgUY}M~CSzdYZ(5?*y>FLSj zh%X=DWQUtulHuLi#qo_;gsJOWQMVFY4UW&m0tCczy9@Dh(j)N{Bjc=JG zOD}zEP2cnyowR2sw@TDj_&5lxXMIVKtZQ`{6HZ%;e$YVKi@X1ZFZBg~VRT)q8*}0G z_3@Ji3e$NQeL*Ny*UBOfPSrd3yMdw~ypYsrSS0IORmOzVbwNLrPDZAr&?$kIga197aC*g0 z5cIa*@OrT>cp3O}5=75`tH6NXbRSw%QWJ|Zc?*~v{n?;gM^@zM+j&OT00cGxk1smx z^|&kG@hyaU(`5OFBkInzB`XCL4|cG&*fV;6R86?0E%g;|Wa+;72D5pj7gHdGDlgoVxpHE#xw#EL+r%H z`plX`8lkz6$12|2yZPtkU_2b1oP9VQ7<6}t!@knYDyu6TUyM$2wT^x0&CRO58vOWS zc*SZB$nOg$Xs5zV*0@$CYsCU5;C&k#0e!3FWBmS)z(kac18-u~(SZ_3EEiXV<(aU?kDnG5d*@fY_AD*_J7_>WEmW%&g>nbHwS7% zl2Epg%AkFf5S%!(3IyTPeyY8~Ge~UqfxbSWuV+T4q-4%ds>wyun7YE{Xg$uF zpZeP5C|5auW1yA)*VnJIhLz3&Xyo+u)vTaz$uQSjRr7(k?%+vtp+2Qr9{m2McH8-H z%!B===)qh+Tm+iydyGb@0Tf>?O}>otKNyYT-?9;@mrCA~3~ee8_0d1m9D&yNlFcwA zqhd(HK0ZkbzbRD5%5(4jRSi50nj7})DweBoidi9lZa6Y>aWj1jH_Q;5MIkq0doCYI z%jRG$-HwP9k}M6c3^pof7;K+jYff>>tCUBzVh$=7qG_s%G9L%Z;aO6Cd0@tA6ms!I zwS8bIY|!{I+a4FLm0`N`C(p{kmj9^xm|GHTWt1!L%U&m)czKW0>2QLE(O8&bPVz%o z%eMl5nUeKYAy*FF6-6Eqy<_H3Uf>D1Sp@d%c8%9jz^}y*N0xRO;DfAbBUe7pDxJ$l zxb}1PrcY^-$6Vvb5%FvWJ&f0ClSxu}0lTO!;imtNX5+!0)E`hxEYOoZ_h-{G4LisU z3Ft;$E!kq4&W_5&^%plZQtyoiWGbDEgB`Gc5)Efsd`X=;p={;X4HW~+!IS#)h-`lH zN%$aQ+qt)PCc~Yx? zdS*&@;*Jh4H6BQ%gOcn`RD_WUXOdP((d?<>k_pCP+Q{g3V<+hJ#T@~%ViUvYGblqD* zr03JC%@UPI@i%f-ZcVH?osNP2jF!I7CL+Z!X?y`*?-}uT9c|>WGI5DZ^fjUz93$DjYyDxE(Y0bP5`)lMH_PLwG8?Hm z0k5&-RjLU`dLw+O9((h)KVDNiv6~- zfTUr+D@g+MO_Nf{=Jq>(Gp18wyO#Q11C%(Xk;pt@r3{58kBcsA^u*QFnZeTWFR^Y7 zV2OV$?`PRuD@b@)Wx#5i`&d@5e8(3{=S6pWrROH5dK(4Q8X@x&?9_8unzJ0v<}MT{ z6qALUIBzPN{>0TBjSyl0s_VO7>jTPFpLx{~*Qo%+UqHn{nLMB1qz zs5m0}xOz63Uzm$x?R2COrKc@hRh{embG_;qMVE#GKoU!R_fY~qrI9xPEmhqE(j~xT zUbkw8^-oq%y&m;byggEVpLM0LO{(b(+@BvD^y41UEN1Za zB{h@~Pz;BzA03T<-FK)IBatW;Vxb1jWLxo4POYHS()9n7V7W%69!j;qMF}gcUMOX1 z7I)k2Nt#=6&hGg{XV+vrN5_aHI|72|X2Fh4c@Sx^6BjE6J4ssUc$Vwt7Urwtow%UZ ztcf;qCkp#b?ec!pg2r^xi|YF&rzxFOlWK_@;?sG=?nXm@2BzL<$Y^AvVceb_3H}zw z+D}?yBZWlhJ6a}p0Dm!)w-prXYtQ*YP8>PjLepu*MDko3i>*eJE99!B2P2Va!G2c8 zO37|3@jfPPEwpx9G4I-Zx0Qx`XVx82K9Y~}A%#kgp3GeBDefEbBfXf25=d~mhaweA zrmEo3J!T|-40UG=Gcv6uJl&=n*bjPuQ36?R3PqH53Cshn$uf50NiRA?5?OSZ?8TQ! zoZeKSx{Jy6@6_+AVD^Y4GK<7Q9SF?ef>f*q$TUIJvDElj-D=jRw64Qqn||asVfFCd zDyX)kzqi~7V4OP|?~9=JJmK8L?AT7Y^!GXU z9*~*kcz}VDv?E`6J3R^s<(JDQ1&QB^RCl)%J*F{@NPwT+_@9W^=$sQjFlHO1)z;~# z1c-irL7?i;itRuX?M4&sKP$}rIgkpG8S$cc0AWC$zh_(ax5~B_j(9~&TUBRpg*(+- zzMrJxdXhdbHA=o@_cT(dZ(`;S@#1Y2#yUwq0Ym$J0VE~27PC6cIj3~WldFMFaIO>9 zd_{#3!1%j5hqG+UwE~mLPbTbUQYcX3!%MuKzScrQf1o4rZL5hGu?J1{&Y#VyM7>aZ zvH4Qn3oV#6O8&Q`5!p|vM+D(r@*|Zs1|YtV)mV@3WfeF*vxmE&tjWX)H=rW9A zlYVKMEL}3C-Z2kjQbo1d&;~~jgS(4Zk>asBRv$eYR4v?^8JSb_v$<}XYqH}63YB?g zkW{!vf7=a(f?w7O)fWLYAy>E`2W0NjZNgxQ?ww_S+UULBxHZk4Ez{iHf&agQU;g&} z$Nt9A;l}OG*7qNe`u*21#HZ+Otk2jySP2K;rgs>d6Jq=HzF0q)q-Ae+KlTfjiCroA z`mZ0+g;PgaHr3PsOf&#MVm!B?Zs4+M{0$m^e}{%3*Ed(=%j47W+2Gwxu@h7}Emj?^ zg#&FfZ2?)#NarXZ1_%emVWkeJ*an_;!8V}y&i$~cPTzR- ze=0U1Y&5VNgpbL*9haiNP*I>CQlm+Fw5&tM{_vy-Y3$wOD;i=!3aDi+9E+j%cIY}2 z{#`x;o3;rp1^Vvn7Ync^ioZ5(f8j-O<$Ytz*sU;Q`emEL0mV8w3RN;Q$}DsG1zSsO ztiPlqq46oZb!HkeuU@z?L=6D(Ik1%!K-3G z45Dc-O;hBQ$Ev$tVT&oR;-*1w2nQ4ci+*{J$qF5Q*wMx%Mpp%144cH}suH45f6)Z1 z>nLoWr6WO3pFbOC0hLt2irX*{z3VG<2-t=!bYV*&ZnkVoX?qEQ?X50G zmM4k9mW4E;S<3!-`6Ll7!U2Tc&`f8dbxw#1{#Ad!OY* zunx3j9BBE~bd@=N?9cpN4fVtQ+nT+3DE240XG()Az6k^+Sep}K^aB2_uOVMfEk2*6 z%83=KHQlR5Agfx~!LKLLi%$-9EDC1?QEOT(FG_wBYJbvHZNuq`A*wH`e>YO+*SI>) zkg?Y_*mSam4g}6{jol177{RgW1uaY73v0dMm@=iXA3#b4gWL_40ROg2Xk z!ywnDN0cy>W6ie^5&fu+e-mxwHQtLxhVgn1s_$&hoUiGB#Hz6GlyoJAH|IvKh9GYz z!rh}sg51L1fwJ}v%*NWy1c&~xGy~6ezQTVQWwaLsXq2F~E7i~*#`5u^){&+mbQjL( zeE{MlU9d4qp~eyLX-Y_%Wj8FJytdr$_V7tFx}okc633Zuqx{4RoV z<-QQ@`}ok`Zu27vwj^tsI6K^RG{XH27Pvb1h={P)`zzvCA`7oBuhKH>H3%aHTI+R z@WFK~vHc3@xT%O7U~7MwjBsg7~%B#tC{Cf9fR~=B;G}5_?icE?L;M zrtz|-t1Y`ycQ*Jt@RM`JnnM_B2Mkj-_ku2xk3ekxprgOggXg&g4=J#alGv!wB(a)q zw_rOQ3-|dFRvrZ{qqU=TboBal-KNosM?i~A^BsDp@dTHY$M*CSXvZDlCqKfkU&o!> zSeoN6x1Yb6e>d~VOg|QaT{8p~E=UY~p`;B@K3EKFDY@jiQ2|OjL%9qEGsNTidcE|S z8$#MZE~ASfIv+$5dPZrgSXfT!d?!Tj@6PWBIZ+8vES^o0sW*iHYe|h%6E68J&OS>W^jTLqSI5y~t zH!l_QH*d;g{vH{Y7ZRq$m241+|0cjo5+HbV{Lipr*?5b!6rNLpoW70qf897tbx%zQ z=&8KKFlSN*Du-hciMVNSO@ortr(sE%A@MC7t)P`{sP_XA_<@YclLfv2Nb5|9^P*vr2L5kx%9f-3IMqN>pH7)Qam0>}(BU2N z@LE_?rK$?lOVy^76b+pJ$FOWmf^ebIPQyEp5~yxG|4E!z{O-S3Tg2k&wdLPHTQ>K+ z+trOdUyvFA?DY@3L6KWb)=)D)bTjS#L`*QLAQ8e$qO2chjh~2Bs!!EFKF(mbhH=|F!2%#&s3V23ykK zv1dm%R@B=@7&9;WqZA6$;YQt(~TXU`0BhTbM?fSGoN z&bp`<6QzrUNH=j&-}f=~GwaaB=?*EIXJu}sULEAmVfL%hmzwrtk}r@|ma-Nk-41W$ zYG*Flqwj@DwiiCy71KETneQ&c@;Ex;mYL07z}6=Duocw+97K-qC2m@k?nN@G$Et}u z?m)HkgH(G^ezy5I;5r26ve*cQP+m5)mw}E78Gjx1a(?tsza(`V!`*~qOozfZ;$3Uk z`WtPJUrWO<6vf~3De|y~4JNEQ@u5zcHlV0jh6sZ}$dX$dNYju%sK~y%NeiRZ-N*C0 z=iGCzZ%u6w62KL+fTzw|$vySo2HYx}M^Z0FB68c0)iC1`${{99%Ko8s zQAGXxgr$65-zU#S&rH}W$?+sTF;-e7#)5{=kx&KAy=*n6w7Xyf_fx5TA2#n2=ACWU z+4{%QOnfcf*-cuDO$N6IFq#uPwiuw8n19f*&jB6KFU?osj^Z{D{-39CCF?GTjkH@` zRq0r$u3e;7*Q)4l)%FAkg~Swtani(L6ZQ7p&oeQQ#D-n9SM`t(6MJU-&3L}aaQj`l zPCYMXkq9$J{9I)`QVUh3EFa$V2A&LeEKkFTk;RY2Zdv^KeNsl>#w>ny^GzIHzkixd z*6Ae7a+b}0l8R+A6a&xG-twH>@zsiD-rpY4pETq9P%%PzKK`o!EnF>@f=6Uk$Vl-- zlEorQqy|w$%8x=J!lgKw^w6Ys2Op}|JP$@@mkc|;ADt(}8k8SqSy&O8i1>;aS+a+& zf5CI*Qvt>_+J48R%AXlc8%vagg5?owIWl{gq6VNgB6E*NNS!jcn0fV`JIc2un!3Bz-M6*7tgKdP9aIay@S>V{T!qvA9Yy;?r2KUVjgW{=FTd zTaf$xUIX6A!*mXZ?gy={+Rs++1T@yxTl7>*{UQ0f>k2-6Rhtaah^&i$;^VHY- zw{S}kQw8DWNB+zA>!c7dk%=PfFin|!d6{_4c4D|@ zpmC`X9{yHGCSKxX#_~d_vz$4w5)bG>tx` z!ZLdH%XtRnG8Sy-{{x%XukSxh#*4S(@kG}?uo&;cFd5~Z%?DZrfn&Amu0Gn85Mw1= zyHc>sSh&69z)tL!mw(B3<6nOLZQRbKEQEMg7Tw`~$%XUg?yipSsfxK!8z;#$Qgo* zY9#%C656IaH+10Qduii_yY0f=ejd1*6i%$$%UH1(HtoA6C~poOEb&kKQNkJ!^B@Mv~wCE5Sv@d@dSdr^dsJS7avE-!kGtQJ+YpT=dm=CJ)dE35T}zQfg3 z-j6~s_J1g=a4{!R*dOB)A;A5Iekk%KE~?w!1J8=v{kWQ5^&a?hiOK)>8TLzD94DXf z(F|u*GEYE;;tAQs@w7rypg3Z^_r$|wu}txT^e$1VT@|gnL(dn=6UcW!S zIC+0^h<4Cu>jiCF7I}rI6`rBZD*uGDv;6dSF@MR^ck%Kx`3+m02qsCMoyBA;JKHbw zD)+Z0*>#*IGd6|Qii;vIJZ&>Pk5_56N2j-1R~f!p(!bAO5g%8nJ@>D_K0kYXe0sKb zc4)O_tHnv49piX@TE!JEn`vXUmh|yi&J>o>NdBCyDB3nyM$Ol8=_9n~@%|N_e)6;( zFn>x}tpz4%;QcsFC-L-?jSFzji3v0~AG)!C7B3EjF@#J+fN-%$ve+gi>v4>;%j(K% zOz{ou6O;OQ@k^YpY{W?eVW$JdvWkmpuOb?FvZ}DV56)&idf4Pl^ZZkMh2z<&HksX# zO8wh7o28Dmu`K~IX*Si$V!p~K-%*k!)qh8w$>D$xBc?Z*%B~j|R3{WfF2ih@bP{u)ZRpg)F zXNR!f;CwJppuvYWqYQsW(Q$s6Ob>6Sm<|nt4Rz=SN=lUFD9y7=GIzOJF7twrYk!D9 zGjFK0CS3^$2!n!wMD5O8LjzIooTOa>&8Rz;U82n?QT4+P`ub2oOcx14zigGJ9ugZp z^^v>VjAFfJkIsOc1o==Qi^|Z^E4qD%P(UZXLI*nP@B)`a9RPx?-z=vyJEm}KO)6qm zM{9q&y9piOZKbM%6Ir$wxLOsNK!050cfA8^me;E>dBp4j0bb&CzP+tjU#ifa; zre)emQBo@BvKtY)c8|efc8PLk&uC#{o>(f;M2ynoM6^Swo(+hW2{Pb$EL{g^O@`8@aR)Jy>ad@4F?JCyeB?7})ibjG_6E|EWd_Jb|>VHQ&Dkx9yOeTxW$&@@& z^NgBnA@W>f6*O}qT$Z%KGxhsPS{77sH|ngJ>TD=zG|8j1=MokJv#t(x0Iap0N}E2C z*6Opg_$!`4%^pgNZd4$&`4iSYX<)y)3z}58x`0*(sW~Kg5HnYPPN*L4<(y2(jzQ11 zo3-Vlyi~*qGk=Bl4wq$oiA5kco!5B_*7zXuYVYof_Y3OYE05*C|Y}wkY}rf zy1uCNAz)7m9Diz2Z+~i5UuO2LlMHv3-)7NTE8>O^T{n8(*-(12w7R0}8aaE2?#R)J zNRv&}F*=rTuvb4B9yg_7h9KH_+Kg=dI}63XZ7XsSSDUn~Rt49h;#kcPK=xCZ}p zIHwxDx__d7h;WAvYeC0!CX%c|wL`(aFb`%Mv7mIrXqejjp z7Yr+GbU+^>_6)uT=m!)*`9?m&VSos&Ab%{zI8Pt>HVRH}vnswpltx1&BY6r_=tHIY zV9bef4$V4N9Vo0XRwpYx_VrQKJh+*FdTDT8w13kY5YpNkRTqQeQYwO1Bv2yHEYfqI zgU;y5Y_|k!|KF0@o?Mje1GOZPtQqZ5n&U+KbJ{)i_+|c_c{I(5ev{jjIcPsM*(AP+ z#=QdAdV(>v^I2We;~(nM%OYm>9iw^W`cz^d7}}Ft3W{r0mms;q^97tNnbj zOrWZR?4tWYJIR-HE4r3KflIOSpGe;$I)4vNas*W)Xh9?#-y~&)@>NwPIUK;YvfozEQYMDQ3kXr&KO?EH$%9q7Issrp@1K-Ho1*bvh}n zA{6-i!Q`J#!O;aBPD_*8^Ir4hX0@!LE1cx8dL5hB%Y;yn61NK?+5oRjU^p9$Q-6jw zj8fP;=CSRfTKjmbJ1{58URkSA@ShW$l>P~oW2T2vXkH!Dkp|62dJ170fi&oZt}?%# zth@D(lYe)b50PAh2U&X%-f7oU09?x$9tV&DFP7DBsk8>WC@6_1GtJXH3y7=D{a0H_ba0L>8h>giG#n<` z#O+{K*Y&?@7mHmVi>a8c)N)^7BxrHTL1&62EQQT-5ck02C`$=r-=4iY22jzm zz?T;bsA~y>AERjRKc4>ZT@)3&QIti|Z$C3A~_)Nddw z{WBzf=bk7N9xgwpll9+?{F;WjDKtJMS(0X{=LD3 zBUaV{b}gu6m}m5ge(OJ*b#D(!o+U&md}jI95Qw9+7%|^NOs}FKCTiTtWq&QG{vrM~sWFCetVtI-R3~6^G5AAL`tDb!6gq$zi4ID@f1gjDS6U}w%|^=t(_kuMza zk#%EBDFY>uEB&HGvh=$vmQ|xA9VW~3sn49T6X0jYqsB1z-ha%^cvK%XL>%;GL#M9s zsOPlf^(sk;=W_L;*)xGRgBafY6irNrVkaR%zeoX&&oO*x9i@ zsKN#8Jni9ip3Jld`Q&e8joKrK6!qyKQr4c3-~%gg6v1F;25e&|<s!^z|V|XZZmoYD|oK^`smQd`f={5}d>mI3gLpkwKVDHv+O()y3 z`(DM)wU@c~Sj{N8cU2oLbFF60uGCr9rBzL6y#WD)m!teO$!7A-FnIvD5j;&9hbD0R zN!Kc;gb7)9orBO$Fko%9ptHM5EMeneVIR|=ywqiT`+u)TCkGdAj^FQ{xdgz46H$EW zNPaPPQ5B<~0O;Qi09j}KeeOp9*#Yhplw7Mh)eFA&rnvHOParxh)8=M*v6Z{N=7 zw+#KAHQU>u;kgRvgqUX3dtc_DWj>bkZe4y*s)5$mANoqeXI|f=1Mdh7P9(8GDXr{S z*b&k`)qfKN{}b+RKl?J;9dC{P^L+e_{O7yDCQlL+KDF9^+5FW)HdEa%I>=TFB63j6 zX}qK1X_S-~38d6Xm#>B1y_pZlyQcAS9oW1)%D@ECyq?N;@-MG9OK68ygOC<~hIG*$yFp|nKo(Gs-x)_yK?a-yjNb$d`Ba5NHU);lsNhFh$Hq|mf%G4v zD5}V=29jBUHr`5_AxHv-%^V-f4P#f)R64bpn}=f1T%n1*Y&a0=B>bl&eY6 zh3XRSTnYj{cVEJLm?ci~*{!zD6kp?%)_+b0p{&oO_x;UI`5eU+`5QbgDvWX&Ad)Qv zaaw6pc%BjAF$t#Xz@gaBZ5oT(se^oK*(nir4&hBSSp_c-lj=&GuR2sv{Ydmt-z345 z7@hOyEP+a%!*Uug?TGACLe)hr^eR3Z!3L|~siufl98X@K@4kHblB=k36l|RDhU0kj+urEEFQVw?FY^)k?|gpFpAq}6J^pUM z$Lwx1o%n_QuNcsy0&QOYx*XMg5SmSAt59xobQF^vR#agPg%Ej5ebG)DPcXepDV12; z+>8Kh;nZJ|va=2b>TXl;c&6eZg@17zfFK35dISFQbeiSUV^~?hFY=K;{XG@)&iX4T zS%|)k%TuNmYjM?-xiWT0m9`7Q87SB;Q*Ogg%Nq&#MML0;uxGkJuz+;u1vNnV}Mq)wD>4LlK57DIv4P)yLw5DzvF zx^cA?bltleKiQHR%d!modnij~Wbb0=fZw%HVKiOkZ+x#$mphW`mVaSYwJ`Ogs6DX_ zLUqnH(|J>}lPkQRFQA0&Bws2L$-|u~YqLutc>^uz<9)_*oAE(Lv8iY{WCgCuSa!9L zJ=WfVDM#?rL&qTA;u$AS865*flQvS)k)D}}wa`PUdS%AJ)M$$r>1pe;FZsCNl7p;~ zFZ|;~ad6|PyB6#?#edon6i2qkY=Rfxn_ARFwRwDZgaxPCF_wqQ$O)kx=QapU^<@%N zOM+qwcM;#^Gk&BOlMOt9(2+lZrM8}R^r_NgFUjBDzQ#o|zcnU)gkuc)R6kKKLwWB` zJATwwZMxd6=OJw>4hT(u2cheUI_(TEA(~kU9BTETfmW>~@qa9tLg-0Lpr5ig7eO1p zl0#-pPc;i1jBVI z64QdHJCdk#c=J+v`>;giHP7%WY}j8=)|{^@z6XeO^GPK&?@7eE(0uJnC_XxxGFZAQ z=B4Ydbo$yi=zkuebYIQIWVozYGN$vz$>z(<%^aqRwikDqYG!=n6&()s@8U77#+$|qtie%xghmR>#pv%hwI9vpLFZ=v^FL&R|rT~i#{cq`AS9+CSr|NHq*tlAN z8{!c~3D48`lBnRd0+M&{502g(9e%ukcf=f7sq6aHjOw;9iZz{gh~Vuvf%2;^f&0~7 z4Gxekrrp&VLkxzQ(?M6mbmriW04Kg8zQ2{5iMa z|F$T$P=N{OqiOya^$cA)@Z#dQCG>O&doPPgWfz3BGtRVlL;Azag_vf47zY{+_ zMkPZ@iF$OCKGYVmR>X7nnw;#&-Yf0m{cvt(E-le9Hx#9j zD1Rq8c2<{`V4E9?)Fr9J-kI!YU(~O<@ut`S1dw#BBQ^=3(T{p{b#-<1zyJO2!`)Y3 zO-HxE;%;;u>|MRQzkPfE{`u_VwR;oXSh{^P(yTXUAMVaZ^F=U!!(ZQi_0|1CA$NB^ zpM{x~@(yMhwH) z{ZsZvXK>6n&dz&-A^-fj*X@hD$ETOi``xR~dDKumyn1nddV&hS6BVBIFE6gb*2rd_ z^ahz5m;L1Baqm^~@+j;x_{nIzk6}i zjqmOM9X;BAwx7#w4WUJ4T7)!=lPxzjuD4u*u0 zRG!S;i?hyA_u^&m45j~jT>8aHr{C|Mr@*rRxA^(@=iQK~&#$s@k`O}vf8$0U^4I_1 zum8?p|C7J|8-M*pmOKcVC4VG6ChYzH7u`M*NbVlVJ0T!D7sC`$#Wya7A@O~mxDnD@ z=jX)r>GS{9JxUfqa8F!b4lcU!eQ>w`Ji(m3JEWIov`nsIhQA?H-CDAes9pddO1Al z%Q}xbXBXXLQ2&oFd&4d$AYvJUej-=0tnSgvQweSU4&U#`eMwxski;C`j(&$fx}Bq! z$p`Uuh}VASJT5GC-MJ9`|FJieFPwCSiL#PULY#GFp)Wd@eTm<&wjZK?4ntuga(#a~ z6#aQ|IXD{jP6y&@kbi)R6pq8ob8&lk{99xLqk@L%Np*grtz5UCF7@&+f_DP&Dmj zr%(MlISVm%F6p;(aUpxwi3oTQ^7xC0K)OE-3E1M<$yvX95`RjQixfwlo^{VV!)Q?G zr5I2`tly7m7BycTCF+(JC*9%8P-Y*+*pa`9swJFcIUy|1!>)DDyT_+T5oM%r9G`|Y zpHmwLS4WrU{hvd!AOR>^f;;q30JqaQ>HOR~3Ay}-%j44_{T6%{@?U~+22uNud*{)u zi|$z`0g7(F-+w#1=v~Amgk1`$<%+~-??q3d6i{=A-|+W;^4Blo?$=Uug_U1)UUZ8Q*BOSa|NJr}yQev2B&Fg-+K6^QTGv)5HhviL zmhFePtb;w%jqcDd+Y4`pnXK?J{R}&1>*2?&Ql+U=iA-T77G4j(>1J4@<33ie>LiXI zU4;!bo#<*iut^9r@gr=Ry%iAql6*-H_CoOx@^i@6;blmgA!QOH5z`RAlY}9551;Fl zp9nXUBzl*DI0_$4ZjyWo@0sB}D}2`q-?d0Mkw_tN624=Rlp+S9?=T-RFR?R8Iwvf{ z3G-6BoiL9R=5fR4Zur~{pS$66H+=4f&t2+CSe{FHNce^MyqEGg3M+q2n9m1%2tXP^ zNFxww1S5@rq!E-fl0F*2N+V!t^ag{J-T+VmRe%+6C3&g?x&SZ1S0@1L2CzVH5R7#K zvQALe3CuddStmg21Zkb5u?{&+z|u`%55MR&h#v?>3=@P4osgjuHgrOVPWaFv-w7)^ zNqC)bqZ4v;!j4X3iB5kbiEd*+pf`9xvGU{VNLnCxV08$l4iE`UGAap|4hV*@OlWmT zm^(l&fzl;V8cb_MY@jxf8|V!L2Z{s95hRE-O(gV^2@0i`2o46p!5}yo1P6oQU=SP( zf`dVDV0%f;Z+G=K8cVP?2-d2lI&PwArdi@m)pp5mhxo}MhH`(1qa0!>$3+wH6huw1 z^oVXktz<#DxyAp#w}4BRa&14zZ%+fv2f_;zozq(Iw7t z34N{(PA68^aY@Wh{O1z?xx|02iA$0I#DosK*Z`2 z{z)MqQD@QXq!8G6nGyr#dn`hw7(6r#Aq*ddIvv)L)=>hZ*?bJ4wwAnwjOQvLIr}3z|@)g3b34$X0T7W8bQG(#F2K|hO)-g&J*wO!!D4|lF`6b*YCdL8gvi4*GHo!U zCGcYjHOQj+_+`s+;-7B(GpflXrnY!|_e26h3%Nz-nHJiHat$Mrw!X!xl;u1?O(C

6GP-U>jjdxLnAue6p$YITdqF2Bq5}ZD?O=yM&F&N#GmDuhBc!H<{ z08D=<^13O&!}1gGv31F00Br(SmL%&mmSC%3aM6(JWLbF4~8j({Gk}~21vn}Arz^un`i&110;Ukuz#62{%gf5zx zbK*7EN0p?(Q8&^OGBX*;2`q!;gQsa3%ve097Gp!xGg||r3SBa#2>n0P)M)%CYRP}V zndL4ezHViR#PtM?7?2kc&9dCZ+zs{t7#)15&X_|!$T$|a{LXEa1BT9e8#3tgfec4=>rt}WczYi0yl^xq0sDU~(ayQ#t zou$aS<`RI=TDuU!wkhR?sf*@fkQD9p#QLo2%RPiVgvG62XUvA zRhy=dTueC1xyhF5usFrw5$=m_~b$kkla0 z)MSa6PefM+P0BFYr#3i5Y_5L|_94lMNj%S1;%T9$rL@hsT^>)BA!|{F?ThBQzAl>Q zK{bQ$p?3H*EA?qW^g&H9Xb@anA7clkk0qMv!;)ZQUV=-=V`1MkVem^d(`4SoSVKS~ z8g*cWfwd3KbSzA&=`mrVb6(Adgkbht~=| z!^I59g)+++IZ~p0(c*;{Qxn$4bz2QZ7-KVZrJHGnEwv<;sZ-J>mC4OCg@xGDW8?7J z1u<#~5n$F5Dqlv|-1N#AR`jWs1Rv1+A#v#n-H$pZUeJX_GvZND3SbLLp$>b@38s83 zu0aH=cmwoK^XI7 zrEow1wK+xHZEFHyES(w1o}^H-1Ydj1)?#r^%s#zUY#s4H#MP-Dc*Pu@q!P)?prB$- zRuRS^FHHbCi*gST$YkBBHDfC8|32U%GewOfe!bx@Te(v!dQQ1x=e7vqgGIs!Wp0aL3d#kuCEkf$4YI0OM0*aGmXsLD z-`qA+YR`5atfrvBGWu9qB~q$>5J+a!ssz6!SzLdhlm%xYP92F-KPila-eyMfNcJv` zPg9RcCdQ^K^_2`V!9CI_4%tQRGb1sS6qP17&lH0XzO8sXL*w-L+RW1$---z_**bew z>mq!bqIKw5wslh8NI~vM*hR{!?;fOxBl=a)#>B&98y#<58>LWGYNIO#8%!yEZlNb6 z1-^g%!q&wDdkVWW#DI>NNsHU(3knpRnQ5ReQ0xl|#C*XL*P?;=Ek3NOr(5VtisE@e zx{a2!0rQ(H8p#SIn5l>m!PmYN5h>w!sPhN7CgwQQMXiS`s4-4r$!F?uNj!qY!p}02 zEsb+Yd`HSWdrzejJNn^9w_}YHJ<}3p+KGQ=(8q~^^iU%8`;0V<8V0#zC!a_BV7p2+ z6eX)0Cx;^>apUX<67QjhdhGqofO{}u^&h|1s{gA?i6;Q-t2~r*0M)$QL|3ti?usPQ z#8p|=Cx?;t-)s`mIQwTyMs*%3S!H{AK3W7xKYut6vU$$4h0&b7j%e6N;*#V!H28l5 zjagnC8e(OHoxG?M_+`Ui4*qN;lH-KUlB^#_i3>R|E$dkC#(D@%?`=YfLn6sxJ3&4X z)Ux8~mt;2+od#am2uNPqy5w&cb{iTjU92w?k-?qN!`O(4v1tkqOOI{qctA576O%hl z*xNm<;6dS|Ax$g*R!S_-6iZqr{PTZ^V6mEIX|7mydpI$v3ymZeFMiR`Mr@r(h`+FK z^Z6wfQIExPOBV@N#~gOKpkKT!Pl$*25!SNo{D%h=BFn@-6ce$^mrB_FmQG9{7$#G; ziQ00R(88=s6CPWo66o_->*IvPJ`$|fi+Ok|foHHmG>Sy$6&*dDkQnC~8|Hsm&I1Xr z@y7|VW1PS(*(RQ}pjJh{;P8w!Xd5~)ytXhQBDL9usfzSd6Ar5|>$5vB$e5-M@Op-C z0o<2~(Ovc+^2H_mAK*`b1wdZ<$5WV5NEBez6pAyPDL^mqns%U`VHykr8IM1o39{g6qGZ13LMBJEH|4N_v;ZR1b4t6oo+m42!iF#vRcp_A0=LjwKcp zMWoI77`QNoTJj#euXum^0o4X;u;$1%^K2fK6F4!^2Pa}yt-%P5@fh^s&@X@(1yDZr zr6wt0OHPLS3-2xPL0j|`ZVhnHrnY#RY_n)CM1~t(66oOggsx)w5&nF>LmdQDh<~&IR02Oh0z2HQ zw8s8p4L(kiQw;iO!cAb!Ywaf6(vC05V zen|||EPhu0dKiCzD-$iRXk!~qLDod`%(dEksia8DUk#gdbpmb8A zE#QuA0PdHst^D$^v|gXu>waNp1H5RkLzkw+Fq+sfn6fpCMjn_y5k~;Nz}R#Go7+kr zGue$zBO@EEFfQe$UnmtDoZ&Emb#xbR7{c~tV#5oJLA z66~wfom`VxF;%Dtb-?c_bstU+#cw2p1)90`jYzT(VZ#p??wxrwWBGx%Bsm}%{DRh< zj^Y+2na0) zHQj%MLI}`l>AR_RU}Fnph?he*?8ybc`6Y-OGf#ktTfBwER3o}a`odOf$T@6~@nhs! zeu7@WIb_igF&{7-CJ>F;4+IlP2|F&qP#hSAvS6vqjXQ_19MSJp1ZaTZCD-KJPuMED zFW=B}1+J4GMxr!5S(ce>NsN8)nk>SsA=iJR^42hrkr1nv75`o>Jg{3U3kFZ@>CHl{ z2Kng;VXHei28mje15yfx%3nq$MXI1K!>G?mRswB?``A1zoPVk1$qNIDrudHU#FwQK z>;mMK>qtzpTUeaMDX4V-+X3$Ii)Q8qEesBbkl;mP|NCKH+yEN3DNK z2|M}1TM7-L7QnZOy&}D62%y0X-a{+{b-DV_t|Yhz$7Np(6}E;!1HPRo87-wM*&UJU z#Xbf2D!~;B(IrT(31pE9LQONMRR(57)M*2Y%J87VY9p_;W7XXj`lmt7FnPoR^MkaB z5V6J#M)MponbHx82?He7li~159n^n$;hGu_2Vd;iWUm=|gZhirbOY<^nSgcJP>wkl z`(T559Y^$w*fGz+wsH>O313OFqtUd?F)aDuvrBX>a!fGUb5$4XtNi58oZ289 zmOGqkV&kzT9%6XHsLnP65(&122Lwx!F3<*`VB4eun(Sf2J}OwCr0m&*UAcd#E^H#h zc4TY@C;l+uoDbUr_ye2h5okmM>%!^)*$ah*I0d0MFcdgoY+not2I8e)hDOC3E(8Ul12hhS!VZ2M6XTa}~Rb7ZQLzqgCU@1Djtdn5q^bu-;BaPBh zz9Gj{cF5q}LqyLG4JST3(`kRwEdV0{iyo08`UHD2+j8|Bl0JU&`6VWHExLk{gmZtjDLfh-_&8DF4xH0W;d z{4j^|g};#t=M~HjLB9x604G19RU6(-yj_T6BXG&sR|&%#Z>WPl4`o4@Ntnr#k95uQ zg-@={n^E9mg@rtXQZXg`be`%bQuu_yLC?p~0(AyD9qcBU?23O?I5D>HBBHH(;#*wD zAy}e+9a>YojOQj72VqFguf{ndJWN~&$QhnLdO@gQQp(ejAvn0tm(MPK;I{@oi$5OU z+LaH248Y?IS`B|h%!tRCTm@od%RgcxCFaGctGbDs z_~*N%j(f=m7Jq->tSEkC-!30$QN{@s?H!0%h_XO%rhdRdH4k_%a{`S~ z7MWnjy}=ugp}8ZH5hgcoyxoysr(g0ekx}wG`$6H!8(#Wy)q95mC)s;;gy~`(EW1Ne zBlo&k#e;wGj+lvcbJp>IZ--UU0}%)i!VB1QF~_&k+TbDPJ}|+#U{s4ShoY&AmdQ%y zAyjFOm~G`XQzOzc4~^(Cww+nPBh0k0j9|)c=S$%DaK5OFrmlycE*|N;BmU5kjp2YM zw&12i7&S3$MjqnAYY}!@`sNJ++$@kKW(kCWyv~1|ZJK9`P8#By5>aLHA9FNJBiw|} zE*c;_`3_wKp+KNHsm6=(`cQ0(2U-ka>lG#Y!r)ufI?*d#8mJE;YUyb)X=T0e5NH#O zXNv6rP&ue+JjEw+g)s*cKLgfBOn=cY>_@=v7;Hp+V{j%-xc0`jjVHEkXJgxTvN507 zcCx|7wr$%sHs;3q@}5(5zCUx%bWPtgRozoP-F-n=C;F}6rQoY2;1cMGC= z)p!?JzZ5M7)m+v~?AohSYFo=Y!m>nq7LZMFhqKg=0S(3$Kbb$yEk&o?F9{uNY0MI{ z1+z*prX_XLD-4BF;DHCOcSp)e-pQN0D}oOy2oC2M;3lVKi_!`<@SEZBp*IcO+XFvZ zu(K#I*|`x+2gud`2kXF?^)7DQh4dIhLC3e-tcY1f`a z#0?SMBn%K;V73g693f3c?*pnJtFfDnm@sJc|2e%JK*tD{ZT1D%5Qx?NBDRqI6e33_ z;@Z*@nJM_LxlNk!Nz4*Uk$-(kDkA@A5*f~o8JF|SwSRC+8TrQq3rHNSw+$?Z)4Hg~ zMH&$_idbz7`Rn{X8WEcX6D}oOJgd+EvmE7vb2A#@A`STIq3cPUkQ%>v7>A|Fo~Il| z)=cvJBBr@tFepz>XFy_TvmU9AE8|8w_fExpC*9vO7=_CD(p4k0P`6Xwmu^ixt#dH%y)HYiun<1yb_fsD? zV&X)Sq_K@b;q%69TGpB(lBJMmB1v9{V=Or?zn@+A?qV%*$?6WpQWxkpCXZfqG+%0> zPP&8^l8LH`8M)t53GTwxK=FoV7H%E!T1>eFQ}!#B56TlY_kV z!6oS;m?g`$C&NA{C$vdFnbkTcwcA8`)~xoew4Hd+!L~PzDDr9rX;Uwq}Z5$ z4wF`o@2dj_T`PhGUK$87=OE4yJ04fc)gP3<8O4K=08FeQA^>yCykc=dzx}EIEcPX@ z?WhGKMFF$?Gx?&h4%x{%G?jJp4|yv$OfEb<8Fl~9e~Z$osd$asTM93Z-`%&956S+j zCa7S}^v=!Y<9vTi#q^U>`Ss2G#i*0(eSL+dWWzXD93gPH>7QXI`)&Dr!IGGacPhF|n9kBFbg@G*CFm&QRX?qA}RElH;gVcW>@lL-p0V~Z7DMo4w!>nngJ-ohE@Av;R1e9OEXqD60 zW!DSXdB$FRr_%6F*U=zoXr zD}C1-hB~qB4w&MJ+YTotjbAtsdJM`FM->LEZ=5d@OkELaD+|+5`mTHR&U#f0M{d;> zOGB5_u1)QmjB{$guGdW|E0Fkk7sntaderRM^&gyS>4bLZu67tw%jxn3?I2tI9*o+= z!a9hqkAV*QF~gk z1LOL1z1E9a*u+_@qH`|*)C6HQgvV$}T{=j+O{Lp5Dora8U3mshdkT+00tJUhB$~&o zwFV-upo5C2E9vW#Mj#JW^=l?+mN+B-7#mekAy8f7Q(3B>JaPHBempw=F_q-@#q)2e z_d7JUt$5X#G1HV#2zGt{AYBm2x$}^sYj!1FCc zwx_QNuaSlxK`DF(Y)5!AsvG+wjarxtkJvZBpC~aMGfOR@v(tfHakRVW8J_@h?n6vV_v2%kSxZ zY@zFX&c%Tv+h^Sy?_!IQs(8!C4Ty(Ha4{tUo4YfOIng!raKW(ZFbpTI5exYvR8ccQ z8Ba#_Cr$iZK`kDPQ!!6JW^yC+&@|~1G8=tv((6as?xQ_UY*DFS6@2sru<9dG&ogeD ze>A$JtsW^cq|-oc^t={9;lAoqR0+EppSnD#dH5uNVu^#>kZH_K)(Z8D7+9&!#=seS z*vFVB;`!A5#vti(_Gk1IVhE%7As%;+Ydo;~Nq))u^g$rpJ2$hqv}(Q5Kyd5r&1e)Ew%^++qnw8cNYCY3%gX)=ZU6N;r?DYT-_8b_ zO+(~O$-6xDvv<+%P7co72oUKYq8@GmlCpx`cq18N>{eFz(7*R*IF6{&B(~XLGzjxT zG_>W6!o!fQ-^1a9K!~pXjAwUYz2jl-cIlDDG@?bhyY-9Sp++*tzd(bZ=+8wrvpFrN zL)QmK4`F)o5SK6CZ2?ta(6HTd&SR2%ChIMbp3i!8^H!Q(fznbQ2%I?h#n&~{CND^H zXDv2XzMU(#U&BB2#izMFQ!-^-!_ThqXr9z+Gk4&^;?0|B+uU+_8fB!Cc5puR*vxNN z<^5rl?YHS@u(1&CwJ_#^+lim^kF#|^vj%0en(de1_EgXiX=U-@ug!z;qes>J%M-_# zSzu9DNpY0n)_$X&I?$Vuy`d5%q_%&O1-mMHzVzA$nliD5Jw4wKL7)qFika6G!tCp^ zx0xIFptfPB6PIS}6)xLnA$1 zYfkhr4R81gU^4ZOgG6Ox$u{EO+*pZ;bEI>3h$^VaB#7~GU7$S9EcNw=v=DesF@!Je zs!_!Xw2?OMdLvD@QcQyc+tNI1$=a`mb=R2IYO}X>qAmmqJhhHb+ep_K|CW$X6S?3P zIoUXt6zcPssBs495dBNntQBiCdDj&%h?bEh1}KPXo3)nY&Q(GeRw-VL#c)<#*{q|c z!lie$IfO>CEg+UXK`BZ{Yh#ROFa&YPlB9zI4|nC1dDW6VU)yo@Ldk;oUu5!^z^~CgZm=T$E1od?wD*nXr7Zqo7A*mZueJ%T zBadgESqj{-xj8`JFX1OQ=OT(xOT`=a^niuxES8O6H$Jw>NG#XE9-rv7n30!{^Jetg zy04hNkJ|J6ONHiKE`k4{UFA84XWHVl0^ORcG5$Ne%7Cj#)GUrqt_o$MTjZc3Zel2= zhT)W!t-F1-oDZiAdBBI362RV{Ov}S9^IYZpD-~Fc^izJCHhzBgioYWK%zBXc+k2E9 zL%kFG7du7B22>la^Y=KS24L}oU|ZZ`(}&Q`m1gV1G~tg*al38$m;+dYYpH8(PpU5e z8RTS5!I6UiVc3^1kU-vTQYrMAA=GeZrvYEk%e%01i5RkE#=f4DqDFpvrRPw0vpQl% z_yS5qF}vZA!rorurC3OW{Ajg-VURJ8$sMv#g%yjW}2G!Sz2(4Bn z$IwG&T*_nit$*w$yd{x#!Issf>Wd4od!>YMkVRP!rqLG<-5qSW%^Q0cB%;#W4@l_& zdM)gYtrx?qwIF&m%m&7*OpFs0Vj|4)rhr@XdMYEEDo(sT?_W+?d^9WrdQ8a8_%u>b>4R^@blGrgHv^}~s>AW*CX zy`9EelPa%bh$%7j7xtKTV*(eUH_?1u9#cZ-uk=yL^XUgmmOOwT-nmjt#xME33Y5Sq zP^+a{;IYnjzJk9JKvpe}K?$&_e5!^}Ab}6C_koc(ncS&ZSNlUeyc1V=U;(oADGVwR zaw4iz*4TvRYDqt2T8w@~U7YM<2c-NryDnc+;&}9?J03hM@1KwAn;L%H&AISbvQEt& zB+1@TT^j(e=vkDP&BfQ~^f*;9=Odf>n>2$%G_6W@>ZeP~T(*Hk2sWS2SSY*5xvKd9 zCSX&S_)$}esR%LO#?;@QIXc?7rlnVITrqa3{*ev5ty$^iIi8+xZnzYs30UO#SxlH_ zT1O+*n}%j5uz_Y5jR|PWnzC^3^C{bv`a_YQ3GjUk8qFf)q9`PPAp29o!3uV+^gC|B&@+4DJTGSf zZzkzv@g5VtE)-|qKW!t9swm6EpEwUwRditG^pLv~qD`zgahOP8i|P=iRj`T=R7pjh zm*chwoZ8V}DhL+{^G@6w!ra#O3a+*&m66qS2(S^4jSGSpns|C0bU?GF@y1Gt_|m(i zQ(Wf4!Mg`9F-$y7o8aH$Z?ucy9BTT~l_=O{pn>J*(Avd?X9N1pg_tww9M-`GWr|wT zW&T=+V;7-aNvi*>n-*qR8x*>A_!8*LR<1uP4$%X9l>zfIRexA5z7f1#1+qHUVqFzW zsrL&;PnN6v(`+RY{=i_bsnf1A_>PQWRji;UTxaGBcxR7t267@n+e9V6=oBDKj)emm zbmUo9WEY!VWH(tc)F9^gL(+EmtO1y{_d+c$P7 zdRvHtroX~1ti)C`6S2a-2s>3+lxSKV9KOc@a zU#K4qAeYaU9GT!zt~qf!AlZ+qhqbe24qjb-CYn<`K$5rdM>j$$*Jf@V5nd7qz#<{k zZ*e>C^;4X{AqVuP%d*Uwk%hT;v{U7VH8N~Dcj2W#jtWx%qr+4Db(>yed$ zG5L4}?{afYz7Ao5?>bt~7lX3Z66sTC`xfr-Anf^}%Mdg6wHn?(tuX~U`t&bPn^1h* zhCH@_^4JS(wr(aLwGxA~f{ zG}X3cc$3S}!J)jH#R8FITcNzVB#0XM$@TYj3n&*J(=hCA*0g&_4~Jp= z2VsDwdw@TOVFE_)8Ud)a0@jt>Kz+$dpX^cNhTK4r1oQ)xj$Z3bxx~f4CgSm73g!(M zpcY~@QV@4ti1K8oWK@s^CkE7vDx%Fc>S6vzcw}E+=0=JpAm1~_wNKCKpK9EUzQM4v zi(3d-7G4yZMKhWme)i?|Hoc%-bHinsLD%WS;irUWlx<3WE5kX^*sfiWh_{mW^M*CCS6TI^%nE1rE!ogFki z4bh27n{I%x8ZQUWoZgJU4IMLq>l;zR+D%XO{_t6Ia608j>M{Rj_+re0M-QVa7`@^N zABnpX>RB0Fda&jjF|ab5OINy~5;?aYg}l7*^t-6~kxkE~O?0o2W8>g)QSaX~@ZaSZ zOf@H+$hwNxoS8P;wr$vkiq_oT#ObTF?f}2KI)@Gc`8HkZ{gExpn;x^<%|h38_nW`-UVUgjunkLNIY-<1mLy%aooL1GnQbCbj{00L#{cffy(N~D zkG~Y9Ceq?|FXmU+?H-2fMY9Fuw~oNoFFymw zw)V!J3V=phlt=mK5`Zp6grQ6Q?2mY7p3PCM&QJ9vF3$XS5yzMy5*pRzoNPIGI&0F_ z&0dwC$ljOqSQReZEuft&8fA55i(VP8I9O(XQ;;}KwmR!&|B$3-4K7v#d7eM({<_g{ zRC%a1SpF*UbCcAf60GFn1VS7|rIq|0kn`ux(L@hy8Io+(L) zUZp!|!lrZ^5mSyrF?NSzVULADrPNO4qYIyTM-9zgd6VJRSwI|B?SbDYXTowW@H~2c zv`5{9R7t_f!dpW?FY#g6K=|3a?Th_rqj*_AtkhW;Gk^xtMTw)kOSdMI_9t~HT{@>`}EG%ZOaEU@TKl z)NE$R4xH-JN(HNyzXnQ1T&?_L3ROJ@kd+CVQvl8%bG$hXUgcereipSvvFQ5cM6qA2-zriIu?6@VAIdLlCP0; zkJ=5@C?9~I(3aWU64%sqM0sEFW$Hp)ww(`OZ20)v1PUT=cgK~Km>E^@Aol#83YvQe zW8cQAznlBU7wDq=BP;D`OK zwqhN*R@u&=n0LDrrr`uNdWs~{S-nyDIC{Sc_Bb~!Qj?;jqylH=^tSfpi z`e1@H4&hw?0rlZthV_K#F%2sG7` zuXe6;#n4}qs#FG$zE$8+f(JH0IeBX3KE_`-32i>T42=K8dZCieW9U6*^P zXb;U)ZHu#5;qwqkMW}Ht8TxgUUNP=jn%5>xLh@&r8U+IxnH%Ziy5(F*u^PVs+~XkL zB4pRj8K-mz43BA1MC>B`v~vgzPqlCULfJhkj464eb2T`jV+epTZbxDpoLo_1hhaJn zgq+4jhLX7KT^nDfkjF#bT?=VQslrsi9VOK3hC5U_=nZJ!U4ywRbCM9zd%ozO+fUm8#q0E4x{rcnb#w8Z zDD^b~IgZQcy7#}FP+YrY&;O0?-qbpLT_7K7v#PjPj!}`cI%gc-$em03a|p)2T22ui zgeEq#oww*8oCyh$_=5C!{^yaw&>|g9F12b0d?7r84Yads!OLv`NnnQ#J7VQ?1OBCb zlgIS%G{Jw7YNVR*znD7m*LAjKX+MFa14=73Yl-N{6WNr)+S$JQ&smWx|Aju$9j2yri4WqU1i zIw&Wu&Zs(MEv8DjY7S>;%v|R}Y*Uz)KER(2_ zxW7HQEW9{njia@~)n=p$w)=fseTjQpU6JjeEMlXShBbxIX%~9Zyd>)K#gUmr&|>QN z>IyVZ%2RiPbO*JGvNttgjzaigwwBa@1+G zx?CG$8nm&&zCWcQq#6|k+WgDqaU?zZ+mxL0zt=}l+j{X?7W%g&b^ux);6iPklW=P3 z4Nw4fYTC1~rR$MEzFM1kI>XI1d%4`{nyF#sU%KT>I-Dw3Y{`H7nO^!L6nNOPRidD@ zkCKd3qr_;Lv6HH-{dHPy(F3ska)p_{!?!5W)w;l)ixUKcQ33pO6z!VH@F&WF0`@=D zk~9@b?Cys8qg6#i&r_|uC{K{lL$Xw_z9jn8F>tvS^wJ5&*Hr)dxG^&=al#0#={IT> z5jwcMkaXQDx?|D>nAVD97x{42)7#v4hQ2d|A=o?A>qHY&n(N!NcGy+>wqR?zkI;?M zhc0f_u}@*jWA`?8 zOEm!4m90Tl{y}d#DOLUmPelRQRzrZ+=Z_H$pwGh>NRi5f^&t~-=Ns+oZjhWg2^fsG zV`qR6ahi~!bJW0}QU1E#)R@I}Q|S9^+KISP<58YUB)`!jWi{8QC07ksppq(SO@@dR z8+D(RWEi4rw_Jl%J*4XhSO3*C8{_dqvF~3&89K)1G;-b^D#G%s0P2`>Y(gz`oGwt` z3RRoF^E!9gRQBpEmWaCU#!zpSq!VlKxmE9=L^gC>gB!-eu-?q%i`{J=-J3`^{M1~ z%1F8b_6C#+eQiZ!3lU@aw2oh0K0CD{H{shn!yfGUl`YnbP(9S7fD+O-gITDZE%4HG zmGySOWM9lq_C!!4D@aTiGZdVx>>*M<+nXxMiPm{Lx=%az=4gZV2ZHmWwW7Tl&NJH6 z6^ps?gZIfUK5tFl@P*)ag9(Lz;DZys*!vqRS6FJz=Jf&L^v5{Tkxa6Kc!sdibG+SX z4+vTj>`Z6tkT|p#VBC?HcJtJ|>bE5))}^nf`-W8F->(O1t_Ls4$5^(gH%B>FM*2B3 zdzECJ{PK<*y^1{Y)niO?YpL>z&V{C2UzDEFK{*x>@xlfzGacSb&VF82C@+daVd=U<;2Ro+;eTJ64^%a!g9Kmq>F?_aRKeFC7*(-dc% zOvq-}kTIdT`Z#aa4g`69_xZ=8V)2RlKy8xQoxxUY$$>JvZq=2>j;}K>0b^SBO~M9@ z-}eG)huPn3Qq7L*w2Gl;w}&a9-vZ1RA?CfBV+ZUN4^VRo2xDIGvh?@u>HhTPdC&R| z7&QGvu)x_3oG?e&$(^()xP7xC{&m`(H1p`xok_{MmXkKYn(^Vwm%Zs!r5bPY_YORG zpG)%UMeoMwolDPkuAFHk!m2ekY2uL!&dz1AM-!^l&1(&oERQAbN3bO_b(&c-)`e?c-zkG1B<3wsyC}=m36u zZWEaU?RAk71!rCbDS$bl{3o%>FO1WPf&*?8Kz&^b;0OK3J&oFe+S%IgsGj2UOGGb? zlCJ0Nx!l=;0xZc>{P**tp`kx31QL!ZJrLM&pM8v94xi5!N)mz)5jQJ0#>s69g69a5 z|I3}O;M`i+UONB8Oa2!2KGpcU)%V9e0|+`XM|AL4Q1?+Jzq@m+Us?qE1 zoaifC@DmF7&iVOFsddL>ni~Hvy*BRCz~xPqxXqpBI@te0KSo&$W2Y52WbjFJUqZ@Z zD;KqgQU9}M+o~Qq(0l*y!%aDspulTxB2|WE+;-&7Ko0T#Lf??$ujQTB{P<5=C!mGn zl8hhLPN>D*v7v|WXFVm=F5OGef9&bFtqG$iU3ApX@7~uPb*!6PvVDRC^*Lp4UAG|F7D)r>=zb4LpG-KA$5A4a3>`=1YLWZpFrT~})%y$?u1QE4bW z!2nSMMVBWt=*z29DkW7iNg%wZ+-ECxNbp7y3rC^1mXH)I%z8=|5ZCuIy9Xztxa$hB z)Znj!NVMM1*Gql9u^d+bC}AkyCk<)*_KpO&?d`?;)E{@kpGg(yl6sw|dTx@arvvAG zyX9}?8t*Q%3UwvHe+`jU*w$U0Gc7aTowo715XoPyqIqAkE%il|Qqe?SSuQ-T>)qX) zaOdP+hu6e4@5!5-fF90XzTD5$WVont`Q)vlNDwC-TlZHAANPuo?=PVmjfIi-`_ak-#GW3$QeO=-#5MzV058srxe~?tn|6pd_)YR zxyuBsLrB`Gg!?QEf2SS3JKb07L5RVCH^&xBg{oDk!&x(0YUs*z}Vm7|$*QI1*reJGZY1vsSzP_TlZDsS|@3D%^0=-Vw) zS;5zuWJUeggY<(`WJ6NnC}>HI0B*@kw|+kP^pXEhtlqk5!xL~XqcrklI3n4@I==7s z(NCX&yZ1B_V4VE>&9-LB1^!Q|U-}Hv{fm)+;N;)1mv^RIqT_oQHX{L|8Ry(x!fh$o<(;0D=0D)D+jyM&pRVMcj` zwJ4d+!7Z|XRG}5RCJyr)Ho^?f;eopmBto&E0KoHvDfv!HJ2h_t{W->xK`F#;7Nm81y~bS{sb08xBqpZ zqPVw038*mFe}VxTJHoIqDCNt5Gv;OxLL(jK2k5gQM?=!g3n^wMoJ5QFHbJ*`BTy_u z45jbVliH+>u9MfhvES6i+8H2J{DAzT-8!D>NV`H>8-i$- z+9YafHnCqCx`>${RLr6w{0eh3bLfO=bp>mvjA}_Qc6ETcoPaT#9^i}wFMqDYDl{i&KG}c8GwN{gvW;G1igfqhnp{THbY1O#=}KK z0QHc`x4;}84NqDS<4ibdrOP}fg2)zFtdv7u3>TXeFJ@$-L^~Bohopj_SUPe!91UhI zQ1Q%D24x8w6GW(~C3;#t`$3-wRE2z)4eZR9cwUr`5=%QWF)ehU3K)e>;(N^lfMAn% zGQHd*Fc;l~WBSO_m9bOM$)XZ`NrKCMl_H zaU$77%b`qc+^eBV>B-l<0pS7XU}Cyo^hcUvPK2&&<=tRLZ5EShqzU{BgCxd>r9e#K z1DnIaCme>@H%G$drGCs0OvvZM0lAk(TKiNYy#7Gu z{s2((6YOG^GThV-=4I_ior#5PKVY>q2tDUS;=Y2sGErc>xC>2N8u-Nsx#(T+9cF&Q=$!n_V(NXeunTRC-$UZm@9rO}I%`BwW9CE%zW;)#&) zmP6%v)It41)z}`B)DK#%27cmx)C2dRwT#`4?enE~>G8wRp2aZeYGtXlmfa?riw3Fl zPvQHBo03?Yz+YK_)&ZiVOKWTdjKvc0f@Ry{iYv>F^US@-_RXaiC1w=*&5?^=i?w1Q z$FFDc|6&`;_Gjl%p*a(sooP4Z41)6a?E7?evFT*_N)h341VRes2(BP^RHid&U z)B2oG_Lb3?mg8h8Y|zLu4B^O*f_18kRF=71FkRUI;sbKrS0lP&u#^}_LTVv7U~Lw~ zw2x(qL{!1P1fAih%s)XImmAmOgpLbcIqgVivqwyk6q#a9XiP^HCrr zyg$#7A@Nb)V&U}QlA|P6b<fn%wD9aPXplgtzl?r;+4@vTJe9GOU!vwJ1W5 zL?#&$bdrV{0qV)&WO8T85kr7z7L}=LMHaIsV z4S)%p(DjGy4+KZ@b+!z55`yJ>I6T74Nx?0&S8|{$HpxaoUH-c-BNcU?Y9ucR(b6Mk z!~EhZSmklb$erf+BEf=Zg19x6I2b=o4jEyqR608Twst(ID~?EsL3)A9c?iJO8lSII=8H+m8rN# z#N{MX`tr3kTth`YDlmW4x*XFvisdQsHDH^9_s%$yX zjfDL*q>&0Yi5y9PT?^M&GC`)&R0|r( zX2gZfbPl$RyP+tHmHDZ-!c#AUl08HlwhPWF?%39Bl&Bvo7#_K^;Fr~f-a9`+{lg>7tbF| z6cTsF;YU%dL!^?T@w1<(BUp^9)B8K|aBwX>&sn4lD5MV>jvT+s_*eH?HKBdyh0r3O zoJ8!?$PNm{T2}Z`YGuw4r)mc@t?(od$x~m1<9iyy9@x5R#Vh_3XL$>m1HpW@(Dg%4 znj*#vgli)ZWZu^ikOfCEZ^|wKIo%x3)ageKsV!r?igE^sYe|(7qB*5#N4+k?{3$DO zUs)PJ_thn9Gs`F22)@pI15F*`U75k!A+DN|ZF5>*r)4>GGMH!rt2+i11~=)_`cVy? zSNV<$8j-5_R}AcSQhwgAH~>`BPhu_A7-2CHG%eRlADZO^p?i_QCxAlQ1fCfH`a9<@ zMh=s3-tHb#KPmBE)SwJXCS`^ID|GE-d_}>9R|I5nQ-LNT0VTKmaO9| zhzh}d{$bn%Ibo^!Z9W#!<)f)t`v)v0!~-7A(2k6P8GTr?w2cqRPEZd8aC$*b2265lSCl5L0)VZV0M$w8_I`;&Qf0Ci_q;e0I}B(F}DHOsn>Qo_pK->+Z3v< zKFrgg@-H$*;A)n%pe{%17~UM15;`#yqq8kUKWf!E952&O94di)A-JNPMN~AxjIo=t zgb2FyI_>*b{0*3!V{?9q{22o4w5*HV-FWzBqulC`*#oMEA!l>z5F-jAvJKLx5o20E zTwAO8dpijc)Uk)df7Dl?oH2xkbJ!cM@gABT2PI<0KpxB|{=Hl?6YEpFdJjEwr?rza zG6NZ(AWz!qEYC<+>qa5Ye8isvWLGF_qU#HjLjh_aI*meknkk?NASeG4|B7rA!v$c3 z!hq7^gYFL4Hw0h~pt5gBnp26E4TjZpWB?VD|0uc%`cL{(K#l5zZrXzkA%^OEC>ggS z$xT9K1HA&3eCV=FPW?^8r{sqhi9ypO4~Js`H|TY>_Wmn|BSj^I&>5`>8u&MmW&w_Y zFc}&zx*$y=n!>RCKZK6BgT38W{@h|r``!c&EQ1iST0Al)@m-#G2g6;L3b7it_#INrNJ2YWm0E$tA^Q2$@5Pak=9tRbM9cM{bAk!SJquY3)`EK~4I)$L>qY1IDTI$HQTlb$ zSab^;>)N>h^5$JD3H2PJ1l7H^TIR0=+l<=i4?PA&9B%t<7WOS1@C&?z^m)nOj(Eb~ z9#{z})Y;Dsi!cHUbqu($6O#*q65RF|8gWzlEoa;D(XwmT#Sme^7ST2}%o%Ul|0JqW zarED3<~_eYNtU#DxZ}&NLlTkVu{JkpwSjT1Q$y zd&jplx0s)t4qk$E7S42_kjqj89+c{1Us_&8Rc+nm&-@sMNXX0cLU@&%#eJ_DjW>QR zO<#w54P_fFgy~4NGKT#E%BTP=7lf#(;$)RoQBW7C#LxIfZ4jJYHpv9F*t7J6pljLC z(hc*%*5L3oF0pY_4@zJgH(j{`83!`AhXHKYISczJp$I-Y?SZS5crTm4gl3Vwdo7L# zo;qm(hQd#DcA68j>~$eC;>t{_APfJR6yiYB&wR>c_tK4US?m2!OwiXppSZh zY9Xx9f0e|l7s6dqQ6Ek#_`DZ#?NPD2n;CIAITPa|G-)KY31gmDG{n&h&^Pv#nbbL^ zkne2_XD1-T0fJkG2Q7;{p~DbDaMaZ)9e}tM4p5Xp-QMd}Cv&d-gp-?RKGaUGPLTRl zn-Ynj0j>cL$&(7C$0sq9?WSB(gnH7PqbL)9ZIh!(o%)Rft6N>$L;%xI)2f;BP?ph- zZH1~;AJM{0f<@PwWUPfU0Ny+*S@1hg926IqMg6$0H;_vXT15=D8^IZKEz_3n?L1XA zg3V1WxCPrQJhSu#-wacstn7jY>Ke`~^0FelBrk8E8DA1ur?xeyE!c#rbE}215G-I` zs~1z>+a6f;<@ofc4*|~(#jAgJ6&o8Ve9uE1q5%?Kc-F79h6-IDd^HG~m&kR&pEH|uNm^p%t>+-ET79cu9c_US~Cn;oVsWM?_ z9gh&+m!19Nz_0`sWLOxRB`4{*-@T9HrkVoHgY?FW@gcKMg*s$}I6CrzB(TZWPY6>D z4vDSp8Meh5vHphx-gv)JjO<=xpYx^5z7a}><@g-XG%$m;{Rp)nKdloVx2B`s1|a}( z4{h%)kX=Xrle~Vw+`+mq#t~09hw;5%cUvwdL!d;KU&@Zo3w3T4f11`$m4khaHPdFa zSW|6fjT7p^(uvVE16%&gLO7ol=}<-W$2BE3CDYL%lfjT(fI2{m;%(A&Aea`F4nC}Z zBfc7#yZS5i54+<)Jt=4M2|pAwEpm4NKR6RlIu)b|_@jKQW<*gx35ZJ&e`=+v6OYgA z&63F~>0#kbByo4&Dhjz{Fw345g3(MFf*`g*9Bd3xid-J|z+>KhF%wglz2hpHU|R3p zK%MZeWx!HfJ8sjFw8Zexm1e&z}GDtD7BW!g#TY6B7$n!&UD z2`uTWR7ZIq(XI&w|$d+~D&3jy^}WH(KI74~KV&v3i)KQO8HZ73r3@C1ZIU?_%_^ z)PhBD2zVH4om9lIC1i1X;Jlgkj)mwzkKH>{NUq>8t4-Ey&YT-JBFv@ycI12Ti2aAg zl6$1E3MOjxvV}P@CbbZqsk&A3AcSK~1G-m!I;K(Y4TkWHNphPPFW;^c<0jtjU6$i= zJ?tGmj>cZNX~EbQIFYiIgWnqru|nhm^zaX>n`x~cggQP($MLOnFLd?#6YA^0_XKvw zsCSmMRYv-x6Emki8+9LwY0y2pU8zJfa(h~eSh_R^L2me$R5Rp{Up&FMrip_eJ;l97J;7Af7h zpq1GJVD)IUiG7N?32CGK6c3L&!C9t>^TaA^l_syt?A00y8B(WbP_Zo$#KeCm~ z<5e#bt@|%OqjVxBClOP$KCE`I!`&>93U{Ap?m*$C>m+do#YSf_jUfdXGM5QgLs2ME z-)c&D61AV`dFZa!vj3YB6n#uq>lD74NP&%TzBV=&RN4*7Rgr?e`-5PlL;z~scU-mob?JE|L( zBJETPuoeNIm}d7AJQgi|xKu2dI&^Aj{s=%L9Og{gvpbAH3_IWzILucv6vGtqkpLWU z2JMhz*YC~yCH6&kn{mhZ*As8BYJz@lg?qW^HJIuq-}N0q0tgi&nZ-q9Tc1qbeuSA4 zwk5|$6=fx#Ea$^o<6h~0eA+Z-+oazL_(495#%crowkD{3p+du4noktMybMh<3}#h49W{Yr+tRc zQ%xjw{1}$UuMF10#|ts+Q^z#8z;&v9MEVPo&Q$vkrUF5dIRpyi@$xzG&@+gb=UNzv zIAN@B(1%c$-L@`BEd;YHZEx)4 z=6}zrTjzc`^W~|Y>Z<9knVR>V>3)AtfxZJ@TJ)S*=GZ+4*lh&;`B!B=M){`$YN(8E zdu!C5v$Z;P9_Ox^f6Sh}ny4XY%LRU93f|t2Y?C0k-vE7U?#eDv-G0P4N(wQZ zoHjP%fl< zZsOC)0IGzdLTqvJ1e^GsHcDuEI4C1o-{i7mauO6b@!>8JsEk10%#C{zf#kVMxD$=h zM=h=v*}Aj10*~Yy#WgFL{MasdfFK66C_y=A{V#E+aiF`(_;Z0yx54-o7DbON{FiJz zf8Sb}u)4^NDJfS@?G`Hyt8AisS2PR3*=4%8P zURz&KI{*UQNTU>u@2@X8&r2wjV3MK9mQ|q{(9zQgD{!om+grh#7#pL&%t6X=cYN#b zXI*s`Q6<(%p}I!mo|b_gx&`a0J#pNHM4l*4e3w)kNY!0g6lQI*iu&wxvw0BO6zuSp zO5yU73I%Y$%@*HOjs` zqfV-zcSFserB|LWNnz>l<{@Ofo#5$}&R7yr7#|rHZzK}76;M+JM6nNHjbHVCM7j+q zdO)MLjwdLdL`ak4fE_wob`2vXKQSgY^uM$4rQa&-X@ZV>YoWtfIaj=CGO8)P8+$hP zoY}Hlv37t4uUE{(XL#brN9_x$2`4DhZn;Sozm)n;2G59)Y?qS##q4i4*kwHds|E(Nk_yt?w`7@QRPVBRJyd9>tJwo78fm7OP8R1{DC6@Tve zE#RKnplWg3i)-##*t}>Dvi>K3yNY zwP-!kwKh1v+E!{@ZF+mU|I(!i9PHS6qjPs_YS#sAxs_Nq*j%+B>LtWf-q1*HyYoZ(yRa2w1d{1z`P9& z=N^i+t@f`kVk<+|ow6unbdE)9_j7l z^q$k{>dJB9yDtQf_kM8*61iHdRWVv1mljSPdxX_SyR34uDtYgI%9B^b`a;f+o`U_` zah|QI2Kx!fljFz>EqeGrS5c6BJMK8xdp(d;$v>OM0kx&Jl(=dM9qhm#jvRe@zZ<>N z7Lm&HrV`>lP{P8e)EgxvYt5sV*F4iq?^4rWxSF$sg`x^ z%=yXEdgcv--a9izkO5+In;k&g3e!xaMT|-1*uMsZ1XWh6q||p@*-{?4x%gogeN*(I zkY8q%Z{-nK8k5=!sFzU@^Bprc#r-E0lW*EfQEpW=@r`)?y*8DP*E*y{C0Vsnu~E?n zTRls4Yz>3P=B?zQU`yrh*fF&Dp>w{l-f*+eIK9NVx)XDCLEX;cvFS}V3} zf%O#H+U?81eP>GB2tGA$+U#<_KKl4~epv3d$=8Lc4HsF_U8FubBQ?zgKW12#gj|W5 ze14A9%$lNNn%j_riLR&XD(7X^!EZp_yg~!O%+WNeVld*&h#(+{R4pgYgr61Fqta-d zM`9G@Y~I<1V5A&v2!QSWh_f7IsDdi{334THU~70btBKn*L|0t@moIBNnOa5CCTQN$ zy0m(tOZ0Qx~pAbYq8NF6Mz*S=zWC!bY^GV!$_XTwzQlB5@s1 zES%4-u7KbalL*b%c8!kT_Ix_p8Pp3s<#&+;X#ye7Z%U}?%kChzh%c{esHqPw4)5|k zLss$S_D&Bg=bcv-RsOLCzeH5tH`PxbUW)ySQ$bwbbxneLr1eFPRtX{Zv57_>J1hn# zVW1tqhyKHHiTWR?g4ZDu+Mf)`Ga;aO{`ab&G+JOPr(r9X#z3Rl{?iyT<)0SI_AfpC zITN>-q}4@1v9}*vF^$MVmTN6Ic2^=GG~E2XtCSCIJ~JeF7>2r{w&hLYRGG!KR&BA& z^4x-+a71}hlhjz9c&LW#VXKCG?M8E9j%1Cem2Vyjo1bwiBYdi^r;&jmEHiMWu9sHsS^LtM`dKc1(r5H~ zcZ~@DC z#BRkMo7vc)IjVz*w%w^4t-vcF@ zjU*4lqiZ$iTG!bVAbWyf4lcgzcw>&|1>)ymBdDd%2w6a16Tka>0{!SRoSMtNUf{dD z`Nfo$6?fG#poem67@hszSr}AGh#JQZM`8bXpa00Lz91}aTz}ye9-pUWXnU8SDjJ>M zPBoDOT6$0dm7u}ghiUymJGYbiKy($v1id!3fOqD!a`yyVH-b8@K3G9Cva#&KZxYlQ zaUcl|Z2{{B0HTWqU_>#7T@Y2tNMMy74|dU3+m%jlo885ee{0@+n@w-Q`18Z;3$Wl{ zQDEQxlAD}k;-5c|hw-LZ|A#&>6nkf3Y2pxb)DTpKkUWlLV?ds6>6@;;s#IKKHm<)0V=NoGR_6Lu z$Y>s%CdBZCda5tK0-#hDTd*hKd%$ympY*x!4OXi&uhS{LkSw=wXay;$g3Q*lWyn@d zSV2#cP{_aPxCK#|)Zi<~Y2_7*P4MI1NN$5qD;5<#+a|tn$T+#F@#A7abVDdj0t9~?;N}Jqw zMJt!sb=>ln%lukciW#5qRrZdpx1($$w9zJ)m9w`5$Dk*fg2@|Lx?RExR9S#h*Ik)w z65Rg>+&j9*>h@g(eK+fWbbsv&Eh%Jn&yr@(YHC|&A`VtFEiC`f{flk8mKPAg9PV4`uS@*u?%*``6$C6kfe1x2aSG-NV;^ zU>{YD`PPtKf&HJf3K}jNiP4Lts0?kbrLzg*fO0-3Nv8@6tA`_}^Bse3)D;>Wx~}oG zrhb#--LpWi5GA(0@&(adKq$tD3u>>zQ&o$JHEB^uS-pQ%#&8Keq@9WP&?ZIs(_K+l zE-LRk6wd)oqKCJwkCfe1wFdE&n?nV(WMhl-Vop`SVCaQE%MaV(G3RYjXL&=J z5z1(V7G}{TwS;=i=-j676}BL%(XIgpu)qJg*V_oppCsP@iizqk`n#7XDwnqKWn?Vv zORJ;^|Gl{}(f4}yZMX8Xe5<4Lq`MPa2XK`WOIw`(3!F6`ssO3s)%x?{$~jqDI4pgC zQhu4`)wh3n9}FyROLJ^JZCv`Yq{9s9E zkoyH~HD`UBMU$~0|ASq~%sklwBhlGT;`QbIzCEydA6G#qnnSQ}DgDo}z$ltv3^#J03$TF#B5i=^YcZ)XAB+asY(9dq1>n#S!Iq1J+7*bQF4kzAaj>x>f)#ZzI$=Dug6*^A z6zwXIw;I54{J`2HUrTB#RiFekA@L%HrCHd#7ob#L?he~n40Ds0#H@laX_b-Peuy}K zQW-{5k*KZ$5$J~OyVj|$5F771HikH~&rWS;FxE?vw<_(8tB`vt>NT|q zRTq9|RxF0mCtVkmA$OJ~14m;SXDNXn7R9t)H~Ah;9*n11F`i~=hsqe{EE#j3bzG+= z*mGmryYSCYc53UHZ!@PXNu3v5362?AXJr8}O=Y+hWk-T9k!st4so%|eea#E9D5POZ z@9S3|OvT=++FaYPs!&haxIn1qn{n?qZRNMd5Ws9DZsQqQOUv{I0g=4cZ}5$+lN;vb zQ*#Uh_fPN4xmCmwmOjL{Bd(x4I@5i9EpAOS=5}9%3(14B(yV`c{ntMK&dtLa!r`+Z z4d$Uji7&mer!R|p$A?FqSwPTeDx{@X!};fWU`;DVLnUh6U4uB3jr46qv}9b5TqlT1 z>hM@NC+V9uQ*2gb0h;;OoVi7)$64l}o+#WC(P&JHgW)h35Jd#_xl&}&gTKttFf&?< zI7e1N@@4!9TyR`pcY#aM_B&G2LMr*8R=1ImZLlBif)Bi<@It9IOEr?`p2XNEwg8_b zRN3XOQ5j40QvRH>$}y4Wjf{U{g9rE6vgR!l|)aE2)*O z=8@{S=KD>B48}Z+fKqmGtu^0Wk^*s}u!YS?CGt)#vq~x&>j$4mIfGRYZmA@iY4kSe z!W7A~L#O=D-Z{~CotQP#EOv;=yY@urJS<3jB@TlA#apYQ9<>9ooSbc}{lgd`@zhg7 zl3DW)PY4eM0Jf*`*U048aL4k`CJjH3XjEaQ7S@&sDb>n+P&0UH(JYl<|Mi&g@F4o< zo6Eul(BQXV6u@3`m)x#6HsPwQrPMh=+5A+=h?igHGGYGW>nK6PAN8Kjy~*xC>2*lQ z@pKv_a`b+;Q!mPAAd7jU{Sks(^K8=BdfnEec_MBA+;na;nVKFDhro`~g-#N+{}>rX z(e={$jXZhbS%wsC(2;Aano@~`YEh-IQi+^aDt~K9#U7`jugq!%4oPL}?ZM)F1oJ>= zdch+2sce#Qx$)#*Y;>zpdIR3ltHaQ-(I;h?LLRfDI96I=Y)uo;p+OFz;8W^a^7|Sc z15FDJ$Ze+LUvT+@ds?JX+fo9i3g#8)tUV>G6p?N z%v}ZV8%uzMN@-=G@}JB*Z{OkW5-QJoblvbQVD82(vSg6-{$+|!QkL*rvd_iv_!T^} z6?mDYzFn>cG5`G3BSbojp!9;}#6l_8*iM;f<8s!p2^;l5@v4N?jl;?$_D<25+`83( zZF#4(4x#U?Cz@rf)EkQ+dD7p`uY3aHw_d;idWhTj@Z)&W=~#y@(SvB2%OiGgW_h&* zP*!ErwBsyKc%#gf1;BJevh-=F#Oc$%RHk)6-`s% z-D4@7P8E4IcjDblYphkk1^ETCs4WMO9|!w8*ye_57vD?%JfH=*d{Hx=ja`wxs2MI4 zVClmrAYYseTx#%%mHjKoZ>h~JRY(k9&)$W5B+mYCKbbWu42L<^o&j=@)Mm6ABnEo& z3O(}iTrMu~r$&^vDkNSE$Xbn}tYg#Q?dP>Or0u!vY@FVs)4BbAOC)c0@H(IqauRd9 zEz|qW`P)AW@^%f=Lx#`$Z{HdqFP@xvvmwT9s>|g-IWNja4Du>I&YKHE2V_f@SU@|I zE-#4WPpzGrgIx1RL`r#JA0k)3uqtfq#!fY*HgXHz9BI)QIT9)9(vGdZ+rW$+&lo(jfLF8M8FZjS8&+>)BcYmEKQrM7vb0Lkv$y9g|HY6 z__V=)b2CE!o11|!=&nOvYNE3IbLhn&8Y(M^(23wI)MYnZ6=IUG5`Qr)S`&)_vd&kX zc*M#jf+L8f9vj4h8tl+7>Iu#8=n{e((s00zoXpPji5DCo_T_T$0!g(B7jvNY} z$3v0T_36(2?XNmZKHCyuwvhi6Z{t+xwN33Cvj_XPf9C=xo$dH?C2RSl+|b+Sy_nQ~ zPIc_4AFF|YzyqW(B`-MWYM_Yfw4TxJrt%qlB=vL;&>9Ok#dXzO_Q=%Lky(*X=RFV(M){nJ}tuC?sN<(x162>w-~Ta_y1%V6Y;oSi4z`_9Ss zOXX6O$4EKy?(=Bi`JtivD(3p?9K9ESFZVdEYI7QHGc#gxMZfeuJ~UFmQ(<*RV3k;< z8O6zerryx#AF6Bd9*jdzsX}8m@=y)+SX~`0(GzjNSK7 zXxm3>LCb;4>Uk5*;SIb0LS~$;Jp2!22CZ7;f;Z=<3ggGk?bPEIu*Cu6n^76V2~d@Q zgb!9y89WCk;7;3SIh>`kja!WrdCgm?x zqvbD6K)mlMQ)Rt+Y}U%mlfTd=J_J}9##(H+s;Sve&Uohyc&7S+H8~)IoNv>~1F}Xp$cUUnwR@ppO`dxBhOF%88IwjfALLkW##7e3OkUA3 z+*}#LmWtAOT$Uxtm0P;)CbWENUhj)@BU zxHMp4BlYxbLRG=rqN33>sjT`~$e7gB0mn?8DcYQE@!-aksj`>b5b-j8uef3&>5qbK z*o_`*ToAr~;@)mzr@FG2j{_pAOweoPGIB5%GdGxJi=gBv6 zWM&-Zw<7G34c>_90(;y=9RF&>h4)pL^&ns^-39mk()s0?K6Z~Xi^Jzpcq+4bmE#2d zTPs{~p7XnxeDj&6k&oRqlxD@ywK>`sO;oIO!unTI6B}=T^!3VAIN?m|x0r-HZ2rk# zOt@9N$*TMY8A6&_d-;NO$&{6OX%>vv7Y}gO6+@%E2k?Tw72j`*BM3`H?rxZtben*5;pL_c(LffDxL2cV3@oe=TJ>VB7OXTXIZ-8_43 zX=(>Hc1i@!)^1F^hqzTuz`{j|4;9dGkvT>T_2m7=m`SPBvjtDqp#K=i~0p|JRiz~s+xJ6h;uq2(MnTB@w%B&gnTPwnKwZwHQe)RE#Tir(z z{Ku9}jwWLjMi``mky5GUAanK=`s8d1s$^Z6Z&RyTQeog}sWp{`Q-)5B%{7pjWLazB zT2AMu1y^zZEG4axSQr28hRn$CWryCx?a0>l#O-@9x!Y0lt>aH18OOLrS5G^}wJWm* z1)Ja@nPQc=!Z$%$gTYQ$)BW2QeV0n^pEg`Zt~iq)dsH#f&^FLbY!i~*zqz*B#&+il8Oq{5Z7 z&$y3)h8e~ZeL=me_~Xf#<;wWHx6&e`tWmu8D(3gGeCbJEa_|=b?RC9{t6^G&4R;C4 zz$!DJ(P#c8=jUaid`3Vl4pNEDf?<7%aqlLVQ!q55?%-k4VF zu90=iq~rM5L7MCF`Yo6&@59%IOqHF1QFj2+VvKDJMVslk$cLt4Ja$hZavJ7<(sXfxJ4Z}0(wo)0NwD~m| zjj`D{d=|#BJ%s8-@N{RN>8214$m)EgW>l=N{_O}laTz|Qu_j!HuYTp4;oSq6ik%kR z*AD-_p23kTAQU=>b&1?k*pl9Eum)MBQ*e59p3!nZzxvzI*Llq-v5qC5E7!C;6VgeMz*3gr?wnwoIDy)BZoIHuM@MC_TXxo*+xxSM|+Qt*_b6F2|d8G2~ zmy2V3dSRo$S8|(ih>K(s8+mAS`c|&!(Xe;84hWzD*yD=MUXXbDRC9XYwPJpUck*+j zm&3JmI$eiswr~$_Y`#vENfLG16SMxoHo)omHm?RnuwsAZw0dnS(?R1bc`{2IQluOd z^RlAlxlgwghyK^leoTlY>!G*|&BSta)6S{OMp1Mr+%`?CuLkMD!RNK*Od>)cSA}Z) zuAnm;xMO}*(0MGcyjp--FO@ed^Q&D+Zo*P6ASh2xH=PZmo0Ux+M2Vb+cWaU13&D;@ z>-pD|j%`5jA3--##XHuNiPle<6sKuWn$;=Rc3ZoZa!1*)S)nK-`;}##vvf#xpm>%T zAf0iB#*&|+ikMt0)|D&jtl|K<1|1svNCm7x<6KJF;F8a!6#Ooj>Y+MWfR_=m5`LvA zYYM;W0d8N}KJjgmFKpLXQA0josl1^-;&8Dx82+N5Ipv8*=VxM45VVGOAXxp*)%6D% zyz~(Zt*7l${9xY}lH3)_j@9$^`n=&y>%{BHnz|Z3nrqyAe|k6>&RJ^#a;|h`>46#V zd&f)>{7Cw%!Ry!OyLY3fXNENIkF)zHmzTGDcV4;owXKq++x;VBNnqNp<_IVb4RoGb z3q7fs8?=1S6Y{=ro8o0^Jp(gA(J4w$;Eu4gO8CR(L-#1iws)ohtdH_h9k`Er@1Yi*bI9gs{){#<02GHRcIXR+!LgpV{KZ(p3I3 zb1Kd)`KzKa=Nnka6_-do*H1uI;|v*4qmz9L*i<{_Pqc?Ru%lMFJd?DMsi?sxI8%KKtE%L_Mhx1RAq%hHhCpp0CnQD< zY4**AaRePf`&z+=#SSSfc)@1G-tFGc#` zj;KK7#s}RGpg(eFuvMT|5lB;XO%@FtpXkpW9ASXdM6roB{${xU8zy$x>-RN9vANC| z|6v2+jsp^b%<7jDu64OLH7@b8`>MdqvH^oeG~S#pJMqmw%5A?m6zACqez2~(*K>h` z*|8DNBd1BsD)|r^$u!4yuXRd#j{Nj8*uTOnjcxN;EG;c`@;dbm+(66;XH)>Qr`_@@ z5q9REX#d8j+XcruJesz+j$Tm81l$65>zSkg;s`0))-d`McNgi^B7K2G?g)>4h39|y zr0yew-{E+iRsEqN>i<0maE=NWaR?^o8cKQj=p!LcEi17gOoPEcF5aGqY!g&S?@Mh^HK^r0|pZ}^8odf62T*FH;QNxm7tTX(~>=L_T}>P95~dSL47 zvg$Y}uhs6oq$DY2XY8HZQuGcBVr$oo^2P&W;Llpgra~s3NT2eQ9APpE!^K_jfA|$r z78p7s_&W~^uKe=5e)$OOv|!!n2J}Xzg|2+zO-JoQ(KkvC)LLMel#ejj$V-YvuDw!5 zczJz{d&cvWdrMip_r80`V6BKxe^W@ z`$P^;6!iRTw+^s3J1=o?=Z_*k*UaKnHv`|9Hik-rCb++w>v)QWS3du82xLQ!rE_}H z8ZZA#U;NeFUbbsAgq~8IQjfG`H#+Hly__q#^=ThdP1_U3BoiiZSA@nc zZ}S|JhcE(m84~g*#KRaqvr8hqpM&{A@QI_QhVhARKD<3U#%#mmD9B<81PX(!2wT5- zD~}LC&!y-eLt_GGITWNCy92sJl0P)}VGdj=^+=e5*v$<5zu$U{q>*KXj@g?@VHT1u z)?&eftWSG`DHPLZ`)ew2w67N}b(9}VbVUwr%ampQARPI<^yls!LKUng$)zS>cjX%y zN^DrSTM?1qdoG*~6kUdS14O2dLbizTPBXGN*#&`?Ypw14+U0bH_<2+T;tz;$-!qjwoAlhM7YsaVqMjQPxfS@xHjaPak0c&F zl*%-`LfL(Q0_aW0lc^9$Zgsokj!Mzg1Qj1{!r0oiN0BSfmPvCJBR2Xb6mNLArB~cF zr}1Pw2OE~5B=kcNLS}tViwP0Q2%qY$h2N_fg4eVj{q0II&4xY!$C01F_%*hhwat4* zxk>@MR%#08o3g2=!eF)+6(Krz@Z9k(Gw9$rM#~{!{?3uUg<}I;IW=r9T5j}K#a8(> ze+%F}?&ws?Rc+9?Mv{gdZRNI(Fhrwsxt1hRKk|$wwOt02FbBsD!=~#JWw;m>&yQ7Y zsUT|myOV?_TYPS8?%qFQYAQp{NI4Wv0JWOybsL^k_p;%F(LROT;y^Vp8bx~4Lj8QN&9fd_bQLGDXu#YMqqrWhe*+Zrz!u%*yuDMy+Mmy4?% zIVd`|GP&Oj&43&O(m1pK?kGqzZ^%3(L<&$cuSNp7+d5+|K8 zVddYY{~sez|M9R51o@*Jgx+yzu;jS4v$esFK`kc2E;qZ)cKa=yr9!i`y9pAX9`>Et zM>|<63skR1W{}xv_quOF!7JK71n>Zm0*1V6ToR~PNQe#CKR5L$KE2mgOSF8Zzv;GO* ze$G&AHu-%6GAppZr_&XnTEUF+W->HovlJDl)$~n?igA`wXmVmoMQb!=iO&aB_63!U zJg#U%h|I3HrZ9o@-;NVamh)-~;;=h|crwQM=Y3khy^S~9k-x|Fy}W{1g5Te)TR4>l zRxF?)>u>I)n2Ms@mbUs4qjBuAQH4d4y~PJ#=wpx2PTV2 zIp~ecgxFLb2vH@!EblLEMvumqR$&ez4d#JG`3P%-tE@EHfgc8SBO(CU7CK#yECja^ zU-tAN@n#WvZF$_UOt~~szt`X@RZ^-uhndG@B_otcf`%KJXj>(=m6bg%0m=mW!lsFF zuLB4e6_zE%+4^^pp{J_&-u-ecnWbIP<>@7>#rteug|z))B4oxU?Ru^*S*A(NH0vZ{ z?UkzNO5NH>f2mOpjSwKOrcPvY_Q9t(c(@Rro?!ftyc$16ugB-(Z2YgWowz4P7q7>A zdw27W^s=!j=gEODo97w>(}$WJ$AnR<*L75jB(dewMWPgKk`^j@tgOS<@e>~8eV}gT4LM>pV&ML!VdTq z2DR4@Q~{4zJ1d_}v$2nc+3bCDHkdR^ybK)TqwCO2;^$@MPD;<;xl`Y%{$=#$Zr*5D z^~F`CyL7cl(i3UoX&Db%nT$t~<2qPUb)x6(FK0{%vvzk2Y7c}%iqV|xINy|k@$_qu z1y={bt>2!Um^pc`YEL>Suhfmo#f8Z!fJqV+B`U%xR{fktP zNWC*DX{$8#<14lGJ9*Ll244>o^Aaj5TVeLaStn+EWTUrbwZkvE=>m?MfYn~Bofi?YwZ zWMnM=O?|P(+n0@sh9$6nRG8*1$#rUTJuxe|M<4UBVk%K64VUmO2^Ma>8=Fp5JLh5IK|Zs@^rsK`?-RWFxCo1pN~H~#rKx_Uq)<~bM0zHR7rR!oH^k7V}w zL&cqQPhH*-Oy4%gY-~-2Mo&1P1^dN~`Df7qtIna^7JLHKx0szr3t)!qCvXKp@xil> z^HLZ2rK$BvR1wGotLCZEYkPw~VbHB?V*@Fk!qsujY_=^1^DJ6dcNqn+Pbv252I%DW z(D$(lx3Zjhw}tI-o2^RSu_QKg!tQ`D+{G|FG*O;YJ=Xb4^XaOd!HX)M7TW!jR3w>S! zB|cphTTA&*l4v|-*k)hZtI2zlpR9(A)0Dm{bg>7aeoQ*QZ=UkqfhPlaK~(BeuS^67 ziVNxB3b!uKPlRE)y?rG|+=Y{}Cf(N{ zk*hGYq`$VXXx}`pM$q_s?40air+)GVvNAV%z!9JJwmIi65&NK?(vsg9AbAZn7+EDm zf$CU0<+sNQCl!J;>klNp+5>w+n4-V;eVLxG?{|*&>t<%`R-=sQmxUTu78bgb&;*?n z43-);&wlMvm7Q3-o#PsAKy8pSs<0FZkmAb7XtIa-w1y1?yH%cgK2BNJ%Wc4iPdB1u zh(%7xkY>@!?#EdOlfoX330Lh9I zkOE^w3ch+qb5b{k#iLOMS3^z=fQ-i*P|7oInBExNAekVUC3?Ryb<0ykg3aoWGrs9& z`{jn%eJ!cNkYy@Q=MQN8U^O@*e7x1jtGp!C#rb>4@nBMkzp=QkT#9~sCaFieSTR(? z4D0?LU^8ZS`NMT(SQc_PSg~DN+6I&q5}A{#!cK(Jo2Fy&@6M4}BU$5=VszZUD}9L; zZ_yU!JF~N0K!f_X0A~+q*^+mHf~j^eh!W>gmY=@xwz#K6x(0AX0o#wt6gL$5gJMVx z8)V!m95T+#-4%jJPU4mPnCO->72>9&3Yo>m6G}A9ntZ{yLCxzPEGtgNs-FQa@cpXdTMBK}aB)HE*^oXKAG0?Mg4 zley4eeN2X$12C;CnVt|l-es6<0;b^tMNV{Mani-yZlHW*?NqSc_g{HfA_W>ug#@eA1-V2`+Q1? zte8$`TX9_3subU@S~{+6ST+SZ@Ne>eO>^H){Ca-qQb)~BF-ZU6k0efNUQTAIlN+^W zu+La8tO3NK8aV3Fl^nb!*UZvmnJ!&SV_E3LdPe4p1qn00L{t0V-k2GW)=z}*65Vh! zEu@mD8JICtXkZ4g=N<9k zrvyDQrJ3ja+5?qn_tTGr7Y>jkytIxC7JEAUyFzzY#uBpJ$ealm@*aAL*xC*%mOxd> zg8go){bg1UwH66-Vhq4kIm}KLe-V=)H@NRxc zU*1)v+}VZ1zPBSxNN^}6Cb`QRJ8e3Myp5I^X&rkTYEgISL*`DFv9*N7^n?4%#5kfC z>52`Tz&CJjONj)*$YmDm6tEP9)V|}V{{>>A>^K=4iOgB=3Fxqo{@NCu<-CR(Fdc8K zle#1Fmi; z(y{uABHl|i%Mi#?>L3-Z;FVCnu?6s?&t@Cxlab6U4t^$G&A&n+41RWzkGfimK!2HF z=sUGEd>thj7WeWRsxcZ8-~q%*xoMIMO2JHb8-EOq1M7*f1U*aGsJlMKT2@?Qo|iup ze$TM$ax23Ukwm!1Xx(~Ee-cEpwv$9e{;6;DcC*kD!Dp<6854&VO-y9iD-;f&(UTeb z<@%>eFj*>$FaP4r_`TteaFH76B#`@;Mk(=^dI1wjkAk?9qjoC)1(Fuqc5@+uza;E~ zE$*-Y`R~CEqAuBC0imX|1^xrP=@m9%p|eKpKU3~8O~q(O2h>B3`#g_dogdy^@!m5< z>^-1yiy@dw;XNhP#nz+J$Hta}AU%J<-ETKQjvqjKVZT4QaBbmSHu;i-t}Lhk zWP8#I#n&dTU#@iJp|NGsI6zwo>z(GprKR~qyr+q4R(4g9!?YZCYuJj2*r(Hy&f~^K z#g?ZoDE_2b@XWBD22hiAkKd)DW0%j5>T{$P6-}w{Qqi&Dtkzgqwam&`rQkM4gT&M) zGP=uenp@X#25f=wMW9+YAaWs^wyt|kr8ylLioqY{5wPpOrh+D@1HwF9_4!9g>Mf+y zpuMpAgv}rtE!T$F)71e*K9_z@i!bNfhiQzNp+eGF@qV9h?m8*QH@Hk`e!p<{=%L!rihtpIfIWwh4sf>)2}|{1Z{!tjw3)t$^*GP zn>z5!6_55d(c}dkz$=bb;f8r^X(VS>OzNe`PU4k|v9PJk>>#mH5-Bd5uMVrP`p}J3 zg8_}s(z`8(F z=6ImjA612|R6trINiIdOTtNa6ZAfXWAs*)kSFgygu-0E&fIrg*$!KY``l(fV=L4Yz zYJO^hTSmv3ZU;{%uIABV3CnA_eBdzaGe{fccI~VtSox|ySa`7o(i3TfyCo(ArA!qu zqeXZW)dn4t_W3XN0a!}v^STA(VpP5Y%fxl4ap6McyL{sgR6r6X<23=P0OLAemdcjgW}Heco^B^w75aAZtz}Hs1** zSPgIB7ADjk;#?BwO!M>0*kp@BFY^p9{JWP*<>fHAEQrD zVMLs~Q&gpey`99PyZ9X=#EjBrC!qME~%JI=WA-W&P-MjD{*YX;=O@cOJsg&u$aF*)70w z0(iMrZ?KqfP6|pK%h9OF&*(VKV+TRphwW0ciCq;%`k1O&7NtmC%_L~2qWUS&7IG|0 z_|wuH4O%Oi5v+2zp=#qkxD>LdtKsYsLp&YvKD2)`&Es&zV`ZfyE$Fp&Vb$-911@an zdqH*WU<=Zd`(NB9?;~XQ<5vFjj$;Sh3&1uo@YNG6f*i76HjL}Rk_+o5|7fphABtPc`9)IYY& zRKEV&w}qDyk$(h z;?+^Hh24$2*a5-v{V|tGxkr4AhO&3xhkveVsm>#4JKHv)LeNekoW&k0S{dAIRmpWF zIT+9+m3P@J&oQ3ALQ#616^N)&R7Mh7;rKq!_Ac(^!hx|W#bsF#39{l&q95|Q60G+5 zc0ce98Xrofn&Yovu%C<}L1Fjo^nsr}jdWNj8m}L+l*1+j_z*;fABan;s(t-CyS4^B z%{4|>!=ea@H{uDdXtE>ZIz&u#gt z6w{Tga?HP42hdQJC>WW;`crSC8-uNh=%6ctVT_7iYd0K`Qa3&*epuIeH36(ikqMw5 z>9$DEf>I!2;6-c{*vL9|bG9JLAk-|(Qg>=LmeJVErjnz=r+8245^YuHWVY?b3CC3s z=(dC!v|ux|67y<4Ul;+=)*>D$$%g|e#ot|#CMshK?#FwXd!@zU(S)V=0ve7qcJUx7 z9n>V8w*IMp@x|p;#($#OmjSHcF;N+AM}GsDRAnDV#IV>T#3*(mpU46{h|IAucLk8J z_mM&p1V#!O?1RDqD;a_5q~T!ocSHx3L;TVnh40NJosSSkDDHChSFp<K$ znC)^e`qfC2u{5h3N0@O%HQ8%uDzHhTTur%3M>+*pmRz4) zXi6fjs6u+_Hc8CH8U#8!%h7dTDzVu0PVHX`~Duj_sSz^5e-o zM-83t_rJ~JhV}l~#4vcdRm(e^>#yCQSF zK_a|rG?CGt0`=H$g>q%nk)C@NX?5nCw0B+qV0Y3SKHR3mW@j8;KHo{`-us8hWE2k} zi!zi>Q1~`jCXx)qrf)w_K>LY1AiOg}weA@}W7($>WB?8fTYVLsKR%%OsU=JNuL4q- z*sg^joTQ=l(T!xeBtn!%<_&JSTg69Jqa?5!Fm9JwJv=#&5zc>f6dlM{Xd>|H4To07 ziq|Ukf(Wx^8Vp%rhxGo4qF{z;OAMv@%dXbLZ0x>t;&;LUGJJGusEa1GfNH^YmUCWcuM;FRlmuzmcoo&YrQIM1jo_*CH3513IV^HdxqE?bNp z>zxM1JD8lkQ@@%$dRj+8yc8)^#A_DBYc3wE;_IGaba8J*8D_4*k~>@#4$auj6@CJa>5~j@Aiv*v#-k3ezo}&<|mLXLdm!L20L}LC%Z` z4FJUUc3eK!jFR$=9f)3M&FW33N%_faerYbgG+F;Fg0QquE0e2?dYdaLKyv3K^)4%y z#l`WM>-7bzSX$q1RwUB!63Bag5_dCd@Va@ZuzFda^0;`=0zhsk6XGer>!rYqsOS7g z5%x>UtIK~lWWBF%M_y+`@M7EL0QXI*eE@KwZX>t%73lsC0A@g$zn)*Qpa?q>pdwvW zDKu2Ugf_b1(BQPH5)>JGL#+Bu>oo`B^4~kVep|od1d#4Sqmzzoo_*$-@$Ag3fBnth z_??c44O=G|$pIynL09y}$HCyNciwSz2M4}xV6^%pbRNRTOYhnE#l+^9v!6}jh3ylrYF#FUkG!7ah+U$ zJYuTBk(7n7r`D>%e{{s-gboG+K=_QP42wPJ6%EJ6Phpdvx3?_{1dJq0dC=M;ST{Ct z9Juzo@PT=#vRWedkRG7!zxbuz?%~p9Uk=eJ2f}|+9~I1S^pkFfI1AG&LvPDC7AGE$ z0mLKPRApRnilHkEZV|Qv%;=VD9sX*6PsriTjBsLiAY|xfJ}X!Sh7NUIjtT1+8CqJ~ z`ePtP_F2roe}^dGZ#SN4tu0KlU+P#gZ9=YHGuFg@S#4gi#M+J^0kU|{vy|^IJ1LGg z@#D6??tP0u)^FGYcrOY3dpAweG;6b`GK#RFZ3N$@H3y*a>@1;otO)jhZ5V50 zs5OVjX~j9NX%F!MsyJ^A1+q|{)9%Xi!^nDVRwxsQ+*FlgtqDP&*U3G6N(hQ>WlrRa z37;jBrcu?bqzKX250c`K1{V!=Znrk@e|c{#@6D&^2RSd9V|!Gq_}CN!kPLk3@tR>s zMn|VG)oJ*disMve80dz0-w4n5_Wm zu8H_z2u>x@NNE;@__A2`4qJ?#aWCbKx-`VYBZ|iR%o-0SN28;iN`7>`>i2J^SL5sP zXtuhYUrxqK>C7{mi+gtP3rMNT0=aQp_9Sb z$og932z>8JZxo}XWbhqDEscdEH`20MwNyPEo!t=^`wZ9pzV^@UXf;-q$^2@>+PWkz zfY0w|T}@S`OwCu{$3Gi?{W%}c1nPLVZoo!eW{zLZ!h52 zrjC+P2wBFyi%Hg)F6r$40jZK+XX4Pz)vxOGZ#9cbywE=2MMiZxyBSV0!sz?{eAjbT z(Z*9jVzRP7r!rNcps8BMnXLTKiIBc1YUehpeIs@dk6;@;7*a}qtcQ?7MT7y5(23<@ zsmE@q)gbJe5u_#zY?7~vLYK4WE?0MnJ#p^qf`J@r6d4pT=~P#Y zyhSJIm6_V!7pB^O=*@MSVwvUGrtg*JS{`~>M;H7SV&fQHN(W(7pM@^994w6J@$ioP zIHBQo5nTk}@9O!yYeNq3V1nZ)x&jf{o@kA3L0s8MQCU85#G9l@T6*9GizjDIhdVNy z+mpn4+xZWjl21zmF%ZS?`4n^LA$t%kR0P*Qs8Bpf58|bNElW0;ZG&mDBok?oes{BN zt-4)HG1r;*d+*Ke^<6!$8B-{Y@CZDR*OCfa)fjI2SCUq5w4EUh_sMt$S0KC>tCo>Rir()1T2;EqC05Sk zix=;hj>tDy=-Ed0SC2h6br?_cw!MwU9CJjQN;i6ce%dG9ra1_6c+Rdff2Y$G@Ro>g z$=MHVXV3Ap!Q0K>{k60{R(s7p0i}{bYXUJ4h41+lQxM#R3Kc9pY;Cc<^i({QUR;rE zcGeADlaNeADgO7yU8}B0vF#iullR^?$^D}#4P!Zqid%%pk(GjGv^MC5{WxKYFVGn- z5N0obev$e4lU|9t9P>f{Hs?2kbX=M-w+?Oks&jmoPLj3>W8NVYUI~&~0k@W~XGWW( z-51&`YI+yR|6+8PWRwLYE`muR6|W$0ItO766+LUEFa%Na-7w&aP~{HNzgVzO2BD0V zOHK$KM_hcs5GK>4Iq+E}#Q{FULR);Ze2GDSGOBk39TkLKTwiGPw$-6hy57U7;^wSw zAVa&&7hQ(Yc%E9y0-`Hi7+Oci?s0rHQ%Bog4u?o13ZEzQgi+Vj`|V!0f=|-=x!ZEk zgZ?y5_L7^k%#&%LuAP1YuQ06g-{9%~v$m6dJ8#$*)fsJT<2LwveuWOg>OcxRxG_k7 z*On}_yMtZYwdr77j-c2|B5-UYDSct>f1e~M7^Ge zTptny9LflG*@C@9h@O8Oob>{@MKppg0*lYP?Q*yNJ$!b5^^o`J<1Zfk`P2M%6Wu~W z5t&az5B-fPW+6H2^>(xY$`v6Y`3wVp&qo}m5z3S^GzkNSo>@~2&Q}Z2`PFmOm>B^t zIBE+&zux)&%U?U_;}u3;8}xg&Z6kSNk@1q77P=ghTbfcJn7BhU^dAucT$d>DD46d< zvG;Ee@J~cShFpd`&<}JI70x1pIGsmyL+~00&=-7A1B#%?=RPOirVe*YAG=_GwF_K^ z!vHK6ZWwR|b}n=3+1C9G^pXB_4gzk9A%KLy7tjwQL7wuzzkMIbH^<_MPoHftJ-yJx z6WHjfiQY0CC;$G-%Z4O$8RoMM37>GVb_Rp9B7asDb550P-%hL$C*K7x^A+?dGHB`s z$&u0z5(?ZX34u4O>DGwp>KK53Q9A_|tU?gmk-%b{Djt?-6%sTfkh?!cPGbB(NKtR~ z(+kQVkwVDS=x8=bxDh^8^?t+&5uvmO&MUxT-ioZ@6>#JMz&sXU;G%HVFo`PgzzL?JPZB*+S_f)D5Cil3yuScS?# zh}5DIj;u}c9m3_D0;w|DY>LI($VXcqa#FoN^|1)P6?b7PL+NQ1GZ~30M)K%m#)$L< z8Z%ZvwJA=uDmzjhuQ`~NrQ7$(@^wj3iVXZON)EunO=uZV3z54^sDeQAlwfzt{pSHi(`#=PHqQmX$Un(s)Nw~ExJEELMAo5HVf{< zH7(=go#!Yp28c+)BhTarCEeB`*Jh=QR>X1x}tO)SLDgf^nNy; z&N@%6S&wR&SjESP2LY=BLi{d|2yt2&5)!@6h&Cpm2P2Wg#pX^F)$F;9n|w2p!6yQh zp-Dju=qjO1(x!lRAr+e%i9-!KPATy&4e^Eo1@>{wRJ1OChu{K1k28@BcFAKEC8@a# zv2w^$nBld&nzZ49$rRh;eQ{Zg#}G|-+$EMN8G;JRDyEDG61a`Ch5TtuSn}V>5k!M%JaWbFIV6dUN-6{O6!X9&=B4 z$j!1gqh=JjkM7lAHn4Ek7#f$#br#gRt3xCmza0hH(Fuk4>rIJlc12GVW@A(x|D0UYtSg3edtEd-G(t~($ zOUY)ZZE%}}WKt~B|8BP3(%p5DqB&-NKHle@ncI7_GK}RY3T_c1M^*}&)7GGyjN*hT zzD8%bK$t)Kb>^3k`cvHGn2$%-IlmgG)0LTW>(HhzI>$HZBx##4=G~bk$@!^O_lGQC zazP1ONW}{X?9M@%@T8SOK~gQNRKQO{l{-lPBEY^FglDYWa6;%i;^G4)@IFg_ngL^R zBei$cx6cYGVBu9j(F!tLXp66wZ!joD+*-bcz6yFS-WMEX%Galrbi=#0P%U(n3Q^^Y z;t=0;>Y^gFrLE{Z_Xnmnl3YO4!?mGpRHuvMTF#!YEDk}W2MSk|dBSL5!c{36TsDlo zr$T#0&2}(^(JVgM-8BH(=6jQWgMGNTXb)z1x9mcQVG?R8$nK2u991$WPsg7ce8;}p zeN?#2vd4bpUA7w&n?c3?+rA477xwRc|GcxBaQV{x0nd##%?%#WcI+FSQ%!5aFc`k) zSLEQK9tIN}13Nd|nCvh%QSl^{G)39%RXVV`vYg2sF#LnjAKkfQ|D-3T8Dk9h19bxgu)U*3rDB_5hh=R zhLu}`z!3y(WKtp6C#F5RtjgJeAHO`eCN-s?eg{o5SZ&-LbEG>%cY3H958L?Qjus^71V+ejBU{0rW3eMZ$=}l#!=@}sj|)b&&rzMHHsM*FS+@FWaRC090*dsdh*2rA_NI+c39v*UQv zq&GcJ>VoaIaV}FQ^tLQ?b64kAJ7-oKn;%y9q3!~IIvUQoVH_=s9XwqO_zDJ(xYhV4 z5+>OB=X6r*EXd6M6xW)_gIwuU@r4Kv4;42XIG(oi@R>*!$2vSuG|=Q66kn$DlieXByYcd9pBrygqCA9iVQhFtHA_j+#~ z!em;1n>Xnz(^|kgaP^ZX{0F@{dQZCd&CIAOjThq;y^yhr0x=MV`#i-I7Hg-la>bsA zR#svmS1rhFGOK}X5@r%n4&VKvHdh>+SUBat|9$_==OP}XQiilcCa5H_)oGtDkz_s{ zH_GEc5>XTE*LmpjVHM8$!;q<`GlP@5-5%qA7FmcJr3yp@Ho?%B6`KMty8=X=zz)&T zKt2hy|AE?H0QIe)Ow66L8v5*YvcW?~ePG%#o~R@$WX21Oe96i99(crV!;~_6@Y%WM zzP$cPEY*l_;_A7658I0}N2U0?WZ0L>UVYV7{Q!lIK?=e!5JmTMiY#2zorQ{vDuPgd z=&}bWlr))|K$;Ab1QhY^wz+_R^A`W{`PVxc0???OWE53QY*m`ln=sz$V+&rc7)dG= zQ=iv4KOfl5;_%N=vzUV812;R9j|<=I&!mh4rs!3$H` zB39$S@v(T~fIGHZU-$v-J!^B@wzA)U^DCH4rjjRiPtrDRuTwiC%W|u!Un9wBJC?78 zmLQuAMY1H7#HY=FzjzXF@aguKzXL%Yd z^F{uUfb8Ja&YLHZzX4g|FM+rCX}h`I-W|oCmfx+w>YG=uSN_Xy=9l-$rJrVhAbs=X z$u=ton~$R$q>&%akAwAk6oSp0n)NQzAjhMZXqusk zm0ms^oSrUDf11M5uk_O6(PVT&i@(;3k0yiR=y-8HI2%ELZ*+ingNXw4S_c}P4+odi z(J?IjmXs!GoP%W!R^Ia@1xv63(Gr~b352+wHyHEzW&Ck}pYZkI(7S$rx$C{U+4bt7 z%0C7fIFEA?(W?fS;J}WfWd~S}L3=E5mK%uKYl6o>PHj9_XuK}NZPvD97|~e}wa0{} zKT>szP7oc(Tc~h5K?N0V5Z!e{)*wy&hi*_^-2M)yZa27&;yCOE(^Zs#_C$@+G)|}6 z1S+MhwP1~*2K1p`i`No=U0*>|FY78N$S2@OigNn8k(#3#^K2W6xV~vJn+s&e!H4dU zoyDu}kg2-nbvx2jh0_k*Fpidf-W|T_eX!0?!CFH3ZF`iH;O@RloEtw3K`J8ruF0fO z@Li;%Kem3@8QLGAy_3bPF*0qka0FL?>J7fU@4t{^;H*06+*vmse=6wWJ}p%`=-Id zIzz5<`XJ$X-9Ubb|0|*SwgEW=%>=AF!em%V+hNmf_jc%HbEX|K#hht}Okd<%_Ea{H z+95M5sZMYz)3ghJl&aoqh0|y(b%0VcmRim_IkM4K77g023C7<75Ux(rcq3za-6YNt zsJ{2N-?#8W0Hl!a=nim*?QIw=z4bO)qMF`ffy1cjcA58m6u~JNhytZIJGc^w7^Bbg z{65I`4z=-rg227S@x^d4olVB)KQ2b+$BUl#r8nQ?i`0)+{hc=)#|o_dZJ1y1c6!-; zoaQ)!G<}G2|5Fdi*L>}V8Mt|)w$2GGXnmn#C6zuaTq(Mpf(+!-96C#VOBV$R=23B> zJVHM|n@7)d@(MwN5YaXaOK5?VjCo^ysH>n5pg${rQAR-R4z)dzJXVmPeIbTrm(Hl2ovQspn!jITl_09L83Sm?N_*5NZB*^TNf3f+!xOB% z{!<3Se->za_5<3Yok!BF|IE9GHkSk#C}Vt73sKQV6tzo!yncBDXB`XaR$ZRa5X0p; z3?lH;?Ceyf9aA-j6x<L^ng+>^sdoaI z^JTo{J@NLSDfKteP04=FXq~5I8YDYLnwd-`B??HLbyQxEpk)^QXEjI=)o?upoSt=@ z0)Kh$5y{OwKV$Pm?lI;tDrm~gf{2Cp#TR(#@eU3SNMlg#e$xooE?zY>6imS2 zuVo@eG_fdIyWVXahs;=Ja^uub6jqxn;>y)GP6cR>X3#uBhFY(_Xg*)Yn+?Q`jV>Zi zcOW0qAH^06N?8q~$WdaTfgo55g|;kz@Ny)&?6sdQabltkeV|R82hr9b@t-ZiUZGcX z;j-#h=g<}=l1t5z_R9ou96_JuA}OXD_UEcPgUEJV=jg9pk0FQ?kotL?k{MGSQ;NbE z=PrW*`9ggme*?}xNNcN9>|2@lI496uHeuFs9pO~P6J8a94;jb{6$ldNHGS`2`qd- zBR_Zai0Gh5Pm8?s22`}dX9U1-LNrI89p|DE^I`QLsYZf zGiWRX$o(=}rFrV3!aH22%%#^YPqV%G9L~3Vy!wP@J#`{!ulHDHsZBfrRO_(Jb3)Sz z35-!pY8kNwUY8*&_Oy*L`&lQprZI`JSY_RS%qHYTza;^{nhp&C)>m{COHBLTZUwDm zw{PoNwFR50Eb~#bNiGzBvW=fZEJH39W*t??4U$9pMO$(-bXc=U&Lwpr*$C_w$gm(z zK!IWgK0#KvY<;eI1Z)}!B|$P29>Y~GQAjTR0GT9(%62`rB>;`vsrCzT+sjo0T-E$A z_%}G0wpk3pPY!x2Y`HiAPw4iG6KGOw#W=yl{S-HK%I1p`cx2jtu5s2lQ@3sm(9R&T zyaNF~R-0<>FDxaPUeT@?Eu5e|R^Bs-Ew*eKgqt=#k`7`jcvZ!|8ihTOp$lT< zSgD`pmoeFOr2x2}Q&fOC3ri(s1frFx0t=}s-~~}dONUT@d0@YZB0}Fq{A9 zO2had&UiQnA8{O=4k_VP!&oCe7q`&VQbZ`Pp`NV=?)LZBX}p2Io)=z$VjYTN`Uou+ zQezEpwh7kqeIhg@Pt6*k^6U{M$2^OOLo-alMCVO=%$DVZ?C1MP*&QLP4sfZK z7E-8MB%MKjbd4zD$h;Xx>zKFC5>8m~!h8Ex$TGmS%&r$%jtfF;-WHkE+grpNyb09b z!FF%Pf70Zbmhry)DT04C$l;XN;L5>Oi|)?SYPF>ZPh?h`If=-rc`A|946lg6<$#hc zRMvB*_i4?xdl9UGd5|r9YF07KkVxTYu~Dm2i(;IA6Pvk4D(_14Gm}l5I=e*BcO?

6b6P-rgZLX#_6YdHYlfw`y5r*9f;Ba1}p~!0mOw^UU0onbGR@f5M!sjPu!2m+DPj z(IcvVa4If!8aSC2RCOew2^W>^Nbo67eUyG|2#b2xzQc+U0THZNG7w``=VgqVq^vymMSj$+0emP16{SWfcR zTu(za0;6P;SNBf^m4MReOFFGcgvFNM5#26(RE%)0f-gkc@eZucgWdcSycoP^KxyV) z$!?K5q6~i_m9>`!xmm$)B8h&L)C(PdReuczNdlr33;W{fVIs*Q2Z~UcDyrg%XQk7^ zOo|18&s$?SrS=R2q8@O_V!cg5;=jtf-NJ^}Ir#odju?{|rEKke6ijvYfzCu|TEfA_7WRaEGTs=n`Pg$Ic zf-_N8^wKdv*P+*lW>Gg|AF%|Zhqrf!OvbH2cMSMnU@jgVWVjheGEZBdn) z0^eKtyJZRU_T`~;$cEaWVOc^Se=#Mnfc=5Uhs_T#^u&Ut^IOQl^R9NmAf7X7dS+mZKTUd$(o|yK2FkGk6>uTm{bxqsIkS&^MrgZ9` z20@?lypxJ6L}gv&SP?!yvfh}C&Mw{=BLl<-{;v~T*NN@gA1mS{WvjE1O(kAhbuEwO z>}B z0lvJe|7?06Z^Kp8%e{La8RXBLiB4+P2-+eoYYxZdAao;cdC0Egc?+P4UXd4;}2f1S$u*3=Q3BsITEL|~&O z?ZtSxh%gS0`$bry4b(zLE_!dhy;pE(URAQ)4A+EdjAxHXnb}_4Q5J@$_t^yeu??WW z3QR8&<+~mr%gq}_lZMMTnlqtzE6d4+6-dDv{s%|y|1&d$N54uYt@1>eg?Ww74w0)Z z9qcSp5}L8Ie{Y#>>dR+uz25U4oOI~670Bs7?St^Svq4}FtJ$<+bEc9v?&hOt=_eUj zkt>WKK>moFeiWY3i-&a%8GW1H(2t^+IX2>nV8=~8@(C6DO~Typr}ehlb+2)u1Tbo<-QY2t>!jOXC6M%uhnr6jCtLvdv6=Mmq!^oDk)DJAFjoDdMIJ0 z%}MEZej1_=(oWPCn2Ma`^($PZZ?C6X(qE~wW;8kSCce}H@r;0Nz3OW0iv zBZ@B>;7ILW$(4+eA%a@%#!kyFk!*7F0|$}uFt{GZ#!g4Vwm?lm^BjE2&GB;kDWqL% zegKka{0kQ0@QIqZt#V_U z%rhMe);fen_ElhZ`D;h|m6G<6W|uJ49%EJ!$$vewAB>}=`1o4ygP-DOvdr5Twcp4C z$KWyX$7uhvVgqQ0p#lEN9cX~x^3r+_z(RW?yIv2&cE?A<8?ZgNn68{Opm8O1W#LXln2(kdc(Y{XUjW!f2rK~4hLU> zQS_00vjm9vJ;@9ZMTh9MXD)AvTr}ozmyGT`q&c{Y8dwJdT(J@NNYx2gx2WA_NiHxn zUy?bBhNew{ps8t7AZTF}@Ln`Dj|v1Wb*PG`p|VlYG@afBo_5BPjHbD<#3jC=Auh;@ zq=b#yifaU)=s)Rl;*}#**;s7m=X4;;tfK97kAvNAu zS>f8v71hws&?^M_qIvD(czYW*Teoq2x)0wR0m%qxUjO3ucd%^30VDt|s$WGJXxRKH zP2+UBO`zy!%>>}L0EDZPG~P6-jbG7dM*28fhT9cbxO5Gl(MZ>@e{ZF_h5-^?Q&*Q% z*h>*#-m>qe@Y`~0?5Cid*5oM8?`5lQK3n|q(|9(TUJiyM$(oZ&#J~>5MDIzrVbb8) z)#=xjTOiXP&cXPjUhnwg>gaT|7)&M?zi2gw=s|XwxZZwG1H-OqrobIYa4NqsFp{!` z6c0!DPi}C1&SuCBOV!wQ@4Cm{++%08(f@B8TJ4&E$(4vwy{V?)u6sK| zt2p6HY1XFi%4@3H?Yj3?s)4V-;e;xx?i$X|-^QcUoTasoj9T}6NMiinQL2B~ZD;xATs{3v*84sZKMNeKU zQd&W$SCCpw#iNENquJHu+(ofP?N?~ftj(?bt*+elr)(YRf(mT?ltBdnR`lYOMgvKv zMei@9fAX#(2#BOlFOsA!Skoe}r*mwH{sAHYUn8Kxg{uTD+m#B%l^{X7O@}JuL*jIO}IT23!Rqh=$W=Tle^>xmaOK=9F0V$o|xSf2l*18@b4vufa2 zp?@qOOoQvp7WFiGNt;}-UzKWe4W@e?R2>88f5M~TU6DU@h|%&sCR#!-gW8!q6KyUj z(!jKmFpd+w#38E~;Kwk&^+R2rNMRap6KG`Wl1io-%1K>gH7zb(BFGt;Ykq2InyXo; ziW0qCP>V+Dm-Juf5Lkg&vyd%%_VCE>pEVdL9S=I_&f^Wto47M2nbK6M=o2h1yV%k`WV_V4x zYI>yc?WMM|6S8PpijX29bD5EA^bE7h4x+5=MnLMye;CV%#=_UtAk%{B2aV%cefWh!GC@5!XY?=k zL1+?=6T{Ed?Y)ud`YM;vXT0yKw&iEUBKi3ibL+a-M_kAM>3(*ho{3}9^WYB{e#Zb@ zhSgw?8R3j}lM&KsX_;$CCYKSU%=W5NNils2UzGpu$#{&$oZ6zp9CNndH1&*)e^?9? zlTY0DZ7^!E|P1uLO2-bv~SpFV2+# zlu?}yrc+&oOEBF3W_r|ET(J1_lm7#S%s~pmFc3h|{hVT!?ao3)FpAKXE9n6OB~7Mn zpiPEk0*ZKd?Fszr$G_ZoVE{*Ve>I7)%96a5L0(Mx+SCey*(kHIgu}gTW0|}7v?oWd zZH~?yTHP<)o0KUj03U?XwBxS$)lq^s;4d!Y>Mc$sSn)C7O!A11sv6Iz|9$mN6@1_e z%~@Md+ej3C|G>$e@Aa%7;(onHcQ7h5F5_ni8QRLVYV%6B*nK6ZKfBEk_7hmRP z$GIRaFSO&CGw1T1@0>Gy{FJPcR?CN8=pqOlOibF`cUcYTRihVd8QL+6E_fId=Fnswdb;Dp8 zK!20tWAaG)EovjifQcH$e-VMtr1ftL(4Pdw1bPJe;HWUSuYaMpx)@?G0F#;VF-F0| zMcoF7P>jB~ksmTg@sH^u3_P$*BaZ}e1m<%uj;Q-nk2uq{R(+P_snR=Kx-g9W9FbLk zPtN5nR7HzIuU54%aS<8iUTL6N5iZG@^umb7u0l0=n;rmZo9g3ie^H7`L)91*ruP`m zd%e5AZ$8gQ*SFs;uE5}&hOG;>6moe#8s2@q9_=V*cs&~5U5xI8m|0z1T;J!;*gPU# zz>++A$RIu9OF=}aOKH}3fs2s)k^$s`5F`+-$1Yd`haUig!C+T=JCa}?ajw}_9Dh#} zuJ}Mwwgkp2fFY%Tf3;_))L;^a@ehccQcgz_q?i?842h!xY{G4wO?2tAj-fl-IOZPy z<|caqX1l!?V73eJY%fnnXqyujXwUkZ0}R4BIbZRAaMp4n_@lw~V(%0u)RScCw1;jK z#RM?UKgP!xxS0M13+TCQiL4-C;06Kx5+dmOFBH>kH?>s_e@Pa~Zk`PiBDyl{I~~<7 z1WAe_8)zCrC8xJKW>XJaj@jAZ0ZJULr>aogVB0nFZXu4tC+IV|+mKAbC~v|XS#rF4 zC$2j=5AZmFUf_m9R^++TMryK~4~qTw(LZ@BVQzgpARo4;(_`G`K#i!Eo~RB!5UmMQ z?Xa7hL}Gzif2v)vMgzmZ87xu)G5w%n^wok`9ds($74A@*E7K!Qgs~zI4ro-JBP7A6 zEZ5nps9bseagbErCkv`Hg2U-xuW+h`M`0|3u%1{pEM?X-Lrhi2TX@Wlg$7VyI@_F> zecoQRUXK<7&n?Pk;f#`I>y%#0LSKlBGuS#!YXrL(kR(MQZ=EM@qJ3N}&W5eu!bXJOsaf0cACz(`Q7?bvk~Kz&or- zsmX>pl^H*)$`+}tC$i^RC%2FEm2cKKGs3qpr1m~Rl{Mw+F7GJ#KzOW@N^NYVF|l%U zA;?w~e-)=pM0cW`UhmjtOdB+B1sqHNvlIActSc0)6KhcUSZ?&^p?6J}ncnO(E3;QD zDe_v|H(YlrvV!IhwcRP5oe6pmXhm-~b=Jmc71q3`_ooZ0LP0t7-yw{gOpBUMpqbxA z-`T)_Z#wvKr$sS(q&obBejcc-rsV5GHg^c`f8-%7I;FlLPjoq&%t5VGo~Jh5_8L@+ zu4>V?&bNh0R`d$X1VsM_22{5isuF8T;CK~_N2t2;w|$K_h`!`qwfHI>t2D-8rXLjO z$=FKvt|2e;r-+Em^6m!BSCPF^Q~@mve!lN2DD**bt#{RA~;j+g8gsWT38<=tlbk3?L z=t?|t@>QZ+I}$4K-CKbKpJX8Rb_7oTf4H;;0DBr%*WJB&NOX!QiME0nDm!Pjj^zK# zTf5q~tHyKxc5XC=Guu&ALk8RSmu-yXuK*Q`@RKdE+`O2%19Q($~tMH_Bav$1us%Kl8_-@uu4Ag?3JV+ZbJai_mZiMjV)TmJ#Y8*5YB zNb)~FuGhcu(n$TF~d zM^$1ydU|^LHQha}pHEh|tDT)Wf1WM82%|=vME)#slZO?Kj}M#eoxoe-c;(G7a{KG$ z)%xZ%yr2DJj^{rf{xtUvew?1)uFkzE#!-7`XB}6AP5F-#{*HsVy#o`+F|zPIj&}aD zgWzu!g$bS|c#dkbaE{yR!-S7i9*t%}apoSL+0i6E8|Em~|54c^Qxy%&R~s z9y%2)v;x;QU=&}E@vQ>g7EqmVxdeX5Fzc&@KSS5+V3zn{fLwPL2B3@US<>*L$a_Gw za7Et4=onpGHt8UyE#$A3f86@<{)aif2EG9Hm6!Ne{=!cl7`q$IwhEg{5%BRRvj_v3 z4u7s0q6$$RI>^7*BN0jh!>4p@E-2)}{T)BVjf<({e(nz(b9`=e%oc*%;kjwMj`5M+ zbcSbVrtQ${?y!@)KQ+2;r*Djmj$@84Tj)@p99ZM67m1OIfby|Ef8&Cvw@^J!Rgc_Y zregI=2?ZGUJU6~TeJZ1idLFiZiB3*5GyvHkVq9dB-X35|KaO$IP)NCuXusTmOtPDD zRN2a_sFKa5g0d8}in{GkVgXo9rDTm2L~_U~8n;4-Gq{cDWIs@jEK|}H)uYyBFde}6 zesDu~vEYVnAE0EFe_N6nMPbzUg82eRsD|acV-&0x3)SKH*Qi0BqvPY_{D7teMc1ri z!{44r(A2q&!f#|*5-T57rjn%+ha`4P=_PE9@NWOG@Pce`@TT~J?~(BCpomSoPZEbf ztXTq&iCT6uZZLr9jeUA$xR2Sf_TjBbeT@xQUV6SS8w6ZJGWlsK{ybN zyx;~mYE)qXB^XPKMJg{-)#9d@vhhN4jD;6G6OS*bUa6OOq5n&>!&4{Kk zusukw8#2aO%4@XyL%fR`#<(*WpdaQyFNwr1hnYhxbL2%! z)l!(M)FzF2C2I`qZ8z@HOJ=u?`n$$-8cnCcclIx8*4}lA{}2dj6cWcx{o*4Ja**Ig zY>+8DP}tVMbG+24>4@E*!m|Yq8Y*hlhe^B_e*&dKCU-?x!aE*)DWixmE~&+7-$<+$ zX^V~-I*J&ELq?dwtGA`lMe56OzrWnyFT$5@E98$SHSr39OPps%3o*P@78h!&rY<4f z7A`fip%iD9xwogGu|m_Qe(X|8GhYiLD(b&IcE{#9Sg11`5x<%fvYO9cWW!-!&}#I; ze~XjPUOdJtu;C<(GLH;f1$?mOX#>mAGo$})aFgLwn>CjdzlHz@m+VOblf=<*z zT;94AApNV@QsCbm+NT%X16OYuX#Y4J1^*pBZU11CeDW4+$|%@LSiL0MN>0*ce;$?j zY4+HnoDe}thE}1UZdjRpWO<|r`C0-Yi^pVKx{U}jy)?by6hO4D;1(#vM7lWX%A+x< zTGQP!Xq710DrlusirBvascSQbr3hZBKj3WgtI*9UbZ1ZG5tXC-ZJ`wv%VPOsAzDR+ zXq>l~c}_P?Z6vYnPJ>--hDu#ee>w-AWGPC>uuQF!9q@@eA}<`-v=f`*kEwroj)beQ-A3bLa`LBO>xcG6c(^0BUV z+SCZPDVL>&SyA+o;-U8?!M#t;K zu5eV%P;G+F=u(<9B*c0tkp0{mj!n`a!OmjS0TuEnKf@HKgCecSJM%KpaDoQ5HLy*$ z@0?j%l2lOhTQ9b-Hy6dkoUv_aQ!1CDwDyv~`>QtQR>n#SmTgd9H7Q?gy@P*PVYe*Y zSdDGlc4OOSW82M+(Z;rI8%@&KXl&c&P2Y3Ad%k;r_fOb+KWnX-dDfn3UHD4+F|fUN z$%2>!@)OTKK3Ai<5>O7nO-fGnXobCgWTCWGwo}`ltZWcEpxYA_1Ja>YQVp1^vKjPXr{hlZwycdkF^(H2As~X7jrcwW=*9`vS&=C zVUDJar1?OjcNl9u1^OEBtCR?h?A_o}!N;O|ts96st1OU1%3abK;m2q1#h8%NPN-vD z-4q$c>e89&f=VvvQD(?sPNJx+Fi=XBc&Tl07GTb_XEb=7URBy`^!K8aKOP@kaJp0F zaZih-d~qlxfV0nRy5Z0xHl9@Z!1#T_yCk-=kR7$~m6alwsufPUW^I^B?|dIU{$27E?0)-TzcTWIdLd~c(m9ZghH%M1eGq4zqb5dZ!q(_%3eGx`|V@azCav9tRa5Qs8Pu=~6hJ98|4%6~Y zRH-Ir5lAvUd6pEeV=&{(>;FmoNDQfflE0{9%yx*9MfS>liPI@|7wQn1v<_BV?JCQ| z%-?WXO~U9UxbeD+p(lox71=v_*Gt-#b*J8t;CccZo_5$2#Qw}DUm2zNwZ@DRHF}ld z3D4G}F_P!qEi*Sw~bA0Kz4?4|7dlo_%U2n#3WMPBK;vr~2p z9zOSZt5F8F0i=1A?K{sA0=`qFObVBg{N1a&?4kUO=7U~{>*VB?W2qzBygyl~V|QitY0uKAC(^`A8B?nkk>b-sL%JsaC=4b|8=y!C zxKooKN}Ek?-~6_DNT9I7{{!OFJ6${0?QZl$$(2%@+zD4y@lo zHW^Kq-%M}DZ>79?9e$}FV`vYg3XaBK#J8Sd-?P3fc$E>lL6!K74#$mWdDH zGHUHpI=|=KTd!&N!63pPK=8hu=MbnzL?$-bu7Bq+l)+|#p2bO@A#bl~KOzlddtCTM zzs_!B%CucHSn3~oME;s4Ud+fp0ob*h4YG)1<2=n{%@Ug52FJ>w88EFID`dV~3?;E+ zr!SSs<&R>%P2*%a&HJ)ov7_Q<@PXkMYwRzz_7!6YASwqyL*JKUMrnE*h}v_73(xRBo04VZt?NEU$MH)qJ_X{fI% zTgJ8oNJlfGsoAjg8m|=d2s6A`HJZ~F!?SwHU@IOLW0Ng?RQCF zV{89n*WXd&1LH4<++OU+`!;=E`Kuf`0N9_WIS}| z=3Q)gPO1RefnqxLQ21pSHOoY|B=i9>xLCN32;tY`)vUv|H-fClv1GIoR&?YK0-l+= zNKv%gJk_+8b3K!3zzWieuG59hR=Bz;!*lzR4rb?F2qJFC%?fXe%Ut2Hwo4XUVtefO z2sebN;7UG2m*B&g-w3mRkNnZeo?N1rIB46Nnxv;=r!bA;zU{gMB;l#NkZ)ecE9c8y zUgBFd9xFCwix?MW^;8ios!<sppM)y5Ejyfn2pAwo}T}e zTQ2iuYYF_WOG-$)w%85ZYnrtZ|4ao@R-M#|+ka0tKW1^+Ey$#d%S;AjV4tL47MVUZ zHwLxs8%~l^L+wPm*>$2?Q8PE6x2Pwse1oBZN|!0FA^Y3Gw8bw;gtiwX+HUL~v0}gX zA=K|E_!bpv0K&P`=uaETgkPo>G@S*KBV&hZ%1uk(S+l>Wd5V#tc<)oYQOpT(*oL`V zW=Lrom}gx$%?)!Y7etGNE)PtnbTE+4gJq71O;Z#)w(gGOz_Pi?l!4#L*(lfV6UFsu zV(50LB<6~KV}2z5V&21HL4-~`2m;wooGOPu8e$sW6?#LBKVwOO?UUY=MmXo=1qkeZ@Sb4yNd*BJUrte$Qf=y3< z!C8gdHU5j!z!IyXPslX7_ie`duR#AU=88ZyrR6KNd4?2H{9NgXIz% z_#uiw@)dMIt=uYSj+`WBJ^hThrf&N$BIq+?C08hy!=w-&AIw}!3N;yWnXTc-aIU{(rV#lCH!i~k z_vs@3?2)`Fo?@vD@rF~Tc$R;1jlXTue2Z<44fanzUJL`7xhT)I1azLWaRWP{H<7UH z7w+WP2Q>a{D8^k>2rsYe*zFxa#hVRYA_Z>q-t&(xY)7SK>|(zU=824h$fohANS|LX zLeYKZt%;6`DzyIq9;+u~j*KH!t%-kh3TE4;KO;n4GrZ|2^pgfqi z0RmMz)8?;&}}FPsOgd4o?w$7@&6L1shyhjQ4Rl&T2LLcU|BRtmANG8p&SFT z+rON??s|Ms);vUwxIYxiT~{4oE?$8NYV=i7;M8aXvEZ6WN!udcFW-awtxpX1o0zPU zhXor%<5w!$zX|!hF@X^++1j>w3w;|#2^B}yG%Ed`ou`;@cMS)}fboN|qoeH2bCEy` zmS*$B;rpxA6zhEiv-R(0#G89Fo4bKBhx^Ec@tPn2>0r~^-R2D0w94?)iCk&<7^rOD zb|%-Oxg9Cd?wTPdMF3AwEqQ2}L)I@K2&c{hk1$;#M_vj?wABWM`&aI`FS zY@frGCHq_0!Q9>2hOum4scQ7EhThH%91|iIV?xk*Ag|(t+J&HWsBK=*pz?w+D50Mx56jM^Q)8w3XeE2%&rFSAJv?AdD>guNx}m&VX^Q zjezIt^u3ZlZIl*FvGQ2J8-V9ZkC%S`O`j{tCMp7yif3n}L^x4*Y!IXrE62s4QZS)J zsWG;cGl%XSTg1xbhQsjG>XMjVPj=q54RIGVZYF{KsSQ+Qr(7_owX^_dXg9LRMmBBz zX0S*eIB)d)NM|FmoGo9R??ah<{=G<TBuqZ>R4!_5P$cdc|60|+hlso9u^GU2&K zTm)k~^Yg8(53Q~JP^B;4_8Qz8d1yc|a6S;j?I%hl=;+R$db=va#q`j&oY{1;vniJP z3T21AkvtHmHCl(C4(JC*?x&+&Ohf#Xfmc9fv&m{-606Ek-qijZmv{c;KsEls%F#*Hg2EKG;TXggr3N%@}C4_M8|Ne zK;I3vczqz?@3-C|U5=BqvC5j+y=iaI$WP~qPak2?i)UE;ueFH5kjk)*v%+a2QT_ly zJktD35yoQDR8@}UaQ8wJ&TL4-I9`w;A#eV4Up#Fl5{?=KfvNOqE+$Ig@5oaGS;ZD^Jgh!`$1 z+9(H8tnO`(f23_esa`NUhpdzHnLcnuY(jfLpKm;4AW?S5BANR3gTjm$UC8qAo4u(ex9^Mc|eZLpCskScOG(GoHoyn-IXJ* zRX(Rnx!s*t4`zH~#tN?{*9G0Q!!6&e%U!?0WmQ_-)FSuu$K_cl=(EFLEW(TJZD?XVgLzG4w}SDJJ`Yk! z^^nbI_U*}Cvmd_hAAOh$MI4{5%kcHkbDp%Vz%_2*`E^4IO24*Ch+|N3`xHZ;Rnfw0 zxuB!lvsg`hy_0@A_owYLzztW2Y*GB_x7_uLfEze3H^~271tAZkBQ8I{FKTtLsiU|m zQ+d9}3R=Zavz3Dfr?~FYS6?9LiyUTDaX-Wlo1%H!Q?_L0kFG1MRXZT&Clnh#se^fg z7;W#QwJD)%F;+gs_CrjQBTnRRzQ|~n8g>aaNcmBrsd{lD7LX(|6-sXgiAY^tqwI`=lYL1@bmGDznF@g6GPfrw~WWyKjuh z7F=EF3lhwzxPFqj+iV?0AtxncUZL8R7uswcKYqxQF9AmbOVA_j&GmSSfDrwh8(pn_ z7_ZSlb>Gq~f?Kx*AVxb%J#BTTZ&KAK*}6%vvE|QTU|0K}M@6)DxwM26*jk)>t3;T( z9AW|!$?`J>TYc@P)vp5QX4TV!v}GsqEe!$LCX}hkZ0Un31Q9LqpNWF)3SHiS`8>r>@as6OpvBn445wurm-uwD zNVM`P>;dHK&^GP){?7HwX3+k#aoisL4YT^jROXW@vxi1Hh-J2)Ru2a|mendyQ&4p9 z+6y-`nDk69(&&Y;7o*%B4YJAzEySw5Li5cw_qoU+v2!%f1pWpCR>JaBhDZ%k3V~TU zfiPnLra5-^9e+$mLUqi%_G?^4a^Y@G89L%uqRCcuUs3jAGvzW1DYEgSBm+$_Z5eld zcTlI2k36Fu@DUX-oEeOz_ z=;ZS3)!fFvlR1~zbqZ}UuR9_6Fa+VO<{cXr=$~xKPS#p$Ps*k ze}48GSX+NbiKFS(H*rdJNsK{g(vPrY_FNeRlG8lGziR)32y-}0ri2HHw6xQbr++Vp z44fpBVTrYonbp}8s4Upsb}P6Y(=pyywP$ZDh`YCWXSGYX8!*JHZFAwJ<qChZ@_Jt(~jxZ^(lXsFpd4c$YMF&OPWqsVh&0G78 z>`-XbTGFo5191|>{f5{SS$rGPLvGP%UF(BWht`c^^7t8nwq?) zdM>GkV*<&o>p`1;ljk;rQ&gkPNuR!t9VpiaE(P>TZzd`-7 zQ%F=%Au_?$eVLA|ee}HI4(y{{Dm{%2UCI@)bu8V}e!nv#V`YqmLTPuESTrjGg{_G5 z*ZVDze9AtA*C<5qBM;i7k(Z@@f32vehXX+N^ls#pyu^FX*LKTNqMIj!1?P+UNO5RA zM$fZRe>5+-`Xy~$MF@sgVT+%StLm`UMlE=}R#1*$ri*0>D)3s%92z1w$hK_2lPh>y zWv0?`nBGxYy!uP8a}~I30EQaOz;`9kAqb&qL#7hS0q4_zDlgQXm|tJ>$VngAJy!u? zHT!gyy@!dGBz6w@u9NJFCpXsy9G=y?KM+@krK^PxJyr&xBDT6c&UaDGrkC@<+y$Gr z0n|@oyRu3cjR@@&jnr={W~u4udE(`1f(?Hulna08!m-5@L~QuWCQEf#Nb;yF?~i?D zn;`0BRw1v_hggQiI%AVl1XqZ;!VChAA42YGd97hA4hmq7R+s0E(^pu<(g+zsj3!lF zUdzMxX+O3SrlnQgfkkHhkq;AtLKT^RPFtT=PZ3jn7-)2=K~>hd9*3o9d~Tz06yI@& z%tQ#Z6W`tA*KBRY&VII%Kbdt6lDU8HoDOm@iNgu{!$X=vyIL-u4*yK8)BuQ{Pv@( zT&Q7?HR0+zw?G|E6dmC_H4>jhGD%(Yly@@)HJ8K8kCD8Xhi-3&AhqGJ>5|TZ4WxQD zhiNf*1(j-~gTp=c8lXt z;3QOW*8}nGbDi9T8!RJb-e(~bTesS;JRig-VdVTsST5@&AqSj^)-I0AQZ6p~B0;{6 zGbq$PN16r#6|Xm9M*)M-a5d)LemoywGrDBzH zmdcvEAoNy+y=6(?kkL|iLFZ8@>+loZw!0_YKw-c+dhhG_ME|(IpP#o+ns@oi?1vjY zZU(1-u(TTfL9OzT@iWlVv<=*b_6Xn?JlDgKo7Ljf_b~9eWMusI^7uOAnL!zy;%F$( zNuG;XVT(omQSbdiR1KgX;s?Pn`EC{&od&Wdq%K?m7_k<(aZnRV3Y~i3a3FIBL)>g~ z2jZyV5aFd)vx3)BnsmQWH}fGs9YyJ@jCG0ALX7%l^T>jrOB4xqr1}YhJc?uw(0^6< zOcF2_>27w$To>tsU@Dr8@t~3{EvAvEDi^7lLj|;zT$0f3EiWQ4@7Vri zT-IBg##xa2Ch;1vmW_p+PZLxGOa!JUS&ueZj*;NSxhu|S1zT2=G9gjtYvpVdw%VmG zSvBGW!5aGW2_{Aarhwe<579jljVWDOCU(fMW29jzyo=?Eb>uCYp4E}Qg7K&<+0nIk z74ycj!xN3Rh+P}24;S{?tMU(?w{u64Q5N-O%?eZq zAL+&~4}BAT$cZB^XgN!p*Lu|I^zVhRrX$=Q?V==RtV3q1nPn1RQLlP?n(CE&T_eBk z;gyAZfCuxlkA4O)4O;Mz4cc^coe9!WTp(K_+-k1-rvZ~EQsFDBP~34w8i48}B?yZE z(uB}GzkNT~3TJK8L0n4xBf64@*n|il>H1l3ps3WKiwDVIH}u#(T(DT&8j&hR)b^KB z0Q+#4RKPOJjD@E?$w=JkZ$m|9y#+5S|Htk8b6FCXwg*NXBAK_$lP8g$+u3)^r1LHn zHoN1SH9*yNh3|6wRhTyYn%t7kE}*VcGm+tE#@Mmpz-2nFf5Fr$7mAwD1=4O&TE(yz z1e|BTf(l6asFNjKq`_bHjsG0tNrNq^L`gD=M&)8DlOr^$63Ho&p?hIPlQ^&n3O5s8 zT9<7g`vwkTxsq6+&%Tv++@_Gs!*SB*;Z7%zDamARmo+v{0K9%sOB#3rT!rNypYZAdjHqsm{uxZ6)5m(K}XN zqM^FKD2lvfm1RkPPnIR$UG6}OKXGwDiqH~N2XE1ro3DyJVIpr%Mi@SE8BloW>!}gA zqY!AzH=1NZ6yzQXn#H>a?M#X=kZ+#_D2q3opC2N5DY|Qd;EvrNXWgFR+cTx;7$rwp z2i`9~u7rJk114M6GPzaS4^#y;xRn(xQ9{NcS%}bpP|W4$k{xz+xm7SFeh@qQkI+EWG(kQbz@RHbwycJhZ`q5 zt$PG_R20KL#@+}R{#}5NH-95g7Gr~^W^bn1FseZJH{L8&5=ngcK>r0SQ~CcxS1yM= zA!s;~)PLmQxcAUN3ya&Z#Fi;QwJ?^^f5ZaSCcJENgk0!6QuVC$_1-^DnxdE?W}p%I zM6R`!#i|h;I40oC#NZEu!1d{cI}y@7Z%C@qN`@bm!+%M&F1G=Rm(X1qP_}4~0kwX` zzZHZSe{)@O)mSW1ae-*BE6G9pQX;zc4*Gerj9t=$a_v+ic0b|4H^B)WCwNt#VC49k zLh^o36@f8iz6$yMd9sE>`?}bW{Al31EG{xq1vaiO$>UFBVHATsEzgt7ghlz)D@88J z!6xK$M6t@sBM%SY6=-U5ICs6B!Ve>HAL#2QfP=Znki2%Q_j%WzEeQ3jdL!7gf^e5S z21ymkGWz5qI0)mln~zy{$yd|0mc~*kbAK6K=20Ig6xjtHD-ea?Jn@iuu?SVDDrb$$ zjMRCeafnodfoDNfxLJwH1oMa_O+{V|k)LR0t5ivL8_NaIzh5M};d`HXq|4>yo87LD zd9yzI+NwhmBgiVlrEu9p+`xU<{FY;^!=u*z91tM-VCJ>B5jZ5MTAF8XgtQoQoMRv>a32pt_ha%GELM6n7}@0g;a z-3ZfmXfjpiIr={h2sGNzj;EbAg}Y3=O1IpUqx}raG~=K&!hcL}Vn?Bk%|*1|_%JkW zwv(rjUP+U_f+9fafm7(puh|S#qo2iXeE-Q4FMbAO@idG32@Dx3}yC78wKy#oUFy4b*{We}jwr+*cX?oPT@PHu$$) z7GnU#g@;2sN0UVX6?x1AhWSoDKAyYz4n3*CVw9VEpVeohb7$Dg~Uz<5lW0}&EU?ZE*O3d?eD0vmq!I0 z1p#-Nn{A14(*`ooq+O#D8a&~Z2kbGd?Z zbkV+hP@OFOaG==y5}XXJ<`DPNHSG&4?9VjDoxrw%Cra1;9ZCY_G?0f8Wi1bA zRsRDY5)bFVsLDZZw*u1ZLQ)DXNO^2&SuGzkjIDSep*ZKA=|q+wDik9PLky!b{3pUB zJrY(dXA18WN#1E>6b&=2Et?H$IUD8!Y3URoi+`EdDP}$pq z@{H@w>BCLt(z%BJ4#Z7#j?<6v*#hFMdTo&7jY-_;4OzC3xtAm2A7La2s=8uj#0B@0 zh~cH=GCAA@z(;5dlXJE)tEoLunXR(QN#ux9?{^-N&6;JyX;9Oj{rT6PJf$_N)XGhh z7^MkZz2TZ(V%*v!{CDX4J+1lJwaI$16fvDeLc@oNzqVHK?HmtX9d^qad(SU9B94m9 zyxB57@~-uQwdn2n>C~EJK@@*_%G;7EhB&luAvX*a()w*)wCFRsHe+)EU#@mrH60RA zUBXNp^SWSbd3^+ngxoVX??1kFcIqr4oyG#SrE6|8_~wh`eeQBQLp#J*1R=IK15|QF zK7P}BVn1Z3zxjfBAnGT79U+GKQog=6!X^7xiKbL9%5k|bn6-Imgp!~Sw}LEvT&)rd zPrl=t1P)gMgESRjPM}K#Xw*=DB)y{r{^{j3W*u0wb4>*K>;2r|{A_2h!&#Z_E@l4F zU02uXysE>ys-v=6?bc!-=g8Y6n!;)%6U>a+my7R|iE$EZumsZ0(*MIY^ko@s;pWt@ zGYwar|N1wAhhc;@_SJ7LRNLfg0Q-ylyt`S{=Wx8M zm_;p&XATBw+fDRh3mo&hE9#TB&ivU+#M#*OHZt|hlW$%4PTlsOi3c*7j+OQBOIQoa zSU*6W~NZWYY`9odZeriHFd^%%U!mt`` z6w0*031|L3ubbJ)(>9TTg^9*`VEMJf`BTc)@S``PhbQ~!t+9u+qfW<{2JyGRBgwKc zjXb5`HE6<6k zu)kkg?FjhS9$B1*`##h1Zza+*^|4T|7_?MK}mxE8ml>$9a4IO~U0{Pq& z6+>aJqd6PXE*N?WG#^pSF{iAr1Yh_*owtVqlp5T`Uym!Vp{Z-D*=5$b3;J!+V9IgG zirE5u;N_4<4w`1&A;*2(tmnr04Akrj`En#MTsNXQ6>J`s06`UTS|7kWP*kw)LcSt3Vl_+ zM#16D;C{-{@50k6b#%w3z3U{DD2_fpik6?8sY*<&Zs69_V-2q$J$*dBiQ!iZhB=krxc>l#ca`PY1cHD{Dpv!P(*ik30Fm4;4L)LLXr(+^czE4piQ!)sv! z{#yoj@!;Y}_)G&0-a_q6MmN0kgy@ELJNFU#$*jAVdbpt}pT$4vY!8!8TmkI^!KjX~ zk!qkx{`t5O#3kWRIYpa+khFm2oB#dMyHMozNAS=@AGoiPK z@8|>qi0b>h$h#p)oqztoBObtAF@HqFt__Xus5X1IlU)^d9Kic zH*RRpMRMu?tFEX56u#%!pFmqW*~00e#Ni&syt$`iI7aoX{`h*}d$5}oO1YvrfHoq} z6*LxaP42j?b^A+8pNYQdU)K05y-m5IK)U`qwd&1MC4j$Ed8dBS4Xk3UzPVB`aJ5i`)prld_>IDqtabC12 zq6}1CNpN`gGSJ*mhziap3wE)vc*WW0lR<&9z|3t;tRsrNvb}XtzgslkA^4|=-_{W{A|0Q#_IpoS3aNLhN*{H z^8gaeNP(n+E zP7Cw+4nytJDI8+t$IuP6F5e5UrvgPeN+4RAPj=Mwdr|l(#^VJPfBw$d(hQ< zZ$?ReB4-FwMvZ$(V(_&W(u*0=$fMPYw4{R};hK*pz21uDrmhW8t|D6<5q0|*-jC_=M|u>hA7n* zQ3{({@e;E9h1akLwmE;zf6K+rkdQUigM~5bTVTl>a;Q|eIz9_1sX@hOVl?;f5B4Xkv4cuWu>v+*PR15>tv&fY(>a?}U zU19joC55rc6F`n^Jt|DdW_0w)r2E5n3u;f|`R4h?(>doaU<|IQX#5g1zx*sjNhp!6 z@HUo@5gt6G-NUBd&!SfXW3BYJY3@AhkLMqL{N3f1ONfk&!S(Z#ILl6%|PN-KzM(P zhml%{QrSpM3dQj08GE1jPwnqSQ4NcG3}2+22E%GIU1EetwQm85C=Yq_x{!|@jU=Oz z<71EPO3WCb)sbA8I&bHzDh)!m#A()zJ%e)W3yDAE=i){P7kU_?<6Ss;piYbKTb725 z@;TX3a{!kp85r+|fr6O7f)Y|Xxco_dc$Kcrxu+HIFubd=DGZ+u)u2w&re*+LQ&?x& zcaxUOZ)~Cf94a?YF;Oo`_r1vGQ4Kfrp3ZLArJk(tG6G`dGZ$77LbyT2^PuGzR5H-}wfU*tAX8IH!sJg|`^A<+42}aUCZ-$|X z5vTo`5E>sPl`qIYKojHs_050D&D7^cQ}AdNvfw9ZCJ>=akmo|05|Xpd^e&c?3{%9w z%Q;15AU9;2cgO16`^W0qPCWzrcZd;fte{+S6{+opSqsW5DkEu|X{*o9QNFTocQey) z-SyiTZv%bXEQ4OU6KNoCcwf$6YuPHEY5&v|UVmL%a^)wNp-c%Z+|mcg=`Vl8B`TRq zj&udjXJ(yV@a^4Oqfe9K_ohkfP}}K*Esx&3EiJ=km!4*TixF& z%6+&Y<;y!nnV9NuGPS>>ZTw!x!SQ{p{p3sXL$}Oa!9FY)&DS$LSsUA_nSB6VO4ZL= zm>z#Od9ZT=I}a1pUq@@5V)$HfwsCASehsKOzB7qdWt6?i{(sx>wCrSYBE~2b(9`afhA`)^84t`EFPZV) z1ei^=5!4C1TSzPlRf&I&45ufHJ$o7!^P7c9fXjuNYT-8<9?xpU@gjF=S+l*eTG}nX zHYZE8B*sivi0?fHt%^14OWvBC6Fv^VqZDZo_wMXY7QT;enIkRv^P}=;)w>Ra?Q?!HLp{Tg*#lc@& zfOSE$V!z_(qGVEEU&`Uw1~EjjQM|Ze+Z$Nxxi^7gt^2=GbOq}}MfJ9izl8b!udCcC z3^crdb%oYn%skcXn!v`r(wh{r3c+Ktu~sC;F=%*0(6@H+vE%fK$(lYfne{(Rwm`+; zVI6B0&-RJQVk!Vt=>GPNgf1^T-v15CZp3UcKQWoly49Eg?+FVr-<$pB^}8oyLb!f1 zw7#~;Yel`XoXs1tLMl7HiHAEXTF-$KS z_p+9h6>A7Ns>UN437bn&h1=%)I_t_5j}LG{x>+n)U&xPW3=wvHRqhFoLp%Qrwe$%+ z&Ga|L^Se6!dR;FN1A>k)pjxcuxad^-QSgY_hWa^^<^E;zbslJp2`!@2sn(!bRVrFo zGLkfKY9!gPwE45+#z~cJshR`>H+eId@`w(!m_ylMWJnM%Is1iloa~g)faRFB1RPME>|UkrlBNdm5aX zuGID(L5rI>EG%z+l1cw&&rL$88?~(=gxtb5Q2kFGg}V`(IjU-T{HvpD-8mkUga5OR z0DO5Ps9;JLrhui673lMf{)JrS*7V~1DhxA^Wh^w~!40O$YAW1!mc8p1_fA<{NhH9ape5# zIYP!jB;d_EoCS>f{tvAE41xIHxYqVxB?WX)R%cIcxVKYZu?DJ4tbkw&I)LME#z6Eo(PV`Cl{!V#_Z#iw9k#oov%%z z3mv4MPVE+fo%l@=`P=0M>iP$jw`l*hoO5d80PSUM&TYE8i9zINEaoS*>A!dZsP`2Y z!D%#0pa*EEeikcF>8SLYxyyncnJo##ki4CrQzTIo8s2k_y>vFS-aJ-Fi-ig5vqmCe zm($v@dMjF}|KcK!JDa8&K(0eR2#&SP$D31!9i=XU za|UtP5!bbso2hasci}f|Q@eBjv(f&9u|YJip*{ZkSW;rECypyT+py_(2RQnJ77^)- zZ<4+pY2AV^N7qc@u9`MzeIkSpBpKo-4MFtqb}k5Pen;nox5)zO2-p*n0LDTpTLlsC zS#(y6#5G)^^8e82U>n6x8tovjr0RnM_CrTPD&CpC;d5x$5x;E6X}b`9b$Re;efhCx zcOhqqr9x$GgbW#FLrz^BDa45nPbvEgG7}kv7`T($(uh9O)~8k7nNCDW-m%e7Ypp@B z<*-IKo3#E;2}F3huM6k6BM?-erx%xb3dNCcrYX`wEq(ZZavsG2OjmN^Co~YR?%cBd zoU5(Ig0jCc2X%jYI+EGA0;}^SCzTd0{irPr7O2B4uuz1E?|V_(F6%TAc*8prHDMAH z+go^3mRC~o5FzCpw-?^lRTR2Ljl5YR(Pz>b^Y*n~f%hIHJFilSUb?tu91K3iD>M(k zy-@+bjXq0PzpJ_1V>Xg#r9G&F-+)8&>8HxD@sADp{!k=R6ldcI)Bmv{wvxXv<(@FQ=Uo@=7Yq;aJk>B;L((+J!iA1uVn8Xij9Btx6i@XdE4|F`M)4l>KWpqUgrN6x6!dVAos3pjDFZvnJqN z?;H~TmW9is(ie{|a;|zg37_idmi#%39qJX=A*3L>Y%gyQ4L=*XSaxe-f6>>Ou$z2N z&wXbq1+WXCKV9eA9RLf& ze@uD>{l6#sf9qEY`8nSz^FRC1Ke%X@BX<9J^5*`hAGss8O@A^hd`{?a@>y6K%Q*{; zUu@rhUQAgrAdQ$em+QVQB5sT4=`vK2cWYyK<~!Tbr5Ufu&}Bi|vJ7PK+xM&hI&k(s z)0r3Q8x&s&d%s~lPFEdkgCNVV1}3`~gEw}5dRuf}6S@Y(u|Be1gSIgH1ck*5 zsO>@1R~XjIQI>NHr-Y@=>#u((8${gs zhNw`69dBSy$1homxqw=>S^pLQyXP)(h3P!`4J1-c=W}fx>&HX&ln60`OO3FEksapz zj9s9T@JcfmmezY**ylo5Fh#`s!_hWdQXJd8%%3gZgLZuC1=Ox>DP@q-+Aj&xihBA!<(CViK5g47bYx+#wUtCbw}Epkd3X{S z%+lqQytl_|pqc1&(pzCQMf8!Pw2MZwa=N@xrJowgUY`o-@+A(Ap%qi5fzUOh(Ed(a z1+|d*Kca+TxVI03@sB7)er0C$herP7NsMOJS_uV8N>u97uPBxK#9fCpVq!wtW;QwD z(zQq)-&I{K+hY$Qf${x=5|K(I`o`nST9q6AD3|Oq`+_FPq`s<(VojTT@tmdh%gx3NL@N&SY3Vm;YV%jqbM=XG;rR8 zODt!lQL$USD~eF>r4a^40RhlrT^H#Tnju$m9dKay_>&WA0I_vw=-fl#x=w)C{hY+h zX+e|hLDP^9(IEO_hk4a}T@W z--@ehRPZ5v`Ews{r!{dl`W5NdU#|2Px4zQVKFr|#eR-;_^v}D}aaCP%w`F_#!A-|g z7ws|q1`^Tq6Sx=#5|w5CL7C5urZJ%~xPS6OW7CxKp;STjFIt(nOg+qbvRx(hpC6sW z+GjMvCwK=}{AT<2`i$(v+&|N>gSuRcP#B!8Bi&eJ2Sn@8wa3AQ?@u*WlM&017r6KH zx6~#WB#vxK&Brv^j#T$jzOgSyz+ByT_zT+8^UVVzUV#@zSh%4q%`xwU!9K{)x%}0% zAe{;r4(%{qzCGJSY97?Og=8kFiYy)vy?2v_vH~fkSk<+rxL-8N-naZ=3Lwhq5&W?G z=BK_hoF;jPa?I`jDnPGG#LGWOO6+XmJv<(Zh{gpoI$dl(O>hHki{hmGk$kAnAMIOo zHSq?3+ch~w|G{=ymrR)zlzHGTd#3mKG`Q}TPAX=$)HS*H_G|-Ni?RQI_lTdL zS{!3tR2;5mlU&eoIhWuMe&)N=f!O{4P0?{m26%=>GeaDko9msK^flTFqj z-v5}=N9bp^avzofhqPc2sr$uVpS4igtRh<8Y@bAD&hFRuppGwg^c%u|EV9)gHqIqN+FVQY}+W;4bI=xyd6eaP&8sc#efFzQBQ(oaee(a@|UE5CqHq zU9b!OM|8vw}s)cfBXi76t6s9}b=B%0+^&{@(-_WvYVOB4&v zQD4cQx83dOhH^4OtbBoc19wViXjhQ)roi8$Fxu2KX*x?63h z(Q@5t`BW*$oVg0^#y_5vsLf)lX#Pvw@P3AdpY%_vBUsitmIq4_!yc~P7oA_qSVQlK z!d=jhidBpAczFu@MxijLVUVej@vHNZL3{_1x9PlgJIF!!5?*E4XjmKJa#+anfFO$VAnMIP8TW(6NUa49_+ag}^Lr7s?#&$e*LEPOi zawZYhvbV_w{wr@;nRAEJ{zvPR1SMT*C?PDLEPV&!AXVmXuLC%cYJ-EOht5fLUYMEN zHfDe7^7ecFaOLWXDe!v0qj_uI=@9tpWOp9JSSb=DH|%%Q|U3n=QAhWAL0I0ri=~W?e|nhw zTXUrM zMzyq)Dl_wxH%)WK2j@YdqIPREb22>HoR`ZSi?}USCsFZ*N8j=#tjy#|)7i|USYju9t91yvh>isk$rUUZhLD8d|u-1~Kw?Y`{ z*g_b*CE0!L=y9&d5t8FO?eDLThN+txOgp$abfZge^+tl@9WAW75bnwME8-nr$()U5 zD|G0ve5^s(pwyTDss##fzid3QSRJx2zrvj*ko)FI@N(Bhq&$fquN62bR-i3H%dp9g zH^2^Lhnhx!OA-Y9l-yt|sI%VLt)vHH6GN*|^9XZ1zgec!zk+8Dtn@9`d$d!h66+_- zzM7=dYv|K&Hg1}IOlH)%!L0Pg{Y4=#fte8_R0dY6LE!&ry_D?`!weXNS31seJJ0Z_ zSv0M(3kS`h6G9&s)PT`6gkgv2o8*j*FuDAA5p4o7JTXJNf_NmuA*wtXSf^fzUb6VM z9d8NM(K^?|5m_o$^Iqi^p3z}@(VuC(IS-Z}Tvh^C1`}TwDE)dpgB^zP6E)D?>Rr1U z^B06$q|{sWkq=`zmpD;08Yi-Th^Ert#PA=^5~@O9X$ZCn79Rpv(JD-0l7t2^TQ?+4 zO;c{&KAa2Y3i?&vKk4-KTbI>cpurn~{5%nIBP}JIuy3ow6wrA!g`)kR$9;x-S8M&e zxcJewY+Dv)i))|P%)B)p^O>Q-R2arBY3*c91a4O}Sc`F8ik+tfUWsTgnM#>A|GFoJ_T9!vWcUZxEaMiw(VzChKlip3 zn6!;rjysNBL<*GNw504K7QpOL4@z^O7|`MAK;6U1+*5Ch-i){-^%0g|;{n-XGw8J+ zzwzkbnQ;Z!ZNnp6tUYi}hAX~?$MYV7+vsY(ho5)rYS}zLC^c`|y;&m$8E>F*K?;^& z(72qG?Xa6=zNa<#u7xDjn(!ia zuu(cts_qP7ah_@BK-B|SFHnRoGUtpd8+7f|68DW->#l1@?n17pKZ*j*iRYE(quRI% z!xXqu8`t?x2w1NOwazp1;}>Z1;CC@$34{dvRd8Vgxrkd>j}rnVE0GkGX;Wa7so>Rl z1Ts44BG`j&>mS$fDdKBklFK>cRymp%p?y&=_% z2y1!o`6(Mg4ZNCgf$ToP5B*xu?3x_URJz?7RL>~`oOE3I&CIxqSV0?855w?;*w}mZ zPUgYeulBnE{_$eeYCDcH8=X_0)+5NDJ}L(0%x72@aghv0a#AO;*XU>zT{jl!yvKTQ z=I|Hx`^*XWxrmxWeG}kXrOd`CFg9gRj~yTNgs13bAT8VWu#?ulxMlXQZ=%b3WKyT= zO`aBN82_HtaL2irld{iQh@#%yg)Q5JcF9Qe?=AfC5)y<=l@a6YZW9}5%SO;k-XGcS zErDM0W#4;f$Xk*E+yPGyfN+mKvzy$9WT+7VmvUU%DJb=7JxwJ;siu^GkKLj-?}K7j z&3sawI$_L4JqPs^N{x!_|~yT#_J*eHmP;EUl& z8`&vm3<2d<5+fVdd=_cfhpEx7 zAZT%T2UH40&^Y-iYDR_K9p55f&*5IBvgVf&@9g$PKkk<`g6{s0kE}_yd^MnP)HwL_q~!zZg}68*mGIk@sL&Qs#rfpK8(^9q zFu!jogx!Y;l+Mn2Qfdd=LVcudw-N)%CT!H&kZdx}*_t7<0-%Io2s^br%Ay#>4?XS8 zE5%PzzjBPeo~*jUW1A>@+?{NQemG;=h5y%nK%WPxFrTr4gwb-5E=EKQ`YDZ(!3{|o z;GVR(sn_r&bhfS;FZQK1c;rF+gfk4Ikfmn4MCzrXx9$+)$|US7Fc$l)OJ^K#0Ck== zBlNg*d7ILjnI$TOA2;~%;*S_==DDlB@FZ!=?p=715n_8uN~Lpjp$*i;L=n zBGwEnaT5<@xQ#(kdV(!%eXY{qZzsd+O4MTRNIxyv>yWu9z`ZmBft0N<^ttnBa$V+^ z++UYFjNU!dENDL(ZppX{8D5wDe3Ch z06a%;oRtCs&?`y7RdGHPk25Z5NJd1%!X5A~Bl=ERyC-_6YV=vvp1En4$iNpjb5 z&)Tx69!3$-H%U5papM`o{0dUXltEHT1H17xPj};UOIV; zz+szm3m%12P=^rtJ zRw#8lwSZ(k*+WxBE+#Y3X2P3Qr|`QtiG| zytB8edo@CF$l_us&%g4F%hiY{rVV84Om;gOW~}ZdDv{>9ocak+d6oNbhDtm zi?r-AJ+jvvKMZUM2VMU^+406nNdcw|Az)b&$rCv~xtv`g&NR;8t+$)@TRSqYKGQ8@ zGczRakLYkN1$f{;O|)NzyHg;a88TtYWw6AIA@p!(pq1#{YRMy~j@nyK7?1;Jm>Xfx zwe#+Qj;ff01ukJ#+5_PFt`2M?2H`}{6r-=i6TK1}=W>on`!!=pPoacA(m`VzA0{0q!f zxJXMKP=W;|EFU=n5aD(<@x+eBPVu?5@x7fr+q~4A);oY14A%)gcc4 z6FNtLavmPLQ$W9ml1|GY&>U^}vt)J z8P{QJ97~K-@J;@K-{qc9zl|{K!gu&iqhN8t^ECWsZ0&oeEn4l{@A;SP9<@JOign+L z@!90F6mHVRiR7fOPy}yRdl{ik;2LEC9eVz(#Bgwu3ofG_t+jM4EHJbLq&>0c3?b99 z=JxPwFocX(`X!1|1+-l-GxDk7UJv2d{MJ_j7UfgEQ&zyzubiy!RR5$CFq`z`B;hF` zx`=cre4}CcolPPcsy9s4p+aMUs*JHksSdD)Bw{@~m3m3DF#=qMV7&gYZ&SXOpn!T) zuh4-^4JLaZ8IibI$MpR;k%k|{88ZhilZvJqF&CE3#Y>b%y0-?`o`u3CGiuI{~c5j^_R$Rco_d(hyUgC(n;Kjv5;x0vUEjluMprHdh)8o^&rkzZu zTi3}J-HWS@KwrhSe}^qiKFvR2tB3e^NnGL2q5He22mV#n*JmSv)k;zr#&hE7-I!3i zoUEdI87|cvssfBtmvXrpjh~U3cx-vj))V&R;6tA7@|&YJL3~+=24jV?_ktp&=sCbW zC%D)J!eM0v&3XS6_1Hbimh9)p9li8LU&z4H0$S)OjEEfl9du(%Qhq z>?A(BE4yZ6o*6qCTt*;taL$!@UzZoWkblQ5EUb=coFF54c7INkVaXfvTPvAqo1ANG15$`A!zMHCZJs4rY zr8D1@&H%D#I0-*qn6D|cHFSG!1+E+lrYO-wIbZr41@Yx!nEZand%{Tj&~3jhDQ^i@ zMpX00%octFz8OQ>yf^lCkU5yo(I)R7``F(rK8H_kmaDxxxWzr1{&6W_hM>;diQR^h zwf(0a{_XI8`MUy!&RY$1-Wec($P5CQ-yZMfp3Cq8bHptQ zqcE4Sg`<%wzVD{|b^n3FH;=q$A-@(QM5s%|^f!2TqNd|-(XuE!fXFvO;f>@bMJY>01Wh~0 zhlc4SpNsCYCaA?2(hW{oO5_$#m=^D<=O4ise5PIbmDi(?_&fMu{MWU-!2#H1as22#a`OWpwrfGjsW%$Hsq;tx#KB! zQGc*Mo1@LBHr&kU;*m2}O|oaar*On=)N;{budh(45=)gKLW03{9RpJxj+gG|8<1~{ z2&c%+x!9?W$Z^Xd7+FJNf~n1aGs}4fUQ0dN#rdOsB-oXJ9?~2a;!Zek71{?hEZ1x8y_#h|D5@27kk zr`^|_RPdET(1oB31}=JIdFrwodi4$+g>M=`r#!lHCA0Mz_m11OH$|+(DU9!Ek&$X2 zEMM;GikCO=;~ieb(_#S3J4mF8dbPQV4D#%tRq(EY ztc?cY^>56$17Rajf_7^j_wd0K51&l0z9;#Ry!h~nD0EjZu-AP+)LxE>(z|nQ`)yd{}V97$f7v?O*2l3FsY>G#V2gjtz8hSQ5YC4hS4S#tt zGv#1Le`^dvykcA4vKOLX2E@Wp({EV7_hbDBqE^RK{5cr*T`!nmb^t81r@ zx?t4mylI>hjq(yj+@$3QAl%iJFGnIq)<=t{Nmxzm&ryi5f9Fl1ukp-)2~P*+9!_=v z3pv->wk4PrmaY{^A&(GYMxu{O|IU>=kUat^=+@&g4!?)`1GLPkcP!ucJN@<}!>^BT zjGImybZ%bhNsYMVV~$DNQ@>#>cU#E%T|UCC>I&i$H!T#eFlc?x`$SUU z%JDWVmF{gmfXb|#{@nE=OFN>T-d^sV%2vt=b4Yj-vGx+1tR`<}(8V|Tnn5ZXM{`va zPKE3?^dQ21%1dIiA3N|p`qgh$dAO#KjsDgBto^ ziPi@=#;aMwa+LRGu~gSiAYO`pn`b{I@Z6}H66m+9v;?i<(3 zy$1DYo_P$vn^`|djto?L4)Z))YutDl0-u)d;W$#}3eVxU4enBTh}f4)Zb~95?UJnW zCym$qA+6Gx$etk@}l7^(h&7|TPUTQM=J)h=-V9IO4fX9cRg|N{ zmTEm0-cPPujflos@aC2a`Uvl=MjNz0PVA`9n5xEyt1(n4AMBl8us2Xi0aDSNXRwle z>k^-nHaArXZf4Y~AioTCsvZ#=b1;3XEvC#R@wg=8{cL;aw)rQb82jOyug5WrWztiN z1U(=J!L*d+Tp zB`YzZ!PN4?~Ev_zw_85(J{yK!7MOmOvoN2V9SqY!HaD z1p%UHLx3o^e*;mj{s2)J{{T_kCOmqwEH$BQ*%2#A4u8n{B1|i%)zRZ2w-)ytz@_W= zVbHR=U}+L`I4eGrc&_$r?~5UKv!HMnH*l)*DqCqR!`z>SUfo7?PP0%fFB*;DnO+MI zbO!G3?h198GG+#)mR!=wl>Ju!vl=^xoaYS!Acf9GB-y|HsP(WujyrzISR$i1NwJinVZA$NCgIwl?YyH~LE&~rM>0qq|f=T_j$06hK!b;}r^y{#N*PM{%w zp?Ud9BNb?JLRMYOU>oHDn;Ry!9S$UzC4LU>G$>M-wv~MrRY4K*lcj!0N$l}%HE6UF zt8v#N|A=qr#?%nMD_OK=1BcYXBq2NY5^ljd)=cK?C3hFB@Xe-MLRFFtRVMks&bs1h zsAbK&p)l=G5MJ=1$I9HgH`%QLKsi4h?ob*{a!hW3nFb;K+1CQWKCIh=*YC<;M7jLr z_4r$G^0iP*X|xvXc3~+vkHyzt+FRWak;&ax(1IgGxII~JiAWsbw-eNE0*~V^uj4Wx zkjgi+{5ov^)$xoJ%K%Hw5cZ z7;PVn)E!bFE)H}%EGGoEr?5!a9U8E2k5v$f(w>{S^-+%4CT3_#d~9u+fvdqmbB!7l zSbAi+J6SC>m_& z7MmRw(oGviNf?#zg%Ez8hWL4XQwVX|q3&i5oowV%i$t`1ZK>7j`zry&1^x*9kU=Ie z8!E8DNq(eARr2;WquK9nbh}(2rhD0dU9!FZmcTpH0iA-#eM?8m>q5oBC_h&~ zJeRStaa1JjZd$^c=l8nosWnFUf#asCDOwAR`VE$wtt0`-L*ff1*2FxWXMrQ1O%Ns1 z>+x*_5RD7F@hfni`=iZsJB4pKzOr)~@*0(8tn}Qm0MTU{Y?ex!$*s0^A6__J0w|O2 zRxAB@H5+~efN+Ag#G{}K#u@C@l z*9YMf{tw>M|D2}FnG!%R{Kb1}f*;2R@u3OT2q~}TK=3}xwi$%>Q$G3v1n-CIPqljN z!+Yd`w4W&{9oe#4_JV2v)rS2DTkS_+4Xp8EMg#hOMqsVmdC+rvl8FJK3jpTM1ikm# zb5c@*U)1lAui1;CWRKmR(d(t}4uz@tviK@2f>jUPbD#hU?$cbivOJ z%7jSJ+_b)|cJh>VF?v2PF~1vAX`(hX{WVPwXFCSQHo$SZ!ns6P&tK#8rHy=nZiYJ$ zk@mM{WEdZwwFuI)e5~C`VpRw>3ggQqYH_ts7UDnKw~t0ng4 z-tcq;%aJVzk`CRMMXm0PdyS2E)`292+%+6hComp{xkBP0uFM$&BpzPuHhi|r zyc6P;h#&87S$7+EoCH#_8&GY&?o%W({WgJnJCbrYRQ@lj&4=iq4U7rhxWU~SfxNFq zWvJNgCawc-PX>t#{8FiN?)CG4T18jrd9BvKAY}=CFJX9A4ZBl^Uw)AZ3T5*Lzmj%M z3b}B_T;qRf%;>XCkhI)z!)f*!o4?^DBFs4WjkGDk0FrGhNtU{h#8tdYY#Bd|xqsbt zzdV0G|HsU@*aI0IxW-@wO!c8t}@Sm)xM4d(MH=4w9$;3f+T#PEsHd3 z;Wbgl3RI5w+1?txax+4Op)| ziEsl*1VY-yRj!|uwho7NVGk%voS>b5YkivVj|j@8K{W~^C^1*Ohl3b=`5fwi0aZAW zv!3*0FwwHY=~2Rd;xuWDNp#sv%FHN#+kn<{C9;ff2 zQy=R0BFW1T<=r=f&rx3e9T`>a6OpZ6DcNGIJ2WF!?%y2pM%U1F0gjnNd)Ge1?@0{J zZp4jIM(+5?S<}iE<Tzj?|5&bi$3__q_=CwX1K81xNnM)Y66 zggb06u!RYk8e@0Fc^=~-fDnruSz!+Uuu$%jX4 z)WBqit#UPtl4ui@ylW9y`F2u%-8r!}2F;fQ<~4=xFZ4EH8STAo_Ruba`(VOoG={`d ze)X@rDX95W<2Em&{CmZpT4<;PQ~^<;`#+p)I_>(d zLXv4bAu+t*8(o@o-+DLjd6IlM!)3KyCu!4+)vq1ULk&(onHUIhzn06O%6rj6{QCL{ zYR$^%1Y%YPwSEJf^y!tMdHOP3-$G$}H8F4RN3>xBwt+BBwV{MuYbdYn6{L*lzj{Mw zbelLWFRBp=3+hPROO5y#gT5br(H!|+%Zh|?(#EM6cGY|aT=6e@Jx18TRGSQQV+?D= zaw-k7KL_H^5CdA##cdGwY+Bi7eB4?zHERb?zwh=a9n5{1`an~XH5@y8&Qii;cGStJ z_9TUhBUEVUdhRxku-OW>1Q#(;QFf#Q#a?3Q`wRi^hC#R6)0h1Y?%Zi>_5x{+J1Tf!TMTQnTQ zbv_*a(n)#d6WtTC#~GQxdk+LG_k-@IU{qW0pBiEvfPJ!L zgMI&G>(?gBr`a#PPc4)x&V!!8+o=?HE?`udTcWDzeaKJ=nk3cxQM2gMqGd5QV_mty zhH1JcwFA1JYif6^o1S%wtPN5UG=hJ3#_ma$|~usy3hZ#+lP)m!OCsmdSN=Lu6EBMd&+qeMAiJ{j}KzKy*i>>lv}{Y z6T(qMucO6ffHz6?D9K)9wu6f}UQ*5@KCb-1H{T>MI{;;&6zLqq;-yZff89XAUmk}X zVf~>(C8&qJ?uSBVlb#Lxj&sYXV?tPS?N`8AMsA*4c6CgfN^Z!-@{j`>p}G1Es!?zA zvxo_=*Qtv1=pFF(5hyuNVu1+aH5fN8AC8TP`(>IaZ+o~rNwr_5J#171 zW)^-=TmP?927}yxV%+aThQzqJzhWGqY3FnB6#UU3Y-faVH5ixAyVErF{FKp*sz9qK z>|;>9s~`U-$kkpJAj$}(Ym2Oo+>p2q)jQ(qKOz5f%F6Fz8YPCA!vuJbp$J#UD{AnM z`gbg}L$Q1I>{$jKK&w!PSOukmOvlP^t3ZXsxE&xT6by1TAo>VA;45sqPYYm=pEj3- z%MuA( z(3t<43g2OQS^Y6)P#hvFun%1IXOue2ZCrQ(Khq#3qSzDyoc^2OmM$;EM94u|u7D%qdhc=GXg z`a7|9|1yl<;i5YLSe69i1vtpIY5yx;)MK9bAFuJhi5Ui?d)PcC>MJNt@)k$VWb18 zIy!u+NzpxA4R&0Eo(9mlE$YWo=i+VHc<-}JnkjsaLlszlJrK53EXk4k()k$f->d$O zN2IG^h=llvuoBmW8zQ0p;3X=%-6Z(|0s34!j?TB?pwC?ax66h+sZXtqB z?=;&amCC(d8HSk?3!@AB@+eiVUEmwmWNUpshwS@zJ^NAs!VAGwfwTh>GhWron3vcA z69^uI#ShgT(ABaMNoA}W<=`%fT9D51B6D%jVZFUB1kp#f!)~hk$S2q-s3!MNgmmTe)u9L0U=q*l60Z^&D6HpbsHH~%njb4cvSxUwL^Fil7-Z14$O6LM6>Xjy^v}x;nxx^sIE15rw9#t( zayQAI(*J{iPj>rS&szzxKIhUYa6Buic(k>V_PDa^F%HXCY?_rV@aGHIx#_f?7u`af zi#{}2(^McV`=6$8FzuhFFkE0qrf9OAnp7$<|4wi`2F>Ed!_~#?hYEyYUKmG#;Wt<7 zt*vPl;6q~CA)MK9k#@yt3D5acKbL9h(dY|C^wX+prq0d0(w765fkVHJ{>dElq6+AV3wbH=yV8p$f>e4r7Vm}^`xQF_Y?32UB3Ijje=a)syehMijW(-V9o^1OxuXEgtsX*zu-`+{S+fZbET zpk(JCL%HS(z5&dj=*Avxf41yME?t1ykDCh%p(5y=xo>vgGgCxm81?|fPc0RPq*l(K z(O3j#XO3BB%_bauk9^C+R9VrQJa|BA?Lr>mc)&2wh^EMIv8wc5^l^GX=zaF7B_P_K zIjRYDBTjHaLo(o531-#&6fAN9XD zY!1ZnNb*V@Ud9Po)VbpWI5LT_J}Nsizc4BxO~hYHjqo*hz|sHrO@NgZn34j>+@GU) zBK=iafkEed$!71*O>i_Rz&#PK=lEzp@SKiLOV8h(=ZE9*rX*nm#YEA0bCJ^sp;P%STU)mVEi zu_!g^PA^e;|H(4MiZJumsJrzz1`=-iNyY*tqD3fgB%DV&;Q!y%3co!j2kTa0nVmHYa4_4gZn4?c1~Ez(1(De!Fn)YzZ1 zEvIF(!LyzF>ufJL=Ar#w-7(7~ORmp~y=)S!?Jt6LKO=wE`+Qf~Q&0J`omP|c`sPh% z%8X9Jl>$DF5#VA=SYk||@iL+tilm>o!uLJGVX|z|$61NRXQjmK$58v2V;73r%@lUV z3-0CAdbj2?kZgG|`QB%RREDMIA4}+wXkI}f2H#!~AotrVr?44Kw?Ak5B{qN&nv~L* zVVcbZtVzHgn|wBKzj-gPXY&Ofcp`pjNM_jk+=@;s)8Cyn3ujqY1Y)>-6FSPDt$4uY zo`TEOtQ_#7mNg06o#0jqWfc9)Ne>Gq%F0{PA@@VKYpGW*!iy}W#C-o+Zhfpf%zz7Cr-ng`W?y@MXCZY(T#CA3cjh zA{i^N$Ee;(W)fvh^J5Ba9z_LcnJVOK=h?X6i?DTyk2_*p6~7@ zTM+Sp`cexUZybMj+4B997#~SmgLB1|==C^@6fK*dJTg+0?zzQMyjhw-c*8`9WVVss4ag?^L9+M+QaN5a4nH-hu^>XhqwCKENnY8&w zgJ)?rv*85w2pBVsIpIzEx_K!*mU-%!+^x982~al0_wM$*d!oUYJqbcbw1j+;D`x0k zWZ$!0#5yQ1O&s7H+9MkPfTZm;BfW^L9W! zhv?Z2*H;&k5|8{Q;+q`cl`m>XE#31oUj5N0Xf?+teXXWGZ+4kIQjX&wOkVa|pTJFh ztJ2*@%a=)k9@i~kfpJ{6ghK`(nAmB=NN)WsMFkF$9Y|78Wd)KqHo_}0R~PW17kHqp z8KewJG7e*Yp&u9Mv{rEqxxae*dY4%@O>t{Z(zZ-YIMJg{KW>fVHq?meHGCmE&-t(F zfP=${8sCerpQf+Y{fJ6R>H2v!{R+pDUlvd@ zTu1Gf3XW;J(Onsws#iwCzp(bK+E}31R&}L#nKPJJ(Q7@bnS{8q13=$jiB?xuTjIQ= z{Vjj8e}sNQ0}-YxRAa6gV<}iGLbJn~s_^Gkuh`+d2s7SEpU;}$wBIGaGN3sJ~nmtwWM=&(NYay12ikp$}%}PHgA#vr<0V-Nt-W-*%)(wthR4}4m zJ^9Ed9h$D&YGAOMnvmu31Ieu!Q8(`YoX`Bv$e|VgZ@zpXJE(+1V2JTrygshm(tHG9 zFoQ_pk8{-{j&lB#ZMC1v<>_T3C!c_y4OQg1Vl9qBX=d_fN` z!&7+S3PP1fDv$_k7*WNU5wtD>v)R$rG!@&Z2fbB0wGyYN+woihARjC5D z=aDoj&PFW}{|X#!D)2l#H2`yV-YV7EgUKn}&g2x!=xepu4SSxyBS(RMQY9pEWQr^8 z>;8!xS&foy{$7``k+J`IVJJvIfeJ7%##k^N%GBExG=mTYj{~zAG?|YNZk(Du`BuX=)4i!zQLkW>K34T7>R^AP)=Y2A;~br@c3kvu8r+gBy0WZU za*lI#m&IugndxgHjfNlYYVN$(tZ(go%xB}#zgBAoY|1)p0fGqb-ydF zi`HG$Z0bxiGp<`+MTe|+<236pd=|WyE@-lE(mzv*-0hF4T{T7u;dRI|U5Wk{HnCaW z33vnZ(!Tl*`nD&uJkVN%>eE@WkQLrR00!X+>N?W@_7~_ZpjU9|C&t+NEKVaEIp-MZ z-4P|jD&ao^%}}awJaC{X2Vn=>fI^N0f7rpU+rQbtN3{9^SAosSAUjx_!gh0`k;Mx1 z7sp9D`lR2(EZus@JaZ#-o9j0_`1J9~Z+5Wi6ewY6Lev78W&#Jl$C>=#I1?8Xyuk*? znM9CrW&)LSwcmFR;)+59hv)CK-0rWXUFww65nu60`5F-qhg5yk^T8IWFrw2$y;9D_ z1R$e*S$zMUOSEV+h~Uk%{B0yp^eaWtY6cOP zCD+@5>=aq1$i`&s!C8g`s`H*)b`4(V;Vog9TYaIWOoYt$F%$-U7AQg|ZUOGNBcVte zg`>Uk>BZrE+VEUHy5CKh_IjL5p zDS0lB`jbk(x#b$Yg_-v9v?Eq%eYf#4$ zVe;9ycXPAX)nXGtluOAAI)(DDLhl(~&`{@Pi1F;YVHRG)Rcu0$dby;{S7eq}d||4_ zJ3m77<&h{V$aFLw&5tW>Kldn;?M(hO#jX>Tx~xT_QZU@qU20UqjMD*sZqQe>u|C@^)o86*!bL}#5jTm&72iz!oYqci)@1=AP zf?WZZZLvM-#$J1EQGzG! zdXxO@cn*qLp$1IW9(4<8M)WbNh5=xHRj8^*Hp-*QE90z8@3mf{F{lw^lJ67&0yT!_ z?}o}8gjmj2e|9=Wg{|x4KGnf2ofkf(LccRumfxurMznz4b9l*e8i^S|A-B?-NKMW} z6u3{#h5(%`h7;}q6G%#KLZ~OGa{G~b7HKj_*8+!=VoUB>td>wJVns6zRWX2HqBY^l z=tt1SIkLK*my)OD`Ll%j^S!-RUHqlvm!!$!4``UsJo)=ti$oWn1yjG!50$@bTJZNh z*cOCH%KVanVouEvj?Gj-Q7dnpTB{D39B;(t#@jN;l2@;|K@`~91xC(B;G zJ%m9vXko!&20nfP?z9!r+92WYQBM|v1+O|7F+nKPB;WtyKK9h0Dmm$-;hykRHFPm~?SmLVgD9Oa1-5Ww}E8rwLAlX!kPP zYJyT7P*uSnz7`%@JVw?(i0>Vb8j}RGt@7n!0jQ^5;s=B96CW`F6g9V(L4rj3>IbDp1i$@*r`y&P9_)RI-XLB_|i{2siQ7 zZDH0D#j(sOLxtYG6j79bms}@0)ztq~U%#VS7})K2sw0O zk6S|+u27H8*%|C9d*oel{M&I0;cpt>Ud%}0exwR)R?utsrbrNUK>JyB_IuZ81jFo# zfyqT*wa(F+7Uru2fexb_mDL9AE!dLQRQ&@5qS3UJiok#hGz^93ji z$lie9^INFb3KZ(K>}6ZZ22}yEs(h7icS~%$D@5PmFG~3G4Vcrhu7R!AqR-tRV25$v zhhCeVk=nT8i_@`=l{l<{NO3{nFMagO@7X@RNmdluxYp+43G%I%eFX(m0V)+a)S@x< zdI|z^sEk-Y^zi{>U=$+H%W%&1`9&f`o_8~xP3mwVcq%W!Q5{WOHzQ@gj^)}?+i@f8 z_)X)iwu~VZej6kEEu~_d7HwVVNt3O_%a$)P#}m)2-8kwIcNUVK3ZRIOp$#Q>^!Gv} zL(a&zDWE0D-e~^nc(AZzetl(?6-s$x5exkegn1PJF+xZ}LRi69pbj7^&#t6L{(I_t z4LMokP0zwikMa2wvYVq##qxZvIj_U1H|ETa;(f_ts#4J-`QR9bOowo+dVC-yfr^|8 zJ0Q7loF8Xxx7-uo<>$`3nc?frZH_Ta&(=z|(~8&+-RiZ>@02tV-xz;>k`aLm!;JvjmrdMV5*Lu0 zJjG*Y7#E1W1ZN?EQ(z7}G5$i2o;vKxt{*Sqh&UoruKuYCzee4q;fz5?7l3PyZrbd6 z^q#)>6__>2R1i~x2$3JT^X_rY%mACNVc9rZ)VYcN=y4aw?q6eM1wY=oIU#C&$R0o3 zH#QT)baRZbR59Pdc#XJNOwu_?8rgJ^uBl1(rUbp4EHP9=rYs!aVxq-Xe^4&kPR{lf zU(VK^)Tp9dQve4j<-suj4ir69!m4H0wgv#mYouk4j4~YCjV?l9D~H z@xU5~sMc{$RJ_e*jA2JUmCNONCgJEXHG$7>r&COgRq~D_37w--&=Ttfo+Be zbamn$$Gdt)bnzQ|{ztL-!WWN}daqXHMSs1!`z{cU1nvi^6M_uB$NmbDRNDul`-zZ5lg`ZQHhO+fHNS zZrs>OW1DU4#&(l5w#_z;_Dr8=t@VG`e)kyrBiwV`6Tj;^&hwas-h*An_bUevt0&93 z<&CI2mOf3U{BFVj(Tt^1(Z_oD))&06%^#G0VNk=Ll%``LUDH^Ry$k4bbF@;$NX2)B zYV4RThjXxD+~CX+gP&$p^&x(^IQvp_oEFUISJ9)RXT*CzOHMZ!M?Ef^wI%>`L@1_d zY7OQIe>M|}-iUv|vw3TI)YHcY<9;r(t`~nu{Q<<{cou+hMhW$Nj$GNcM=V0$2Bju? z9ZhF^VuM4HXd4dG#^i<77k%+Hhh8p6U*=kMxe#0jDpogqNDz+d;UFM~rjI^f&7pNy zr4~C?P~FR-ZR#Dzjhu(62;s1v%onO4+qF7A8$y;4pY+7rH;j@$VvK)nPmf!#aj50`vIlc0c}+HI)f|7_~v3jF}|spvy8?ZBM?Fw-m_Tb_)x z=XZ;%4KCh1st*k{2G3;`NBry}Fj4z?WTLs;O<@?XP(@21Yh}37IB5|)h(^UB{|c-Z zb4pAH7F<06`rRg2Jp$OmRj;V)l|%W&lp4L8BLZg{@dB#QX z;T2^Isa^Ip;dGdx2uu4#5L+6l;lYm>NM~|ktZCA;ia)J88uH*b#-%F4=`EmslmC&} z=H5FvRzEHH1?!fa4x0vTCNAbB~o> zJuTS2%EfWFGz9Bs$M24B-JmGq|Ke3Sf8(UpQ8*=#tC znJEq8(vdL@ir+0Y5%)o!dVDvWjBTq*4R?#t!+mX;n{Q13rCh(#Db&;?r(IXbO8GHV z4V4b=iSt149)^DoRk_B#de)NVZbjd0=jrD2=|0>GPp~W5y&nI%-)IruJQ|zvc*xYL zVFJ`mf>55%jhsW3m*PcO+ZbZf5NDxqIcG)x{=mCCwI% zQ8I_M&$W9hmCh|*jF7TKe|q?UfgoQlen_V!Kp}s>oa*4zX3m-~2>y%Gz~`ugsP>r& z44!d0_x*C46VPBrfRPAmg$_NA^N5~c-zU8X2GWBP?Z@_0wudA-x0Cta9gLn;FSAWO?{Do>E-!9(7u7dFe3e5?|)xf(iryv@4fr z^ap-BUcqpv7bCh>SVMd%>(~M>j@>Vm2p|0=$ZmPraAiu$3EW>4X9V0?5<;N{a_O{D zO-?fVDHMo*+mtrWvtm7?-2j+K^T~3*1-}r|8J& zy(<_6ueqV$Njz*x_;=m2P^^3zj~~1}%2Ad0GrS!WCMmuiN0xvk%OFsZUg#M zDi=0|C7y2@B)RKQQ<_G!0oN{w`6}wu5uvS@uVq#Hr&jUY*RQ`mB717_nJjY`XN{E1 zyJr;}1Y`vMQxF6GCW!e82x7|7x2tJPzVT58y49af$^x;zb{TY22I&KC;63lS-j`G! zgA!>Tm1?~IlQR(nFNp0j=A8%^!{-7;A#!!>SzMdb-r1p6gn6SE$`$2jkjbGd#cAXo zc`a{BTrBG4c_dS}iQi!zF_QCgc!YPwB|*?!0lg z1ZZXaHb>Hu#=pBb-~0qOt;;VQg1=B~gU=i*gCo?Xc6!Ji- znR-#OPQimblsyWj!-Q*k>`*)qd2|x)$Ktz*v_N&iruM*1Hr`niw`um|bdp3&?DvEw zVHr&y3%`9wT^Aaq`IR)uF&7Y@IiFhts+Z^B$YC7iU2w3!Q9kh-DhPr8QuK-*$N`nM zie=nw#ZzjzDn5qnYG9$bkN2NU{QrINvheTXMR8VG3+}|N-uvRFz9@}LPltrPBHImy z+qUn_9*s( z@M3+&?@_N!8l+c^gJc?KYR;@!_^JKLE^_HR>m$Q91B+beJF;J5O}F(A?%$9mt-L%e zpIL9(tnQylJAYC4{UD@ZvyTHuj{j4wIT)+WTErf>S!hakDV)Z_4%K9SPTH~mWgPq4 zE4=i{*U(KSX_%eEsg;=+zAl32E9b)(j#gjn^*pd|f9^n^Guubpc?z1bu1tRay4*h} z_^tTMuMnu(IFWCi9giz~XG6y{>GTpoi4ToGg|b74r5HJfJ=)zL!lunT@1Q3YOh=yM zP-Hhc-OrbBLB+`f7Q7FI0X2ol7|qNjYEtE5MuCupXE!F~OpD(a4Z$x9<6_WCk^!k7 z89MIz;;;)+Irf*x7}~1Ob*4Y!EeTO+#023QiC4L5M9@|rErL_De5TQ`S&?>#ec-;4 z2$vFV2#a9E0G`Z|-jcBDs-(w?;Fg9@?|CtfY3|{tIIok)B{SUQrO|~KNZ>ovl^gT< zwavBQk0CFGOj!@$VNM0lIN=iVAC+Hwgekvx5Hx_6h@ac8N9ebH)KyVcIbh5$$YHl* z_$qsA*u%KEPT+{z%UW*d^EprmnaGV103C;*0!=-^6qJ1S;2B8Zm?nHVg4kf+jE_-R(@su zSOM1an+#3Pg?77B*I*aclilG)$fxM?-?bk``!GB>=kBOVL!PZ0eOD0uxUp(W^;(T2 z_BduI9H%!6RKl8Wz3RT73ZHqLm+#%u1*impKC>W%r>g7iX=g{y$Lb8NCRz6t*aGoA z9=DTcm6zL7>a-{v`Z5!yOWc4|JF<6T7KG#J1ewAPQq)_55ilTWO8yRNR!oUgo{14d z(;Nu>ZJ2}wupDxA6=%U5c3p4$iwUc2nhuf}^D(PZ1&F+6r{S8ZKC$rZJi0(6f*cD_ zyp@Xj?mUK%S?|>k184)ZT|Jj)1R^D|y^ce|1ZIS|aqByD+L}^y`(tlVd@=^1(uwF+ z7-B=!`c20R*1n%e64U2RCaG2UJ&7OFjd-x`p@)gcPc>b_q0D&pLK!XsUcG|4WJ?LBqW<0sZNR}jNW*_KN?gIVe40?@T+x9q z|5>lbX8WZeg{~-_iFA&9uoTbPj&Cyc4J7$OmB4l+b{(8e{~`i{f2dMHCe#m8Fr~b{ zF{Y3@{Oi>*dfO6!rb=6&^BMlB=MP34%n_gdyCl#nvyovmep?bWwl%@D@l&LYU4V?v z?>a|m2UXD_wP3m^Q{W@ZYm}!bMTW^Y3Ts+~KX*?Evb4ut6X&SOmnM}a3n>;#Xfm|S zmKAuXn>G{)ghu1|9|XtiSXP@9A1f)6g7c${s*AY^5j~n1Ygr_cVlmG)74;d)a9iV} zH@EIesQil5BZJ&44&lZuZm_`?5d>*PE;5{BFRQ`xyu?i(o`~ZZ4VysCq7Oi(Bt3uX zN3jKQ-G6!vUo47u(?z%5-_cy$T3J&27>=8G7 zo~}F4mo6@xm-+G0iFNn52J6@zsT&S@gpRJkHWuLxCQf2>o{Kd6X}*3rjGzkyZ}aY$ z|FB2?AC^1jzspg3cn91>c(>sf&$-ksd~n~mk+qA*^R7}XH5_0$3REZeCsYGA5Nx+f zi3}D7T{lT-h?lLE-n3c+CL;8Ty=}vYc8jj^aY^lPP9sma8-~VYpjUf5FdEY00JK>> zr*0Pq7(sx%r=U^1KO2mN-^>qG(zBJ*r>!v{?pO+dNJn)AY02aL-M2PO2^BL)t>n_3yS z_=oJQqP&lRE(%C^))|096Bt}A%v3x2U3UFCiz}CV7i%Av{v(mXmoBCQ^~$7vmf4tC z(OQNh4R!gNe`w|$zty(hy`@Hetr(Y0jdSsEc$NG!6g9tV9@xqedUY8{CQxUM&BvQL z8=q3-%2}Bm4ly<*z4o1>vYM)muj9OEfbz2zWFjLkBGK>nF)IJ%B)>!)Wog_?63j!Y24$7^5_>&F2W*uYCdS96ioLu=kH`d zDD~UQ-A`nI7dvpLFxh&)JIix>_NL|d-fHjudqyrYw6P$w$prDSk3c>?FJANl(JKwpKd%RyJnd#-UB3f@w$BbbqJO}E{72x;LABq3j0#|_MpDQ4X{Ld9g*!%Yi48WpP#>pM0sTn~iv&bvvO*jbaFo-!{}p%~Twwjr6A{IwyqHNv0eV?@H-?~f)bNFvUkCL&k7 z*^r*g+H`FhVdK0n_9n*7^g&f{qTJs&G++oEl8q@j+TY*RZNz*o!utVf0dthOX72Hj z<+vmuC3v{u?87HbS!pVoBAF8H8awjCUS9n3ycR0yc2;9p0(%+eBo*W;ZnD0ZOQ+fO zw#51XRifkjb97EUcqox-41!>Iy7UjNA?y~dZV?P@+25hhz%(MyiKjuFH_NzT%$ctR zKU&Vs7k+p(qgOvY!H&xwW|k&ZkSYFPyp63P|G<0akT!OVX7E{Ld$I9K3cvURd|*Ys zkTCF3X!nPge>XFf1ACGr)}Vwf(PPa)MfOlB2>GePMXx~{`YE}sn>&Ld!$yMO5%To6 z`X0KjfR=Stq7&&x@bm%bmuJ$Xz=_eT*`F=UZuUw_mnDW ztYk=JDY3uG=|H;SqVh-&9Rqmp_$Iyx|z#wdF#V zdL}{MvgeE&zt%iQ#)y?%2O%i!YCh?TJS@44^C(0>UqJ$&Wy>!4alo>fQs$`X~Kx=b}cwI z6PXw2kpmU{tT&2L{g3Y=I3!ALs1tn?-=9!o5dI*bnCSKgvx1n52~cyvB;%f`_{H0X z=loY%`_!!}n`XYY^FQcBP!sN1-l9zUwq3&;WIIqT*X&irwcXTPvC&@s+g*r=;qEhD z6eZCD#=e=Z+US>htoN$>Db=A7TZwSr5%VkPchf5Olma&uy2u{Q0m@}h7VZllg*0dZ z4$upZLc0bnSI3vauVQzFrn+0?eP#Z1bm}`glBUeNJjIvLkdIU=A!k!d7~2$JGCMbr zcc|rJ6E$6<%TCD~AJ`iwm(-;>X% zoTDnsePD6(Y}$jIZ3#r`8)*pc(FPsL_(P50KuX;jNQ)+4uIW8X*=%31(Xz+nq)GR> zqhHk}f^Wq7gT?$uA4Xr^zaC&1zyn;@`PY}mPz8|Mb#J8hn=kGDU%SLyRQa1+LPQ(z z%{h=e^WwUVd8e}d`-ODAGOJY!`umAA@C1A!NqnuD&;{%g+U{^sh>gi?`)mE7S&&u- z#(FE~N#OS(x;)e+?O&My;F1YBCIshxaQ}db$WYFf7cpy0F&x=P=1BZS?^Db$9$=Ut z8;1x*O99r&s2-2@b+~}TLuIXHj!T7`g zIIuiqASfR}@hj6ep8&(eF)v+&*1nj?2=YaL7jO~&XV3*Om;Vg>3~$xp?iP|Qga*mu z?NiruYyjrc6K_Bl&f{bI%_P8F_9X!&akv^(_@d_{jgj1E^nV^2sM9|P_|T!h2Z0bf z5$V80NTE38~pwPC_1T+ZXXcY;}{U%qvg9eo<8Xd9yMK z07h2~%uIeQA^&x3{MDNNpTIuPrHsg+ao3xs$^g%LE^&1;>`g$4aDuIUgFX51aZ`Q4bl<`AQ!!_c-rW!6@l}t}Q4n9MBwbCc z+lW-m#9I{1tl4Jem8Gq{;|e1p+5Evk?-_!LS+_RO>Hqx?nsWK+*$vbDaFRY8NT5Bb zXwr`vNr?Fj`d zkDgrCD11vL{o*9kB2XJxyMCRLRhi4)Vwk7E!Z`p zhM}whb|0*AEHC*>c*iyqf}86UCC$IJzJEUUu$8Z!xB^@(ZNsS7@O z-tzcG5BA7i-hW^ZgcE5l`NSHWZ4=rwYJR*&3kPw}{v&ZjvwK@3@+ywt*F;KP3Sl+n zqZhF@<5w+QR-7e^9e7}7-t&$-U>?KoXK45Dj~3$XNx`~#K8tLbJ=dVLnwZfK1YjS^ z8aA1ot3*p-V=>ISy&NMu85$$N99V0uN&5L7dqxY^yR_R|GfHEjfw4<{^15E zn?OLVLF=bCW8cqKoevBAhFy;VzxJ-5D&!`B8`d=#MUOQlFB%E=45*U(vW=)a0o$R2FcsSDDN5{YsZGY00uf=}g>oW}04`aeMDD~54?JyX%yZ+SOP?^;y%;Bn8uufLsay$W z@|{hXStMWFDQqU7cVvUQT=LYt|XfaTpK<}@AEyudNg#S2*0yN z92zwsd$Wf84zq6QC6)UjoF0EmTM6n9w>39fg{|)m(9UuUBr5)1npj5U-#dAaQOi6JF4@N7c!5} z&H;5y9bVb&PRZuN!IHMovVMM_RcNOpd!D{|PK4`?<7AEowH;qoSrHt(t&uZF9$q)Q z8Q-Bd31>*9VJa)*r;<$UB(nJ-&?-^=Pk_XbL!yM8Q_j;lii+9IZ$P z@%eblQI-~WE+2xe=n>CcPFoJz_Lab}_*fh1X(zm}<+b?2Eko4kFVT1AH#S2~9>X|W zm#!P&-s$ZcKD9LWntCVuugb692RQOz;3?L`0_EQdEAbeblhHoOI=MJ@CpWhDbGCsF zVWX+?*$U-y8O{vI z#ZM|N)hZ7-fLxz$zwEuZ!aa0B@pF|n>T9qjh6_O_u}czZ&(hM|+2_TN>%D578%%i4 zgLw_j_vC^ZVt9IA^ixpk^^+kAQm-v2OP4VP;RC#p}Aa^g^`#P>?Oz(P573 zl)v@)!9-I;!TXy;r;zgatbNv$cBp~A3Hn&#?HQ=n{wjC z<`L5sdKj$Xq=UBayBeCTv7{7|sM}ZhBU%G4GIsY#FAMx<+AxQ8=$8tlbP(h_G4HE0 zQ0dHF*e8CWJjVzd#f-{k^hq@N_PFB8C!h}qj^u(X9F|LBaJj_pQ9?U{;0+MYd!+d|T zH$Y6ecp`_hCX@Rvdn$jHLP7{V$xBABiPePfPfmoMq*A(u*S0Xd1y4ysK`#t$Me6~Z zA16dL;{Xw3;aH2v!*SWvK6*NCrpE=8-hP%CF$nf-{}7r@!qqXnD7WMMq`4_Iu8KRz zi#2gUN^^0~8SjNQxBR0CVs<5+b~{@n(_?Q*ABaUAPw}y6d#9_E%pWQ4%UnH&0};(J zfd$o_{=DwwGsVyyC8gamD7!aF@mk;y^h9#c$IO4L59>&|wQY;kQ)Hcscc%$whgFx= zJ{R1va#k8+o*~&*jb0dfEDll*hO~uyA#;wu^!YvU^`+HXXtJgj47WwaAv}@a!$;ffUcxBS!=nXiTeE!O=(u zt=v@@VQeAHHV0qUN39_INa$6;M=nQCk%N6w=IPVkOJWMzO2{*?o}p09ZZuSkdiWV) z1QpR52i~f=%5)=S5Qj{CZ``M&x|=`6ozZ;H!p|=`F{p2|OB!q}p3c4#0sihIzii7d znD*Tc%w@#*P!NeBjQS18`_)|T&z~NL!SJDs+4%_F3J$)GS?LtU`$YfIKVP)CMibQH zv`p!|jcWBvc~%vhaYxlwZ4)<~>?$-OGR%$aQeyV~pO@=uc-NLia!eN)eZLsd{mQ4s z4CwFEip@@7;zQRn;s45Xta7TMB^hiE`5M*m93BM^^pEvBpW4My-3RcKxL;Hu^qR3h zLc4oag@-Q_9PzvqjNWifK0~XP%;u2j`1IiTsqot##M=`q0oC@$#F;+fX33QsWf%HP z!m4yKt5H_OvXG@y0)9FHDe`~IJ^%R8Jc8pzbPd8ImAR>? z4T6DG~}l@a~IT-6<#iCNHWj+8>KKr;{9zh5|~o$3-Q|9v9^= z`Jjp>;}n_3(}S*^Dv6{N5}`K9+l;}M8X&hrzqCoyI)s2?@g?GpA_whN zmmGC|rsdQ-0RKwdN|3Jb4~5GET^4C9v=hp`GdAI;WYC}0Ui|A>H)IkwqOk)1=&*M( zNWR}au1h4@by4*N#eE7T6cmo zr{$U~I<)dL_)6>v2FU5}`Sf8Wbg<8LSVP=jJ>XwAi))J7HqLO7mo9^X=m{>6Gzs}p zN3DzL(?(1A79mI`lo|!MprY$eBjpqj*|_;uqYpthJ-r9df~o~B-_=9760K_rQi6w- zr+no#Xh13{gGS;D1HX97pA^P0UmNd_I22_+HHFB^SmO?DnF#tEVYTqYheYDDk2VPJ zIGt!y2)&bccsTar!64;^9BlyKl@OS4NQ}MZ0znWg$R7%mLduk5tDWs^WF6FWAbZW* zzV3rY&zH0FxqdGlFFC;bmo3il`1tssoi*PNe_Rq+dDwG6yvr;k!mNO2gJh95gAxqR zqed_t@!7FPaLiI%InvjWz~95zHo#tPRwz~bUdyvLhkes`|B7bcBsp2PCvU7U$%jfz7{-ac!bV8RFu0?v+?mvyFDe#;9CopkT9?6 zK@*4fJY%kpEvjq#agmUHD?R^BLpQ-*%)-GeQA)yp`QvH!QKbJRpK@reX&RbK=rh+? zbfh`Q&Z`=vyW1ZMvE@XvcP{sVM)OsHpR=qb%9_0-^87pu5pz8Sxk{jkW*~hl zQFf!u&*=-)qfV3n^{5lyG;Fkbz1^0+seGv}FG>Eo`N}n2^NTP?z8H~_lW7V#R}}J_ zgG%c>p&XXtwRA;qDJwo5wcO!GldoZK>T{OF;F8}(C|uEWzuU^<7A7xqI0&5X!*6OY z8bWxgA*F5X?s(0|od6Y;_7bk!NS4G}Rbxn>#CxWvuI*95t|H|q;&T^mBG~WbU|$57 zd|VE{uOd13)?PJ8011)21Q9L)Wx;P1vHvSm=yz>{aJ<4RnvvyT3=9<$5SM@eF2(`2 z`~^en>+|_J2wADA{w;#Mh2o;5D7Ou2s0W^?1?G~sht+^^mEu;xIybx;h*Vn60g+0} zyKnV!Tl{T4EYwwW$K~eqzh5!>@7Kj7f*N*#cu*n#50F$HG8BuwHK%Uxu0YAyPHwX? z`BBfi0~coJ31S+o$%r-TuAtiRJZlj&7y-aO%ZL>JA;(lS`+hO5TV0A{4^+ z?|JE~ZV@fJO}2y!KhtJF)?rb%7~JG{TDkA`{$LNd7hb}}?HTv{baF3OGmocuEmpZH zs(QeIA3b2IcKF|urN>8m=BDt85jW&MS?M`525a0zH07{Y|A=%wx?XmrE&VP%7uQnE z$awtzM7zANA_j2gEg%(Rs5K8!a-%>M{dX2q9w|%P`MOaj_}7NNXb;jl-5Qk1Y7h_I zwD;m;okL+s7P8uy-5^GAZUVoLaD)jSjaDEx!`VTk<7MQ;igdxaOD);!z%5_LCP_-z zd`Ua8oETw`8C{hPw4k6dD@bG%pko$P3H9tMJyNdW*nkK_VgOM<$+$Vimj1Bl`SUz- zaF~F&v2Ju>6yVI$mNr2j7K!g!?l1ZM%N zLuTV8%GHzWL}a23er_9x6Iauevf)yrhCklDJu{gEaXLz#>+I{lQ(N|Jmj&PyJ?*`@(C z7!L(1Uuw%rfZ$FIM+Y5yQ8NhF;U0OBxx}}@^>SIc5A0WnB+qayG?2eqv+@5rhgyKb zfwy7bnNWlWo;5b;R(X|}Xz20p_PM#P7mfEzk5AJ5Js6&%c#22!RJS^rk_RKgsbZqt zkQiDC{$MdPba3vX<)hBg$P2fkXUCVX;<^u{zp?VK$-n%Gw@LufCpJSZIKLar6pANW zlR8!r%K{p?lY7Ksu3$aQH)0b1mPY~omvob%@tFAXP6!LFJvAN_LFc2gGD-DK#&hvm z!1&_A?sQa_YTPyL=Bnd>Y^t_|9k|DQO+JtUE8paqnLNGm?GPK4LLlXDe$h4Qf3<+W zTPVtrD?kl$7E;nG)`2~lE*XqOoEt*y~?nu9mDR)GoY${Hor4M~@AIM`&($WbTIZEeU0aQ$A~!20Lkl zNZyT_%SH(-27RkP`wvBxS5*9t{Fk`rxC3NeM{b~*3)#(8@=2*i`fkLyyYE&zG=Y*b z+Fr2-?%ykuJNJZ^jqdkp6+DAo+;x7qu9Sd=wh1_X?P67HIyh!Bqr6N4mI@URT9Kk{ zvwd}j#Rr)=3kJ+@Hgoc7^4y{+#hx?;Bh`)L`^fad56l$|dV zj%DEoY#$0NH!*p19v~zBxcX2*~Q-yM-z9m!(|D3 zvdY)YoCd;(mZN4I&x|xp2xD953!AI8qWno(=S&uEJ(21a{ah3p6@tF?1BgWTvVgkQ zOa)uq`7@ckxXL+IKL!|u@rsRkYD>YKDmlQRW9y1UQN>nprF|vJ9;!TUgC|fW_j6y zaLN;3p-hKWV+xjn5#7kw@208g>t$CnDiku_b=sP>{N3jP=^N_U-; zGjv~@ulJ%l^(C}Nkt<;!gwNLDN=PvrP17)+!f+!!M@6ZIA3F|pfZ$-@@L<1iKJm>U zh>p+}z=Eg>3b1Y;pVy$uF2^BJ+reIpF@IOm+_|I{npyKa65#)4MQi9W;!B8)ExKyA z{S#|-_nD$_3fjZMr^;=4jvPIZ9G-Y_;QEJh(z^nFSft|?GWBvL>S+H02|y7N7!xP;pe5WnM+ z6a-cJCTX7sgD=&6wqHs#NGHYT`I6$iFzG1gA;+umE$ORIPQ!fmsN#kC*&V+3{0msj z-^wT#{%Jon z%gOM9=(SD)HQV=8Wf}M*H~dG_=}?b{E>vc;n8d5!VR{XPmB^*Q!!wBfWRwpyr>M;R z;bGa9O?m%&%vLzj_l*d(UlBmIA865GJnj*T6SM>dzxy`o?)Q{k^ta?jF4yikx4VMA z*IpgR4Z^be=LA*H(tR+5VPQS{r+})xn;96ChT8krzU&!MK$gSGQ9wC83M!EMQ=>EBHT@WA* z=4saVT<}Q+WtJ3Lr20CRR<&(;JFG-`A+Mb{i`LJdYzZ%bgp%w2`pJr4Dq13GE?b1M zhOVXlkWY5uF}t1M2m3%;D}0gw_NadOi&VOR6w_r}!;-3*$UpTRQ$?aUGZv9E!b}ZH zpH*J%>UL6s@_VtJidBl>3c7zKDZK~XUll9k_Qt*V^A}CAdzDTHhJilMY@Rhfn&$6+ zxMeQtyrgmRKaetJ$_uWO6N5KIH~yIDJ($1UW!G(bQ`tG%4^vZL{E2&AR<_SQMP_6H zvK1+PIy7-!i#xYrg`(O0r*nD}o@}(Fg-xNe17G3i3qy%1R(Fs3A=7SJcLY_mVl8`|~}nz3acRj;0fv6VEvZZW~Gt zCW)JV?f6$Z3}eNp_5j!_ddC6Xx`_6_q3da}BN+%^SBnwKaz<;^L@edV*Y&hDjA#v8 z#z2$xao@fU#j`RBVp&TQ;Jene(i~8ml31Z4Hv1 zc}SyEX})m`mVBln$rauZfv<`Q`$i5XO96B0dhk2&XMW^8A!VID2r*xbN7YT^I}#DQ z?U~Efos-&Qcyow5XOa=>4oQLwtDfbD5l!ao#6Ltn9jwJtyOaWw@v~$uN$a~w*Lc(f z+=hrw)lM^t6Q(JDz`bn9+F^!i5ER8c4^WoD4;?uRyIr4#PNFhay!t6m?%b2;IZKO1 zEvOoSzu`a3<-hxv|AsE#o>1KX8@kjqiS6htIK4@Lms>#_cu&UyRA%Q+m?<|L|T#YdV_X3N>dt;BK2x0jLd)71;yHQTO0LD-YK zcRB|0(7u}T718A|DB#_I`juR-F#5~$OC*-Gt8u(C1Y;C?WkSj>T){xgnj*m==lObQ z;>*QZlYBEde9(C~OIPz_*M+}t$IhI2G772_XGxHlMga_t54T*4{enW2xLdDI(PfM5#LLP z3x$IoT_vt1i3K9Ahe(1)jpf5jAPv!fG9Yc!E%e?f+*CDeyLB>HzCjXt4aw{Du0!aX4P=#+b9uZ=pvp0-2tV$ zf9FZ!bZIsd3y7XGjAi$yR+r+FW}NtZh~&CKIaZHK1WZm0Mzsn!nQMiSi`?Ltr*8hK zg*4^%(3MxcWFyMZxg*rz#QuaG`^WRiGx&Dbi#tMHgLa2rMYiXB=G<4<$HKK{J? zoDQY@%=(u`SOtc93h)nPR>Q##EQg5?LpG}$JlRciJRq)SZv-QnYml?GP!3PF<8v|F zNl_-fYblo=`|9b`H0ru7B#zuHq&M{cl@UgGTNie{5im=bE9~T0hw;xBC2s{v|6hzS z?te1E`zyVmw3C`NWVm@3=i2@?)(uTdx+<|uN8ZqfSlv zCD^YE_pc44pqxT{xq0cKFMKf(h=3e?n==t&qDhYcoy8DD)V)8;+=mKj1fmFePNltQ zZI|^zMTMKYW@Vo%me&Mdk9adj81bk=jZR7{LGa1ad`1X^oMO~6aB)ew@a}J~4}W~G zt1Y5!Uuhq5#F3M0URuKQ@uAP#MC%d$;BS=vU&))+Ds=vTZIsRGs6OEPeg#;nNlaVZ z#LRqzSAUs`dJK~Zxy}7m*GYlaxTy-|=sjxMnh#-NZZy=zoo|jeQ%cYSX3X|`6949v z@sEbb*)3Bnxr*m50elLWp}I~E%2YSJL*_DikvR1wR${9}869WIvFWb12puk{5^ybK z0E=4G&3E7Toxq~L0-YJAa4>t8YjG{e*}-5uEhT7FS2QD1x9vw&9?4?HMO^ewSL&1U z2-PCR6fMFsGq_EqEdofYEAKqA^3EtC>9KSimGe%eZee_H>Qm(GD!;pObdI{Ooi3UW?M2a@rC-a_nKlM}O$3#ZN%& zg8EvU_nGuuiz8&+&^Frnhy9+$-7){+EfeMXvS|z=)jkkb_QUOqU^=6=@zINV6PIbe z?VRh6zaiS^^riuz`6J^m=E|Flcmy38$X;Pu73P$(5=kBcWU<~OObZ1Z(d&xl@^yX< zK94jLPMi(PTT4`?YafwN@efm#2s_2g74awxzNn(6v~sXaDZ-=I5Kg7>R;b%Acf(v@ zAXnS$RLEeu)p^p}cqMzmL)cVK$CmqiCS6;8_~eqH+q}koc?^tjauW=$RGShgfjdDw zXT|L@$EeuZ2s|*1AWq3N#k2Yl8u3b_WLmZ!^-6F-dv`w2X{)L?Ni9)l8JVINu65{g zypU2HVRrR>>l`X161*mJCfK5dx1_B<=ob&eF7;JLD(aN9!A_Vy+San^e&+qM|nS*MKTwM*m$WcwNBfo#4dH%Ri&0w<_ z=g7E-aH^$*<3MJBgzA~ zV9%tVxG9{zxa;F9zxG*@(wAvOA%ITNkgl)12b^D}LM?f5#l^n~;0|z$UT@u(uXLqA zztAg3ODP2j#O~}VGNf~s?MTot8!mOmz&MwXk&qfLVSllL-RvnqhuS_@-HrML8ZDNX z%pa1YDZn&+inkHd#vZTdGX}wrWbJY?QIJQx&L3>IoO!z42Pn63vb|O2`4BN8GJvaT zI|e9Q`mdMQBMO!w{Gbb6tZ!fC?`SGv#_4uWC3N?Ic29rdxcGullwDR#}5&Mfr1%c1`~z89FQB#1Ys9Gwsica-E~a%^f6wN~dlLP0fMq-OMTOu(#XN0V%l24sZWbIri#a=W2`%@5Gc zQei6cji1I!idzVykq7P#M{^eJmd&;(C6pEE@55@bf)ch*0);aW4{lOdWX9MhV+Mu9 zy+;vf+?v}rcw6f%P!_CRAk&0YhkP~*d^kwn2^@swSk^X zc~?dlLjwuOOMiw}Zqe;FGKrO0SW|#xw!G!twl3m3+3F&|nb+5a0}u^}RPue*46FvW zMhD7^ek1#!bOQr#pg00y;Nk_H7h?816ayf~a}Pb6{V%u+Rcsqu4}iNax}HoZ;6ojF zmz9J%sRU{rY;e@5>9$ZTbFxzVkL+h^F=a-h%VzWd85ZRaZ)(F#P!eFnN{xc1*dMdk zTF!PNG-z@_xAd)`u>fYh91T02;W1^0)#cSS(_lF;G1u|W*?odI4HjaCHn0hOy4HmX z39-3CLH~~D8Ullh1e<9j89a%z(5yZ~G#Ysm-_`~7u^g%NW&NFbgC6p6?~2s6+=WXs zu{%~9bU?&sV(S*G9?f4UF4?^@xt)PE8h5{zt>07V<9bf(0pgV-_|C_AKfjFMc)lh^ z|98mkO^O9HkFo%gz`()(ZXOlUf~)?>sg%2(^uHOmga2XNK>tE+2DP~e8B4b_W#Kws ztJYM#MUCirg9jq@CPQJ|%)}VOM#L}kPZZzZM=zkDHzT77y$^HAU**K5{K=>EaJ1-I zmytOM^yt-#eb3|3Sg%}D@rNEt+a~eH!G_(hTQ?`$`xM8q)t3Lb2&zcRdD7?ZE!^*) zdnu@g19@YNV%vOJ%(lGryL8+CP6q90k{#V|?i%{Qq3>)yP`P}}N*^JY?EE}J^pOb& zU?>Z~17o+f3!q-M{jXD7QBk5SGbNGI3g}lR$5I9g!AiDErnv|&PS!20K0*m6bim7D z^EAcmCgz5%az?047f@J*kkcb~Rr_^b5Q1Ear5O^7QEw!iJJJj5V(k;$BO|l)6u~+& zsijS%J&@`ri3PqixM<7A1z~Nz+o|*=yE=YLc59;@biq~8-^Q8h7uIR=OWjMM8Ao)^ zdvz7a|$y;F2$ZP>1vifvcyq+;8)ZJQNi#kOtRwq0?>PQ|u+egE#gd-Ui&S|{sh zj(5Cc&gZ%B>-x5E!+pY*8|3f&x@3k6ncPcQ`&$#n@&8vI0bs7n{6F8l#%urc-TN%< zwzy6l|6h9~!EpycGF=-pPxqcek};~ z`QBEo^_LNCrtKQl^or_#F=!6V;%Ocoxa&a@s7*9$GvcnTXkV6_I@j0QM8<>|b-*cf zL$0aBT-st{r8wAe?v;*P;(o0&>>#$&3tb?DZ7U$2NFZwy<;i1#`sv@ETzU1y)>Jrf zjQS^HfL`$n42fUiY3ODwiVj`UCN0d0cBph8Jol~N;=d3WF1ylAR4KCSL}*MIKIp{brY5&|b1LMm7i5ffBO?zu z<#WG4X2Y7gxC_~CH?a}`0Ng)i0{&rOcM$pHPwGP?Fmy@8WCAM_cZB!Pj=A289<^S+ zTWk?ovvKZ;A6{3(9RIIGp(5P>gy}a8IaiaQuV#P~c^#d4D@po%`0r=(%gt(N_Bey9 z-W}f#-o7(s77C?{b|LKl6DY)`l)c3T)Bs76?~bllk!|J-1mu%z4?=hETAehHk-#v$ z9y{tH+j27Fzl;9RV9&;udQ0YhzJf%|g*~dLnSR2{J3Vqk(;m~LTrym8@5wZkz)EqU z)K?zDRTx|((cbHpQ(DUZW=aNR(?(67Nt~}5)A&YZV{|<~S+h}6QhK~k)p7ujWNE<6 zob*>xwqEYd@qC=d0p@=v345x3(Fr(?@5ed-);iE_3s;yj1=0KGpF*F@zL{$*UW6;# z?QuhL%%Ui`GyXeC|KEy1HY5A0zNq7WmWyoMQs7g`0v;n7ZKxXP^B(ZQ&#$emgC$!4 zf(hzKtWI$6f7R9BtS1yjLcr>35fHp~=-_AYGUMWj{ET|!@tgAXk~7O;Ci}nYY6@x- z#3i-abXTl@GO$9pTjJ*E2LfDEaF2IZH4;J=L^HTa3tpqeS)Ct5UGui~uIR%lmxS_S zl_1Xd$P{Cs)GV$Qcw|~Sanm0fnO0%& zGn_p)W42Wxp%@`zcJ%CeWtNIpU@vh#=h78Ks$fw+S7`2C))+Fp-K0sjEJ) zto{qqr%J`kgvP55Pn;2+#X0(6nBl*2TcD=pwp~-alJYkg{4aV206FA8$1%{6@;_;M zOukcc^oNz?`n4PixKoOYS>ylk8Ci+)={e)}()n&6JgGMe3^{I2}U3S`ysZ)%V0 zZQNCkC=dev8^)>mwmF!^+(79p_a&daBJ;RCkWYz(>~u$2 z4r~uWRCAmf5;ho-SSR=RewAc;G`biWdP^19;@DT6Gtq~TTYhvl>fh2UC9Tu2QobKF zZ`~S?;hqku4djJUQVg&r^H!P0XV2Hi0$(>i00HnjIEp4YQ`H`CQ!k>tjf63=GeG4V zy7==m^_BbM- z0L+F@NGA&6;!ztheaj>R@@_!0OMTa*V^cIXC-jZvuGq~&QS6;&)gJ?WcRfS1IbehG zl8N-vQN%s|@5SZ+nK7f|$%3D=|BK>}3HYBjz#3*N>mhwT@%vTjR$jSaUhdgFf z6gJT=4SihaGGAjR~N-%+kF}KhJCtMKMABeV`J*s69X~iBUnJ>(|@a5pz$2I z1V^NhRRpg>gitaNUE<)8&fIhhpr?DCL%8kBdN7gU9>_>5KHlEWcDb54>egb1X3ED% z@CTTbke6{UWmfOkCOppMkGUr3|u*s$;L)a%7e{F1*-ILHH+?DY&F3FZ$!40h@a z3k3-ZOqUKbR7y||L7vy%o?2%m*2flNs{=sHGHb(4ttjGm>6AiA%U-X)2uj!^7*vAfJV_M^N;ubg;MkI0hhu$&PFR;RL` zfqcpBPo;NNC=TL?Cc`Vd?(^Ee4g)xj62RfnodMp{08#SoV`&njG|SE2-*p=)zyMgK z^b!aWQ$+V~i`rpjREH!-X49k4e+IZys>>o4jJHOyl2v5Djf0k+ByeMP`NZ1Ve z-z)sR+$XZZC-ahGz=WR89FRN?d}DY=jcSUlzv9=I?{z`!0PgVrTekpF{iqVH39573 zK*NR7~C%&~qN{Q|f*yxwUmFIrQ-#al&b`KFkRk*W8eWhZ2OfMYR)QVyjUiFrMoUfv=p}yXW3Wb;lw-M#3GZ2cI&kMOU#z ziTs{>C>^<~j+e(IR=gu3BFF}TMGeFrAyO6~a#sg?80N3D&{%mmch5JLGtNDLoba#Y+fj{oI)5>rS1$O zV6(@a#$BRs(?zKJP3}3Rn9j_g)S} zsw8=%Cf%~h4`(L0V}c@`c!-z)+P;%Z={kWMy$=b{iLAA27(QP#J%>me8nW<{p9+Ro zp4ze5?|vb+tm-aE6D4Fj@sa)VKV--v^uhN&&rv=wyizQfGSF42xER7j-4rkY$Q9+x zb*4X@#P8!m=aHowiQ0ODc^@bC14X4R(@_ag{3}KkBNP#~X3n!K%o`>-NvF)FaVi%Y zU@1m>s0)PWB$x|eXY{PpoVP>VJgGN7D6EqvlA=bd*E3)DM1PXaGOhpl1NTF`38tbL zVG2T_hU9O){lg@uB_Fh~vwkHnV2(`CYG95?=HCv2q2Fwg&+6(5+L|pegEM^ zE0(;VD=e^^7jH7UGxQy*{4sj9waYHP);i8a4JHuzL5+joy-(=0EQuNh(2h8h=siRt z8a*3Ji##?Lo5Pywm*2))Dlb5=oN`YpV7WWP7?e^J(jtqk+OgBS8yJAU_Hw09>+>-n z=NF1+5~JV+4j!l*khtnw)(tOB((ff)lTR;Os$#av#%Iw5?|;GBTH8qlSX?J}d;59m z4e{*6sUvGi2XaSieH=&tz+MZ5p>3FF6zsqOMDPTXze|?Y-hM1o+%3|F4h|EFq6!$u zmIPea`^h*8!2FH8L1!79X7@|29MrZ{KnNM7$U>Rz5W!c!I@(^M*-i2yVsixb*nel* z#N=YxT0Ez>HL>He*aq=!eQpfg*f+}Ng%KNxo_k}dGyI$@y%YTfhil~6WefdshPj882TbFt@X?x4t*8)xiP}J zI3t`+vxLX}(;`f+3A4X;IYkGbZ$6{pa6Fp7R=y-ix9LZ%kZ#+74zkS&>1lL}jvyaY z=I5;oD&BJvK3(B0fOhh*vHIKos=&rP@mix5F?*@*f?y;4ut)Qpu61wO>hThvxHQ^H zOx;6g74vNVnm3uvgmjgSU#JDMqvM+b^QVOZRch~`=56S5g$YwWhSo60=uTL~UNalB;5Gq8X^FH0{byv~0fo)Wy z27J1}uou@hU-$6~-s#70oGpom_JHzEfMM2IWd2rh!N7G%ZJAIMet}3 zx;Q@OU+2vLSLaQHx?XSVUp|DsrNYck{Mf_JeHnbm^i4Z_;*9xSpDk0uM>V|Wtk#IT zF&8E~WiolbA*Wf<@B509dGpX1RA}!4!f|0R)hSrYc_0SLi5v~bU9vuge#60dAACeN z5&I?AT%t6UyEYhMv4I0*ha~yE&sZX1MMltoF;i*4g*-^}!7!g+H-;21GD9$D!O%-( zP#OAF`yq@#V1;I|D36b;(-?5vFp`GDi}p`uh2=z7;kWm&a{7n#7TlMh@RQ(0+{diT zHXk?bAZ;vdx$Zxzf2c9RaE-DQVlQ_J9!4egc|1x1W`@!swK=$iQrhOC%mB8WRwiFR zDtAwS<)SVDDw3J846mHL`_ei_5-L}<#c;GcSrP=1ge3n|&zTpaNgpzsKe)1)BG|~> zN(#)ZmuZ({XNn13`6b>)uCC!b^!36Tp1dxpP-wPYgmGHCXt$(kDjn$QLW9h}d*fSG zf1yml_b=XrGRlR&Q?V_N0!KJIlz$jG%&QLo>O&qF2l?81#S>Lp!T`bA>wN3YGgwWl?YPq$Xuabx#eZTVIZo{WcYNbw8S6_RL9h8dZr6wI7 zXL8p?S%(XZ#xb;*2LmPTs+9vYqPm%%vlexjvu480Hq>=g??XZjFP`hCwmvYym=qrX zSL3O-sHM3mF6^~IQ%S!o=T{B!oHEvQUSWPH5up6Lo({9tZsHbWpn&>R#aeh zqMXvYZeK=qo=U@As-H%o`s>nM>v2v&uS7F-KtR) za#C~ATd8sQbNNaQ^sQ_qFP{cXkUcF8_?Bk=3Zh)$u4|%9_nmNv!LK|O-+(PGfPjXq z>59!&$4gGG%O1@QL59s1CUhu~x2(@hJWWBnUt(!tDg}eCrDl=wYB6k2LvbVR!=}zZ zr>9e8%rY~ErF5Ck;;eb-?6^euI2OQox4en3KF=B9Wdwn~ElDG`oY^@%>E0|z7=a-q z*|jWAs!UOQPXwC;Aw&?fe>%1)v36YsUT#Mgc!#rTf-B`mKQ zIn;OL$Cr0$_Itu9`?xUYO8a9QmuS@B?T%1ZqpK7xx+>giTeJRkItbO??G0rg+y>#X zVf0(l%NC|~)%AQ(-z6sR#snVM8`h;;1B2H()Orw70UShU%+`ump+dQWJ*Urj#JK& zX%MtqYTJ4xV%s(c@}#gM0r6P|?lw9V4G8?}xEg!F>|V;I{kcKNx$l{B=Asa)3aFZs z*T(^cD3N?-8)DfksBtWc9`*{D>z2Z%9DB`N{5YfJ^e$oAWC=d8wG3e zG!w?5WuhpR6mvdO%5(|%O;yo8(Q5H02mrFIWd|&G{&&X~2(1F}R#IGT;S=3R5fFY= zOKCO@mdhxbk)v?7CLFe|jRW$?`go*B$8dkY&T+?HbsQ7q{BeIe{p*OLof?$@MGeV* zkW9pXRE6Bsl;rmJZV$BynFPLcr|`&^RRAe>&H}58P=UYW=2OC=8+t6BS+*+`qv3NZ z+i2IgOyYP8cZva!E3EC_<09`PsZlg{3dJAT9s5}lU3*yz5Rei$kH?5+4q+bgg?w6if|eD2etvuEuM3db{Y>UjZ9|NSi)Eea z>kh_4#oR`dCek@=<6dZ8N63%ydqg=OFBog+$0WR&K=8se4QlW5a1Gc?vLF|H@g|$Dt ze3tz_@q*YDPB`iM89awqblwnXs^sz)-;zU>n^nKLlMD``P8}Z(DxZA~;wvb=J?n$= zhQ1D+SvRq2EtPP-|Cn6Hh5k+2cD%E#Mw)BV*;gnA;8*}dghWM**(feu8Op zq*4r;$d95r~IR^cK8uRH2r{oj)Uf5UCidMX0`$&JyN(IH1|VRc-LB zu?ulsU~1I-cp9!Qv(Oi@F*4!kBPmwAgx%Y!P%P-a?%fE>OMWeDUF_>FczPyjSfUNa^>RR+vYod znU-eE%En?yu~#0$jV^V~#?O?e9b`<(VmQ2u*#;q#F7{R2h^oIBbOSN~dTKUs>lCLaf=e>@5B(p~6RtS`@2GN%^+ zmMR&2BGlw%tR6Fk`0j=R1O6S1F9@`>(7+OfMPbl8^vn4ilJgyFIT z)DMK4Uy%;nj&B;LRknmoLVjiPAweI2=ljY> zKKAXF)xKqP7lIzj7%v(&`bWk-^CT- z+#V}Ir!L5Kt2Q(VI9JRdaypqGHdOp3jBsC6c#QwM{qDDm1DGXW3-p&Ufz%CIw3NFH+gB#^GOukl=J%szU1f&zLq6S}5SVXJ>5UQ=wpvMdLxFlc|C1=v93aHKv05D&={O|%c= z%Ny0x4~ZtV_ZdPYW9uj_uy}rqivVM;7N!V{dVZtXYcZt8Wz#me^CF~&i-Thq6nLgl}%SB z3lIJaQnD2n2OTZS>2ggIu#;~q()36Yo-=h9HH*XSG85LzFuEZ-(YUVsBIxDAN+?5<&jVN zCil-S`+ zDdfhomxq(PXpZQ(+|jCNR?bGJ?762s{l(L*c}}(}o*eP*2uaH)qw<#6z!lRDP7ILs zt=P^F?Z}ZDxxn0@z9#RPZqq_oB79s7OKvR<2}IF^^WIDI z*V@28@jQzaqA%tLB*21>{)o4A&i)EA8q+n_4SI-GgIrycS~L$FNf&WaHq`6pv{2$u zk}#3W!OwuPbQ@omy<0@GYt+EnB15A-$|op^r%9R$Wz2lxW;pDABy^1h0u%+|#h%|_ z1Ne3`+rL245aOV#+txy$;lTh$e0JU&;?6sdzZ|h%iS*4VQ!i!YE0UDSOdAR$Ly9lj znEg2?7*s z7^ixQdU_;0?+B`yU-ss=^;0FR{JM_^`gpa%Zfp=!4O7CRIH!8F0et|k_xEiX2Z6q* zrZIs{v8q>4_(JmWm3eqmsCNaO9q+zt-@djoQs@E7z>Q%1FDe1HeSL?z+P8y*NTxPW_SBfSd>A&Sz1(6uMP>vciL4l@c9^<(iA z1C`GQ5vJtxCV3$nboG|7pI4W>$}wa5APc(~r^p-i2{Px)jKiN~KW}I+UxWa>Zo~J( z2>run?I*A)peh0Z7%X&=rxdqAh z@$H`s*IhDwIWT+4NIEERTi_j8Im}%>PcS4k&Bxcfb0Km*3w6n40G0`J6`A_%(IV-g z4*VMh%<}^8qW~~sYK{BA{%Z|*nbNYzfz*mL-%oxh%F^V+OyBp)BpYdT1-a>sc z+~pD*F*^?wA$Y+KIqW6fKeJmI-qB)jz$4EnNn+>AXUOKS+Z5ia2`Qn`_l`aa3A3Ss zU|zW`^Pmo**wqRr%4fWM7-7WAF1XNNJf?5=9E{35f&hNv(Tj1%1BbS&B?fPNl?r9m z-(7qp`#->3R<203at!)0RS6;ScDR58)@bJXXc6|*)f1*Tx-VwcTd6oAtGsAp;6+e? zSIwc{M)~8DHyb=hO7QJ)|E_rFoM`$MFB2VJt3C;u^I}2+v32@@-79{2po;*CXA9t^ zhAka24+tfa(d8wBQ}@O?dznFSAMG=C(dUF}5=$2Mgx@PFn_)!!!M0|E%gIbXl*h2~ zxow4HebBl~ro~J2Er;3-(l&p=&$>t_;98tDJ%&0`mgX2*uFxjw)Y>t7hwja#pcDP_ zND`^B7e*CRbRI%v$64`E&*%11G#;pM{;*{O3vi0ek$gema)GB_;18Yr-gX}tP!ig) zO%ddkVt@E5h$|NCW*IjnAo4;~-z}2hf3;&! zDDnu{9-8an6!Gu2Y>?z1EbxF*-X-)xc|Jnaru!#FVPlF}7?M&O2)mR$)Gr>w7WR*P z3Xq+gAX#2-xcMiWL@iSvW=I-@prkD;bKW2SQ zxnLwiR~Z|@@zlqbR`WQ}u8q$Szaw0va063JYmN02uemuRwf(}41B!LhqUz~=ErFhD7TpZvGp>vOu^V&6((OPxibn@>7;`H`?8UXR> zS!Z_hrSGjYJN&!LAa3mQxXZ}{bSN~x>!)|ujsF|8*04Y%96E~wbA<_WwehkESdw$b zeC+N{Y#gNnL!cugUQXM)28HhHC+?D1<$>2IB@ZZ;0%8GZZ6w6~3kC5fymFF6J(if+ z2%j}54eF|pL+D`kP&-{IN3O8r3qZw8kbGM36tDeLtKUTNav-?T7~N$cZK+LMAdd`U zbU@5|DHmSCW64(i9DQ>*&oI6GG|2a5Hv?Z;`uCngBtNpYbrN!2eiTfrNZiFAIK4*( zC;@~}2S{C*3)#C>C~NH8^&#d6D#Unp;=h6Wp{TEJPdns4Dz5NP5#FbcXaLl2n!kzE z919X>3sJj9v%rsIp`ym8Gu5ab$(1P3qt4D)H-77?l{>FpL?cQ~e&`^GG54L&vUKrh z-XmlF1d-rr1yP7dQ!@t}wo31YJl++#{>9`sH?8V@fkEA3jT=w=yKFbZ>^GAXw%y4w zO8ATqK))m1H8#RRXK{24%NcNY<5Qu~JM5iE2kDfh8_%pOflANcToW71Uwp}*U~hhj zS&R}q9+~b}VsDg^An9LbI5^e{o zqHW9ZZ5IIbEODziYH|wY;&SXq)nC3ZF}42aov-|HYYkzfowiITPzCtIR-I>|wI!+t zabz&O&?&s}eGjkVmqtOzM=U@v8H1#~O{?uWVeNFScW~o%wN*TU+6&zc?k3qOs|d{_ zv!cDO%L0};Cska04vUoJcQm{o%Wn;%Fh`gdzWdMuS>;Jc1F!mu*sO@G9=eG75wgQq zKkg6uqk>qy*SFRyqZr_%_-%e&X2938-zUOb@)o`{=MD3SVr=n=QeyQR&_6~*VNv&z zwj%oiwbc4TXD}xz>gFRt7Q`QhbLeDrpW($pmc#VO^1^oClP2KdxiAWT(PxS8#UCKy zClo;MC)n%jO+M01Blp!%GL#P)LXvU8L!R>2_hn~e-vDhbn-d^^*@oJ(GqIHDg%YtF z=Y9*CjDVLA%+byi@ogX(-z8GO6CM6w#){(10kfAx4SVjXfj6P0t@<~RXq(J3Q%Dg- z^b}|)66;_rg9 zK)JA3q)C#TOb0Zx!K5V@-ISvQ)n!-?@`wD;^@2SH%0nQ|)B z0OtjLrO>l7v=W-XByuJe!cb_P7t#}OAG8sU4ri4tE#^Kc*-7kxo2=vO}~ zjfK(Q!T|>X3{iE|Xjm2ABB=o>Os2mvCD;e6;gwB$CPD6E@+zK?u^ybFf`)#VTM`Aj z1sfTcA`4U-Av*C`2bb>X7M%X$YX{($tezy`1p#~oKslCx=B;6dbuqJ0)})CE5tXqc zDFMM0w;>L>#P1q;e)bd4+a2rS@18&p<=zH1CBSN&C@|kQ0pB4XQuX_0`CeTnXV)xH zvx0&o+@m*Nk^D(8W2VG2m7PhB1?VrG-V2VU&o1zf@9U1(>x=S+J5GA&4cg9cpUVtL z{4}ClT4qxHq=tM{OUj9SRZFZIRgp!(`%8a<67W=HQ?GdOFLi{saSX0#hCEz-jS2o4 z0`NXI>C>FwkIb+%Ml;G+S@#N3%Re{)ra;+R(RisHtQ340Y*9M&0)XNSO+-oli2#J! zhg}Nh$R74)W>D1geRK5D8=5pA{YzGqJnv|DL}t9XrTx2(($+%*O6~#C#z?cddOQx_ zWEyMDhD%*16iJR_t6iXPJvN;m-a^rQn-<{!4G-9ljhu}C!D_OnxA$P7O7*jcD$Y{O zM3rjR2-Y6=bT|vzODj<8ZORQI4O>0e-d~zhlXl+~lS5^$1UZV`{=pmTVB3SkxDIRL z!Z&`?`eNJ~gL%>p_+!W=HBW*}a12pB2r7%`DPR|2`o zeIo$dj8%+;(^Fz@XsEq$5Q^-E61khH`5VzsEQ4FuSuj_wPE17NXChU&6xlujkq|CpH^eD|wyl}- znmQsMV#K8If&K&@x6@?7-=owEU(~Sx9+@Q8NEeaqdohF@y5zcgS&y=1H}#vJ^C$N? z3W!9mDSZ6=gl_Zf5hzgQTr9DoX(R(6716^&FGRK28>Gj|e;8(TJ?JJ`*>QXA9 zD!M%!f<>C_7D!^1^{4ghEi@IAQLSvppw1HuZb$2_q2?QQ1ZK50(vA({wFgX{tqYk# zq`&ff*hGp~JEey?ZZg^ND?ZE2^1lQFrBY>ywaGQ76xb5y8PU3rO6h{ge;wyg9$Meo z6IdzJ)Y+zcnvu=~i}*l-6=XI7s-DWD+`XXzHM!jF2Z8)$S0;PS;);&RJC4>eQ8BvW3uP3Fr}QX$dB#1qzRQ z*v!t*{=4S|m!Fyd#z^@5b}9vBo2~e=b_FGh3%7*Co0oPFsCtV25lnQUemnr~-zgJ= z@s&aIDUzJyhMJE_X`Us)O`7P15-ErgyZU3{&MOC?g6nehc>p6-l-OlzGb2OyYbjur zW~wamajvb1Nt=H=Q%Q>!SR#k>3Kh zFgfN!DHp1Sr6DEtW=*5K+X}GmQ_&)EE62wPc`v5VFv`w{KdStoN+Z+AkFeKJNnFq$ zk!M1bM#e^mtuvz1;XnP0?n6zwSc_dLR^TUEV%DUSq)S(Z`Pb49rRB|9^AjXrp3FPf1|%nO zxSSUl-sOY&WHYicaxF7+`MZQPGR6;h3M|G8avW5ywTT#_yTr<1vnnXFLRvr3iY??( z7xxJYB&i>H-H=5!AYOnw*tXo?;t<@c_Z@%x5`e2Q%v1vr=}6H*4VY4)HB4TK29A8xZxIV#Kq+>tPLH7@JcD5&O#+1 zx@&k8rBmcJFrxuHdw>`#`HaH2L6nrnY)yrtXU_dF+~>04t${gkLvQT*Tw4)w;v;oG zJPO)cI+)TvyEWsLG7adDqbowvlcJB}GF85fuve%3m$Yf=!jyADrK&*SaQWaiNhjp`M38$DA8kOn_gjrSE+Rf_uRRZ=)VGVM0$X`g30Bw9b2_xnUnbvNyJ(e znK5Tw58Rm|SNXVk<*^Rs;z@;4@0BG;rhO3+mIo$%+POW{wRevmNS9tQ=_04Uq*Zj= zY}^(qLTY+zgPNh3cPDSIe8DOYRXNF4&z3(sJ45sz$mgEQRB2S`8hin>+;F--R_zf z4_rXcEe!2JYaVBalOYw))6shLiZiykpt1x|cTt@3DP^kC;Uu7)z9*UlTca9mPZe&? zl>=UNk-{WG>Tv5smhNrYxls~EF=_dW&uuf^OM>IM{VM`4BZQWX#$DPIrm7gh@fTJS zwW0@ChH*#s2}X&wup>;Y0eRTJ?ACl2%tuQqn(&}Mov_1&t>dlDx)AzKk86{?G$k+_E_2*mp50*(DoYUUC;M)YoTyI!u$E zYFZyA(lnsw#=nwL=&^WqRqA2q)@FRfc+C~t+Z5j^W*M7q)#MT6qCkwmD9oWNkJi#U+ zdV)32*{eoexM5C6^Jyw@GM^U$xDdg9k7<(w5cR@` z9=oDOLcPYwec53Ccn5WQL|e`tV2r55{%bTy!hy>~=z6V0muq|WqGa8A5y5B8*~?$d zT^ckMU6fL9qN>AOukXs5L&eldE3`s#6LCR3COm*|*0@(@9a7SxEwK!>;^OFA8dC}V zmqtb>#!_4J$DH+`>xJSvD62agkaZg?JY*?;d#R@%`Oo;poU%ZVjPUdi#zE;8(r8XT zB>hx-1SU~d04!^d&?Tq5s7r#WrvsbH^@-?QtFA7&p$bTWm%7LfLThO&9IG`-Gk!&g zB8K&8Ml9u!k$@%AoZXshDIdy(RCnZpH*0sI>5sw`C-h&I`FhTpR_ujLfOWD+@%DFb z8~e8jJKiWvvrTCCaEBQLF_o|^gR=&e&{4~`@Vxh|phZhD74vbJ%s$reQF_*IfuEu( zB+Zm^`P42r(3t=$P`Ql1l5@QF|Lgao1%;JdpH%4H70q(8TRiZe66t1gyUP-6^f@Oi zhUFwLT4-tRM76ldEkKqk6K=89Qi9bi7lx2IZiPDg-kKYcBvU3BA`ZuM@UX~~W85R1 zD*pShT)NY8e2G)i8RG8y0zM;M7=ih6cAN9UHD~~QMkV%(_F6viC^!k--gp@=+?p|a zN!&sdVhy=IrJ(Y>Kt~C}k}jE}V&6K;U+_@6-<)voYTp%y z=G!2PG3LOmS@UM3nfXWTpN&sH#!8Hs)B@a6&1m*oKg+->4eIbaZQUMRh|39jT_x2c z-2|_+r+l<=2nI0}QJ6}CJ{2NXO=G91zN)!m7Dc9bLY(FUuPvelt{>EiFntHJNpXtD z&}W16Vnp~I!~m(xkjbue3{3hgd4$uLHD3tm06*@C3ew`MY1wBC@MEl`w%8tOVT7Cg zP*@E4+|Q|6omw^Zo;72Zvf~d)g_9J2^Z*zuPQ0b7;F@@2@J3{Vp&u8VBxJ;X{Tlh> z%y>dwb3gg=;i*B<7Q&JW!Ua$HeAt&vb-o+W%wDS1egjMr%Jk=jkyiF@jsodbTQUnu zXbV6zsdYx=N)NZ4bo1mU`R#@LIwcG7h`(XJ-10RLnko+h$L$+C^g)yvV)mrX>JBE# zIXsRiVC4`^#>datmk#~g+PEXNz+x4+U|flj6u$UQINb^%eLOx53{%gOi_nv*{4Dzu zNagICm4SH_agBis8cb)xXhhzZlCb_!(<3K~nW;Ngh5Y3)GjTefxS+WF_wBf)bRyNU zF@eW9k{^S<)dJT~fy`_pax<`J-y5||P}>Uv+ts&pe2w+YC+%H!ttkF7Sr*@W2RgBa zR5$!Zzk0vRnx1#5r>r(?Y+7cp^EU!C6&-zOlWa=s`;-itAblA zjg?#+Ij;2>A?N7-j!qCc&+;*qm{E9zfwk;{*n-e;_+-)fFP9aska4YG{<^jbHg#H)x6)6einp&~6NuPzChl zza)hIF~yxzsa={a(g^s8TSG#Duxk?2%LjIwd9o5%1G_PFLDjRcPF>K;FfkM9el)vSzU>$dpb zis|AIBofrBAxo{3q@~DBAEQwCS1_+@A|P&IA-izYF=hW z5RGG5+UM8Cn;?Xvq8Mh>d*0gDoK>q35A!Xj_xb`#Od$V7&0klJx$tmt!yjx1VDXAR ziwkNZI~$#sTkLQ8LY!E(zUzs}rPj76c4=q`k=1yei2i!SQBA+cxBThg-O&IEd)w`n z6XFM4hB+Dv!*BmkGVOfBlQt29!%N+crF=u_Quklb8X@)vutq4abazy4Koz&NJ( zFIx-)i=aQy-?_nD8p9n?N?wz{gwrr$<8J+0h=MNru|Hgb#I-`h3cr#1T*>Vr2kWi> zSZ31%`lAjK-K+E-ZKv`Lha~_??l)Io-3kck{9u#r)vd)EPi5 z?*>I^a>py)>>kw5f9u8N)2ub!W0^p{%_cyq=cmCn71ezq^heN^MP|-QjEcqs)UK$C z)F3xzK18XSx)2MA`L_nZ*NJ3(K;w^g4Q!dnj`oDYclz7!gCpSeb>m)AEE+9S{nkh$ z!zOI_JLb0!JD%L6x|EcSYX-VOF-0c>vDPvz$q(mI);m(xeH}TJ9YRF?<$}))qX_ph z8Tw@WG!b1t3J(%8`1MGclPirS&2jt5fO#9Cx~!F!?+ck(*pFTSMgom|b9Zmu z+4k3Y#ge_@F5+bX@wI9f{CeajoT8yxrL$O;SV|~B1c(w?l z^j77}Me$!dSS?opQ)T$L7maRZu@UVxk~hAK0a3Ux63b-aq)$!KqP$!m0ibfvG(Y7k z96Obe%6|%I6g2RPyNGx{qfF?<1t%A0n5_y91}b-VF%AAzgPqX7x@`=T$Nvg>ZW^!l zQquyH&_d&uK?m{9lO{Qt#QK2|tIna1I}`*9-p6cJ1?9yJAc{}@X$?E5h2H(-;(-#q zp0roa$zAR?ng?D`8V$hz2%7Q(Z1N-E5`pVwC5UnK%g0-O9E}t}r9--L|I+12t9MEg zMB<=4=c&zRFE&VxH4T%uV|qBFQ4N9Bq89w>v@OEr!qsnFe)o%jr~nD>@Q{m$=b#{J zzj|7Rf0hgYbUltxFzY%A6_IohRWR_2%WG?>VyATdG?R*-CImv`3kKG^u+^-PcTm|a zJq6ZheMAHdJjbwOBXEy>QbN)eFjklmFw#13^R!CXSl?B(7q&3a@}l#v1XnSImf>}sGTZ(_1K!o-webJpI_ z{cfjG1@o*Rvh#?j$kx3~8tIZY`)tQgQx7gl;|D*dU_rLsDNaIJp^_)~HD~t5v>LSv z-l?_Y_E>z@#=p=%e}`}&B)~~f@%|2);P1nS!0@`Al*zRfco0*PNiXQ)QRr3!g=p)1 zBoGJ%P{8;IV)aZ9$Te#n>Ia)3Gjs%q_HF{+hJS+X`abTDEK+`~gOdVEroEX9gxPb@ z%=yJtY&2Cgl1*6Q7-Kf?)uy?6@MuG3Mq~7!N{qRTHIsjKxOED4vH!B)2&Jjt%`%^R zy5`ob46z)z%QjL1Hy2i>6V*_6>kOY+e;z#tETVtm!dNNU$tN@(4T+EMFZ^MH6@7dc zf-Zox943}G&KEb$ zlE$0AT`ixit1XrdD2S}B=voww6Y3$iJA?Z~q2S=a8Gqy)CKgmgJ|PaA$9I87W(8jX zAPWsQi~0LcYxnIC5c>z!yKtTLAt;ESbZ0O#)N}u12&l4B2{55-@BB*4wGb+Ek_oA3 zi%b4E4Bi)_3MooCAIa*bS6u8DhYddxv#NP|zT3oUH&U{z*Mg0*PHi#%J)O!ks%#5= zh-SyvV1`c-i`VFXHeb~94dJTxU-TP*{FQ4k;42AXYIA3W&G`G$^3>F+L^7rL0vn8m zvqBk4=4jBZ0R#JK!#kPww!GTk;3{UU>sa5zWn_h}>)V;LdF%A_7fgeslf2eE0RcBcrT(jReb-Gt>jeJKtwJ$1)eDQ(Oa6x?h6{3@tDt3-cLi^N;q%69 z-lwyzKz-QfUZ7q>*Qb^H%;weY_|2jlRj;8}liXmUK~nr5OE%(`Ic-o4^f{%a zAddD|_iDjAze0VY<;$+i+xEWa5CmkRisqu~aX~JFg!~c`om+HUVw!yblV=M2XzQVJ zAj~*f-Ji^oA6Mb#ll_RCF$rJcMBT&JkLd3h&Kxg2+4)j_=_N(g2dhEcd9+_Lp_X46R;xYI$Q-QwKOI4uFfb79VtcQWi<$yXATsSX24IJrb3*0&-dqc0YzTDjs_4^#iL zkximhqa;cDeVN>ec5>|6kRn9sD|7d0x_TXd{q%e7#C-XssoLix3D9~JII|ziuHu zu&mZnG=j|a zj&J<4Bys`SO#3~#0g0`>q6@;|PFvItz5&fydsE{^693m$~<I-MN^4}bRdluy6k`eABqe!tslb!L&}c~7^Qc6fc;SaawJN$7P81Kw|ETCc@i=vp7k|l-IufKuPE?`X*yy{? zbsr3IA?W+^QK&2T$V{W*AorD2TJ3S?JzBO6RBXl*?%x~q^y9yVhlkYMZ8;$_FFB5WhasVvU*f)-j-=CZx zn?fmL|Hs(zXDkxCdR+l%OXBtd zds}k1i`^xIvA?<~hxrW4i|A&~YzLml{bbN*Y;E*;Eq~i>&DdY*n{oj~WovznWy%MP zJ%Kp1-G7=(9`U~#7rQEC^?Az8X9Uby0CjG*Oqv<@V)$wJ@e=LJ*a&ukXtum~F#0@V zY@CS&FIMFX6ISzgfQ8?4tl_5*3dsN@h!(^#%nStR_RK3ys{3&oai~Yf4^E8I zqzU1}UF+k>y(wDB?*P`GkcLpJmBrVq30z z4QJ7yUl_ZF)QsW}M#J83YfG>^Yv$OOq3a|DbPYSN)8}~^nW$_)WEyLirzaQi zct1QjGoQPdzh4$s9nUNu;a^e2lsZ_s#7EtP6^M;J^$lg|5)E#ie^L=Zeg1EPDt{H? zq1V9&z-ovW8ZMz$0xiUK3W>omO$9s$qHU2{bX1O zRu}F<_*irrUrB?lw`w2`7b1){#c3Pk0&RLF6eCTlDUi;?#3K2sw}Uylw6)SdpQY)C>dJnFFr9f zMw0TG*tA#HpnGp1UJ|g_&;QekzQys6(`&fS)p&C2B>|6p+X`boeVdejf0dMZld)i4 z>^87Q3c)%tap3-L`8E%32!FO*sK|B1iPC};hnX4+5IEy-s&%xnteNd>Qzjvu9>1{!CSHd z!DI)ipBS>E)x9`%pwap@3j7<PAC4v^O-qOh83WuR=Zhz1vW0uk!Q@`$tFL=Y# z@4E)=GuB~jy52`SXKv@7^mS)*ObgAIp?qf`h$&GzTNSR%thiLUo;S_vNNQHh`cJaqw$S{u86ruD( z1CB>1WB5?WqF4ArOIvHh2uUT*zW7lovtQ_NTZV%O)PGnIH_uT}75eh8Q`K38IG9q- zLIi0)ZDb}zfhKlUelAUW#7gdGMWDMtcs5f9JUgP0KQ#np^U=7@Z;}s<_aEh5?R(qC zk^ip00&V3|N|h#(?c`3WlcPw;;)Nm=lCtAdTofW931^aE0Wh{M?fvby@7QV3T zIeoB23V)d2%oQuVMHx8#{1WW%2d{$t@*yog|MnqXFP6zDUM0mQo+rh@{_){A z!9VxD+1pbAqU00C)}ezxir;FnH{0T2l;x{*ip8oo$Y&!j@U~A$~~W#S}J0 zw=DDYc3URJ;Wv9cL+M?B-V1*B>Q%7bE|-T;@y9psq3Xf+fKk#8$AsrR0S*6ivWV8% zI)7Sai}Wr{@`Ca`iw2|K@VXxY6|vu=@u-Kt2;X#v=$A?O!}VYi^1oM44actsz3wm? zPlS&@N}s!`u{tv&lQmdUw{l zV36m7QFl1Rf0*4r}sQFD7b96nLhD7`+{Vlw_nh~h+Xf_yK zV_L7rvvCD`J?hN{;}LyqIwLJMyPn`LuO@>L{_@=*9QJVo4ajrTw}V-w2kuj^OMf`; zhv(hv;fw*E0abmE)iIfLsV0WQ?%9yG;|!9*vRqyb!^?0q!yiZ8%W!(tC7ozC>CzS- z&BDn!{T?WMI%Rn1Q`D>8AiqPw$*-5;>|)#}ABF?cpU!Ff_Xk+TBTD9?JA}HryaG>< z{xD*Am#9_2Fe;K&8qu*tM~{ANv459A7oQChBKc{+$lmN9zpo6XAZSaJ1u33V1f#u+ zRDAt|jq%rX&Wqr0?Fb79iH(E@PxQlecQ`m7fG)EuIl%BTxsT_Mk)ChyTYpc!@f;*@ ze0~kAqC4L_$Hn%xD04KkA0JZYH_JF(M?c4T8s9ECZ39C(KsLzZhk%8jHu+C)2*n%Z zIDt>lfqAcU11P4=Kk?Gk-F7`MQ_v?D$$S~-G5Wohx`q&VyD0pq=m|+Sa!+}9TCU2U zF5+d`%T}9o3C9ERYLZV$PJg{Y{(*x-r8ncLK%#w|Du^xXJFO|`^`jZA_Hs}AjR|FN($(5ZHt5-1_kU@mJuL`a(`WrhG3sgPiOD0 z!e}&}Ty}@=by(%&CUFH-v7W<~3rF`p&$gRLB3CDZei&nqa1OXBW6+AcX}~S2A<8q@ zgKt80P)kUqtqd>oKs|nB9S{vuQmO=gKL+xMRChEZqG;7z$tAR{cFM#)jh%tE?ert4%kcxZoKs$Ktj^!;f3 zcEmb?SxBlss~(PQdJ=eqt9-n)f6fhZ^UL;LftL1FT*An^mf<=eBeU)t+L$%8D&^VO z=trgwVdL5ShM$6s?WFfM4c!xTMASKt@uY9-p8O1fUjx&_QGf7g*IF3gh}>Pr)xK|ggbI_jq)BdZ05vE4OOtCn=V1~iRfbi<$J@3q=_ z`Y^hVyBf~_B|_;EZ~xC%{^diSeGJyg#~{q}EI;T(;=>1r!8~3E*?RdH+@kf+BDl-5 z6?icTGSDFTDg(o=Ec{~DP6vmyqrk`<>Tasiv43l;_7&#W{=%3=4SjOReFJ}( zc?L#(ldKm*&|yHA?`11Ut3c~W_QF4dWLYE<1=tNy=i6spuMm11=zsGMH-9*O&;AZ@ zto;#o!{8O@j{u#vN1W&J;{h9kh@HLaU$RHCiF3gALsBFK7%rQf>y?o8^bTtW{vH)T z&ZWtl7=PU1_3lll03VA^@akKz`0pYnfXzG#I+z~*%l-@U1^)E%y|7Tx@zpssG#uzj z5zi|9OxR`nJ?4;*j&;T$c_O4KSc8ww6(n7%(F7Z&*_wlx1s7{BIag0 z%aiy64pwRCYFfsRuC#t<`*$7;OJSHYU2hW&!;G{C&wA1l&twbHOT|3lNm6d}wT5Ft z*ndmMI>HjaWK;Eincc=qxIti!aB0cD#xKfb$(A1R;{3@@@ryE9w0{j%;6P4CHk?0X z3emv`?tVrWv&*5AR%N0Cv;>2%i4AleL~)-z*!=@Pc<{>j;m&HJR1v(a|hCb8O%!Au<+DQcN+e~ z_%>N;Mt%a<5v~MfqDGtIOO&U~d~dMsT_y3lI1Sbr=f{CnFj}Z6%M;DY#T}Jjfyv(P z6D&F)CR+k~iA@Fv6}owF0Lx6r9Dn-XgH9FOIbjhQNCNXmQnZj6K_N{scL2`=b*oCQ zm9W1QBbPL;mPgP*2j-XH%Vwjgst_`4DZ#pvWHYNF)04s`8}r5{H^8?zM^dhtuDpK4 zFd1fAo`a7%F2vRF9k1d%xobtecQIHUawG7Mp8g0=tIW5F%xAJ(rkf&dJb!F-%);!* z;oxdIm^Ne99*Uv^if#7tZ6Hh#V61`l9vE$9l2?;9_c(IiQFPpU?445{(PVqW`xIb> z*g?45njd4$0F-U9%A&Xy!D;jve33t5<~f;@PbILpMTBBq>1wk?Z_QPN3)^Go@@>CfsckJC~YW0Lw#)iJ6B0+hMxGbk(UFL^mwCaDKW zwL6`jUXJ@P1#iL#Dl>{F(^e2fkm!gXAWt$M(wt-57;cG++Y?|`G|D7S71 zh>?<`jvHz15YWBJ_J3=4+W6OmXUKojKDWF#z;FLm8wQ&7jSUvJ09F$u1RKha7$x*v z>=P9czJSKo@pK%W${e{66F5Q(UrA%_EzT)h@Hcll+QoUnJ4mp`2*rUAM3F!TzRYrC zGD9Hw9C5+rObhWtRI}tkR!6u>WabpisIh)|+Tj8>;4x|E@PD_m$9TI@?L4wg;x=I0 z?l|%`bb9ATN7Hfe>s8kw#etSRaHB49>=4kSo5$QBPrkVREd4v_yyxF%);_7A-1IYj#BK&1&I&7x3zW>QknETvu{1M zqdI;@>7f&7gwZ;F>}kp+3*4c<;Lw*4`%{9PQj}c{te_mnD@YFIwvcHSSv4}<@*y7d zptyC`m?zb7t>qFGWjOH&%LTbOkniGFU_#8y!v)tn5r2}aS39V$cEn5)TE*Q0d7#uK z)O1JL7OC3o2@Emn3f@10vc>%c7OZ{(X5n<<&#>&j#rgeK$*F}=co=ryiL?>|Li=aT z#t48G6x~7x5aM%5+&C22LOrdU-y`P)%?#wf_p061s)l~)s~Vfxl~e+(t{FvZcIo4k zN$*LMSASHcqGL%#Elv1B8^AeVrO)k3dB~!pPXvH4)RssoUQ}sH<`-y(>N_*0zCfV< zO+7WKK%gSS=6!K0@>7kFD6rq44aJ&wA>9Mgg+UTLMjZn!2D(*PN6eq&SH(hF-BE}8 z&WxpRv-&sn)TB16$h6XCTpA!y46EAWG+yVO_V8k3HCxAg|s$p z>`@E#BRW27WKeQwevA4Mi8px_#~nhl$+Jz8gSkXkqHWlmydv-5Hb0S_Qu0@|-j9`q zD-~6)Nv&wN50xn)8~r8Mm%-}cAzN^g)h7+0N-2-L0RnNGElf#yh`&qp81mlbZFDYi z;D5Q4IPjGwap2$7!~y%JI)>J19#(S8dsQXcWR4f{rX*FnX3e7wX;!Mu#<@a*d4f&$ zKvYiD!L*J9$2)cBVC+m3<-ECoN)!(=A z687$eaQc_BO=%q5w4u8U7L4~~o-7~+7=Q67%@+KJ(*F1qWj$9o|96$FZo%-PgHs-Z zKFoBNXP|o;aY4$_1k?W2b)Um5onRCjVZn-Ed8|6rZisBHB zs70y#5LWWYhdQeUa}5@nB0#$aPNfJCEt-Csl*&qEKPJU_is!Go_bIANCdn?;v{kt>cC<}zIq96QYQ&`}rz z%yt<#NYfv@X#~?xe|CZCjekeI?#u~E3)9Qi^SG>6+PL3LX&GI@Sz)@PW-w=I`7s5{ zfE38Fw=+ht{f(JrCpk7L!}{@NqYZKT4Aon zZyPD?D*H(OTr+OE!*JRQ9k2}JCSE4RJgI>hjGUJXJj_*Al!NtLK7Z5zQrmGK3X{zf zKs7KL`hK`GxBW!n7E)`-EuboKOO7)*8;^%!cLeXCaGCaavS;Z!&L83M%Ccn=ueGCC zf&q5P1;+-XwMhhqyHR6jX@=Q-3Osb1G~CS`J4-`gT%`HYO&lAH*7RWy^&cLNq!Gqu z$T7?xTZAzyt@GCwVSg-2`*RyGHkSdz{HYBXo7ae8K5qlY<~3rN&su@8c#Rn5i#A|v zUL%Hi)`~P1caB(rsf(jf17q_{D2$uQtcNjpCIse+9@f$T#^#x@A@gjLgE`O9ao}OD zAqpBZQbNz?tx!h8M56pV&#t7Z22YKntduDKZ)3{X6e^TSbAJw|(V!oWW^kVJ^k-Rf z;&2|Aq|hVAo&%spLq1m8ZJ#-^f2)EqWBXv^kvLN84;?T?^99~K>y%=1% ziKQRm=vKOibYp|+{G|=kI9dJ}sN4 z8tJ6_oh1=Il>;2j-LMkO1gFpH7E7fYf@ZCVRH4o7;;Ebhr;Zwm6V= zNzR*O^nb1X4qbCSZhBI1yrRs@Y?*yT zNjHb+D8&w>-U+@V#sort>F2heS&MkH@ ze1FHTpRi(_J6)H`^n>r~_50zezC)#U+2$pzhtN4$(|Trn1AZGUg3mkt(27IL{=24R4+X0b|1@R)KyoM zDkGY#R)iC{&3HQ6FW3!%sCblG+DZsqDh`!||GJ6Os;@arfa;`&@Uh=PX0YLS^x8Is z;fD`UQGhas-Do&_-xg=ni}7UU!kRd}!qPuwvZ?BZ*?b0>U!_i7sU=@rr{;7*DHev8FJ*6;}RHANbs?(Bj1@$?j>F+z$= zlag5U1~DJ4dFf5#A2>ic1HerGWeLL%W%_f1yFpMquFLpSuu2PfrVKh7b&W0d66Oe^ zQMu06kE?83L?|{T9}7A!vz*n97k_OYA&b)u`GaJ!1Hje5eYx97vbZKn>^Yj_WKkK) z=PZ|!hNvnHjKa72fSsfiQ+th)kJ>w7AYDoAf_k9N4))Ra;9UsT&F_oDfL_`s(wCp3 z=9ZtRpX$g>SS1LJH;3gKXkzEV$?sMdO|tL3cvW++Rql>D_2jj=*W6pm$$vA@X>u;W z*7!ZFTJo5ku0+p~hR2i$HBaJ64o-Th@Zj;(JwUOl$7M#a>g}M1L)ADHR|(u0oI70k zUBSvFc+Sv5$^S0MFUZ{&QZ+tJDX*hROvzpPX}h_4*u2E#VH!DvVC5~!t#KHP)j)kr z%ZF@RMj47?6i$+u8&2pc&VN&w^W?Jo^inlzWmg;2roh|O#pJCP&Mkt*Ut$osGwm>l z@2ijC1{176aa<_ZkvqR04&S*G<;a0v1e)guTCR9gY+->Q>bJ*-D$pbxg4TNDT2aCS zO_C+*Eds=stcpZ8wKhF)SqY{r9svC$qcz-@mz%#HiV=-U5 z?oRP6-@@}dy(=YTmKA&2x@xNmSRZC(KJ{v&%!;~Tf#dO2i0_dnZ&TZCu$#2T$KaV8 zTJG0HtFhT03k?&1{iqx#094LH!qZQ2(pZz@z(i6l?2Q9q#W3uXov}}s(XgiA?Zsdg zqC^tok_j(u!}UDg6o1JAFLAHpyu8sadPA`A+$7WF?^`%l3uJ{mf9ufmD&O-3Ux=h{ z$=5Fd#v%O30N==lNmx8RjZVGYW1bp!75Zug?^r=vt-OQb==$<3^s6!#eMh9P;b;pB zosqhDXHhwxbQbk@M|)&aLofo6^OlsoAWs1-?aQuz65VOvHn3qp2fNsyyNTpYoyjb^2q$5G+%wND z`0RE1oN>|zL>x|;BTTri?0&5n$XGTy5Y)4QNk zYocb3tLvzqr~w=3Wjmh8z)@whyG%to>XGyZp?=G9ynlec%EeN)WrBefPi7n&jJ9S+ zhT-bBe5J9KZJA(pkj7TFWrF$9Dvk|CTY)5!g7sT2x5wBDog9<~>$jT1I4BL)Z#9K+ zQQDsyz}U*RB$z)nfU%WrNid%`fU%WrNid%^fw7crNibhDfU%WrNiffvNMkA6lC8jW z=y43KRDYLXDce$DtR}M_#!$8;!@&BjdK`U+t|{9R$+}co@i4ZstrjR7%C;Qu?J}vx zQnuBQvY~8CZcd?o%Lu7$&bqQK4U|~FrG+yUI9bcKG*Gx?#;QauR9)GYL8=-!lT_BS zEy-T}rGdSwtEJLNr4&`E;5H~@)sZCCw+*DKtAC}^NTn22IZ9PmOC?G5oh%hB*|9^_ z6#u9IdXi?f)fE3o05^&R+7*#U;GbK&QIZb9bUD|MCPKAxF^qN1xm&h@F?rOuc4ql< z?JxOh(%3G#5puqN-w~qk;PXzwRylTxQ}}TL=MUFoco3x!gOwupFva-y9TtI>BecSU z+JAx+KD@)r^J|2gSlGN;+)F`+r`c=}FND>EI#`Af?02!Q6Y!V$pocV^(w=hE5l?@$ zi(1PZcauf+Cr$DbMpvJ7RGt3nii(aY`XVGBJI(&cNDj(mb%Sz@j-jEKuYK`%{VXWV z+E*ytVaM9^0AI+K(*rOeF=wa&A(}Z!ntu~zxOx)e@-KNRd^)~RLhO{`WSKglRpBRp ztq8Rsze4_$&~21^Il#2Z)bd2>3cF!BrL*CU7;{RXIAmP+blno>MB1$<%qakl_Y}Ei zVdz?=^+Q%$DBR~+l`abIqp`Ng5wdtrvuBbq%|ArH|TP04ukJZ2VcWKzYk6kEdxWGSl&vv28>Mee)-?mpN@(HpD{cF!TQgVK(Y+SiJ zaCRk*x%Ag5Pv}JBs5PCG5?FQbBNb1ms@sQoDP&!bC_+n;fG4P5z>aX|GV2CYd~6N- zTa=JmFQfm#;|}3#T=!DRu;L;Oz>x-5#?r5fYhE*IOj;BxWLoj)9G0t+6n{^O(#im5 z)x^JAXvZn0BU01c)KeRz(M4xW!4^|*^bO8XYEo}hV>5pB;F30+V>6A+wsSYs$x?qO zg8}6Qm4)5@i$NOQUMz#0P*Eh1MpqacLCEy7D); zvVs+0uA0(0dNSNoTrVwON_^Ad+QaCk@9sjYu`jJJ=n-OrW@tFWwbk%N!8w7~~+Q7Wf)C6c>2$&cLLUNbg)G7GPax6;e7_HQN zikogqx#snyH*w9j*l4@rw#5w9#VrgfprvQe_WlpIk~|1)0)MSpZFAc;68^4Vv2oo} zN+r>5lirN{(z=ds+%}CpvXh&P<>AmIB(kAMmH_=St^fP&E(j8&q}sWQW+GD{u)Elo zXCEM6y>LrexHoa?iu4xpDDUn6h~Lml{iTq(9|-VH%jHeE_&K`|{uPSw)$Z%i-+8sy z>$xvq_TVM_dR%e#4rCCCr4P4$5{JIZ3VcEDe)3BdWd$5ZMJ!e9r|=&U%TEIK12Zzd z++N?I7``e216Q zGYC-uPM0M#2qk|DyY@=UdNLB-lP73EpNt#A?9DIJljF;?=|}J4f#L^4nqVIXQ z3C|---SOC!Md1D_v-E-sr-|`Q3e~oCb)iEZJwLiUZM;Dvi|)z+TKw4C_KUNel9-ar zFAD#mkK;IcR4iIUGk)@96wg&3-!E=?$1*75TtTd)NanqHhF%RK&=bIyKo7=xPHOyp zwQ~&znCpKdr)Lsd7f6NF=#)J=pL%!dJ#j5kwj6@9&?!J@0+cU?wVX>%Eu$LQD+CiP0YzKENk` zOi#2tD>lBagy^ZgO8KPP>u3~~%Y0OUD1FXKm6v}C=4Fx?Z1vL+#C@#Rtr?X?V%EH$ zz9rbJj5d>RMRAj%d(Gz}%I?4q!56UcaRJsk@{C}=(xnDtmm68yxTJBmPi7wowt zn#+RT^m^z^9XhhUzspIvA%eR#xKaYYLFeh%a~|wm?=|mq-Qe34U4#)E3E917=q*Yy*0bNGPeN|k8!77jeivO6CmCJh?Mbe)d88|+^tq7Z*g z>WXuyNljdr-Ov^7x`jx572oQ$6IlAlyo|iw1~HUn!Clzro@xuO^Zt^>!0F}XIaWAP zG2q}bLLrZesaZgoL!2V(LO&`wZj-fbz3c<6vde<=6@C*Bu;sDHEx=q=evG|~3T=r` zTGvnm5e^oTB(y)6&I{ajiWcxX+sc1-*>RLl8*BQuX{~&~^k;Hry~iTha|pMvHs?O# zPn%3MTS6AYx*e`BTSJQkv8$-i#eJS+A(EdxtgJQj5sxZ(TNU5#;w*Bof&f|*RXsh~ zW+zB|O^F*Muq`?ui+GVm5Vbj1ysYZ#M24$KIaq#<)7q-32EEY6RDn6<8#aHB=|kbu z}055hUS~lFOuvAyJN!_ z8iM&^9n)ZIEIvUW<`g8fAu!vBD^&!a+k#9_Bko2;A?{Vh$BE@uBVK^Nl;~G!5h;~( zQkdVIN%qK55Qtn&&j0cEvi1x_kcj%#bIww0^hM*XJ@<%Z5@PuhPYcd*dd-dMOv zN{1F$+j(8{s1~K^SV!-xJf&oy(@>77Dm^3^iEOJrwQ!ShOit-ihG}KBF0&TnO!FFDu>1s#@dMELWU+c^jv18=^8 zm-;yfL>0GG)vKmy8SUSBkx>aAY>w)BCwjv?!0F2ic;>$^df8uRIAXNUfCp|XOcH;FN9qDToNt=QID>hMm*+}d8n}Kfk=Y#A5joW-G%me}SF7=2B4;PLXQDDNV*z8V0R2(JAt1 zr*Zv1E6?}f2eZWR#zx5KkngAsT36;+X>U)BB}?iLx_3hB99i8nuIXJ*W%Jo@W4I)c zEUCMTP$#sxPQ}yeg6;v71*9Exdt85w{Jdt634M$(`o{1f&Jtf=)3)_A6xVVRRsxr! zf5bu{lFOG*pXq{`%<;IP=KZa!ujMs-Em7~V62*<3n-Fm@Gq%*lN8axGp((=e2VVwm zHaUv-J^4bo@jT36%ave@ z;(QF&)V!mfl>o{_^72KGQyr~mEghyA?tsI&)M&*~Cc~q$2AL2epJz(UF$?d4TQo`Q zS^3pzDSn(EjHh7rl};q{%#-{}O%MGP2jc-x)mLjz+b|UU-d|xf);L;0o3v?Cf4hR9 z>jZ402)1bwL6J$^Hjp}z?eNgn|31I+cB_K;GD|>W-`so7x%b-U(|$TnI~{@+n58Jd zz(2|s*V*hac?dp+IDG%^Lx|qK_fA+sE`m8;Aa9fq#wm&jXM;{BW1D<4COqPgYUV5v zUt&7g^vj0;r#woCcTDb39EAsTf0ivU;l;w!J^hk?kbHcy6Z2^z@CPws3>+ecOGP?= zIzWt+CL9MGhhQ61notIY08xq_p*ye|d`Ik7*mzF>(C?4W&nM^p>Ev|WaymtUFnKid z*>xNRV49IYQU$&rD8O03;RX>a`S!kOzeNCnnPhS7syLdv9NT;zv7Norf2gqE?*oGG zHz8^Xo2$39(n4W4mRfGYsa=m?J4JkM`1HWG=m&;oSUd#<5V7hwJ)KEmkx;yfze;M6 zbVp<+#gsofV7QlyBi!DJxeA11!jm&&c_zR>4QX@9+N_}CxNZ+PseV=Qy_nNz0X;!V zG}H?QdF9C8MmSBiP|+z>f7C1GyI$n@fmh`*1+%j^!(63xq-~&Uia?HN3ZTVam`$YzD5!pzoh&+XkA`9+} z4Vi)0tS^2<-RY{jERuOuPUWIsRn=M6bn+tR>vB|;>w<0(ek-O_Ipb51E@40G5LtW}K`q^pIl zj%96T*{UFWQu4lJe+HWA&u5-u2j9M}PG{kI_|r60*ro7et zBB||kdf3ak`S>AXoI$67#b2@A2?taG>OQM zp}VTh<#^@|e`M9aQZNU#u9sk<^5+`3A=a6ZFGa~OJO2Q!SZi*zENz1!4h&kNY<4oGl2jgO{oi-_(p#~U#V8u{b?&)OUi#P5bd~mc z46lhuaX`@gL$+RI%lFBB@JmR-w?{vR`0(xQ50S9Te_%z{cs5CxkQ`Gc#c{8fiCxZ2 znWXYT&wNbaB;m)qp1co8Drv%IXY3ZoGdK0TzQ&<>G%NmwY*>`68$eeZqmA^4=(BBlWn5=;2gze{*X*%FNr z<{UqGe*<|{TuzcQ( zU>c|b83$xXT5=p0a^bszUqhv?9K^^ePHMi~pV;lVP&zutcTR@oY~HK+PQTPz>% zVBBW#pni(ws=%c7tFMU|tE*36f=6ME3PGf2Sw$b5s97JKqRIpsX^7+EFcn`^z`^-h zgkwQUOLZUm#Tt!}H=|;17BmCjFL5%wR#Y6E=y=AGsJIjF%zkaHpO|_^y}kiW1c{^3D4)`2ZmMTC zZ8pYXIOROyo;D}Mc@`)P;mwvr%EBH%{0$l)lO$1+G4SvrlQ8whLD6*@Cn33_a^)2P zF);rUJ}?MWfS0~yl#@`+D-nZ+mCgStPoyq`MY6Vp;=Xg3HnWQkJxfD>z3<9#*{?@u zEf1rF6CA9NF}W(qeVMkowGzQ;t5dc2oxHXU+6h*lgcrdW;Q+=D5dJ_$k~65%m<8l_ z@KM8B6)cf0F7u*A?$AugaH1{@Z|ezLS`>%0V{gvX=4Fv5If}LFuv~2$I7CI8l2ihO zP}4!!&9q3_Jx|>tz6E-JjBMHWZ8_rZpqnO0HC0-xh?cW0anrW6-H9BWZQ-?BQ0-dZ z+SqM6O2(GFEa$$>LlP6!{|Jy2l9;Zkx)8^<9`s`>%LK-83@LTm)!ld3gneVZp4mxc4Dr0WAaZN;(~X9F%z#=Cj zbp2Y~K1EwU0D{ffCi-}Te_=v{f#F`qu??3O_DlV*UyP1`am{wf7 z+7jFQj>qWv5P5691;rK@DBk)(qAvv>+5mB3Z${HNbW^pR{&U5YJJI%34idrx(sH!| z7(9O>y7Zp?Xc~kQY{_Rzgd ztQImkGmuT)tNNEc4h;(s+3J)0A@^cj&o$x`sR9kcY2Z$w{e7f6Y4h&eszvead@(iN z8^|Z>p@?i{n?G&0W$o?;fUu?Uiz3>0_6~q*=VNfCI{y+st9X@W+{Vjk@dLvMxk>x_ z(7#-0ETo%%UUhw#S4{ED>MZ1qKxk`QZ18}s2CC2wo>PU(AiDGEM5(>`3m8{FHPTkS zs(IR?R!d%XRcyokCv^D#Y1K;IZoE{z@SxoJc_NSVC}?F|-n=vCP47R&SY2=1HWYpL zuej+vOTv<_13C<-YiC%RVk;0Vz`CcpFldR6xk!|kyd(%5f4n|3Wc|5XblJ zt-i&%WXlD8;7Y8Fq(6j~U$?{hZspzSsb%W6+-}>c(ye7{9`k%xE5ZBLy9Dnm`Sp$b`dfZ|?FGZcvrco2!i`HofS3deKj1CQ<{HNisS%Dz zLSz~p>3I#ob79KEF@j)QFNQIUqWftvAj{R$}l1VTp9jhwB1U`n5e3MF(|;wXQ)Td@nyJ^`7l zvfjCqsMeY1%D<>`1 zf22+?T69M3wD9sg}9 z1C}H|C5Bc?|7mAY(d78gg5e|WW&wYgSQXgi8Jhb2?K)ksM)IxzWI)LsfJZHjvbl4`+JJ9Fb?vNO!AQOMJLC#V)}iQ`|YcY(Je zEw9kTdu_th@FQ%Qsu#Ap1MLpM)!Q^LOx$OE6@hCDkyl`)Zwsc~pPR7mhn$4Xe-U`% zJi?!Gcy$I+;mCV-BDv0UaPt6sXg(R$O$Nx$5pWCrGYmXin^uQDpw4!u(@DA1^7Ka6 zBdq%0iCS9|J70&YWL#oM$14;*_DDnHP{ml8P?O9jjA3(H`A}Q^7{He=uuxl;k9fDl zTf#VNz@ZIw(9|ctu2t*ZRSlgse?@j|3%#rM-A(?O>#OARBf~&cP_9iW;&ED%S z3Z1ZqPt&`CarOEpkOl<84oQkc&Q&!rk9bm(w0Rb6JU8!=&D*Na9mVQ!e^no+3T;oM zsR1EbkNyF@SATEXFcAGe zpTd(+0jZldsnaC7wqlfOYy~DtD@|pJ+~feS!A6clskZL3&kiBPNgyU_8wrsgckiB` z&*$^!v-xyxSrpH}pJNA*fBiL>-35~`Z0US*!9Du$(Z%nNM&Eo!ube5&@TkS8FE}Pt z_{WwN_$EH>r2}(87#(%!0(-=5@<}iQD&h~vhDfWwE5SIPKq;pV6~M=Gtft=AoT%Rb z1ShZnzK37zvv<%Nr4p8mk1fZ;zK<@jBcC3vKNgbLoHGHA02ft!e_fH(*FYn_`bZX7 z0IEno=f2BaKqqLl*Ssh08;#c2cI&&{?Vq>pUVqSSUZ%o`$2qiAC>aKGjvs6F3`^jg zaS1A5Da_c!`ZOBt!Jt2|&-<zvb(ap#9KU2UPP@5^kubRs##D3u8jTEs1!& z_Sa$MEuoW=m{*~*4oD>i@RESN&{+oriC7Y@EnRi6G2=5_c8)JX=ahb-VOjmcmpb5L zz5L8E;}u)2rz!-I$e23N!qPNTC4xJTIA|Qua4{g;UajK5e-SlfzGe#%XmJXv06LXzP&v3GIBuDj;S!p6uig#IhBBimib z9A<0*`+^^wpnoRllYfoIk#)2R(hR6_B z5%rWi-J|f64NKw+X}>Z|Ppz18_FyVQ@ky;#y{7k+Jy5i1r%@HXLm}NYDFx-VhRC~&w_*=NA{h7=h~&OB?M2L zT>8{S{eL8M1&u-kOWcp<<1+C{KtfSPWv-;4JrpLsUoE0=(P~tVu^3KdlxfQeNJ{#2U~=O3YqkBu=Kf#K(VK&& zbI?9%yy`Ta)|=i@|EDw{=9FXOofTM~QCWbQJ*f!nc}>P5W-2xG_6M)1e_66ORju!^|?gdNssjT;Z=OTt*n*Kk-1f*R*P23wK_>jui?UP60& zdqs9%J)=F-tv3Q!%{2oPYS^tJ={1{G1glh%V_bDgt z148%gyM(Pwvja%9Q6FU(BY8e>8p7$;jDI6{_+zlh0Osd{^!4Q2dxzzOEu}IGJ_Bu{ zoHy2Hw;TBpD`@w=ocnOQwaRrG$;FjlG_9Y=xeqr|t6Zm%@h}RD8rhX|A8w>l2{)$T zlC0OE38S|jIeqHG70(%AmP>PXtKB(m_MEqkPWzy7+H}r(ooVm!S*PQ?Id)o&c7Nxr z*St3`AQVlwSSu@x^yi3~3|TNn7$n)-PwVeUom6D=Q*dN<6Ae%wkqR>m*lvO`&zy|V)jGAUcM!MQ z5nJEh6AIxCJ}MYIt0`D6Tsk7RelLB&y-C{|liPCKcSw04pZZJkSy{Wb<>P@0;pMJc z1f=5DBYheY&ot6itxn^$(>#JT&e?H$AKv3{xGU!sk3q95OB*;8H%cp#_J8k_qLrHJ z45)h_YMSbGo@X?+01YGXy1VR5qw#3>8y#is?#k_q#*-1{xpw#M?!7r|cTr~1dWjr8 z|4*2D{(oaiCVxwoUzbLl99=S)aXEj>K1`=S{GvTkydEwf0pi3Li&oCf)xz{=%p#GN zQ?jD%V!1*7l0^cUk~GA*N`GtF6Eabh!r<5*T+ zRmWr|Q0)hhlJS`7Tv4t?wqVIhso5>aNQ|k~>i%OrMUNjNJ7#3yK&Lx|3zltf+P1gx zzO1fV6ASOEc!|BYdMT}HsH()gTV~`b@PEwWR`(@c(Ab2#u(Z|4j(@dVHK%n2RTo%R zdberl=wO#*3YhkZOy*Da0sbe!QthRW-H*DF=na#&Lr&G$0A}iMLPFW_soqopW>KVi zLOfDaBA<@bP{eRJP^~y&v3{v%#FJl~`Xl}3D+pF+DYvGE_7f1qn}U9I8gKumfRTOqif#_U>Pobvh;(4bp{R zWZlT8m@?Jbsu{v8y;>OoWXIA5+vZQsEo^=QI{IKdpYK>cy%^pQYcnH-0y58~!}t-+#6%W8JDC{jI)sul26g zatmUao)I#~FE}Gh{AzO|`I`B`l%epYVZE0TFwV87P209Ep5#UXLEzJz`+96qWkzwJZ6 zUc2eDYMs8Jl3hLmpV5wzXfzYjApM*L&=~j^%05`?_gnxMD zvI4CF&}Q}w>jGtxUk7(pih&ig*UnN3k@6DXR_^CXx@9xLEq9&A=&uC(eTMd~)n3>W zZ;yRu*nednGQ^WsoG@jAfQOLDOc}}Goo?-ED$wASUxu!;xNs=_k(Z*;2X)7=p{H6N z7e3?hI_batFIVxD&>@&Vf;(XvcZMO`($;`&iPvJn3}j97-q6{;92)DSWf;Rq&JHov zOb($~EhqJ(s|u+l5|+*{oswNk!!Q(v@AE4n41d``VZy|V`GF4cpDlgR}Xi1Hr(;$ssYOmrl>L^I zxnWE}fzE(HepvY;^{2Tm#VErp8Vob&N6E%%wG%lOki=R!vLF??WM3JKa}<{`V}Ajl zJ-#yDbX_BMXFQDY=~W8u2q>(hSAwKgT)J&~MnRp{4Xz%$Jn62X|&jqC&_Kf$bWy|wft=>PSOn~NKo`~boFr7G zB&4wToF(_!!$+|R-$yih`{rFl&ff-Kl;GdO6-`KRCAiX(Fs{|iaWZwto@=g|el{at z1@5GB=7cd(3a&&P(@-EvpAj}a@>#zxGB-A+J?)@?!+J{aO90G!DmWQ?U%=%T_%j*Xqu=AoSZ-q zij3o=!8U;luq&)hd1WYXooRu2~j_n)m8V=0vMM6@) zju+phwoQ4HRA-Vy@JQr>Zc-uf7!0XEOFU^d*s`6L$a{0!A&~-e34f=6=a(>%!mIfq ztVZQQ@WTZ}S&GSlXsUq3v3R1xR&A)BZ0uv~D z^LS|U`TSpiYm~FkgWX>lH((#znZPjl%V;vHE;8+!K4T(hN`GS}TK8jPAH%)Db?dJ0 z_6W$vr-KvoT}q{HU{;CJ>nYXS3AeI!NW_hpIFR{K0d$ZbdWYK{I8)9P)eg(cn_JUe z=iNJC3ST}AC0ZanG7p~lZJ}e&QQ*fpuoDV|L#N zr%w-5Ho! z<$)XgQ$%=3o5x{ELM`Mox(c%e77OKqPbeg>-qtU8_IP=4+zT?mXo0nLw$2}|R9$P^ zFcf|Fueb#h+mMV6ItI;>v89HxF;-~yFfbTJzK+$|l7FX<($MC=PnJ_ViPw_C^x~`I z`*F_Il|Fu|i`w%zsZiB~BBWQQTAB41aZf*Fn4Q0SpOLrc$yX)#4K1)D$wF|YC1G5v zsplDWN=(c((;J6e3mb`Y>d}%Y1u-{OpAqn0BhM5hui~+1dk-GiRhw1GDCCAy%>)M< zLVt%NAAd`%kn1t{%4LBWa8s7!Qwk16fL{|`bUA#sGb6{LWzsB`L--9F^-Ela5+fZcz;e099`3N!PI1)6RL&WOy<_#YR}m^ zR9NO07mKTS@h$!S<1$W{zpmqS@%d&MH9gr8pFu#RB%8otePxS_)h$vT9MgNM9Jc=> z=+4as{Zr6$T^x3ExN9}Glm_j1j#{tn1r43^sq|lxFeL5}z*6B+k^kJJ{ZVwIK(Z{B zQh&(MUA-{`mjV@Vp`jpm2n6m(Y0zFW&;>$61toD$KmczbxwSVdMNUPAhw~cQRLwUS zgPWMJ-N9@Qhkm;$-FjQ^FQrytZ`v>r{m!rOG_<4=j85t_3D!n6@H(12MWahLb3b|D zoqhP|;nTChcfqLRj$wia7NbIPOsEvCN+l9y&e&8EIZsx)Oq~SYDtmI~LMRENgBv=< z0rA>=6itB2)y98&O4ncErxz(&6FAz#LmVATrjp-4CV_ea4UQ^D=6`qP zPX(#ZjTg|B{k466+aEgCwSCtfI$hgB=g1gK88#b@XXUFd5@+ujA2mFVeOW&}You#$ zjaK3+jGhAGB0r*T%oV9k_qX}33IW9BsG(|VuRPNz2x?`pZ?^@ihFFeQKB`3jJV`L5 zq~eeG$Xo_|bFOVN`|($urg5KGRwmE)WC)5_fV;MEzm}vOf>OO6Z-`FG9{j z;Bs!yh>*g}@J;Or4G4uaKv&zIl!CH9-ZzjXgXPKOV#_gSFNnfRsfrwwn`uynbmn~) zQ4dLmrof3mM|h-qPe>yRX`^HVB8HfAJU6#8QYvRh>fsU#SpRP}lhA$Ed4GBaSN6b- zxFAy~z_JU!E`yI&+I?HAZi`;*?#+%K zAR>iWB1^BRaDIH5hJ`6*66v6z9K*8I%tsheH7QtvEL-BuH04rtNKSczHDqXw8iic- zrW1l&QbYS9VJZvx-TV57piaY2-eWEt>k1)%pACK{jvsHCVLy0G7vWW z>}5qLkpu@e=Zsrw8pt&>8cmXAk!P|zlq#n<6uwb5+ay?2`h>hjCI5KTj0 zL>}=_JSfBX@wQHdQA4M-m|ANK%c9)0%xDH(6sW6E)9F#wT#22Tyr9&O(^!c>tC_9< z8aqbcp{~<4*wpTk&3~GcZ{aPQZL@pofv?^>UiKkW(0M80D$x!Xl||(rt&qV=12GVW z?|F(jEbSJ0P^fs=mV#2Ko(h7e1(_z(-C#BenM7K|cQ;+u_F_@QTr!#YXXg7eU;5Sy zVX-6jC<$KHsoSRJ&h6!`A~n0dQFt}0AKBR_*;0q~y|WwxYJVHK5+d<$dR8{-c<3`5 zmpds`qQ7>>o#%-UUpetEARnK$MoZWwE2DN68j7nBT;Ot2eJenv1_6eE2Pmk2{h%)E zzgU36V{BmoHW@R8B7Y%cLphQsL%BL0Pho)RT%bXJfk^W+8m%tb%P8`-92IY9(s2>@ zY$t?&v7yg|AAjN##Tt80+c^AxK82a8k!o<-NjsfX28e@B+ub%e7?V!x33-V_y`@Pn zc7ST@cRxS!aQsM}QnpIdLTvxuZ|CLFd^+FSO5qHVISdiFeqGEy7dL-o_u=mmieCKs zTLhoKnEXky^fH{H8JwJCDWN&UDJA<`TLtNPX7XV%M}H?%6n>q&%`$@OKleRhjZ=#0 zLcBT87(|qNpS%yzoZ>8dgNS54k++hL<0as~+Vw|F=VHKcz ziqeRHNk0KK&s*QN0Q=4JjG~aD2n^tSo?sN6q8JtlCEx(SJco;5xG#4WpA#H{xJX0J z69~CrgMX)kTbLAR7YvBN#!jV0lI;2rW=b0j=8#Tn7z5lq#(6d?NnGGDgMdNYA=G{WSp^n=yZwsxB2V!{lt@~6GSd2JIza0D!` z!GEZ9X6+!1BFr@llXE)=+XfdfMjBIR>VRad)?iA$wIJx$2MZ`n+Bm)O5#*)1v!C8Y zIGdpyhdzkjGb3RUWer4{7!gC-iD}F>^ue>#(v9KHMr3*n&t^f%;@3LwGPfG+>v~_c zUx-ZG)TEJ$Z!xvKSDQ#Ng>uJ@Dn|zXInd8uB%ZS=8%(c2R8?hS9*bTZW|6&Se?@7vp!D%AR+a@Im$W4%=NnTTH%f5B4|G5iGH& zrPb}eY8A$3Xp}*+Tb0xCD?xB^ix4KghpGBpT?riA*XQ4}UXWMs%xQx*P}fOa|7C4y zYNv&wr-nR(l8|OE!RbAP1EDiWd4C~OVz4P^fa6PP5~of#5wim6bAlF67E$XB}l z2b7U>S@(t9I|+?WcvIW4b?=ZrbMQJj`Vkl34JY(%tFi6hFyDh zcbMmCNicIZslq!JMQ4yQnuIY{4C%(WDj%X+@(p2r2~SgSn$ZXA)+<9ZM1St={OEdk zCq)h*D5n#5Q_Qj)rhrVdB8dPakL!c~_p?+Hp*ahOC=Erg!ejG#)q+-5o+@BXwWvs4 z)k{^e<68!}dlggl9wpnwSv%K8|1xKsB-2!Ky)qn}j3*;=i z1m5ifi9;!vR0`Z>Q|GR<+JD7yXiRmaWFNBE&i}%6%(wk0sMf`Jtu=%(8#hZ`Y_@FD zw5$r2_8P;GX8A(c`$?9@_$J^7>l=0g*RR9Ch68kM_E zf_d(i7Qds$YTuY>1E|wdJCCz5s`~zFplw3s0bUM{yPB(wOZgH}r-*k!m}Duk$)KUu z(LA|Q@lRr89Tqyfn}7Dq@zcND!!)ctdI(o5i7A?GJTP@nz6DDCBB}aqc&vTg&Wn;; zYe=i8YVWm`e-43Oq+;rgTiDgA(5{OpaSGJEe&gY(fni{W4&If7Qk$Ouy4uE-)+^7{C zRcg{!z{q%|HPe3gxhwBbS{JiF?*7DYPUSAsEnyZW$ysbkC`5c-!4=VNVffE1g9Q{3 z>m)pDNb5885Pv7SCm#Y+_a%tJM*XN{6Yo*Ts>`A63VNTJ$t#ExW?M9q11rGzDW@ld zk4gl4#<0Xwsp(>cQkA~5US>v>_n1qCu(+Ah`rDgw#<0>-IBC*S1d$uD6q+yAyGj!@ zblXrRVpV#Z7^PLe&rCvJy(2ydg{}D1bDdvGfdO(}LVt9diAmUF`2z(Bf`kGd>81Gy zzu+oce~73U`C6{Uh_SgA^VZs8tws2toJvdO@NLf@_RIG}7K+0%k0T zGoGG^o~4m-kB@xI`Y}N63h;~I1 zY9RFbPO5Lvuzgg<-Z?JZ2IYh%uWspkf2yvgWCo47Dw5zV^C5Ap+|fGsr3P;l?INC3 zRPwt}k(q*qGqd!OOK(KI=$;keXs7joD620=mWH8CTf-qAZpp`>MyLwh`oTqc$)>=p zZhzXATmJ)6R|=?`zsy{xbn z=@)A}IiU>sO%SyH9L}vFMNd6)XPJp^6Msl8yoY;o%9IC9z#X9}JfyF3aa83<+c{PpJ+;|*05SZNR{%JTh5@-#G}hKY+;FT5boB%6-9CDoON;UDS_x$>wgJy z1VK<+-bV0tL5;zPyCa;C9LR&Vri_?99pD?`oOp_lAh=mHw%$y}o?pza%o*9QVTthS z>>9-^{3!R|@Z*7_@Dp?zesXqhcy`FOOdtJC+Bht;T9B;b=%O>3avw5>jplLeAa;|c z-DNJo<}cdr$=I@UyYtne2V?oW=zj_WRS0YYcQ8nwc548cH|!2g8G)0QjQ$oIGFa-z z@tbvQAfC-+0)x>|4H|oX4tgohm0iRv@9I42`q}gHzeXoTJu17RNZx!C%!^ZEu@M5dQ98u^-%mC4Z+%PN`Zo zmqf%Ss$0kQ+0N;zQlSkD@wTvwc9%3(oB!T{#WuCgUHX!f!xv!pnVDyvnPu5OPt#f2 zXmFZ)+4Y&Y4PJy09v(ao>HeYjMhQL%W{^;?Be>F%GOpE8qmilm*tlFX zJugN^0xdxvHRx6DCeS2^see*r<(9y$1|BNn{SX=Nj4G&jVM!W80yy)dj#kgToN9!+ zG`=(lUa1rs0u3Q)G9EJy#(E@03R2I>F|nGe7_yEEgCKWBISp~=^;q9d>$jYnH%(H{Nq zZBsN&V+LUtBAUfIpD^vz`qd(dLW-X(&??26+_ojPnax9$c{)$wk*pPsRCjHaT=Ebi z+_1y{Nke>$q<=`tuE0SrqOpQsl{Q8`1V#1g6> zhkjAPb%zv0XuipJipcBPE&i=HKj;;k|0AZVA|XD)_xCDVtGnxX@4pT(xSGBSh@|oj@L>GZSeF5ALgcoP-20&tbceT;(MUzZp_SiK6Sbt~>8;?<>p?CZ<_oAHHh%z~9#?Lu7%xc> z+;ATAK`M6y{aYm@Y{?FRfPsJ=2^B)Tfj&%X8|a#IPW=%O&dFiWH#vP+EbGjMvl_D_ zU??yZTxj|)lA?>1R3e$K2HtI)zloGx&25f973C-((Lc!iG^-@5X$nEvU2en~v658T z=$3<6Jy#EU@FaSF?0+_uWZ!uzTT=7%R`5#qmiAN{#7mB_*`lS5+1JWcW+AJeCQ$8X zuC>!tHWdB?Nzuhh{_<2B-px~4kS(UtME+nZ^Bz~u)q@^9iQfNqDg(Nsg04fnK4juD z#+xV(2DN|mv-D>R@VYAgAb`aZih5WdszNPfoo>CAg6&{Mw13U2tMEvLk|rU3-gMDz zXFo=EYV(I!)=>)R(n98OE^Uv0`O8yeRA8d9f}vxO$9z?Wo>&0n>?h zGoE_0ikV|8Wq)4odNML!&n=j9yEsb48F&+~sd46Oj+FQ1=-dOXS8Y?qQ4oeWOkzxPf)%cql+K&K3YE$!~J&%WMq zG02u#r<0Hvct%1%lRxr!nlC=258?R?W~Xn@X5{45|9_LG$;WUBG4V%?_B)-NKS%fa zA%slOG*MPV;Ayl1R=(^%6UDH-Nd&ODB--zU5#byeGDPDnf*2CPk^kRNJKs7;{$%+y zq9K~+NvL?Dj4%%PAZOGq zjqi$Y*njuccl~l7AFIztr;8N6{9Ayz{nEujn8sO}6k%N=!Wda&LrmugpP>unhiRS& ztj%46V;hLWRU*Jamsi^B_~)RD9FmJ=%BWbIl2awgh*+90&jN$UQ-#v`ODK(=z=!}`B-6CAdqmY$`8HYU z)CcGoIX%yFc^MJ8PphRleQ`~Fe)oiCDrP4zvgpS%kR}MR|~4WaBMU5SdZJ3a2OQ@O7bYOYo|il z^M5IyC?Vb|7m3{S=QNUgW3nQwlys5*`_1jA>*3_{``eq}-haBDjE1*bzq%{rW(baC z?H_YzN28XFBA3#?^aZ$8tH|3f5=Uw4w(=Q}NcGIlx?iz(NolaZKqf-ck${kO|@!Wr`w_+O*usKUQdQFr3nlnB7&|8*uSY* ze$Xy(k(2Jur*&pg&OzXo@vbign@n}BzkEq-GF2{d3*T*6AY8~ejXmD1rOuTz@^ke=Wv7&lpX_9KRYRWEuey>Gsq@qu~v5e&Pe7#Z10_+ZitZY9$uZ*tbOxFh18mX*l7F*)LcyO^N18_G%lp$nQ>VIwK@{m^+ zUW3VYmTEy*w-(AjOYXDAe?p#rPHAuTQ>a{cPn~}Om5#d#!axv3`~8Y3EVK|56pM(W zHfrgk3&>_NNfxpXc4tKq|J_7I3oCDTxQEM~&Ryk%Fj7-+5(!T0sIyou?FA<}<)h&^ zmxEEd4c6?jA}!OSSLu$}D}OqZ4~Y;m3+yE_U@b#{#T!2kDD7&}WH>L9yPB@HkG5o%afG<||g8O=M(vuqr5h9;R{Idv3}dmFL?HD=X|4;(Nh^KMeftaCH62(0&lyuPaie=o~k@EElqkn&@bkizt2B zZjX9>Z_o_~-qlSv41V2vZjD4k*%`BLfl@=50n6#sK)GqigvL4Q{Je_!UseGvGsR#i z&9%%#RP)U3=zngAbP-TkXOf@4w@uNBnR0#jV*-Xv2i1t+ifv~rwkL%hRujxq*os}M z!eXgmLl$exOo?@}cVoHovf|IwKxO8C5ZrJ!NfkVW3AK2<*TNTVqKI%`zb^36zDpXd zMDHC`mtj8(==(Nn%cf=l|fK5Lgz4B0k&tj`M@uUlU@e*w)@QES^U5PtWsxD}JwBUuvY zC?w6sI@Yy?cCc=HnTJv2b8N6BBgt*T$bX+?JF#QCkUb3M7aQMqpT6(zbeHe5D6=d^ zQj{5?2!H-fp04us72nW{0E6?{+ki~Zy*tU-BaJX6-ggmuUr~t|pHRq!W##gev`-s~ znTk2n$&%-S;saOLJZHfnvao1Eq=f4@!Oy5Za;A_e3AoYkK!W$T;=B(lsRW_w@XPvb zfqpW<6;g!(*xI-xYrNvYc2UOiRT5JOb4HCQ5Pwy!W9K4v3rI;~9vg+=;=bg7C9ph6 z7Kf-OQTYYJj|dAA6wZOxF{zA?3JR^#1zksHa75@fPU<_YO05svx%Ia#bW1st2Iz&l zr2bl~p;b{!Hw~#8t+>FJ+y){JOU*B;Q<31$!0`E$Mx8JYt9#>+& zWThgixl&IN)+&p!I)zK{GJ$J9H7U;7q+%Hxnz`e7KVG|&IF)CkeZ}-gf$jLLJ%7fj zQ(}J3e)Udr1+AxIXYH&%m62OZ!$1&)-}5WR5;27;3KgOCLexktv=&>Sh9^s5BtqN&vhpbxNn9ED2QcQv4be}|m8O1E;v0tWy zkrcZ^KM2F)vg3uy{uS4WcQi;5+Wn_4EO$fYP*q@R)8Rrxl24r+S-#v*^*5$Pd9t33 zNIazn{Vf zg(P=<8Fxd7mTrPkjv;MKgS*qIDUp}BtszZvwzC((`0QspZsH_P)(%l2mc)L3e%}1N zy*Nx(Nv9LRHKGah5%Auo>x*>xD!%rg1t{2m@-%>Z`|dj$M<4tZT0{3Qg2$asO1IfN zz4lSUa2&bE(IpIjagcpKK>>yzZxWQRk9P(XA73Ls4sf*m0hn_{ci1)$3ajA#gdg+)$a0ww?w0&i^V+ou&{ z2|XMQho3oUpGwq0OqRodzy<5ud$T|G=gu%&czF2D0+Rz^aVP%*mxz-Em@>7hL-aH9 z?vsJ|XgT95M=%WID-a%^rLS z83Nsm{s{7aKl$Msob)2ZK3JrYFO&#i(89XiMe50s#F;t7ugg}L_7CnBem3VEx6_lC-pTZT_3=yZSMU zfx$&g5O)D!Z*43Q6$+DA4wCXxMv|CH)AaPMlgR|^RVfPgfXhgV#--I;1Iuhh;wuoL zt8GHY*4c!!&96qp7Pci90Tb@>hyrw-$UDU^;1Al$aoSv)JE9)n?5Z1=-7&M4?#eZz zt39-Tg1e>S+H;icI3{mWhBR>3COP5xG`vJ-!b>=V-Oo7}4HsGw$iTL}G*Sy0p?=M~ z2_%$<%t?XUKak&~2Uh|DS|^NOn=u@yht}1ojXL~^vT`YZ z3xNx7k&gVWc+FwC1~JP3u@Vq6|hpiWee)21lZ^s)?#c zHLNGNK=$K1--Eon$ghG?dPCi!oJ18QMdLBcshaa=8z%+ogSK&Uq7F7+mNv7MQ|@?M|Et8|YGJ#3QEQ%hlnmF<(^h?~Ug}m|xJ?qR z+N>PsCIl_LHROsD^9$RaeHsl9AI^VsM$Vx<9P)SZ`m4j=W}oDf?YiPweSByS#NTgL zR!Z~#C0N<}*GU{9eF#x;x~JTK%Uqu)Ykr3_@>;AhfLPM_NX}3)vf1x*(XXa#6%)*E z^p$1>Jb)8dKhX|0#|3N{rPM zB{&;QjHYOumeh~RReX=r3iGs?B;Dl0)&|vF@EOKU+Eq~T!q`u4dcXUqUm3Wp5%BnN zHYBvMXG`hZl20agGe|oHNt)ov4hr83+`D^s4P$x#Fu) z@@!em?M3=4=6eeqijR+|m{z!)=TP{C?Rl?{&pl6s%;8{={j(f@r*^O*Xxw)G2c=YN zZ<{a_{m!rOq$mL`(bB2Yq-4!Rfvs#wsK`T_goGSp61Nmn8=^#0{`<@$gh5(moxgzX zdydb&_t;;)Mw>{ILimJv1Q7=AUGlU_*0*$rK6}`^zWU_B{9obJLn;h^uC3p|ckFF%OKAmCy_PBt)ryX0Xi*hUIok{3f^yT6r1* z6ed9+=3 z<7A6V_^<>Y%D)x~Nlaj%RRp!-4dK0!50Pm4zBgLqShUY4Yq>&^Dy*dO?xskjF0sbN zORf|6tgvH$1!$H`nFDCIffF$rVHWRQydym3$IUM25U=x6l@_*{=9W)-BjQy~1vn5F z@S<5ZpS7{6v1GO zGA=ur-`yl6&k2^Rl7)aGM(F})X4!MsHoh;$s$G@AaGbCZoC8iEe>}SVaQ2eds#5fz zc8!lG9EurgJ|%BEsr#=__vwEy5cbu6x)Vz`T+K3U&Bz|?S*iXY{Q;#^ z%WB+zFcjVUD-;O9LsCc~rO;^-=!>?Cb}`URU5rM)6RVLWp~p<7jsLx}Est&4V@Rrn zvF_uXd#-f#_EzRHia0JnOH2TzpKYjOtQgDgAcK5MhV(jPHNyZC4y_CEHSaKVNnM* z*Je)e$6Ar@{;JNh7psCAFHgDXfurai9rs%fW6V6kw90_Jr=hw4HQsanaEt ztlcZCgal>w-`w+$u5UWS56mn~RTioU5*{B>v@CfpH^5I{R1_N zJqyAx5J30)6*qLK;Gj@(s3JINN5xH$d|YiHxrC%Ag81L9h;Mwnx7np30k8^Gk}`z1 zg9I)2eSDg=CEF}lRxO%qS0bN(%|Jo50FFn>{kOhkccK#ggYxk&;RQI6M0;nj7dE4d zjQQ8qm1H-^N~=QCjay{#e%8VpKCM+vZ`&{oz57?NXj(f!wkAc39lUhtunpTz#d@p@ zLviR>m@ONU+$JcJ-#*z=;?KA(Fr6%ke2;u2<H;5d5Eid9uh?U(vpWY0A7`?1{v5dCOOMf=nJRTq}r) z5KuVXrIbnJ){6ydWt=_{i7*Ojj75xY^El&ahFos$h>QfxfpAVX&bVb2@-+E|A<1K@ zY`l=fVh@xrVj4i0v!Don1bjb8nUFjWq%%^%<~T0xbTq}HAvh-<6~3~fY_+!<*G!5f zBc473!)NgRheD412SX^SAjyS<1p)ybf^E_**7oo<5?M@T;iWRhbrz>fbnH`m0y^Re zT-N+XGNR(c&0b~YbMSwdKDv$Uy;5ZVFK&EXQz3;jn^fii-AMym$y-J=44cd{R zIPB!D&Kzy-HmpmXYfYvR&(FcO;bcDVr>GKocm!k9gx&Tu3P+i9W*prijgfUVZVPJA zOphcabF{K$+DapTgQ0xw@nkQ?3S|p*JQzqvydyy<^(5CO6H{S(H?v`W17$Jo-BfRO z#pdktTJO&6SNN+W-p_ww7-uEF*-T4*!>+<;@wXl+CD#u#sK@kg&GRd0Zz^fu91r0> zQyDdZO9fhQc4r`qCvy%#oHEpuZsV@!A?b;z9=39NNBXyaLXY#&#^&V%V4tcweguyu zwYR}2)H^0){XPsu;`=fkCa=b&s=tb&e~PM1hDe3Ns{W20;(Z@Af1v9BIM`C*0Ai~_ zE6Y9L*7^rEi@OQ}F%SUz{faHFP_R%qu{cGrQcJ~7kUaLhK(Yy&L2i;VIMCruSM!$zx2ix8XH+%rKSMP7zHW2;pzk=!9NW$#7!!iu8 z7Z+)oq8Yk0u$z6U3qzJpHZz$LNGeTG_+in%>SXbkh}hiQz}B7gdWq;TZ*d+mA-PML6pJ^mfc^iIjtCb_ zQu&a+xsGrh@XjmmJ%}ZZ*y4t95K(yNu0qg&$_ZT&Z#Y$dvlOg5k#d>j6w-BG=n6ry z;kk^sy9PqHe{l#~K&8myam>ovOBGFknd^P)5qvzQGP%6^bTPX+`>?#8ef;P0?Zw;W z{QUjJ-)GC4*(Et8R;mGW!|`Yo^XQJ^MnjRpj;u+FgRdoc5`5B6D*R1@g(kJJ3{l{Q zF6Zup?c_6(RY*M&B+OG8Aj@S+nkSyLJA|*xSw>%Fe~CM?Bn$^#)YOt%N6X&kU{1t!-PS@p?=ceC^1h5?G;CeW#LAh2b;y$yOHI?2L4sQ*wr$($*mkDB|6I+?H-SZOSlhTQg^kST)d>ggZn&uN<;Aw z=;ajK@&H27dr8Lv=sa|F9gszp^04xk9WJ9T-tYKv3%2}Xgz7CCWh^&8=}V1(*WTfV zN!4Ye&Akb60TW^5o65vuOq{*^2ih@|XiEIXoMJlH3;5o+hCe%}jb0AxT)ZMndGgeUHIbdY}1fS4cBYQb>kcH7UV$5KPW>ppdh z0WdaClN;a|ZyaW%*Kb0HF1a+dK&UxK0Ne(;!@>uKX*~p&XGvO-Zq(-4n3kqB8$NwT zBcPs9iB@ZTxt*&)FFDfFMVcC{$uAym`=Y3vyr{=z)9g%05)Fu=5BVtmXsKL32^hM9emF(TRtvzKIzcRZBj)1MNc(GJ8jGLR)EUZRm0m3US4mLJjN_?^$n?nYEbitLnL?i z0MjE#;Z7Sf1k)#{39tg!Y78N++pT!*wO~*W+NMkv@+s<`62`ZmL{m}%wDYOL9>S;# z4MXpPB>x13IvfeabhihK)wpw7=6O9igN11ZcF{39O?7?B`Wbu5t_TY?=o{&h24EwB zE-o;x@l76*f-BC&KYAM-R!jV+3na>8TuS4OYI)kSgV^GiLX1JfGTOXg!3}`% zBQxKR>5e7$+reF{+-3N%==T*|ey|}xll-TE@P=#!g*GJM%KAq0s0ycbtxy`G8%jhd{$3-+ogOpU-;ZKyFF}$I1_qUg z(0HC$pkvz|cuR$Z_kSp8jB8K?z}ihHDB$-t6!U)_Cj>~-O*7C*%Rf#qI8HE3$plpV zmaL+bnv$VX3n%VdP0gL}OqkqMY5k$jrcQ_XBYCn8_TSFJfA2G!B<|n7qLv6YkQ-*6 zj%el30&I-@FySZij;>BS&o?0eAnOcj08a*kP`1((S|@+JI=P*2*~}A_A-_X@w=jwJ zTR%NdMThPX%>R}$A99*(j)Bwbtxv*5hqC6kBF&&$($_(?eP^!wQ&I^|_yo=_0^tkj zf34wv*GLWXKXo9`jR*gqC1900#)_R5wUv32JHS+1Rcp}$Z>W&)|LaV_04cVhe*OQS zLJ4R}wEs`bVR+|Vc{557b2K+7Hrb@Wq)b99#blMB(tz>q^k>w1!d%XD(cwQwhxk0> zO?&@U@+^MO@f_*ZfvR?sBAKR0v8m+mNnPdkDf6X0DEW{5E$``RhCA&7lSp(n+BlxV zWmxiGiot9wkiz%rza5D=!svgSOF4nP3IK@i2c>9mxOGGoP+qKbHQ|Dr5?hTiA*d}Y z-7I$CI~n_ajoL3P)rTjVB%@6%F%$H~!v(1=1pS_V5js8dY8|-R%bQd%tPA9`d8tH! zP0K_5aQ&dmh*K~VM(_y_wGB*bs3ft__=U6LUk863;7x`k@o0 zO3x!lC~TT1wMb^luOt+bRMA4!0#IP*18nhj8W@0|b{Jv6_q7(Fg!)krmh^SX+Ji(- z5hLP}qSkT%<4BKZ8d(XObJHbIlKA;S_hzPcW1!45y%0Z6f&Glb0KCH$3%|v@Rl=sg z_5tp{zC1!;#`?b%aI^;X|Ev%~AniJo*nj;Rpn!dAP(uIrkm3J*0}J@H3WW;LRW$sk z5Fr0k2wJ5jo6&_6DV9{s6&LL;%YDgcYB%*L171rs1}9!!@upHPI@Ipc2t^61@WRaFmv548hKw8! z@bGKHS7DHduw za&b3R2fIWo+;kPYOsSx3NsN`1r0kT)1ArvV`*|v_4OGf)Bh_{+mO{UZve451peUjiF{)AtscAN!F`NOqos4Nt)rN)A z;jE{4rtAn17wod{lq?N(qaQs^sDlw84rkT{NrUTLw8?R$8^s*z2=Xv6*fLXyU;HWS zce>s21B}|L`!NmhBZrgn7dG*9c)CaNh*_*?^d{ltzl7UPwPa7-Mj$gz3dF&8)@=?G=*O?+%L(lKVh(W27B zRGN`Lw2{$UhW7UuVUyhLVQ-(@kCqhlE)v$2HO=AcC_bEHBX4o(=@&u!8QSw@Kj1+K zlQW^L$nkRg@nit_s>zd>+yQr)&GQ_T>M%XSB>8t4$bFr$R0v4(DID1&|P z+X(>+QTHq!hLoVyv+b!wF=^(2OEb7SkTcRt3yOJ%P`na#F&Om}Z`l-G-t^gc3$B&r zExWFdaRK37WYun`V6K=b+ocsQ*N49L#qzaBJ)M5N$$7p{;7!v*0AI)hCGh+C&i<#P zn3E!lC$$@CU|a5l-31aN4JVZ z5?!v9@4XdmEb4P6i3a(8GDEvP-{;}l!se@sk8er}%N4Aa=0g$0JJ?gOIjqzwz+AScOAtJL=HWJ~`TG$p*ROt)*p-$S= z$tH?dUOK9D($tnbv~(I&N+gf1h`UoH`o}|qwv}suv^8g?TWm6w3zX3I1R4LLF;9N+ zwl(Rp)%SgY0dER2{pK+R40$=E3UNP%(5zH0)-5{EW0_8}m`4He5?DL~MG7!yg;3tN z*{mwygN<&Y8)qvjeK_+HdvA z1GR2cWi8$hYcnoHtgPJbZ~)>oJsnvMv!ZiMu)M^gHfoAy$NNIu36F~U8jv#%x+ zh=)!RB9VpuNure^z*2<37t(|S9U6bt^k0jM8Zo^;g(+Zqtb&GmkXC81he|<5GY#3o za^A~;4XCI3>3*hO6B^t)+Mj5dE*>1 z$*FSkd`_c}awrQc#}-2VtnFL8zjyK3g){w+q-oz2s9ManT)keOuYF{oNIARkTu^^m z0*xXw7>|}|suVHjfOJ}|i&Q@)wCOtcS2leqEZVz4Ghias89ywtt-`V;^Hc6FP@Ui! z@tn1Efprm-aNH#gb2sX!eDKcrS}I@`ndT_v&Q`^-<4RH1Ly|bOQqQsT7e~KH`ql;L zBHRxEI_Gu$ro$x?7FAFMda`%%Q%YE95d5M%d~Zk4jxtERwCMYm?M6Q5?wgaojG4C# z^oCpI6#%FWl?}e7U*5J6AP=;Ee94A8GgWJt&x>nQs{csB1uf{k5K_3$&myg2#y!d& zsPKHrTF;KrDROq1YPGT+HUJ(7>Q)RcMSFF-Og2LV4m=zSJmOs2s=e4qhW_u(6M zNs@d`giGWF*XyaT>#Sddnkfbua_J!GpqbmRR=~$Fbr_+NRo49^8>&9Ng4;-EL>bxF z{cs>g#WIXenFkfL$}%KCyu7imIV=0QgPo3XR(F`M5*vdl-HhlGmY( zAAnQk_Z@uv_}I$qt2ofv>LN3L;7A>({yXl?H3_V}e$G|r^CW3|#RY@1V`s&wMr|C> zGk!s9kPK_Qo=KUAh@JmdSAkk{a`6|*{0dO;4YH*Bk3rFj^1YJ-I?b7vxgP5bEVgx$ z&tDzSDw#IM`?ZomxgW5_4~0@%|D zZ`QY*5~eE*X7iKvjm~Z4_Mr)2`!z+foHzn#y4g$IyEeIa`yMc4y-=3!KY3kNlZ818 zBkn%UpvZgR>bb$uwwGePuQI;i46;rHkH7TZ->y4Y;3T^XBlJcg;JG`7i5(5O1Yr1O zwcAyqQP1)`($^Vle>&iF3`W7a&%it$%#zg@&qzc2G;Z}0e|veeJ3v>ERO?L&e^Xok zB^d;g74G*Jgdw%)wLLXm+Vc4{nsTQqks+_Xb%*Q@z}EKEfJWlG3-}|J_ta5NR15k( z{R$t6wI#vXgZ`2=nla%WxSo9~26W+{D9Jv}B8~>_Qwd3oGP-$+%@Mq>qAqR_th*#t zGk{rNu+|o zmBzPfBE3t>tA^ICH(t;b3Fkd=u*iVPIhhfNe~E04`;9bum4B#4^8<7weBl~40d-_V zQ3QF3yFCW3WDDKlZoNJ~))G=u=^9>?Gg9QD(ylCt_yvx85h3OJ(%S@SCRu_~p9ndDd&POQUN%Qh@@cqLW;dV@Q{)z(nOc#VQ zDccVcSQwrsvfu@Az{HuuDBk6(y{5p@JB$X^YLBa za<*MJ!O3#VywK)!OwAr4EIO^G7`G$XM_oKd?sdP5SW=^`V5`z$AF$OYu?AflHeW&P zzzMNqEZRSd)IflX$r5$T1phn5v;G6TO*X} zE>e3vK9pk4D=PSK-nl-gS#y{lH>YT{43VclzoNx(aR~|x_R8}g!n+*;muZ%<_c6Xw zVbZ`VFhO@#FP_$yOT^DH3vgp+PAuOyPENuspkW_WIYS1^5A_uD>fc}NE5)i~_kCob2u`^=MQDR4wB zFFeh8tz&2n4!H%DwNmK>wR|o#sO<@LGLyVll0s{%K_{;Z(>z_+Grdlh&u8mII0;W+ z*JbyrNlKewIRBHA&!U?i{6(g2=0|F!LN1}OW^)_6B$#`wXc!aTUGvV~d4_axA5$2yvqa)&$yC!dS%GD6l) zB6{-cWgMgZy8+Q4;2VM?kHL%SnU9&UtfGluTBEV6A7;|ChDCn~{Ec_p zfGKQ-&xqQ!7p7oH(_BNbh;0?LcKzUD1wrw(*y@u7Bmg&NB!4MX8;KPbtS4IDS{ot3 zT@F%VPrZf4w-W5|@=53@WC48#x1hh>P5R8fT^Uij7}ephGh6}@9s zVzfAkOnX2du?K_0)3dJaQfGvtZUBcs*z~r5gO`T@U;pFQur>@4?l^H=276@4S(Zv! zBr$6r+wfQFp3-)Cne;X_A>AhZwGx~$#=y@|7{Em=Ji%>c|DVF!!tFmvJ)B zl9^+}IDS}OO~$cb{bPp+^;pVBcH_gC7e~#8u>NWHs(sqQ_&dA)xIV;hdp%i5R?&%?!fxQ9-7-_ETQ~1lxjJ5*c}DGTj0LVGmYkVWuIH&32^gpbP?(P!bMCQY^(jPq^yRNIr|847R)mXM>ML=#T9ln53<6umYL ziS_WN@K}@HdAQgUh(dXvwT9H!p*MmwRr!goA{+pI;=W~A&lK3D_4$ZG?5(bD*h^I< zKlJjZrSn2;UG2ptAl?V@JH?SI(LhC$fq=8ZAj=u8YM!J_uO8XlleCOL14SwOu0KYS~LBkwlwl&Jh3nr&kV=wr34o)XBDY0wZa^9S!ZQI(^p#WG0Ay~OXK zpcFu_z(4vXqmU?X^1I~I$|F*#>=%OMvh1?=7L0QOMJ;DXxlGr>bR~6ddzxe5ERvuF zM?^nd;?M5mi2B!fe8(O$Ni{V2FhO*-E~ni95vjB(FWRTBL8@u2HTcepPlj{SO=AD^ zN?vw|`U(9_m5`cNZ3%$4m01xU_7?^;8y~>;i@v9e4~kBIjW7vZ zQg`$38=)zJE+h&PF0spbHPj)o$X|9~$v5pGEXR4?VIi?hJ0JNRNqh-dD1 z38yVO*Z4iEw@HQ6sEF7Mk#%iLFB*wu5dJxS04$8xaR&R*wLGf5fhEr^fehTmZD#W0 zo;0^6h~rQPuUP)XUA=pqp~%j@f$rmIW{wJ}iY`i8t`~XH(;ueEBQKFCf;Ir>54Ln= zVn+i#`H$!@RaYxi?D7!mpi!uxxFM@oTr@^5lNVFpyyxu zJ>Q>h`k$|bV>2THTW5Zi_s#$(aDkZANN24a{;X^Z@65cT6rn*qGdXXO*LvIR-Y`?c zpnqvGfn^eJ^)>~?&BsrOi=>vT(HdVcrErNbO!Yj99?CxK^an*HPdI5GmVdSx|H4L2 z^JxIt2ld@YUQaGdrPC~?W3z#Rg*rvoP}iX9&VibCRSheDOrx~)DPaKssx^W*&szJ? zpYK2ME1HMoKSK2$B(G^=rvj1}hR3@mWiQcN(zQPTx{)(Lb`8 z|Jt3=Tcua5$4=hjcirNo_Qp&PrSBzz94R+X9o{EUVQ-Lhn9wWAC>2z)%fmopr=XGC zIyg`^@a*+ViBAgg4m_-;)wkyb+A3g#ItMOgp5+5goxFw_0ObtlRU=YgWLBr;OjH^0 z@B{d9wEZVB;pT5@r@fM^HQc9Kmh`<1@uF+2EITTHi=93(5)%Y@)jg1kY&o=KR0BI! z)2Q>SCP_o6*JPF2m%#uRKgB(#gYNpkgPAO1*2gcGFPFbTRF!1n{(+x~%kVq9i_mqJ7nJoMfa7yKxHzGJ@! z>}RO7%=oje%C$^DZO13LX%#COH2C^Ef)6rxaPnQ?$&Rz@YKPC$17TuuptW!tP6+}7 zJ#Rx5+HVLQ3nBoXWIlKW+q#?0FgCVoyK6U!w0lv@KC}TGtfpPKYV;X#-ze~CcZAC@ zbkD6LWEHt0_^iU#5WKI{yKCZa!ed~SuASj;Y%;KZ3nM4+#x;d^&+SP=Cnp+_MR5)+ zf=i5`W>@NU995aevR_SH^5ut~HW=`7p)Y{1Fr$!XpEMa%2LqmbrAU zYstc_e!6q)wuKh-U?k+PdmPKwSW|;@T--fBwzSXx<^TTt{&&IvW>Y$9^;|*=ZM6!O zbL_~bw+VsA7MN4>Pk(A=4=jB9Q!O>^V8(fW;4u32!L5IUi>sL`oEe4!zEHrNmAqm< ztNXBkHw{>QcOmVlPr-(!5RzKY|L`9GoBIr`FAu2h9d?Ak+g6$NQU1*53au-$~b@##9o0StfVJfK>$xz zmOgG;emelHw&nZaYL)5e?nMA~xvPVwgyn(5nfk*Y2@|K5LGQ=TeQ#eM2=b>i;XAD4 zI0;xbM|B3_nLeP;s~9hak!t@!OR^rK6G;YoRpC#{qAUxvFp)TXUk@^Nz;!JLmUaGc z63Q);EJi^*>md5^ljAH&n{}lOrd{|qRZ8pnr$znY<>E>IWWgL8nFM9X^**RLIJ(PF zFEV&*rXn3R`7>no8nrwKJ{O%q_V458E~1-KRksrXBRT-iIN9*v4lOcC{q=Jyt)djY z#e~1qVAG)IPt={lA^;|M!`QBFb}m;|X|}Lw!S6*sXL>2NFq0inbjIkEUf`w(?GcmQ z@Dz9Dlos;Mihi&17dy^wogZ6_nL33SMR@`H!D z*Oc&oWCYP9kx!q5qJj~&*K&!7t%FSJV`vxs^xXxNDpN&PxZZDx;E_RjQ#gNIUNE55y|9b_qe zhrI(}c?|{JabenRcMo+`{0e7YY%l88&~HsWz{a+MNKfoO-o?t}i|P*fAH zJ6wS*m8u(DJ8~8oWE-r(jRwbigOuA<`U2~o-t)|DuMDf?TA%^A@H-=m7!My`Q&9TJ zpi{z?)Q#Ebhn`kW5_3OUW-EkY)#w&AH8I{0aIG%aQoGHEiZUCTgEL#}qPciB2(bXR zG-~zojt1pvjjME&lp~8A80xw}5Onhs*CHqo(uf9#@^G+b6oQ;?fsAee{?JhB|G&tYSye{a{yBG%ibD!1fK84#_&Z|5Sz zT&v7j%16@aL^e_8HHKMjqiRm;5cvT^IIu>?)g^LxgC3D)fO!)Y#mwTD8q+CpYdnyg z7DN?_xbO=`smj`6Go6EV!{82smY!e~ssR%tx(XIO93EUdu!YPM>6YPeK}2IMU|)t7 zFdvo1!#D7GclVzx;2@!9;+pKR>|&zJIzU*RDp?tgN``mMTB{pi=g6K+U<^nVb$;ZB z#-tm#z;OegTmiBE|&oe0$aax#3l^A$f~s1*8n=$5>w93 z7U4SfX*R=jkd)E0q(LQJatE}KH>A0F=|>}(W08}4>PWB0_Uz23)qaCqkICD1wy$e7 z%}!e?c#{?s$(Fey@R1^Gs%|dfQfG@ZFm_TtvQ>-lX)wGd<3n?D z<;Czr|4tn%s2A~znUMIG8qppEep*6Ggx1?4YFG3RmbuZjwP{J0m0x0{wOh-ZlfmsE zU%k4&aOuKRtr*+8GSTThm3|)0iNC6P!B&5o44k>)f z=Mz+KkhN>{#?j3ARhRH_`oR>T%cx0xMTC($OOPV;@@A7`E1lW$s}nMEm#c~AuX5om z5&6xAAR38G@EBb7IhM#Mz(y|4nx|^W)~<-0Um~0C@7nU~j$97+%hja)irE{`VmcIa zCZLmRU2Br1DW&mUr~pm;c9u6}wNdo!1N3JqmYiX^38=`TuOhwq0~NT|^~5h=$v+qr z(@JbLm`<7TecY zV80eIDZzg-HDkom7J1{{vv6UJMQnBqg}R`Md{+{w(ZF#zVu7c>7u<^DXO)VQ~E}f-4rCNOY3Lm8TtD`FtpJe zVIoksJ_(x}ffWrfi>YAc?TIdQM-u=mwwX$!4*Pz2=(A;X{E|S-RZNdJ;uAV2wN$}? zr_imhkAtcQy={ZrMYlI>cL~|OWR@pt`T^KIFevB}&j7fZfLdP(ujVszW&DcRpL7qy6R5Ad zYog_8-;!r_Rw?2wVQoEqvA*Epm|-9s%J^`tWv#i&&S)X-u0&EC&d%-5F>#J~PHbjT zv+QCB#sZ`+b&dbgMW=gu^bH!F3v@0=cQzX@Uq_6$`P4O_HyEqat|q;0D0b2%ga7v_2X9$DBX+@~zE3vu-mfczYmX+h&S`&-%*y70jnr)F58n6|#)v zg)pG^D$Ja<;}3(J$XS%_Ub-yN;%1{l_|kKwi`6mB zw3Xl?+V*LimT2fwpGrh^2ap! z*Kd23B$PS5B7PfQn-9Vk`AR4zFu;_iw*9&!n%}W{rf4HFi0$g-l{E5vBf^&WIE7LJ z5Gwjl-H4%zcl3p0hDG9cxAUzjFAK#Vvw}N+gQHBY=j+V6xb157bF~Qxy%P%Pb}G4A z3Cst#nEA0AgG~~<;Q6L=Vhx}1d{ehi{_b19`}l9Om#AxkZpZ4`c{wV#F@SfHjs!jN zG!-J~F>}FrbgXt2tr)V&U;!t^E=7cQM>rNa&W78(YdD|pL==l~Q&TV8fyyuVeKwM} z^%ijDEaZ|XQ@pSvYIg8Cu`5)ksw#=AnC?K=wbOK_c|rXm7^i|EwtP4S3N)1TGqkk? zl(C_$&M#sLknZW9z#NvYTfl7kx5uQ^2OJYVsO%=PhFc+(PQ>9$)b0<`9Mn;wo*9Re z0&s^$M8&~NkYlE?eJqJ=re`t`neOEtIs?L^nHqYr$&g7wq;-DSP1-`n0L_u8fmz*> zlLndUf1QmnCQjC|--N4bXhVm1s1L`~LZ{S-zIERftH#WBlsieX0)U1gqKJYxPEn%( z6T{NVEM|yBSDf=Cry_9NJlAKaAdpT;{X)dk zN3Yi!-=%<}t^4jDf~m3;DYnFpi1v940Vo$dE`)k)31!E}^7T2@8Vf$n(kAOVHNL4f z{t$3A@x1FGDTno$N~-z8)hVTi9W5k0xJ({$Xr)&TJ5ZD8PT6w?S?Z5@HwC0eRn=rG z=gdN^GSJSap#ZJX3|xiOUWC^qwV$*s{Ho#j{1vV|Hg9-ce)xHm@^+ql6kSE>0kL>H z?Oet^*$HN=;A}0g%HrLHuo;Zv=c2Bzt}^&sMi}OllSuCYGN_M6v0lmYL54Yd*;dwx zz3ds?rJM@zq0FowKSC(fEpnEKFK(@nc^UNUlSOqsGXU1l(h0GLJ6afj3q;by+m(%( z@*jm{Dr%UX9yN)zYZRSgNog0=QLSypcr`a&k`_TwJ z-^NIg&vXkNnw@yzv5DN-q5!9VM}`Eh`Smk(KlpR3msP0Tk-}BeuP9<2gE9AQN+$;dl6#IH4+1#@>~NhM z%XpmOZIWkTjj`a@SC3e)G$y^^qiT}4Ck6sNe@w+!znB!JncMuWg(Tz{^ai%t#|nfJ zzymU8fdTfc?lq+xryIl2H!}%)i$Gh5O^&|?s(@!baRzemdT*zeHijqLEqSqS^q@?n zt8_!$`p3k@m{}-0@)=E>sFX>-U0>ddbE#XzOJq9?on)kdNC^0friL8Rigv&xn1iyA zBfKr-(OA`$GQ`ASH$(?4vt?AFYNbu2QjNN$4H8~Fi!5S-IkWJRCJ^x74LtZE859)RkhUjVGryx%;AVMT703wyB}KTc}<^$!g# zpLLH!AIGNy-rK7O7q2(QP4>N|#M4{Pw~@a)+E(+w!JFCJgI4~&*mp(q68dB07Y{N( zaG_AZ9ty19pbuvFSHY-;FExI5jp{Br%oxpI&2B-LzOC`}KGK^n6L~G*E40eAEdd^f z8klaCCAmoX+Z8d=kX_3jBJT7pGQMYQX}%Nxw@#W_iP%3;30 zv1E4eV2$7Qs7!X=pZC8Nk&PKtFebuz1=4YNs6RT**i`5UbthZBJ2>@M|AMV^I<0`x z(s_$LizjdfXSo98H&Ai3TwB_K&I79WOrzLM-4o$MofH=B=k~8YlEe=`cP*!|cssCx z$7-mwuU{ACmyBS1>jxR|^Hx4bb+li_A z#N5^k5M%=k)5mGl1x_evMpMeykGTv*nnb-M9ES}ha;u8@6BOB)39Y1Hd{bg zv|j+ALWzv$KQ)UwwSs#(&o=0ms|KF0!O(&Mw;~l#RjnOXuFYSDNb6M?c+n$&HMk>{ zzBK9$*V6*BDfp;ioQuNXW%HI3igxJfPJ{rnK|&H7#;ilCmKX%MOMuO@cvh;?Ji5Gj zITJrSITIs&hIisWyM+1(PaSA&~I%V_38_tT|Qy z#h(!JH1a68?XDnDlQNm;!Lw1zqelfL7fOAZrIbe%MLTZByxjl-i@(owgVlOImS}k| zkWd=IMHGgGrk0a@hb+#niiD6+uLg=^sn;irsz7`?))VTG(M7BYxhX-i9l|^lZo!w#lW6Rb7xz&d`jZ!k`wcLbqKy+f3Wg}&yNFCsWHBn-yix(OP+@CmlQ`PDv-|LHV-E75~L^38LQwp zP#C{pj9!z~jy1Iy6?XeqS3abqKGWkJLzrG$DR$luKTki5Px^Pi6W>T~oAw9*ho2O6 zRZ~9zYSBI2S5~{Xn)|lgR9RA1CcjEEPY^l)b=IZc-Q(dOn~s(e(f7aW{!%Z%@M!7X zQF>0z|Hk8g(Puym`uHokMK^)!^~wa%pJt(m^- zT`IiYHLY44%F2NhGmwp~gGfR#1~;W7`IjhiXsPL7@w1W``>$+oOIIKy>wxMtxava` z#tBXqs!D#6K~}LXK9CiMk!k(ZmZp1Jc$<}Bi2(`BRi!JYw!+O6|7cGQ(A?Y`e7Ml~ z`{!07$z91h>d_a~L~^C2me}QSC6V;EYYVh8)aCwtwn?Gk&fv_MpJvjrx_V;8aam(* zl-^X_#u#BkkNZPmaqsyR1y4SG+{ZB7=tjJ;ot5xr{~vUN{MpxrjJAF=V@6v>ZT9kv zZ$-83C-W8L`L9MDnUwY`0AHyGVHWwD@7Wi{u9BS%UoSlPt-3}V1%10ZWEzTVX|Jd! z=C;|jrp=HxJMi7Sn*dgv)fchsbNP=xpSHRAtbLu##WK@?*mZ8{$b3uL^^PIYHHa9R zf}bm8^b>59)0}d&vMz#d9k0k4`ITAi)qzd734=P)-bLj{$dE@Dpt9Onv#e4@VgB{9 zUdMIc%~OZI1EpkPTud1)+DYsqURULUp+krYwM2*2l@o%y=2WNo^x{bGdul6V>*55b zv(4HYFSh*A`lZr>`U7*g{Bh9upzfBCEtct@FBC2K`I&~9voRwi(f~b=^W<<>i?U`+ z2L9hM482~GFL&HQKt}9!>p`sf_rs6K!|(u66fTW1K8Ec5GHP50PQ?dGsfQI-gt5kZ znJe_N_I0Yw<*gvdXq&kvw8`LUSIi1mcZCa7jvvcR5Lr;n-+Sz9ii)kDq#i*Ue-{|F zs9c;9E-!+Kr?Wssdc|xO&tx2tUkg|ee0Jf6RBiv`t@yeE=sUvYHA{7}&oW7-#6Xs4 z8_47aU5e;N+vK1I(BXD9!jXRaCUmhjXVg`q6(b4p@9;4kC*EC&v{BLh3-Kkz>qALc z&|&qN}u)NeMr!evN%W0?*~ zLoP%9E2Rh=AY86NYuQH>(;&QCh)OGMvb73UQlC*eL_9XYHqJ<&DoP>7AtJ_IhWM4C zcOTTwToi4R+d&MTx*BP^u|6R?M=ONL%D^&-zy&^YD%E5!MBj*+eMX=yKsQ@)_>e6b z`~@jxB&sTeZpzB9fgp#}sEIytR#ErJPgp#A&x@o6$gGaZ@JE0I)7Tg3^|A|5T}WL5 z;!<}$$A!?1Zz&pW`5p8UXC~4;pmw<%!Z(G|`xMG*vpM|sH62+#VCNT@VPbe$CJ3B@ ziocX6fU|&&wH>H9ZKRvB^-o7%1l#|hz;dhqRb>LUzHmgdnwyPMqRI$v&l()RQN$%} zn#&Cj;5k2~r+a7|#&syi06}rBIg-7z1&&bic6Q-!^({*JPD96ysCNrID>xY;*?4UI zarJgwVS`MC@lo{TxM!%aFM)md3K9f3`r`ZP(H`&loQCbx*ri1M9a%W+-#JV-y`mpS zBVcg~{)=>4RpN&sV%(SkI%z@3g;d;+7j~ut$js{7OMBM4Lt7lMZ{+LhL^3#f&}E$s ze2X*6ne`Y@q@K1~{iJJZ@B=AQl2iBx#Ou1Q!Acw!ydi=a6s;7$$^C`oQ7}lmL1kmp zGIeD`g7ej}p>~Q9{K5omX1VV2wQpDF7%DfQ6_0m{nPn<0$~D)*wCMM9A4Hp(Mbr7` z+~3)-F$5lbsOk)2A-xTx<{;%$(YF$hEnz(}A4rS2GfU-5$b=N37%vl%slg<)fyQh9 zP50TG-V5x_vV!0A^OILo>slPFOSX*0F;Oc_%_9Mu(}!2NrW=D2D@DZ&?_zOKJ<0ry zJRCDYK2J7NucI0&8)iMVf;=dH246@5fL1EIu`HUaykiYT4%KZ9hE=m%9ye7jEb|e8 ziY$M~D*wyg5dy9EXGw`pMz&u$=&QDok-U0LZsr-X$*JO+%e`Q&GmX40RGx?iwDnlk z*dDw~kEkR2zTO11X-kvnxZw-0f7a1mQM(Y6>?86H-$Q`S@;t=u-~$5uj?&5=fUDmG z;-ZJB;W*avU|(7#PuH0EbZD{uj~(TXf2ET%fP43KIJq&&`UAMu!yBms;M-ZL3$Zt_G_aUYPreyoDeS9F{L%|Y1vMK-J-fyI zLQZV#F@My8SCGOnj_aNBWbc|99+~TU9{ct6wJkw-eN{ksh*6Sh8WO06OjfO%lf% zLX%lYX35tqSjpLeP^QkDkU_1?9@^}uHM_(_4QKmHou@Fma2BeObDUK+_-F8HqDQ!Z z8Fp5`LJeaPNUF67&OMZ}cb$PVi~9*lvPa!s?>6+?CqGuGDz`4ZiXg{|9v+i+?7iq) zQXM^)erb!ZB6eCdPdRi5AllSWBf(1%>t`HlPdFVaKzqU z-dPg05UcwD0?V8wk7FilgXK4zbP75Mw4B*RY)W}wjAQ9L>jiljz@QRJO0=qwj-uCR zyRfw?-5F~sdh!RzL-DW}cL1o<${!0H^4_C_&`gt8U=a&Zp2ezJFp#><*%q;b+GYe> z8BrnW^^ia(*yjQq+BWXu*NU5X9HH6n{ziOLgJ|L~^Y~w}Xyuf6^*%MCDr+T=8nUHX zf7fBk>Z7byB4M^kfcvdEn>_{yd9XRmglbdZb~LJ27+2Zk!2X5%EX1A1Qeoh$?0LVg z=;s;lBL()mZibMw7NPL`<%-V_^-$!#ZSXr3D9)vlZcZ<^Y9u5SXBsjmw5tqM(0L{X$CpEtK;$kW6mOD}% z5iy31V+IrlotD1NwR64UT@d$Mgysl;0iGf)7!VGdjWRyB<&bYz33aJWC(_Id-_#{CnnAJ#J?WFkOUNxSyR+!%-mOQ==(wVtZYRh*?#NTggZv5a>lz;Lj z2ztnL#q30KqP9KKHYDEO6Eqb>fXO!CADl;wjiwVm3&eVZ(lL~NVI<86%t`IBz{>cm zfa3w^!_87r{EwUNpS-yVR&F3wNaUKXlCEmqVu|E?zAcQ#btH*rn6YLi#rC&n21|)3 zPmV+H=Z^35mirF2-F2kgo+s6OCS|Z7?og>_`Z4GuEv&Hua%?*hn&E4~VTF?~!}G(x zge2DoCh~>zLl|{YT=7A^a<*T>Wcr#ZL)idztKdqsMMf%rO0jGpETCW>>)BZ)r9X3! zb8RKQgyehrDb=qG+K9n8@X%n$3PAvS#9nilQpAv;NTYxqDZ!a4dpvnqpBy$4iLAs_ zK3b*MBc8NH17S=6AyJ3o`OCu~Ctv4pw41o~4=hfw-kGFBV+%y_PzPl~9oH#EK7N2} zl>y|v*rs^JnFN}3LtWb7D@LoqDhReGWL*rmKfa7^vkXUIY0&PVUQkyE^rq0fw$N-6 zz(4oWq+&omY%(4HWpY`;xVERIOOGj9oF9&7!Od&hx7op!VQc{AvN>;yd%XZ$qTM&y z#rko%pP^Pgzra1p4qfb8u}tWSI%wvY{78IdJ)A1-}*QD>}|n}nnw#$Z@&X!Vvg$ryV${1738u< zIYPkmjI0BGmYL3mmgm2nXe45)l0mzg>{^bK`sC|+yJ3Ncpte-# z!o1ZOQprduIcF3@ji@>$cYu5r?>I_IqRVRJtxh7f`s8< z3el_<<{JYroUG#H;-|RJl<-a6r=b4De)v&X$yyy1vJBi$cg7+q)DfcY|3FFwx1ywj zSZUrK&ZQt-AQ=S+|7JQ6{9gc%Kybh9wu!6deABWI>(u=#y}vbGM6j^ z!Ks@d*CIk{+dRT_!-Q)?pf1(ugbuIi;XQ|@$x)e1b!sh@YSF-?WPjUIGtGQ`o4IhY zXchzQ3w85Y3DtLQmn-a%2ermxmV+71(w@+?rq)yqT6byJ>6HiiGn>OO>3z0&YcB~p zk=U5O4=tanKeD#ON$w1tUckL)=ScnMYg&AgInR8~f%&PNMgIFuRK=^GUB+HT!fB!1 zNCM+NHOk{;s^~XsJ%3pUml{`jC0#i+9XUiUU0n3DFXkQKEVM79HAPro3Vg>E3xxA5 zy(9$Gvkiwhv%oN|hRBW_Kb<}G9r**DRnKqQFciM$uXu+X5|wH&b(&P5liGFKVLf#> zf{+OgHHz)bb}G=s|GsBq8YhIY&Zorhdq2M~FOx6TOBF>cntzu>QAo5=EH?|YtEiri z(s3jRr@A6Jg~j)pFYEQa+~%KGbagZOv?9Zs?3pf!HjIdSs@9wck$q)FF^-~IQz&YY z8zu!1rO0kku(BNY894gVUW=lyROx=3E?M5SR!SW|5tBNUr zj{egr4AUU4J&KxI37E|rm;E{CQP5KfXt|xrd^jX=g}d^-Ohip zz?fm*2@@uLEA#_=3`b*AJR72n9Z;aX#1DUn)v~U`qgb7Rx3Oh;kGR;pFnxVjQn5BK zNt4mdp$&gLfoH96B{`-~2hg=(tT5Q-iEJ_2Fu3B~n*w#7#2a^s9x$0Yt=Q+Qt1dIK zRhVsQ7JqN%aOKLKIcZ%ZzQd7I28X+;%i2e>uO{Z>QI)T^9o`x@zLx{k8gx3RI4S{7uu%xM2&wD{bgINX&=UVE{~RtuQ76H@-E}^LgQPtvE=t_%usyVW zw2%G(jgi4h!$1&*@B0*U=%IlM7Ak_V7OIGMy;%v9%_Lcx?3V$L2NZuiE~>l|A|Y9z zB^W!lN^->8irjn}ghFFUu0lx=z4$z~;Ly?Rk; z8VZprjRn+P=b(wikAQkAt2W34qtu!*97b$T0-1Zgc8Ac%g_4kZEm;{2Q6!D7eZAyX zTW5Rb1iBNO381yO?LdDphtIE|rR`;!8F8-M%~Nx=?t5Cjl1)=}dcESv9jNZk3TMQx zHGCYv!$I-H#1ea}`$AW6ALhTXPW>Y4xz%rR?U(&YyZ%;pBn}qP;5SAk=T~s)Gk4+_ zm5s3q!Y~j(_xp;Bx>=|=R1u4U&aQ!SO|CVNTtjk|iumu=#m#@g_3?ObyN|aBV99t) zq!w9{Gt$T-Qr;EI3K#?Bh=x>i9z#3!^)Q)@C0iD2i>p#!sl_Y~xu(c>DVr^!$hH?X2fh;3H-r{O~M^g*-q*Ia)a@Prq<0X@vI3c@fD2H^dk zBBO2=Dh^eIqTqk7W1(D=ziptshU9`3@!iG6{o^~H!x)Gh?8FgflQep(t-b=%sn}K| zJR=3RFzqeRT^{OXwFd`R7JJ9Lvbm$^MFix{j5amh4)M{oMj7nM>?Yr`-Mz57>)t|cji(n5d7plMdtZLpno*wqjmN69=A z+r)P182#^aK9-j5G#?CllJ(w`yxr*!O-PQsVhuuQY$Lc$?UzQAtmZM1tVW|5M@U~> zow;(aj{Gjie7(BO*>X+aF=NIGCimEsHItG)iK2)JaR#Aql3Sr9lxR~=VNCo7Z@I2e zVN#WSBDa56xY3P}w&>C4BS+oBF)4&(6?FaKQOQD-u3>FztN}b)l(_-=FB|k#9#|#v zho*EjN;~!=-vs>8E~^AT3rth4q@SVVwi~4^VXC?Z5&Xt@)ZQ895lnq=hY@&BFy$&o zNMIQOJ*%GT1`k3x<1^A#)x2ZvxjTNpG-)@ROJ09EOeqZB`X-Z^nLzD~g$!Y4A}E#Z zz(o+9MiBn)UvaoDwy8rPrOgZkIuM)0Q{DzhGp*&($kNHENGDf1 zkp(C3eVS zPA=YGnB%i+^J@ItXs=Aa9KAEIE>6bR=5T*>GCnom9$s93xNPD%J2ywC7uUbaWjA3q z_d-UjD6;O&_{MX&b|qoWYj>8P&{$cr!-T2qb`nLjMy1SAD09k9FlDUD1UlMOp?a|? zaMa1+?00Ib#{nJhhs_oGEmb819#bfbh|bM;;d`o3Sh!P25sj(J7BApn?yA&e28e$o z@k#z+oF{ydaPhbN^Cx{R5#NnCE)bsmb1JxgN88A})yFGL2e)wFrC` z$;|ic)aTAmhGd^??bTNfhrK^qKdk~|%plu(&S5l90!XE!&o*74hxUv#xAcFyqt6S- zdekAaR9_yF86_6WJ&=G4HapXRyg@fOAYnu-BJDgN^N^Eo587@U4{DPjfr5V}V^jdZ(35&@ zc57a)GX^+8J@tjl4FP)|GJ{6!zhML(u3&;m*&{oUbRrJFp_!b5+A;Or-Cgi>;k z(ahFjCnHxBE>NWUHp2LHxJf zSa_%+5kasb4w0NC3eoj0#qh{$5tgrOyNsd1BTGuBD%ZtI)wO>?(FC_{??)e*+xkfd zs;2#_aYjfC&lnIQW2A+ga>xcBSYUDchB}yBN6dk|6{i(eJ$oe{2E7yN0Nmi|q!s$t_K9Ow8fR`8=kZY=)6i+g2`W7QS!6?T3UiW2hbHgw$ z`!AvMmAePz#WrN;rgs&>)P!dV$Ar zR^Qqp8}RehPWo$47Ylhw8vz6e2$t{{dn)0STlMXR#|1KaB#!I`#qO81$^S+;e9 z7=Z^9rg+jT+LQFFNZA`3*?UccDoe6t3SQ(&z%mO%U)2I`0(TriGQY(}Y|`zL{R3j~ zD50hN+zEeu=P`UmRS;bimIb)3=w5Y1^z6J2$Y&A3H`$(Qy8xdRO(OK32xW#)dg->U zsZyoupeG;%>yUt~VXjzW33JiUmrCR#R8ZtE)#Z^#=TCYM9 zJ&b>@2TNzy>SQar_bTau*;Bj&p({%_zSF#p{ERnwOYapKnIRQ ztv-DTL98h1gu2JG!YZ1n@?onL z|3Hw!AgvZ8+zkXH{XbxOgmCqOrg?LEPgj&V_?rbqtq12n^^k$g%kvG2y+aQENZ51KNE>ff8 zD((YzSL0$PymHtDr4d$-$*t4ou6@y$2F+xAVbo|+J*kK^6Jl7F0!p}z=z`@PEO|U^ zf+FQWD{Ix-f1)g=vSCV(=gaE?1{?G|#+EXHFedV_@O)OYbywYEjYMdez!yVNC$D4E zdgz@IoI}$v%%*+14>gUk3c@fHe?|BA6&Y)mTBtZwQN%&PPbic$ zd8vUUeIzfSi2rUD&v2J>;T%r%BmjfjtAwJ-oSf!~--P+tZ3c)cU?!zeOt%u|vRu}e z-WxQ1w=-(nj}OI|#(S)5>n#ret(0(P4CJc=*@F99aYc(Mp@9#G3YFPAEo_OJ-5SM$ z+|=k7e|~+CKWoD<5XJZV6gOmW48aYgbV!_p(xHWp9Sug7&xxok3;hW#CEvYL8k5*0 zeS-vdPrrAk)kg0%KuugSLzq}+1b3zT)@1YfbP0;JWHsZ2<*RQizkBY!_)|^wV*XgO zheh$u9GN9RmZq?E)M^>S^L#*@ ze_olQ3^{L9Z@FIK5*XEVh8W*tG8m89e(f=L0E}yl(NR@ke%?wO{XyL1V!J=`5svT+ zeb3Em!!Qg7@VlNuhaA$tXbUYnWc{G*u)-c85L{bn1+imnd2Ecn``nrxHpX<&LHhF( zdfNGm2QZ{Z6$tAnfwlDV;VEvGvlg7Pe-ypag#Amhr*u9{@A}b@SuNK_EmqyD5(+KA zylG%BWc`>2(9B_Ar$)?fjCiz`4Ce)M4v-}$5xf7y?&xwK^5NJ$(?B7Rflt6(KJeR( zs-`49Nn3{LG_uAaIW0Un?0Y@A{7uqQSL||bcFz^!R+U^hK5Pqu8!V}!UH>%C4kYz& zC6J`xeq!Io6}|wss&xl!4}X=E-*4J55Xay1SNI`PlQ!K#0ri2=X?xnFJyhFcLFlj# z<~4C5$7W+w|M#BrizKuiAVKi??&I%W?)>3n{xkPHfjj|?EGUeY+^oz#$6`JTXP$x- ziySzz)fbzt?e=r_hu;bmlhIT_Jehf(R6MZ)*~Jc($n<-#CQC99?|%q=G4pJJY-1HS zGE=WW7WXp8L@HdQke?Z0;1Oq@FAZu~C&=b(p+Rjim`3cD67cid)9suB3tCn;`ugs# z%!3*|ir6@e{*R+tHF?-0qLSGIv`jTB<4y9GbN?;Ghp)fDf8YPlMjLy~Y;LC{J zEc+Tt<79cP;iyK=(f{>AUe0>57P)aNcE_f1W9s2*bx%XyMkdruUE~fDi^IZ{Mxu}6 zxRz8|=B&fgC@jY=i-Xqts17%n4zcAvyE-@!JYq5N7dy}^VSm%S5kyB8Ha&Sp9%uw^ zXbP5LtE*2Xm}4dgTZ{LH5eyXme)WuRrT5{e=1&mPF|H8Z*aMF`1@%#Z)l*j^kx`+;W3DIR}k}O^kaXvWBco zwgN{D+US1GtACJl@4Ry_skbMl*WS%|RLy)fq_y@ITc-ED$-Hxl$;x^Tnylka8_&g5 zO^e$w5WV|XOu+|-rePPh6ykLQJ?-8WdaO%Oq;YnrtO$LS4JH4*l0UM}hc_t{Ru>zd z-pre)C*3dfvrZC$Trz`@S!am5rQ2$>#qA_d6syr{#(xo(558Xc^|#Fn{~}P_-F_DA z=B|7qjgl1RNm7ww5<(?w;k#o>Fe3n894cXDMnUSH$$t7;Go78(r!Z!#HdYBz ze*Bz(x0p4Oj=S~+Blaq7(7XHJopmS*_$Pa)f-J&N6rD$7g5rb&8OILj5JKhV^QfS$ z^OjD|tjpe2XQSY<(28U@zW*J$^f!|p$0lgNvwvxeE|g@K@vf_NC;zxi-+r{~X!eF8 zn*4Q){9xDa3U@o(F8gaxc#b3fP9Y^lj>5yz8GhvS;q9w7Qe=BZ@cm{ASDf&WHHDFr z9*g6L3vt{Va@b`k>unHg)*DWYA~A(d7xGL-)%OFZ9%Z=!8rtynfV?wxw^Jb zmN7{}qa)xxI3>a=tS$M)tf-j5j=V)du)2#~6CZE;S8*Xp&S&Qm&*t^LvZR%vim^5t z5maxWL(2tfjg2Olq-R)wiCPzM3H3KX^?yS^Bhg9r&R`o8J0=nay&T`qxAGH!YJr~& zDhkMuDIA69%nm)*ZrE43=`uOW5Ea|(j0Surt^&F2R2dt?AFPhNKXaK`4|TP!?{1vK zHOF+0%KlZ-o3eY8YS7aueBR5l%su{BKg5xbIt_l<#{fR=eoRf5iGGizI@ohAN`G=c z0L@rUZ{s!)z3W#nfDdwDXLo@u3dD8VZP73E&^`1P2L?@#Y+`AOAgS!Sh5ma;jB?{MD>%_K=V-kqIX4>@ zM5oj`H-6BBa#3isM7&^Z>Q+~-?e%$2jY;Zls9B6TfjsL8ZW=7JSL3((F@Jy9fvy*& z(?w%jHoqo%Pu2XP&ZJpd*_J-vTm#XtJ!N&kA|;ryDjR#dn+45Kx}s`b=bUzSns#G< zb9>wR|DD)lK39bh5|o;A_@d`7#M?LRoTCgBu}iH?qnX;$(S06Bj@nhOd*D{4JMy{a`87^y$K=CU{KtCP^mT18WN0X zSAR(S3{v$7_oX%$tbaU5Zy!u$EWex4qHzd)u>78Y89WWkE<$egj|ZWT-C?O8FrB-t z(oLQ-G$|DP21jKTmSLvALg=J+c~w0=U8SUk-Hfj%$GlIquk*e{Z+q`xg)d8Ykg34I-XZ}!jLS?p-q9iUvlIy6V*zq_Z%S=nW~Iy{(M+ChPmG-{@%{&Os?dnlTbo zNut$qk}*))t(RNnaG(@W6P#Z2(B}TxU-W|^vsvF8yxTPIHV|7!&CvaVOjLvfT%seNO$(n9BH7u;NVv+wD?AcUTw1!y$zHF%M zw1bIXtyblkkR{!q#UEnCv1+|%SmZ=+G^R43>3@(DE#VPx>TlJL`UPE4OOKl{5Wf3Y zjB?tQ(DrfYp*IJdja9(NIGg53zzMDhj=>I!dIvYy01vUZ zu&D2d#p5i}*=7JYGU~mx;Ob)UFA*ji;^bQ5NN}hfE**JzYY*<^?g|8-;|C;Vmw*Y# zX96eRxdZ*}9P5194=(fxbdIR^mx#qc#ede0gu)!3`~<-c12H%o7;fcXck>KcKhr|v zeMO`T*WRB#%+jV0muW;vJ7YS}f}a(C*)~#z#t(iN{FS1$e(W423f~zs*lPCvx1F=x zt~>gOR&N&Q0O!9~y|+T&p!dDKFAR0v2v}mbI6&zx`w;Q)4tIa{)2s*o#e72jwSRzG zt<08d0kVcls~4Gx3>Lh`_acF3;81aGWV*?@ zhH9fLRST5QkhYZNN~4M>L}{K-6@P0WUho0+n&&x5F}^|fn*2eks-2e4YXfVQX99~$ zfzJ3c7dI&kmF8R)31qzB&tgU?WYLVqZth^a7E~fVj$dk|Dk(;)N~7_aU`lP?p<7vt z1h|$pEo7xtkuX{(BGgQRxKi9$Xw~rHA~-_tO)cIDArm}DuA0CU@oo5t{eJ(4 z5iIrdX|~`2BMZ!q5`kF+_H^TRG=<+I*A$4%_G9An;^A>CKhfa2D>iyfaetz&CzOh( zaX1BBQ<1~`s1^B5t>gK^4>-Zh7qqbaBufNY;lm#RP6fnP{x-^zKz}|VpD}+uzsBo1 z{z16rQTx2YOoMN}1j`i-YwtqBWTe;LMkL1V+|`#f6Z3!qTuI|Q;qzNYgujUEJc-C{ zoC`WvI@Z23+@c6i8A(J`dz&TXJE>c8<1r3}0gk;IP?q&Da1DB;47W6Tg)r7>Pf zrO~WgQXAi$|9%{2SAQhwZ(RB4Jna43LvVqCH@?6KloTXDvJNFzXzMBu2^_wcMx0?# zT~h6$$z`@2lS&0^7BH)VwU?@CCZ^Flnk6B(LajI4-tM7obhaeCKoI^IbQ+h|{gsT2xgkbmQoSjIInvI_h8Krc9eq<}#7LnNddA?~9^CXn=lShnD!|BOagSQHPghgMiDX{byGDO#=;{}yr}7dpw~ zs9(g>o}nNz{2)1s7sDnx=Z7b!N7FB-$XvVVxr`Y*T20o?=V}$p0^xd!BnSMiR|oU0 zSTcIcTf+_=0mi5ZBY-JMs6Y#hVj9SxYuK4`KVI#mK7Yg^frD;ZT1%_Xl%2P*J)`n_0Xt5*D_mPBtkCX91FLq(}lhI((|k(@?uzI3@Y9| zYsO|l0k6CitSG^^t;o6+8O{m*o)HFVT(CvY95kqy1&_`%nS{~>MT+5Y1kD2n*LfHZ zhEUQ%%72DB5r&3t@DGOW{pOYKmst78t@B2>EdhLW%n%Way4_}A498f5N~Uq-c-+%i2e%x582@=(>QmQY1z zTs){&%YZc+9Zyfs=KEjIrk|$!2lIokpO4Y*9)EJeY?bOFt9q<+Ieu8}#;S(_w&%nW zWcAnrn!F4VRNm@>ojt%!b9TM59&E94j8h+JZns5Md2#zA9t%9^Euu1 z`W3;RB|sLz-)8ku)pa(`4o<&RYC~o*q*tb#C^zFFsu!VL;Ys}y8&n1 z(CC23Dl#j!d9JN!BU`OqpKGmeWFz3Pv!}e|IunvabZ=u;k0wJ!ptm4us)*!>g4~qR z15cx6#_4c7L_e z@v68+Gbe>9L;GWYO*}Y_d0Z{|&pLvT#)` zRh(TX--qk~kz;4eUA^@^yjs=Q&FXdQ-c2}uu0J|+t8=QitF)XHEfFPvw@Y~v;~F}Z zJV}6|a&^|hJ_T-6S4)A^8pza|Y2@DP%hcBPu5!#!Z18hR^+xaTH~Y+txPP53%cozo z6|4KtPP&;n4X%4l$~*9dFHy^7n_*nOuFUtE_QKJJR68NQaW3`R)^Bg#pbP7e0lG2l zahJ%QS!c>_%W~(kznQCtd~Tdp4+M8ja2%S?7miGJspX#auE;`o4N3Y|wi~zn$W^Cs zE-xI0BMjwVK1fSSk`N}E7JmX~L(MQ|H}(rB7)Im(%blvUiRF)t;MUz>*O27H9E7D< zzgNd)J`5CYt-s5{TCSDlQkL0)w!SW=A*!ZqF3ubsR%P9_dcoHA%xAJlddd}AjK;qq zEbrGR8eq2_StF-)AEqQdV8!D#kjG2^0mYC(YXUJ4h41+lbMW9o4}VpZLbpZGi=Onf zrv(|4aU0AgA(JeM^uISyx3tir^x`lu-{HOC@m^;B%?qJO8Vm$OjzP<~jVDk1Ix0$G zu_g8>3AW4B?ou;%NBN{kO-56NkCS?X@_-Fh6j(dUr4Wh#6fa!s9aH#%@+S3aop)s; zg?&zPn`dKEqwVE<^MC3dp_f+UPZ7{Dl2r`#|9*?JfIL3!jFzxZR>s^2D8dXKMjBpy z+ye~cg&wY_`PmK(v@75lI;U0nYoKJc<%q`IATVz~u6 z46v6b>6&&$(Ig1k?t>L5v~-TS$fQP6aooZGeMd^RC0R~3A%B2F-tk_ZJ3hzXPV!ma z>!p}vOdTAK6sVYyYUGxeg}I!*lZ8n2`D22)A=OgyP2gjWiNW+c%L;5sr-exD z3Yb!C8QE+liZ<+6DbUe9XW}TMcUfrrpz`r zGIp`FDt8xDh5&|8ZrAMD@8F@zh=PrF;Pf?S z)8TMyTW@!&27J#9^MfE5ZA|hh_%EV%=lJz-j<$Y-pcak&%uLAz2wXta)xN%Wjei$h zVG5N&cz@|Z*vOWa-b>&bgfzejN~#{FLr7+r+{0293c|qyid3pWBImi(s0JIo(Dnu} zkq)HQTPuW_q{FsNwO7k_wfRq>DU{e|Hm-+sGpd)cs(42Y8>mvz9E|OnxjZnvVrFLR zHjc{6K?f-DXA<*{sK4HSx{hO~9ERJ!{U@3Z8h?m9VJ{5-gKAUbW(({ZJqv|RvL>2J zg)EtY-$a6Gd&tb%9aT1Dje7i2t*vK2%RXEbIBG~%jnzR~h7{H4#gBFftnxzW(N)Hv zX;Ck@u^B{bqI@bQQUR}3l;MurI#sSU8s7yu_9_sychhOQ3+(X?<+gKt)OmIVm{D;5 z*MIOHW1YJbs`dTuffAHv_jF_Od~WbFwDIbv_&|b_6KcGmJKQ~ir8s3pW`=tjXw~4! zMw7odwr$=nQ$;ILZPxl>7}igA(ou~^_YHeLs)n8KwVo4n4~i^x{7J}Kt}-)(+o!4J z7Kkt%yWTeHatoHAJ!goFhwybq+|2ET)qlmDh}=k+AQ3hEq(k^LwKgCrw2^cEgT&6{ z+9H%OKuRMZp;@)GObv>Ot%mbfh2}g0UA7tY`$G10qIhn!jg*&;Qp_{CBsW$`7RF_& z)-z^f)Di!Y6$*FEKHJE$^W_4hDSzZ*Ss*p1h&)49D1s%-Fw5s!@+YSXEWMehc&K? zoj}p%P1zblTNbW2aY@2%-R@+6$&s3BEgpN8_vn%xzpd?6)04Id*i#FyzZGi2E}9X&m_9bE>%vNlBT9(QG`dy31Kwzy1B@ zVRLg+n3iea*^BKsbTqylpEkVxM!tM?vra4CZW8hA?Voq6ynFYD{v-Lq#eYa!k}&`J zKGFO1j{m{Kw(Hm1S2s7iEzjQU#y9m3{cc^huRjuRM*Qy8P3_icIm26Rx3l95ZvJ~S z!^dWqmmSRrKN)8~ym|BYx8HyJ$G?92r`K=4`}S|IXWz_jyLDx1IQOToZeM-++JC(M z;m5zc`R+%&Bn?A)dT~qrYJbyjdAR>r7#Em7q;*;Ha69|vce7h{C+@^T%VNEYp0kWz zda05KLQATtR-1xxMT%Uiz5UJkIZ{Ts5{>hbw__bpsSo||ex6F&j7NNNXMrz6RF;(} zD4I+*Mw@f66bp&S!CT3ag^T$TpL+CVU%P8i15lxD6)I#Mh-x)N-hZ$o3Pvhntai4V zki2u3p!{*XLBXmk{kH8pp$ z9Wa3F5p_G>P)@s&J+aQxI}=pNnWQq7bG0hVAX7Dl6jf{M5oFoFJHA}r>4m6Xs}L$y z!KsKzt?hEz3xB-CtCBEdLCQ+)<=eDgrS5*2#`7Uniz;hZo?X?1g_4-YrzJwRVB_4Z` zQh&(8wJ`x%=u*Mk#ilI5T*jGHgutmU@P?jvyFFVHvnWsrZLmZL@;#Cp-M=nk^wxx*k2`UQ8A>8%3X9|Kh-#k^RNR& zflz#L)q6ovS_8yPS*0Yvl9vU0N~`4sh<}P84$DI4Ks9EgnmS7GfYQ|(VX@|?X2}!w7Y*wg|_HaG9dPgRu z=(J9liU1xL&6_o((o<^~-%q}24JkOOtDO88G$&UlAww7jwq7U?R)p)Tsz5PSZ9mI) zGI*|B zvu2fXBC9~$71UTU@0yaqSSrX?$?!Zrgn~(zTA$+_T+PvnG|^<^gK|;|FMn_|C$$T@ zz#^rIyErBdLN`|KVKylKZpCX<{C?oN+&e^EaI4+4T@DF`8!TYnO?SwUNg9L8Cp1aP+p$mWF`n?YpgxwY+VFkl{L0fLo4 zTGc4XDb6QVfPI0l@|Zwf_6vUvG(Sw>iOpJ%VbD`-*Fgn+QIu1JA3`p`VxTJ#-U{#N z{SgrB@a0?~C#wbTiYCCw)}#Z(-v%8L1Pjs)Cz^Z-8b0*Y?+Nno?|;epsXJ#DN<%r} z*Am0XR%5XTf~S|FDGukxSw+|z^(&yuyH0@8FO0?|n|C1WDXg?%;~<_UQL3;wGIEK& zX!kk5eO#UoJ6N4FRF7;1NoEbb#PBi6K=2V@P{hv98%C6l)z3NfZKJaq|&k^K4AnAGxmrPgY6a-212vU8uWr; z=FrqnKukk)US_n(OD=m&JqK*|Zr;I|r?ZfOw7W=ncW|)B@HlLDmI6{iNLMu>NvTjF zh6ril8n9bG_V4)w)xsziR!HL!I8$|Szabit1ZJjs3Faq(8h>I{{58~wVZ^7^rX`1G z@-hpEw8fBAiU=PPv9{%A!!6<$2c=VqnkoC_Y-6`No(ypws@OV7pmr`0K!hJKy%ns0 z72pz~AVMYBcy$HzJbe*?3|XX5oAxdf5JZX8_aDS*(jyGWjL zT3Xl^_TM%$~)z``T%RA zaVq4#g1Nw(VEx1wpul#G@p-=N`}e!ea|7Te;AX05bP1Nm_WNAOAqz5SG!uxbO$m(q zHS%hb@8h7g+=Zxv^@oIjKk;e@5|&CK#rfndvP41{ZGTBMd~#uo1%K?ur{{A)9igGf zf>vuEqY%`lODo^#-iOB0*+KKdRTAX&V>k5cM)b$wXc1Qj{5fGX&_f(XHd2Ps#W4e7 zPOJ%a6(Z3U*vCyjoPw^I%2h(dQQA`kc)5&qXgdna>|vQ8n?)ND1iPzpy<7G9^A*F@Kd<#8N6wfIC?T83G+AWDx~*bU_4U2786pQuB7+*NH-&r$jHHdWvK8XqYrE zf_hM(01F;694oB4Vx{0OF5&w86J&PIYv|)uOR=96nG+c}%qUi^>lM-W)Lx1s=;YB4NFA))kcavqA>^|7!{E$>) zfwR`2UxD%&uskROxA)k6f&SWNXuP_H-1fTx0ixfudp|$q(Ni%Y+s0_hI>FE>;vg{B z(OaG2ZJTw0uaYrc4d8Q*ZO$0xOj2<&WuJ31o!*#)Sc?wJnplH28|mqCb+k|HnOZdUzY{&<7Z)Z0ltLKG*sJT zr!&Gl7$njdNVQ>8SbF#ra1#WZv3TtXO3IP1AEF)~Yfn&xALlD{h=+wR6@Tw!LB{7Q zVRxGKNjMpj7$~l#Iq;XheR+5wK6H=R{aM|uC&1a;x6{M%VMpVOm(!o@pSu4teSg0H z>Z|GB#b%q9t0paJb@7AUz|;3%-Jd^iZ~TIPPH*y#$HPPY7yD>C`}N_m=67kuFK1uR z_CG#*|Mt<<*^3TFXMC~cW&Qf=;{*JEp1=CvFJGR$q@->z8W8f z{=;m|A7=mh-2YL$xc!0uv+D*fvq}Tf>{qw5yNjFP+uL8wy6tS;kF%rMEnm+F)AoM$ zge{-lVW-xmAMQ{8_i*~VyS5{G+_k_lo1U2+yZFn^FE{@Kx1m-Cb^@30 zRR^-S15*d=0=KhG2T%ong^y2b!!QiR@A?!v^pM;(Xc;6cgF#1+W4juHX3LEs{)239 zh0*W6q+#80@AQ!PJv}`>r7-~n@|+WC#&@#Z1Jt})bvSEI#l?`-Tk=9VjMY6rtHw4u0l*T6?tiN zpMxt{WWpX)5su4NBtn0s`!IwLK_lnOfxP)BrI10$kjQ`$rF;F6nQ$eljAzFWweXw4NrWaBy!QangI1D8c zjn7gfuZwhA9HH{PcGkOTr9_8|8dnpHnL7t3Yob)IWIIC0jAnn76ZzSVtlBoz>D)S~ z5Ivw=gBuF2aa9nx^I#?f12>_ZCWOJ}3@3uSkE&N&^J+(zCv7UGourqk<%X4RRN{&%Q`f?awwt`=_)9KyT-+ba#{y-}&i0OqibxINEF z#T%l>6lnbC3ntVzx28G=w*h}wO>5&Y5WV|XXdwp&a_B;rg=9lvp{19?!d?wRu||!l zBB_$x50?J-mF?J#9lJ4&6RSQLTe9Z8d72rIeqE`x3IahkU=)b~{Ur<*L6Dl_F}i+< zLD@tK6Wy6dUcD{?mWnugLK`=Z31bjjpjgXi6HYXkl-ntqqeR%?Ux0ty6@k`Lbw;w}uQcmj=QKPs9UGCVQH;v=1s$9o2u8TK;5Bl?MEm zwPB8>QM(>4(fOgU89K2VnEnTieN`i*RvkdqYn3zrE+%(R@Ixk23&MD*qr5phs-aJh z%Io7}z5n*C+uruSr|GYEjeEH@2Dl5GuhUb%^F47_-32s4U;Q7q1vdw60hdrV2eyA( zO>g5U7{2FMc%>d%X$~`;u2yQNT4|+O?Qx{NMv91yW3~h=z-_Xt`R~hzZ47pjY6kmF z4vkF{o)6%C0h2Gk*Hyh*F|^0BMmf&@MkRh)ts3br*Iy4gt`*@-uD{9t=4n+nEH_tK zEjOqrHWcZCiW2s6dsEAT=O40?a-@H<8%hs@>tlc2h{NDomrErG+hsQ;q1X_*%O0~= zPKwokt4zPvSO_jQImJk5IH_*$p6owv1eOg|*>kqu{MGEY&F&9=$bTzv@$l)_0)2c~ zpXTV;IbM#DA0ua@oR}WQgDq>7iH3Tv0Q(TnO}?|SJUy|@HUC(jiAY0jk%q4 z)qn$8DDv1kZ;-c5pn^2AzeRtvu26rs#R{eMZa~V=F+_R_9k_!9bB$f4ZS1;z+u|Kz z8xuHU_ufdMs{XFRWLKq)aud)UXa@)DiBedMI@OddzQ;+0Yv1eKU7IoVn>yBZ#;Grp zIv5g-O#IN(>Ie6yE3j$=>y$lBny&D^rf58II@KA|Iypjz>W_by?aGPJQr{o( zl8)R6JPK?;qc*3cZYiY|JE#{*8JBoN_QObNgNiL8MPj*QupS6d|2$1Qs2EV2j^Ncs zPkZ^xd@?66fECXw6|A4dHWUKgfSJqhPYW_4`byQqGutpbmcZ$1facyxg?owQf%i>yG7I(Mei&KibyBGK3 z4sU<&y!TH|?ww>NxhHZ@GV^^($%vgYVHsvlR;0$*_l^^@*LCw_zHE z!VssR9hR&QT%SM~@5gn_wt0~x<~(~K1FV%$sSg@G1naYBUyW^>h{^>Yk<4HRJ7v=b zh%aXb*v&IVZ~+ zSBXYUQ2pmr?$wQlADO`^pZ8HaT(&%^-$&^7j<4=1<^9stJHD~OP}UutX+3L6+JQhib=lK;(7_QLVyOLeT8P((0A?I)Im0<~Q z$u&d~coVjX>Z(0dI-*PM^j`;lDdd$mcL?-Wj3&i?p2-UGqnaQjn9*@}=5 z&pQQG{o3F1PK|2Vb!U@Ewu?F%Bo9 z(@j~6`uPa3aMZEpyba~F6~cOFKz7CxnW!YjmHJjexU~I@C#y#nfnwRME+xJZd;DG2 zI=Gi@)+^%4?~N%H@l^vw7)Tg$vooq z^@>Tki*J+z7=aX&@b@;^Y-mZ3-f9P*Ph2*({6vf17I8!H*wE-<0NSaZc*$yp8Kf$0Q=)Qbg5@Y>nl@xpR2*U@mvw7lM#1aw( z`gx#G_Dk?(#pzvT{an3jNXh#9N z26?2DV^jHvcG=&dNeg3FR=~(W!s-dl&jqTvp0y zbk3*%vTho^Z!qVBBVv^FEGn$@-=h)ct2iX(KD|D5oBk2;sIKS6L|N?%E}Oy>ho)?f z--fr1{}{U7a)qCb5imQw-?RdayL5>b+V^?k#ZSILJTy4NsK?o2+6#4W~Y%9So8dXAl3qs}@~7Z6^nJ(hM}_AkOKF?;TKZGVOk=LpMxjHG{zr zrVGvd))2gJI=zZbm+oY%|3^aqOns56F@3s1($gr&`f?sfv)9#h+4jV3+oBj*ay0)1 z7Dlf1yjT_i$KsJoz9@+|i8T1@xAk(1n&9<8?IIa6d0*j(`nsj*cMF>;Fr5P1$=+W% zOgTzE)@;{zeALw>lOxCFa=|I&jL%Dp7@sI8NoCGy`^~JH{4S>t3gP;@2Dt5(D+6xPe+f!76G2RaH^Qey~= zmd)G5rhE5xauyHQYc<0Ic-|(jq3)ZewTWuf;y6DgRE*P!O+ z-H|>i4wx*&C5Pq5+>Yh0KqEvG4hi!PG zWY8dc8l$7dFKg6MSouFxqYgSgVsfR{zdVuxa9-F*9rn|tN8oezAV&$yMYqW^-(tA;4|!i#wfqh_)WRVQSBCa_ADOeK9A(DVOGULsbFqRW}=`?=pchTzcS)S-i#?j`M93Vmg`-qkf>9(?iy?6582YPNp5mNqQj1e+_{z9`Pm3pMXg zaaQ4IvXY;?{#Z}UR9NYZFn&gH;=L_Y&*Gf3Y zSS#KKk*p&q$VV|6(7hY(qHPAnHRB1S;t39jX7iCK-iAZ(jK)L|xcxFT5#1_C`=fQq zp7@mq)dRjjcV<3IWU^y3*QYju6fGvLch_-o)&_eU`tqjYd+bwK0@9yn^DWpr-YgDY zBOR@HVLPaGd&h2s(f%Ry;ME>e;mAAyu*idy70z(y_+vwR>p#rWfCuA(APVe%eE_l$ z3sa7xBu_$*U862+*RGw>A3@BBc;w)3agJVDc8^oy6= zVOSg+Tbk7_$zQoK)wuLY3HliRg)%aPO}6soOLt<~axsEL;%#(9ybUsyp;zAN%yvim z`*y^DAIy)qFUEZuCnc|1Ce?q@cHHB`x1suptqHy1zg9cf3PDy_>`oSCpgo(`Z^vET z!?^;zB{_5qygz$G~f2{=}7%1&`32G)b>Z50bocn;Vlrm?A`1RC3Cj9agCTM); zZ?2g}q#F&JbQ4n=zZE9qVZLUsXx~pueWe&&Z;bSd=!@)3x7pLAGmoWa{~OO6|3hM` z+ii~|{cASu4AjfFm{iHRYp%Qy{uHBO>h<+58Kl9M^s_I|rFLz3LV9R)&;bgm+k*d| z^&2-(5mf$gm)8vP8Gd_*236u9bO9%{|3A>JJV6RZ_iGv} z$|-TpXfE9_#M3x*_t3yYX`7$@d?;|T^M~7(x)**mdC6Sd9_;yQoF!|!Plr&pR*y$bcqPZz_xd^yArjGyI+Hj=_ zHZ;>xt|e>DrR1HO3?%M?D+@~X3$MZ&?bMq6`GvBHAWD_*Sw#={ZT2JM-K(ljPeLFZ z++CwQ*s3{=FI*h|W3R=fma&PoQb=}E)7_ptmI?*^_s{T#at12@+SD|rh!@7>d@GUs zs3yYsYJ`?>!0$&H3aUVDf##G+A$r4Xtav$PI_j&BBwGe*+Y`d4U@64BRLHSAl(E!8z zs0Ybd1|{f=xtQqzN8+J>j%R0;o05%E)yt~)DoO!M!t5(=Moh1A=j6UMXCLq&TTFyA zum}bMD>QIHXDoV+19#(vS#y{wh^3UHgyUG1LGid$^@xws;^{MA(N}W0Tm;Mau4`@& z79s99ZncKtzUaxe!=savt8-s$+T5WLd`(G){2rRn)Wed>$M$aD(u5-&=jQjfLUNrq z-~BMgvK9WO31SXQ$zH!fvw-+rsMfeXLYj6NVN0NWkmGbwBqjl2Y|?SAus}f`6_AdktjTmiRC@ zo|DE^PZngLBG@CY#TKidGLvLuOSBaTcVCm(Tr*_Mo%KzejrLUE zja@+SeH^Badl~-*zZs(Zz`3ukeDh;z&s2)E`l>ViHJU1R^H)G#A<{?U-z^?H#U>2K zVbEmpN{xWG@5e2XxvIp<_6fDi6gy+m%~CoOav8HCVy0|5^w!Z=t=9}3Y5D8xi>7*D zUt1c*6AOC_udht0HI`|)IE9)~HJpPpzX&I_=WnbV=VCI}GX;*m21KPy3SZ`FcmcDO z=rbWMTW&Kcu`CM1b8IMr>Iq~){Y&e7n+noPK<%+nE;DYj9nqnfo^LQt{&;F zxgwcx;6*XXz|&32F=zjFHZA@24p%?0aanQiw{{nxQ{R)lFl+UOR_-o`xpL^>lhBVv z!b8oGEkQL@&i3PC#t__;;0m`2iX|nA>%>#5`S~b~S=4Qz?-(jz_wGwRL-RC4l%yCl zv^g4eeSumehb?m@e>*KBUBgk4)Z-}*26^n?VYJQMjO>uX+_zn`Fsu|2_Ks%KiQc{} ztfcD{^DEA^0`2lvsU8NP2^`)y6fKxr${x+;ww5k_s?K2q=KV<~(-j-jeH(s&O?#<% zjEpktUo00#UX8s0Kzs?!r zHkXXmIyP?$PbwMA6Yz0=i=SbDzKV?Q9bmFilfO*eTA&l{) zeI^8hbK}{jJKRi(i=Nh;mOa6HpXZi3+jOE&JqGFVV1J^giUup`0!76LNXq{q<|23K zmv4)rGr=8RCm%TcbRpzdkdmFg2;lAzO#1susQ340DP@cX*W+3!ixUDuTB+3E;oLKEMLt=VCpk@D)*QDSLP3lkfiat+@b7f z;>knYGp_1hi;2(RVxW%Z$`ewf3EP=f{n%_GlP(=8rVjf^s4}inVC|h)L;l#baR-B= z+Z=d@gF*!F9Mrb^ey=}8*XZDBpuxR)&ut&$F=RIUQiLrgTv$6M)~Q6STL-L23mQ~%(S-$3AJhh0x_#pR zUQJTU-QCLa4Hzk2FHQ9C#lm@T&qH?XxW^^qZ0I2SyA>IDVnPOoYev{2OqXmoX55d? zjLHG?U-w|N`vmT9zoRsjTeY9jrUQRV*Veb9&uN|KyGfguT7?I{>ryM0Z+%*iPNn%7 zr#oF+DQmuI`=s-&Lr!Mn*M-)u-4ez$dz_`=6_hbzEIQCsn0)q!n80B{mYuBpI(D@a zLHJ+vMb6SE(}Lr^LHY;;U9OcnR2&_ye}9MU8(eD&KUF=7257wk_voq8dF#Hopd)&) zLcdXKLjPvk)Bd0L0nm z=uY4GitT`*dg`B^KAmFEEl%WU>2u4;3_)Q;#M zfu)&9i^(lQEU!XdGssHsxbyof2`1v$eUKM#6Xxhh0;vk(Wl}& zC+rMABmGI?1$}kQ>&N8#WxemMyd!vbaM|w}`wLaDiSj3%Art{w4$}F&-CK+wP?&mQ zAQh*Bg=tK~jhPwIxbQ4ftngLYGn(cMBXvD>94SPqGCHZveAeF;r<}2o5Bg@Gef)y>DiB1!a2QR2E%BV6N#*KX z3M*g@0|GA~7{yhM0hv=yI5k;i{=)o^pc9O+C?uG__B^Z?$j-N%x9F+80GkPdbz&8z zgW*={F-baE*%t9ABcAXF8v$K^>4dkV&uwr(h(CCxG&;+0iI@aEzoFpRZ`x4pp#`0& zVgJwxm{&VJfJpsmm9HpU!`ReY$)zfFTfVG#gf{D3989<&zK5T=JoP!LegNm6-Ax(f zl{Jg=J>5zBGhH6ZEz!~q6k_eTUEEM>{$&+wGrB_{)|LJDfSW0o)!*JnWk0_(G*Hk0 z>BiL;A+b9eu*$Suygb)Nu55R#o#;*YcT8)?iv$c!O(nmq zPq2xg01RE+O*JEhA`jfd{BL_`uGd6RUc!FR*Po)jl<~)ttWtQM4f#Kaj{o=qRDK~l z^~Lw2Q;PYU;{P8Jsd#?kTwJQ+MJy4k4YyWR11-bnVCTy5oMImRNM`K}tFiQHeL3Z|SX zBzbSzW7%=W+fV3ucO#+_@d}kbaXg-G8JtS9cf=t`5Y~t$RW$shWC>@)Nv{IW3mICGTafl;0J(NmT|4<5 z-`$9@joz~7h-`7#8ImrI(eRvI75woB{clQl+-YW51H>efnRokJVFX-gS1UXS3R@c@ zsB~_|iSoW|oZkpb&vfnW+oB)?@S3fQ{L%(0B+- z^R&6hy3OU=3h;R2m_@TnVY)RdX+fT(Xd}LKbRAwXIzWHKg+xub#?Ova(Po*RB^ zaON8T78;0BIf7sJ(+co~M71-qZszQWVt&wMqJBFAyY+%QHI$S?@K2FU{yeoQf9K{Y^&F+WMM~PQ}QdNFrj>>K;!;3~x7WeX!ySp={X&23X_(EXgONd6d(iYF2&$2&$ z{DV9=Ygyqap&GA1zTZ^P(|EGlXXdkV@8qk1qQ83dO@!9JY3F0xNZrrWibme`X2Y$k z4;fTIPoEIw;7Sv7@BUcS8=38NcWmY*)%L5C)Lr+5xFszSBN;J^Qe%QJ?>pk;s7^ca zRPW;Nnm=;=Q7hSLs+LY=dyM#z@7pzU6c0k1WA3DzW(C{)`#kB>Xsoe(Y`g}RIoq^F zbT2-o=T0d|B({D(CJ|T0f2`7aLp7azTsN=;TInvL54h)8gsEwxMUIo%MP#+G?zcdx zZ9A*fNkBL0JpT~S4;C$jD}`!1n#N+)t-%P}za5`QD^zVy;p(#JmYH?oEy%`V_5?KG ze4>etONh&QS)8AQ`($(0D)&-@{tZwVv~s;)D6eoKskYx=%4PqcXN9;MQCB__)BBbO zRKe{>j2#^N*A2hY=l8qAQNNi!)j^h0gZ_e=$IV}{Dq+0tGgaC$ZO8?u)*F}l3wyt1 zVnvm1zhwH#t(YByV(2Clit)u~7Qz7umA;(1YW>n)13{-h%VK>jEoGF1qWp7;pEsDf zTuGSSgs~<A{L_;F3vPptT?cqa|vx_eBK8JsDL3LIyJJbgNB7b&F7+ z!P?&r9vGb!tmGCc`+cU8i8?b24qW#OGL7aQS1!H`*WPlsmT^-UMZ<>C^#kWJQMPsp zj#sZc1=EiBorR_n&0mtblNqiXe$xx&i-F@_I;*>j7<|h7<5fA#sb~ii!dfVoKw)_5 zR^abB-#Eq$r$&zS8m2@V{4p|kmV-IV)4ZeH&6qC^7M$gCi_9@LMbBqU6H{VkV%|?o zYHb*$jKZ(;27=!m%D)F_Pd5}~k45*3jxHcujha@M3K$P9t2m84*O+b|JPvIn%Q?@{ zA$c*cHoTF1dN~DW71+ah7U?n>04dCkz!OORTZEB}n)R2o`T?mqb5@5jePYlWeU1Ilq`Y_ z#jl&n2cdEtPcVSZI5q5csA`M0hwf$MRUltVp}Of4QP_=On3qtGZF_W>J~yPd>$eJpBS%9cI##7&#KS_Eu#c z70O?S$Ti)Msi##X#Nj5^8!x_l9(!NRsogIr2BcS1fG|oe2@^Aao10DESV}6GmR^lI zPa>|YgtzhaBS>koB^E#t0>Ou2zvK3HT%DFyJ%u~LU6@KLrxl(OBjja7Nf-A>YM5qyh^hnJvm?MnmOJn#bt>R;woii$+fl78eJv4zo@ z_(x2n)zu~JaNb=GYHpG2u!|5MA^INan{|`0mhShbdZXVGepiaX3#`ZR!V@t#*K(m# zgM<#VSg_I0hk4C<1NlJ_Q>#Z=6;$3*ov>-1sqSC0eueGFhAMxuYDvdqS&CJW!IV#8 zuiy#zL^<4Zo$4HG0}rJ~7uSdtsRot6KeI25YZ|);-TbK?Gs&$=5os`So2(Uhi-c>! z;ieva+ba(3V3vawO|?7&c?w+Sl}KI*yxk?h!G(O(Pgj@Y&_81WAZU)uW&gD%@#(Id3wl4Kds zds8pSXEzh|HiiEJms-QYn5)EBHL8WgYe74Oa7v&xEakE6$4DJibJ2r}7{a>FP_Wm; zOHpp{ALN!iOdx1{UnlGzEZSd*JYK}zv4w9`!wao*Re4=_%(B)%eFtxo-hCKhiC4!e z8?2~C>SyF``pQ(i=(XQ&Xl?S}5*Zvl*OTf=MNC+h&QZAC|6zx`F+QG?I=1!pm3M?t zoqoeMHSiYwD&DqFvPo9uU#^hBnm31RslO`6Qi^v;g9)s{Cs@DEKD1uR0x@8dmXO>F zC-tGs9vsXZ?YwNIim1tyG*I14aTpwi=p1mSZLj=o%8JJoiZ^k{H8cLpo6klXF$rHe z+{VEqD;r*$uU0XxNr1&HNrk=hV;aFCHW4cYbEPVV)ZhS0*ZiCg#SoT@;@1wVD{nh| z@vDx#q%JV%8SOcL;R}+QeEs=M5e816Z};mQX*0C%_*&ci8Hy?|AG~UjDpVn}g8*`C zjI4i39XA2(i8PG_Jye`v{qU!11StkdQeFH#^e};1noxG`_---suOw`}ukVoUl7^g2Da+*UmUU35FYYpVGw;VbNKH8EA6dR&#)+RsAZs$QNp|NT z1pp%+RLpb1nE3lXdubY^U1UcWOoS_Hw0fcd(dCA=bRU7l(Dn0Ml zW0)#aY9uU5%H6V!QYP1LO-;F2X=A23s3uc`)=Yc8Q3H+WyZuV|g`0PkKi3tkkl9&M z95o2l;9ujy65?et@<(vo$Qg@_qRrmC0Kg}q2Z=?|>MY}d>4C$GTYuI+q~SP8l*A@+ zjtWd@1;iK3o-iq%nB$xZDuVO4s^p$?^4EjC`v%LHG{N@e&MP9rJDJdWeGu`WE z%{HC+8>U?L!rFso$%Uox;lqw5ZyRqh`~j+#V(w%4_`jUb3eA*3n_7J4`0yjeHpmQzu#YGc4L{;_pMS3&TtyJiVm--a&Y+F)@~X zZ^6gXQ2du0Xn`Trgz$n~z=0QRtjefQ!=-%Xc_z3cp{QZFhS?tzD>8rpO9Y(eMB&q@ z_48oasy(%~^i#w9-n4$>D>ZC3)t~7Hdve&8n)Kq3ihRC3aIm&4UxCrdtgFGbuWsJ0 z@{nPRNl0QknP5{S8+;w>_J&!wua@NqKT&u}!{yWeU~EFLI#^F5feg)b+2ZNu-b{mU zJ|bE*d*T7xNFcWOuW9mEXDcv0ykrfZzmu;=MzTPawBHZs1IszoDWWFY;&M*zGY%;D z5G6@fS^2kMebAe;W5_=N;6G!LKVhi@GT6@nZk$y}{AV6Jwqx=V#`W2)yAf+Y3A3E%`sS?5jTC6S&rSjvm!40r1u#Sd zgmXSdK_IyT?i8`OWTN-G4z%N9&Cw25#=ICq?PnBZ9DHBpNnAW{4R#QvF!2Zrvz+6$ z5$@ncB5s!@`BJ{g% zKA|h+y^r_zxer)SoZIQE%>)CU;zHMB0)R!}d=aEl+BBFs_xBQ`NreYPMM+ z@5%wa-^pEL&014;BRvTJh^ftLiPN4eF+NYEQySF?g_R>rXV-MoKC7Y601@Q&|tMo02wqG=K>%G4fZ(!WWa(7j{(cz#zVj*G#G0SPzVcN{R`lS z1_Ay8=0NdB@OYrFJAhu0`v?FRqI?k!(N;E35-H zKw)cuDNy|?U=TF90yqSrt^odkSe7B>43_}Ypy)+Nxx^!QMG)*FARM$i510qx%tHi{ za}X^qvydcr2BKwY8ZZQUoPtQ{ryzB8Cjpb7$O(wFeH@ZI8iTyU9|J6c=mg~qLrks>K}q}N?dFw42t=0^h87h zFrh(-QGh$}UO1oz1}qc`sDJ@;hX4?vfeD~{haak z+rA-(Mh`LzJvTgL%I^zvq_{?CZpJ&u7u>ZyC3UPvJOgR+@{0{3kG_C)924571x{mL z_N?BuyhXo~#2%GgYB)>2|EYO)`T2H4eF8-o&+p+nlMi(OJ*thf$8~o8OG#?!go%u zR~rxihNe3HjXmDaE`zUc7{*1ut zjf{XpB0~ML&ki7s3I2L_C->MqTsm;Z-4VYzB+%XNMNo88B^PT|&oiq#_v?7tfL-Y| zzxyDz-8MM#w^YxcX&}4cq5ZzfeN6 zGbX7&I^?KtcEFL@M*+4~f`EExCsbv3ah>AsjcDzfR1j^{?^zzi(ng;rC>MT*={2nt z^`(CFb<3y`_Gc^T@KgMJp<|W8sQygZ>BU_%4gyW&C=2afEc_i;`+X!Q$8p9Q7qX*< zPiv=Fy+fmGSaj@LGYHmcX;FbfYP{sn#6(hv}mQwvav(i{Q%DvQnpqn00qyrDe&U5TY&1LV8 zax@Y3E9xy+o*DPEawG}#?1ZY1s5MY${d-hzm1*B z8`VCR31w&GwJU4rqpb*gi;OQe+@$w4DMn8x_(Q*=MHi}ua&5z|yjQqn{pfeO>3hUR z?>_L79YHt#ZCC6R>L{cr#zn0d{8he?H%bikZ2h7CpIAsH+7q16Vvjt1mf<`3h!D73 z0Dvt3n&yXWjkCM}h!n50!AyYzV4@7?bdLVw1x8XKX*J1l8L3_d`s2&?-0tod(YM*f zbE~-o*dMHnlrJHg|C&}vJKkMh_6@|D8J*hC-E@`ma`_hO8E-Z2U)Pqh%ZIe7K9ymk zKX^LmrgnOPfHSgIo=twkqE^4M)3SQ_GoDw1F%9Px_}^!Yi+*2w zec0XEZ+%J4i^)@9pxFA*OrjtMJDJ#Ica!K@K4@s?X?@2tB@?y~X@5^_-Y&C$N&6j7 zfdY-ZU$q@^*#1_?7%$x8&^@sSvYhmiAS{~LRIenY2aZAws!$SYUX$_}mX?~YF&Q7# zdIU_g7y`KU8$vvF>ERtbRt%AHe%fC&V5@`-Z62O;lP}-%a1O~vcvk4@$P|S=GrvTE zlV)&p**FOE=@m6YT0=P;GjQt0qcnG<%Ug9GkT<_tTYT52Ngb~TRc;Z&WPqn>>Q?4v zn2*{XfYrX;=rf5s;x%Pqg4oe7X4u|4>eo`WTkWr%%O|Bt>z%<*g7&WARfVX}gq^y! zNb?i!6L{Ww!g%O!3wuPm%y(!7_M-6QxV?{#Y`@V|)9JFeY4>>q07q(dk8yzYkKO*V zk%HKul;U!?H=oy!6h~t&dQRM6V!f6`Qp<@j;G17QLITJm?U_1$DQU8baccxWH#n-j zuZ=#2H-NpaDE4|6#w<-%QQrWEpcg=C0Q*CEYKJ9+P;^FpajuN`RtVG@+%agq$5k)R ze!wyZ+}CHys?`g%Qk0OXPr!6oZ5-jaX6E~{m`;3-eu>6R=zv!+{5eATO8N?2GfZv> zi1_1Vby*&^m>k})U8_ctHSx&k*9C=^WAG!Hk4)+Uwv8=uS`|_3CC-R}WG^Vk;3~Sm zR3nNho*zDuP6{=dvECPNE;%P)>=>!EjH!V=Es3tk#u|oLFN8@zx{<~qE@7;@{71`# zrqmAtD;*KU%=;oQ_>qmTf<55obbsLwptb(_?o)`v8|DgQM8=NAG9h_*Q14>7&SL8C z-xscfcw(m{3RFBLJ#?{ETxaAO)~(fw?P-SL(#EZEO@&i2jzg_~i{WNyX8G@88P)z2 zSW1@?NrBy15*bggQ#E%pWw9Mv3oRVcWz!}t(;kA84z}S%sX;cLh(e$2;wJGUfOh&Z zhkC=-!ms+tPVG%rO+n7`OIwt>1WClp)q|f`RoifiYiwp@rX+4A>!nXVrL+3k6ZWT` ziQk$3q>pKdn5&vw~ib$7241-dbv*E~);YOyu4~#y> za$tg7TKhVC&=|=jY1_e^&j1J&Nyal&je_-fQl@c1Vdo^5%63ULncyf?)M>CS&sZ8_ zb6OImBl&01YumqHoXYlDftQXA`4~`%pu5a?qF@eU04z3q2)v;JWoUKT$<&!&3?%1QE!QEo@5y9@lY>Q=O$VZoDnf_vH`x zAo$v#TGRImLZlA?aelsO_Zf$OGc4$((48&}8E+gL7G0_opP#i~fhni382R|p!q^FO23ukyIS#b(f*g@xk00I6^$?60*|~YrRMm97nEhX zc`vGuV^^?h8qeNZpmP6j%pG59M%1+OI4a*!m|$+S{P^*q5E!IM`Y#4jE_-pkb{*yt zhDKYI=!19qqbyT}q#A4Is_|NzM15@oMyEjAzxW;NK6WX63EEV?I-G4jD+l6rf^k70h`7{g} z9}P-$zgq%~-1_821PlN%vpqUWy--#?sJG>F_JjaG-|f(kW`fISBjYE zBQucWUmeQq5L`8p$F?g6qQ$Elr!LMvy!~7QMWi=>H!neFnE22h7G(xK^(k2$#MkJw zUksr_Koa>dyw>fCMB3E+&17Cw64`G*a_(;a5yd>_Cd!Cdq8WC|BC``w0ydNN_LVha zQ?i?DtBp5ll};8A{5#YAyYq@p*RI;!O-0;nG2Y2^o*SV)wTg!Z#r4-|em?}M^{ED; zrXxFTg!oGeO@V_?`KHtq*`vOao!aBv$q%`60F#{^2c-Mr^^o2ROL*D>TqNMEjljVj zdEee?Qb4xPqK`&1^h#azezNrq<;>RQbd7!yE4v*%ahx5q2WWYuIX~qu1F+AqOaw<+ z(HM4b>7!gKgo2!>LXPb9v2iEn`~d;HUPTz6_*d4kcnvcuu$w_0E5#Y?clv>Q1}nTl=u);_7*EAq+^WumdMQ zJv#FB8u(R%Uv*x#A)!2ugjSZhW;qm0&H6dOjA*8T%E) zqw1dym-w5VOlTU;t{g>6Q{Rr?7z{PNMkfb%m)h-_{^r;=WG#8-1j0&M{V{N*f^c%> zlYG=0Q%gb^a~kU>lI-v&b)peg4)|^Rum9;FD{N-rfGM_LW4N#4%NN$Uo0Da5j69^ao8`t!uR7Rv8{Baw~s$S7`G=_v6&B&1k?(O-R}RC>#-}r?aJ{T z-$k@<^VTbyAWXZk#cKYQO9-JPqbsefKFjM3Ri{+A`Mzg9VTe|rC)5eN@+rbi zxzXLRh~sZcZvx$g!#0#SOhb~=z^y8r?!cp1_op7zKa%%|=c&Irt%1N`4Z1ZalhsR* zEmrI*8+>jcJyYMPyeYl>HraXPgM_Fh@B?8$OaH$J`+x^+3)OH*3ce%4`P4u8=J6pS zXmElt5Jsl{{f5Q3_Xiu^Lavs$k@1jz>u&v|q*QlJ&apsyEXnelW zZOZW4y(pxs{993Iz%s3PTxUc^OH*|90wIMWK{dTnKLsl%fF&orT>>_;t6*|D>KwUl zl4qjqWQ5cxetwE%c*>{YgrM2l!#q)*o@6|vKVOo&GS9n~=hhI52JV#Lv}3kWY{zWc zY|DA*98thb(B>w{BI?ZLnaah>iQ7U`W3;J=#1zHDxk-K+z>yZc_(_)pM4aa0#Eq7^ zWFnkw>V;av-H^oUpZfEyC4P>CHvz7`vkr#_)tS0vE8hoaB8kfDR*}+7U(uRkck*Uy zbFrHf*DLQLm@$LGwFz^1g(?R(oc$Zn$24Csh^&U)xBR%vo%jCEQlB;`?u)Xo5KHWS zK8I1UR8F0>p_?_ zFd!o`z&@}m$F6FB*gd@G;gR=M3xFML0I8^ykv_k0{w zU2aaCTb!+W98^3lnYWXIfkvC{#`mQk_gQ%l=S#q?fQO3>Q@g(rK>m$x`wKC)4AbtC z9w2ah!)eV0H8@D@!89Y}c|$iC=&iV98Q}ML&Q&vJfAH3KIc|HfIli%raT7mScC!<& zu$DC;apT@frjOEd{Jy+q%106x@ZiY(Qa_>M;q*}8+dfF`{e0c`F$FFBRy_B|Smf>b z*b+$eT=wDfu=oCeW7h&I;J!b8iQf6%BR34XD8<6~>U-z+&hL4&)Z@`Mu=*?DK5O!m zalp&~ET{47?XeT^rRS|g?BmLF;__oxrRVLG;{CPk;1|&G{g(YB<0IhtonHm`Qs~}x z#Ie<~uh9hWW#Rx+#iHaFn0 z3ZsauG64Naj%DA(Hd)}*-#Bme*A_)H9W&T2OsR0OxV*_Cw9G^^GbXBwn3-wQ;FN*w zA0827_U!H$k_|7-WO-B7iVvb4_B;<^h}M$wqb1D;1Y3W|41BJ+HKDFG_}S99IQJG# zy_SWvq=u`q#=13cv3_+q_D#;BeJb;K2w1MehcRk%VAi7CPPI9%fPwzS@{9Yw2M1jb zrYA&eReZj4f$1->5!}3rr`B}Zc0dM(S+1UTdEKz&1Uc>ROzH7HR)L4zy5NBY#6>*5 z7i)%E=*?rtoz`^*QuBOv4RfRQdLEDTJS3Ua;ka6>+ld&LR_9FXL}Rci`Z?D7FmvU@ zcn%)=!F%k?cxPa+R~C0lXKP&si5ki${dsg)m50PrV|lU%b` ze!$7a#SU*KLe)4ox-)yf);!Y5IeWs6!Fgv^jTs%HyOdPF{r8@qQGdw{1`cZ9rmZ!ETg1jF1_y#@B zN7=-YzMsT?JE2WS^u*ZTkO5xxqutb@3?txhwvCJOSgl!Q5HB)dh|T`{EWOaCB1ld{ zyK4B`GSve0`>2R#sq2|eksqrA3*8W>_Js~U=?b{1{T4VRum{aNPe}Wd+27#F$FQYh z!#x*s#4g^OB*plvOMg8KY6KQ-G#V4sac=beGJ!UQ;;jc4Z9}crQUvgOP~+Dq`;zHB z^-^7wayXm9KblC>Hkp4Ot^?@>wzwJId z*XgYX2v7=OQQyn6ul^WK1Bb78bd?ZQjiNYk1OTv<*E4Gn@bOwM<)72&2ZY11S7 zF2-mQFk=;g)t7=h=4u!VlcLvh%|}>@>N8gat_{@pM+R0Zx)VRE-nwlPt<^LY&c4K9?wq=+Bi0+^(+=6)mb=nHM_9din{+v;W= zo|!KyQ_JEMSq1=;9tL!zkYMT^#un=)osmBOU0vYjW85S8`c!qni0ta?-+Fu6tn&s7myvGBCtDzrkhH@oEpQtcv5_7Ii7cOW)cP_bj3Gkc zouwwAF=lIp^u)kX+dv)v1u>B7=gMweSEB{0V3_zmS*_iPsbP(RUU6oK_?g}Asj=jq z3DviBU97K>vZZclu*#1*vrmYoNLImGFOX60^5({YH74BgU7UlHv|{t86#>$KwM8vI zb<$OR@vjKr{1WwPG+CP=C-1lcM(@|i)ebluPCb`4KbDi);pV@Dk{sA}V_aI%w1&A< zpZo5#UWG#onNF>7l~8{bLHg;D@GyeD&!#K1cp;dE{Z_{z%{WYWpQ1jIxVWaJskCIk z-bQkkOJbQ8i5zrxv>%h0zd_J(GZxVoL|l4LCvObI##le9{Csa+U~N)5z>C1);ULmK@*0M|e$zkXz$4Zqy-n2Y<@x-I*1c_#qD(uM>(p?%ukd z!2P+uVyFZYajbsqlegZ52D~pqT(x&|)vo&otkdA5a8<_p-`-znOCg0o9d7s0{ePFo zLKVWo(xUmM(@}H$05i+*T*BNX$<<8BEF3d!1Cn^*^q!RznZwWC)f_>j4%P%?N@m6L zg~NpsBY(yu&Nz2BtE|@$FIq2D$Yf}rR&ECti(^|{v-YCUQOKkp6%B)ScUMo0+D|A9 z^}8PQ_Ne%RMtM1EF2(Ga+QBckQqKpA#j*6m^-;NASj-M+LsX9ni`lVOZ{I5JpY!g^ zrsT9F6jB+hXNq9;97ojbi7V2YcHdjNFh|veuYWh^zNmu_rtS&o14;3{e_xNV5=l|B z$DVpD_dsL#{p)3-B~yteroHkh3LK`?)Vgx=&HY|ShyH4a=H{i7rf1){-rLLQy4(Dm zrJ6nSK8VFIOv&ulNown|u3bHR?O>&Y0DKS=hfE}fGqsG%rd-k#CtPo|DFsz0K6iOp z=6_{Uq34%nJoxOE&Qzrsna6b(s}8Sa zUe?1XOevU|*76QjrRSy`3KliT`%}w%-LtlvlG_BKc!%qmZ@4O+A6FwEUM5S|syy*j zl^(UYW3u8hms1zW()D(kPE4RGp7qqTa(~ah9pM43xQbqUi*_!{N(fk#pi*8)WbYdG z1}30nu18X)U2VQC@`+9H#F=p%Rx6WC@x-|X{3swF#DqH%r3^0$Woy4pRq9!n@o`g1 zLaI{F<{Cild>d=ORCMgymkX5M@@5keId+}hF~t@QmtZ1p?KHLBvTeLMC&cWKrGFGE zo3s)MmqS_!g3Aq8uwSgp-bP+>Bw-r5yUVLeM=8;2Nkqz@v3;1$T(8>2z*^?Dr-M8f zu&DI9%t~@eNF+>7)N&iv60enzxLmBI#nY+hR+&$?W!GxK7*3RJUqb6lfJMoy>-Wn9 zLo_pHziezekqU_Hv@D}TFqM3ow*X!8cnt$sd>O~yt-UXo-pcC^H4Q;{Ch7hKONnEZ1SL(oLo0vx%*I3!w@20v&W@G z!x0J22QlG}d9pV(O(tU(jB%~n#U>(ih;9>B2s{g52=gu3z-hY=N4lD2&_vJ9x{%m<6j4qJ0Y6?yn7TYnPw+-)#97kL&RhgnP0!x*`DoeVVQrPQY#=hYb&QjzKzQRC?$Wa*vmum5-L(WVpbg+xH zj*5yr+VC@z3LOSqUxsa&;iWmn#0l>m#Pm!IMb%2xCUx0i>|W+k6i3`PHLqgGk88lM zduOH#8wSh4NQf6VN`KH1Klb}_%mXR)a}0FX#}b3lB?yFFX5~Fk98Q#+l*Qph!8(s7 zERJN=ne95TpfQjv>8aZCMge+=Wd7 zmmnt8q_U7mSYqh1d$YpWjq;Gzp|ce7o8o_0QiU#Q9y2^mu75v5-!oOz(mEV^ilByE%SPbF0{l$^_zcH-cTlEmvY`QjHy~q!5Ze}%RF4d^h-M)mBgbYY2JL% zGIDMP!Z8zK8j(<=P4Ew{s_HVRQPGFxRecvO! z=`nt~HrlEy5|13TY;+PSj)iV>$S1C`0>`wq-3~cNE`j+Kf++X6f6heA=mqe4L>oY%B`7Ib`U(S3H2+sSyug!AoY)L;; z0_(^7!=o-&*{FK(vA17iBxpHjGNQx-=Z@dJ)qa?X!2z%1i6KoAkK8(nn-gMD-#4Af zap3x&%jY)5KsS54-WNI-R)RnblS!{HiLnAHf`5a*36kFenV$LUTQLHfD?>gW=75UL zHJE5d;acQ3(;2pn5e{bx##%!H5=C0%EgSmJv8?ZUVny)e$FXVsq$6~XmREL0LQNhq z;)J4^kwYpZp1H7t3|)fAl*Gb|$YR`uDVe><#gkOXq+HTT;)x5xO{}TS6w2~e6qhKi zo_`pUD80k-vRWCzvp`|xNoarxKoPHadgzJJPY zG&+!-I!+lFMRJ)yxpi5gtiOacJc`s2_wX|{Q_-o<*N8P!6te@Sr)!6XG{TG46IC)> zdDPf*=AQnvRhjZ`QI$b{Jqz;Or&qU3LbSR)pA@shUs?TeD^j8T>@?dHk4u?8=F8z) zr<<#EDi>7{&O5hz2YqNZ=Yqq5Qh$h~F3=_KeSJlW9TG2`*sX%Zf$N4aR}wZjy*xw- zRUxqV%*A;5q8N%MhSzl^m^VU0ok;;2SM#GI5C|iCm&IdlQ{0gyjuW`eTYxT0py-n8nyMG9hJOi^2(q%p14rs4KsZ^hfA5(x>Zb}tbfRjOk(sg)!<`d ztgJG*MtPBCnUv{eGs>0}LQ6cX^H%oi7Fy!R1=eb{y>=C`mU#CN!q(@4P4U7FQ@cIX z462gZ*|>_SjKW)dS0VsiRXn2w^ zefOEcmC_B{!KXrC?{H(gFERzOaZ4TzP7S(yU@vAeX|*8g^@J&xM60@Y(>sfJ`B* z9KRM?=8tWZAOt;O?d!7j4QvWVDJ%fl&Aa@x2a0CK?|)u6EbiEXk=hQO3jl+K%{owInFpOFA|OLJFJ7$@qZv8+7(VK-{?|kk>^{!F=tMrLZC;T@@6Y!4*G z(I+ejA(@qdk!ja6cFj!S=%_U`2#5y$9B8aGDVgoUAvxCSA5m$ z%8BA_!k$u1?J%h>eU-dSWa$!{;;1_E@qf{L5=We`0$rV%zK5-O1cUtQHw>kS98l6X z>~#d8A>P01r@=u;RP_9k^9bzu?U$R#r8``TbeM0| zUSd$xN@n>QT@=lX_J1J~res!rbBn|?Cq7+*!-0Z#mHgyB!%94GVKUS* zDn$d6YYJtmP?MueFX~oW)~&K&T}x@I+@y1ASz@s^yimjRgM5@nSW-jeH6{i z^n4xIMZs~zvF}>qaHd=n$bYEkk_18?HS%C&ElHlDejP2pj?ixry)7qMlj0%F+@pC3@yfkQ@ZUu4Wv=sQJ>Y?h#yOI>T2X zgx9(!hCkFQP@LfnvAU7!$hXYb;ii10b>xHb#Pm$_b@Ell`@@`D>l&_i(Nq;8a%fX{LMuFF+XDU)$bDXcQF z#+1m?-PdCzYqJ#NGk;&1G@}9~#b~I|Ft1HKNHI9%1X~G4f=#cbP*Qmp4(;ri{>`V> zNStxX;EX0CmmG>`N@Q!(S3--toV-HOz$oJu7LQw4bvg=%F{RyQHn$Wbl{?I5mR2i< zR8y#^`UPjRN^5wLS{)`7THx=G^=@W)kR=|tVeZDGmkUz46n|(rK~#c)kdr+n7zk0u zmhx4f1|spmRVIO$5?DT+lR`-qlQ}3F88MYpf`Q-@IVluXK8=%OQCB8$a5z(Z*c(MN z!zW`=OYlrg_=``(plD{`&UY;@pO8REKAFN4!iuRBE@fJu9uZpRT~-W>uVh0= z%Gm{Eo!ro5;nIJF&uq}BnAp(d;u1Yw6fRV)v=MU>F{VvPaH-H@LW0C2 zcW=dbeu)yMQhswad6aTF1{1OHLMqLJ#DBh5Z-(nJ9a}q92X-_gYi^eCg)hxZ=Ws%53g^@-3KULADk9C_N7djvuN%I|Kq?XIPYZW~D^& zJ}dNd)JNV{%rUR0SMvsUY4!6~3Gd}oK4rg1`7PPSrhY?V@&u{6;$t(1n#^4{GsBCbE`#mc z7`_o&O+sUNdN2DoUw_@$W90++ClsX7wfs$^6av*uP1}7u2HL#B;YhKa$x|q*n`_ax zR-}=_nd0B7KvB>5fuE+m@KYoLBITywOd+iJ2!9!u5Dok4#hXG04|RYzd2S&BB9FO3 z1_6fp8Ha%TOpz6d2 zdwq83ESK%E~*zF%uyNGxpdM_39G~d|Ehbk zN<7M5&r&RonDMJ;MD^mUUT$%nMd5c9k*rz0zLRmWgLIq6j@NstfHjmIK zKQHr{CCk)Ry*F07H?Abxd-nMXE)`l9&^V4b*OGxf&s?wDcXX9?EuSGz(voXmK0}_Q zrL}fGgZk9^;g}l#p5D@|ulzMARj>H?uEABt`^WG$wK5AYG|%(vl&%JRE$WR*A%6tw zI{N)Rdub|6J7JmfC1a7So`_a9Y|tNRoc zdDKmtq(~in>n1K0T3O1&l){RIJbxr!IBf?GE&*+O*Wz*=^-rH3eyoBYho*C%C~AbL zIehz3)be%8r*VG|PwKsCZ@k0HBtpZQ%u5UV&x$5(jUoQ@3aReQD)k%}cvHOogBVCo zt)+G|KbQE-n$;J|;fkCq?3rD_eyIeE8sn z-#GtmFEawP#H&I$1;0{VYly2rafZ*0D<8U5b>V}e_0*UE;Z&OtI-z()rq}f1yM7^y1@f-nyCe%xy2lMg^=D#o4g8z z6juHnjvNd6z9>Kp0&!e;A16dWdtH{%G_8HiozlCMs_GFHzfKgdAAgsJ?QGeFkgD{I zCyr6@wR6HMc$B&W)ff-UHW7=Fps{TuV#H~%K87uQP9ad;{rR-aVS7sdo>S9aF64sL zkmz>dc@YDPOi8T&%Vn;eZu}rL;HQ<}(i8%9Iq34<5OB)T@*Z!DfF?ffdE~Eq%6hoe zzQ@e>V2KgXmi3eWbblDF+i*Bhepr^TDr5?<;vmy8z6{%b&_$ss1gg?`enGwGw|=-@ zefzh$z&|l3G{%d)Qlv;7CqJO1@Beif=9c!gDg^cVUq3e!gu1u(>{=u>d%{?H^?Fd5 zyUtA~p6c0Y5Tr1T+Zw)}!Do)R6zH&h@urN1OHp$)^gSt6kAFTt0x7l%WQt=SZAt`l zC`uU7@8c4s*~Ugp@$9Fj>(m3lLL&K)PYEVM_8xIKQm}6Q(#oWAJaR@BBRCu>_@tmh zrEsL=#~o2LGOz6*lJPO8e;U^CfmnGJxI}3FRw7df%ZK)v0_-?kl<8v}{^5rozWVOn ze}DJxe*m>s%eSEU1%m>&7x)E+0k=H$1=|9bk@N+tmr3*mNVnti1!e)4JMsmnmz41Z zr+>{@O^e$w5WV|XsNh2aTiAsyg`}adu%(9{3cVVPY>gAKvTP)IleX-CucX*_mtOnfTVcLzFAzE1E)9D6~KyAAhE3hF&vDyuTjOPXIz>B8(Ye5i%^*WIDGK zz5rP;vnM!4tq{w#G(nTy`i0(+U?yRTwl2)0Rw7%Y;9V`VSu6l6_$IRS=PG|T)NtZLumv2F9H2e?UZhd6e9AWQX9DE$;S<64 zk3qK^7t~8ob>SVW!nJ|kT5yphAoeImV+!vB?#2NSDsjZ1rf6S&YhUo*w_sPeZb%3I z-;^IhyCvN8C0{DNGrcnsFo`2=tbcVO25VWl*1}?`#qol%cYB~!W!8UKlsonWwH?%X zR4Qc%^m&bl-e{k0wd$>qT@P(k6PvKr)TJqV+C>fTM(S#EVT>7zaQsrYmA)z5^N0pz z@-SxSX7ssUZj#w;!L#h@+|n;50~g*cPWmey)lP1m(@z9g8NAA__*l{-RY|%+xjkai#-ev=?Sbe<88v^4 zhz4E5&wOcKH3G*phMs%}(v431AGa;;1snmld+Y_W0e^LqO>V;=5QX#!2%se#k{^5_lD3}^VPYRpzt8J?G@ab;q zO+)WqUNt@M_C*np+Q6IdEqPTcQb&}AYqx#c{E;|pUE_^KST zz=$bn>l)$zfHsk;{>m8#uj1TZ&jy2Q^@Yi(tgT3$7Qw3=oAi(oj3Vo_-XaspG<~}c znT8JV5v-g{-*Ei_XrdgT|6&n?1zlu^EflCe}B>dHmA z^x9kmv>2m&4};%(oTg1*rnJ{NV)|1Aom~TW{Mo6n^)wU;$&1i*!wf z4jYnXo9imAQO7QPSs$W+kR{3%q8mgiPPXR1j~B_7NlH;{ubEyfA03|aojXPS_D8Zz zS}hkjft?~?V3PU{f#e}U_~Nv4-iquH;ly?jfSlRV%|F_VNB8zXSqldg%-xHLW@_*+91Zr^;3!Lak@-Iu_u$fAj3#ebqz>MKM)f;>ht8AFE3o(IYT_5{aS z>f}$xSw#F0RmCgNpbl@pIp4|{50_QBA zezd6OU})hy^E{+VUNbRg#aWFW9;R9`D^YAz--71d(_EOusq7btDT^wEkvMZ?M`uys zM}IUuJwLJoT2-`+Y56)q=AwQ?MX*eW)7C#NK(8d52fhQGIKl)BM!oK|KN^Ay0O4hS zU_y8(|M@+z5E;yk8R)f;pt z69_vE9OwGD&U30V-bl7lZ7Gnu3v22|o3(0MJ#BCquzu$$OZ>AUUZz;M+H#a$Ci;66-pe zg*w&Tbh7mEo8P^JT5j>JgObVDTUfVGUx<8v8XDcaRw@;z6cm`w{(Ur4*< z$rgfxWW=^j|Et*No7p`=Uj(<1BqucODfaJ>elA$~ zNVxj^p+AOWvo{-0`hPt=5r3K|a&9mUzt*G@!ksg_xr+ZV)x~dJNX46%KnJ}v4kxQv3Cf~Ow69DDR zQk#(v076JCSdM`;81+8G$)_f0LPTuWCic3J#5kij^o=}2d(<_i@6yh4Js@?}OtTzq zrlvXV!s%$%`*fy#sbGBqg$a2ua%ffWFzhN-Ha||%R(5e!_J?|Dg^#XJZq~P_H&r^c z)H#j8t-3(<%joOS9Dl=M_sUeAQ^BqGV#ySKUcGHf1^C7=KaNMUFO6Yx?glUyX>wSY z-Coa}Od4pWo1T3%yU4S%fan#~9{tRs+lWR-u2LXsNq+BskrBn-2#mH9Q|t%mVM5xb zhvkAB;9%b^Xp`|gx`kjTrb`q#Y=dr1Op|s&b9w-DLPrUmq<^l%kM~X*p(RiR(b%+F zJ6)WLpPzOI`$WIps)ErMb|enpvq8}xepD0G(tL#|JD@o6V8}H!p{WO*etQ1_PWxBp zXg00KkblD1ib2_HJ45(7?oUnles+1O>zG!>M-m0co<3-zzx1hR2lYy!KYf5u=q9$h z72TzVn4D+rlz-Tl#zSc4a-OF-|DI{IX@7>;|6ADz?E+&hv=qIy{069a1{!TP2o3-z zmsY~U1=ryaU*TTtjjyc!0Iz&o*1Y6E&C)5%3h@GC>CkI79>B@8JB5S(@N=E`U}I{f*US7`_6Xg=^4NN8{R_AL*aaK|f1Qv| zOT$1A#qawm_RvEMIasI&Mk%!#^dcVg7ATX=B;7XIU1lfRAbxi@see+G3hrgunfH4; z^DgFY?S#ltRX`}mo=GcSaqG}uPA9Q2P@{LCP_Ay9I%~=+yHjU5=CkQ(4kxqp&J?Iv zTazxbK!f5(^qf%OUMy{6A+%wnf1{1!;n=N$uB|et~CwbLttr5q00y0btLCU6bBBQC!;yh74EsuvLm|* z>-SP1f>w^aZAf9LV7Hh?AIZ$xDm1p*E$uTBlsJ*+GW}no>2E2<$I>g2e?MgRff{#z z@8|!E`i}Mo_$J-~O^&e&!Y~v?_xBYU9CWi#ai}5+iq1L~N}9aZV4H-O7uq8JyRnmZ zzW3a-JNTyu(5N~|D3*cAD6V+&81~t!04sY8UMdvTHTHFEPi|COjXKXZTCVf*W*by& zoGp)aT1&+b41A%q8yvj~e*j|{sre!9lVv%ci5wk=^apPcDL&SnQKE@<1_=}XinEe! z#ll7Qk(1H~zBP`q3c@fHMfdj=8650pp(0pC>L5C}=~gId@)Cn>5|S5c5&zv<@Xq&~ zdv^!_@Bk7;#{;ruq+kR!GQOhZ(vh=YC9vCN_G}8jr4D#oG)3; z7A}!bl(8*So#Rx(2fi)LxeCHS6oujbKE;$tXFw5*A}WX$R*F?1Ozzy6A(@3)ToB*g ziFoSs{mZrOEPx;!f4C!-`QRjmI=n3TRgssVxgu{l5~~kUHSxAJPn-)9(_$w0WLh0{ zOBkfl)uu_BW4MqHdzak9xV{9CI*@C}#I7Uk{Yh%6qB=)wjSD2MqibbWZrq+c_-KNs;CIbkV$F~hSnLuTQfo9p$;L;pmG?L=n9=pJGJ?t$c4mL>WY&xmzp{l;0~D&=%py} zOXAm3FyLOrX(3ISRyEBtH|#o&zPpV2$w?$P(}y!~g|KHg4F+c22ra<@8zkKzEm6lQ zD0@Qf+tIA6x7kX_wFz5(i8CBCy5myVygZew-W>KK9YQZ{$eGr`e1 z$AfJ&iPrr#ot6E8Tzsu6Lg)XWc6a+D_o2Pm1|EO=S9b4j?8zr}%|QynFc5{|{hT68 z-C3x(s3HoA-D_8cGEJr$Ow*7_G$P*JcmUV$|9I=IyEy=}wjWV2x!_jB=ocz54h)m*QDY@K{ zYS2VFBuVavDj2jyBl117sO zAW^9Zsi7bcAUJU0?^G#r?QLq2Y%F^XMX2wNe-jF7s)pdJXXcyP({sDDLTFTlbO=Mw z&M40K!=j&#l2ni^(OanyvfEJ3Lw;GU)QLtt9vy3WG@jkj0u`HzW*775mWrRy^NowX z_sYGdLIjWS5Qt5Q*DHm#7N=riNEQ&W-orEbU~T0Xb<6yM&POreijlO3*=~&Z6cC?v zf96dxLfxKn7-;0!3H8RG?iH1WOc~0@A97n9=7mwP2-IwYEK?OlXHY!spd9oiCr$Eq z8OZ)Ps9&CD>CqbR{5PaIh(XhKVa?y6C5F$EPm0|NP^=c~*YH+mt? zbIhBKvm8#FXuqO(Ds~SJNvHcJNp2){NV)|1Ao0# zU2EJh5PbKq*g}YHxGN2$6yjb(5^^L^%0c=TheMXvXHi*lB{|7a?!Q;^SA0&KhEl30 zTiTtSogL}(X_=Rvmm=jvAq3heM$Ou6OVo>_F!BT`P?v-vtgosfsW#{Gk$y@sJwE!F zk`Kr6waAbfCPn-mwOJ|~{~*~(=^gTd`o_T6mED(b;@{nuVMR-_g?W89z$_D%=+t`VPd=EGuP zbGoU+;o%t29^c-%{g~-B_J8E2d#+=3j-1!wwoEf}nBRki_Ct8LXlD68)S*v)+ZU*T zZ-;3e>Z}%ov#~q=s{Vc>-6%#>+W6g``+G0&VS$-pCyMJfeSpC4cJ$mWH zUV=rh;PW1zu8?cew{dB*@n33li099LD&@b*YihOs_%x+TKAro#N^J0 ziIjX~!_MitN^Epcht6Pr95yn%Pl)lmdOPnoy;^%u<46+!KcAupg|)L6U`N{3O6H|Z zChT&{5X58WBpg}B?tc(3erQ}Ee2gm6m?e%=@ zg)YI!q>Ka}bJ%l=>EXx0elK<-OjFmx$oV~s?y~z&$&>f1kNuxN{^Gko{cNAcbL_Do ziS27l*$Dyq$AmoC;{=4_lt0<;^)ialJc|V(atU#tod^8v;D4upGP>V*OerQTzqxkN z(H*GldaSwlH%#1nEOa_cJU3V44HCcLC?U@`6oif*!BlS&rhFUuZptv(P~a6K*p0pt zH%&2t`(Bv&_%sFq+}O#cVmf_Qo9^E?aUk>_yA)p~q|)&;{^o{(KO*;8gkv^&s@$x& zF`y1dQ+%J_zkgV`1^*?Uhq)T#5PaQWyK?8)o(Caz(u_G?0$Ynqh;(f0>N%Px@iV9% zrAZ9r_6hLQXUcFSUA|Jr1xY+iY5BR|n+LHQB9H5gB#RaPLqU{=m>Yy5`<*~G{BB7) zg!Nu}2!7J+E(|;bmZc1hr+-c^N54&+&!?B@5E)**uYVn{K*G*b6dL<&-t*CyNrR^( zBf&S9;ezh-)Z`O_(Pd7 zQ-$SVLVYH0ZSsV@jJbCqR*Bc!ZB+zBksJGGL5x3TLFj{T`(Eqb`>ppUCKNs|TtfL$ z-{i0FxqqwfxJLcIbiuyK(i_Ge>d&P()VWn?z!@%Fw&?JDlzt9~{#i9)!aN@PCFHunji=*suYrfj~;0jQLNWEdsi8 z)b{iYLh<^TDop-q0Hkbl3*$M=|(EhF|dex8Sk%hozN7h%C|+y9q& zY}xiMzZwj{20woJBpCrN1k);4nPSmFL3#Uert?}syYq3)?#>}~i9pErrVj;*!?|Vg zZgh>bQwXlW4S7bn%wnlxR;I&G&`VE6O`=uWh6#DX@58_YH+k$pI6nkwS+ux*f`7D` z*WF@5qNCU^go-3sD4#@+!Cx*9l9aqBZ!92jkvVUmt<@pmh7`w6gL3Q$Al}kXk~v^`&aY6gP4{H4m%XB5OMh8JP#@Mv zEtDcpBH5Lu>)ma-3&FSfTDJZ$#nkCg3H1mDaEvp`k_cjf@#BRwuT2$`xdIbSbOFHa zv+4K`XYwD}43I+p&IB+^LXHNTpQ6ByO=H+dA!;8eqU%P85I4kXyjsBK6wnXa`BTkz z5?=B=cTbXx+t>)o6p|lI+<%p};EHJt*p=Jzt2(Rcl9_05j7mne80Xh4Rtwt_`cj^Q z3Uw`X`=T@Na<(;Fmr05due;{*_MrrdG6jD)%;(^awm`?D?dO#6EC?Gz%{#<7cXTo1 z7&94`X@1(rhkE?@iXpRcT4=7>hi1v0qbL)Ni77o~ITn`4VU zE_($3odpCtN$g={yfnSGG>VsBFHLopb%)w`siS?X(`(6DVZ9Xjp%FgUpHT8mHZIP5mY;DZFuJ*(o=r!edk6Wu<88`+d*$tRyH%!wrnsTrB}09f$|ZDV$8h!am^hK`R>alM%UdFQXF*{!q)XmB8uEds7&Q%ac$9-|rWOZbJ&`17y`-GU3X;6dElqV?f4QwF zW?<`5XEy~{K~pZZ?-kDcfYfg3usS@8Oil@LvVRBt=PrEwD2_oSs|_1(Tr@-f|Hyl) z;VQ5$d;bNsR84E!KoGs_S8TzD6*!PUN}-Bf8n>n`p%j{)q9Derk-gMjsr!+}6#w_` zhh%TJCdnb$lh}Fl=FQs~UA*g7U6$3z)*z8kr6p&&(%TNz=hEVTxAJE>Yb_~uJ~C_XP{I<6EHes8V}#Ej zASG<84Rl3vuM|q1Tyjx)e7Js8&HIJz1(;4%1tnhWRm;F((?Y6pHi%_%Z&d3ukow1minH^NLvz>lefVW zPZ5aR85y5Ch<61Qnb@QiS0~dDyxjUuEidiKihX|RrPE_HW1_S*AyP`q=k%70U`(Ew zap8R8LPrj{BT*aa3Z6`@+aK?d8Hc~-8>Bh8m`rWvvCzS%UG&|vmHQc`FKra-uYa$& zzz?9obr}XRX>`=sSN;ZiC%dsvQ19 z2j|9#PCM{g8qCvbspy;Ap=@yk7k@Jbm@cZAd;q9Vg!{h9-zm-wJN&_(vz2_@( zs3Z$LSf~hHrL=KwM@R$8 z$^evO3`WH&t~$WmQBe{nTfj~#pw&Za>$I5rZ*|>3Gag+v@^UO5ody++cYopqFy4pE z|MKBe-1#gD-KJ6!lJKO!E7Yz3ks*p1A{?M3+Bj)x9t@E_=egX%Xaj-#5}Kn6W+@|3 zo!r)*R+aKD&!1G}#g@_&*F8Pe)+mZm#terh-0807-dm84*BR+xDQ$v+PImQwYMTfU zQ*b*Lol=%ffn_$+(ju_(41eEQ2y(^c=B0xzJn4Q}Jn1jayX0gdt?f1Wu|;{jl)!vg z7d2;Z7x>PGRG7B2`7b#e=Ipq?*zdX~f2~zrYuhjsefO`>L!b`iVTF!?vr^J5VH;a1 zWE%_&L6NT$wbloc+$N0v_exIe*h%a>6-tt%TaN#I23gzCVG&O9;RJ<}~9SV+}K* z3a8_gXCP>XV+doKz<+!RW=;e*z>RM7V76hg;2X=rq~O*(oZ9_*qYbdq>zNpTF-yY9 zIuGFF6JRcK6n0-v@1KY4CDTPh3DO1|`zR_v z6kr3H=J^u!Oc`gg29g@QNML{p117&vRa%!fj0KPB@*bPj0Ds*ySX2-moJw5bw)^tW zQi%r}a%PH^!W-1nB2@(J7jS`5&;zs(BC$UnsmxW^M?t4q%#ycFp}Q2ARB^=Nxdls8 zj~t4@uh0Ga$r!^t`awC|rZkBxS^xd0e?V#b%vz-rz^1wJ7JkdA;9w2~S4g@dISol1 z1kwfPTG_7?x_<*a(xp8!oK{|%8qW^AUFGjAsPAOEmHuhLbt|?YxEuYPwDWSW#8!@8 zkR97a1zyo7J7@q z@kfsA{L^8lt`q+3z)LQ@Ac759A^%LCx)Tlc?3}E|Xn$5pbT-rSyp}nGAXb98T-TIf z;Jhlue5kB9s*ua=#d`&1kWXvFFbu`-{uH9LG=UCQ=oqZ~11lZdVbH@a14D6bISET_ zV<|La^t;c=M(CI>#?s^co^<;V${>V6U8{(Y5ywjNo<9T9-7;Sbry8W7G{XM5Z4Pbm z=sSIF(0{C!S4Lf~d)w0y(zCmw;5EJ=B#3V#VpPts7#1jlS6_E{9!Q0aN|!%H`tB1g1V# zMW17A z#K;n|v_olZx6NL_OZa!EtrjJ5o@VEA=A4;5?`6x3u>k#8Cfm=ELveG{dUKcO}^it5*?dga$Cfnt_tI*eJ3 zFpw(|N5Q2EZGzJD->NhX*BZvCG(8`M(x})c1F}p-D`61)RB8j`{%|ySxStLCxBX|h zfcl}+J71M;-HF#cn>ILaRZg$)_FXE<6n`p=QE2Qo^QdTkTsB`?(}vrl?A%6i(B-_b zlRB(-N)~n=M?Ng9ER;f)Q!I8RL#PoqLwa0jLm4W1O8&Xk5@Gx$Y9c(Dc6P%7g*nj+ zXT{sm7%$rGKS~d(83z@Z3tjNGV9^4cy&pvP*YMoTQl)Euow`Fr8H*J3yEM|9 z(&MS3pM;8daHB*T^J(Y=fPv&3QfxqHaX@BL1;(f1_2RIp?F4E6X@FPE=-d$mQGa8a zz@63W+N19Mp!aRmg*LQWEq(A~pldCanOS0P=4B}{4`g8d{9J=`7`;%Qk%NmV2?;|K z9!wTMa|3mf8@Qyo1=OuqsQsR+7Q6AADD>$x_b-_Q)Xm)M{xjeQEw!bFY&6S;3x6dCZ_ z$UO44DM*kYz;(6Y%`PAGKnM~+#T*@^RYDC_)aDOZ>WFOC6 zDstIDVyy?mY!DV zTj~|Xd#5ClgXQD}j4GC&1lLqVY*8Rl&wG*U1gn?X(<~11AUParar$>X$}%7FcS>!9 z{RUM&wA-K;&RrG(($@{h3oE&xVM3}wT2|AkFma=LN*gNMA{Wdt%zww#p8C_HuG)|O z1lQLPCPC2LguZSSVN1zvDEILHSi#cAK5Ljy2vL7l2%csCl=;kK;!>Yt{$gHZwmcIF z`>MeF46kINH~$|&`%-BaK*^U9wsD4e(Pib?me%D|9-v?ma`OUoF9BXB}}@4BxDr~u0XHv996Dx zw$k^T!=JW_Vfl;?;zv=OaEMv*Bdxu0BINv|wlj9Q zcCi=bmP%Ij8Yg7wi5iuUr#U+$`wZ@V_LsncoI^ChI7 zobdwg3gbm)-`rKmHptu>-V;)3r8|@&+}O$Fz6P9Ar^*@1^C&zGi&r^P6ZvKhLw?1tU8nRXFk`0ti( zWYI*uXiwA007Bj}mU3ZZyVGcfz4m}fDA8yT$m7SVTvn@lwG~$h zCjH)J0^NQzl_?6FD;bTq7Nv33R2mCKfiz$&%_S7vsec>8A5bEJ#pF0?MoOmnioG%J zj;@wPF1T=g%f~N^@oYYQn$7u;0}oySKGf%sfVM~hAKo;BeuG$p&3r!y zGgV?(!rBm|P^?u5TAQ#@+@MSpg+C+Ccz|0=aLV#;t0CW5bmCF8Kw~H5Onp_fj-pWm z`E?j>YdDTpT=b zA@$**eB-jk(@J`I9>+dNR0-Q^`;j_jd$woqxBTG+83TX4RMBeNFcf|FSKL9VZAiun z8G~e5X-h*3V+69dIs{q1j>TljljJsGTMhKc37 z$tyHWL6n?NYH%5IMjs1!R%gh01-EVL zD~EsKBUoxbgb&mDF8_x+^d)b{2G#WY%d`n~Q47LBHywY~|9Ft*Dmqg3_}x+Z+eEjD z-cRD`OX=~q9u28AArSZk(Z6`!K^WHl1yM@4#seE#oo!#2wHnot=9bBn>=*UUPb{j{ z+-@iq4mBPZhgyF~Gn1ti*^#$9G02)|{ds?AG%rubd3h~v9^V3!cb6Tr4H;B(4dyE@O)hD(C=)qp-H&V@!;n64J~$XJ*dq$4@eqo);s{h(hRUqZlPl4HG>2f!cggF8)!dhv+ty_Y!F|6g**z(DST*HpcEbh>0|) z!c$Q9>pT&B?Pzl;IC2yHB6(KcLNAw9s|6YXizsGy9C2It? zmECKk;xfw<$+k$EafIsYu-y#pt=jSTHP%;`?`rn;s{AG!PlVhvtdwy?0c)px?UM`iYT6g1X@g=U7Z_RM3zu;~RqX;l?h(g6o<(}_D` zSLcXqL_F#Ev#_0@H#aj6D4qd%9CrfwpxEqx5c*BCnM7M0CzEFI;W&V}<0(|oTGhB# zf6%ZNKkqC`a_>`r`26zSt%Sn)ys~IK>lEcmd+mo?BjWWo12WddL5BU$kD4HS^H?UBD z+P6q?L2rEg0k3T)T1iX@wcS?@tmo#3v-QnZa!CFIrBqvs+CUV3&#yRzfRS#Y3tI|i z-Lkb^T4>9{_N5q+adMIjO=gC<*p=dc?@Wv_QR6;T(1-Dy?>1j@`#}~m2vVdaQ3#PX ziczyP8;N>)J&prTD%6rtgyk1ot!(~(Q9RT4DW*5q?^5#iCi%)Uq=pHe{6uXYl$-w} z)bHf6kWUh6G7~&wc^m{*4`MuRs!Z^Wo2{ha$W8K#RAv1W2N~m}1gB4H_-+mHT>hUO zuvPT|;Il!VYDoS|W^%uB2@q;d2!g)>xQ|q9O$>t1iRTbftBt7ctr4Xl=>sc&@sXG! z-p$%o$tYx&*Tk?~Qo-G#r6$_%n@WCS>I#TbWCNijN@MEDuU?=S*AzQZHJQ6UZYGm1 zNsHdW9mnlTXbPs^+?~gV>1A`gZ4{$_CO54Fy*!Fj#7P5M5(+rKwav;_m*S0{7El}?ofPEoIJ@H| zP{Rbz9zmNM<>Ft3dd}|G@<9U4t^_Yxm0em^7obvvtp2Ok9cPA-`iV4ke`6K#S?MnA zhqfsNZ=FUX1qW_2pWi)FLn4?2c6Ig&4q|53lfl%s?ZrnR0H0YSUnd zP^@BnZ1bL&^)z-RM2%3|5 z`u_ZxnKje<=M!DL4E8z-57+Z~y8w&?#+H2APZ}RVCM!RnFB&dhyW1Eq1`^+!lY^_i zXqW8mMDfT_`+cK-Tmpwzoc+(fMj_(K)@nO8c(IT~X}DoEL_6maCn4-323hGea%qj< zIOB@ws6&?o=l1HHo{oWl~ zDNcxBI3#xPB}SlEUGSak0`eRQDTev-FH?<|P$&*%Gv$Q-ARKQ< zUdba3vD*8>h)sl1 z{?y;4+(zQDFplknU<{H>8k@dFa;upG>ZHIs(%@$9NRbc1tF$FwynqfIN6Vzy zLggC2eZ39_kF&{m@i3bXyIczLj7FpJpNrY!Z2Z|86>ly*p*~ji_(TXtLu*CzjEH#} z16p+o`$?fa)NbE1$)lx+Njq~>A@W8d)Y(x@AA*fi^15^_$%xBv=t77Az+!*_e);4WqqN&$9Pq#>pysOtsP>Mdv3RxeHF)C0H+&?^j-UWeYgM=_2 zIIevSPVugd=1IUBINw)~27`R4;6HTH6BnMXzTF`Js!|1 zLKDb`_eA2lu%^FcVD7jk3NMepQs$hjqvwW`YS2%c+t8`(!C@w|>Edp>u=dSP4_4bO zTcm+i7C&zG?Q#ya54Mbd(D*~cGTGxX8PaUJV*j8(+_xlgP*|BlkrXfCl?hhMR$n3B z69hYT$0{Zi>+k`AO~+sFp6268p|T?=iv65!?aGJWGK5RyM2xwh5SRKJo# zBR-J+K$hoJ>bD_%>9=)!k7)Efkn{CSsmusZJA<(;o+;<4YM`uThDDeMi}Ub}sjBf* z1h^9<%b-sw^{b$NM9izk8(^uVJT6m504{~i8AYduYPfL6%n)vYv2op)!>~3IN=^iX z+wOOuIhICogZ?6bDRAXF&=m~@iraM-rAS8$E+n|*aXFt})*;Jz%Lq~?YB^43foGr~ zP)u>T8TUv35J%9{)EgG_Te7{{t3S0>+e!m55PjdTm~5`HX=SlBZ%Jm(oS8Y39QMrEL{WxZGD3*0Bf;IHn;5i5J6qjI zu>!4O9O3cY7pc#W^&8*MFx%bP%h>jAa-l}ZozN<|L+b_<>|ZrKC&RJ1HORYBPy5$6m;+ zHT7j7)JWvX6e^etCzz~H{{jEXJ62l%2rv?gNeF7O7N(xfGJ+_K#43MC*59S*J%X@| zPo>~sOO6~yUR7|w37Nx6#VUslH;;4nhCJkyO68B-`BAr{S;EJOc@cIz=qYHIEE7}6BB4VkZLW%#j`Lc`UQ#QxCIAmtzuQY zx`gE-be!|$15TCjA|2qCDw+H{>QI$`wX(Z`4OSlxmSdulgVIjbptJEOHuqOTPJ4DzdTWe(T zC!igl_O(@D67>PF@6^5`RWMPGjIFjZ9%eAU;W4tju%>Vil3AX5)LQ=4U%Q$XiTt(@JJ4ELTM}?8LPK??23`#uu+G)%) z=xA5<+Rq&;F~-C+)-kq@$obgw;ya78_y?s@VQU*P4E=t;LX?Fj5XuT2gQa7zE}{D} zj(|1O_J*&R@1~uE@t7{})CHcP&>1S28@hYNT z6h$V4@7c5MaJkVK`_GFZ+GIbZ!j)>UqL{4bW>GZOD+j`e2v*h`Ok*D4hS3{;g6e6- z;&%aZVy>OlK&)7vv4IX<420=h;8n=pOlR-`2wgKI-KX{^A?M`5<9a}+$3MKP9Rde% zK`Ta3aPd$}xS-BF;L@VU9nh8-yAxP?%3>(DivJ~80_%mEb7(+$xxbWkeSwo>@wz8) z_mT>k)pG3l|5CU`C@;$=I{N5;V=bjaCDTe6Lt?>u8AKW9g9huh%Lc(9ix>h`hs>}I zIZ0p6@i1w;yF8<`ejWWSym^eud!XiOcd_;kb3zA?aY8Q+aK4A;zS!(gJ1#PD=t{-y zmw+UmEH{?;c~9o>7t&+q>wLPF6}YbfQHu12iTJgmexe}H(S(km&JW9f&{(m~SOY$= zxG5x`bz_IwXv1Cc2X&HdPr@(|$KUr;oQVmW$Wx**GKFY@${QtMjFFP1bO$VMUDF5f zA$)hcO^1?ruddhL-S2xm{jo zZ~QF6=%jNRvGxfaiUo3i6K8@xqBb|mz29W&m5x?&B9RA#SdB0gYnH^(m0H>qg&DkY zlzCD>Tw|@_36*xo5mOo!`6S>>s(8%|0?&jt@H7}th7b4QcyK#-hD)fmy#B?yOzTbC zjq_QZ(q`rK3-8ExkEB9{2{MhnMjmC2kE_N@b5{5J?sjhDB3>V4_zojMNY||+hNKKU!iuu(^;?|j$D{Jyk%INJ&nnt+x?^T zxax6S74xA7?Om~W0p7t+MgLdx+{{X48xXhw`ri(`nj5=Yn?VIp=2%5$@}V0R3t&(r z!30ycBlkh<+%J`XHf#QlVOx0$ja8yzowmPaZ^@Q?0WFQeY63wJMDP6-ebk$R5^xPd zK#3=Vddmjs%=GGzwRh<0L6_jayRO#pQLk#gh^GkP+0~?sgJc?<9juL<-p9iNgwC8I zImW|hKL6(9M{{*=p8aGz^)#B4YpK{-Xr$b8vXyrIOQU~(<<}|hBD(^h3PLq@2Pxr; zF0ZDvi4QHoKVX-rjderpvC7g9;*o7F!2;FWEE}oYmoXUP3`v#R-hBFxC|g#+@1LSa zH@Lway;%Qm;x-ijoxj4<=p|^N_N1F8mC;kLN3T6~1JT=Q(xpNsc>#;Wv23RWP5s|z z2Lnz>2s^lcMXFlN`~E)f^PK+vp3PXJ5r7|I4#*Xf6JL(yl7Z;GZFL(I#~>K?0gdm{ zc#=*(Bn$ty0D^aKe+}@(JMW%`;7gKF?+XZd%a!~~!sp&_#vU2?-9{r72Pj`plxytE zypfya891IoX8R%Wv6k%~V=?#XI>1ZTN$)g%&ecL zoDtEvs=$%L<9?E~Oq78_>sM2YrCi!wt-XgBEcNOxX&ZG6YZ=P*LhF{$g(bdQU#(Mr zHT$onV?D#-^Ixh)BVY-aZVO$aNs>f`K5>vKr^pL&Bw(L8-7YayTYke4Nh(8S928$6*QjB!GSIRt>W75L^%#fgIL6YSxy~6) zBueJU^MYSc2c4;9Z4|H21$y%a<)wdrMqdUW2bNT?*FzUYFBNrJKd+75zcvX7h{DUu z{H;P~qoU|9SY19wY+E9o#tFh(iz|}f+vF+8Kh;ELU|F@f94?L_2dBoEp?OU#qm)`q zvH=k+)UD49Pa9#*@e(!F?X9oR6@jWljV{y_bHdi|6gs?2v^+X9M9RPI(VR|y^yK8$ z&n<~m#_eJ(xhPsSiR$G-bM8zk>kFtZfik*IJEI>6wCf?3v%(k3=p7a%rvpx=`o6uZ zXUBeYdGf0=t4}eJ-3$t$SH`?s>2FVUmS*YiFp=~RX+i;yLrhmIztE#JmjN{yvW%w2Ong|suR=uw(@DzJ#`F2t|r^yR- z%9~gMknJw+Rt!oBI1V8^af?Yb0u2bDK{g88-D$z3j%z)k?)FrMu5&Yg1AmU>3=m`; zg8&&jNG6B`s!SwYW&*0rs-5vAIum-?+3s=~n74*a3RUb_6XTw%S^@s{Fdq;~2@@G& zmAiyW<*|HvV4kIy$8Dk(L)sx7OptraQlRZEpmZqJJE3&9RxOHVxcQfhlG=`R^@Vqn zyd6h=DOHZwcQa<;o{*0QdQ-*M#=o~n5^33Kdi&)B6m?|IaNZ9N{pxM9NDdB$ zza5a@$ju_;WEMu0!2gMtW`xbi8Cxcd({unUa8cLqkxya7$ta-d(u-sAD)!{ZclyI1 zf1q!0Ek6HbX%Lb>*nA#(F(a@3J(#M`?>LQu!Bi~8)gM?&vIQlxJc@|Vl1&=U7a8&5 zfJC8BV-9r1GX@)EA&dJYiKqwfRv}#rxQp|%@u%xCq7qDG3oj#UkCPzeSsG6Bj0R*K zW()WR800KZeF_@|6nPsS9K_y|^2CFef12sLQJ%4gdBG{lNKkned7NJ`h?|z$l;KrbPj9* zw7^ceMne-XxWfh&ytC=V!@D{$YX z^8o=1A(!LP6}<8vygB8)#x9&@UpPINpqBvI&C;9}Tb{?#Lg=H13ht9|Mm8)bS-L?w zaxgkiDK(4*6%DZ>n$nzrB6y45e-whL0P#_f(wKA`VDKsC446bF!kA}X?9*N!u~h{J z+6E_?g(=U#u-JnDz$KEbJjONRZ;g70NP;k>e#X*GUs!0ENj$JHCNnRJrXVt8QMjR2 z=CA}qNyJQWH)F5~nNrx8l6km7h2)7gZxKqAh|u)GuA>c^g1-hJ3R7m}e@h&$Xv)3F zuy&2+9dNt=&OUh45JzvOZdy-aJ^m+ zARr#i!uf!u^I^hM{C9Lb+-LR4P{b3-zQNVOe-02lNu?_su4o*v^nI8@bWvt5qDOUA zlG0iDctPWNw&0gMJ%M=Pf2FCn5kAsf3HY`z(~7n&H0e0DVW$XkyesbG2JT{IUU5KJ z2cVqR&Bv)svtu8;MWji{H$AQ9pgTvx}E@$rXivf#-5`$f95jNQgF$4`!;i$ zT`DDY>sY~YyD#W6$u?cJfvL}4&sd62O0ztTi4W?WfTq$3ZZeTvcEo>^B~9lP5`p|{ z)3F5pp|%B2Ky zF;!qToqtn6hgd;zB9}|9QpPfqwHo-8v8a@*;)DFPpvWsSqhBFYO*Bp`>KMdvo7A~1 zX~&(n>Zr|}cG;r>v|}v%A)5GZGg_pBRjX237J@BK5)u zK{|JLoxMW!iRi3;UZ^gxWs8)pIk`KJq23FFQ994@fB0kk=+gwlcUx!|Wze&Rcj#5L zIW*Ld%!nLTSCxTx|I~2ub5p~~GpB}~$aR1|Pim+V?uzkxPj__RrfN?dp*i$?7>VW? z1OW~NpS1gJY6g?L>9Q@)GsG+&WA;E2#Un{{}@pI}%(olpYV>VUl@*_M;P~P3p8H9u= zrCzWhWlQbUVH=6hms%Ux_e!e3@F@Aa`P~lvKg!3gZIOlt`-nUrGn*H02*aH8oDI-^ z{ZHBcIC82zxrumIO>Fz5F?U(N-Su{<=Oe~I_`i>@c>`AOx~b5>Wa#ntmvMZmPJ zD*AEbIoaEI{+}j)R+@D9)D3i+oCqUu&a}`WbM1fyBQ*Sf7+6b%$?KqZh z9NX8xT*r)Oko~3J^9>nj0FA7WiA5gj^b-ZLRRHsb0Jfi_ zf9}Sn(&%hfQ>ij!9J&>AwtC=H9BEWye7*2i6en&VI|!*p*`Vgwdf>P8lC73uos+Z~ z$e9hOYscj<7uS5oj>IL^>jlfBpqQhxhdco>hLIXas#&C(#rk=gLR={Y^Y*DG5^}o) zb~|w2iL=q=S+0#kjh4~aJs$_K$kh<|e>;-=Df{Sax1o<2jkzRL4abA6$?_YHo6G@M zn*of9m0bhMq3Uu0_VEhKgg%1B@@@yeoy=(FFFHN)>#rEhz>p^^FYShLI00`IYX*vs zPOncsoL}6GuO?qd7w7LsH{;14pFdxWN1uA+t;qv<-sziIF+gmdA0=^Lx$V!#+*Cac_~XUQ6cI30mS2?wns3!%K9R3OZ`=o>435P@FzYv9QbIb{z&16iAu!Yc0%_cm4|fs0Bl3$N zC)-UV21F)ubYDil9TicRYE2KrVOhhds;8o($|0(*I&LMd=IN=uNYTrk^R8`W+_!I} zLPPa}O&cY~6`kh3b*DC}e~)_Csw}lEFuDzxfg}a;$s)`w?W}lh=~}hSa0}WVpCLce3{j(x6 zX?Y?k3Ob<3QclqA;Nr>G@zwSD=TDvH*mOU-7mJSlO3!|Z6ABaKe}1>RR48%mRpZz? zFIdv$R9uCGW-2Q$B?gSDLJ#Xx>(Q&-nn6r$LCi20TMd_q7SZTbqRM%2q$&+i0)2$P zryE=g6^74XHBXqFP|7rA_K?n66%yX*tHUk`%~@L7>D^tYPu`zjjn8gAU;S%xJ-!@Wjo@RC z48%^S6~|SV5(IGLPJ(4zRXIbF^X{f!@qDUJNd)3*3|TMG?UWS@mw`3eCF7EpG+~gT z6$;5uV~5%<@QI@c3ZUbDfwUI(B%};CuS*;Qu}^cULki^~f0#toltHl<=E<>W5G*=@ zeKqYhy_O6>Vg0*>34HJlGW2hxg*Yr)4})f5SZ5UdS2wOjYy>zo9L0u{PyM)4hxvTB ze$#wgePc~Ng`=3~OXVo1E~3U^u|qa3^04c&u0*S}_Drt&QnIZQGF&LBx{nbIZ1d#e zAXy(S;ftyde^*&KHoUB1spxHqGSmjU0~Md#cCJBz+=(M}wa*^$mk&o#_(1nzs2Vt3 zn-_7@q8&$ks9p$aXu$5bRUl!Q>hK1eY_w{dIUxndq8I>nOx^1#hRb71A`ta6#E6}I zqIu=I{`_4LtuGq2BZIdcATVXC zp%-|twF%ZA3#ks7ID6XBxgI1Cr=qe4Mj!*3p<@$#iyLIWM*ut9IUC~Q}Qt* ze@PgLG4@B`|H%259x`UQ(l@tMCMs1T1i7CU;cX3KuOPctY1>^viAcdb-D&PKlu#E< z-#GkwL49WsP{GL$nQ#p(gXpMP~%|6#3_kY1s3wj?8YRnjfhgK0;eug7Q`g;VTS~!C6ryoe`6MH zGVkh^2ojP4LCH0W1l1bdfm6FWr9;`!xxt$%+@#!RX#mHnO{7xjeM;5TT_;~EOfB@n z;$(nxhqqp8z5($^itY?1ktoZg7XVLaNcAn;F5N#Z4nP7QY@M}1~0XXATj za8E2{P<|xdDSG~C)^&$*oZLIjC~y6<{k{I>wT*ER1J7z|-(1(wZrrLkMO8AR>U{er zXjNw2rBe<50=L&S3#$Qt#hqDm+&Gr+-|JKOVIsOaV%*Gq>Ao}f+LGl`w`{8=yQ+FZ z5fvZ_rr2hZEH1L-iTUpL0Nl4s5a+PQ56(q-{^th}%K-=i|L6aPkKqqL7{)7>CV>|) z``0*OiEI5CzJK-q4&3JvOSt{Ye0g;d9K#^y(GNfP?8xJgS-kvz?%_>t{?{LVusjyW zSfC=7O)R)p9?ZulaUm&g>cA@Awb@{lhEx7pA7?TCXyUSO4a? z9*>&-ZM-;p>@Wnv4B%v76g_w%W~RTR!7|c=aFu`RdnS zFR$-@{q@zKU;V*<`17CtAYbE`qZ9ZqMi_W6pzghfr0!;h83ak3L@X3Z|HHpmj+Tp= zW%I?t*=%fk<*enJZAcRUW# z$l}#yi`%Z&a|a3`pKYw!*0N?ZYrmM8tCa}}oXz-lxJV|C+zM>)a%9${>vJP!4lfH0 zw+$9rZD%XEVDr5V*J^7nH8YjN{+Dw!1xB>}R_@hnmJ$bGBM-wyTx3*|FKona_8Y zzB|!cb}k-NvDK2V*UOE$SwdakG0WVnwop>$&YU^J4OhQA$V4L!x#cqNSBu5G<8SF~ zR=XX4q;Ip^I?K7WUO4;J-efzrw`aTUa-_eq^MSGg-}BDJ%vzgksN4(qu;NP_dIgj3^__`+ty2@$;A^>H+ZBT{ zGv~9_(pvNVdb!%I*>*qI_GW%}!$r3**qhsb{TjMw$KG0|xwqJ2xnDw6oHNTdH`?AT z=5gOwOnYH-NZ)n=1!QHfmL@cv%h_sdt5S0)LXW`wSLf=Py9E@;IdpHk z&3d)kTKnA&n(6t*T+N_1=sOIKom#h9E!lSN@VT{ItT)h@SUU&$g(Z}r9Rw@-zEU%P za_!E=+wu8wv);~UP~`V3Xvv_AuGcg8w_I3!I1D=PF6uO3vxQ?XHm1dPv*jE*g|!JD zA+h_dwPg0r)OKdW|A~9-)NyCEn{RE)gi5}#?8RbkLaxr8jbqyD?P@=^#jH7WJEd|B z($2!3&n&i?v+c|_q1&Eu=zn&6KU)lc_uuDyaW`oDg6MJOELY3L)?yGx&ezK|gkrNf zgk>gQSo%#RkD?$F-Fc@;aqOAN7WQ&G-l%$KYEc5QEA1Oss;#Lv4WG}0WxGmOiGcS=YmEe*2od$C~w;d>ts|}x-vT1RaYpCK3dZU$X z+WJk(;n+#sercLphi|qJ!`c>9ge43kcYL|pu3?;Nj*TyCzWg*iw7psL?c9X;)q>z_ zv)t|-7!|BGyXAfXgUbC{-`gXLA3NE|ObEB^m9^M$aI%=~9a9W+U~IpChOw%CjdM+i zEjz83Xzpiw2!bFq-$MDYHY;nkv-ePR=8&-nZ^uis6A?jZxma!N^=h`<%jg8g`?C#S z!A09ah1ZXWTo@`pb*|e2MgVKLL_2FXH+SphHrN??RHUyU7QHN16eH`FQ-A8#Q{*;{+z2HMCi^ayYrVf>@- ztfv#0S?jH+Z8HcY7Z6dJ(4Op8ODHb$HPmcGk@OD{k6*iP+atuRo5g-UGi?qL`pkhS z#au7ei!Fy%d28!;s;(a-uG1M8Z1x+It;7J?-or(6pdS~bSJPa7v)vp5L2ZBkio0_* zdys?y6|^Ti7&ThZ`Rur}SwNXwZg%t0gX7AXXZOr$z;J)Dbesj7@7LU%?YNlK+d#3g zx4V^%aORrN$4(%-*_kj(g~8R%6kQqwm(1MEp$&7O@L0Ry>7ldkzB`?y*&<$EndVG{ zBW&-im(FsrvmI-HCMF;Bi{+8IUdW0Ut{udG#e3=T#+b8OLR_$$&31bj zB+oXx&1So|V6?#4c7aHm@YZdE|J;k+yCg67L!5015wb%+%8tTC4^zl9ID3N zURy9k&>#AL`#kv;L|;2C3yk)6dmDmUD3V)|s=2e?E*2Z8crd)wPhnuWyUs9jvuB&l ze!tl;$jRBpgzC<1==|o3#dfjR4~v4(>YH-2p#zvhFzIkhOxTzfgKH-GBg=;L&Gci3 zAmn}=cj^N)SSFN>%?grfFBkS|zL?E-^VJ$UrVV$05dP9c-n0lhF6WE+!U8Xj=+U<; zh?8c!wYjji^Yv`a5#=RhaSR2fGai8<95*d?z_1Zf%*wL%%lTTrD+(9e zqYBM`+**Ge8QPs*cJ5d(wt~LS+Uz;oZ6RFWEgXw4XLA@REcHX9@X*sxL#COl#d-tR z2O{M;NFc?{w%aysGiwn4z>9^2PwxH=0Ih(KN&V0)^+xcR%;ZVG#XJhvmdc0>qB4WPH z90tbrezk{a1!}@_>+GD_+_q+Xt{*mk#DVpdckc~C%msbu96A9Ai1^0hi>ic(iWkEl(@t@5=1?*%bFqPIWik$#aR= z_;S78TJ!CmJLYb-1#A5}7l+*jYzg54hn!o_t=(#~pToe*X3%y)N4wtHh<1J(T~&-nLfEu@_=#1E!e7Hs_ssu!87kZ(6I>4tmx(o0)qD!q_cb zzAc2Crhc>#$B*4fH|R*`Gts53H}>3ILMuIkhRfV+&6&whtg|`mEP>vj?>-%j$Q_7> zX1lp%nhPi$=3d-8hM-}G7$j$ZL*!14gK$;co8E0Vdl&$%n7muP*zKI9xfNAW-`}?& z@H!nGjO<_}ve|BTFap{y7tr4=U{J>wFjR-$RzGx31KaG3vTP`n5TNfx7Ve-ESaJ@{ z=gxvIVJ7Z8A-sj(J8c&fcfOi!W)8&3+buNAGY0|&aoL=ixz*3fo;#j@+udRTo%d`B z)x#9iDUiTDL@W*rdzOspC+w+vTYR~Kf6#Z%Eql8VQ?sTBycl$KOKZK`>Q{hg+jTkt z^K!k1A^v8+fYI9q22^Xu+(4wqH_-bmAR^QE*6rQ4&?qkFOPlSX>s~Imv-KS69@KFd zUs;Q}ev1sgqV7T>8`1!OV>ioT`-Q#RFU|FC0gcLbxwQ9ecVcPaId?Ctn>J{Dp^t{~ zskyV((2H(3w-;L&5A4>CGeg|(e_@@HF9)SejEDEkT5e5iVRPGt#4%_)xvB5#yW3s% zC^8IE1@#$9#LAhm-A+vLK_q6*I3mLP?zv`nA=Y|7=PPJ?HxPh-K%BKQH&8MlI#}}A zYBxNQ9y9;QT*Cw9$cQ6rcqyCBXN+x}E$1_9$Jh1@hSv<$9=xx{vmmcZ{ujyx0v-;>An2i{(JVDAJe0m9^MAe))p@NYQDDF zZ1wQ)GdGXHcNQgo4-dC2dHj;N-ot~`TP^;5w8Wb@=HfLIm?;X}XDbVVAYa1>@5HLw zLT7{0*)9omKIC)Ph16bO>e^4>|BvOG&|GqjpvxrR=j&Pv!Ii$?g;;B>ooyGzieC7R zM^CQBwX;nw1oycQW$K^Md?Juao%_ax+#!^1qridzCq?3au3X8pv}%c0-T(5!}4-Bc}3HJx|Q3HQY{zV@MC_q?jjS1n^Tu{WY8g2uI#V(pw8S7ysc zb{>AQIsD*9=G#?z>h1EMYSGiZLV$7)abA&(j>^e@=;+dohC`##Vb4j**-)7Gtx2&fu^861=&rAU}s!y+tKAxFU09Ax3ZtW0YxRo{3`69lB>iclC!$&kYk z;zpr8609{8)I$p6$nb)L0b&Md=^(U6mHHr7p`;OxwT7sg7pOZUIToWe;??8u-LI}? zK!o*LE<=svBci4BSft*uv>sSs!LZ6rV+iGcrReLYTve9lmZy=NgM)TWR3UdXEcdmY z%V}KB`ZNHlNR{*GBLO;73VIa(O5?=!BdAR}x`3sLbSGNqHd*thq9d^wcze z5f+x^+OHE3cM5TuVxR?BHAJIbpPtat%PA|@G@hm8>&Hy<1YK?NOV8!trVBNP;@^Cn zK($FkOJ|{Z|F)a{fvG+DF#ZP?_D$+l*Q}_9cG(@Dy(S%#_O0IRT3iC{XZJYvZoi0O z3e(fV*T-X;Fw?_$C^hmi+ocLQizVI0!O~r2Q5ciRDmNn(jwIK6uiq# zL1+P*k}3?5r%NE(!iMjf)OpXB`L-dX>FbD^%M;9YE&LhHYwc%I-#7C({#Gz8E4zZScykODLnRS3jRE5ry5 zNd*S6{R%BYLs5Z1Y{^1P&`?x=BA~5`0INV$zYReJ|I|I?^|;>gT5jgzy2K1EQ56ok z#S1Y;Q}aB9m{TW;-5XNpJ>S^G<**^B;6L9JR+piFKBJ?m1oC{;9zgYHMN?9N;k!c% zP}4i_{X?;l4JkucRe>a5kVOm97FFPIW7?riLr}qg{2OhFYzV6OM*#HK%%-FQf5HoS z9=vD}(DqX;Nks;+lMg*cLsgmNAH?;dqk5j?W47}TDMwrLJjEx=-H{?R1Qq;eTLjS} zv@}&HLY@Scq>2+>g2saG!1KL`=}sRG<)> zJ<&2W6cq@H4WMW#I;sjJ*~U<`94$>13b9=jF+@XBg~6k}L)8#e@E;PFe}-^WIglGo z(E>Cj6&U31Q?v|CNfm}i+Pf1CK?VQf2q#^D{wa^9qzZyqz)PD6O-UsNv3nLZL_<@7 zLhh+W3(=H3&+tWTv_*>0R8%1dzY_!01Qq=2uPf?zKWcH&PsD57ej2sB?H93U7pecI zq5=VNkn+o@@Z=Y{vllf$e>7^jsd#>sl%OG~;-9wq)%DJM|1X!eN3QEBc!yyRt^2xQ z+yBtB1#c4QI?OZ~eVS}_wq~59W^9x~s-6d*YPfw2F9P3j59b%kcOPCbN^3kv{;;tY zMP`d;5CKlAhme_~2^t@@KpG0FJm()1x`3MTHU8lG?lC>yr(qaGe@Xeo#31OHCxncX zE(lW+JV9+f@a&Pen;<)Mm?#Okwo#X+L%;T)nCH^wdQ+2*^#eZ!(aV<@a^uZ677e#} zqiEZzbiDU3e!`yRI$=WIwkjQOmS2&1I9z4-JKD9bkS1%=tG zLdE~)BO z*cqi61_1(&pLk>jv74y0mePIQ2ID)sP*-9L?j+&See&Y*sz@spf5~%Bhmf(Fi*5Zu zlhqiIeJwBG-O8z zgL&>wcP|n4=61Phvx39yhZ;^UUB{7iA6_p4FNowB2WK2+Mn=O1={p;~iH%-AummEL zF$^7BB+Dr0THfCI2e@A6ykx)9l7Diez(30Ef7#!ru4juP!k^DZNHs&FZb!)=RtI@c z=ks`orLe~`T?DCTe+&ve-E2A`Lri#|L@!@?^d@xw&d+v#ClDJtSjL8!&ZX@Y(4l&g zJhgE}Hqj1merEBN>$~ye`Fp8S#W*8EPIsTMNa05BNw{1?pH048x^bAbp`9<(=vqeY zf6s(?_bnAgz7$Z6F#~|oDd+T8dVd9 z?e&>HWVhzTEECA(Yc*AY28?kuev%7~zGy?%I3DrE`)rZ1PTP7?f|zVnX*#8V=Msg~ z^$*(F)wQQ&(#oigxjxZ-YG%u4#91|ue=wG*zEB+QXK0m~(Jw=U=+>H^I3Mrb1cw8U zs-KM~R#Bx&K)ba22fAb^YZE2LDr~=xm8kjr+a0_I-pHf-c(RuoYS(uXA-cNe?>`s zk_6rHIQ2wr^*p&ylJ2q$EC0?3A-Xtc9ZZ=l>N+zZ`+FvV_OeV`XT*~lh`eu_(;(gQ z$PqWIe2c6xIxk6sjwhWQ?2aGY7-C(Gi`^%pgV%HV-uvQd?edTDnFpND9=c}?Y7#Nu zdg;Mcd1`D3FcZ+A5ff|o`6}k zUyz9VV{vB)Qx1AWi0~RuYUtwih#>Lg6Y%0ByqM@SeK|RL5^0t4g{24H6(DhtVVoO4v{#}M*b_35t~N7GP)LiQA<$kWtU$b#0-H5_KchWvS{?87;y*{_V61&v?Dp+(od z{)nQWXw2d$0yJz8zAwcpf5NO88sWWVh46pH?QA$P%74oW<9}?@X;NK^j4O5>I|Rdf zH~BF&--z8E%#qdS0(9fCnTr9T>=X{6!(15YB?$_^a2Qcq=Q zkee8l1-CyHoUMlCG%zwdONBhsrXb`e}X~Hn_@t70+FgXQw4+?pB)(d=(CRW;qACkw}w-gQln_+Pg4Mc zRjfR^cMm>G(um8W2*i3$ZvW)QuIYLTC!Z9E9W|pzj2bsJJ=Y>(Z7E?u-}5B9I2Rs^ zW0hku3a+jtk|TdVlA&gW@qc~rgJ|S5RNV&edt{%`FhY6HPJf&m>%L)y@qZHpp*Y*- z=SPKu(+c;($jEK*&aZ+#7M-zl2>tM|Ux+wLYR>uB(9&TM>=(i%zu&w;QC=6*Z?854g!wn zD&o71_!)0ywNBjeNO$Hm{c>L&%zdQMV_9l9L1<`C-%=i8@t7fDWrxYPG0p_GD1`><%Wk zS`uVvANjX&>qqNQr7;=K=SO!$lu(ffJ2D8lUVPL7{5ncyjR6w-M~T52vv~aIhN>XK z%zr4YPyjD}!k*tnk^1~^%>?85i~lWRVKp+zK98J>&Wwy+4GOsIRko}bkIX-at!PBs zKay`qh8!{Vzhcn9oEj>tilrCP0iO_WRXm64ny{y@}(%!cj?y z3DBSt;lMy(0<13#pJkcG6mVa$nI;s7!GF}wDj3GnKCs{4&Qy@7cB8H`6(F_+X$eh+iE2w4GQ^0=+YR=TVYV9_0Q$fXZ3!4t z&`a}e2jeR*z+f=OJjy5B0}g3p0is$ILUt;_~m#%U=H)PLK@FnioA zJ4i+Cd9~8WsBCb)Wg@vP9{f^wUNgdZ7Yd&vCI|7Vj|^5AebzXhFMbH`vLo)#_Xrh9 z(+%QLB7aa2vf`9*9kN~x3OH!48N@Fhru6q}kia3zK6#->M`hMqxm6h{%=1cw8U#2mgAx#sygRmd5IntyRZ42AoFAG5ekzFr9z ziNa#<5-_tfTIPgEH}28Z2Fi`;ao+h)ZWJhOadMKZrh|g~>>lC&`y>dzsq7w6G6_4Q zG$TL||Bo+45~E?NfpUNT*4n++Ei|y=?D%uU#N9yg7t2d+F6Wjk9`=tFGoNlD0`H{J zYqzqJL|rirKz|V`T}AB3zXj3PYO1pF^&6Xo3YVl|W1LbV;LL>Nd2OC2gT6~{x%Ozv zK^qAJB)^pD$2k&vw#~b3gB% z^Y3U<(5FnEjw8en_KoZFx2fy(S2cC?wir3>6OY&dx__0weSz_+_^Eg-S3F*g1kZGh z9$DffWShH-`)wHDnhG)BPdpO)&=20qS0!xdP%xH7>rHe>MSK*$@$FC2aXegfPqf8K zlBDEVOhP8nu#~e#*+)$}VQTaV(P37%o3Na{N_3!&ud^?20!w94K`-sF-0y*0-YX?$ zFLfyrQGfIYZ&SzN5x4K<_(3dSQF}WfeHuSjXkxacC{bl-k-yyW5Mm3>rlB6H7+txkn9l}VBcbV|tW(rt zF5!)>UpjigOUWtO-#v3H6*gcT5GJ6jJ7p?F1AltS5{9gztu(Y%CrE*qn{&TIt3aKI zQ^FIZgPi|&<`%0Gi~i%(AbWfQdX*%A@OKnB(0CSHLC8${URk}bFiH;5>B-HKa7a0?2(p3VKSXo@2EtDdi*B^hFGhr;D@FidM z1)qyQ;>Jg%urZ+fJEcPHp{UV`pqp6jO@lnCu=pDRd_!*{>W_hFzO#|d`DJ-$p__6O zG2cFhA~LF7Sc)oJCE|?!M5(H#&BXAMEPpZmvJ<7D>~RTNpqkc1w7=Z41k=QxlfXiT|dB9NW||L zUl*y-3r>~N^83W50|_BmNjH#^=|a=uVIdF~O4kpYKbEy9h$a zsH;tY{7Wn39kFB5N%j-Eze6gDj$Lbt@=Quv+61Y|l;XVAxJ&&{zV|X5dw-omKP81H z6^Dsme)=FM632nnE%6+UkM;OcXLaZqF=E=!FX7nPzOFr<>0I=D0!J%o{#zXQ=SPq6 z%h3t^7b6V37svIy*Py;#md_8yMx3N(Y&68i5Zqgj{K#apA?Ctd2soe@WihY57-aib z8YiwVeq#pTjDLaJ>sZRkEKjP`jheX8)JCJ`8#877@g%@~9tg0ff}H^I)cSZ5*3k>) z2ch5j>2a#OZEB-Y&&_#gF^(MY48zH%k*CVZwmKU3BmAC6Q{lGN(YV>6wU^563LQfp zZh|1@)FCDnv=>#B&_)xtNhl#DWfT(3U<4^KHcQ0kk};lbpGwPr^K1b*q!p*1lR( zLql2<#6gj^0ChzjtUMBbp@!h!;9-Y*W;tr7Kem_yZI(NPy*!N!hrD5kDc%`XI@yWL% z_5r#N_mU^v%Fb~s-w%=n!t7{R?rS^$X}0pbw8Z(Zy5S3VJcChx8KW`6@F)JFlMzN? zibnVri*@{Rm7NYo%^ZvJmL1I?(16Gc(eB;ElpBfMx*_+V;~b77PM~x|&{(N$4@Ur(>tM>%T^9;fe?Or_V_~?c@0J$k1!H4cQ4boT$>2TESu`riW z;OkrsX@_E}d-AsY4sFgMK9qX0v!`@eDjtE-g@xg{3hGiS$({?jnd z5fr9qgor)4I$4kzV%`7Dqk&B~&-u?SF#zxUzH{SGItCMz$7*u)!u=Q|*nl6(e7UMz<97^ygP2D@EpEN^;GW1F3mDuq zHo{Ee^;52qJ=WILHQKV;d{@l#O!%_+hKR2%tIc=na0DH&(Z?lph=_A)bPiPqOrCol z+;_jamUss7b(ozd>A7a@Y{`)i)^r`8TVJW>f8>J7F2;}C3n3Gc7`ci*#zS^+*RM#9 z>=3VCF&vkF-169&XVev8YEl@YtJIg#){XmhIBHZxs%ud&p)Xh|grO-1N@$!)3B!}^ zVTfhPR4^Q3Pt`c2$d^h9!y^u9JYrF#2#O*Kps_j;bgP2oIv5rRqTS?6jIP&(4h4&R zIGLmY>?)%9&?Pxj!Eiu=&=f*LgF!rj-G8#3lK0$yT;DNtkHPRzK+U@W5?Tbl*eyMb z-aRodRa{hZmS|X$0P)1s^hhxEnd%zOyC~8pkjA=Be`LOWYSf|PJJ&!WR8Qdf2MQdc zl0%byevE=|R9uCa29=C?eC9#rb{*%P$F;lYLdhtE&@}pmsKKIDjw+Jd$n_JktnVZL zCeAH?mZJ=@gC81hP#MMhIrz%`>~KspVNFYesa!j&e<5oU8UQ!^S>LrZ)^!Ti{V29i zaG$h`iPSMl8GRCY5i=bzvG*oPBG*h4UVMcEY^WO@aWd?SfO$OT?|w^}*Z319{-6`G zWL$at*@Y?(aZvWO-W16gbV8R5f3j=Pk|slc{yTs97DVhYIXd+yu$520{s}wZdXFH-|+-C}!?!{eqQPog? z1f>WT;{5uiF*KvsJGHQWa$^_KPShlD02Gy^C4~bLch>?Rf+V`^wG{SuB6~@xSm)uV#;T@3HB$hk9Vz9(+ zuKK=<@ji~AP{DJ&kAie~jpryBDWy$+BxmupZxugaMxH41m;0lg}3BDC8G)R~#IV@Tny9Wv;sY3$u3D@Y< za6aj`IZYt>T*fyy=5KmWjn{-TDp6|APx$7lgZT;Fg0(4s!9@Z6n7<(U|2AiTHi?ZJ zmbEAgNkT^7VyH1vhfoNT@m;#Zi^Ipmff^av2iH%vS8VpMNj*9`{grQhY+5Ve2FTLk zr|>n%Qsu|*&ywAGq!(1k(Xj>JDA9s%WMub`u9Mtwhq4hVHEAjD+`}U|rW7UNyyFfP z97rLN-pVIOD59xCi3o@`nkrP6$n**q1wr6(<`b9X^a>~}x*0+?sYgclKH}`u9=YTB zaz$#wPZ4!SHigM}uWjxpu0@JkYLZdP$55F^mpJtbF9OFPmudA1G=Gn$w zK#`C>CTj}Q@rnm^Pj0xRfm&#yDdq4SS~Ci`LJJF(4RUFqN-ZSR1&axAgbD!&-HmCX zMss&M;}ZEzg(bB}s4j!lJh9{2IIK*JgzMTzE=Z}UgcJ!=wmCW#R<1@umOVK`MV70P zkbUuEPL^ev7?w*sxqm2^D-kX9X$hk70$=~J{W_JQb!T1@GfBRfu|{ykU-bI<)t=73tcFof#QVu77rW}rhiflixty!{Fx3C=ElXY zZWREBk^Rw93NPpwq3N07H;)spA2x?)bgM|4a5=3;{ zywak8qPbI9N+FScVv);8CU^@aB+x%y?%7vSK=346DMf)qP_Q!{Z5WE(lO+st>*S0k zyM^z#$orj@j5diJ=)8$=1*Qim%DX5bo`3i9kCb^LLvd?zgrL#XL&Dv0 z+!k^bR-vR11nCk@l{k4Ehf@>Mrn$xJB`q;-H8+yZ{NG#5W4KzJNgxRx9xgwE0kT2K zw2WK|jr7j9SQsNKQ_fUqkwInm;ovv8+v_d7N)-)yLw7-Mh%V>{c7QR0xQ#+VRjCnz zVULjL2Y=K*QDT_$(j~dJHAqk-B@{>Y5+e#pT1M;<6hokh6DfviZ`>0{zUhGqNm54K zu@wW9+NW3ybK;M+7+^)6axu({JGfwgRr?%+CMU%bmmChezU4kSB6}AQKzV<7cpGu{ z6`30#WMn!>m@swIfs4LfJo`+oGD3J;!EKm?p zz<+=W9)vTJ7^qOf0?~|rB@uqeE0NxNfr(vhDS>h!EKZP6G=owGiy}4>#V)YUXmTYa z(2vYZ#5u?=_R%{DRaZlTk#rXLj^f()T%Z5=`NItXO{s;3!k%+lheDimT8Fw}CdVy9 zkvvici9$6oBzP$1f-jVQX;TnLGi zt%Ujsd(Tk-l~N=~1UZxoVR62>G_zE>5E6%AWtXHuuI$QTkOvLdaP*HF?gPS~Hrz!+ zoi}_M^5Nl)=Q7+azsPwD*p2m>GjluSn(=8F&261_^RRMF;u07Klx zAX@X-QPbecUUf0D7j3uLW1*TV+89@09O$oqZ-{6^$W6u)H`HHdlD`x(2om^ejie9~ zID##nV2dD-=OJoGHTg>>qC*k!M1Kt1Trnqst|onASSUHx@og4q-$`xA8HJiMmm6|1 ziBy{diYun#uY+tc^N-9m!u)qe99h)_P;9hy##4!OS#Ee@cdR~y(rUcJvzMdK-{@SA zqwJBU??6m#>XJJ3R2%jWzVq4D1WS*-~eN_ zy!yk3!-;-hKzPBy07J14snIkW@Ale%VxDWii4N%zqLnfw$^b(G<5A$h8~$`+g0}6t zFwk-Zx%K876A!1VT=$mSjxh>B4gz)DOG91Px(P?8Stq%gDHV@zjI2ZSv25CLpt*TW{eQ2+t$tx<*zoJDc@qYBw}J1thcuE?9_K4`4@YTa^lPCJ z#s6b~#P3O*o+t60Bp0^jAH+Pl0KErk%_dcYvYG~jO{0PI^caGy)E@VF~|7dY^az3R=n13c!93Q z>zz8tyoWzCG={~mQ6ZSFv1 za$?@+3`wb=j36ItI=S0N{Bm>x|HTLc@5OOF?=?v8X2uY7bgjdwts=0IAW&*Qy3eiEeX`c z^~1w^H+f9WH*#6)9S?)()Ui)(u#0P>&z=S@@J_YDZ4&WoBEK?&Zvtj#GlsQ~3UNz^ zt7dNWi%o-_PZc)4*T(J>n*uw(T}A=jCq;=|z8TABkXGRW=11;@x8>kejSi_wK=Gau=HXEA2MW7?vVJmT%rY!Pmog zXuEJVD;kb8ipTU^^5-O;FL}s)vB2!*+82jAWXteuJO4qR>$mL0*5hru9!aBDkthMN z6}cg_+l{EL_uxV0ZGXM3ql(c7E+3l;a4Z< z&;3%=$bTc20S&|IF9TA=9Df6M5Egy+b{z7jP;oWFIpCHMHLg6{8H3prpvL>)#$s~% z+7DCI)$i4zhAp2 z@;iXuCoc;3CzNQV6g4tFUnkDfmi+i0Ymk(--+vlL)-3}63zuK|Ak5;X-tPf_pD^ph zD#TIXQi~e;=ZJ-&n3E(d*k?6K5+P>oxt!hs)6z%wtul1>bE8j#7_u0t>jF0IY2nhN z4wAGY1wmfLDKDTN(PSXwt7n5~nwprs-gEVFaRUkrNpWO+Etl%+UA(qEDco%oSUisP z$Q2sK)K~|xL)_aF+lLH86{eFQUHi6|IsXbEe`lo?Q!T8|WQ(I37#IA+L20K@gyA$e zR!NT+3JT2BC`eevinob1IO9^OQUC;3(xNB-I< z?Py^l_M%5q7*gWskW2$nObF}16t?tGYENpOLeqL&QyK75EYx*J%@)?+Dr<5uRHjXr ze_x-*&8*g#KG996=0NvJ#Mx0ad8iy4k|9PdX6?t*6_zAG*(0*$7iS)_Z8K#*HyXwy zSjBTVZ&UH)CbzTC%3S%QH%)6&u>1=>u7>e+SmSFzA0KT6Xo22m3*k`N*w7$_tZr3| zMXM}Hf%IS|1JN#EQPh3|xyBpOyIv z1EXnA4JURm5R;gllRGMs!;Q*}odib)8ZiuK%deSz`83<`=KXTY+47e-jCs{tZ*ED@tATxi(h}Qz~kr7 zCFd5kx71jdEa51$rT{fwb^tgEf3Ph$h*Yalq~@Yy!+4-HTK$f0#%-x35FnFNQ#{- z2{W0=W=i@nwa3U^*eM3ce|^X!A8+h}(mmeThnIhM#h_q~7_f9P`-LXL&2Dax0C%J& zLKgdFiscOi$Q>za59vzi+Kq-T= z0uV-{o}6g_R{!9+fAM4ajVfSiV6+v80k0zNTNu8U05M+qc67C=2)h~-kYZojaScpm zLE-=2OS8rAZ(_@J^G~WM`Ol5IEh$v~X7p7nz}of{a9X`2S?~BycJ#^>OY(Rj<=uy0 zz_hmYuurk|aE7C}30x*=hb`0bxdI^3n` z%rfKGR-sore@mngA%VN&F(2_{O_!@FK*E&2xe4T^7i!CLyI?&klytXI@Z{Q~BBmk4 zjua)QILXR_l0!n;BQ^~y@}jqdMl;^#=NtiT@)Gj=<^1$jaXgYGer`x3gm1`W`2T&x z!bg7O)jM?#2tB>mhuq94?9oUc#eP+u`#n1nyLdkmf6FfojY8Y2kVZJ)yIKA+%J*(&NF!C>U;IZH&v@Maz!K|G?)5#^U;FT| z9!XUi8I_PgR7$G8f9B>f_|Bq44D6vnDqjatz7-Y*lRuPaxMem7rytyBcQ}yl^(jp> zT#B_se`0Drd#B(tgrB`m!6H8wGI>OK{Spm_a6?YPrsnfcfBiwehNeat_^7T*B{J+ZtL_A3&|JB2V7sP4A|MC~p_3b~F zf`9zet2E}X{#aPoEXBY4>(~DoM%;0qZ@7O*e;(u8I9k2>k5@8;jm1`)0#b0zR@}1o zd^6vf3%;^e%l&M==G&DyvuAw21MmOV5&G*XhnH?d;H^*@aAk>H{J=t8Cxv}}>BPVP z`S(|T>UsbEs&<9`@)!BTKV=mE^TYrA@c#jwTG?(~#}R$!SMVW#Y#=gwU*I?i5GO!@ zx9e>SWD9@2oojF8IF_cr*RQA#1N02AIqIF7LHA;IcGu}krn~L5+hJ!_4-6D&i4nn0 zg{0EOcI2;LUUU~Fk>{MK{E&`N@VxIMiK0k~r2hB+&Gy+3KLo*#tSZwuWznx;%!=Z` zvVWDo{P_QNJmEPjdGzDU@yGM@kfjCBfB4~_UU`2KrTK-(fBdf>BatWU!2h}V`|Gb) z*Eg5H{`xQf@}EEa(+ey3Fj*HXfBzxpWtAsCvOH(UfBxY|`R@;n&GYkhQj{!?dGwX% zg-Da)4?q6b|M{_J{;xm&AqeZ_!6dcXg+KfcBf4Q*{``C)cjZwWxJ{?r^DvD>vOBPF zFA{$q6fz`;#Y@mc&Ffts4pqrsVxVvvK6SW!4|!Iqy?K5<%cKBrx43(?XEEsHf|1&q zbqMf{c$V{UY8<+|R&=}D(^|1rnUTzQAhvA$@w>?Wjmmf^wrqUPVrj#2D({KjioGgx z(wBdb*^l*B?9&68b5Cl;w0g-!MCLnGTeE-8V}P+Lu?Chsm1RR!&Xuy9quSev-io~- z%h-LXWz$QMQknLpR!s9e&9_woDXi_*6TuaLcTVTs*IKr{5-}Iamh6a6^w#Z*V^MOl za>SyzicoU0Y(7$3vCimrJ9FOOG9xqXNv)X53t`U^vQm4Zw`~9EK(^0)sTI?t%65Nb zwga(cUC37B#tr#EJj_zO!>T zuBCz2iY?(i>e~JObe-&SUI;;FJ5TN ztr(|;cqcO+h^-it-8JrAZx{DP#$&ppJXBk@e&8&Mr5=^}L~q4DJ5ct!j^$R&=?bj} z=kiKzX}@15CC|4k^nC8yGqw=Rtsv0#GjE(bm^Zvo57p_HIXnw4e`&@*YsEIBJJXr- zIsPp!a2V_)0f!=&SRPpH@zwf7b$J${aKTZ_YP&9)tIHMz_NQtu!&ZZZ2I4V>{i&9S}~O^ z0y5XWR^Rs5&(-0j+I>vl!#_nl`uG3&9})ZGzdt{pm9i**sY+`DrZ^t9X>ts*G(K)c z9Dk64fBvIvA{J?thr9@ivU(|kR>Q@x8{GR##ASldEQw=wuPzU!b5 zdlMBDc^I^TIQu-6d$c^j*k*3RP}ZsrQF%L?D3tNwtFQkc*ahP{+44~3OPTA`qb3%X zkGv?aa(3XVb6SGRjQ*{-6^S@hhfS4bXDfc zJCMH0YjP(qe{l7~O)9I4B;>Vh&{w4)zD{0QEXa=WP>u%imLJmm_*BRPaQ4P>Yf0q= zITobB+#HjVz3cIkG?-&S8qC4hGh>HFwTYe%_ev&{C-5ZHwKfg>Q&Kd=%-|QQt8GQ! zb0^NP&9x@J^XOb$@RF-TVIZ4XJi1n(N~G&xniSyof2E3J2d`l=UmunvY59@s=|M>; zRGn$Y$&%97EIl0LE%EvJqtvdy%$S)UgI+?Ym#O|#xtrlQHPrQj7on{8xtWdj= z#L2Ep=k25pj{aMuG5^ftjL+puoirGv1iF2yWF4}u1V1IByl3UU-nQsnrwOKESdfjb z;Y&*&e~fVu5aKI~D=sV6uOd4u{@=PyRS-3Vp|s+ z?#^`piMc5c+`UbDob@K$^8;%e)#@^G0We`fFNzeyeDw!0-)KbO2C_t-49laS zn5QEtHI^X#a@LH(N%3w{wsP-rgETrPL#4o^NBpX;KQ`YYo(F3q{c%()MlHFJ#Ufn3 ze?nEtpqCKpRe!jv%B-5dO=!14QmEhc-LlE`9auS$SZbDlxK}ec=Fgk)QK^GAG1OGv zsK4_3B`ribUtVd$eoCmDIrLX)eqd$E^G$h-d6y9vvZ^LnizcG#y5dGZc+mwjB4m&k zDU_@qNruyYT)X*Mk;c*VSYOy-{&u&_f22amfKYkrRC!4@)YN3m0*EyUhk{uiCeATn z9vw=Jl8I!&!u;$hdm*-4ePznO=V_eg;`^M1Ng51NBHT>F<2;S{Ei2_ceBE^tfpB-Q z^VYvicJd6^bYJW ziu1IJqc3Tr<##9+f(e;6vN8RQ=VzJtE1$WMEIN|f9&FE50VaX94R`6w90t$7HddMKn+ zJqm0YVI~CbpOm$T$u{9P_Y2NS=O z?=Fakr!GT&#}dTZ%J1m=%F^vfeSy=QfMv1Y3mSIloixdJK{oNLSY2^(tOsIY5Bge?e0m`jh2-HHzB%_zr{c5cfRasz(h;h%7kPh48RYwv(bf z@SP}R9ntv|+CqJS-brgxmdTvH7Mq8VtQwzSQGRU%6a34!B%Y#e~_emrE- zWO)`v&v}^K(^r?wFY1_8$?R^95_wvfN^(65!F;jXnBRh4I=s_j^?7Ott2H;igFb{s z%Rx$@+l3m-WQv4UzfoGC;}wrgP1(V5losmfwtM(JYXw{~f6OE`(DjojKUXhjYVNOY zju#HQIunB;(0|p4tM%Di1B$>B1_b$BmYJ%27Ma|onIT-Yw@Ml`DN%Oypd0l*vGZ8S z#_PK8B!mLsf))Fhl;x2p#V8JlqTVp!kny@?K%X0t@THEYMfbH}AQPD91T6RU)3-Et z@E<1zdTwNsf1l+?$6|Jp8tAHKdpcSUlY08y@-i2pdCO#2#q$;0I$_YI13N9(S6d@s z6}9y-l}t;w`Lge97&*t{eRLHEc3*9&>JP4`eUcpPE0Wtn==Gkin9Q{^&E3{_oSeXS z?s~F#!mlU4Oh=X1HfgTAZp?79c0_0`zs#^43nhAFfBBA=W_cL-i&+_sudE`_Agu)Z zGU**tt%8Bx41!J^jM4%f&EG{M^9QA`W*sb-DSfM6YLx3Jqc}K^A}HP6ci$d}VsSTz zyLDY5qj3?lB}|ndBI&zQ?mTPTzQ> z-a}fBe;?pk-P1g<$AAfPQSJ}C6rucF6k?|*VyqCfF+mqX3vl^c#bN-3j-x>ND9Sfc z@UywTdJ9DtLJ06Bbw3$h2qD1T(#2r)zk^>6Q~O^QFGj2XFNo{02XMi|oO@jiZ3KzE zc=fvongAkmQ7jkz6LSGr^U!L3`JSZ-*X#fJe;^FQC_t_g-yG0JP}s{h%2LgBWUW(^ z+4^O@E`$UijXdq^03!1$_Bre(J&AP{d+v7~KxAHum8D1Q2)!^0kb9q_e@}Gim5$%B zZzD+T(>G7|I)K9bK@BKSlN{JV#0xE(5yCKx0%Wrn+wz8Q-HY2cg3SIw?Dn4iIs^*v zLs7jtZ}m^h z<|<)eiNay1|Mgwn!Msh2w^T>c(NQJE8(zgJTPf*UN1YaLdA-(xZw;^EE%(mu?&Tly zS4T&a7;kD`3Fv5Q5`#@sS@BofSo~2n0+?Fw_fyVU$@9lOTWLI6qJv)Wsh4g?3n72b zy}H%n%+(7GP`BtgoL&~`Z3pq$rA`Rko+CnXna2{!#96p^G}B3OhWg;R*qMY-Gp7uK%o+8EbJ-BsEsm4yc{Pc#o(`Ay zASu#sbtq`h5HT3E=eYE4i;*Gd%@$+7<#n4!j=aZ|b?vbbBjr z3E|qg?%AruB&MZEs{HP zHu>bX@(94`hvI=YnY@r9*Mayg%s7k+L>6o7W0FP`bqp2413#p%YrSbBggOR~@W}Io zt<~{b^Ex$w?LJT6TrW+N7-}lB?^aDL7R5?l>m`JGJ;+=0dspkZ&-qTjL1)=mM+K80 zBt)xY-r=({XW2g{xcID@PEaxldV1&_&qeZz$rq`;nKpMgTXbqTcqG>V5+MBQgpkf%(GUT*i#`G1?Fk zfXBU9y~B3iDm96%9=+)>(6w*g#Xu3%8W^f^!9rf_MYe3M5(jNsu;no++52Ulul4Tr z5<VE7gkYLyMDEuT~fGd3vObE5IRFRbhx>V5&!Y%W@(q#xG0MB>cl?5F{4e`Lk zDlfzxyNc3_BEyjN3%)iEZ46;zC=vV*1ZhowP3yh-0=$x$Z}!!8yEe07 z3{VG=K|H25;5Jdh)&tJW<{Sp2DBg zJo32@))8R)QpDXeD}6tGOw|y}-m||I8mSO03wXla?=v%v!YszUH2b1W8gwb)ZhDt^ zq^38l+4Yit!u?eAW6pFla(P-yXKags6FeoE{A6B8Ials>-ow;zS2c-J=RQ3~sQ$KQ zUMCCsF$4%#GOHf{RSA!gNokLX3RgHw(ai23xhfUT^o!U4w; z#Dwa9I9xB9fUC*q?R#rHub8=bDl`}nCB~ODQJOEYKKw;}=sl?xMF=3}2CiNRlO%lp zRYg;*Q5Zdl=V7u(6JR~?ZESw`B$@>J!sKbl3-t~$Q;AYPic+vxy;HAvsFFIta=px? z3F<_D!J-5jP-WDlgmBp+p*RDrW&1%=sNY>Kc4`)!$^tH?)AUehc?J_bKQ}+t+su|_ zf0HH{2Vo(ulZe0bsNVjOv-z9U5X2UUhw1Y9(yQhsDC00n5Ra2H4a0&ox7+58obD{v zNGy&lESbFT$Nu@&8i~g7&b6f36>t;~d*9uEnPmGRNt5FttqR@9>VC09biW64fe02~ z1VU%EwvVs-GzLLndZe7qhshDXYwJz*Ji$v#sTDw~Jml&f$3@AL`fa}3G(V{2>dm`r zRqt$=iGO2@65D~BTd!+uDL-Q4+1>RH*=3QHr|gfWCUl2 zpL3?3yQp8nxQe*$r3iV}wq{;=5~X=#C7O8oNvHoHx&RF_)$!y~b&0E-9r#ae0}?DzYI>= zT(%0k^dFcB(7;ojlR^$!sCZUbv(*vVOq14K443cqHZ-_RlobCU@6OSUNchJ}#1TAO zjCDvMUwO`UvW)-BlWcUUq-qA4n%@WKHIjivk&xUhl&YSP06BXCgjipBu9k9t?LQUu z1sh0U(b~LomhUQ6|0vFq=uVp!gKW86d^!n{vBJQJC{&@)_FR~+UOXxwu!Ylrbq@|; zWY%~Zw83Vx@g@!DAJSU+=0#2o**?7@p>5T$*i8ZbvD$8V&ZCX4XRAm2OOxuxv~`(0 zCqf0;d^+Fr@S7*wD3%)OOIluksTXm8n3`ZxC>}k^YP(u0?bWqPJp>yGP{HXNcm3yq zXY$VNbs6_>|G`w`6qL4li$5l9U1f<=wU5st-*aw3ZG}!nd-=}8O2x?F6pcJpI~BJo z+AdhhKo{4DdaOmvta^&XcX=(-U@yrLlM@mDj-+ZFRa2IaT9P1StKNx!*wwYJ4iN&k zkvIXNF5PA7kCnW6m*9eUPKt_HH54AyS}Er&4wps{&QMz7snFC2msZ~UL{Flru;dl_ ze$@30FP<)p3dGb|%@DnIPraC|3RHOgoI5iHVg_pvNrvNn#z;>Vyk>inD(zDeVr$%X z2|7SE#sC2~4yOY9U%xLMSgF7gtQ7;xnM@^ci>){vfzzP(@kfk*6*ZgegoqU zR8GM8B~?YKsoBpBG+M*KNXYzaVL$DiPd)BFxBJcB~)!3myBO?II^N_3fLPLPyzUsCmayt(H% zj^0?{p3x(sz7n#3dY>aGM*>7x^#`ZnMK-Eo{7Imkh7+x`k<=2#h?noOfUoaLV8Ffz z5uV3j5gQocK#{s3(~hlELzIisV+>*~(2TPSdf_J|^Qe9<08-_-F{jyrIfw&=)AC^s zrA>&4)~oXBhW$HLTN{4o%AYI!>8pJ+=-{D8Gwi3S@D1UA>;A8LyQS*nMZTa$%&mG8 z%>VTgQji0!!h^mBG2}0!s^jXi9E-FIYA5DyZloT)X)Ej_MI^sbDe7zep-S$O_&BJ~ ztiUb_;Mml=9xv{0b?=u8NrAXAzFX>zG4=MDa&`SD%bizSTHyFyI2f5zK1y1rO6m)mMant0836k#J03^je(9=736KmGK-P$;#A zueJHRkcK=DjeB0@F(skWLqn+{?Vq^nkt)^0eM-KOG#d3j=XJAFf4?(}5_KevMm@~EMJYIMQ3JkOiiL8HfmEIBX{#H<~P+$H|}cOM4_B>_9{Gg*u-F5f983&5S*)R9R&5gOkO?wWNNTc*Nt~B zzNDr3g)jF)&tbIvc6KQ!<6|xomLG4@od`W}`e82C_bmLzcDx=vsE1}9vb5m&*MGZ@ ztDS$aABs>~i>e4R6aC?}4ma~|hLXWp5rlQc;`l{wY_{OB#)=@U(OT9R9?Cm?jk z#p`%rB2+V>K4j))Q?YpIy?V-H0>RX8VeFfmt;b-usrzRhXYz2t-D?4u z`?GoX$ggmF^D>fOq4pO%jM@BrR!4@O3KW0js!DW)=0<$8R>d4i`Z8D)%votQpb%|i z0z=V>KrzgUT?hmt0JT?({1qAUD0CuF4E5@#1A;)ugU$0)7BKdDtE+!40Y#9NQBgh> zmY{v+M~G4bC9u)gLr*rNiy20+{>oB zd1W$xQ|~D>FOW|o$c?jQniU0OKBj-)cw*krg#qiyc%rmp5kY6G7wzeL!{0%UIu7C` zuh)Z`M=f3pN2j;#StH=l92wDAK%hEA|@TFl91l2S3-ZD;;>GI zNqE)kUJJJ6r$Dx96Hy;{F2Wo2{!bQfc*gWFS91PE7m_`B(4(`c%j%IT3F#?v2qtH! zP9Hr|@Ey`t?M3_g!fJbf`kV@B#@PTJn{a^hMRmwPb*U~G;A+sffAPJx&(F2j%bt$mIRz1It+NG&GlFZ> zh|rRdL0cCSFr`I;bs>MOqiX$`q!03`0jjLia{)k= z)4beOp!=BWtSKcLr1Xu5D19RV+U&))yy07-QlOQigL@FWJtdviL*qU0Edi5ML6CgZ z1Lu*|m_~$vgRC0U2+~wzCV0qd%$N>UjhVnGu1#H;}s(^hobQQ1%hO7d1SlB9H%Y>@}c0hW_1PzjwB7yppb2hW^qd!(HMhSM8 z6CSpqCJE+s#FJ8lRD`V@37nn~$6~Sqx6`A?s zrZwJTQMATKaQN2vkPh1#@8KP0r!@oE4(=119l=N|Lqkm(Of_Y2Zc!8fVIzlv(@j`e z6d{=!84QbQ5u#aI83fBYD{vG_0O?Qid{YVGA95NTb!2}DXtWF(<|3_L?8_SY(HI>x z&UFGGn9#u}6*P)jikE<<7D5A=sRRT-wGbNUDJeL`0Wvxm95wSwk4wQ1?-*&JsL}*9 z3%C!XBybExl_Rfjqk*S@O;n$N_)k_Jun=VviX3uz$V%jm$w*)rfYXJ02!M&h6M{{Z zWjQZ!4X=NJ5{BrNA@9&y0YmT(TfLx1@b15SL7za4pgNazcN9b;g5bDL!nlf%< z;wVa%ggo71QCb}gO@Y4k8VLl$jX;bd)d*SvL7*qs;Sh`jhC#2RgT7Ka83fB0{)Rgm zN&w?u&m1H=CQ~^Awr0s4d=QV*tneww)Xfuo`j)elhI^g>dk|6WJ-+=4Y64H93OD) z@_EP`VSm34j8CbNp@A1TpMe9dcRr7YS^#|p5xgGyJSKP<>={JRs@Ow3Ss2{V6& zVN)L9_W&6SHhq5nm~-|GzVA{aFcJuca|TO>@*57>cw+mRec? zL!g$?LySx{5VZ(`<1>p(^*Tp^m>Q&6`a%dEY)OtQ#jg|flIqWow>LP5RtA5?f_URw zp9T2Nw?4}ad*R@r1{y;vAP5LLJ`@JFufwpU;5lFhB85%*GVX}?zjX+}H^A9ANO=gj z9(Y;h$U9xFfuJy>SiT}2T`7)M1xIB;!U7CUuq2m1#TRUhCqzNsTtrePwY{^ zUY}^=K)pe6N(6p~;xgOw^I3l^7#M#}7K22zla|zW{gh2jqr$g~w0;Kl46o3G7 z(|^FtRW#iAPblL*0gd%5q#(73`j3hCHP3menl?f;#W5M)rh{S8je{g&IpnF^Kq+X1 zoNz?ORR>A0kE7^NnqO^51xpT01X-OVDDtrD;3$HzgddFBl~82%C1`BUZGfN8(lNK$ zcpcgzH_z>ujP8GIUoL;W_}-|j$b+y6(dG*RC>|&V%Kb}PUZqtMK@Y}!yfe*Bx|2>t@{ZG8AY;_xdciQl&+R&SWwD6P@?E9geZKhC^0Dt+tRI2=?}oqHdl1Kt zOKKS4U^h{F=(%%%{ZfBJ)ZMR$F13rxhQF|) z6fF73^WA|ZiFrG?EFJb$^37TjHxWT36PiLurNz0W$yV&DTsP+zFGP!dn?A71pvct! zjvOi}+RJ{DXWWqI7=EB>j;&7tyoiG-jc4iR2IE>tTu0i@d!@;a7wS3TAx$>bOTmAu zRCm@ni^KU>#oB*JR)tWUxBMWRb(h<%2!%Y*WZ2%isJ*zW%B(88>V_`A%*KzEh-coM zYQZ)!!MqL$ruuf5#76|7Re}z#uex~uT_LpUkYK9u$zl1F=t*xAFF({}EfQQB(32p} zcZOL&+&jQ#{T{`E(-%0Ns&0D_N6*iHDb)PhL|qwG7K?w7mHe;#xN>WYqu?JhPPS}I z)3Q}t8l}K01R+wNmQLR?Mi&k7*6%Hc*y=!tqhb}w4t40q8W4`BB;s3HL9q90tN^sZ zPR@D~#@wv^;&|Am$uY>%__!5u{6Q-I`Hz8m2XB?DUZSFuSwHARoGgu~s=*(!G~sH8 z)%fZ(=JJ33nwg9{ckpYV(4-G~$??|BYgyHMm(+#L?5{(ZFf?&N8-`{%zkYuHB+7mD za;Ap~KJYBfXI{TC<~hF(Y@v9jG@dCd#{eoJft@~-Hz|uuZ&&Z@a)n`n(~Au3I`p)4 zU)Nwegx01*O=>=5YuH;OK?XvD~ni5n~G!f8q>teQdKd z{XjaNjo2kjFBeg7f|Omsyb1xS{%|QlO6$|SDN`>1Z(rqw<84K!L>pf4Oxno0`tdqZ zt9qLOQBhPUsE_YGvoB;jhO(#yRxtwZBFsf5i`YResoCsUVd_)@y9g;~_t}%J`*a3(&e?f z<#PS}Rxh;Oe02dE#0P_L8n*U(U25u$&SZfln3zlNGmNSWrDlTRoPfksQD8j1SYoP2 zo*zWQO5lMShU3|qPNBAfI2i`vgxGs}X;+~nbsOO^&j=gg;Y#QAe?V}S5%o0CkMu5E ze_*}FIntn{)UTfe(hXxNscuD~I#sWetb(3ms{|!uJ0A{tP0#C4(mqs4sUB#+7{}3Q zva2*duu_ksRHISMv!`~W3tXExun3%(Z&MzZJJ6jVwF)IE>L{M@2#%z^?klr^ba$6| zQowosozJn>r#YZQVX0FyZ%P*02akF2Y8gt_pL3RFs^g6&)2_;)*;Q{d*L@u_wAD9T zU06-Zz!px()--DYT*FX0rt08Hq65hM;iu|UXUQAnB>r9(+5m+9nlgVk+^HcsV39Fo z6uJtlM?9AiWeXF3wer$O`& zA~2RUo{a8sZFtOx=8)L(?>K5?XM#tdtM9<)I?8C%zV?m^TAk#Tr4oWviJc}|sUOi}B7T>4>TERVT3 z9C&0(6K^C-G@7hwqRLJCRD`_w?t;~%4ThnVOlmT;>P(d1U}P2nLOu`^8HX9A^1yeZ zDD&g^y9?7WV)T`OFWI#Npgbqi%*EoNRKv2lBAuImraEEJ3!>uie?DeVh#!VEG$xJb zVd+PqN$L?!PQ6P_S_0ETKV0i&G_%Q#LZu8Qv1C;BRp3oDh$Evhf1Rf@)GWOyD2aNP zT5*&z2gGo&Z7Xt;5n(foYO~iU94n?(g_!jE4$jw$JslPNEZan=IRS(J?5xD&|N6Y$ zXGg4mE&y(yG?OOlF6RE{WsIbrC0Qr#eWawhU?qnV4Pz;(%sWb-nFay!j_iSlRbGhK?#hG^&a2RoZp3$NsXik?$e8A(e&Ps$8^vO&Hd(BH zF2L(#n>t|hQbUdFaeauMgUl$Lq}#wo2Wd-A8L1nRHd6N~T2nrnDOxtFdfOF~ImfN? zKc%y4oPg5wykj{hDkmUStIny%;5gEW3MHw}RI(`{)l{+`nY;n%(sRAZ*WnCf&=7i5 zhk2&y;@?Y-w!YtIkV9Yzqd=)YI}+4?sqw}lQ}01&R$0|woe)&QU=T*dqW^f^`3%f3 zj*8|f5$~Qyr46BC_*rJM^sVs3=ttp6JaQ*h)-)fUN)h|`>hw@^Gt#WP9?bV8_d=%# zh5=OeGAD&;#Jwp7aafp-$I_jkON_NWmpgEuip2dKj3TfA;0k$-bBg-7g$+`F9iI?V z*TyZJK9!#dA64C_;gT)3SU0&PVzP@xv2V9HaJ6ZJaWEm*RnC(Th&75Oq-sCJL7rrr{ZfVwrsJTqJj_zq3Q! zj!MxlnQ&Qc^C+WwOKm3Dr8W&x#riC1?TecmZLBVfkhyr(>5yi<8-J{EX z92t$@J$i&hcZZ&E>1Ev^hiMo{#^ZAz9uZO9g$>hnGW*88zP(9?vsze~zi;KS0{@ry zX$vTSs5dn7{8fa*Rp%f0ZU=i(2$IwEL7Q6yi~GBUCFZr<+M ze0HZv+L)jV2NK=B6m^Ze`Q*fLs1pZG6wv;DpZ)2l`j3-wrc&ycDgOkw{PQ2{KdzR4 z{$rriyI4LYds+F9d34LlaIe>+^{^Sg@x`L%0->t{Snp26#qwwVa!9|kyi{#kS%|cM ze{BSBP2zy*H2Up2COOdSR=f*qUDRr&Q+qn80U@e$*nC>H%4CWUl}uc}X{+3W&7N{= z1!>MpCavx+{Y(u-6|-uFEA@$uJxhfg}yy&fSET{@L1%BR|z;{$vfeO`bBLmlvF zRzw4pYh}UodOP;LKWayYt}PWSfS_jYE~!b{oOi{E<&+|tO1 z8bgcSUWC8?^lF*UmWwayk)3eh$8X+pdU%{9H!#c96E!YL#?+<1oXC=-ADw=GtlS%o zI*9t@p_UVk>UfEAVh!u>?FVDdEcVugL1?KBB20>Wu4IATP+2h-8Fpiw>UW1tAiMGq zU0Gu79UW08M{Q9jM_o|YGwY0yi&nI}GIaqCrNifUWpbK{CorwR0?n~}_IBrgHB_gN zLwow7a&}=4T%p?`nRkSv21+`ALz%Pq4$Qq^K{UIP#;kU?0pfZiLE;SjOY_FbUegNH zbplL+3$<-^Za~IHF|amhkXF)8m`fpfSnbbCWk*N`wy+NJFi@@T1jEv^DhsMNwvukg zK*p2gn^kfoWaAodQAuu5n4!=w@WgvbZQV*5TO5m#YAi0?aY?2Y1hoWzrC~Asgrq_? z54DfXYGKg!G!`1LtIgS_GN*#*N*We7)njUGb91G*6O7=F6YEk-GBG31&g~4!?&t!3 zgRue&p^2oJp}AOEJRX#u_`WigL;NbxR`3tW4ZX%O5$E85In~%p<<&W1BIcDkD1#$B zi8asb)v#n<7ZlMK@r2=jmP4Du-Y%^Z(qIYA)I&KHVq2QZRIOud#SP^gdy5H8lAmDR zB_;tLl({R5W1@jIwL;WpUmh04G38W;_VoYgf#SeGufB!g+1k*x3Ao(=&2MnK*Uclk zrV7cjB?o^{0ORq2MYBP@cyu6rJrAXIG|NKKQ2P*G8QY@I{HYFGxBpkU524e_8awpP zYj4-gZxZXvNjY@_!qgX_B>BSu1y@w^ElFgRg*=vyI9*v@;3jn5xY)WBu;lR2kyDnI zt1TM*!r0%Bf}|X@0p_o9p^oQ!pKm1I)BXXMPk9S6cNE`r)2J$Cr9q{y6x{Y03(7(DJdbd!HA)sTszlBT@5@83 zNjv9^pxg>#SS5du)$pQN!35?(dxQAFty{}1nC?6lU`E*Bp`cUHV1jmUk5FK&5(q1W zKX>b^Q#v!_ykSL;bXbmp7IhM+e^Rqu!yhU89pPUize8NVA$s#oDPzI>_nO(&WwsMg znrQ>V{EP7|&PsOj?aF>s4&&_zndh`EMvW zJ?lySo`s=PauNnBGXrCoDD(wkxj&-FWm#<*G{IuTRP#&OU>kEgXtmZ~*3mC9x9~T< zGb2k>ML_E?bXQU1PIJsPpsRj=D}x5RL5PIqe1FF)?;DL&ZBN@U5dNNDVWJc#TL-Je zG>Ot7F)Du*X#zwwn1ms6lS>;dZ?hA$Y4pGEY^N_tQ!#&ubM`%V&vSP^J1-W6Wo0}C zS?~aeKdI7LHNVJz2cJU-PX?bt{_%u;&C?>6AlQ!(@OZ+rFaa^NtRUf1l3S4nAf@%! zBDjibmc#*(B`@(4RasERc}746ya3nXV%{fC3MGFhBf?5if%?tEDgkAPcp|~mKn6~& zI3n%=3n7X#2wi$Rx%D5et}kyMrvCl-ZhCcd?O%Mq`gTb@Z_7(90c9mJVpE$O5hhFF z3n&t#>Y}NScE+gMsI)x1g4W?0V7cBozpA{{`5{Cx6F+MnHZrh1axhwDPF`O%78#+5 z(hYx>F%nh?n6Go7$1cP5&a;ncpHOGu3>dSiNvBUf3~(3f(9#<=)X)O9$*xpg`KV+} zz?7H40>kwlpLWu<#szIL*U(dd{9^F=?8DdEQZH9rV`Qafs zSSO4>2E8+ZRnv6gb`(uV=|roGL2atKqPu@2&blOY(;n#2)gJpRvZv~gb}d!!$QJXFxNpNygoK}|$!T)G~*&Z$@NJGp~LK2;x)>F##eP1r(sC122 ze>JT7vz29(3*fq9-N=K8Sp;uKX03esFZCmNfa)?aLgks@P!_dPxBZf$jqhHkrRqwDz7 z@g2Tzk2>7bwnTc0+6p(XlU-8H(Dj3*Cl%*7#uwgo)h5H@u{ewUIVM40xQO{I0qN%= z1VOP8=y>;`-A`tl(D?d(m(5;AhSh(@r-M?H)=ul_US0Lh()tIjS8Y$@MiBm-FX(830&S7%Dl+yuShc;@?wSLY{P)hj#Mq9V7wM27&d$uv+cVFY zU(WNVyw}V8l#1LBC|XX7^s!idW-r0dAq_u${3-N@pS(+!=1frTJ%kj*Q$K$T6UxWE zULiVdZUy&l*h>AbD8J4mNx|6;vMDM>If}en8LLzte=W^lR z-Cr#3(FEa#EBEssUzXF0+0~7^*huiWVsSZjFTX0?%O@KATNAm9#eAVeF6WHbMAx(5 z=1Ov%MXV;6%`5I_Y(a(exvYPwR1|iIuV-H>8gaI2Q*y5=IyAH@Igg)xNl{<7rEx~H z=Zhp^-yYh83G<=uTZgJujl-0MbRI>GQyHh!9u<#C9H6Mk0vWRmEtfiQUIdafVi?#! z9c^g3sebx8D@f2=Q3)nQ&?Fj-DlK-#rLuPvM!j3k0xHC4B&c-vT-|?{Pq8@tRpkc3 z*r?8t$61kugm`HjaHgchgZ!w2POXxIencOK!=ZylXt;G>y$I^&w$@Y(NZq^}4kMkgAzF(p9XE;oLxAt3f6%BUFJ^k&AZvev&MKJ@`_2AwK8+tGQx;ufwY$^`o?1k zP&J4dAWuNvnT!a2(FUhaW<>rz3I9PS0uS`~rLTD$632Rma(aKa)7zyxzi|#Nrs;$x zSz>vnS;Qn3Q0-^R1sDtr$2e;K=}Vr#Gr@0oupz06U!Aix>#V!7QDjLp7_2rtVn-bi z?F^g1^?EOuz|?BD^)f7EWf-0HGu8q>T*fW87Xzy_0}S z)knu*T8Hl)o-uzgHvC0SgrkaS><33c@UM%-43^U&F{Va*!cNjv%=cj-SqtK{S3f_v?`$Y z@f8`Y){zIGRgYLf)z5R_TVIt7H{w{g%|(^sj+^A~*NA`by}Ad8z>5Y9n1i-<^C2KB zU#GTnD`})NujK> z`T)!vh8f$OU$o6}G#dH;6hZ{=DW0Be|5ZV-??Y31?7OrsDGR`C!;n=>m)0SQM@AsT} z*yHioEi6Q8m5gW3`!(nIw-@Ou-P($SHO? z!(^Q%InBKHa|(~&1o1qg+5XnnCT~4+o@d@kvc$h7%_ea{vjw2o-wLB3&q)o^)<0VW zK4B8)1)04)KAybyM<*v|@5ljh#5e!_(fHNd*Uo-(=j3!U;~USWlh>2e(FtFv?VOHh z7o&gag+DpMjSPv2gUGsNHomx+oWAA|1y29X==A7hJS`v9&hagl%{sYhmJ~EB=$!P5 zbvlWeT4q;4K}lW&1q(@!#ZwC3v%>xu)ntE?e`0A$=k|v;T+*YkU{}WRUKkma^!Q$5 zjmB4_C`zv1w>&({*ph)bfv?dDa~@07c@3l@8w~}(#9fiw#naR ztUx2=k2W78;B~Qyfz2c)zR#7DZNkDu63;WbU^jifSJ)bU*n+s*9?N~$$>OEHlYIF? z=sGPv>x+HuEPjermRysVUK4M+i3_%->Lm^!I;D zNMFluIgJ*3dtA?8P#zpBk_{*}(}}1K_KFqDA3U$C2M+3BcH}SJscaB*9d?62-`cN< z(4#k?xg5Cmg}z-!*qqalm_#VHA&(G$u2A8hGk-}71!M=;0lkS|qd|Y2gj2x3tK9dGv!k&fK>|l&lEp&TSdE%Aqf37s z6yeHs9{x4>Pw$~K;JWiOnnn=uT!+Al1AiK3J84bwIO-vyS;?Dm z2(HyT2E_fCBvHRcq$KC7HIn4C5E;yEBcmnJVerERGw4|OgkL2Vb*d6kMvF}ri*vV7 z`bWUx8IPE*jGS%Q`9m}aJ-~h=w(~M*yDey{u#ScRQILK+qHsmSPi+X|q+pBBt*Ys? zkiEUbH{-+K2ZmGZ5a){n|8;+7)gmU^Q?|qy31Kgd;HeAy!LCFO>6i9ywZDG9?psxg zL7*RomwnACGy1;`%V;i(0@vcwZ2|V*$wihz{buY{dWFyyWKVRMl z#hPmgrX|w?raErytOq_}L$+vw#0q)or5}VWP1Y!CFH9hFmm28vJx_msrc}pA220-v z?mSCEngcxWz;Uac)lo>xDeKFoH!7KJ*POwoR|!j&oJ5o8?q!#*B;X?ZJdT5p5uLFm z)El{J3MxQx<|Mf@S`^@0d8MZPJDR}{QQYZS(;>Js9H$M$27@fcIo zbeldu@Z_?O6pDYqT4(U-rL9P{*vCwq{!`wmO!JVUERCTa%GgQ)EGaYH8n1DGj;FK9*(p{=&kxA6;gjL85&wU}HBa#pjOLw$qPbgle{VrU z!8ubpThS;|bz(~u$XNgrU@ z5tQ=$0bl(jrLl_;1~NE-|MpUr(%cj`%YCrLWRr!MJp>p_BEDfzA&a&IM-WCJuj)Ws zp}Wm;C?J2_^8C-a6^y4-3|G!uZp)-dlzS0LpV=bO`FXH=o9+Av5+|p}XF#F!PKX3b zV@L`7!WeN6Z9L;y291zv0UK4-Uid1c{ma);~WvQVc^vQFwt4GRp z3YnWXMnC7+?DGo{oIhuoYq*=b#Do!R`j{g6ZJck?G~s4~4J{$}vcF}DT=a@-G3V9f zbTs|1rO8?1fL%nkHz9L^%OoU;<{Bm$uB^xu6WISaOyUJwZnA*)mO(^|q#Z4Pd@IPA zsDyt6WJ~31Wn!LyX2Iye^-*+0Rn%DKd&@ z{k9A49+jaDlx+>;tb-}cKEg?zQpRBzsTD&Jg+3v&j7zxsQ z>7nA_y6cwb9n0iE-C%i{-zH4Sh$0EEIwl->XUtb@p~pIF^CC=Q**mR;*o-de4K6bvbq=zH8LAKA2@t&U)wM} zJZRR_T`kJaXrnn?)o2qoU``v1xzd2R4Ed=mT6T?iJ4q?^1@AEJl?(M0JfU#+n#w?~TY^V0$?DhnmRc5Fo&m?=+zDhPXq*#%pDehC2`} zQ{E=^*FpZNanHmLQqN*@TJyC@l57K%a`?b;U2?)2tD-4u<*z0)Oih1s7~mZ6o{1OC z=V2ZN`3mlH0s?UAdA~S)(MqwVnl?vL9X*M!(;ga^21|v9wkUY31?9GIgp!Bra9(9R zbpV9sJa`~`y)74vdY7ja7~UL=G-j&}6;bukoECEu{%%pO-ovOj@SYAI4}Zl@w0M!_ z)#&i|i|Oca>`z|f1j~OPO<&I-WS9Z2S7i9M0)XVE>VFKvPkhN$=!`Vs_W1n^2MpMu z<9qvjZY}K(AAfLA7*0EnowBMy=t{^MFP(X|b&%M|tkp2v_YDJ$`%5YmAwK$=cv2K5nK%-RqQPXf8%b=@f zQG9$5!j zMARfuc$LW!p216Ia*a!cec75H2@Ju8K^I8$cV6L} zVZBO#Etb$6sab~pq{)TE7+N0x> zJG{bS<;&Ek1-4Yf9Qo{B6|bXt_sx!)~~2eSWFL#AIXuikv!`ak7aTW{Mo z6n^)wV2ghsk^?7cfDRjyC2bNLTY+H>+{=p<2#j=W3)O8T<-}O?-*-sSk}Oe7ygn%4bBtW?&6S#RzTn z?UUnlw*0tE!QK-1*$P=c>4||WmYQ)=i)DWbljD=ZlDdo)b^+&5f;O?FHwZP^-X`^% z3gz5ggD`{JidV{#qsH{xp7~#c2Q`^hG+V$5cp1sn>c7#5fefh^W zw!Ym>@T4%LJ=ZsQ!5|Is1n57%8-*ng@?({U&+kWJ$!0%RRX2#zF!8~*WT}_d=h}>? zFfnJzHHqPxIPWv@etL#SF`tiaJV<3Nu`PXQAulbmw^m;9uk{kQOcE!86mEZ5_bX68 zdTF|+o?@h>>SzSxEDSpUeNT*597A#t+290!K(6NjQaYkb733?x8&r^Gk`cH`!4rGr69;L-X&4q}C@_Hfdi6>R zdcTs-WwxjrRCiO6NCdY6j*s)WTv>!iOb2$T zhZ%~&eb&!!bIbS)wwa64wJshNTjHH9G}B8J#j1wAdM{lljl+PczHnYaHn)Y_I58<@ znRnLpc&PSE7g>fjvC4l{fdcMMgAmV^r600$@1$x~p(}$b%0AE0$zaf$d><|0B3sC5n-rsCKg^KrH z^rp_$_Qm*UeDsIas^2_6)Mhe1Dhw}O|Jl#uqvq*Py@Q@x)PPhv`vY=^fAgXcPH4sD zh0!$_C&2bzlw4Xk=o$Fzg@K~?;zQ4BZ*u5;Jm}SH6ThrD`O;y3TW5rt^uFR^q5|#R z+L-cH1_swHz~)BOv@|}xngZie>NymwC1OG`3%OQ>J;eEyP@?h`&V5G6EjKIRr9kUE z7x*Q2+7PQBcgT8Is&&fMBHS3hXqXu|sBq}{eMyeBa$G1&;;>T70*qyI;ijx%ndQ0w zw$Pr` zCqzs5Sf;iC*liiT#b*nsol(`(-x`#a6m;H^exMBu)!7~Yrh#0aHWIqgE<*SOD z#b%@uJ+K8DHS?Cl2W&nS`IHsH){-xnBX_Q}M@8x~7+5)f%aC7|qp2s_EDqR{--MJ< z9I)5MXcNBJoY(Z_3L~Ik=NJQjXJ^{6V?6_$@$`@laV7?a16AOR675ER7*r9fy{WYY z8w8&;wAr!(_oaQo~Q9zQ%w6Yv9j$RG;06$6E)-Sj!T7NDYN2do4 ztYf9&70k7N`NR;a_U@2fTPVE@LU>CKh6^1JFy_sSd=fn{L;7GS&CuKvL?C{0z4d}qaf9gu(jFE z=#ZOFg`TUxXUpas9fnQB47I{C^x{wbFate|EC6MHiGhTp3aq7vz>%hE77XiWyqIiE znfI1%C^30IdPQ3R#yzakJ=BtG)RR#$P!?5(9HUJQOuXa<6K{2Ww<2T7E$neYf==pejI35@O93O>04M^Y?`iK8$AC$nIH!vQL zkHWK$AuCUiL7%NDCDR%S)dQ`xa=%nccVR+*I)Ns4v0S znO<1YRrQJZjz~BSr3OQQf^o2PupHe5WkzLM(qbtln3QrJe2Ubrad|9P&X;8qeAD_G zGv99azj$*&6WPkoFeN#1NxRei?mAk-)^`bc!O=f36uP!!(dA)^gpQ*I&zr_8mqjao z_txo(5O%L~9OkmRU9LlhTgcIHSwJM?h>1d^Hu&p-X+xA8v0ZDMPKJjY7LYihQ-WgbCax z!5{RRRtKM$07mQm!VUUt1=w(eZH|Ew$A7|I)v|}O;SY|*t>0?D-^3`{V&opmZ z2k1bffUa;~we(7^7UxL*;lUZf*MmpyN$+kX_q2oj%eIc)w)xRp@q1#cn}(r>hc38C z7`m~*&7H%{qAAJw^)1xq|MMGq z7fM~ z{eCKBTt5*gBO548rZ2lQfGFx$SoWfc<2!Al9z^;W(Ix~ak&l|{6hnR;ULOXfALEX4 z0>8n6GH*JVSD%tWwDeV6*1LmJWkMxObRx=f9~hXDblh(&?g62t_5pLv_r=ilr*w`^ zg>;eo<#iN)8CiGMFsSw#8yl9Jfc9efCE6a$zr@;)53Jz!;0P#QT;s8ZF^v3S#5x3+ zNpk84AeWGPW5p~P?SjX>4qAh_gu+LjQ`|wRCEpv&-t=<`^o#mrn2{9evW@C}pj;Pw zs67E>FDWP>?I&eii+yF;71DlW6#LDM*Wp|v6(ziXok~fIZ}Zb|aFKw3y=L5wtf9Y5 zq{m)&V3HFLqF~yA$aa4nV;_vn(f~$NUzU-(wI#@v4!;vf1-Y*4G!UOzmjZB==3dvy z0dk$c*QSUI(pSgB_F}`21KqtI=w>-i-t@bH102eARc{+B#BAG8rMDthUTzzz^?ciq z-FPK`sTulg+&2)nu+kkg4_~cL2>x=%`aklbD!a+2X0sh|48wlwSk1ASxM@?{#u*k= zaZ_=z#dBzeGr8a52FGQ$=3C04@m=igT3`qFPRp)@ZJ*-1 z0=0QcC_gtjU1r`fY3neibKHQqo4h?n+Z>gD;Zh)2ciP<)-sH-6FDs3}H5Zjuw~L*o z`%&S-5`iJrAvPCLmER7;o517UD=r54mo7#)u8?_8dL zrf^jg)?5Q*+>_CHxYn<<>(&ex#we|8+uj!o)tAdFRFb`z*5`ryjp^f_&O5Qx`V~o3 z9McU%qx-;mSfRQ9{R9rt5}zBT&Bs3b$nG(wq?mG}mjJ zp&-B=UrA)YTaiqFyBqo>3GUrozbC^bJ1`lllMT^Tf+RG(znuPEVtie{li&QGCpPy& zKRTecb~UNuf0v)p0bGCM}8y;>1bZ z1?jAU8+Yl_=p((QYce6m<=|`o$~Ns&6Q;~Px|!3&*~~W|-*0~$FT8U$&L%`gH=(x) zEfXeQ4q(A-cGI#s%IC8=zqbIW7Q_gGlEdEX^P+ zQ-6^FYa~S8K4st@&CWe%*;->#m<*Kl4U0@B6LL&88)Ed4R`xuL(>W{8Z3~17g4q%x2xek!5o}kk};ff(KfXU;%3kmc-a0U4|gwKth6kf90$CmFb_Tt3A_CbzjXC@&VNU@*=queX0HCZ;+%RPtaGDh^~Pu4u6b z%#ZJD0hZtL$=n{Y1=}VY@PlaOc+hnHX^qFw3~M89(Gy zc&VXPB~mbp&NB79&xK|B@YH0uN#w3fjfHlC$h|GWo$1w1~ZweapUBZ>g1DR za@7%cT>plpA+H5#66(dYUXmwUmiwIY@fK2|=N6}&!^~zsqxu*F zqbGlgx{k?FoyxdzOcRsO(?)SwynLz}@$>n46cb{kuu8KCKY7qmY*-~)k<9>{0QUgN zog4S3bR9bWjSv_W8Z=6i393tmOnYV?k35>!D06fgpj5I-smVeunvq_BRi>&Ln2MoR zYE53j930tJp02ly4oUQ=Ben?eH)!u%`o(|PyU6hYVVNbVn_9`UOJG&UJX<wVl(+3|!7YV)j?06|H^vpDV@$Z4Kn;bvEoW#G)7!h+?WP}Zhd|OS~ zHY(;i%kGzMgF|kJ zU%7SW?$5~83sV9JT{<~tYq;6BDlc+RgFB}b6Kp$+N`g&kvf3=tBg4QhV;UYdm+LP_ z;IZxYgPDjBVY>itNUnYvLN9?ZPhWG1Q3UaQ^#MWx>f99n^lM3J_XKFCX z>V>T4zz%`*CNDiSuXuSB4VqmGBf=}kosUMRlF9N zlA+efN@)L>{|o%PmU&eO5?fU%)Fn3Ma-LU7dSO;TAV@YrKvV}<&&hw~6{?O5L*)uT zYA!BkSeP-i6<{5IRjFZjVOO#}FEL#6w|&Oc`r}Z&vdx@Q;13z%w2tANsp;GFHI9tW+n5P z+1Wy!)2tXri@c{r6R&>+Sl_6rs?wglnj9k(XK&4xO})K|G7NH9X_4E)cL?}LhUz4< z38O2vG_UTpwp4V5KV%(`QVt{8j9N+s1231%+pDgK>jHkEQ-<~q>+<(T*$Jfqrl*&VfY-ZpBudjtr8oRz$l2jClb*1fN(au*2WhT z%GmuPjB$S~d6?`TgmfG;Vx#2&d3(Pj`;fxnDVRrE%;Or&yIt*5Jf7^H)$F#M4AhL! z-bJUab!Q{JHyf4CY+oV%?yP<*XY~}v6aIfX9c`8^rP9SCPpR`e3$5MJ@99@-tJfLV z9?Ds(nJ=jI%z=t@qx-AWmM>SxDwgt6Wo)B|={S?a#Yoeo!ts-u@i#RataU`Xok{{_ zpBR6D=ZdkD<{(?|%W)0sY8B@`M&AtUQe>Ph%~E`-@~h=U&j?Biik^$qqp=J|AUIN3}m_U0V^O(wR*jy=u6k$h~};1~6mqV%IoZuc#ef27;y z^2$DP z9YqO#o)z0bH6u18|K=s%otC}jA>T2+axhduvLv4dmrd^z-t5L+cfYS*vSRK5 z-wOqoCPS!ps}XNqfr>~cLa&|qn}UDtoxr;jVRnr-6X&1To7PUE^AE_SI2ovQCK+Ga z3pDvBGcT;WpLoMWqigbA!(n#E5LH#E_m#1+X6)puQ5lsR=FjxgtN6iXK0tUWNpazT zRU3|RTIaH~KVsvn<_)Vfzp~?tLTOPp>NUV(KNZyiixv&blwZnaSMh3B$UlEV!_PL` zw(Y_H0NqqgkJ>O0z2{f>fV4pZ3A8t8Se4yMy|pT)JCU8`U{78Qfw+a}XSa=sj zcau)$>5Atf!;JnUu8-rfpSXk_8WzwBx)cWELBiG?8Ztqo5`2Jjy2`MO({h$|p*HM% ziv^Z03 zMl1Y?nerImrpDz$b~}I8?UBt=`BIq(uQ}E0`b)nhr}(Ey%Qe!@+Fm3str|+J+kBvc z7{vdzC*0S3&{$Ko&zt0e;5cm@4G04oeIq9ntx#k0c7YzLRXnf*2G+>(FIb*Pf)$f% zfq9&U{n$T~Z}+b9e%QnmJJ{)+wObS8uK;TxMiMze_8{n6D(!zxXzbK!UTG&2ww>*b zrK&J}>LNY=&)U_UdyH52f2MaVmbqRsi~u~Rm^&2{Pr?Na)260NYU-Un0QPs*sBG>v zQ+nntZAm4`dS0w}%#fXlw+6bM@ApH4trb?0_0Bj4zX8=-Npssa6u$dcz%!muj^#wI zd$LWXO`5hjH0ghg(;RAfG86?_Y-Cd5qS({;zZU>O63YV#E{aoKERk5gw?DiGU%c3? zHhX)acZ-va=VSDHc012*UPgDPC#RFytLSzUB{-g4;@d5b&-eDSq+tyC9VTh)1z{?D zJ?}d4O_<_%NszT%;SVqMS3j@UoguIV-bNwrzCyN6195-0zxI*@F^aa{I@$Yo50TIF zr%&16pNJ%q)C-TdUd$dmea`-D;$Z8g7?F2r;G=_}nE%T2R~Wg-i(~J8ba>urwP)^QuRoBlQ}&g9yT}Ke@=Z6{d`%YPYc8|UPlG5#{u+Dn z=#UM`X{CRk1h1E8XANXL)U6vNm)ShQ>AU4<)<>n#f$xQjU_tmXMtxT*AFA{QOEeN* zqadVm@o}_lv8S%ihr$;06XP_CLo`d{44;>89uyb_y**IKHi5o=MZ-`huWKT2Ni+te zFIT7pGZiUqjObOaZ#Os{h4@PwP_p@sa{UxlMihVgIOqJ~VTG+43d5=13zMjrW`2~B z4PlC|oG`n^ao{`GhiKn*Q88NIO&r>qpUWu5#4=Gc4CE!0`wM(WeL`v2>W-AM{UAwj z6V|JIF&%RaZW(*A-H1ph2yYG{Q2-krPl;GAQ!h?OIcux=1ySOVM}hY`T-1YO13E)f z{Dpr(^z)dQ_zEWkn}hHCb+*7n4Jas(5^#8Hg|x5?aU+(}*w_d(X?SY^c2VqxK80+C zy|800U$``&{#u|%mD^0qlP&VZzEfcAO^<~bOTy`jP|i+}S+4eEVp0fKoSVs;(F zLmZ3RKTJd?I!3gl2;jxvbIk^JS9-TnR< zp)4wcCJEb^)u};+L{h}ut$doOXA|~*ti&o{d5N9YdLe@01=1~e=zgD^<%_2fk4_0@kh zVWSNTi6U0UQuwt)Rg!RqWg{_L zh4^_ezAV@b)T-||y3>k>^4IaL4vSrOME4$9sztKtUG-I=*z!;Qj zO?Y7c!Vh^6Ffd2~2S8YRpmNE<0&g391eM%`i3i9WZE8`Hv#_nMl@s+u*(6+k#%jrZ zt)v0U-^55rFOp}xTI$|oz1ow~@llv-7b)tlNZO(r>vNFmEft-b&|4^}@_Imn`K08!1cTZ`N2b6e|z#O;l110TEdW+;4c#{G zSLo?vSVai`Ut3l$ruUI{A1(VX?4yfiD@#kR27kB~XGLBU+}^&kOEJ0zPZkEBGf3qO zSCOT7Tz}#Q5?LjjPp;LJw!{HvHuH%7e?mjrAty4_$ZzOZ6=gMnz2=uN;VaAH<}9D! zv~BYSlq21DHn*t=wGr>5HB716ZDdXo@J!xG=nw}`jdtLGW??-vs1GOs!{I`O1!|)F zUw(M0gtr&-JvP z-#nIPu=PC3?)NK_IyI725IQozL?Fy*G*i)_7y?7A?1 z7Pccu;CXCeudZ_C%nRU!-9T2YaPH_x5rxUws}qlp>tvXpTsiHu&8`Y;>VixMA(xEm z+U6;FRB7NCl@CpppomXT#(`c?4aFDs1RHfm+)Fod#wXRy>0}Z|MlUnaE{ZTkzkfu= zsL(lA-iKgUeQOqQ8&+_P&6X@=|148A){1-mZF_~<3U*pl*7b7o#=F-%L-v!SR&7+$ zI8%AGF29@;7xSrGzQs_%o=YCA)v=-UsFY7rUNl&Z+gyz6BH!AEL$m>^QI(Y_`DT*M z$+(d^Ua;iJ82!j?Yk{}NntQJgdw*<%aL{a5OoeiUO^#(Bz8NLhUR$esoN79hWHz$P zC@zhUP&c!@(Nr?iH84{8ZYhir99mXLg--CN@1AqH^=tuq1 zgBjez-oxI1tyEiU!Y~wm@2|*%&=yo2zUk`N4fJ6{a1Ub?N^DOxkftSIsch6DF8j*?gacNY+)z{iH6#F-xb z&V=NcFj;#X8$QKCpc#|EQ-4g2Zv*L-aFSvPs3Roix@oTlEGR2#Nr{g_#e7L(hCI*D zft4>U_X;s3T^C(9taaJBuEImMI&w`!Z<50zXU|S;TMuTNzrJ=y-K{__vT^H>go9L^ z?QxyKd1k>Gl;c`7wyZ;iJdQqq#|^NuvGb)jE4w5_7E_cW$8m~1yMH#52a*+a77RYG z`UsXeam+3<2mSo&1(2F{C1BTZTM0aAR53~DJQhTf6lN?WjL2=P>*S!ZErG+nMjD3= ze@f<72jkACb8q(g=Dpm%qdqc=m`+D@+|9|jFl&ZW!e#me(9p_mqfzw-bx~1iiQ2x5 z_6gE9X3RO>T4sKvnSaQclm$&}!p5g6fV}GJ^8+qnWAQ(bg_w$pZD;%dtytM^<2Dq1 z_gCBiMkHfALEOA~$zUce&;c5>z;qspaS$*vZL`n@lFBlT|Ggx&ag!7$@k3&hmxt%> zS6Y6`_xWg)q6D)XMHqfBlDlH}C40P>U7WA4vLw$Krt5Dwxqlb`uCkPIib%>Aqfrzi z#^Ab$Ice8{BzcSzoN@;1mx5_uzos11tza_xZv^6#(~RSY;|+|XMu;u!y_{mspT2QQ z(w(!({L2FG-y)4TxyR04oIPOrB`ea6vsL7|xmDc7B!aDi%2K$!Er}Kp4-uv4$zVP; z?u8Ysg(RLRq<>Ol`5{{f*O9n`hx*|OEa8`lCMQ39PqPO|@dK>CruQf&o6mGtNDut> z7~x!U3WMu{ajC>T*F9Sgy z&Qh!ail6Zlh~;a8E&>`AnTOz4!5 zpO^tkH?S9fV)32tMQlNYm|QP-mLN_d6vt0z!DP`G?9hB0^F3i7FLm`-o)|MlHNUyx zbMS`44)azQ7TTT`aa+*T!=?|Du&eg+VaS)zBz z8MU#;Ie((c_$paK%~>KwFcJy;k%LgCZAn$6@5BN< zc#^NQo`SG>c1ACJs>}y-m;GTl`o;ORY)*n^7=N6e22-dB%(ac@=XRqnwi8*>Fbm(* z<7D4bCD};|)c}-|%KO9aeSNOf*EL)|Ue?O#rv~ClwXwly@_D*c)91?9>r}+JF)ozKZ}4?haPh$|VU8_HyD&&ZuOes3n`H{NKE-o}lL%ZX2$ zKFX=_EhG53D!#r!ydxCV6#n9l;Eu(icYjosRA$FgF+%hF#+w)QB)t(vU^w2+=k^Z#p_Dhm@wW4C@Woq;!bAXXCi5sSx+_Zw1jC5Cpo1vrB#LvP{ko7_afq) zK=j#kC@Ou?cw$=0szfo~a_b4kQFfeQy2G2R{&MJqhOZsU=eKZ7#O_QmkHH_C3x5zI zOR+D%eE8sV(wLIn-eEo_7WLW)rJh7cqBO$U_Ly|D-c+2PmR2(htXwTAz1t-U&bg&j z<=ki*4IRyelZNQI_*Fg(Tn5_WtXfWJcbu$FQwaTztm3w94 zhh9fdyG${K3WA9~hdqa-4QwG7N=ivF)$Kf^de@_#zjCN?M^WjwT}kA)Cj+yYc&o-y ze5!(8+1@!itt#B)<*h-qHecy)YQ8nlc&fRCP;Jtgru+^4{U4ANgO!hg%zrX_x1GJb z{%|0ymoL`f>H5gI#)F^_k}iS}<|MUq*%Mhkyvnykh~mGq(9vmHleFHy$)WsG4du(g zTXWuKonZ}hyLdEcZQ7^7QfYA6tHCS1V`tJ~bQt{)y^>!`!!Q)Z-}5Q*FlYx(CVQNJ zV0%$e5r$7zMwZ@gfhIR3w||==`|f7#bhWfo5lkKu$jv#wdy?}jyRwWKp}|`rfnOJT zQ7k9;GCCU#lPPM89$Yd5y$;J1jVC9Rp)q4J7vA$bL2`AE1`cOjX`6!vL!Ku;6|8M< z41vo64SQoe4C|0U5~RFm9T2_F$SJcNSBJ$SSCVIik)+UYz2gBN|9{DNXM}5&g6o$i z6~}G_|H2ubWFq%a5o}vIWH3}Y#67g&1Yws_R4PTsq&(0=t?&3t3QgG_t&|^J)=T(B zTX5}O%Z67|US&LPvFO)IYR$D&jz8Eb`FE5pdk3wOPfG(a5XJBL6gez(D+o$& zt$(n+SWpm(w}rAzXWM~ICM1(;m40`#t=e_j)`I4ez)arn%}cIs?a~Tiat+?*3gmsz zv#=P_Ywxmmk&Q@O^5C)w=vCZCWIVeZ4G)A+W$wLv%vmk(%71cSlBjJ78Vq}xovK$m zjtzq=q8afnWL(w}gJPJ=#5!PJPuQVZ40gpZD^bZJ7{y3N>dFrI^iSXlL@S(w>uw=C zAJvNd;Ec@J1=tzbwAxUShb5#5S#UYiA)!ts)H$Z)fuCwqr#~`iswTWde|}SMk=Jdp zwX+rtR#P4enSZt*y0w%!fAR1@FaPb~4IJ&c8}R{+k1-3vFc5|J{E7@6>ZWv5 z5bUDhAc$L`#CW!WCU+#4s)+yHI7mS(dcz%eeD6JOv45nNgmB72Af-XBqdmrEh1X(M zOsf(tVE|w4!S-pC=mL9X9M6SF9sKzv8qS;dP27b{Me*1fEzi+uHt3{PtXl|q^>0q~ z#am|Nu{S61llj*ao$O2pd4>dDF^+K!@PQJt!st%O3k_$J@(S5O_bhm}!4G<(9y zq@859`R_ZVWSN&_**Ut0^59^^xxX0=$)gX+P10zPV1{WDgc$ugpN;0%ALF~j{lh)~ zQ#?yzic|jr&ld3WDJGPqK}1-u(FmsjrD#P$(SIzN;u$84BEPO2>E9E=a5@1a8h=kw+&CPFbVXb z_^-uoBKr219LE9bfAJRP0}p~i=OgGEB7}P#^j>0ajn=S?3>Hx)t7Z<1#US$fHIP>Z zeE%-VHUhh>iU2i%zcsRXBlN5Uf_zC}i9FRTFEb0Yc$He329UOKCWBr@5AbtD55qD@ zSGG#d6-|LFW;ZxJFDW{yiRJ3P>|JHy7>j7wlB}%H6Rvy7e+4T;ArGngt%`29)kZ#uZf|1~jO1up2w*>@k+~{I zpv+M@9?CPdbmv7g^?XrybgCS#%h@F0;7nz>%MzpZm<>y3yJQ%N@XemH=s-ds=FlB| zr@c*PYM^a%e@ipORN32n8hfo^g}!2{=4!cm-`SycRd;MV0wo$()=&2qHTy&m$pY_| zMnOx!k4B8Ge(m+B)@@0s`9X#mY90~gTw}v*ETt+=S%ubiyQ&L4APlWXv0$*?ufgVi z4c7WKcv8Qr%cD|930$OMIfP+5+gwCc952*sn~&@Tf7stX2MKSC8*{>{j|d*x2{ee}V7D4na37+a#*eDmMx0xy?4`N~?364K~;< z68FE&gXwu9>WHPo6erUl#Qe}4_Os50wNTh_wvF7?L6lW?L{~D`jAaVfSxhX9_K&r~ z_&K+ye?qNkvQ5Ve|2Er1uc8A z1y?20Thp!A-AfR~VYmLXlN~`4naLam>XeM-|lAj zT&KmQr=dBQgYQ6T$iy1zN`9)nM!!8R)%bgHm-}yV~B{h|)HK;dR8K1wJ8@ zh(zpOS5h7jdK~95n&)(v9NBe?;T#pHLnz;rc`V zp?_%n4V{!xZ`v>r$KUfQ4vE%@6cDIyD^RuFr1G$-TB~W=JVkCWU@6#;9u zEMbAd%mcE0{@>4+zi)7p&Qs5mY{5;+Vh#`4;w78isnu2gsz>kDB2|WK`otGY`**LT zLCu83YtM@lW(?e^e@sri-yYbJYO!R

1Q0Q1ZIID$H2MNoK^7yPfPM5iv|N8KVt{ zD2j^&S&V+E5!TKH#kp;^e6(>cOlRa`VYrvN5>gS#!~S8}G!o4?e%lKA`>8d@Ov^oj zV_KDz?}(iUC(IA7)jL|%8^CZl1k&pkzs`g&30z(_B=v*ie`z0;5oqJaaw??2^|=W2 z@!>HVe|e5R-+qTKkS$OF(>j+XwiacYKP#V}>RnoR7TOBuTw8yslxv1c@83d9!EaF^ zBc?T5`@6UhwhLrHLLeg&gg~unc@R_%=L6?jy@KSgK*w^)5;3{evuwd7epxOA($*pf0agHat#Fp?5Ws_7rV^KDrRtL%ynH_(R<(CKe2R99)b zhf``2Dp_kLv*NABjbrYMB2-VPg`6FF1Jv05CvobNPzwV;FU&9NndSmE7~irIQBH{^ zBz#rQnz#%ytm3^L=?{f1&wDa{t#_2JKY=4Xv0?lV(}89ZI*ae{Hr^klRPS%vFcAHo zzrskUP7t(A-Isvf0X~1-zPTMQW?7nN3gqG!q$Nn-aSHWH4t@)zCF4R{ul~7(pM?gw zMrOVfB}^$|s(8Z1<{Q(|7Nqmy5Ini$CDTBZW|~K&A601(&$bZ#0XbusO9H~AWY4bW zch-PlA(mj8D3YYkxfu+q=X=x%^TeoRvI-1tIxP!BoMZo7Xi&KP?#dHAuq|4D)= zp+P{0+H7hQ9Fl&PgJe3B_=>d(n|Kw0ddbb4wm)SBpqxFcH5yn=As&7Y2QmzA!}rYV>3GR#)%IBZP>7@l?3+a+oKFxdSx{19ib<;tx(5NJC)nZWC7pl z?YskjjW~uQADjlJx?HVfM?!tzY(49v(++sJP{CibdwdC4Z_Pwf@}XL4VxG>5Y%Kl6 zK4gP^pegC|!SverNe#Fftl-R)$XMzY>JKH6JS`&Rpy>^Y5jz~8rAmLlw?}rpZqUnW zV@aw~$#^vL&(BKc3n;t`bh7LqJ^{B_>;Y{8f0tcv+AtJ`@AE5sQ7IsG1RA8ZbnVvC zZAEKW)K0sKgq-96){K+cPSvjBzt8y~2_ul1V31;*^PcDRN#fuSAH#WQ7?y=_Bm){? ze1`P`i+SUl%4yIaWGX}7Jaf3kIIH-vAWm#*iXCFsTxlgZ8KaWX+2WLlk$ z`kF~saL?TEtubp|a7y*EWR^&BRlC?yz2r8#$6;073X>zI;wc6HCvZUmCd^td8OHwS%gS-b~bm5gJ;q~lx%5%V?iE47t~e;eV8 z{=OcH?tzSqm;^pmt7UUXd8$U%lFNKWY4cibW@>Kid%)m8&el^kvldZF4q$6Njkcxa z26)C)i@y@>P5X~UvjV5TZl*^qSSrybWlQ@QbD;@bQ`T^IzOS=R1-$%Hwz9A$q|rki zWc1J|zxezjfyHI{645D%-<`F@e+o@A4;ttL5y$f|yBjpv6{03C#+<~DTOBtGYeFiG z)zM0!2Oj<0~zm&2&Uu@@YXQ? zLwl$8P{7dQf8lqRReLJ^ z{n}u#xj8%E1uX4!8qii*wxCMeg1sOseRk>Mwme2GqVyP*uFznR1h!KbOJiyL1+`RN zPunmQeb2ABl`4`{jCQna(5{RLm|CeY1QJh`EGNDxmRu)u5*UpB_c?Krrdijqhq+SX z`hJ~rd~ZH|jvgY*>UM#qe@Q4p%7{WL4)iIUEl{GO2{Q1W;XGVMVT{VMd_m*5`v0Yf zLp7B=@do;by}_YBVDD+akKRfDqj!9A*k}D?F9@uk7U&fz{-_f}oX~{(&^8H1mNBND z(1(RBNTr|fP(tQ&o|T^E&Q3eW;pQPGYqod*j$LA#m*D2LKpV#6e=!u%wa9EK{GM`! zK*+`PmJm1qyITv*WU)t8#L6kT1ar?X2!T(@4MPBE4Lk)%6X3)@a(yvuKPR#Li|+>rar z+q>zvYcjon(=i1%Jst1x4rAD6IfRj13NE=&xv`Z(t{%+;2&v#=uuvm3f*XMb$_jvT~ER=6o&8jD|%r9CdO&J^cw_S{32?+ zTC$Yw0F7NcPdlRj-hDcd39Mr`ZF=7GKBw*0?(8y}MV4jTgvMHONdwR4RH=|ghe?E7 zO+f%s4FMT{lfDcisQ@i&Zw?}mc*BsKlYpV1A#}^u^M=mD!1MO^Pp!Q%Rj@3pa(|P! zg`i^;gd)=Ku0@ikQ(|1#5lU0eA$SK=ObXQ@=NDuFen>jDU&!qhbvlL4L2h~%hvRtK zlV2ytCr7SZFRUpw$vLz)*o#(lxC+}-fqjt)r|nfnLDDWw&yG*t-;;HoQc~z z*L{J{m?4B9bbki^NA|+xot#--Hz_fD74o2|xARpUAfs==2AkxqLU^GFFx@2h_p zHA-{pM%WG*qghn!=tf$N)Ra3ymVOfTq#|hQy)ahqzaZEFqc4+%@O82(8)=o)l=}u4 zGEp9He^F($a8G{KegL;%YYTD$f8|AOEztU7VejZVt`D z1sMHpIrqz(FRJ&Pa&q-$HD6Q>)GyD@md#TKul~Gjt6AmZ)t58ZH2=VFfBA}MF8CMB z@9^V0sGFiHzj1XpMaWl={$4h%o6R7uk2YujJsaWQqAu=S3nM(*7GdMtIr>PFKTGp`|G=vq3+0-Ur>HQ#-EPHJ;SR5ZdSMknjK5$I9fx38p;5x z3z(LkSSm$eMpGsT$mk+ff7&olm8V1pt0mZMFnf1()otgG%NqW(ENYlT*-pbPgtt(S z&$p0vryhs3(=MCNX~);cdY8urtu8tpKq)FX^;A1tpr#=vouuG82F)1doHE{_j#X&u zqJ+zCOUkxzZFLkUy%0S(yU`&yrSeHp!f+=dNKKg5CIKUfMc|&Le>~=;?{Gfj{NEaB z^0o7O3<%#`Mu5dMREzuLE~Vsx_4qUo4?wB4N`_O!2R0}M)Ululg%BhIJQ$7l$bimZ z4T~AdM%=MTcEOxy`(^RA2$v`{(?u8R#};xY^2PjMC9B~f^za~6WITdN!BeTd4BvPjSzRgxT0^Z;WwIsl@POi4(QyQID2!3odM-&{nW zg4D*uh~(z{5yagYpQUY|7rW6RbYLnFrVN!-Fc8Tot-TIjC&q*gHYKkiI9MZGpd2i7 za8)&iTAD#s2o{P`zj*Gzc37M8y)5&Kcpff6y*+8KtAjGNBan&m+cB zKdZvqW0)nPJB+$+bO2_etkXt%Mg>jMha_y`0njlo&cG#?!o)xW%5h9msvgYk{Q{;n zG}Y{c{P1yfS2>}yH`Z9rShUPJ8jMfOgAYN049q(z19?E(EC2+`0CHItZKqP9ih%!cc6S5E&|2JPc>uN> z9e@@08e>ce+-Qpkk-LlIq3VhyEefZgc=vhZ+S& zYMGcKm|iI%DFm-{a?X2Z5~E3>rw_0ejDvsBUkkS$`;cFCar1jR`eX1OXCtD=LQ^ zbs=f284j@)^W*-My=g!WOasy>9LAMVvqnaVOvS(Hw3X2xTBQJNt+6v>#B2*fh2P=As( z-U+UP#fBhSmGJ{*Hh$I^-xD$bV6X;+aTJmYDvrEYUs&l_CX9 zqCRMnvP5x^2cYLjfKvoCXGzslm*VJ8s>NjEyA@Z;8V36gVdEg>PRCTBXADB9%o?-drV#_Yk2MM|gm@lZC! zK-uI%QGei=dx8!rroc2K9xNr1`>1(P7VCdY;vPUK?~1xAbM_s z63UaqJ*I?{q@2RtH-=f890nO7F6`rczo_c=xGag@*bxI`CmM@8Y_y`@1drL%G3281 zns5gaT`EvdLG8!R&8+fnHqCcsjwValOG`PBmVcOOu-b?*q2G{&63b;RA~*#;Yk$^# zZiUIB%CQbfB4wuZ3mW~>e(vd(b%1HL$VAw`Gx+nh{3Hn>c<|g&Z0@j)BABbJmfQyta|>-^ zq}J^#e{MvNZ$Iz7Yr==Mb~Hpqo!8#yJAZvz2 z9v;$u3Ur^bSRX5{6bQ+!rr3MBC=(bkR(ps02r_pN~W`1kPNC@g4Yi^}VaxOV?m!e?rl0drNyeh?d?Z zEINV%FCq#MwEinp$4Jn@c~#6W8abW!c@&8r?v zkQzH6)~G)`w+%(Jb=t$F|8#TM--(~#?ChrkY2QBK+}FGFzB%ySu4CGI2`?WV{qT$% zlbbbgf)5(}*`xybcQxP%VfJ+X+`2sD$6uJso3?gE*&fh&dkAT_zJB_7_xa`K5R!1m z#LJyvsH?joc8?gJzIL-eYk#ocx-v)BqrKfRx?$$p_Vn|)Yr`${fq2%5&(HXA+4P5> zNT*zF73I@Z>bzZd%jgrH;iP`Ouk!u4)^m2E^yADvx1tPrD=pX9x;My|O)B~Hq$!`n zy_M2Vj3(>h(+t1f0C{u%BUZ6_^7pGRV}s;Jt>YmMfBkiAkUYPR2Y<0G=8GA&vXk-X zhaW~6{c5(}%-P=7)w@v%??zW&FWaxv7nnX{^OyGl7FkOs<8?tW`eZ!1cqFg*bNmS= ztx;LEqs=nL!vyO8U77~YvpMpF>a2ILT+U`EZ1lhxe@ol{O(&MWR}!3*fqo7yJe{L{ zeM)@$&@uh)=&c~V_hG; zp6}6Jhkb7Los%n_IkdM`+|*Hz8@X*Kw|zTw_w~?xOQlnT8-KhSDH>P9&A7LG>3P|6 z=e)e4Qx>ujm8Y7{zV}!=_8q`ni_l#+(N{&C@BX})b;tTbd)vD_wZX5qw))lKu^YOE z>&N?uxFE?+TZY*CcZWrT^2@6k~tlz^Noj7~XN{-%_ zID+gMC3y(54}WL>1MM4YZ`(NXdwvDG2-fzVV`qVUYWnh~E}BEO4U)8rLlPLWMBBQ^ zq996kjBEe<&F~>n5^33Kdi&)B6m?|IaNZ9N{pxM9NDdB$za5a@$ju_;WEMu0!2gMt zW`xbi8Cxcd({unUa8cLqkxya7$ta-d(u-sAD)!{ZcYpfBAfRt>Ek6HbX%Lb>*nA#( zF(a@3J(#M`?>LQu!Bi~8)gM?&vIQlxJc@|Vl1&=U7a8&5fJC8BV-9r1GX@)EA&dJY ziKqwfRv}#rxQp|%@u%xCq7qDG3oj#UkCPzeSsG6Bj0R*KW()WR800KZeF_@|6nPsS z9K_y|@_)pGmzwFjQJ%4gdBG{lNKkned7NJ`h?|z$l;KrbPj9*w7^ceMne-XxWfh&ytC=V!@D{$YX^8o=1A(!LP6}<8vygB8) z#x9&@UpPINpqBvI&C;9}Tb{?#Lg=H13ht9|Mm8)bS-L?waxgkiDK(4*6%DZ>n$nzr zB7b;`-V}nV0P#_f(wKA`VDKsC446bF!kA}X?9*N!u~h{J+6E_?g(=U#u-JnDz$KEb zJjONRZ;g70NP;k>e#X*GUs!0ENj$JHCNnRJrXVt8QMjR2=CA}qNyJQWH)F5~nNrx8 zl6km7h2)7gZxKqAh|u)GuA>c^g1-hJ3V%~(zvOZdy-aJ^m+ARr#i!uf!u^I^hM{C9Lb z+-LR4P{b3-zQNVOe-02lNu?_su4o*v^nI8@bWvt5qDOUAlG0iDctPWNw&0gMJ%53C z;iaj!5kAsf3HY`z(~7n&H0e0DVW$XkyesbG2JT{IUU5KJ2cVqR&Bv)svtu8 z;MWji{H$AQ9pgTvx}E@$rXivf#($opH|8?aQgF$4`!;i$T`DDY>sY~YyD#W6$u?cJ zfvL}4&sd62O0ztTi4W?WfTq$3ZZeTvcEo>^B~9lP5`p|{)j%z)s%>3F5pp|%B2KyF;!qToqtn6hgd;zB9}|9 zQpPfqwHo-8v8a@*;)DFPpvWsSqhBFYO*Bp`>KMdvo7A~1X~&(n>Zr|}cG;r>v|}v% zA)5GZGg_pBRjX237J@BK5)uK{|JLoxMW!iRi3;UZ^gx zWs8)pIk`KJq23FFQGYtm@%Ur>=+gwlcUx!|Wze&Rcj#5LIW*Ld%!nLTSCxTx|I~2u zb5p~~GpB}~$aR1|Pim+V?uzkxPj__RrfN?dp*i$?7>VW?1OW~NpS19Q@)G zsG+&WA;E2#Un{{}@pI}%(olpYV>VUl@*_M;P~P3p8H9u=rCzWhWlQbUVH=6hms%Ux z_e!e3@F@Aa`P~lvKg!3gZIOlt`-nUrGn*H02*aH8oDI-^{ZHBcIC82zxrumIO>Fz5 zF?U(N-Su{<=zr{iz=`+yi>@c>`AOx~b5>Wa#ntmvMZmPJD*AEbIoaEI{+}j)R+@D9 z)D3i+oCqUu&a}`WbM1fyBQ*Sf7+6b%$?KqZh9NX8xT*r)Oko~3J^9>nj0FA7WiA5gj^b-ZLRRHsb0DrchqwdD0(&%hfQ>ij!9J&>A zwtC=H9BEWye7*2i6en&VI|!*p*`Vgwdf>P8lC73uos+Z~$e9hOYscj<7uS5oj>IL^ z>jlfBpqQhxhdco>hLIXas#&C(#rk=gLR={Y^Y*DG5^}o)b~|w2iL=q=S+0#kjh4~a zJs$_K$bZ!k_&bvPDf{Sax1o<2jkzRL4abA6$?_YHo6G@Mn*of9m0bhMq3Uu0_VEhK zgg%1B@@@yeoy=(FFFHN)>#rEhz>p^^FYShLI00`IYX*vsPOncsoL}6GuO?qd7w7Ls zH{;14pFdxWN1uA+t;qv<-sziIF+gm zdA0=^Lx$V!#+*Cac_~XUQ6cI30mS2?wn zs3!%K9R3OZ`=o>435P@FlQx)OW?Na>! zyGg0)>QCH9LWTA3uKmvm!ESc_RG@I-s0VPSEY(;>p+X)%E%3 zPo3s~bU(Tmi;n&B&VGs$3KN5Uw|}}+&~WTk)$o+PTA{6?y#042~z_*k-EBO)}>eV1n4SHw^uXzev-N)*NAv_(>jFS#S#SNp-(LU9)Ct`9{OH{ zZMQnsg3z3$rJdg0b^7G}`PKOB=JVCRCfDQ3(bWh(_Q*i&bXsv-b^Sm9H*OzT22+*O zB01S^`W4To`aDD+uEvn{0^Lqov2Yn!lU*_{c}Wunxmcl){4{o`?E;@Til6{G?iWaF zVNXKJaPzvvF%bJSmpY_S9)EX9R81Kadtsg&i&ns*6WCYNUejyI0F=|+ zhN+Heu$@M$wwV)Ba4d=eV8_(Go>#a$wj=^kKSPYz$tRkZtLx9-6+w=l7D0}GW(2WI z>!}gMoFec+#fI(k41Xx4HPv8T)LTxV5@XSdP86z1B4#CRMB52&R**((^!?y_@guWq zpC$M!JQjKQqcyd+{#6Xr&MWz&GvBB3mbTz#h@~2trEIAof?{X{^f%MOAt5JmU>irJwXs4*-@8_wY|gclNHgwL@fRKZ&Wr7rbNDM%sVc0u?rqX>0B zw~}hs;z<7AIV}uQ?Yn5?G~CF{O1ITQpee-8EevBSp4_^=H&#+sPXUq2Q_Ls52Yv7}K8rW*Bn%AUK-?EkD zKEOB2g!_s`oUB0osxfURT{d3zWn7U7p|}P3#iXhYVvNZl%w#(crKTD9-*S^>hU9$LL{28B zf}^!3=cugnjmHA-K7blkMa11*#9E6jMC|Qo%fCx=?=CztsibYeBlwon0%?lSghsWU zZE0uZ?CsIeIw8F%QE{U12CX|H@CmJ^NUaCx950UO*EBSEMVn^p7PhW)&Je5baCuFnm-$>NvU0WN2%jXdwopV zsICz5`Stv2c5{t%A_*xT$Qrdfg%v}>NI19nI=maVSrpB~qy%LbCU5Q>GOgmgxg(?M zyMMC^_LcxvIMs%6fvWsP4F`jH633Ci{v}68q*$s5wmr9UoxVuMSK4;Jjmqu|q1(Mh zVMlV^Bf~R%jsp0ILP5uev${k3IyivXx>dCtyCyKvA22-{^WPpI_gXb7dN2C4+SbyG znft)_B6^VSMnkyLU|4BIY5N8oy-^I@wtw(zJnHwQT3}&jgGwqoVo(yv2JFg`Y&^gG4QdXhYJuT0SBaUvp#s^nXOU zWkz3R*D-kX_dVJB;$qk2#7|mQgOj=JEZ9MiCAbr7N6$u%GkK!k=%Z&5Sdr05)g`{rIPxToG5^gx=us&U%LO5D zyQQ7uVITpgqR}p8(#4%oB7Cs(5MIni)*w_WtVrmh9$Y`-c5DG?Ad+y% z+F5BWB_?0bf~}q6(r|M5Y&(Agty4`;!axwc_gCzJKuI9ca6~akq7Y+341YIknq@m} zH*U9eKPtxX-`%!+EZPDZ_tehLzW3(M%+*a6XO6>h0y4t{&{QW&9o?p@!R6q>dw`ts z`>FQ?Z<-27fU8Lih`yo zI0#(t+}7El1B1S6s!{R$VobE(oKR&^xh+!g&*YtEAvK*1dWHd{dVd5dab&vKih*Sd zSTzYLsw^Aumr8#_f7EL;B^In~>ST?1Cs5~cHsf@TRoploCd(&bSNPCF0xfLx*rkIFwv4gM=&=wSPfko7JM%{f9Cj%z4D+UFeT z0rUnT#w8J$3StcQ0O$wdzbG}Yhy}c$O~adcae{Fn;A_(_vww-a1!F(J7?Q!Dl7lFB zaI|gOrGit;oTQd3iIapXX{>hC1|#idk9XN|g(t56$(vZ%oSW5l*pH(rKVFlk(BMZ# zJm^`z!S!v`SIzNGHW-e~84jcq0!LAF=D#dA^nji|^Nn4%yxJxSmz6p|5O(v|mzM_X zw8TNGln6(>w|~rJU{5+NwEb8kU#-BzcryaKZuv9Bqccr%#_geI2#5Eq(J!S}>u%F9 z6#k#5uuvh1)S-?df#}+a`w$?eF~N^zs?zkdwQ!waJL@LYH{vOHGHmB&J6YF3_G9g_ z&*$%a=i>C}I9p|&N8>f{EKUHO5I!1D(1YmuaCR|R zKjU~*=XsW;OuSA>%DA((!E>=HZTXDg1TAu!2%J(hohB*eg5`+_8tlG< z*Do=obTlU<)KG=E>cI;XC_5UD$K}q@SXNI@rem!$Bq3mfqJ1+PotKV5sYH!fF{+^t zCQA_CmDSw4^%@Q<%nv4Yl*-qU)7WMSptg1>Y=3O8*%Tj+U!doMV$-%$cuDnJb#~wi z%0T3dwg~US<0f7cmW#ZH2Hp6&qJy6P*GG1#sJ7axH1y6^X;l7Y*X&4LruzDd(7^Y* zIE1aN)DE{3-{BO=#+Wk5AQpi?mPbai&a{<41sV3O3JAk{p0P8MTT932lecQ7e3r8# zUVlQce_I(Q)ML$;t^}Iv2NTTShB6taC#Tc5Up}G7$d}N5C_hxTQLB~AgLjELBWd!ZDVKHOagU1cWegVh zTGcbU@Fk}LOR>B}MsfEDrtk^qvK(Socz<<`6=0z>9gggr816@C&}u3RebAYUb)ANa zvlLJ;ybh|R(4pJho#u*6T8t^C%OIblbIW5|`KFpWlAijRDsgN#_u# zE&Y1M*gQ|WBvGz9f+=6&g}n3Hj+Vk4J$ht`IcaNcftw=(sgdDiQdcP{R8~ID!GGH} zWqxs40cY{N@Ur_s3Z;+wdVV%Nefeg3_Tl}>xp@Vm%?isB45B2>sS)(vb7|ipsc2Z^ z@Q!J?NEyV*sunxuMa=Ej2WOm@BJ9Gx<@WeL!h6ZoJy{y^|1ean2zCM7#x=+pl@D*)f-|QbDz< ze=%GXabAY#7Ql2z(V(5<)i{sN6qU2DQX5PZL1aSs+F z*wW&g_5&+vO+Qo;@aZ7L%ceQJT&}lwp-}wqO_f-P2D&UP46`#kd;6esO@D|=3P7E3 zpmSGj+{a`2HM$vHvsb8udY-coKAkX7fU>h3_!i8B5QlC0tSoeiU|0l2bsQ6t36)67 zWr9cpT;+NV21Ti!oXmujkWx`-xtB-E{(Axo@F+mO39U;TQ6&~=&m7q4pV#C-a2qK& z&79)425B7gQlT}DTkp)$V1K`K(EhES%>`cGpAzX^x96_IS*WVqg4gyiV4YFzH=KX% zc#Me^mxOZ-4O~nxGV$79|*qu*&T&??3!;Hl4lb4R*xeE4{^^Oc7h;^x2?2 zV4N#e6B`HC84*~^*D)ard0u8$lXF-BwZUCC0{XvPy_P#bofKRWB6TJqjAGxe?y7nJ z&pSsJ>dZD>j!>4?v!s}9DxNpv>!v6FWt19{$=g#8UI&He0e>xV=MPvs8X~3~88qG~ zrSqo3su)s_Z<@3E1)W!0Z`w!{e&<(AB{sIzTEVc}U4^ABAy$Jn4K0vJtGcoVXAGnI z7SGrr+UCFS@dd|s68mYG^UXQmxy>2={^;$zUeCccVIDRJx(w`1uswJ8BV{zu{vjcC zK3{4}avxBi*nh;~vmG&h5`Wz5nbg4+GAzs(nlF0)^$>i9>oAUP)#dqOHDCX$f4iBh zYcxU1`*E%Oda?X6y#l~!SPw{6Dj?qf-iXMf23SIpN5zd)Ta(7 zJ~lWFNl6kCf8#RBAK@G$mU(tord~Q=xR&d$0?%`OUVjp~9;ZMl-3>MtHINxNMzo7` zJ*Mji1{b9mk;F6l`g}*3{2@ILOf+hHmU~A;0SWI=Utg(9p!HqA{x%eTNaN>|Y)35X zHs?gD3yhg`8~7xXiTPs*C>NI8$teHxOcI?eS*a?@2c@KGmJ=N)Jk>^svS+KL5+k4R zz;|kxw|}YJ5}xzFRby5NZTfbY75!;dSuK@DtzWSZ9SS~){SaFLVU-d|wjsD8_I>;) z9d@2`VY)uS#tt1+Ak0#blv5Nd^U0R%y{OO_RIkHLQ8?8!_8Zf*%_&rz28F8o#IxYW zNNP|3@!Lq^!CC!2a5+isfb3L|q+C%%A2pGvpnu6^lAf?JH+Eub_+6>ur82=>EH!8u zQq=v_tF8`c6I-lU5@~m4(SAXFmtr6JA}7w2ktNIL{Kwf91zC1n zIjeHliBcdtQJg!OJb15@J!PDUf(QKfI%SyiM?pd-C+N*5Ex##htM$d=W*y5C?MXVJ zr+!u_Wr;md9#?Urh^XIr~rJIp-7QWofu&bF4wnm+7#k2cGM(&7-1B=&K zsU&`IRAI4ATKf?mNQB32cwf_o-AbcMS$|e?pv=^|$Xv-`r zj_g zvm{W-pwyZH&qMRqufx!MlOLMX>(zX=xE5l70E^;Gow<%`2N5Vm>>)gM2?PW8iy$?| zpz05YJI~H$eN!9?u*{LJFN!8BwNH#XBYnnk^j|_VqeTrgtNaM}5eQWTqtkW{&2yF}fD?4l?OVmGOx zutI}<45ON{J2NJWBHp4Gz39{RNqWZSXKasIySpkE$c*Rwf9H>1-p0$g)#7voGNvAo zt7J7#78lX|o1fpjo_>TiqC<2W)Yc-Am>nzTaI767DG$apGxahDhnQ)9V>?{mF48=R`sn z^m+o6V6cWf>DiGgWjscG!AGJTlb3y1(=b7;E2&w8L>#`8XNI3M)@(qysMgE=0@N1}^M6P(wQ<`Wk{&K8Iy;QSO%lhEP;OhlFl{zeL)RsO=RB0X z+@1D)1 zAJTbCKqI~m+uwejTz?O*FMH%VB3@dm6G79w()ts3XH6ST#gv(EwB^s7f&v@R#yfTl zTEw36%G8SzuH1Z9V~)M9@)11W<2D+;Z~e`x&7!m!L&2ra&~s>3@Va%bCG$U|h=yE)}{% zF#luCc|W-Le3@13nx*wrApZILuPl8Gl~aDVAl2TUc9TwI(H7G{fbSH5^#H&gC9z6W z4m{uPbU@9cGL;q4)tV2A>3_=Z=E{^#uq-LYlfvC?3C8~~*z7?2(+;#N2;*D0S5JYm zQnjy+)RSYZ5`QUW+1(;ata@)P)$j4Ke0Cz1>Dc#}9`kVdPHSqNWusc$JdAM2c19mj zn)5YE1d$u5V5Nr+to;6lDC{i>PiGGr$2hI0UAyFUnRp(iT7&6eCwefMj3yT8JW|ax zNYlL-_tGr*f!!D8s1@ZtRgu`7Xyf+cb8L?JKB`-xd4EzTtucvy%5vJIJTXex5M38W zTiZ5$*uL!Ru4UojNf@T}EL%V=>v+-f%8OX9XS4Ui$!vx$a9(x0ue#=?E{=zeb%OEs znVsG1n>@`8Lo$Iy&VOPAzYP`ieqTM#I{n*@}C1ElLX-7U&Q=`O2El_{1uwE=Mrz5+8`v8+HC4u=qO zNtxDcZ-#S!P8YZHi4844;*1j;NX<*4b!=VW}&$Ech~@E{szJN4htAXxx`6 z0)NZ%jK{3xN`hc}P%_&?guvxiZ7_kARstBrN(d$s$hbrs)~bXHQcL^|)5x8WTHkFg zcf2%vmTP<;1Dz-0MS-PxNf%!5>ILs)G<&0g_xv&myhrb8Nyol7o_YcKu;6fLlN@yUrWO<6vf~BDK34f1Fh>e-C+I! zLGZ;lpC@T|-C~y=l>r%l-Rh-|BFQQ=niUAo4|SE-i#xT-vf*ShM#MpWIgKJhTayGv z#MW>U0rcVe2Hdx+03>#;G4YMW=_aR5u~2f(EmyMX%*N>`9m94Dvq{=-e{u^Lw)h%; zS|Tv51uvMN1H!kO6B@9t@s4DCG5#(TgCbZEGK-Y9s!J65@&A>7d;Z9N4**vdrI*_i z!$$D@@9;ZSh`m6Z!o6gD+~rg%Wb6gDF<#3bcR5x0-}`2PgQRIb+Mdv{?C#9G_jYz>&wj~Qd83gRqiA;`Pyh@_y$ES@(_t~=sJ)>}?N{V%VA_?EAie*;Hgz7Aj1yw6a zy`WD&9yw`Lmy(8?^$rZ#*3tPxp_Z$PT5+3RK7aAXqO0g#Nq)45(s!Eo*l9{;Pf3L= zWpO8yow+X)RaS+X*Ok&4MH%8Eh{~wcbph-=GgnzuJkUZH>(ZioRjo)D=3Cblds*v5 zEmRz_4~wFILQ*b^wW=!6$P0a^z#2@V%FtQpG}ZSiTY__zC^jmM(OOm~TU?(aD@iYQ zkc?96x~#yaiU5_JMst0~OFK0(T|p=dYpP_21YuzTFNZ<1E;)(7Mw84E%u3D|AX@86 z(ncucBD^Z3A}z3RAWf+k)jg-fHo>UOWz6XXOT~FtaAIYf6f4UEHsL@76nGcmjqSUH z@!0o&u0`MNQ|}gwE;-)#))$w9kOtnc@A?7RqdsOwp)Y!q(8I(NJAmaAb8WC@k8a6* zJNDfmAkQapH69B1Ljd0%g~AOi5+i3g>5I{&Meso*FQlQk5+SyQp2cz5+21Y6yPzxA zcLw-r_ry?yweQvB$m$oS`kQ+mm;0F2_Z;lP?z7g9S8O~74^KaQN z>tW8qqMLz>d7s5Ks@beX0QH>kU>iF`ROlHVkfo7(ITV-f$Z>hqV@Ee4aN9UN5%31F ziF{)t?8I>ABLgtw@Z#fSw#?a*xFEX_e=QjNc0Up#5ZmN2@;QU8mn)J59Dl2-%FB~( zcZthZ&pWYRcU88KF;|I$QC_EM_sz@aKj6mI61%tx9ld(~`qlC4mp>ghxM_U8%}vG5 z$<#ra)2W==d7f^&#pyR&a;2BWX8)qj%sd6rLQa>mitm%thFVZ-sWegU@cneik>uK{0N2}?PuWmbQA2os#-7Fr;QJM zV*5xDifXE(1l^#~D!J^(d-AO|ozR_D$riEUzfh^1!ChIEt*1M4I)A6x47YhUX-ea)S$91&ly2v)a zKYTaDJJUP917oUV3?BXiyy=3Qi)>AU5arUh= zzMbyqV%hC98U|RSy&+Jo3VjcN_cZnEtiq$geILu56Q$LhWTpZD`9f`98ILh`y1;Lf z6R_RFe@Hvt5^JF;7s*i`71cxge@w{f!QF)+ANp5M{7WbLVLJ=GWi wauOF3kF8d_-9Gxcs51`z7a13t_t!Zd_pMZKm?^ZQZK*?F>fO6b??q7%0kL7lt`UO>i=qffvBaLl9t&RMM2(8N));FP zjT%v7jfq`jZ;8E^7&Xz~Id|qRV9EQw|L6ICpC{jsOgVGr%$ZZ>-aC8pmpLZ?-d$p{ zF1DTFbQ1lun_|bBF4SHqNm4!AxprS8DI{cdc59b!ycjwQAKef&Zk) ze_Uev+tjLMDfZ4noYHEUp8;#&f9CLCo79wM?K(AURF^eD92wj=*C4H=f(>?B2aR`? zO}K85_FwiUBjGPBMeG=R?U6z1eceNzhb+$56gp_&BQ7XS8 zkhQ=Zwm@t>rs;5lbnHq4^^ex96me)yWUSIJM(&q(MMw4pvKEM~1DAOlB=@Tg)u&Ba zDPjSM{YmNPBlokpX-B+0Sqns`-^RZ%NIkBFknI+%6tTmG2ckjBzadXU`th1Ii7Yme zc|<&W&TNrE^0?+9J-Ozfw&C0(ejdI#R~b(W<9SN%S5%~LIqQq~*NmtT98X8XM+z3| zRL(5ohQ)8^E1kn-W+SfqkdWiuFC1b} z@~kfmQqYZPQagkZLKG)=eueXkkqNy7(pMcrjf6t@;8t|uY>^PFP}ULg!oLG&8l-!F zMAF`psG?US(T4oM*B?>*VtX@#G~>^v>a~un7b1E1>riE8Z25Zs>4Fq&$vkh?4Dnoa z-eiMx_j+qt$=22eku-A!KJWd}M&|P%l$>7s`x=E56H@O#wQ~C*Ai{1jy}IGbgp!SX zRS=y<4qD1qbM#ebwV5j$5pnyS$(hZh%R zg}2Qt$?DfpUtF435?0u+(40>nF}&x<^Ri|H8(VkO_tg)@cGoQ#Rm7yReScKOt&ig- z8r#d%lk@Vr<(BkopOaIpFDb4XtALM%xL$v4wL&8rX*8-ynJW6E(<3S2c$bS%?M(v#Cu;F zq>B$)(8fzZaozalLp;^p_CDyygHOqRZU+z#_(bIyr0I8CNNesnl9QZCM4Ofa{x(SA zckpUOFK1vX^_0{X3I)D06I-NJMAqF@<|Ot zc)!)Jy$#ZuJ6UqOuc6&@%RvbS>DAqI@&&gEh^I!s{tX%LKV>jS;4Kh;UUg1TT6C3( zyfp~!CH?IkM>P3#!(OFDZ@I<8hdT0#FFj(bvXfdE_f}7JI=B9a z|M(rvRQh#=Hte)92`J^jyd0LFi4e8U8FWoRCL`WtqW<#w+dpTDeI;ir20>iUtu*p4jZ9$!)W&+N)COtE zb7o$@g_2{boqjh+ub;P)MZFA4=BxLIDHLL*OHVxM+XWhLG6K>zTC_@!U+B|I|h1Yy{Nm9G6Tq zNK>Ch$tAC$r2nJG4NyFBGH1)7r1OqfO%%?eCA(+t(%|PT8tDzS!o=>82C2=n7@5LC zC>h)R=_-R{`@ErCasWg=*Jr4gK|1`bo?J2joa2&_lfavqKWiYD#6!vB#?d{2&+~rL zx_#CppRWjFO7T)K1>xVgOA$vcrAPbxNlzFBg@V}DZNmk_%-u?*nUuGW$V6Ylz{x!t z>@!GLw#l`0Mw!;kE3IE)=Yj!x*@iiCGlbZ7Nv%|aR9J3o>QbZWI6fre$OA1}7^I|M zs+v-7OYo?zc^kyZ8}4};qz>m=$-Mjo(=gq6;V8sc$Etcs4bQuh&b$-ixR@A+Ke{Zqje=4`P>jS{j*vd+ejg2*$!U;lIoGWWw1di z*vN=?KdT|61-HnESM0+emig**clBcrHYB2Scym2vW3`s9p7Nz5PHO_mWjt(yGCJ0SYactQ=*yy;!Hr?Ez8agneW)=d!#UT8w?|Y!bbRbsFuig{tCH@W^pW|S2~~IB z4zQ_KwdQzLRl@ciV;SrDCp{#)6Kq>8fKKx~>p6mdKG9VsgC_QAQp^mTIL^a^CY}VJ zG!}|c)`(xNJLrcyO|F(!pAux-ybfwSH?-KQs8EVD_IM~=dtaj_Yj|hGzP&CUFm|T4 z_cfm6Ij=_SU$&+hGEn!s*2BNaVy3h!Nlw8SdSlVRK zPC9+wNv^&P%aQPB(GP4nz*1AJro+udJMx_GGsHeC#X-o9meo&NCi;*t=!=6Qb|}`t zlKyj{r##1!Ft8|tW?WF_*jX|;=OOo$!Y(>V(=J&^8!kG_O*1Ffs&%vD4r5^5@!h5# zaIEIK@slYXmch-M2DRRpc!y6bH0w4^8ScN zd|&Ae5?LHfZoo!Ip(Ad!j0E50{%s)H&#e|>(>@b6%411a%I)d&BU*dXfzJgozt>KP zH#(ei$Li3oS;eV+^9zdf+0AqFO7umk@Snoj5biY)_iplvX0`>1e*1^Ui)4eRMotjt zMBIe@AFVr9N8ErAs1kNERwFt@%w39BCrG+I--Arz9T5Xa{~wu6#EwCKf=yh+nMFLl zX4f<9*o=J3J0T7lf4w`?=PTs_q>$GjhBZ6)#>j_sZ=pBY%DpP$imwMpfxH&BsbS^+ z8PXYc2QEFZAl+N!L>lmkBmU8$M~+ck()|UVq!k|z@%i_~jjGtU{R7zlnpYz>vT0e$ zR1s&l?S{sMyyde)?2$el{N|YXVPqp$0z}VZ%NUvF%=zY0{$dqfei>}TmwbmK?)a(r zTlAJ~W%Zo|C7FS5LHpiZic~M)ln`@jeeqmTTb(rau#=R2*^*xRTcaYkxxyeeY<77E zOmVflbo3JQjjw_CC&xB|(NDU}BFZ`-isY$ZZd1qw0y#C^`C8*h9=o!IMqC&l{R=q0 zgVAJlG%H2?=IP|qESmZEfVs5w7Y~_lGZ-Z6+$zwUq+ePP6E$m(D0tKzfTfAFZIp)v zndr=_5JML)OUA|Wklq|Hqm?(nu+Kl}NG9?XL#&wW0F0AE&E!$efOPsbUE*qxb{$NS zOJ0IG8yCGCBoF&h`uBjKzS5BmfY_{-x}P#hl$n|)z17&N?RaX07;yeVo0?5Nc@56` zMKGg+m{hq90_Du}NZ*_exUD7RmM^PDJp0u846>-9m4Ctv`king#e97c2es^4hWxT> z+U^Ee6Led+oe)dQ9QvYsR^`{J zv`=wXQEnf7b|-z&;M^=dnllw24KXrx4Fo*scX%HcvV!x9IJE!WFL5oK$b$@nl64jR z|76?u5e*}kcw59*9dCh3pw)Ur)zrH#oTaU+D_W9HeBlvS-Hlnoq8Ml++0U^j)sK+G z>Gf{Q5kuut6Ce(l)jt+X9bvYR4%okNiRUJ(Q{%o;!m@>f_uPt9IMy8 zfQ=l&4}=kicIdwc#VS`zy_cBLPyd2g(wj$jh_wfF0?9XC!ZKP6n{qmw1Bt%5#5#E| zu~R2RL+y2_#&4BR+4g1Piyxj7yEx5kn7!?zgs; zw~o7HztU2Avw=zFBrN2P=nLR<5?6`Rj7>};zrjpSpK3A>^i8A@>tXwvb8SH^ch;>$ zU6ZRUq=Fx;NFbc8ARma8*-IX>WqtI6BemF|wI(jyS|fgW(a#Ev1MCE-&fgD;jH1Tg zh~L|_Ux&tAl#(`Cd9*hk{N3aXApZ2SNfM?#iL$J;?$G-y4Oju}HDi;d6!3#JN#sK! zuAk`yRvk4Jhb&*OtxJ}0a)=gpBkMB3VRi0C2-W}L>xI~2^RpG`<=myh9V&YGIC!5u zeAgoO-97Sm(19HZ!^2!A4QC zUu!P?vWA_H+Iu?2_ zhiOK3e*$^0`$BgqX}eW}!aO~m(}uS%Eh#K532%~F+z(?#R>}&|#P;P|8F9kBm)&4+ zh-QI6!aD@s?VOqq(OnK4HzSqiASYBB#FJ6^kQIU?gQ~iOcPj1MS6{3g9M?DqA1}bc z5E^3`G)ft?s%urxVjO8VR|Z6fr@4_qT=a=a1v{?6HaItF=t>)T>R*6XH>X3_W440&p^{p!v65^0*@7+T zbCWU-!nbKPM8h`<;;68=wah62O{v%So}?bHMReVLZ81AdOxkWo3zlm%HIkZn_6s29 z!^1{iZAtA`z)tSMRS(hQmyCay5P2JO>A+r3nKgWLmc3p4tV(td)@ZEgn|a_FZ;DKS zhzGVD21AG^EI4nu&6qh_ck(+o7>Eh0e}-HK(+O;o|1Csd=KK%{ae`^>%?9c1R;DN~ zK$x5UOu8a(KAE62V=K#5M}iKmzZ3mw4W7KnU3qIzTSu> z(IhaKH^0`&VV7YJfgi_PZp=8-OKH>VLNHFjh*S9HWE|2A;qjuV02Qp65t z@)chYL~oze*Uaf%+HUJxwV6AE$=n-f|rxfHDmlS2@=9l2s zADEe+om$+fG%HJAT%1#yha2QHEC}{R^xpTy=gfj8Z70(F?Y86_h+AcU2l$7p$tdOo zGPYULhpRO9#Fn#(80Pb1SEaMP-Z$}oG0XC3FHbm z5@PwimEd^Mk^>)f)oiUTiR82pbxpU8V0Iy6n?+F5(t(9lLa9cv9CiUxMC?AKzKf!f zkW^ExH#xy~8RE7ky???up&n_@Z5pEK>#Y!NpfxOCqqU|a&35T&h&#g6 z9SerY<~NWV2*hraqe01&E1Sz|uLicS%+G#{t}>9W*{Lz3i8~?4{F5_*=rg$-4~FC9 z4#^_JVg zX{}m@&0~fbd)QN-wOUK^0LoEHh{vXG%|JD6K>CKWQp6#V1e`y*?WCRN^x<~c>|1!i zj%avPzZ}?>XJtdWadL<=W{v@)|6q;WQJTNYR-Tyy)Vw)<0rFsU2T42GaZ(nD%K}HF$Y|?+etS2v8`A~#5VU< zfGNS<1!9y6cRQ0x2Ud$%mT>8`!iqU9+yMu&c#eW1L0s1NFnF8E-?t|@gq0#{PYODt z<&myzR!Q+&n6tyA@z?h0zz#ZXw69k-2gvhY1~rbqoB`vRjM36&742OP$C#Lm;b4eo z8}{^*UAAt(ahrkI zuV@FCU+)cUDKQeQTsa#o8ivj|cJB=~bn<$z7yCG2L}7b-FeeaDK((!Uus&aoM)q;i zh1kH(m`5##8S#TqLTX@ z62K16vpK_zW5iLNcV58|eNjqgu^gnm?99Z1Sm*2Y!RVN^(xW4mGmkk)>yEO+>FaRt z^4GA8uN4~Xd0m5^aO~Le_aK~&JT4vn5K@T}u7im4&n@iAEE;2rJ(b!9`9Ql*K4qtw z`0$Qi87;U<_x3Z6dw|hcVWKHV^<+n^P;KkgqA0VlpMIds^;tK@HR9oI4VN=xwMP86VdV%V%@twoLE_m3Md8KzKA8}DX6A=y=jP>Gf1pVY=4*ktt)y?b z(p&eRz0)#_ikVwl70icU1sECK(?=oD_5%dy`GZ12NG5kEh->4U9a4J4eW=H={Q|tI zvtMuunZ~;zj=t~rr_wF)Bi+J7RznR+1~IBdda%+1pH;sr8T#;m5E`SYxaG4%pjF@cb2~T)Q{BS9u@J#19v!8CK;{BNuGQm(oUzH4AMir zvy`6hETw%4CzT~%8l zl|f2looW6<(U0i(;RRy1KMu@=xGW4OU@N($dy{A$LL;`dZU92E?%j+WtH-!R{OoI& z?+lVj3+$sKK3sf=bvN(Anmop7d9S*3;46WULQWE~$+Djv43br5+Zu6E&-#rnv5A-W zViVtJ4bf7E3)|#Uy63s*K{j&1Bev{bhZv_NJ?zC?XbE_eZ>HX=1cyAxkLJG>t-iL^ zI+9_WMa0)lqro_TQp{q!pFzA?ZyFacrZWbMWO^){D581!a(5=2PX`lPSx4hREcrqr zUcX_0;4rPUt^5qm2BaA>Ij*^)oA7qeU~j3{kWgaI&&d$A4QqA6;REPHQ+OQGhPy$; zz3p4whTNx^9r%U-xwdDYr^9P2MSeK8rPQdHxuAtW=j(0Dpz)DGP01#h0;(@!_s*?A zeQ`CBVQUkuhkBffRU>veq#LcU7suJN7n&5onMbkwmM>bHD?D08JacE&No0VBqrjxY z<5D;YUR7F;?BH62SZ{CGK-dPU^0-n-iH10HJBnx(6$()UYG}q_d%EKv(VnF8I3IET z+3!IGAC<`7NCgiF&D@8nSwh5FF^*X#ip;sKVj%r8lKoI|k zGj&m<*IL@u-&^Y6%EPaDX?_--0;Oc;V z{D{w&xq+!c5qMc?J=K-Lj4eb__qITpO%l$gansBaedpYP`jjF){Hu9U!NBGPMFTTS zYRv2r-^z$LJD!SANW{njY17Y3j@#w{Yng8MF%qngoI6lc3y7Pqa&1R!dGZh}UQ$j9 z>B41<=>J*&F{le{y7!$lB3TB80M`vM;oD{)4b*Rt2FTNcoZ*UuxO&UCj!X+tR_&bN z6eL$*oe?V%TX$BLmxcFlfX&lsCUFquW%nQ*I4Q*JT|X^^Z8{*0)aBeEdX=dTp|xjA zIn@=y>Ycn3;+cbIAouIw=Okt5nLWA!J9Sb^9~AJ3HG@ zpH`swrhEp716w`xVfqr*-iB^X(TM7~+^Qm8ANMLiS((%o@p%X{}IfCq+iqsa=mEe*@tBDU5+@%deS)7 zr*}Iuy1WTwa*ud5;_)|Y8^inGouWx6UWyofAP%hD&gRaNeJ4+{j|Z%X`x39gzE0@W zgcNYCLHsu>6EfGbt~k7nl-Su>J(8~kqUW<8dMk5|ku>eyX?X*9XGG2ICSrpXo+ZeJ zNE_Vv`Yxj+%qM*NYdaHf-2V@^AbH8Ft!P#X~Ib&P@MHE15*bg`EXw%5w8 zs4Hy!TaA`_E1hE`lQa)$N=NpB<3CVq-R|j2H0(@^66$LO62$E};veI*py7G!<aM5KcogX3+(RS)sRxDfEm zNRzFCskFVFC27T10x{)_ArKnip4i!$y?wPEwnD++-AmZEebYrpI`CydjA-29M%c5MqpAUKg#3v$P<^L0Z#Pt@hxu zMy%g=eN`GJm8JO5H=@Q|s%+v)sz0hs9q))&>gH#^LMz%{4)!AN5Y>0!8wTe>IE*?jYXrV7j$;&J*?pz>4YyGex1x4^a z4SZCD;YJzE6_*6@-6Q40A}xQ3 z#5>aER|VG^k+J*YEcWnWsz4kJT*TXPKGj-XJZ4o+9JA5%7Mo@7%1iyI8dtqjX=KV z3x&A4qjwYdCLzBK+0Km$;^xuA!F_Zq=qMYvPN1Ep30I8Sf0C3@;3HiuU@pBe)Xwp( z|Ay_&%6w)=P6L&p-?g;DRbXeeJ)z{zxKrTDdKR*Gy4}$Z`%GxTw(UQKY}>{G(~YM# z%u-5i>9i+;8}a7sA#NISZzL1+zlAnZ`5<=A_Z{f-tOMJ%m|3{Z9HgQn9tkdFEtdu2 zpB|B55J6$+xx0cVX~8!FVy^X)zOYK^E)6n^bMyO#%R8r|K1W}q&(G4g%Y-0Jt}yPR zJ$#!W{_1>vlH6IkmuE*u+!Wo&ZO$&@ovXuFG7T6ukUfu|1u`2`YtLkqj+^u#&zl^9 z65N!C6a1UO`5R`R_W4m{BG&-K@|Iglae9qp?b-`d`ecQ+w@ih8dQ0>s$z0VDRpzA+ znHkT>V@p*C9kvgA^f%MtuNqp=)VG2wIm<0PV%VJ-aL_iRK?=FfqgupeEo{~@P5r8& zx4K0D;}y}?`P@=PCxfKX4V~$_zhL^e_%=m6wMP$YQd#6GO>1cObq0h_)f3pI#oco; z2UBVtgu=`$SOKG;4{%8$`Wzm13!Sgrn9h44`jeS_eGwNNuT=*FU{7g#J@zOx9+-b@ z9tGl$te;Rr7vBDu*$k)TMyCa7JxG1fMU+1xRaw1dYEl{u=e)JJAP{HvzjF$sr~2{& zU`pyT#cVsXY2L9Ba_I!vR{Q4Le#=7f!q@=vl`kWX7~Q}HTqruhpJIdM_W1SQKRf3P zXDZUO4O5Yupa@@lo(aJf>T8^}#xr;u?0Mu7(KdP0Bt`BqHEaPqrO(ZxM{fw8?nW8L zaZiQ#?QwVT!sAQTLaYUGT(nFzJf*ZKZy3v7(+Y}n z(cT!xxE;#4LwwV=ZAXLDxQKUP*;sG;3yp;D3yga$HdA(j( zavFH~aqchK|1r1lb_H$W)4g1H&ff`a9-Q&!mlUVzi|{bb$W0%vHHfq3tHA1DG`b*E zMMJv4i!^okxfG&x#e{Rry&mdgN7uF1`jQ+TSRjTJG=^+~WH?I&eVE+}hSImsS4;$& z;Qz4Gf$kbta*K--anw%@AS!#5l|pj4=n+?5zXA>p)}GF7rS&I|x#}WPYYI9C(FIlY z)C7}$Jefxn`W2^P00>&pMoXl?EC=$2^M{x;DlHJcoXKiVPVr5LsBaN{lquk$J|VK2 zZ2|QypY3(mAoYssD3>gO753f#5Y+coWLLT5FOb&p`F`LL$|Kv#CG+7C@z6!qV57?; z_X2aO8%f zOH1}6&3Ocf_=jit9p<)uk~E|xmmK2dSGmtv)V(&zPWryFP9EnTOn+#K+d_q!ouq2) zN=ExJ@rMqFz<-iV8u7KxS$QlHoiL$^9QZp zV4MgIYX}jEn+N3?7Lb?L9+usJ;VED#$FP2A0#$n-=VnayW`_-e3a zTiGYj2`|C(Y~wo$vG?3bB29&lkJ)*nrx(5NSq2p+y7dVY3oG+&_zKeC&< zTEygWUEzr(28PIjSC+;}UBIgmSJulgzOEl9m4&)VNnuveB}4T3{M3Pk1w|z-iV8{# zs}2N@bC-{}J}rKSvW~IP*PZU@2#Hhmu;!HEJVd*EhBT>@)=T|}n?J;F$O>I`3T`yE z1872DZY>al)<(}@x>^wKN3Lqvsvr&%-3}_Wtt}LDOYP0z9l{6oSv$n0!x|<*#5$lJ z3FBKG@mk$qz}cbY9T@2+t7bkdSm&c@%N2%#q~4KEQdp##yyPp6*gNvrArcg8B-JQRFxFglEv-&Km~?f+P#P^9MsUAEx@Vo zG)fvgJA=f*^Vb!ru(3hk1guh(bmvzaC(=jCQrDN;CB14N6SWf$a?q`5wt0CJq4 za3KaY{S{t$#ADdjF)UK71071{4hAQV#|Nqy_Jm*oaD4ppD?zd>k&F#};{y-Nw{v|( z{MzO=r0KZi>spIM;$lWjuXD_YtwMS$TRQg^2KBHDal(ixGarLJK|h<`%AQ(X6Mfa+ zazljp+Z_kvOYSYC_N~0=FIU7+vXWa6#4z0gy+LZxstu`rtbMS=sXy%U)E4S6P7bkf zLsKV3pJHTkbFaapA$*|(8A2@kK?}k5p8Cw`KZ6;Bw%U8xAO&_~(cdDN?UA6AvCQ^f z=@CwD^CL6Fr?v6jwzBTt(%DbEh*t|n7qN}o`KBxae9+Z$cC^NvR{Fyig1xyA5ug7) z^EOi>*2I#gMr$19cQyuayMnlYCV+#&GmraSRWvqG>nV-t&c0hyfjq_^*l~pIT}H)6 zeV0oBabU`lm5Ky{q^n(BXhc6MNKCr}B9q*41|Ips*4zv(h61 zRCFv~3`E}%Do`HuRS&vaMRqCH=jn@!+m+_!6=&w?+ZVErgpASOajq4J)71IL6_+T)En?2HR5ydvezHi0aHE2lw>$c-`e@BbS561<*`W<5L4Z;?N#HU-9O+#G`}~)wUeZ*_(yfzT zehcRb*9%0?5sM*?&YSK-$Mn})kh*-C5e;8OKvr5X(?{A_W+kQNh`4emhj_~@9b%_9QUDpnIYumg)ORM1z+T+x4!u49 zZSn*;)k-g>FmHDrN{^Rq0sDip%IM6Z+TlptAjHZ%Hou! zeZ{_p*bJo)x<~IZNZ-$LmCC1>N^i!2du{YS#e_9CdWnV7Tn3Gw& z9&!GlEs)CQO=kxSOQED-={F|UJ zRVjTcQ>6n?dj5R)S8UP;v%wiw*Oy3D-VR(q=7+K7_{chQv9T-tw!g-LuAJfID*MLE zd{qz!y1GE%>a7hWlX*ajcx83BHt?;^kb2}U*LTFYx$#>K(q~`mh`{$e;;MPS6~KB? zXUU2>k*3`CA=;d(0Q=N^wl}fkwg&O>zUz?it^L}ci~t@{R)`*36Hg%(b}SkMC4*ON zodgz!vdc1Ff;ry(;JOOFx|q!t=?Rn^R@EA1kZyhr5fq;j;`s-Q!6^JVo8?sffmYy< z!GFTbuV1s0rO@-~f^lF1CcwQd?H1r}yY(7W5J zXGZ(&DUH;4$Z|cyvn@oOe&?44X@D3(N;qeT4(%TNWssh0Vn`WK!MP*qOdl*ZNOABy za~v;4Y_+2cJWMRr)T?2ie!fvO-XQ%UGC8SXZr^EDIMemRL~6P=Ld4Q@bR6l-BND_}w|(JZ*Yxpf>Ctd&y6sD? zySj)+WQcdp{w^tWqvWC6kJp+?M@BoT+jGGou4uf;n90e_qyuBrWD{Q)#MW1S*l3W( z4o{Uu`xf|#BoU4Z>3Es+XbEyFTh21#xpukWf5r~?rNLi7u1k0oqU51@1#gg!Xe!gg zlS`9~MF|SMh6<|!iRPUUKl^;v3W#IJvB}<>2`NhiKLtYU_Oiutc&lhk3z;T<-rnJd z;focTY+mO_dC9dsp*H7be4tXBB#$VRY5djIuYuXs=+7Za6Sgkf%V1rqzqx4E>}?B} zMX`n|DpT&^N z+*~0xcfOwm;nc)HbuB&s;*Vv1#wTHZ@+{hogfHdBf!3n}BJQr(4Do#Iq!`(GoQ0Cq zZzhK$)1u`0g<2NK6OLFFRoySlhXRFhTwgCXX3<_3h}#+H^2?P_>vt_{tjE^>ayK);GL2Q!BXV} z`x@W7jo)Go7Qe%|#soh|!kHmXFFI<1Y6PFV$Z*nA1c&QF<261E-HqB#XK3Azt3L7rc4-IFZ^9fiH|+!+|a` zfmpZFUX82ePLnyIUVt!fQ7+8$4(PR?WF2usC`!=I6L>e|3HdYYtfEYV->yWAmN{zmB zkrinR^jcUL)6pOu{USjw!9DkS*=&da27F$hgz+gMK7E{3n@wO1P5?ifMDZayRZak( zGjx)Vr#~MPvAD^sql%{agJ#eN%S3lB--mh-7K}HBfap&$IGl!P;G**2eQ; zA*RK$C~!*7GPyWT4sqUw4RD|}(lLlM;!;8!I{y4|gLGaOL;CSV3o*WX|5^rVOAw0_ zYJ)1pEyjoCeSFwc;O#JVm)6T*P5unfk^Y<>;?Rj}z?QfNhLP8NY{Z!+hE{N=VIZTo z3m85;p@k3VRRB8)y9p(g2@7{Z1RCH^e&h5IUy?guz^^z4#^UlcfpI7P+NHg+f^d8y zKcI(`hMZjaio_dy^C3?B(c1>TR&xyX{E25{h>yftGnD=s=ug-FCTK_)7cpYNvy-Oq zUPX|1jSOT=+M-Qx*^Rd^`JAf-;zGB|t_JBz5Q~1yL3VAkTf&*;KUyDhjY|OWc$zcp zqcUwE*~({!*z~~29}JQ~=SLFwi4fwke)k_j2CoYuXS7T$5r=qn1^?Pt7eb;r1;n|L z<iSaa|(!#Lpt?=gaq9BRL%ope#3zf?!g8!g;O_G`FD~MN9&)FX z=|}M;LrlmCh9tSHE7rQx%loZOr8I}S>S28Lh+l2d8>8-6U^G;kVQ(|~7@r*CR{LWX zie^B>QuXRb^UN%`w`Ul>*JDMPFc5p&d}UDDL)s&^?^2SRCx3ufsA3Hf|D+pjl!oxg zOK#Y?pdc?bUs@4pN2;fDQBp3P2A-W1OXl#A5X%frbdYC-1d`iabcp7oUV&j*F-d4R znxBCq`mG4;stg9Fobq7G1){n9q!7^~^)V#dp9Fi84P20jk;Br;(UmndTB)6Z8aBLTr`)5|IQtO~o+%<`K2Gt5w`ILt zrK8?fv~VXJm9^v=iFkj>IPji{E?DhK|E+|ZJD0&YsEmjg#(fD#3uSU|c6R6Hh(^#I)dlz(-`dhm&3WU>Nb*gkB*A>5_XW+0RQ6 z&H5$$ZIImDncrUk>`QglGYY#O?S;4W5+MF)jCa9z~ zu68wUYG|XMc@{f2BvxE-i1eS)UmK+Foa2ZOR};jP21S=~qTYAePE=4WK?h!u+>!T8JUbUrfQZk0;;o$stbIJ^L9-C0Q26ZJ1pD zMa_1jFp|h2E?h+ChFOkq4Twh=vFA#NSm*B%V}NT%Z z zE6B`-SCE8)d;xA`7aG+It1rMu;li+jQX#WQFBFyL=VQHp7*uC;g~PAZ_U*#_Lj-sw z1wND%N(D);eoSP|#Sqek&KqDu#v@jdqXAwd}qr#%Z zFd?}QFa_g;v2mKUZxgT556vwJhzyKZjij|l3SC2DqI067^-(#oInfRE+4bR%n8>L5 z4eK|E)c47*7p0Gj>#Hwm1M|@r1<=P|z&oiK8BJ3=W@J!OCPvi`jHkOaCc*TcO4Pc9 z2L-8;z&I9{WafvK3@g;DRH~qGdLdG*XC4O=FUlN7NtCFgNus5vD@+Przsb+eEXocD zxnKV)G5l>(^8*57%tW> z7}A}3NBO!1#e8bt#Ovh{EcIF!*D^+jhoDcDu#WTcU;?^D`0 zMCbz^m!7CEW;)~+XXKX-)EDJu1?XTMib?`$T&y_3R#(z5w>Y#hr$&=sJ3CU(+&T_4 zf`~qJkfqv@p1L2fopY9Kmy)g&Yc z`S2J`7%@WNW5_(=p3!B&7dDxF^7KN2&{M7q5&VnvxK;eafG(_nyv!P4T4@>}ccPDd z>%hf4106kDcF7-*Uoa$JC@2*Afwtu7i{fD4KyTDxl}d*<4-PDb5oBc%jQk|RkjQN> zAx^-xrkYiD&Q3;_LImCuG&s`9)LmO3-%%5wOteHlw4~a+^YnxDdGyFDM`zli0q9X} z;^#=yOWiH#s|Ju0RU1{unwm8fzodPmY+UJrhN7jjLKZE9K3kFC+J<7Hxy-V^KYh?p z3~@k0{{BLu;4ci7Y9~+Ae=(&7LP}oG#Avlg}E9_I)LnvZY2&VG< zZ{xs`iQ?dz+tbNWF|O%paKC&yhLrKM>xtgpHO)h={H{$k%NA}WKA|N~b;L3^A8x$I z?M4SZ)j8G8hxdKuf0-8#$VC?+|3Qaa!&Ri%Ud4pi7WTGWFYyk?s>EamDZw1P&MlTPqDc{yC=o@_IqXN<6X2%ucN2RpkZuc?r*x9}G-?5388I(pdRs%_)zEcT$g?wLB->QD=+D!y?RM}iyka1p)h zpgl@<5k(&(ovciF4JTV}EsIdLpM~`5IcFz2(nW0P_#sEt`!B6P|8NnVEEGpY|8^07 zgi*G*iZ4uhQB9?rNKd+n_O$s;u=Q7NIatycZlaowI0!B-P%YYvakBFOHDFW!z%tW# zwdhOd7P~moq0qw#Edp3ueNHC4MGNaAJD)N&7#D0~QbcXtVJ)K493ALowdnFe&KC^z zb)#19qMBQv3Z1*CHL2aRS4BGyG2g^e(H((q_Y}jaU8;!%?cLwjlD_d2?OlvK>-1<1 zLG9$_@$?ec(O`>~!Ny4xv)xHqH6 zW}14?F(H1Ybc`Un)mO}S$-u&sJV-W)Nsrk9GiDE5rzslP%H$NBdt<@LzjOfKTVnrQ|7--^#HYqMHw^;slkZQl| zLFuX^d`fA1cX3QhZcB8QQu-p+S+^5Gdj`ER8}c^LnnHJKHwh}b$vx&lYpLFD?2vp z)H%6h=Zw^*A&SwdvA=11KQSHjeYKz1N_GoEenClY&M>1fc`t~eg`rMvv z4o5+iA&3MKauK;Q7KpcsXC-orLV%BE5WU zMP&sY)4Yx;ts4$TsvumPpv>m4aB-~(%^B+I2_EcS-^GFzzF}(^{p2iskby~uBYl0) z*UDALG>w%5XYyiz{Wi()bD`60MH|TIFl}Jr=wRl;p&e`n{zrg6BjI1=GHYlrG}bBo zjLQu%ps|qdvK2+&8f+pUQORw6wIM;?Pd$qZ*NEbE{%^Dj`BA8&7I10Lf5YmB$pwx{;1=*!?;wGy*MqzR~ zNE4F8B{cgLv8NA{#CDcdlTS$&x0rKb%x)rTJp#l0MNk!xlf3*mhP=UHT$=fcIMVh_ z#8`TMnu9Ac<}+Fu0*x8Z0DvcdAb~o|n31htMsdH~9MEL+Ax3+`o8W?>yO&3*qQc~> zFV4y=)XQ4{$c6Cv;;ey8BNd$9=rgnW!Lb8U7BY)vH&ugD7%&9cXH9ZAp~r_^TxtKU zE-E_wAVfB8`?{FZLBj-B$HAF-rMUZKrnqk#l_GX9q4rapEy3xUSka>kbxt&^pQk5P zmFv8H*u_X-HZdw-cDpz;Z(!))%p&fH0p_4y_N_a`ET<7NaAwK>BX6e*&ofS3tUgze{?c#@8#xK(8Sj&EkbT-uKfTbhN z+vjWHsLyUAA1z`2F0XAsARSbrm@c&JHx`y00lc zzf!k=uAb-RT=CT^-4GM{NdvVrby=-jMALggOnzXs?hp-*a&@80zSrHOcY~Z9=-VX_ zFRxmo>qeh9HMgVombJ|+jbfu$LoJ;~7s5dd$hewqf(R22)8MBQ-d&XU1>cxu*MUN? zoSuQfd#`sj8(W$W9yov-Io7aawQ-d2(8yu0Do6Pq+4mcR?#K+%tM%PIsq0!@3f*G5_J)Jt@;rniHfoGR|E)eWjmPfv63 zsn_vc(FI^)&6Mw>0-|Gk`}$NAZP5J;YPm%hM{my%U8^6jMlUazD4JCKGzm^!>AV@D zRb4!upku#+R4eRj(bBRI{=~cF;PB`RQCGd|bw~LmBVGA1LHYOiXygK|v)t1~>B)Y} zQ2C)hI%t;Q=v}jCwOr#JBAWMzyw?`#*;k|Y4h6@W6j&|x@u=44J)*{0c-QRyUPGj$ zVwCXz>7s>NFM0Zr#*SECb4U8<@bxwsG|1)@q&j{wQq3gs8?bjJ^F`eW>>8gzs#kJ{t$HZm)k(N-5+8* zw~u`=OUYlNh!iY7-ei%W(U{BM|E8zYV>bj3>hPDSkvq{7H(-Rtf<~x-S2sJE5WIGx z##i&S@}?N({K2p3sY#+%OYI&C78QT~DOx(#fe*iF@*nVgVcOrK1$-#(K;Jah`q8&< z1j~vGe~YtCOyy6Hfd^4b*VWP3!(CtY)b0<_uOjW0SYqSa6b|7(aGw%g@J95by@`f= zw1xd8$Uf|e#*w<(Yg}pXCR+GEqH(BzTa+f%rJunxEtGqw=)yP9IKo=%DCM=PR!lAd z>w=BexnjDtHq*lX-OsX+Z;`%r)|xxDD|r8_EgI>p4Xn85r2WmroZsg_+piJbXP+0% zOyvTabXahw!es$2N7iZ_D}Hs+KB?>S;oCmwpzES$wyV~``GfUzSG-2UsOCrwg)eAR7SBms1c68Prv8dgwBQ^O{8-jQxi=j!T)*t^a%hv=}OzWj}Fs{`aFbK^6D&wf@!>!U*kKYcuxa zf%MpUxP*Pi1kpt8uRgpQMepuvhN1Y@#pf3rFht^u;24?IAAzg5p& zqHncUFrs{yB>6zoZM(#ncbmd(mBI&_HiY5`Qt`IL}UCuFOBvJ@ZfTvXje4~ z-V5sd;np^L#J1HM!gZD(X;`uk$iCWJoh*ebN#U}rch_L{ej(`HmdZ`69}pficczDb z76Yr;pwRpSglXfwVv}mE;11Q;_lKvy?iCwVYXx_+Mt-1G+P)eKJ8B(~rOh^ipKCW0 zuI>jqbm~e?Ds4Mc>jQsT;w9_!+m)JN+Gv%=PA;Yet2CYHfazL0dUPh-iqISSz-8+_ zXyQh>j|E;|p6sOjSVej|XB8gL&;{$XfzDNbSNpjKI(DBX$g`@ddN=kX612lvt%k0X zv{s(~^*a-E*9(mo9rLx;TI9{r)7cMZq^E-`t@$$=w0xb`Uw%R0zkY9nuG^#y_O8yG zLa?fgrf=3p%fIJVlTuX+=tFxS&_v3I4XjamI-i>65Il~+so5%1;}yx9!6Kfg+5|r{ zMu{%ip{+;Y-}s!bia1UCNgGW^odC~$U|_QOyysrrIC-cJ{8L!X&b`%L}R(xpP{0WLTt7FCs#af3F2z4j1tEwcsrp`B^p|5RR13 zh&0CY!|dE*2zQ5N$d7l5<%3PR1w2`Z%jlGxmdYNEz_U?*e3*d`9I8qo!p`o~S3U#G z8B&y6q7UfQxhZ`07ed!P)kgHd#_%eP{OS#$5GKHL-8?v`3*a^Icp{fiFH9y~tu^v0 zpB$nT-kCOC@l@Mj^!w!D+ajJj-|DU?NE7F+>Y@M53$^4P1_A>#Va40q7SGuNxJVE_NG z$?dgRh%>NLwd6MXjxgv$$!&)=5aN%yA)5bB87_qk*M;7Tg-isSOY8FBAm@e{Z!Ai$ zSaVPK%+XZ7{ER+s4vfE_1yjg^1=a;CH)UuBn9%&&0;CzWAqG;iVG7xB5`FkY5S1)B zl&<+hfQ+^d_%XZJqFu$9+M3xP&zG-W6C(bX`Emv1%UaWS5@dMwBnhu-u1cAWxiN*@ zIDkz7Gw2HHtXcYjR5|mS5b{5y$`n#%H9ZPc)kO(B!k(6((sL*>Rn;R5~YlISXD z+2ea@x>n1wAsN;rzmsNHK$>l>!u)x3v8I0YygIo+6KTw=FXd?_%X#&cJWV4ducnY! zds6!nO}O;$G*@~hTkBWxs7Uj}2U6`plQi)p`MnI>m}^%+uHD6kLYl3r2$`mFwXF>v zaoTU-YAR<4p*3=B3OTkdwST5@qDQ}ljgc`4VkMvXu=}@8(l)4of1NUaKLek#Tkxxv z41GKUkFD0~BiVPaJwo-2`6Jo)nmvMlHCmW`tKUn~($n$xNZ^2O>}HL&M%w>hNw_ba zzFFh^PV;&*=*d?SjLJoo>Qh^JIB|KB-yV>)23;8d;ke4c{Ed_k<>5gGYb^1{^YBLRhzNfV zCb{CNLGx){B{lQeEO^qRt2EyKkGeO3Z>u`?$3OCJd5O1suPoWJEKBi{*p@7>*&HWv zLPAJF62cM(N0#N-Bwk`W8xS12J}65lCDVnL@Y+WgpoLO;d1VWI?d$fSf-jeE>7$2^0-BjQz_!` z^!vUiR}|5qiB~15(<#y`hYtOseC`aIv_+?#s!4O&2`c|ld5u+Hjq8%}I~(J=v}*=k z`q2NBhb;X~e`lr8q0M{M(0^Phk9RD!YAV04yuk{Yd~C55%%n*_{Y1H+wtl^QT1}du zNf%J%kIH@5ANf%}m3|)T>ODt+?vY!{wd-@fok{d+Ir!E0$}{y{x0UBr=EQ-+ZFY3| z{h(u%RiXXn+T-tH+V>t<2~0(LI(?fC|8M!+>yO=+ep+=~hr0do%$QoOFt-#s^CaE+ zLW^2`;xbS9B(<8LR=b24NC%!Q_vrp7%ePOfWw%dOuyrWdM~bJ{tvhaopgfTT<(Y4P zKDBPGL$|&^g$B~S_Xzb_ZU@KGy&j9wOi-G0^tuf1S8b=)m`-GRmz=)T2D`WI^rdb? zDJtpnmYlYzeqNuq?|ne`oT0tFP=&C=P7oF*3Aw zcuQ>^@Xn#D2E2`@1(S{qcuQ&wKkm`mMWe>qYL(%r!45}}9lLsws}%5S^fuG|gWk*> z90Kp$1$Q+M_e?k6qLkA}zi%P^e21@*=4Qd4{j0B6l%=q92L(O>Kak(NUQup%3mB0! z=BsR+v5&#!b}5`xa0-0br_%n{d>NGSMujRH2z~-iYj4;26n*&{71=i0IOMA>vQ&zB zSy1iYAppMkdPTMZ{~YO?VDu)v6OOmzsOi9)6^k;=PH{jFCUC0 z*3r5jk}Kn-zymU$>bGdlu?lZ&iHKMzy=NboXgW z9{YR6t`r)6yCPHnUcc{^q_kQ&&R5&L75b02``)!#Fu3-jk~DgJ(C3Xm({qP>ijrPy z_>&0qbbj3TLYjO+m#_1ybo`fvnfh6u@ZFyqD~K8K>2=rp=4R93cCV8jt@a`Dd%q9b z+3Pq<+WL=*UA95iEJg3j@?Bt~vwi}vk}}nmN%c9tE9i+XpIrtkJY7>%LWlnc&^?vo ztEaJ#gA|K%ea)5@*5>-&NX{@&V5b}R`ki`rf$#dFY>7-P6kaRhc|oP`w@HW2^bHz_ z)(6k@Ew|BY8+{7|QuX?Ce3xctnvL11{u6K}I&h{xL;qFScN^~Q{0Go;aISC6mMR>d zxPU^%b-tfle}mRC$l@|DvcgIIOz8hxwG4tJjEE7kQz-%3^g zYqjsLB>lUqeVG~b;z6%sb;=0QrcZbuU{jf&{`5+PhwnYa<%v0z_et+o9VRmn^Bte| z_R#}3`JCxkT?ldWPq-sj<^m=kFjzlJ7V2+63lN~z{XOjQZOx2BG0-V}z z5-wC@XlI%_fq0!I`(()&cL2Y(RAJOGJ4EE9E1E!EKAO$ur)tFmp~bI6(rJZT1%RF4?yck&AG}#{cZZ6RRv= zn7|89=9tIe`@=!3IFDI%2qcLZ5m-LWZh$Kq`E9Zi=Kd?URC{L6j=kGlDIZE-egU8r zvl2joUlDpD?ZV*ilTj%P(nGUL{PeVTr8h7_HcKfrl9I?{BPZ zAD0^g-PG-^t}IeU(x2u-so-^&BfNqkN^`@zOT>?1*kNYZu*TQ zgYI~*Fpp}!;Ir#HyAbg(??V8Hz(d};1cdbX($pN9eIXVbgFx#dUJW~LcnEjK3!KIt z7a;dE3ZT>(@>zd3!Y<-J^P=#{QMP*PEYHwd3O%^h+d%7^Z611c3v8GhtBYNf9rn8Z z6`&W8$C-uOrMltTvZ%+KMSl-tS&5P0XWry)-@OJ~z-W)x@vrV10~O;I2rNip8lm2M5wZhYa*_uaVh=IPy8jcFzPMb6ldO8q0=o$aPatwGxi3= z6m6~?9UjJF;;v4?1t-AC*N6AO6)G&87#AA{OUAiUW&Ab5+js2q$Zp0wj>irPItg3mhE+G4UxeW_J2{Pn=jG$rdM0JaU9y{%(yDl~b(QrIBdE%&V<|98^1qtHYzC?0RM>-r}sBMI_5BAsTY!%J9g@ zjsavRhkcUk7`PI<5M6$oN7d^2ahMbRN5@1{5&*h+xwo(?+}sdqXlQ5)w}t|3(bm>r zus71u6pS>q_Ot~fJ)y>)hPK8~G)Vt8x;BD1Y1Ml-nMY0Cm8DMYi@|N z%{Us`IqdbO#_4T>XCTB?5=c!v{qXZ5qaACF{2ko-RO(~OfuH@?mwR(MBhlW5Hsqjb z?rQ|~MO)hf2%il{n%f#$LOqQweSOik)^KAWGV{=`UEwW@56uZG3(<9}yoGau`1U>r z!waT}KKAdPB6WJO#iHqKZfxxdgc^}NC)Cv36ln|xnwons8=k;sQQC}>+2nkaIjvqen%8nHqHchq@lSLYrLVivA3tU z7hr~(qmAL-=C){{p%+WOv9GnQ7tCO0MDO3}^~K@-zvo#OzF(d-<1i%i8W|g{kFY&5 zaY+}`HLJX3<)>vzf?mqvjZ91Gf@Wx7%sa<e!owg(c*C=_M8D-N5*GH7y5S6@M>>Sv$>s~a-pFYs0F(Rpq*G|`R3K$ax1>~ z?(&wtPvA=#&&b_0!&0OBcg+m{pLTi6KP>3io#l0E2`B58aj_V&1m2rFA|BgMEXEL4J{3Uo@iSz(2M=GB?MO96Kw)p zpOK#AiX7WF*f%`14~6d>TG^_8M=ML16&h0sh`Z9<1t` zrVqBPuYc-GrKj4C0IjmLr?IUm8g6Kf1bf?BdYYnvNU$N;(%6dpZf!kHq254CQ>3|h zM%+{0K4ir>a;7&m4zUwXz-TYDRVk#Ml*G&??EE~6u#@!B)vQuIf{w1AsN_Ik5sU`?HUZLK{` zjlF%%;od+~TWeEOOQ@~4r@1fE6KUuTHMg}jHMEAnK~IbDh7ZdCw(j%JwagPQicoA( zd_Y;}Dvwe)jeI5rop2=3*3{hA+SnMzVs68-Xm0L-KG2FK-WCjoBGDEs_@>hgwe;ec zpkuD#U<};g2O%tbq&oz|ElG0?^^+rvhnB@p5jx}OLJduu%|8D z($?1;4MqBzoBGltr(+YI9C~nrl_7mZ&~M)0 zEt_dwL!QTihOQWiVi5;=`a(^iKwnR|xvi7`z9fTVF8P45UK~flME5Y>9-zjlq_-#z?U7G`g-t{E_|MoH%p& zh&X@d3a@h}xZ6UFjeTvAo;D;T?FqIuHZ+F&g5ic>IE3xDrKu+nZs~39ZNahL3_3c) zZOU@Y|34C{uP=C_$k8Hn;;C9I3F)A*5pqpaUpUYJm9?d%ucxu8r==|%0Mqa7iS~xu zLV=cOYtw0AcG8-2z3KllTo-(LrllDHykRKPt&Lcr(Z=RrL!c!R4263FZ6Pq1oV zZx5JbOZYUqP~dW}GmdK^Nq)#(hl_4KQE+d)*{<4JE5|+ghRk-Z#2}{ z+Zt>Mw)FHw`&grmHo}i&nikP72e7gDDg@xgcBc+V|&DmOwM6@nbHSDDAQL(x4R3#3SkERk$tkd9U& zL$dIJ!1z+LEd9`|1-1$?)(+8v0-}O#y03lT+a{ zQJ+dH7ujYDaLNQYe3)s{;rqh=#D~W|`m%sJWdahrU$?$2qknN;DEV0??Sch$P6ZnHz@a*Si ztXf`f36*E)v~+2B#}3Zq*})m@tAx3ceYC_B&ZW9eTkQ;h6z9rnW(8Wj+=eS1jMe>t z;i9uY@2iRP_@apfijN^bk>SU@8h3L_xev_!1+b^sAH3F0q}MEjuwpo&3>i+h!Vi=E zGY5=e8z>Z92vOxcaUXW)m~U1UO@r7h8%i8ag%eY#dCIQ%5s@SZGd%|2knz<9AV3{UPK?wiaxt~1sOj;~e(Eof+aa?5XVE;#xJz+=>FbpB#fGI=7lW2`k znQ*HRBsq;qzSGJ;Gpzz(!X6W)q?i;o$8UJWTc|vdRAUruP!MQ1K{krLmoPGk%Wq=Z zmnH~Jyw6~qrfkP1^l?we`t=>>cb~Ok1*%s1;QMqDoUmA+2@e^b2f<&I7FKYk0=Vx8 zQKqZX@TlpkG-Vh>0^m-C`yGnXz482Yos-+66TeR@%<_+UwjrDD5DL@H?-k;5YeN=` z=_`gmxQuP<7TAvMd)OivF?3J6O-c4#>Y?_3x;!h5 zT(f3HYa-k6{?Xw*9!7pFo!q>6eWSyJX4bDNoH?1@RMO5BHV1v@*(AG}Su=q_n$Z_i z#JUjG7rJ~jxWJZI7;i2HHA`zHCb+8j!UFAvm_UpjkMV90jPTTv`CZ{g^I=CoyME?} z>pp}~mh@KBqC%HaG%&>L>;GhqCrK`oh3rHa5~VmH<0TtpnTo&VlbJ>}dX(QGYazG20+t|XBl#wU`XD^Gr zwq!AWzsqt|irbc{jv*p7E+*UKD51sn5^Yf+mfG1^um4gME%+!Xq7zGPBG^RgMo)Iw zsJf%d7^Wr$dPA}qn(j;O1{{oB3ER(cNMU$0|JVWv{tRHfd zQ@dxtsHw9+a1cvHM(~(VQSp5cE6*yTqC|Zwv2Lg?E}?Jy!I?{Cowj9@#e*#yUB!uZ z89Z@LybrU?WF9T01EiN47`NyEQ%nP~r6^abC?DhBhIA06GnU(mm&S^I7#VlNSeP5J>=#d~v&|0_V|4lLNE$F3dXEGkg|6oxOV-ik{u%KllHXE$zMfv~}7zfe>yPN<4kF#-{_PZ3&sqTO4LYue6Y zqo{=fxmjbcWqW3MLfe*d@4F8r4zi{Cq;B|*II)L`(PIdfqKQ4x#?SjI^AoiTNV`o)Ht96xp*;pSgp@JP29*&V+dUs~AQA=mLZ#x*GDRg z;ruBA__!A#!il>i4VzQtIct`6E?>E(bD7M+CNE0>L>xysG|oBkDgS47LCL~s#1!q3=lEF@xTWf1@&bwdt*z?B8unotz*UBG>=K$Hjrkg+nd6@|=hnk{I2}(}+L1{J#({{PV~Bixy6OZ#l`>F+99I%*hH(U4JBg zrve+sbpLPstx3t~mcqaDuMl5Etn}L7`LpsmhGOR8jWh7|D3Kt&m>n@f7Ii zKJLH6Hce=cxB;N#3I8?IzjNqEp74Jog|0n;Xy$`=`_t*)}Hau;kqX!@F=()k9j5I9t$v*6F`7*%IblB!YOC^-#|CLjNtkwA4VYi z!)N&m>6c6WE9j4Z^=bO%zxndw(3*|e>8jU#wNt<$v^bkqe+Jh#Jo*AEd*1LRC-b<@ zk4?p5{df2HUbfMLk0BcT$M*y7d5!*A^x6+#*u%3_Qa8C>bmVbF)8CTq&!w&R`hHKp z{9m*v3ZH+U&(A-NatD9oYocG?=ldJEi)E2zsUkj+&fcPyQso1_tLWW_{VVi|2YtOs zI^FHhPohU=`Ol;~9`=>%?T`3#)99aX`R3|bihmcb^*jp~ye&A-pQ#V7_OG_(a430< z8Ymd_t2*#=caoeE4zAZ}o&T4)WF&_+~B^&JMpgo387qkt;-nSQ-Lr!83r^Y z?)f@h^VRQX$eX!gTAblf>4Jm)W%?Jc_pd9qBuhYw1(%+7yT1$9QT$HJpnJo9BZ_G% zlI5{8PDB$rHlN0jZ9d?5^w?1@ZnnW)ve=5)SUEnrFTTg{_AKV7s;;h%@5|Zcmj!_k zSPdcCc&cLLhHIDhMxrAkVbkIp{Iw1CG2D1NG~QQbuk0A|$UFRoBavOBxO;@-J#q0+ ze5QGCAE&)H_&vCF4Yy!O|0spTG z=m$T-LhTNMoord-FVdYq^lg**KXmLGUC51b%`7KxN={nmOwH2&tovWJXP8D{{pUaQ zAGgs+r9V%sGClCHuRB?;qiY}aRf%u9{-{sOj%D_cCmwvgOx>Rf)Ad*X;MN#0 zUX5iVVY{FHi=X%#({wc7ok`E$R*+B6Jm71ki=Xi;`u=173zDhmIsdsd@r>V2bB-6; zX~}c`V(NMwZ0`9t{M+g8ulpC$6K~+{tMzUNUHaFIY`VXuWH!D0y8lkveh>KZZ=ds* z(#N0kucG~-WGCJ82DsA`&*6fo==1(d_*?cQcCq?-bn%bp`~~!KA1*CAsNuZ*;pb56 z*z^8R(w|=Rze~|S`M*Z_uY(`WdJtW-pFrW&FZ#czuRh`bagzSzOa9RmJ@3zcPYShf zS6p=X7H4KEGS;_*DEKm%&$ljdBIoe4Kgn0=8TgxOpjk}FKOhn5cfY1^vVcQeue^F7}$>JkolHDs`elaFB|5%hH){s1?Fnc0#B&HQ`9bk z)e*C9c}KV9;Et&U-&ON62F9v(V=K1}4UdLsZ=3*Mpx+*PeA&=bDY;`?9r56MnB<*SV&9W5)_)zd())>iDjP0P!qb?z5#Q z*|;h-cc+$4;bg6l0!JKqbi>P9ehQ27tihHzj5!NpzATd;m`{(^6?rnuBWAjJcUmpA zUae+t5Yu5q@G?~x80JX=zZV1{2!kImA2n{M+YIt$goqod1%+_1sZX>u4$SYKIo6p+vox!wz(G$P*D~q3F1Kp|%lTb+9v$NAh`VJVe^sUEao}RO zS&KnTT6Us*?-+UZJC)qlK$p25L80_`m%D~iy4@A}!Y%Hf*tnN6s_S;oMFt}GcIF6~ zbl@VlqGz1v{zD2a_@;$JwBp|1zZR(aUES_pWN3fHsVY9c8ijACV_NSI@5A^b+v(1a z6*}^8d3NH{ovR8RtGM*)=+L(Dek;+-R)85(J2BcdN-nTq$?T+>I{MvpS(buSzg@xg zY7D$fEve2*n(LvX=ixTEpL~KDo#Gqltc4QL-=b$tAwYPa6G` zpS(Qf$t|->K4opEnFcFM_E?`Zk*})c;>0IURv{%!z=vCc1D!>Ai+Ku_U8AP=Ov(*0Nki{2qz68m6IM9plY0h`uK_tA@I5*Tg=1X$QW*@^NZQc1 z3m0l~<{qRY-H5y5zFb|hglWc+77VZkO^;lw4%2@Gk>o=l{_U&P-`L_*L;VNUK`-+# zX;2arAq|#NZsQyN;JQKKD{+b93kOxA;Rg3Q{rmOqpC-}rM)z`>>rhJcs~X(_8_g<7 zR`iD&+(^!JS%W*B9+(e`?Kz<-`b7)epHEBWeyZriI=4bwKIO{J^X*1|yg$Iz3sHB~ zdeTyNbIR$9wXSe~%ueTO3a(bHcc;?7or`_~2bB^Au0X&0Z1*=(X>YxI4(tR{C1$IM z-019!E#Kv)2-Wq+P42&?>i?PNemjYJRJTS)3*ANZ--T|tV`=VUvh7U5i7f5|*9(i> zi;`%c>TXFBdVi4iuhAOmsRp;|hHt(H+1iKt2Da^D4@QsIHy+-`BD)u}NQ)J;^yOXo6W8#yBHNh>3LFmY8sv$>W$xJZ z8<_1UptgbA8s4hZ)5?hADaN5om8{?H=~}&Z>6zV~=Rpn#R3Dm~ypUensu=&^bF&f z&>O)%B4O5NIpqu#f~sn-09#03{qSSxiAINTNAMUMK6?2^1<`o*p)v<w5jzuSU5rA!+F+3Q>rJwS4=c?*DBQuXE$T@jLd+};q3!>nl z7>%%3_w#m+#F9vJ#L^G?VvF|huJQGF5>L_*KPwRxd=oLWtP76{)2kc}hm|cgF(zKY zd1BhOxnDEuO#+HAKA)v^A%ciD>S9*!`pO9aYbgW}(B7Om2`J^+G%4bt3 ziV>Yq8~}C6-Ea&J-%-)l1X80)sA1AgY>3Hiu8{fVjky3Up*e%drdASjWv&~`;Kut+ z+G6_RzmZ+^XcS3YYyO&5KpWpFs-Ss&w(Jz1Jvw`p0v_96Vi)8~i;rM0Y0pc_q}A`h z0L-*2%N?DQQYffc&=V6ztV`f6P8$M!;^<4{ck+$F*?lm&A(UR3rEk)O#Mh*C4r4T93k>LV#eCBagsak~RZ1=`-k@aAVNEHVGl{cUZkrYq z0p5eV!Es;F+Os<8y5q%#XC;u2^|eT7%*>IIVtuh}{mM<9NPvVPTOY6M*m#C$vh|cr z8a3-CS2Mbz;9|9;%exde_#uND^CYqN^@CYrpEJ0nhpBL$2X1?#9t>q*ba;r3AfDk- zbL)icX6&T{V?&kWAm5RZ;ZaE7bza(fve?hL<0Jy;EZ;$~k29&p z2FCNcxnT<{E^;S%)p*Ac%n@2i>iO|c?kv<3%2?y-TvDkPtXN^_QM6*gYONP)B5$~wdU z&Zxpg28Q~EB?qU=b}MCk-Mo|L|2f%SlL%hV@bC^y>hNeJx_Wp|baW{?0&R$Wf?joN z4hf{#WMX}yKw=+ISb4FpT(f*FMB|N}Yc{N0y9SI*OxdK?d2n&?(Ujak$A?A#RqAO_EhJv28+k?0{)l)52B@EVvySV7&7Wni z$2R-W1Iwa21X0KP5j0H4p3KlHFye#(C(NZ3#01Z-mmz5J8AzmS^H*$ylZkm!H#5vC zCNd7`seq5ow#jS~MWouGkf6+6eI$%@kYXwYg~$xRlSe+O#&~~S6;`^SnJJAU#VRO< zeLpIz>*CPTfj_&7>Lts7Y*8CCdrumDbwZ`!GRIRU@SJZV(*J78V;do%pMGHkH$(^CqKTIVK<_{rA6wYGA%uWx2AOf zmh!Js1GFwzP08d(Vuzq|HLs|{I7O=StQa1Ton#_szfsX}5oR_s4TxNdE?cd%O~hIi zhoPpMI>&Apq$;`;W{+u_o__GwH6}|Wh^hiXavvI)0DK=veKLWVS%r$1Vo#J)Ntn>0 zCYTSIr7i2kd^B@y9)x+WV)TMG37NiV1{FFt@_`k6A=UjWxogdMb0s zX3;boOn^+Y!V-f_r&KZ#&)pbXy?F>TIy?b=h2>mh8|Sjzu8{16OlpW3lY0@;k@=8e z#UPE{()yG)Ofdms6EWw{Qev)YYcM(!!UP*|45)-eVnP*Px)TX&NiH-Hf|0*^5P7YU zyj3zA9I_hW-^Op|Skg~{burHvj88jy;YBPG&WRW+bDeU(VzCNu2l$|gMa%VDfcO|* znPv^d#wLcr7e*v09!)cX7#JMHbt=HwodObJ+@8A6(;wc=N+sJ9S$kw$jd`lLAYktm z0|U7OKJLH*CXuP7D@#Q z417rA91@3%8+#K=#(F^M-r@0O!{h5lqkRK=jTH_Y%IJCg=35OwuW=EOftIGf@WdFW zBkql&9)v*i1%oX_K;bFN_?OAvfd{~ZGg_`;+}B{%k%H}{0+-l#4Y4_OQbj<+PAmgM zyZQhbCOihK;I@;8R0pnAS7(@K48oT>Qo_)!HbyaLY*}QkRf+o)jyTGS2F6wo!x)^f zWzvZ=T}3rwsR$~JRG3I#LOAwR}XVugmGLhHaI+F&WqUzy9{x| zW8ipkHwJK>5#|jRnwrdOrs0MNwUW5x=6DOW_f5d!Q8fgKS85}$q)IJ=2L!>}d^(vg z2^#cR>+zJw7$*b#KHz~96YjbgiuEl(G890;cLZAHNNMN1^r8v7ba;~2TNy-V3b=75 zfEVTx5X_LbtQf^aJq?ma2nv-ZKI=U3_GCdT{}ekuQyk5U&dOORDOR)`yZI~LIX52H z@{M__i@g_=wCJMYfuZSUIKHQeP+Uec79i_=py@r~u?@mvN{iiT3cc2zq-LAD2VWvwYYSe^$_n^uFAzNsvBW4lb2v@?&4y|a37;HuG++k0GrcwWReW?W?A3=ib8j}5F`x!Q?PJhMvGZXM#t&MwprQ)n6u>>^O`OZ zZiUE$gySSWcnt_v#1#Z{NG!1VRP{J1KCcCNlru6sVr@EwHzhinoT1gn+U0%73M{iD zZXgjNTKt~s%uR%W9y(mCvR`k8^b6rItq^0@L?e8VZ)eF>$D+ornFl$b=alU{q8z`GEfdwg~M+2pWl|;>h?!!uiU~$1B{x6dN(pp|LclJo*B_3_~yY_&zatuO`BL%L0)N3TI{sQCv~A1xkKvgu?c zuD%=GrWELp_bG)ox`dt1{;H|_*c+pW-(}^w17tLPEOSu zt}6XRC*Av0>1V0_xzelj6~{{JY~*pNY4qOHr8m;Z)1_C@fqF+exnK8(Xsb(IOIssZ z#Z>lOsh#e9uJr5la-phnmwEaF&y=2L)7ySqx-o;DpaL{k1y=I5yBF)l1MY1$I_xQN z(QWbq?C;L467U~zwFZ;q@=+dw!Q%9|T*yx{L#ZK4M!(GMnZYt92YD!ka z+v&B^bo%xcaDf~-p{48Jm{T&##z^t%t>enCl2V03I0gS!n9z!<#mq|rbvH@qWkwMuOv~$^@@VaZ*V0Wi+Dnc#?4y6EuQvywDuBZEq(torJYiC zCY1=Eq(!nQRt zN*%8zyD4Wv$)aCZCl#g53<2Wtg%=fTRA$!$L+~ADCkEl{4!0Jgi7T!tEu)m*+wxPz z1G@QSX)$$7z$fh4t4mAsrwore6nEhQ51W?_O{-3pSw?MP3dmk)rF{~t_1(tf-C<^d(wM*gwf!ldC1^h?Y@y7XSM)6a8r zN~r08aw93vDoy$|mni=si9KJUAH;5sL(l(#Qkv`*0clel_INZR;%wgiN_T;4vq5t) z_m*V?;BPqXt=>Z4{iX8h6h2R(O^+%ywB(H>g$_Nc?9XA%3L4Syj@{ATWmNYQrCeWh zR9T*(FMdLKE{#6%xU!XePbm)THOZGht+LYV?4)B$54FRxd;BvB$H5AxLm`c#HH&Ax(LU|0@D=88HEEYa zAu79GsigE5ZF%(1Z@~fJe0Oq1F6#_CqU)nlZ4kBSqPG!1p}LX_Dot6X+(5hGWFCbJ zd_pzeSs+iZ6jOWjVn6Gx|s_k7O;pC*4_;jgPz)3 zq?RS%i*KyhoB#!d+lvs0cFdRVlPH~9L>`05GcEG;q-s=uAUSP595Y_!y@cg-Ywi8@bulvZ3g8UWi&O^r zs1P?yv+w)*D4NF#7MH!n9rC|A0s7{77V+$2SL1`oN!8_`;^P&48i$F!Wa|Rz z7r&d5(q?TWu}i=(QzLZ8Pf8v1XjW3%X{MYZHzG^t^n!PLVc6o zdKOL~VrB{i#=HiEQU+ugRZr;7HsMHyOP7^vj2GoU;^z|!DM(;>_!3wo}sgbVeKE_t1}@{4-Ag& z-PN(|oJz`n&{5)V5aAZ~=?b%UJ0!dV>5^-d5)J2HQ=6=-)Ni^*`Gbuh71`;wA1H-J zeiJKDh*ZeFLYbdL6JJtF%UA3e?!nR%GE!nGBOZ{BK2o95KW|mKY2tdg_~l)v91~S# zCplkN3Y;_4&U>a@R1xY&K`);y6 z?P zy6r1UHQjNmEtLXaP_p#@IIOsB^u~eGJgWM4Wggw~75MzuI+HW>Fa5jnW1B!rxrvs^ zu_nl-AVb0E_#dG$3*15goTV@QobqC-MCl}H7gOGJhtg%Edm7bJ{q{SRFK0+u^Woc- zj78H?@pR8jfS9m3d7}ZvP5)Ejh|jRz@>%5V8%kq(!?u+4?sSq@ARDws}IS`lj6;=m~*J z1=mjR_Biza40~QpqT9osB7O4?&-0nI?s;bl!2l*T}Qm99Bu)q+*RY8jdn!Hf zb=Sfb@pD1>Ubuyg3Dcg8-4(&K?7d~SgHt9$CK)#Y!2&M-FQ+TRhfrg2#qX_Mu3~!b zNoOG)ODajFA7+;nrf|1(^qA96D?M5cUG%h5QJ5Q;C+0@~vu9J@7hR57i!3pTctwxC z?y99nzTwKEyPk0t6d2o{++f+cubOsNx{%8w6a6(m;mo5s&*DF*mnwaEt*b=ff_}N# zwakK=4G1O~*vq-=_|t-#8cINoe1B@x#M=4bsCn*?%S6qOfSPL&iAZ01-F3sH(G(>( za~bf;(P6#|>AtIrGxfP$u3x9=Z$9RF#-=ZR!1X;_VIVNqj(Ztf=GwQ+wQt7PrhxwD zgRXm$(i`U5L%~pk{+ZwWQF0CN5S z0HTqWP!rd}M+k#8ABBuZ_=r7fm8I|@AGNjxxh?q-d&E7qwuM4;?XO(>%W;zo$_In3 zxarEMCw`z^{%mX2lYi~Hz}6IK!0TW`NPLR6@FUoYk@9Do2^oGgHFI6@N&Szx+}Vx6 zM!XI-;4?(~A9I~Un7b@}={H^2l+M4?6-p1ai0%SSEdWk79tOxXSGzh8Q>(5mHnakh^u2psE3*Ot zu7KNO1FiJhy{-ilxJ}kI&!r`FLf5WBFAK!9iAc2X=uIYhJmp9IY>F_zOymVtLpsoL@sH$v1 z?%PrDFL^9O4`i1t%*6Si(LvzeQkDAdQw#EC7Wisto^n5_rfR>-Q*t3TG4s*>fnCdZ zzvAtRl}6f`TT-iE>vwIp2{xP?N~eR*JMA1!>e4TK(X}a!{`X*d0WNX_F)?9O z(XkV*Ra@Dx0AHj4E9pUDx3JpJ#2aCHluo;d{^27tvre`2O)wgOe?mmK^I8hbr{jlR zxcH7KSkz+C%0~x(==`33@^7yHQ0VD5T_rje}(Ccx>&TZ=ybcdjdD(SP;3RXu%>(Nn0*7~NH06G} z^Ddy|CWn%4>!O=dylN88EY5CpSJKPZs!IL_ob*OU2XN`uhUn;SL^smm!v!#|r6%Xl z#C=-2X80R<*aaV0VpE14^g_0Ar5c^gqJL`2t=v-%ZPB2!-r-fQrM5TxS@aE6xrM&z zfX;Y8#YxY%_a^1igLi2e0vN7l&+D4hJvCM+`_Dwkwg827#6dW`5BGLQWq>ynwr;7s zbqn3apic1})4?agd_1%KoHa`~B9f%Ln|wZ{M)SeafHA@=eeKBjN>(w2>d7j586A5u zFNN0nl(TXrNlK-td?8(4!fCpX`qQZ57ruO2_f|^UidaKv!zW>@T?D8)%nrt?CJiYP zMPMag$WzT^)-IF5(9IiDAyE31Yv?DxMn<8vmv}NKmP)rn4%8OjgGh}dd*Gk*=E=D2 zDmWT=_!1({34x-$_<@^thH7O>6U3e3JDf4cIb6%AKPHaN@P;*Oq#=OSWlXpvCV(2^ z**9Q?lZ*7DWxzqa=14h|$m(`YV}7NIe*Ej?5;25i{k$vc;UQJK`9Gc?Wvz7JWOSN?C zl@$dv@t`w}{@_p!rV2ZRep#`Si41+S)LAjxgkIxQH`u@&_xsf~^24D&>sQ}QqS6;| zD(0z$WoA#3y28c>WCe8LaRsORFWT19?Z=h3^x{r$X zuevYa`ULw~|A_t_ui6jajY4%E)z`vRV^y&VE9K=5^$KzY98ns1PRZ9_C{zz5OaBb` ziCoRj7xO5+M$OmL^VB~j)03K-75CTB;ji%}7@A7dRQ+U$`ml|T*wre!@oYzcn=7Cl zHCi6MmkoJJfDuB6c`*&{9g$+8i7$DGB|=L<$3h*0@WdEV~tBMvMIH( z7c7hRg?H^3??iMoOe@p2q(8Sn%}-v+XpTDy$DJvC+u3gtJ{7n!(8Hg*`LkpFilxTq zrb?NFD_X6;(XMXK*2AmS2Xb`J1?tObbmqs9i74=$wSM{;3 zEZ8+#K&h!+jLcG7>G&!b-(Kw1yma__HCx{rb$&aUf0xtY0XWwj*{rqDV;4f|-})LZ zd%Nwg#TnGlrCmZl?Eurbzf0?-#a~AP+Ta$gPk#IQ7Hzxy=Dkq6NPfHVLakqZE9%xR zzu`bi5#7?Qt&orY(XE{+zn!;LTP9xKzExX8p5sXcbUaj)N_k=JtCpWX4Wnx8t?uj5 z{*pw;&U4iBe_5%>RWu%@JFipgbC>NJ9D!>%KfxKRj%UklTKqv*{OiggI`NL9!X1BN zdAVWNHg+-}7^b`%(~zt2b1HZtutmVuJ^Fpus~vf{IEx*C8#)3ukj^WhXMauIn@;Ck zkd$}mCrPQz9FvPPTd@8mMqV5^j_>g-H=d535#7Nuay2$XSyB|E6Bju(y5PT52NLI2 ziu9ErWbA;n?t&y`)}%)DU*D?UnnITzPR^T%$U#S|;^SF4Gy*XKR#<$@^~9gY1~-Io zgfVlZL+mrpS#w~jWPWImR}c-&nq;snfxuBm}58RQxQ*_PkixW~&0iGxazpwfy%oytL)Oj=anC*K?<)!KIU~- zI!bdH8Dk^3l~>{kZ{4ZlCRF<3y=rs0WNCv@xUW@h22W*wpm-I;M{sKAQvIEK)sy8k zaZGKXwMW&AT;s%=_XbaJo_ule^S1PSFiq>b2IHM)i!*!jyO4M{uf{0fD|d}~n3?|Q zjvbq#qdlBig>^0@Hxh+t@gLQoKKzurC6!J-rM^f^(}acE_+^mkDmTt-2eHx7mK~6@lc=5T^m-eSh;2+ zoJ;U!W9Ry_w$KZI2Fv|bdusl?YH{BcJCcs?!^x=B?Rf+cUNvn@fWo>J%x2nD!(qNh#q)Vy>AY59IzaN z?4tPORmfW{Kc2)XcOF-NldT6Xa8_qR)H*-neB7ox?$iE=#My2~p1z{Yaeofw5hM`j z32kXo1FPv{tR*tt0hfl=MLgZeX(o~2lRu7N;l8^1+nE_ucMA@ZUU^M>vM9DITB=d_*GWz~S&@}WTi=9L;EmU{=9F~9 z@sHZx#zr@Kzg9qx+)$cExyjhg_r0y%T1cLJN4b9B0c~q?p)r_&vGviNyWp$@r0M^B zNOK?&xZCl0Dm|f9QC>sw5*>Ax*yxErXXG9FTC!8WrofS(ZFzm*N7}o^;&h6x_BiZR z_mXx=**R;@K4A(o2x zX1J7y?+|fh4>2DNy5m*NLFc}rZBFvk(f41`{)az5^{Tcm>6|sR@>Q)(6W|EPB{<`P znvL*Svbohdk&KP{k84r-v%{9_nxSvXtAU{fIYj#y=^N=~wpBg)q_zfz7q((8ZYcJV zGk`Rz-*G#Tu0F@nldNwT)84RA^$~}bkE87kSW_LQTS65LIc=K$@m<=%3_UNs_-{5^ z@hVJ-PyGcJjOxtdPs^XT{SDdDAI~hlLj2S}ZZG~~65a8=q%=M6Ms2^1w*EU@mp}Jq zZF{m_a+&s3$ovP8z5xwbij%{(gI zaf8}KwR@B7DXezsuIn{O8hPJKDvq_5rGMuN?WgJ0CaHIU|G|veTUEJX%iylzQ{R?-n~wnMQ2^7)hw8{#m@EX zV=dylXt57orbD=8u73oXs>a6Q_dH6Uy-xGfGug%SB}xu{OIwg4zCvQsuBHQDP&4%F zZq~9>Eph~1HlbC$FM$g(>MS~Z7oeY;<+ax=36J&1ch9xE##yk5>nlE%V-@`#*)Xl7 z-T0DLNr5~y)jL^f5vBrh|3J6EF4B*6e7&&HZHVHAYU8PtgGwk;#s0);F?RMOc)zA`%U zUSZ0_1{m>&w#8h?g+zd7Mm~8fFmd9ArP6w#WF@?07A(B*(yp=Us?A-M-YxCbRdsXl zU;Bb`mQ<>{f>rGcef(a;I>!6(jn89&PMo?KMhj^p=Q~R`idTkg$mdC5ZdQ0=m(LeX z7)6ERVF-z^u#1fN)*A5IuSZv#2j2lMH2 zH`1Kmat(o>sa(>K*$29)bow{Yy{;|u|7O7wp0kA%SWS7;HB&+xKAQ!qfbc# z!iHd3LM&HKDsNJB;&5;lcf7!$8+lsk!Juw=!pN}^LfG-G3n4D}U9x9lGfF93rQfD&XC zd$Cqb|0yUUPqZr>*<>q-pR_9_W}`-3^cioCPQ0a+nYJjbhz~vylHJ8y6aWfq5pzOe zYn?pXu}LzP&>3>=O-AojN}CE@;zmJt-kw}Y)khspI&!TeCtdR5MYQwNsfBdj<8Z3` z%ult#34Sa?_6-XK&n0ZpVuOhRC!sbU^XZsTLR6oQCJj_r%Si&@LlVIjIotd;WZH%! zx#(y51sDUtY)L*qzJP=Wo27{d2L5gwW+Kf*!rSUCAX=e|-uYEu;d!zBY5K;cR4dIW z#&q!&JjM>_VP8WdW?jA=mpewaht7T+iVCCEF44+oFm&`$hnrSCquB+nVKPOEEl#t4 z3XUV^DLy>@Jq?0Q(BtvR%yOsjBP*43N|W81wQD-3Y0&7Gu{6!wcz4usrn~6SE4V2r zu*#8^ZV1uz&JqJG8Le?| zLYmHr7sE3O7Acx@aM#$lA$G}CEMOahahmFuCzaAO`wI&;CJIAr=aqAXoh%LwLx>db z%mgHllQ=j<={5A~pOT$zmhL;O%Y*@l2`wh|af2~K(6Rl6MO}%DRBlZ(gJx~(l;ydj zDk?uOt9bi|F;Y#s#tKb<+~>`+G-VpP5=>|G?N^E`RM?qKZQSyf!n5tJ9dd@^TeN95 zllT@q8u)2n$!3087RpY-Y?ui_EH&h2AlXTIyfB^Ei+gWI&d5ovFa?tYkw64h!<^(1 z8wnl!mBV?%R!2^*Y*|bdbQxZ+Djn=_q&dvm@|ENu%p62j+WMT9N{dfw_WXDQLiDk= zK~J63a`Gk>m`6`VeePM4q$+y)UYwC*38mA}6aL(6t8_vSky2PDByiqKS+knTnGWR^ zmRx9+XkwX5eM6&b`vkICdYqPfNo-EjDtnv7s?*_Ct$dZ_hLC2V5O6dST;*YG$7MVN z@I}GuWTzGOFaUG!K`vovi$Z{v_b!cz%*(hWY7mK5DR6VL>P!$7z+Nr=-T8G~cL+r~ zFBz0WfBXY3BWh1|K-j@gVWAVu7rP~kqtihz&v=AvXH==YRD|ci0xz2YJ@BNSvIUHP zU~+xMLi0vi7KV?td;Pxk&hd1@|Fg+cqphYVKc|k+gEy$PG-rbor~G$0()FLtb=qun za#hkAI`~cq4 zZWK{u)pmMnzEdr;<8TKu`tTlvS>b9+TufKH2um2oE*wlj`n0Wv^qJS}ETYo+&cO5y z)h}==wh!1|3cc{EU!#9p;4IOD3!Oi(`Gh>&k6ZOFMu1m%hXm8dH;KX>iSM!kcw`ID zg1x!j`A#ae&v9nhR??a*XY2ZX15u=eV@)eY-eRolMu%}>@ffo8U^v)6abN`uAnPoD zfpa6Yhr#e(p}lm4 zWP5QT)!wYm!gZh~0H$e+Pr}($z|yZlX7bg1I&;2rj7rZ4AZ5F&RM8^oO0i)$fVyb)V`2uKKJN5 z7inKeCX_x)nvQX>>!m=xBU}Hs8tukpI{sS-8sebY{X0hnMe4K({jYV}s?-$T;^@3a zZCL+VqjqJ|_bauxlGsp-FqD6&<@%v?ttMT+#-|;&>Ay?T>`D4@uhw8Acb=nw>aRpX zkvbJ;4y%0HGCGp0Ev2%Tv^4r^I_~yiEiMfh|>T4%c41g~MAe3?wS?&K8u*_}99`_&5V(@AibfSez>7^i*0;o#usR67k0;PRCVR4nz^ zb~t}SYK7vJ=KLco9Ig8G1J094#0B-22c3J8DCca)CmEhL!MT``A?AkQO>jrZF-%vU z@5t4UZFl^=T-4#lXXCzAM;3kN3l&*Dme;11?#ITruHw zjv(B;6PpWP<9NH2`<YY2+>~ zz$`h3-XgV<4fthr_d3;j8F z-&Wk4#v`s|j9*E~J0V>^bq0b5KKFOWNF%G#8zvuOL#BZb4~}=v=v=+J8?Hi2)^1q2 z@qA$~KvX6LZLmbW@P?l7UH2X5P{{S!I*`3rHydf0WluD9rEYb-mY*Hh&DuT z?@upq37sk`T{aA-7)-p-dFkdlTj4rWrW3>lLFnT7Wo z$Y?9C=BLXdFuxe6m5sqVn=OtX*Vuf$eruX8_02E~?UdKh~Tj zmS@6JvsM^wWG~_jEK^GF#vxcqNnG2Js2mKBu>Zp-WZ?ggy*B}ms=WJ#ugUD^%$Ys2 zWSxX$CO{GrcG;2;5(tDOkRTv|BqRaCl7u9P2$-N&YwH41`D?L)t<_o=Kx>anWvO-7 z3i|leUGP!s4r<-E_jljtoSDf2c6q<|{jTr&dOZ(L&bha9FaP_${{9gv*%$~6i|>cG z$tBc&1LxK-PEFi#)C8Zy{K6@1n>m%{d^b#>-?S!S=PwGl#`FW0!E_9yI#8$L=(TiX zVKm}I+wL*@XyrM{DUJx(^zJByicsNWhU7{7R%->z*a2?6OOsQhVby9UlP1+JC@n3k ztyT4?tSqk|T!Bz|BqW^C%3=%nw5d(efmEF*Ey82~ECL%T^9@l}xu*m46bgR&xXP8* z+tR|7&rNH~PuCWPg~>$)CKzI_JDLA7j9$!G!djj*sl243a>0D~AK{i)AHv@fp}q__ zI99Bp3JTN;WD<)j)(D_YO?+X6nfr{Y_SgD?7Mp!Bck0*jGe^5o%ECRLxzk~sjIf8Y z6~JO%jf({A8b+G>yP$e!SJxSd$UkLahT%Pto_QdUPX&JpEQ`86+GO$Vz$^njI>zZP zQb`6TL{+LN2Unp4KkiXSIzjT#`yU4E0W2YFf-&5RH=eq`soDy6ltWJkyzCH4j8~0FdZ!D2Kfv#;B0CsJbjCqBw6F*x0D;-avN2 z83qCwjyZkuo}uaj?LfzLLt*AHD!x51{XbvCqdR1zXASHXMa->P$$tZE4W9HmsjFcEa&$ z%Yy;2m+@5;;ue*B(V~4m!I~KnbUyB zvxLCW=-Jhfkm74&nmI<2Ea|iXJvLvjZW@XF` ziXw}p<7Htnd>Dv~;obCrjaEPcxusCic7@_PD`mY6>I4}|S9G**Vx80~oeYB~6$8rR zS$~y#F}i*D?TOi-BY%SNJ!x&iBr2*)5+=oM5$>f6TYgtGvs&%qx#iVWi&^gOn#wZn zg*&5c`huAeaPsxEei8E8GIcQB(2!8%R{&A?7E}IF+)wFLSAx&0tRWa8#x!PVZ+-}5 zwA8Wr$jjpeGLbHg?Uks84|)wPvy@VC;4)*QY8tudSy4CR5~UY*sghI3_R{x11l-pg z3RrEmY(uGsi%K#LiG?9hsn8~tzKxGVNfClnk6M;C<$(ge&r6W=rc`9E9M~tQB)*ZE zw_>l9YaljGt{p0k*5t1>=J{XaOMA7`xwd0v&Jq?JDnzEBV`lD}7Rhg63arTDymfgk zp;?pKCUvu98B<10p(ZCO8L*aekOF0V_trb^EbK+8fMAX0!9%FHZ-roA_@{9A}lF}n-=?E z>MITe^*DX>&dNZ614|zN9dzU!U!<4Q9_$wN^Oeninh*obXne5&lb{&&2JauOaqJeA zkTJHbn^Tvb00>?5m__pIp~g@`k172QUnn6|M04-(`KK`DuezSfan-h@vd4zx0L(Uy1M0{S( zRI|5##0;~MAu+K^!x$N0mjXZ63VJ&h4H7cD6VAMT>dqfx0addTTG`M#Dbzb~aCokC zkG@qZ&nU^iq7mS6y79YHxvns1rZ$TkIG*=n`r;K3{CFv3HBQp!WKo?A)l$hFxZ+qw zz6Q!JiL2PpJ3u|U@XLuME-{7hXKsi(r)PV6vlzI87IK}{!JAZ8WO8UL6d%ftS2BUb zD4Xh;%hqJzc=#&($Z%qVu_>1XUzu(?@tNP-st!52NFd*FeT0BYjvPNq@}CxVb;K4; zJ=@CEt4_rXbt%eYv+q$Z51QuC4;!VPq$xb&Y+6}YS4UUIlu^oGxRPSmU@O0$$e9*Q zp?lu%8=7SAuu4 zvR&DSsq9g_6A8nyQ{X0A+JK9Q3o`EQa0UyR(W`P_>YJhXFP?fR&gcrz02a5ovb9U& z%;NSeA2!yy|A3(|9;CQac4Vod(TTJ%LczGo9JGyy`+g&Ztf26g13OYwdo-^GI^%-J z0)@8p^6Gu_|0p!Mdnc0boAFUe=da zRF*ZA)YOz!%@|Ijul7%hDQW(5iM_wtMTXjCsp{G~sc~b%!xReoh7E{5j#HChAF4DtUQLpXa~5H7cw7$Qf>)Fyhm@$O zxgw-npWunH-8i-JtlPgG-#dhIYp^qxs+<@;d!V!I~(-;b|5He1Z}f zC_t&j>sB|6}Gzt(6R7dd(%nb@^qV(bUy@C+E>T96}Z)?U)1bz5g z2JYR_F60gVA8vg?h;1OQ1YubNn?fsrb*re})Xk#c9;ORwK;yhw(@aQcky{s_Hx`%5dMylFtW|> zS_Rt!eom8kub6!%s%N8hwjrotf54^;f-i?U`uy%yyblaBCS(i?sckVSp0~eoRcm`I zv_$ON__DA!V3AhC^@P>u)p>tv&A4xh>mkM$592zpmKJ;z7K_1$0q%u=A?!p<55<)# znHP-8XH(SGtiVe%j&*QfJWKGXo{mw2JB_aUj7^}wZM{Ff@_BqZO0Tdwz}biCo%kdvnm1+I<3^4KhpS6csk}rO!`e`0R?g=5Lx(#(x)0bXT{S$D4TYU0 zRTrsI5mmEEyZ-=2Oc{-$)8uN#Ojb7&ED>8G&h=_)z053b`OXZ%3XV5jz+{3tO9OEN z7sA&9%fV7lu0&Ga_JLZ^7N!-(P0vK9+z{h{=-zt*{&X0$cz1DMz>9_$W1#5{q3kRE z5f+4VqZ<7L$x|ecoQTpdHxX-=I&{f()Rm0iLBDK|vs*C6fP*#-#W5=am@;h;E;wt( znM!*3KtQPHFIb2H(jajFs+Aj{MXF_*Kkg$R`^0i~@TLOmYevQVh6Zp($n7{^McC<% z--|5toYe06*pr#^irjW-!UdL~d2| z5a`5%2vvW5VS=e+28?6P0LxGbDTDRO4FT#0+@reE(Y`~=H-%~y<*-^hHq^ zQ*C0CVn--n2$Ao`mG-2N@)hx>A9XTSJ13pGBe$~rY1Zf>Q=v=ejk_hI%0+&5BHYxFTA%Nho{kO8xR+xO*_MW1N(b}t!H#75fEwkmoF$PSoD?ijByR;;wmyt<)mQC(RT z+Y?L_%H>yb&W|6%5fR0)fg8N-`w(t^_`X2p{~izYn`HVCLl0t+e)r;KRx@=8`AR+!MSWNLR>lCV#p&_>w?tzCkn&FYcWgbkY5{2h-_} zlAuT_w+A;VZx8F?Q2zVdgV)nxU$DhoUkZQ54P7+SA8e$SS5sZqcINlm(KTENBW7cY zD4uz6lM66M;xzhYUr><$Kt&9wjFM5o*m3cjP4PyRGmY0_G(a6yiRzjs~9%myXmqLyBH zIG98GRv`6zWyQ>@hPfp*Bs~&bOm#+NV_Nudu$#WR19X+yHmUfsppzQc1`P7`j|9_n z4&^q0mxfw#+d_XKef?;#ma4zVGKtX_P$fTeH$V@%9}E6HQK=L+1QyXj$DfC*_$80y zJ1m)2A02u;=o{F){O039vyL=3g*1i$FoSsjnrYvc!FC$^VU}B-^i>e>GcRB1PP(Tf zX$w-|-5;DNXD1}xWTXablHInvsjGAq?s?p0Idswt@5hqW{-8Y5k~Airt&o*4V@4V& z1;^80uX317rPYXqAs%75r5Ky?q5RCi<=p4&%wnXmung>BiD| z5$ry?G8H@W5AbXobpT5GeNO^T1|dBH9lsg_W{K1W7Iz~hASUDKa{$qHYMfE zRp4EbZw8YiMY^pPZsq{DFw%2b!LQ{9o(TRfLEFg{FPV5-HSE_!%P8<_&zap_{Ln8r?C(TJs3?Kx+zfp<`CK6Lb6Zy z>%o} zP6bEO*C&H+`pK!_I9;)P|EXZ5nH_ZnSwlXV9qbjUpfDK7iXhK>!I&{iCr)0nZ1U0( z_*eOR1pg0nW*!xh7ZnB*5_sZ5kgwh`!NLUEbZ$tb^vA3g`S7^lL^E*AfT(+0&?LL2 z25mZe$A(C@{AoD13@=TlY1lWaZ~60yCi(uN;36HblU)*=tyLE3ijv?g{?|Jt!CLl1 zu9_aaG{HEtt7AhaJwGE@s{Ra=1=mfDL!v-b058+car3pm*pgt)X7T8O+E#caF#0zi zk^<~YEHjryD@i-cFxJDfB)BOofxGil(}4W8WhVZqp9MUI+;R|_zGlfx)60XIX;}V@ z)3u9K5S=rFUZvjl^5Czh0D`5it%ozBs;kE7>tfGoke{5D`;8C9uY+Zf3Jh>s5njo>b2tEUB*V3snknJr^!H{k#UEdU}wMSobJcj7| z%m6c4C~*_fB8*kp%5r@M==%Gx!1c?6PXPH+4z~m+i^i3FDOx&$4Rq~T$xDtavb@w+ z8a#^*{XI*Rot?pbI{Cr%!I64;w>1lZzUTX$H*W~)NOx{86=18q!G zoX-lxOcRyd1-<%LUj=P?xC+W=JrtawqwXb1$<%RI@E{HUO0R4<`u^LXjUM_%Vg{}K z6c8hO{wqO{Z@N3^HdDdJ0kcW~%d6+lEvc)O#Rr04n(2=%{&93THwiGveylEh!v$m% z4O)#>Tl6W^!;vxPl3}hQO-@NcC+eiMNK<{$niPbzsur_=ZGWOjBCrr zzjS1g-(zDeB|-dL-CMFEqHv9|2GNL`5k=g^9lntdZsXde5E4*rGuoU zek2TClW3x|3Ip5uL;5T~a1ndfO~-QslW9*u;1^2ir9%Y z(}S?e2i7M&Z<3$NO}RZpU)`1Fl-FmczF#NzNx*=T&%P^V#1guoDHNo=Hz!#M#Vm5e zs+0>8lE4Zg2B)mO87Yupm1OoiZpdTT>gtrRZa7u0NeRm7Yf^3*L96qVopixnNfO;~ zO>#i~?wXX|1S)tS$uNpV`od%Y(UGUWimdHuUkR$s!Yi9uWNZW%7og9yM^tjBHF4L0 zB)|NNYg6tD(w(^}qvhYvO}QGb*Q*i5(|1i$5r7O?`qs_Ypu0cboHSx-PR@$89ZfJx z)Yp{GFJlhpT#lInijE+jpp5|t| zX=xSu+*^oW#m{FOsi_)&;+KtTeHND|IeZvh0hJ1ex&w)XQ=psGyE)V+=TFzdtKp+X{tMXgEl`eyAjQF zp*QTNHFF@+eD^sxSzdC4Cw!RR_k;B1!G$WV+;%zHcRb>xjb7_@o zJJ*)Co!8n@!W_XU+ZX-~a+`8v3q9rwrzffN#f}OS>5!SZwS6TA@h81MJXW6Q52xwm zg@JIlj$S$Yb9^Hfphkg%P6x6_H426lR9%f;A z^BL&p^V$AHR;zYkca%~PzES}+x?^HElb$XJ&+x{3TQ5h(1?VHE(g`C%FU~(JoJD)i z3Wx0cW@F$^oHWqWct#(c6;7c?3d1wWK03UBT1JPP>9Nt_8VZgHC)1cQ*yt$YqmD6Q z2mRvvKq9T16n0X5W;jR($Aq2n6EpZ!eK9_~%&iTL-EUKhzzW74#FT*_$Ipm5m;9)h zx|w5;vcUQO;%sg&%+A!WLsUfd!#Hz%TJNvU&Zf@iv&}=#t$f{tFp_EaxdRr$d8j==l%V?WQhC^C~Pr0Ifv-Qs1dc4*@23MkPU$m`#_fD(Q(CVK050i-SKW50_M9 z8FsUu{kktNEYiby*tqZIg_Eorh#x{f%EDXd{QPh&JzXBIrqr3(uG?m!8h(Z8iJ4(r z{D%C|-Q}moLJ-~8pUyJ=C;P1MlPr(2Q-*()6`_B;o0Z7vI^TPRA7usTg|D)lbn$#2 z#Acl9q#@6>ay`uJatEn+OR6zx=%c~!kP`=te(FgIm(vgP(kwJHIeb4Q>m?g4ycIj? zm85VBon2>+m)5s!4f^TOW7%e^O~IaNPYGW}U#5g_p}nc$gBk{n5`qR%4(x*#M33O# z2wQrlqGL`Gs*?G1MSD8VP_VkI3fl3(Emy5=odMU#(={Dm;QNIcWBzu%Jw)31Hht@x#_Un4o!<41n&e z>2({xgDpwN34SXLMDX`Qnrm46W>Q!C^wnupIkH@rrGpTnne!}zFO{^RPfj&=KEe*D zu0lxf`Z?YJ`TmmWrmV5yJUV-9xFC{Vuh&p>D&$4RE$}+vnL=(xKmajC4s& zvJ)s!AhVphVibicIvKOVf#UPOXxtasM`-O&^db7<`vfPhub|PQ)u9pt(kzvJiEHqd zpXk%5JUPK*0jcK=QsK>>0JLb?BdDQPKaR{_;of|1pWvYn#z+D=Jz*Oaf0f-F|J8Xz z&bG=2DSAfc^a6AQ#5r|H2slHaFX0X{V=oE^ zzL;M&xB6`UYIN)sS-#EAu=j6))@O(Pa{0H}Svp$tUG~*<@Utv|EZ=80Qrq|V>TAEx z&ZGyv&n~Cr{RSshKM8cp;1Ai8EgHu~bw6a^irB4e*ELSu6>qG zkagzi!u9mN9T&ory6{zre48uCg9uyV95N2>`h;+!9p|AHBB9DP(}{#|u^9J^uGHf& z&(>qR|3nX-@iu+9)T=b7#-?gD4F+7)BMsq&bde#vk2XB$cOZ6 z7|Av;Ay}OS4LPa<`o<9>LZf-MaZ10;Xrfmw;SBI>j8l}qw}ih=aBA}piotydNoNb^ zcr;u#MqqM7d4=pUnqmu|O*?Jj%~2V}E@2`uy?&Z5fdgMAg}ZFn?6IkTO$rA+JR^oW zr4V7}V4soA9v(AE_5M(cb4EYY*;b&C^eCKaEU%s5HBX z7Jrh3)L1y*2F6~|2gi^?e$OoI$QKVHj?Wcr2Y$0T%wlnc1S1dk!!JWcrg+%AuDk!UDZj5iX9OyweQS{*UZZ zLS~gj5qo3s&9&%Ev=o<8$3}*m0;++Vs92Kw`bvAZKMKSv7L(Db=ZXr~)O}RTZwI_p2aH8mqyL-cb$W@mw_oqsy`~ZB+HR!%9L;_`G59?W+#u zQs5fyEO)^hV%z|!b@AIkZkzpR&- z=8bNCS>J6LRi6(bHER^5y`rzD?bn$s9CH9yPQU9dDN3km!5Pc z`^%~p%*_qeHPp-p#(F7W);Tg?h)#6kHa)u3DN^xsLb@E-A<4Q*;GKZqDN_tUEb4*T zrI$pM{7O8?k7=U8b;H<XrZNaV3pvJk6$ef*V#CwX#)!eqD4(h z?MY@BxY2xsnqGFncJph8MRxx}+LS;Ik9tD%VU{h8u6opCkwThDne|J3+woOLU$cei znU#`VerA_cq?eCRv-Khu&>?XRjXx>71}zPflLca;HJ#zA#<$7dEC$pI{`KAu>fp>1ScK- zR2U`aeJUL`(Dpa2!3Bd01Cvm}JnUvF;f1S^kPfPkxYn>qlmhUig2@y1s3s&~+qA9& z5#M~6t@Oa>QW^N*YA|)RoeOD=CO;wN((8{)A-e1d>2~dD-xE?Pz4o{iq{&Z8 zkE`uvbbGzze@a@S{=NPw=@)eO9eNl2kRmzd?5CyIbo8dj;i8(2K*IUpDYluOk;*_( zj}<}9>b%2x0fh<-6@WFu$(wyt8fhHGwjdqIu))memSaqLWCs`fh)@> zTLz`S<%Tilgyc<_pa?28U9F`Z2Hm$lq-T~Y?cj#SUe>x|7zjvktM-B5 z!JYvxkvlii)7sS4(y@^lTBn7ODLB&7(eF_qyU`B5FD21OZ%g;l&3~8PqMyAZjiZC_ zNQLy#JJLFOP))!+pRQWwaL99# z>`x}r_8q{P+MD6_(v}Xdg)C1QT(oDjWRWWi?7uhAU#~OGroBJ0WXh-Bv_A^7=0VqD zdEYL(7rQ3e_ zNVY!Rt|a?hy7M`gg7+}_#oe^sBw9THS8iI{s6d)2gt?pEyGoiU7d1-Ha`JDW zL$f><`YFi2p`xm!65!>a_212OJIMMsSPeTK^*AZ8)8w30sY*AVKjHfqv;;5V3C1oNuD)a0Q)BrX>X6E7!Ccq|K+)*$S+*>82N;c$Lm)fy z>#L;QIzQLX4Q__^w@HZ^v5{#OQ_YMCplRmPKU5M!ozCi=f$jMya?*^2^Vym!31xUW0g; zzPT4T%A7qIUnSw_6q`)P=<{3bvlVhD7yZuuwLp8Xli+!NqxpSw?y||%cS?T}6)G%a zh@y_}3|Z}R;CiVThPZM|K0P?mp2SFB2S#sq?;2zLDZSQex5-=gNUQB^qFQPHWI>W` z4@gfKEl`s4O+m$JmK6BJ7!lrbMCzom-5wXE%mG2>&ki4vat*93HH~sr?YhS`L+-mk z+>D#x977S^{+vsc53X~;^7*%Rt51Hr+tqHAx4&n3K_`#B%5}M$eP)-uKj3~ciO#-2 z@29KAxbNe?uqP()Nw!zw!B`n%kjjd3}y+qPl#(N>`3sA$5Dln~b zVA}iK=%wm9!9l?~xVUvLwMulT&X|#~qJsJ=oqh^en;dl0R_A!Rxz2q`m(bQs3(j_r zXaBw8Y_~tc)}^kabS+3Y_<}e;3m!cleMdi>@9@(P7hA{3i3{DAVC_bj4?0;wuy*)d zpW9ly2^fy&QQ;m#CHo>9Vd|U-)4Qnid?}p@9yT=4gcq%@;kZ3|x;oY}pdN5ufCLK7 zT~J%c+@4$8x!tOT=ca`g^z@h+}K>s*X@(7Cd)5G9q+fy=@NdzsGE& z7YndDokk-z;KSmC$peQ}0Co|q-4dk=SFDoheCp;OgZx+=S1rx(2f=sZiG zx?gsSbl7OM(cvRDBW0X)kEg>s4fceJa+-IR4XMRGvX)YQqHryp@ChmO2cIw!$!HPX zzzI|t9R7dUV-3>#J|Tmu=fVZylA|^^rTGPiku&a8eZ9+1)qdgKMg6Mr!_OGCrqhiZ zdG)YTgFcI=*+aitZUD$Cd5J=5fUU6t&|9(si&v`+k=Ezo1}**qM|egMZ1BUEo1JVU z8D0I$u}|4C+vJ-7CR3}6XVGzTkkvs|_-n>yZl&Wt_`L4eyzn=;s;E35RMB0}7~E37 z+LUn|oVoo5mj}FqNi=Uocpixk8SHdq{PIE1j zBN1Dz3ksev5(X49UPYOS(^OtcI|72&qE=i&+k!&C$Z9Rwb%QH|568Hf4TpC8K}x0l zslu&v|4FMr&-}`1r&ZtD9P+j_q1i;m6Tv`s8eI;?D+}~PmT)!w?Hpv={Q7%`SKbm9 z;Q7G`+bt2{N&4~w_jEe7$5lX}EHV|GV@RhDpLST~G3UE}3r9$k>0#RbD9H8}(S4SV z_P=k-rNcUN4ej4*^~)8KJI%mIyj4&4jdZ$b_d(ak!!^e_oIVI7@Rli^1-IRr`GD$z z-!6P`7@LR?Mg(E4F*ndVhg=y5Szu07xKLs2Rsq-$ zW>ftmuGxXpm80K2;_9W&my(QjF7^QZqqT|0Vb1%rD=F!8)oPd0-g5(9XIs05F0ZI( zsQOXYIv<8SlI5LN%?Jt*$ktt%0l>BI7Ek?dUY0OCP5g0#vZnE`YsY67lfKuvbqp7R&pdaJ{5+ zLr=-L{gS$h(xrg&VQf_2JpzoE_uEDJ@KY{_j`saQFp1Ibq2!o1#^a?^4>+8dYLC^a z8LYG-bmWvXpWb=ewT#j)65ygN30`^GUtN0>z?V7`jr=oc+Xc2TRlVkzPzp5F=n-#Y z7FvjqZQXN`)wYev(%3+nzZ-HvbI%5*gGOxCW}c6Y!L8B}s{^3bv!F398e=linl)f^ zK3ZlnTadAh*P@aKa9SsgF^S5{qt7~pH2wypgX1%Dg+qMDR5+UXu{+_bJZ+50Oy|wD z*y(UOTDWPNGjRk64vVgULmqR`X9JrSVqW!%jN3%r^DUKf<5Cw+(ZSn)l zTz4hV(>Fo1*t=RX$`>`c05Z15=<><`v%>X_ft;U;Av$@p)r1t&$KDPl(~*<7If~M) zcarlJotv)g!M*>B?=!vhvs)mgp88aTHRJ_cLB4DC4*Ee4)Zd~2u2o16Ch90K2=sv4 z-AUWugEX6-Y0Xf4+h#o$w24sboVSU2sKCGH#+4#W*9+}gN~iK?Vk-T5e1g~B0L(D; zQieX9KKM*rPWY&@LHr`)*w#Sl#YoBY%IeZN4J_LUBO*&^ykaBnyA&=GM4o)wFlV4e^A0aZC z!QX6-&;|27BOPU>v#J%DxCW^Pq1-D&k`tVn#T8|hGn5znXG8h?>bc6_)906!%u#-p zR#(+kR4pjOUrel?4<52&KKm>7M?-a0srsa%sWIpUDs_Z&%j#xT&(PjiMN8JrFR1|Eyp&v4 zlh=hQD6fb*=3^!4tK+UwsqL*RIdcc!JY4oXn-`mQ4p-PsStndDrrqRqkk@K*QRl@j zQ!meZqqYWrezqrsx&}Vk?B&Z$_M(AVJMb3E zN;`h-^11ofRaIlD*mUs?-&yZSp=WwL$zt5%Q{|=hbV_~S!B3}!I@=+2On<=@(b)tr zxqutbY62A^`2|-RQsB5IQ{Pu&9@)o1ZTrA&#xg3tR`BX0IT7kS%aduq+E>xM1J*if z>@|pVFiV2GakrE~jz>Tf4z3bJBlGU6pd%r$Z`)r5YW80pR?Dt1%6Z0`&ZdVmJn+7? zSWP4wyh#?;9+TY3HP$qd?t8_Ba5Y?aXn|4o;q+jRJ7`(n%C1wSGd(uTJQ6ab)j)Ia zg4!ZsqiZ_#HJT#)nMtj(<0rUo{%-Nw6V7X+!v*fdX05)~D*Dqdp{~|-9p|<#z-CyhM#RnFRbu$xPS+=fG16iWo5B0%4J0MG3Fp3qty+`TrH4s;h0bG74T@i zw(dFY&`MRQySSzc^RBeMWMJd8<5io7jy`QOX^tsv-Rb}rb^%Egc_{ydfhlSc1xx8) z{n&uA3a9zn(Ri-3izvI&4i@yvQH)MIIK;mcKHv`6)Cs}lwc{o(aC@rd7Mt+AQo zPuL5s2%i!X&t_?D$KVo5PIWMgSM>FjGtIuK>V(8<#qEh$S>870VZi+I`2pD0zdb*y z*wzi3;ee*`WWdS5ljwQIZ%mVNWah)O?sP|BY2Gvh`y*p?P9y`$I%tlEBL7T}tkC}m zhs{>b+XQucsWXH#-BZ1y8m1&3j~zEn14jOTeAB>pCAJIxsq;gQ|FN&MfO}lg1a6nE zuQLbi{jWyXs zs;|$0{RRIdp0QdB4b><+;;+CvB69_!FujAC8n{h|3(z&I>k*|lN=q!sm1YVDzzJ6c+i%$srr%z)2fwn6)@_(0sN2TSKL$7o7n^833gz zElElj<0hQ){#!`1Mjz0&QC7d9Y*9rWi}vxGkTD210b*mN(2vzJmVz%W`C_ISjQ!e~cB?Cyin?6_)CkF70yDH)r5?k ze}-@sfpGPk7p{i`5!U;t0C3YdBKq<6JZ4Bd-x5*jqd1$vg>RpOL0$26nqFVDX{OErStk-=j=EjGlj=Mr|NL0V<$@PB5XwFP#L?b z>A+M|BE4$1+vxnsup)w=Ohu*^?zRQ}Ai|I8Ro{+S9p%$;Ju0qdEREobwl0=Oa6lR4 zmC>igPE3WyOwf(>?qIscS@7o6GZHA?Kxfz%b%B@t_KE z$6-J<&@Y8+prMLf1ydFlL1D}K^9!84*FIptQC_3W8N0&NrPaQG-4`q{ z`QJI9|Nr^q@|n6C{cgqR`DFKlb0AYjJ2t?T|MVn#(2h&;arSP|?$M5+NP$Z{ejkI{ zZR%=k?Vbzij(L}Gl^_*f>+qblpuMSUQ}q1CZ98qt^b-@~9>RIo<}Zfm_D{C}&E)cd zL!o({9)DH|PrDP>`M^tw$;7&iF5fKvy^ydFl2uZ9krgTvkUrJmzun+}=Me(NamLCzy_5 zL8ej`rlNZ~oE75M6LDYrv!oFt6RvrkuH_P|L|Z~N2s1IGC@EmFZ)M`Ev9 zv5uu#n7LXEFc0>p=wv42bD;VuJy~*BVCts=G=V=nd;Y`C{G-#HU_We#!+K z0?w94!g9VpDzbC4T-**EFk_nfKQ?cyPuSPux{M7xCa|d;_Wlz+4*0@c<&ruXd ziM6FjsGv`LHt)%cyva5ZS<7LPMUy()&3cVe7=@}ONCWAQnM!W@-^{=!Eh)24GpEiBRB zerO8PEsgMz`gEo{(W>q_P1hI|0gRk)pr-5G-g0$h{~o^@lj`ndp=##fb*VwFjZ>QeY(QbvyzHjjM{6E$q}n3Dl*&3v3xW0R(N99Xob)?{E? zz(ddE!I%Vpu0(pOTCm0)1?qi8G8g@a+n&}RbbH)`2_kitOMYAYX6CY+R>a3T;C7Mq-;}WODR#N?h*l|}DoL}}a zi5|B=RH|csFEEfma-e;yAho@7z#ti;M<9`U4;n3cRABNWjO*2q$D-#S$zBg;c>ETY zM4mBX?0g~j>a#YS_W=nq}MSWh67*MU=e4jGQi?)UXL^C>BuJ;e1)O2~bBvSK3Fyh|2%Og_N z)$kNtN>|*U>Zeyq1j~Tp*EpRfsu?Ew=(YDe;%P@)`A17Io+dQTL99(@vDMhGhKDcV zz!}5rp7sNVo`pn=%Ga;uk+FS6Y%Kl1!mlf*WAAzVRP|;6#N`aM+UUxKcL**ssKshw zk}jFKl#Uge0ut<3F)2lnv5H%qu>K#1eZJtJ-okQq1N1rzG1HI;j5L0qEt%%OB?Sxs z2Fc;ceqGbK)ooBihflyd_1Im)1S&e$1#FyUKC>8KsP{ogblaZy_^5e{$D2^nOc|f! z8bSYw03LQ5X>qYBB_XSa=5-kZiHtW@J~75YE}_F`LCzobFs#yld&iVY7d~i7GM6aw zkJ1_&M8=?f#Rys$xg@DBZ_U$ z0fUhy{0?!MPt9;U5gAh$vBEF&zdW`CgtY(kR$DstJmm_|`W$JzQf+1#TKRT1f^nye zaU|*?q0xzI3*xxSfY(&~C%eU=&_1BPbM*|GT;#~5y|WQXI_?iHS1%{1{2b$YQwTf* zncZVS%xy<|%|ly&)Tpw5G1mu`ZHH1wDGDPABeqfIip4H)d=Bc|;xRi0 zh;CFf-W{^9i8oc&QNbtf#QgrxSlkX*vkZQW1y}+u+T}^4g9mKcbmdXEsaG+6!=Is? zIR}*1O`25KumD@OvSjY`86}Ft08f^s{48Z&Vd_ujQ=t5uQ3eMC%^RYuvbL;(w+5f? zxixi*l`>4Nto}mYMCDg`mHLP|Zj@*Z;}7-qf~r!Mh)VfuR!JrE;hkFp2zs@E)=foi zZJF9qWkqcrl~i~VQ^=F)*sXdAB3YJ-8TSq5?upbE!~-C<7zL9VEK(A|aEGA9lli z`hd$SayegN3h1Zrz(M@i+3qm?>8~yq-8x(HDml7G4Z{Kd?L`nD8i%>lOlt9_5+O)6 zSw?{>UN=g#v0QQrF&`A#QJMgsf-Jb6!V}SCQmn_+^n=0QPkX;_gdve0sTLd>=bK1} ze&({-`};r8i9P@;zWqeDqoA&OPFWTAb5VUG7?>l+XJcoEc~k%=mKm!n;1J8SEJv#0 z;GnYAiG^9L6qf}xzB*Q#9iph-P&1pc7?vRAZ8e%bL--I-VV%jpM!WGe1(^aFGJrWy z11~!?rKT2$sToXRFI97MYhS=v!#HFS?gdL**Nf?Mu>^{{F9LK_ev`9Y3XE0MR?nz! z|3poi6(2ghXdAR=za>!9-rCyIU5hjYt(+2vrV5%6(ANEBCSERIu)lY{~YQe(`vHkRnpaH(poB2_^a zWtIf(gO!`G-xtT-ct2)X=3bJqkB@fPPAB#`yr~S#7$iU;T)!aTx;hQ!Z+`VYC)vN^AYQQ z_*#dVZkXhie5#63-7?*6fE;LFSwXrsQ?kAPLt3`c7!YFp((6CB``nuHGVb}2jizDL z_lzw_N3C#P>|70R)8q4ne0uWtk~fLl7=~2g#N-eEfO*%9&*Yj7e_X^UM*0!2Baa|@ z@2CMD+6C2ibR7a~kbWN+fJ>f*FXr*F4uL{7h?q(1^O(sTMp%AvNK6Sbjt)8-Th@8ttF$Dvw5t0QlvqLt;J)F3XieZ@LVExvrsZ z*8J*)bim-6NZ;LWw94%txwbf|R1z}NLHd!DkDcloH5ngA7G)$7d6|3Y<1L8kz#L`C zxBuX}%^+`o$}ty+eTY|)yKZqL>*8L9Rzn?y)>!RIXqPkBv6h_O&OG_( zZH}D@R8#~9^PW2$^L6w^IlM-1SOg8jOZyz-eB5RQGj<(Y)>5TosBstXhZJ`7Gwg>) zA9FYg${F4?_Dn_lxhRLY{We&-2Gok9+mmHszvFftIJpCNJJP7}QiIjRY^XWPgI%v; zDG)o6N7Zj3!ucRml+1hGho5w6?9KfB*E|o!QBg>S2Ok z+uEL!g%kq7y`B;p!zgNGIf4%vE61KLDd16Tk?H-P(fZjQ|0ui%yQCo_u;Mr)Dma3A znphF0w*{=sI$CyNHlpX=3^-`+Tlx~}%yGO$M{jnlroOdOHjm~}f~$7E=K!wayy;Rk z^ThYj$wut7OUF4~@+}`Ya*b+m)5nh2T=etVSYYNAOfTu3<#MjU`JSGRMl5swc!A?x zJ?%M!*nnS!;Y2@mk<(4TywD-iXWJY(H18;#K_e+aZ@ln_Jp;izDgu?!~(Kj%*k5dLY?GH}~z}=^^Myt}`**(*-nhJY=~N zpoQTV1kXHxNWh+G6g1sfU`VmBD4zPPrd&EEJB#SPX~;MFZ@4Otg3lmFG3KGBJjdh) z&Z$5;b3ek&BnSH9vntY>jiHOC#T zO1#>RRD*{Oy^SsU>T$;~6N?~$|L!-9&TM()2}e7RrrQ06BNw&g$KP=LK0&Eg7%+OM zajM0DY`BiQ^{7VMPKh2`__ia&gXWmJVAtOrKBnPB)nC5tSgup5GM-9Ke8+L0Zr22R zhqAMd4tIdWge1607fVo(U}xEM<-3|32k53;N0x=*0F+lDD5mfU!!Y`8jWwAG~r4kss`IUNrDK6UwVd_mH!W4llOm((zhj z7iQ7vV2@pYM2N+qX^vU6M71P zqkOo;Ia$w%I`yRrMteUxKAcWo=*yC~mpOmsWZ`n3Q2I9G3fjBGJTAb1#Om7CwU*+h z?rCM{73DlpHam=&wEJvvab+FP_5ykvJxDBbNTXI0DVPV;Z44>VuS(ioE)eiox=>>V zt)E~@?X9mrePuPnEJHLHT`+odUcu z8AjB<(cWmQjrqLhLY6UE$%&%nK2i2lYYV&&W5Wm)6inj(mtPPmLUz~OP!mE2k+enK zeM%F+UPgEzPml`qT^lM)m;%Nq^v{uUo*V4j{N@GSNYYog8LZ(=}Bd`xwDoI|}HDOr&8ea#NjX6qf zK!pFft@(hdh|F*6Ub6|&D=>K>bOl;pRvo8~C6ZCUzo!kTK`XlvJ;~l}=w^ovd191G zENu*;v=H`&w10r;2#Gka%4iUPwf@hpY1H?g-bvdpHqNBpeFC_oE}I%6e)wCEiz{C@ zffCHH<FiyPF|R)pC_K z(+dMm;dk8x_2HTKK8X6MHkBg!zw~( zRNA6~Sr+)o-(*1ew93r^G3){Jcsivw`{=3bpaMNU3!x?VHCjE+fyaW)gL6|Q%i6H+wlN_cj#`9-zPKR@m zdDGguXYxc?tS$a1XE+^s9B4U9Hh8VHWVJC;6B7y|Eg(7AItZ!=MSr)&hR($W#ur6> z4%i=@yTUH+0qI9d&Kx>&9)h(VTw)Z0ig3pZF|H|Ah_>%BrUyBL$aq^8$PpT&2=q*- zr@~#XkyKm+UU2ix*h8DE5Uv&&YpT^X(LMm+NaZTK$**|Ico15N%C|gLdiqw2g|?q` z1j#YW#yz%0z?=Zm$r+%;M;yKYQ~0w}$E-K1+|tA_S!n-FusqhRHyL}QY@||@Gm`9s zwSlr>!i##v3U+i5AF1(|O7VdlX6$KEh`~j(=r^`XaHUq*Qni5E;L_oAb*dpq>G#^K zfXP$PVra*;t`z!yCbs6W`*F3s((X(eq425E#60SUVc{~cdTML9b>Q_&O-5JRt|blw ziN=7<$QgTb-49>k&dEkI^%Xg6Hq`}=jchcX@H&#|?LLrzn@{M|eVQAaHk@uItTxe+ zhY;GI{DwZ!#{N`?T1z)xk6^X!2N3sjLxR&%8h73S2hF4>)<;~07(L()5n4kqO>tQo zN(9=`Wz6KQiLus(BiPuSn8K4&s|1s4R=HhOc|hwgcY1WSwCy4xi5liOfo22zu*yk~E>LDv_ZFOcv1MmUma+&i=3u8#u$?fYL-8On5QSX&M+2nXgPkpg*O$&O{I70%8=ZVXs}orJ3bI4vRfxx5w$wA0 zoIA~3NH8Th<=ZAYY7=&bei%mSlYz1I=VU0V87s>__QYMb5_mUfCN^V?9LK3f#jlzRIQkWBEO40x zCF)YZYrazASV6rTJi|twsl2M(h01zHbyekJI{Bb2RR&X;ucN@B08sL-0ZP@T>5gGE zsl;)9>KXf{d4Do`<+GN#bI#FU#-w)(-IMF^AQo6*>jirL z8s{Y1J;stm2hYaL9bag}{dbXLB&|AIvdM>bIe}~wy3k-+peUeJ&wohJ8=?_UAQo-- z|EPUBzKnJVH6Gw2Y$84y!@#xZXL=2=uIYp^lxsGTOe|`UpRD za?T;gJ$6NB@?n`{zd*$i<6QcaFPR9(}&^uulGRGdtg>M8KuRpKm&}!)}ys z-Rexx(d*B`Kk$-Swory9Z?hbg>zW!AdAxxIU`Lj6H7xBNC1sd7`vfm6K`qtPVf3e# zSMjJMrZNO>NW+Tu230C$;8ry4VrP+Rt;&1HMT|V4a#cL!V zcCf)B-+HmLG=YkL4ZxeJm*C9Jxx_h91OhLdKA=eG*hm+Q1r6JdJWNt;O-X4*72;#7 z%9!@_7ST&rJrBj{e_aBGgQ3JNKEul3uGTQ(v{H(`1VS>He&js`Kh?s7={Wrgey?nA zf+ITZ?Q+efA6#ZHnJ;yg`gllvULNyX0f(Xmw?obTT7g*tsm z-O|T`{2THNR+^oH5K_E2ixPk8T(m1}Tgz~@W&;)JZTn1yf`q&1P1go`@;T8aKhrGc zIpxrM;(NfYxlib#J2$6>>C`p20r1{U8($RK)NAbZ7lqY&y8I*-d1ao_VJ+7zd~_t) zHjK7^3T4^-DW(EyJc!zR?lt@A@HU}YUhrOoXFH{ysa=DzQ*tu zDh}Fa$>Dl&CV<;M6>n5JXgC{yVZ9~dpA+bKzTsYm1>~3SnkwF|k9+^@r{eVqGA{p_ z3F;Kw{HA!Fk@k5kQx&W)+WxM40zK3WRoCos!xH6LABY~E6e=#+P`3(MWM?mR$^LEiStaeq$20%+A?MMf#R1CF)LGG}|AsQ-;)3MK`QT;Iqi$6w! znU8AqLMYn$jE-h*7lJ{dqd5jsO()z?^Ea;tm*ZS30D2yob7E30qJeLqJILER0)UaQf{S^!{VF-+IX?Ck&fRh!Z$+@Imnj0`yuh5iRQlQ zvD1nt#AG_J-DoG{-vH>=$u9f#Pl)qr>dzsT4!Bqw4_d;GlDfM271I~gl>r?DM1h=F zI3o1SLYtL7c|yFD?dxQQWS1rj7lQo&?fmV9!q_*)&ldcV_E9BZY2C1t&1jl}jQtcpw;TnmmC zRcM~z^-=XaSom$Lbr#zFw*-l%b(u`PMMX$~Ry2x9#Z0#9!I;=|f}rx>v8M5Du}_Jn zUC9|Zo+dDG{k{v{AzGf!_z|^Ys8IbZVs2X8sl4AyKn3JY(=`1o%Q#%2m|Q!c(DH$W zxRhRs171QkXPdn#(Z8poc1%Qv(=a6G5%a|Q*Mr)KX<84HF!=<AC)rx0T!Uv`h*Kr;M;H`=TJXF2-7P-~t^ex)ZVjgRfwMZ}5h|}n~b0yCd%q|-` zlhV}z01h27vRE$l??J1kZZv>E-Pk21)04I0h=SOvVpB7h{uf&anH;}x4> z8UXHc9e`u#wsGPZs{021D23yJl=tB{G2b*wK*DS|)(P-l+xr5j*XLs~+6%uHYW4Y{ z5_;upVG%uZzS&5R{YFeK;hl9WhMoNU{JN%bgJHNHYp8KXR0Ml4<8R&zfGJVCx0tEqoWVWv}ig&+OUr??z#>oAfc|Kx_#}Y z>h{)|ER!BKSd3UGQ>*xM;mYEIDl9lxjFpnzTqDArW_XY6!a6ZtN~~Ddx^8)E7dvw7 zsH(Wjtn!j9vPN9{eLRv;x3xpqZ)?d9 zK~c_2W+HR8(ocRQGlT|N%Iaa|9LOVmEaDh zOpouQHN=OEjyM(Q|AmY~^4HA5)_NX&{IkSFqQ`_8bpIAn$ggef>1NiH*fkX5=bZHc zzKGYvC-roIWUOkX10Mhq@T2d{rqN55E?Elifc_Eob!XbCbnFSipLXV*K|7|}gBr6+ z-z>MmW4gsA$m!n;_v(HjmcwABN$zYTbzf61ZlTpi$c!*9neKUAgsH!AtSxQmgDs8~ zLpa#OYetP2Ary1%hfrKsJ)?RO%L5xts>)x4s^`xro8O=wHq2t&F^ioW^}x}`2LSb~ z(S$n;gAaSe1+fN@1CUUW@|=gdQ{ySgA3OD_9bK>~@k6h;RrVVI>24BJvSUT!Mx%}) zdY-8<2=y>K{FB+?AF_^m-lKKmiHCaHn;vpBG2YBeFb9vK%f|yAYyaP*9Ud+6gb8YJ z-~h~A6C-C~Dt!aMj%;%z;C49noFylPu zwsjlUg?cu2u*0WFk6oBkIQF#A{&!uta$W!|I+Iv!@v}%LZnv=Al}ygXLM!cECXS?p zOvf+@5RMyoNMr{TW%Th$L!eHXHn^{;?upuvV+DtYkQ8wY`y^)EfXx>eKAfLdtnX^- zjkxlY>BbxUo@xg9QxatlyQgzU=bZR9u*qZ9@CP;|bB9sxcramc-KoPJ5gjg9SYf*= zgXrw&?AJ0>*?bV=2MmJyWaaR>=r6wge%;gh&xPry@macWdQ_p z!oQHVJ!XgcVWK$P+JjqRE(?vNV-v+RV-_oo(;)ie-W-@HPBUv&Z~SlQDuQQ;xp4*N zoCQ$n>qFVzQ3Hmee9Mp{Y2v{X|N1~oYS;xEBO6DCyIXOY1~t;YMed#~LXpP32KFy> zy5*k+ZFkz3a0G4KM)OMwYXb(uLYI{ebCUm3VT1fgt?gd$Gdti3f8`uI@`D|))==?c zVVoQ~+ty{0A!y78$p1LxL1!v-S=cRZg^!g0JpzM+qlW8&dzEv8=#=liUbGmT7*q?>iR(wiKhKK&!Tjdoy0vZzl;W%w{5<8WZWG-J5q2TR3i8u|+!$R=?Dj#%yOC2v z6Id)5?Y~n@mk-_{X6jt3jU-l!&e;d<>XSRgyk4z&m76YrJd_WBfqq?wieTP|>T{Kj za>j?4F=#k^60=r8rZ^jjsBO(nYfIKbourP1rw57!KMqyQ#KsH>{nIcWRi_S!LRkA+3_4mz zdxl{|B5Vj-X~!zK8$W!PIO!}l+ZihVGpGhPH=d>;`uZ+$zjNSA`Nq4&ss!djjme^v zKZ;@bx;La4qMdz`JAzh=3vy3@Y#_hdc$}TIX!pF0lwe zMQy;d3DhE==D-&SFTKHGzm`S~u{&tG!=5Qz$F%$mAbF#l_CGqizj>w0p19d%zoGkO z6_=wW+Vi#?57q@q{k6~jM`Q-@9OnMeK%TVjgqlrd$NjN%<2iV@JimmA`MXS*gr07W zLUWq@xx#ZorTZ`;w`bV1sPsA@@@;qo!#wU8FK|#Jpkv_)dnCq5y*A4JJJ3JB2Jb;v zA6W03K8;6xuSxbc81Xo75-T?=NJ*rhwm@JM4s+h(5gCebH~l!%1MkA);lsN&SWZ~b z*;3caQS$nE1YrT@Ld|f9eWfYc9ld4cbr4-i=MK(yO5m?-x|Lr%kHAnk9f7O81;*Xi>GpqZD%8WpW>D;9a!Z|f6t0Z-1PXCz& z*<2*MWOeHbdLYwYZdp}&UENaS1%r%-f3T)*6?wDlG4@rZnyO>eg_jtOy|5wSk7tr+ z5iGw`vM}^jBS1TG(B2REm0-mrS{UheW`=!6CIKZRaqI<$s?ds|@QM)Yp67b-=Bl90 z4SsmKG0Q%w`;=B+%d*$?T$b56_USR9N z+;g-dPJQL9ZL>n|czAg)dD``|lScf(=A*)iu1fXr`<8c1RPa;l->GGT1TQSpDKss1 zo7FxySRc30s~Fs7z?`(O}`bPe4?5gZ-tvTWs}vWcHC;MF@>Uk)#I01rkA02t@kv;d}&hL>cUSfi3lw}g6Q;i9|9Cw|KMJ1MX(dZVemoI!6RE{mz^P)>9wkB&RV8OR5;tYmAd*XPBr~! z)(nAXpN1F4m><;QNko@$%rNblYh9=NUPjEbeiK3Fw;}|^lUu!ff%S90&N&5DWSg#} ztcL>e^;Z_dZ#n1R7O$MbQv_ah?2Ez_p(RV|V8(#Iqn7V1&+4+?E90bP>aWgOBFq4= z?!4Zgtv(=IlT2i{TJzKg73*<08Z8i85Q+q6pxGL$jNt&4I!d)8!m-w3{g{4pjW3lp zTCLGG5ipz?K%gzH{iiiq9d5H)O-!A`V3RDWX`8cl7+2J_Kt$HgW!%zqT>y}QIMaB7 z&EMcNWkNRNl19mynOSy5c7Z`#OsiS((6O zK&p)%=?OLl{4Rn$QG2)v|04CWpv0jL!0^W@7WOQqu6I{Z;ZLnow15xr``oBa8J?{% z;{lq>F_%nuf*+UFuUrlj0u}juH;`wcRVk^3!LMd6->Zdpw6PIZLfA9sT!VOGSVosN zaByd<7F8`u1<-q3MW9vVKbbt#o97DF!3hu9n}26bH5F3oR&f68d&OZbYnqwP5tu9w z!`~1J$__@4f{J7&3TZDG83?bA9~3px2Q!cwvgJ{;;>DK8F~OmxQ^Ms~)y-Z{D>eVl z3Tbv%f)s%OyR~OLY2+6_Nb^f)DnkYGjSxr%AA*wX`P`d*e zgkLM(M-MNzmUEDkYx7taU{ID@2WDWJU}@m^;cXl&0ln5tM@}Qaqv|tI4tegw{=Bxr z>ZP@RvCEqWx)FXh+iYnL6l*{%y}w?lH|Y(0AZWJpUSER^tcXv+BC)d@cClW+hf*t* zC`5aUkJGtzW@uBLnXv#z#TkOge$|Aq+<<;CW%b@ZKxk@DgfJ~II%q7mSuM|x>kc13 z&iCshmWJ>mu-!oSH1OgRgeJ6ZI8s~Qe#qe}6l0;YoETESX6I;~QN$i)-O4bRIfBL` z<^F6vKo<{eu*xyKg1K^p!v=pXo<%2LLKNZkDF_y;ZlpEsV13-R((0GB7ni+ki3Ojj zww5L$(#jV{l}BB%)K-aXG59j{d$gniwcLCZse0ee!_-J$8IQ;vBu!b+2C;nU@H_sL zO&$cd_G`w3|I%yU*dN_W?o zS42b<4N;5cm{UNTz;`=GI``;D-XVumZ9lI3#-*h;8Kt(osbm<9{`q0$PJ4I^>5OBF&BX0kVxsa1h$Aj6k233DSWsp5 zN;K}lNSEPD6jpIsax9`RbsoZz((sVQr#>>xT&L(SM96HNy2fE%U{y~=OGiQe`G|Wn zWh{_!l%G|8X^#WjwN9>}>!k2c!NJ{1Q|^n2qxLqXT3z&=G6dR&F$n6>8Rox6@K^nZ z4m@ZZCq_p7{V4N4+*;Re?^13Py-%}8LHcO!Z=NTK^h))7f%!^_y9&I51I@$fieEci zEO1$A??7`23svU^n(O#y-5~RA{PWX6=4txhe)aOf=2IrJ%tJU7Qtf4$G}OG6HauaK zy~vJ0l2r3jY<{qy@JY7OY>A~&!^|KE-v?vy=$-KY6kK8+Nb|12rZ(XtzmqG4CzEqmxrte>|JDFM!4z%4urvG_NKl!6Ed+g~11Tqd)2Ctrlx(YLYj#Amx_6KC8A8zdgW4cJ&t#^f`=mwm zTr4sy+xNlJ>sg1ep~V?KC!N_ZWz*_(3{&Ay6SSR$P=Y^8i!iGj4oU?ky6=EAfZE=H zmU`6~2+Mm{z}Vs`1_H^!kD=ji9SciS*T+~l9gD&Gwd`N;uz9{jnB=~vC6G6b!8pdO z^t;K^0=Bk_%Rn2wwj5_q*8%BP`t!>OB-{Rl=WP&$l}Sk&1*9Nr5;OP?tM?qxdcN@V zr=ebN{LXgoXEINg4T`r3KR27boBQz=j_tPF&MvY!&>`ZSouwKvc0z(3u(ijEu&!$@a9?6{e|Ao<7s<=_p+cov{GcCsmJ5JHL~j7zBPO zyRx@0D^sU^q<6oQ(`3O&NdrrTbkDiF2?i zbsGGwO&>wL|AZhjzhU-S>5{1czFB-*G;(V1u{(Lcc2m{weeuzp#}CUS4j}witwDp# zqM~Oob|>dcg@SC7<`j4Dx%eyGe9|PaGsu>*v=mWfX4l&D;Osf$Cf+ zU6q5lO-^ytZgNB~oZGNvGv{5S#^f8obX|-n2zumzrz}QzNOh^M-XO`&qPmU97H-+? zxspcowHAcsP(8mSDm6`rdBR}EOD$;77Y!4avnb_xaI*z7tRk)jk>X_#&qdQvT{6mJt z8te}Q^T|<(*`iXTAGE4+uKEINA_*#jMRB$iFN5%kJ=i{+#?7^Y^9uW!=M1mHPnUI>owTBdmyh0%U^ z@VbC1(yxV#$Xe=qw?{<7yVrt7&#;AnfS3cQZ5ng#lvNv)JmAhWoCEv|$l*i*oudeF zL6uiNOnld`1ax;8J+FFx^89K*SNdT{C+rj@WH3%yIVkUN)687Q{r(;p;mG zI}2(LUhO5fk4)(h-A^^iIrPdDpbZ$wfd~$jEyJi~A`U-Ts^VCh@KaSM>`J9OTmWbP z5I~dPHTkot@E*H0I=w-p9*TEY*Xwasban;wJMhLO57ZZ8YOm$Q;t91i>St<&U~ zs9r1XYVZ{y`W~{3<1rktwGTTXvb|}G78#Ay^d-*V?GHQSt-g@pvHWS>M>vB|S=|nAw=&%QR5ZxkmucJ*%nU$}RtHPF=)KkGqd+k{BL^xGP~Cpq zAvp#6hR}yWaYsc_GNM1QUbURfx~tvMidg0Kv~jX6-mCqtsaE25-k1GZ*aDGeg$sy} z(2NO)g4H%rQHp04+cBwZe_Y_Q25=^8M+!D$4y({>?Y41i&xwgAe${3V=8t9@hHaB= z7PR(G%!k5bo>#Q|Go0~Oiu*KxbcMe_vT1+RU8}a8_I#yqu)h|+t5&@0xfEn{L#1IP ziog1Pnv*IIdHU<(}_4`@rm1H0ugo{}EDUu2>x9^JZSx+%Qip zQ9hQiQIL0kTne4~*yFioMy7Dn1EI~}g4Rz=@!A=g2+*#_;=0IP-Zw6KGtA>Gj>G*Q zd-_ny`WSOk_g6F_#Tv_6e+6-|wBo`-F?8DLt+$1136@j$e&YG3nF@}1UKL}rtHaZx z2oZ$7d)-r}clO9PJbPS(0Wd3Wgf$1K z0}37giO1qeXRwmR_4AB#ly-FaC((wL%19Nl-|GQESP#6P5s^r>eyUyhy--vzS!w-N z{`r#!m8?EuYYLec00bqZaa|5o|N5YE*x^Q&O??w$-!w&LB(=0F8IdJ{ zLh7n_r+5k>kA(v((T-TRpVr>&N0gEN40oA6e?_=3?bxp5c)M2%(;yYy217un%>)_( z(2zyqaoYcP01HC&cSmW=Wk!`u>TjHQ6}-4P?M%{>6pttBs1KZ-IU{P-N?C{90@)$T5B& zkW)Z~W?u;%nCh$C`~;lfr{*d1Xj1V8-{EqcyFNUy`5L9q zfPkpwf}(?j4xQ7Z?qY#NM0Z640^nFV0uKr*6(t{{qrOhDjV$Grn`HnJ>5US@nOB?* zvfKcj{<-3};SUHH{3IQ4*`o$)T|BA2ZXPs~YL*}Xi4?3CqE11MU`EqjRV-Q=&(`(! zZ1BaI1qI^4AVT^@KDbzX@QfZG42vP;IC^6VFhpN<*=-r$|E|8;tEl}8*C?tbq+?cJ z0t(STjK^v`f2(31((MEFZ~~+60mZ3jT548>V88*)2KzpXiXGO9Q>ba#{H)B<*%_@f z7xvH3NiT&>8KoE02fnbvxWavxcSk$IUo&HsLv3yzzcITwlBR@p|~Ru<>HyB43{<^0dj;R zAGy(Iw!8AR{eA6P@C$E9L_XumxrmbK8V!&%1{$N%T3MnOE0ipnZ3Z_`dkfA*^S|69 z)eWdpqQ&c=OFuqENuz&GQE~_*#Ae3X^u&rJCPAFlS}!pEsszm)HGkoZj)(MxKDxYa zDa`sI^Bxm9C)^2->x#Yr@EFVWwHG5YY1%G}SN&#+@{)yizhaIBOOUYbhu7-;w-Yqa zL4()+eIWR4`6bpY8+Q^WsV=EBFjZ2MsI787opr#-wa6Y&rg)q@F!5HVb>YLlX(qrdLl3OsQYv3rE@mKfP^+t%*twcw?p+zCOz6X=bZJ_~*Lfg>s+HCua5hc^8Q9kIyFT&95eoi(6L2`*K&mC`|{h`r6jP=LPV)0@8i%8+A0l63qop_JU zQBEi7T@L#dB6UO5OXpv)l~R6_HO{QRhl*C){lPz`tVZ-*OS^Lt_H5uoc@|5c;Kt&O zK*JA?20DJ=UYr~p^0sNAEw1|)#8JUbaIj>)U;*$TYa8M;n%KvjL4g-!SwnPg`J>-y z78WCo`UL9HWPo&T_yZ^q1z!5l=Ugs2p6^U>>7{g!F<9@-2~_Kq9q9L>!8DQSl*N<10z6`@zqg)ycLBtK z-<#5XN`yV8<%QFfUGQp)Mm)O^NZT#nI?S}?nBN{o6mWWz6^NfY6}HB4D7Y77?q-;G zM*&OXd%ux+FcL&zVb=rHTN9gdv!>NBxOp~}yb>S%BR`X?8s1A)I0gj{x`^#&@O1v= z^0KKD%Rn;EzYEAi!~yZUVlWsQ_!Q?u_UK4{gT!w@cosTwAMkQbsdVRG{n-VY{f+Ml z?5|Mz{g10})IE?A4(@<4{JjJzu<4{7G*t%HS2C;ci z!Gas1r4jm?P>~_PgDn?FI#@TX^qk#o1EYvOUUb%Cjdq3V!oC)ut>ujVb2;{iHwxjB z?l=tamhT$;F|}-y#j9#?ST9}HTC==i*}`5lLcJ8E{vJ1Tp!I37EvN*DPvN(-5$07) zKtqLq@r5UeTDExr9MG!FQctDUslIM299DgEV`?N1z$UI zjavXOz-4_C6vg;L0RQ3mWtSMaulD3c@tKTIK!Y_$B0oe2S9t51N)3kHh^UJTYu z9xNVKj@iYsT=?|CRm0$pTh|W{giofk$E-0i^^04U zt*q(UPM{RX{e*znb7Ic@4y;>=^R4*o@p51@5hfr$iy4_i9iExo=* zcRXr3#dlL|gQB(U{%S0*#(Jbbfsk}rL!*{xb@(Z3$|XJTbBES7w$`KPMD};+$%*sJ zc`%FuH02(oKYe1ixfI?~(wnLB8~0!;83Kx&r$)Kr=|Hk8KK3G&kf#VT^V)0#eSiCf z)iJsEVHS)OL7P;i4yy%8Be?8(pSHB&-i)X~sQg7roxK8Zm7i?|T20Wv5@CFXdy3ag zr)DFc>E8F?d$@ByRBn)dnW=CQ5=P+Ov(vs&Kv^xUw78QZSrx_a~81)x92rudWvjU5u`Taf-++AYon#V zwXLbX=WF%p&klA@2jHrDG)(wS8H&r%OBN`%DikA4mX4HAw37{-ix@O%Et@o~*BnQj`-Ws6cyPUQhIvk5gxWLl@ zhrZ!&idW*s3EyZ53qzp^!*fgXkpbF3A2cJbyyx5!pGlpOwx|JI-G3=VQQ0F>f~Uv2 zh72*EPU)Dz+1C8KCF8H-5NH;Qj^6l6N|IItmy0qivx_HBG+i8rX=7 z4#4&)xZIFXCsY1FP@T-(40f>UajpPm-|f5NS(1a0gOh|L7|dx4%oq-fEWVMZRO9qL zGX{v`e~7gCM`@Evz#)j?n$~Re0?%B1bs|Sb^KOKV9v_x1R5r;rOw5nVLxT-5J8aX@ z;;2|#6(x9Lckf=2#G*%i^ejAzypwG4@xue?0NSqzk5;M`9uBIN*$A2W>@zjG-V2MyYqJfCq_)k+BuSZL6IX6Wo}ytNu@LzE2p$V zvGgpm-;ZR4rm-F;dA^7Rs%E~;;_m(;AW^M$BotoQq52%_UOL#nG$qdD&+0L_{9W4E z%oD2z6A0TC+;FtvJtb}w?;!K)8-xE`|_op(VKLhx+dTXYxdu%ZE49kfw)#XEtv zCfwtqT59>1H(u+m;Mh{>x89_vteFdQN@h;YF2PR&G>_X9OXc4p?#%itpaP3WqCWAZ zQRT0se!d><xM|@=;*y(LEa|_EM@D>5EPX7K0m9KS0D&NOn9W!va{i5zg5I zE!G5b-2mXCkPtL#B_iBCr2wTv`j(4c&qLgV(`oD9{jB#<-OZkiXi;U)-h(iu{ASh< z*hgSaW3P*$IItIo|K>sDVDC9B9`Z$99%tj4ZfHR+IZ%8q1gdZkJjnw*9&}Q z0x_80Tx_+D?V)D;*aijFl>en2ng2zz&;C})srzAd>c_S}SX0m%1UTCNrAHaXc|xy7 zogdpIU931E;ONx{DbT(5Yf`K|X}8 ziwEBf06pQdG!_x_K=DQrTu>sTmX}#8M15*{3~@diUa?)qFHD*qoY=yb$6H(2D}px} zrSJdbCB( zrmc5RVq1KQ#sbGdd(2VjrRbwpuObehRyugbmO=+=ktKzz>o_aXYnn-C`=$1wgZmers#9EkmM5Hp=+%v0Tq8Ba;-f)|!%Oof1#{La$wgO-y`RU_7TVIOq zX5|+anQ=%GOG)e(O+Ptl%~0Qd+j>m4g-X$zC#-$O{GiQ4WU^{eBxqt&Ya?0%H$s@n zhfX&_mPm@RrH=${MR2zCSX4i@p4>>lQ6D~TO`gcGKw*}$|Fz;fT(*o6TxIXZwEwz& z<9oF4f2)>T2ilB2D=kzM!^j9MNocq~-S`pnH~hEH=0)gc;~AcqBR! zf!*puC#*3{7n%AWERiiyrWpG24%<~6>IuH535XXi{em$Q_CjA2Q80gRLjVk7p5xSS zPg&2&5$Ub>c*Z1~A&9ZhLQG{vq#cRt^yQ6qcN=Dwc5v&^vYGWT$~MgB9R@mz{)6+V z`B&|_z!c*@A&!B}3BSNkRnsU!e2_(A6OKt_s`OYbnCGBJ)7lbTN_~yBB<_mFUGN~C zy%B(ux2%!^KD}~%anAq_7k}Yg!zm*qnxI8oTi1HUxtu%GTZ?cblvNg5cgEr|9;Zi7 zSO?S453H$|ac53$u7F{`p{0?zytIYiT2;T4w*}(~;V25;72AU5#?uP0)iIk=SH>d@ zE5j!ByXdQj1;Si|^w|JgM)>xSKhPFG@FLIZogMag*jLf%KtycZ+>1O)-U45u`se`L zFcWQh-ULv=2Dj|$zN^q@Cz4}m&^wV{3cTZy8-xdqg*{C{Y8G~MunqP8{`#fEhW%*C z5I9U>wa~9lTH~-T%KVl|Dz^2i2>RVWe17%1-&#jST9EbM*iyG_A-(y8HHV5P$M_We zf_GX}5v?5>?Fh6sHzIHdb04JJa1G82X#Bs;OIHTcGFsE}sVfPQ)Ll0d=Zw}fbrC#9VH7zoO z8|f04lFO-+0c8BJ=e0YwFPzxgqzfRPQllJY8d1COhYlCMREY|RNJaM`TebZR43t%Ukb3p(4j+hTcEIqz{RGl)l3JWz zu zqAc`aon?gftBx2uYq{7S8rhP2D> z7{88UYoBNi{4AR~t!6^`)bg>FV{o+2Nz0_ILu{~-tOSHv)w7_bc=$EfZM5YbM?M`e znE^ETfOS08HaSW;fFgzd{5nh)^|>rwEr9_OiSdi*%PW8tasB6RTg03+>azO!Mxa)2 zlQd=XLDwJj1glG}7PaHN3mH;|F=sC19+gCKjZIfyzYE2y*U#C z=iB)}1uVP@vSQURa|$S4-G!>DulwH-^aP`=RpvYUP>$*wrq=Xx$3>vMV;IZw1ru!; ztoYP7j=T0Cnf^caJgV7etE2g6UGZxEDc5fh7xsZYiK?Qkqtt@WT)(uc;7D@*|u@vsuDKmPH(mJy2n zd%t!|p9r=3LCd2y0nbPW=31<3)RPuJ_}hMqw0QVo5d1zDL}+2uSR6XAblDgvK!})v zBVidG`7JV20@o&hs(rrOLZ3frK@7CyPf-_cv;50K(I?=cZBZ>||1_M4HvnFx)6f%Pz^+^sR*bSTCaQZ9{ zM`SYxm(4n)m?s7_ILjJ=5Z&WN+?Sk;X?#C|`O&3_Vqi3_o@D{+?vBslCxEuKR6iQ9 zuLeg(2gbsNC%&Ez{wyx4jZG9`9m2W#;={x)Z4_;tAzYimYB^+AGx=(T#c|CBJWkE+ z*4!Veh8F(^v@+-BS)<%&dHDNi_J80^?x=uYex=v%PSlhWATNoRT~HJVj{xxMrH*Xs ze9&R8@Ag1=7xny>5Zn*e1WqJ&#_FB}mO@0Y8>4M_X&8W<`E{5Z^kGkb7OZRqE+4Gpao5DaSzIn;qnBc@-R+>8-5<^g(vQYZT0?Kli) z)_rH=q0M8XpyjG%BUyJ_5Hb6thtXrf4Yu_Q3w-kIv0T0zU@h&tElG;*HIa5B7Wm9+ zgzU|#KsL+kulgM7=-rlaGMOiu5IJ!T7|Je9kktqFTGrs&wa#cY|96(I2!sM#qSS(y zEfXU-DRds))rj;8%hi_o`Zl)sYReeA!~h{Q`*MUwzE*E37gXgl3aM^xS`6jRw>Y#5 z#pGFFDdaTImid+e{PW@YmWl*^c1AHD^*G%%n11A=Gw2987FY%v&z^}x-p-5#7Moc- zFklvcUtB!w;{w@Ve*{$x(5j*-3oKDu!`fd_Qt3|%EY>H6w#9=I?9V{{-VY??syN?N0&Sn0JHW2GcbX>z=&}B3e(Eao zC~DJD^9aEdrjr%rAGJKImhNNV@b>@MhKqASy(Y$DNu`$SfML4-gIHNzGsN;+;2-rx zC%w}TnBt>HTCS&mKC1ZX&5@S*>VQ#}uYqkII%~SM!AysSq^3~&gXSsvNOV1DUTx+t zYJSW-gj!zp0*(JRnEc<^1&ph^+=%C?+5iGeB%7Ei;&Jm?F8Z&>&A0Qks{okPJIZ>g%8(C$!g0n%UO6c-Zrn&`O-z!Lr0e~Q0w$y*U{QV z79D7DSEHpJIFmPnQV_6;pVIq7Q~lJLV@W1;93r|(9>yV>cemwBNCorczPjMynQ4a+ zE60L9UtvBFucDb2dkAUD&mdPzm}Bln9$q&!m!!tf+GFOosO^4$#>{)yyjbt#&UekO zBwD;U%C2Ad`@hW(_-O5m(i#nHenTT9q+1I5#;JSmG5-b$Ug!~)6|N6)+~rZr8QHIH z8Dsg(O4ixX?{0e$Ts(7_C1lSFKznNUITh7D*)kE_tLG&}JyB_y5~)e1$ficbnN1#` zj{Juu3t*4$A#S}RA6#;52V)7#qds(vbS_d$>JuRNug{g->W&T4ZNT+>9hvuy|C9%* zU3W`AkEGf`{!De5Pr5a{{D$9KUFxMnrMs;%Z;M)JEh}9g>M&LS0|Q_IjEmnsDOF#f zVAYMa)KdHNPD%aGHt7MA2gi;$p&(-jICXVzhcqj~8M@3#_B$qkZJ>0oL#9vnOMPX* zia;g1BoKk`l``nA-(mXZ>_zbGqHB;?w=Y97tBanN21=olDIh}v5-_lSWm;8cv#Wbm z>0{(C9aJU+dufmk$mv<{d|oJ!)HKCyRX>lFPFptnd?L%AuFTC2~(x=L+W2H1x9FiJ=MlHf) zIec&oU`{G3$|p~wJ>OcU(a3SqoqBOVea=L3)+om}LG+|%5(w^MM_OBB9!lH)4Tb0E ztW@M5Zj;jJWSwn1CkIVcXSYk=n5b}^B|kE+crevL(pKMmP#SBYRyXnlmOn1J)QZQY z>mXi>xoLz<*Nd!ws=OMi(8)nSRjWE@siLb6gG)6T$~kp-T#9$GZkwq=Vm>TaIH3-9 zf*p$QxqIBB(-RT)j5~4!K=`4~W8+N&+*0BU$=8R?^AJ73lnaDQ=GqikxiH>~97fua ziuj_A8B&3I{S0YEM0BskDfwLxGrXROI!~NM)`;*Q0L)c(*K}_Ry*5iqYVP(1jjCRJ z1bYaAph<$A$9P)f=E-G(`#>$bK5N+nFkeI#36Gt~y$UyWun18rkWFf7T@gCwjZCk5 z^NZkoYkwQ54EMhTtq^ef07f5+jJ#oMfbJJqj9L5f&G19sF%3yL`;UMUw0<$LQ-le@ zh@~k=)?_dZ(~@1wnrUr*!wOEpCikC^%{Zz?>QBXOz~I~PHz3}=`Z^ZPfF!Wa-H_!3 zwAeFpOk{RuE}2I7<6$%Ho~M{86k+Wo7NX$~y(ufUM=u*f8%?=aO4?lIk?8Lc$Q|6U z4OxVxdt6FC_Qk-e#~I^D;=$-6rdtyy!|%|aYNV@%8eRrqcd~2%f3fcE4hQw@c@^D4 z57YpMt#ZFZjw@t2@ghZvPu1A`IOS+mGFE^HSPJfgLKw%$N%#{sDs z3EXzivgP%N78KcMXP8nZn+u;1~!R>C?BZwklY8Lcn#OV-bD)z$r(ZNH(|I2 zA;9a%L+m&N*Ar(gn5(W`1~7sJRQs$wI=U81q85H>!&WA;-gwpaO*h;WfwHnO!)?5D zwED`*Mr(hTm6dHeW$r`sUXxQ2`Tpp-rN$loiL$wi>v0yoCTDN@t2vQweM3&6!*5^# zJ^F^6x#>M~l6aU=#R8(JcunxdW581~1UT>2ja8R!n8ajlo>z_8_A0 zT5;MLK&^ZY6HyBh3Kakc6Dv)cxm^c|4F8RuX!g!H;1}3yh+#kISj_ z!u2-L6?%iSo;Nruk$9GizX~YZp*RP93E!ljpwYm%?DvHx&EXapfS$_ z@@3Rd+^`6qlrN=;%V4@_I|Yewz^|>|rfw}lM5iDn)QBU(Zwd8J+mE0t!|Kb%`Y_7{ z5@Cdr#f{SyyYR__^G4_K;DkD+>05bjd**p8=O6P|sya)a!i?5)0VKZD!46Fow>i zB3Qa06S~{mC)^IVep$>9j32FYV}Kx+`{?jXphG=19>9VfBVbzFFb#V`VLoy^pIwU+ z;pIEvuaLJ=)4wOJ3(zO_H=sBrU zyNR0FNd`t`$YPHV@N_Lp`PB|osy#uBYOu6Jlft@^@eOI~o2U&q3%d!T=v-J+E zpOieP7~;3U8V@j*Vv$*Qce*r_S|0(xU{?|Xbehdbo$9E8&WSOa64Adu^NL4NbB0t# zw;n~H97I8Ag2R!9meNnUj(m4mr*oAtPF<64t!L6-ATmmc7H$5Gz#QQ^s`6}djCNbx z5EEE0e&jhRR*UUnn}B{kX*JdDMFu`P#f2ORyIs*AFmb%;+F6kj{rYM2;j?=c2X&EK z6tdC!ol?~FY%mzY9|WjJT^!EO0 zF>{I@mLQ!@GW%^6LBMQe=t}Vl%M?H*7p2+UM^F9A3<`(8D^h-_C^Nz8`<4#Jffk7e zLuDvxgs(EL$3+mhA=9&Io=rWSCrQwWI98yW5WU36ZalC=inZ4*1IEgnYnQ^6ACK=-+*nVVyEEtnyIB@SQEK zGYY~}HLbk53XD^^l)PL@%;8Vb4q&6m)N*8bPQI`zDp`t^z4lrJ@R&?dsdUqFDYcCs zZ$+{z)F9DeMv~WskE5VKXf?`Bo4{z6VLi*lu%TAtm^VsJ7rnMr5Uh``7sB0i+~rpf zMzI=vUc)l2aCdl3WMAXkM38E?$7a!;E2LCrjNGx%<{ue0u^Ao$W?^ko@MPpUXP}`P zGX-{V@vHFf(OoN~q$1-I=8^I1EFfF4!8J6)LU)R=Wjp;TR7KJxnlalEt!`T>LAL!x zr37-4Hfen%?Tm%3%>YOPF3wF-8@ZoW{OY-zq~A*t&mF2uj`Gv~pW*E8yaq?++~50s z9yA(YQ}uumt`@^WO)o$J-LMyj9{_t1HN9W5M|XE$0=}0`&D62S7i|lBa!02v)*~Q& zg~w2vCFXy025w$J)GP~KkD%!<5t+?g2YIp185at7D$~zEI`AY zhQ@|vE4kpca~d1Sx+EfYvoBWB)0;0WiD@CyvuMdQbKfEn>e@?vJb8M(M;mX7O=M2! ziL~W;r|b=>Ai||T2b{To0msbjdN}VA>mh#?*TaCW{L6kN?U7>K6eyAg()yDMoU^B_ z$X>eGm!ko&T2H(9v*qvBWHL09U zP528(l{iiez-%gc+wU18PN?2KB|ITjQ^rNn9v_P%OOVp^71$Y391zfBLz+cp&&f&V z%Bu3ovp_gK;R?4OUQ)%?{X-p5u768^EXvarhvFB#$$2!h|MGZhW!?CH)?PsNAyn9|v1Gf$T&TYK570Xx@ z;qWBv-vY$9u2B>LO(j1pOrKh-xj?Ia4`8m^i-Iq}Ac}Fc(bi`X1M+@{l-@sl6^~{J zmTCdVfQc+PRroMAF4K_-5bpLZwDp;6h^5tYVS7VaLv0nDIM9Oy%Z`{YdROI*(wxI( zO)Il57(6<>1L<(nCwZbbKP3&k28o>d0TQ;(j79(|!r&$mIf}+n6V}ddMTCrQ4EIE% zN6}>NPg>H-kq4Xo4k}4^xM}D8{$eeW`TZuafV5lShXtmUn|9srA3*Ol0c7Zg&*3uf zDDsk63tkPi(9Ab)W;EE|Qty^wt4{XlUW@0TNS^3l4# z`}z@}YLc~^Wsy+{jDw_@W^FcMilC3&mtDVzHt*ALY}FMY{B zf*KK#Oh*%?L6o=8=TF8;Ar`5&3+jh*uV)R;HPXMrEuC^e{#h8y{`?#GB#|UJeDYk?UTV71t*rIBCN%1aqwY3Tsi! zr;cyj18L^%@N6w8L*#qcSa?j0atyMFsI}5In3n54^hbMzc_DPP0rD$18m6n;lO(%V zZy!Jh(N8=u@*&ttqL?mk)B+$2hIT@+!x#+|OIS2KeD;N{+HOm(*QabY!;CHlKUH*F z*b)ez2BD)O33XlcsG!KFrGnUt9AILe_YIrp7n=f9*NpX?xfvuP*dXm31Wn$tupd=T zfRo^P)#r3!x7L&8p{N&9QLa=JZ4AJ${-P8i-Nma2VUm5_qqi!PQ-Nq2FFSe37@mrV;MfMs8Pzp(nFVmDekXU(gDm*Ca zx7Ji>40uQ2Je0jDmmtM~DZT94Dh};n!ZifN8lCn%`y46HNJ&~|ICi!8#0ySzZ3|>0 z4Xrx^vsltNk7bzlRS0ESv23yy@yJ^rliFx^wAB`7zUsc<^1|<&&)vZWB zWbX=WQzVz@Ibm=Owe?$oSW2Nk(R3?WN~4@qy&DqPUrLav(vd4!3^Uo1b1=M}a(HEX z*oV>i61b-}K9}rI(9TW(l4^M>T96amgqHF@VE=l%cJSOY}CjKx65OLqSZQu*AmT7rC@vXR~+k+Enctdex{y!&m4&v$~BM zKOgqR7gRvCz*#VJb|g+HO`a>?CB?hLG)Hct_@X#*hG>%}6y^%Sl-i%gdO7o*H%4MH zl?&GZR4fN~HV2N0lu$QrO zJ|(Y5`#`=fR#xxJoXTF1lKZ3;%wBboePDG#8l8R|^JdI9-T-~t296}8Tgc9EFZ?pd zB(ZeY(_jOHSr`aWSHrmhx-Xf26OG7?ulFHwspbxsmDYCvoWApOpa~X!2ZQ#e{>b2b zdlyXh4?M3djs5e{Wk#)cV|0X zfwl37g1CH-?56kjOZlN-gs`xMSgq5(=Y&lak`n7Yj0pAHF%;z1nv zyn7%5ThCZyLO1Ie^{?Sqwq%DkhxLt5aI)9-#n#f1@02jp!dgLfWwr!5`#dyF_w%q$ zot!4gX7*=fuFj;w7jPNU3bGL@F$W5_V-AemBQ?^Wo2)VRaM}OJ$4VdiY@*X{(e~`c zb+nPQ`VKTZlj-~kcVC;P^7D>H?o?1vp8~AKrVbwm0$F11wrrt^iuHfZKuaGI0?i+j z9G*d8V#$wJCNyQ_PCG)iUFo*LvN$Zs^N1pXXOOxu#p|X66_Gw_KM5qL*>7T3@ErBW z6!Ij41y_sn*NqZ-kiU^Jq=|f*F?$x7j{5uc(Nhc92%*zsg;~?!V7^-EXUWy1@mW;5 z-k;hh6H`EBK0`(eh%;AYY0QVyY+imQo!$>F22irOFDefmnQO@y1(fw`L4u+!-!N=; zLyr}X-HQqebpBpBO(SPBh}eWrK3WpOf*@=I&!heHdMo_r@{Lc|lvACa~Q-aN>KfFJ!aQ_5^r7)~4ayR8@y;qSA6ZR>zt{eu< z!*E{NFE}2*+zGVr12cVQWiKo07DQtsa zt`D}T=_x3}wuax~e8eQ2h)@oWZ>87rY`>3c5ZgJ9M{M&33_qQ|(UM_C`85zbsjNlkGO-sdSrHb3223Ab(S z<7RJ$j@=;6du+?Rg0yHaVR6>A+u%cjQ_h+AJr7acHU22|M3L<&6J39&Yl8aFR*%m_ zX$#=Wf9pX{r5-w#`fJZFI}$IzF7i7d+ld$vf%pI7+fts@xY0=*L#EPO(qvP_fT5In znQNYU=}~D}L>Sq%;MumlBxOX>6*qXQnX)%u?KmX8Yo(4$Y$G+YY!P-i@e11m5rXW4 zPi?z`$T{HV(1yc64DI|0BKvM%;RToTY^zmWf3>X$k!Ryp5C|pw9NLkG5T6D+%&zI@PWjw(3X~c-pHadhfjsY$0BI|QqL6Xg$j?JJZu@NvDyX6?&$oDaaJEw)nURQkJF&C zBh$;a1R0S<-$RC%X#|o8IU6SVZe)0kf_8(0MW}s?91|~y@c7T340#lI!W>2IQ=C_8 zv0#CdKv#e53b)sv6^ycJHEc+B4dh+s=}Wi#RL&IS0R1i~5FUfm?PXDP?x(U1YaiZ=)&~CC-rh_# z#m>IA(JKYvAl^&fZ+!ldq4#qF1pdm^5X+4^dhG@yz=sz9Oun36_?diLQTGnMkocur z|DzMqsq&|hG1PFITtt=c+Y+tXykalwj%sHNLiln1n{Jl}2$q(`+%m01z+h)FE&*?Z z>ofkG)Vy3|{)SD^;60QR2cB+NdRNz+u-%H`xAp)nZ~y zYu4NvS)#8mtR*OiZU4I*ZQ-W#%%_n{ow1XHl#hIgH_Y(1qETV@g%I4Wh5QUF8q9(N zGHuw@JlT-)xzon~h}If)am<3YIxGXw>w*E%;x9RA_-7$>2mBZ_T-6Fn_+ZGxL z@fo~TTssFJ2$QYe(LEp2CyN#dr5kqhM$rg6*7noDC*!50EwSL+E*J!(Zt>1+s*}Ba zA{Nxsxh^EBZzw@P(W$)_2W`It$G`PMze_>0(4Nh=`;$eGn1ikQ#w?@*cuRuBt<-AI zt8(}peEP1?LqN!shmf>=H3)1%`c#TXXTReoLX~H5<%T&;@9Ch1V3-(()2a-6HWf$7 z@o^XHFfx7M`vur1eA{Tldbv{zqz0$lEIO4br)|F5F-YTO4JKKr#S7%9NKTGmx>I%L zHL}Yji_{Z3xB@|QcP)}%KYOix2r(js8C{g1jrtT%ZmD&LGq3Wg=HpmN$pS>Y|jH*!D;i^FgcGqC3!gHYEGO{ zQT%R`UXoDqetNzPNy!I3hh=xeG^kTu`z&Vl$&qrQsYewha$ha?M!fNg5_wDH57k4c zX9yj?3W*c_$I9ci8r7T1<%h+PC3BUwi6*BeDV|G8GgHF^IgML<=LC5srEIeL)o&-r zrx3MvT#8Z8%#^=?7#kE-HV<(%k!Oahk}ml)-AQ-7=rpS@{a!wVtW0FOs?WYDzv$x1 z+K$UWO+>~MmLptpv=z~cRIu1)R!<$5|6%1KuYDl5^UuW}${Qmg!cycv$D}6Z< z@Gsx~L%vqzHEsR~*4(C#kr}b!Bhgg#nU7@IWahL$&Ys%;v7DwQK;89`oG5D-_CU z*_sEz`OsX6H2YM6wA{21D`x_6N*wKfWXV})lBDhY&O zr_6&wm5Zc%wUCPQF@tRwn&KN*PzN6`b_r5Co%>! znw~9iZ#ADYyq_XY8%g>gfGE7pWp?W4fp$lGS|k7*ds5B`HC)l3o3zUkA8dMz0u2Lw z#9SsR^yNzEB7lJ`*1tS;i+LE;F7i%OAuNAvLS9xG1!lXK(zXEDslM7FmuLwjfxmmN zq-USPaJ#?I`ir4e?m99`5E~gmpJxA&&}A0m9T!NJeKbI3AE8Ze|6nkp%J%SSQk_o z&~anBF6HEpxeM!>7Ssns;ea*{t(?lx9MIaWU!#LpSjUp*4rikJ{!Zo}8*~B$P;j*R z*}W=LgktegXM@i{o%JB0=r{vkO38EbTQoWc`gF$g@}Nx;DDA5bV41f*FOTKFIA~ja z<9T_6RYek0tVzA)F*zn85<3bVv;tqUC*H-hFNc?_iS1PNRXJru%5mdc~%0KO+~|$#a`+w4O27ev7SIW2@M5 zT#?m*zqVZlOG2Zw9|>hKaJy{;a1*YS&V_Q)=-6ghUUNSP#HzWQZ6i%m)r6`{Dw=1D zmjy8#|C;PbXZOa85hF&FSB@1oBLTRf{i0t1A#NjLY=1#8M-HB6i;IMKpcO!cwB#M& z(gwCllG;hY)uK~vY$a}jgKNW4;3;)J4L^5ho>Nw@yw`R)Zhz(M&nYVEzWZ#?Lg&2= zIkRU}3`f6CSioGnEC?5v01;*VeAr!^WUp7f{|4JDCc4s$@Ngz>E6oLI1)KIYS#7SM zv=J%RmGdX^QV|>*lfcoW`_x#h6QL%;1eTXaXSX5S^W>N)8&QhGoA^C7(2+)j_j_an zy9pAq&PacPEd02%B+VJ^XW7=UG3(x4N`1o{m&icc`UN9w1JT*Y=||5!InvjMhTjNF zpn&kg7#|a4yz1d6ZB-`I0Gcw|Ih$(#i9qai+rd(GfWy-bUEWJeKf?YRgdwHQs{lzh zcQwe-KJcN+!cD+udZfeVwP=zi%-9>h^~I@e9X2FGx^Dxkisy5CfWUyF0152K`+-CT z2}`1q6zetyc2Kml6yfSNI>vVk*TPoR^*M}Ep0|+`6Y~oM#-ESu3&QC*sfHe2Yx@~a zLQId8G&t~Fk03#3!l8JFy=7_hij^V=t(CSeu%}V-6|Qvced@pL$@Jjhh$#BxU-miL zBnMW-FEKe7_k+y_)Uez(c=J5_&2(<0E5a9Vo$d96q_SU1p< z9H;Nm+V{+2vnazPLI|2Up5$d0>5^ zPoS!u85Z@uWanB_)Y$s@bx0pI!kNY}nlNp=16IwOQk>*t9azox|z9dyw?sJy}Mh$^Ma5 zVME14Pj_~t^A7(*4^d%;bK)?4pPdAf?#66nduZVetY!b;^JhNwrcrHy!{Zn?S@Uhr zU)sEwQY$QZbagfs(bStu*6e;P@1b$%i@4*nn}Yj0wFD!oCO=NJk=C z10C@JR;cAoJjtO-RPrg9N5SbBM^(E(Q&W2q-~iZUkRuS554x7aan{O!n&@~_$|BG` zCR5FuQY@oV`-3DJZW>boz|LRiau(GgzgZD4Yy@kzdpI3F3FgDn6lV@ut3CESVIV|v z8rk&lryGzmOz55j%YDn#%t24qR^SntxF_(3b>UX&vX|5|Fp0m2Ce$xIgZad zdmQ0{|J5u%kmDTf(%gz{!3s_1uIGR@;#nYB)PC8{k4$tj1~MT?$&la}a5}SuT=qk& z4$W4F_jk@RrT)kT+L7ygJ?96@qM=&!9}rdLXmvxL^I;P`R1ul1&$-azcs2**o{nmd zrBAo%#ydtYE4bIy5Ue8Q`>W_NMa}g49A^SG7C2Y`_!&v(3Y_C&4RN=}{8BN$jwz9g z=hRTnAk4I@hBzm=@fR$ifPTsnDVgfNA+=lm@$KQ^?D<={x&V70jEFV8sh z=wAhZz^~3lW@ZmdWXo5`rWQZMaJ)i;;Z+tmy8{b|U<)A$?kwA@O^iR}#e#N?10N4Y|pjEAX*0DRH z=%P+`3^OL!h3Nrgzt=I0%J(?Fj=$)$>X^Nb8zafN&x!cP44X_p`<-L3J!BZNQOj;` zJ>|dX7|6z#)4y`0(T*1#HT=h2_X9^Rt~uVJG=mdnUIW#A8xyZ*t6QN;oY?QMskgr5 zIEA##`>Zdkt3PwZ3M<#bCtTUIzspg~%Hii-j&u+o&33+{zW=xb-r1_BT`#G3jB@s~ z)2)4C0XTd%MpA!2(fKPAUA`s~^58YloEnZg$|55X5U=ij+W|l}wr)if4bpsv#m5{I zZ0yj3{QLubiwttd7KTl+s)O!!6q$l~=a?mO~ z^6`sX9f`TMm~XX#MfEF}H!qzR5XmlC0IOxCNn3-tAQe^RQ>)7+kEOg4e?lA-|6U7HpAvsIfGvtjK-1n;4cpJm+Z_aTr09K5 zKXNaIdjHmGte;b*ptoQDIcQdI`%ZD^gkXb3rvS!+Pc-cy)zqiag0HD;8M2Gv(7t~^ zl+u*ynE$W3?~aeE+S-24Iny$kv^i(e6DA=r2@psq3ZWzc0#XBnqLPpV5+IO93Pr#K zuLV0;SQez%5JZY?D|jV{?Oq#r)vJgatk;VO+@^@=_w0SnnaqUXd*A#1zVG+@@<(Ro zlzsNuW$m@sde*b7)Lv?FI08?m+jKZJWew?wcP-gowkY_Cvl&2#@c*=PjAtSAg zB5rlfqAg27jZtccrc{5c3m~srbp-8r1=ZyB>epE{d$F7*BF@Gce_r(+nHgqAhQ{iwyi<|G zEo?8cE}aeqT?W`mL+yMS$DWaN z-(~^d2Y4HkmxM@u&cnT zOHos54uD7;O) zwOC@O?hTpdPf9&?!&+d8{QZA3?Ox}Wa1JFs;O)hsk7CnVD1%N*e&sV;Jge>)3G(e}3@ zqOI8X%qyqaPdd{eDl`1_CiY9GPXoi!45S_|ojRj%dI7{9sASBIE_P?&|1Iit4bOf{ zM+U@sRGcUpH+gKp&HYJ`2k(iB3Zs52qaq?v1lWUk&JHjZfxw8S#v{<^wi7O!-B<4G z>znKI=Q0P+*$J0r5I4`6Uy6DOyb=O1-`Zex(&ovLPAY5#@L#w? zK05>m)xv8L%QEjN@SNW{8M3nZ=@9oNKtJN0D$sXexvxNb86ptO8KRMSuktg~;iNUU z@W5xTn;e-y&t9sjVL|uPnrIlZhqkH(3wKvBA56tr^9Xi{-@96x5K=a z$(`5&QXt^het5cBQ=T^%;Ld9-)_j=$173pnSH~;p90^7pu%!~(H$H>k2YFo{t?s(V zAO`bA$_Nhf)O*te)GTSPYpV2$+c>@kZU|W7^!%jUZJ={c>qE(y*{B+l0#`OHpe+qi zQ>pDkD{}MQl4Ri?I+aRSx$Fw6O6!|Bto89{pItg|kRc*OJrqO+n8y@6y5YdRjYvTks^~5a{20mUvXB zds=YQMV=L~X7UED#0UVZZc{;B>L?a?KFWpuJ0f8qIw}sBG@acqbY#@Z)k$G5Oik%{-VRkNGK?DuL#hb9B1q+SQ_HRzf@Zix#kxwI3Aul`3Hvi(2^8fD! z`X3IlR4f9)Z3MZ6iQO^BS5x`PxMXgOu!TXXF**PXJ(d4z0c~sx5WL<*M0VXW7zDy! zUI9mqcMkFllud|8bn26P)WY%x4)#i?*c#F>pyc<@9H-brnOjWM|9jiBk1_W?}ueTxbcIR!H(+< z`-&(yUC$Gdpf^`v6B-&=Q9Ag#O^f!Q3aW%S7tvS0n{NhqFc2M?<{Ut`^|0F}8r|)G zHh(+A{$CBkGRRy^=6nzffCw^(MWBm5r!(n^@d5#N@!=IHcmD5GUpQ50>%xc_ z9)D}Dgxfl^98tnvS16s!P6?+4iI`ge zi_WLWg&{UpcEXjU5P%Gkl-DmMgko-RHnR_}aeb*E$qW2M^;09PY;C>kX_;0nv~**a zH@Zei?D(_JwTewQt&?;Rc(1GXIU^1C!IYQa2daM=o`c={ocB5?v=z~AaaV>UDOk>F zYj?oU^A9=`ED)@H*zQBl335ya^f?&soG=hg;=Kl;po3mP*js!xEGy?#SXN$KWOcEI zSDi0PPAoK~6_sA=;RgX$ZQbm71f_tO%kf0-0c_Y}y{?0mC( zBxn#fB8|j`eO)*qnzZh17KU6uvDPkX>wy?FUv3Pnm7}ZX&#!EtsV^%& zHn~w64OrS0QaW{CD*cd9Q3R3qbnQdHB^awYgkHrK3emJ97nY;$VuHVdKFNN zzG+3%eJ~Du+9c(VabEqu{d1x?N@JrGibFWzway~2-X&=XJ}iT2 z4ONYcR|LGowDM(m56UZ+kQ#fLl%n7O)i0Ag;>&f*q_hwmLDW50HFz-&ybYd?cX@l6 z6npta-^J-%+10~V^Qw#OhJfH+q|H{XqB+Z?n4!zc8+Zof#>*!z0tc)9>v&+?xu|SZ!)wzP|;)IUPS?cNEg5 zbbb}*Yf7KpxlC{@1eeFbOE}o|tK&pNOs77AswV=LsI5i1gbiCR9aMzq`hPgL80OYh zZg%(^?GFlly%SFKQ#WYHJCY&0=k0EA!%3WF%#qEoY zrIKs3I685oHi167L2IR|C&0m%w_6LR*0owaO*pAVaM?JNZuug~K_!1uT=f3c+9ih6 z&a`@Z@}f!a@?y?|M$(%xSOP|9-D!V6Ig1Tx)qbzgM|S{Ey=PAkI}5*7J0a1=GjSf~ zx?cN}M0<8>H?ajTX;URCJBC^w*roMh?|rQ);#3SjIFJT?pj|;_x1(M+y{RR!{U2!6 z7PjkgEl%7tf=)iIT^@0)ak3^u<}MqI}Y#7pC8uZ*y`uCp@_%Xr>&v7?V6RA^+#~c zhW%PPEqYw*k^I|$Qab$yEsxIa*Y;EWF|7w1`i|zZ-dS)v;xt~=N~qyU?Vb(oS`#a4 z)9wmv7W-Yup-KsFYEE|7P1lQ_h#d_?F1i0~|oR&)e1uIA zH`$7>&9x$JN8tB>O6VhipIi`A*CZaUKTsG71vH*q&uZOTf~N!j1<9|^4Ok~C8|DM$ z$%`=(<2ns+L3zW1W?l+E#Rs7dMCLy#m+@oRn$?yzl`kj-5A4EH^ZhYxOL_hkT)@BL zqQSM|2Vf_nC__KckHMJ9>A1xYPHigggUz~vW3c($?`0J{%GC0p7BfL7;zh|#4Wh|- zC}ZioIzU``0r1fpA7(ON{h-0$iyuqNMH6!vKmGAxEtL)1q1`O=sW%ATT$ijuu0=eXd>6o3l#tNrES%DI1#SVdqk6HkR&M6jQB_*Gao0!{fua zU5h&#aiF9RbA6!=llhR2qnaOON8*LSF#LK^LJ1r3m9{}*m%pYZN{}jz?3dfLg@ID# z$jw@##E!nAjpXN>*y&wbe&G4|H??=5{T|a|X(}n0>)%*{%NtE|Fq}5{^VZ?p>ac#o?tVw&ntnHTQi{)nVm82aPZ;sj_ca@6)YM;C+vtT&~IoY zktOmFg{3fOtsCqWeV4cwQVW>X>8;b+asd*s>3b7act+a{dWz3`gi`wnIh<}kFWU$i zPJmdNn(UzEE>99qJ!|e9sQhOwDJ|fDPK#XCIJ#lQwC37?6ZDSDlS<#%xK0s$=lJf|g->)I%Xcoe1otc8c^ z+uO8-<&6s~8)@qO(P<3z@JPl>(2Da~9nH}^4tDaqmaR}mTP$D~KdTltRPuZ(1BTH< z8=tncV@I|UUOmIaEz~RSsacuZMScvE_mpp?tPae?08tly33N zqb#S#Nk9Hey9+tVJjgEaMGp%dJ&!@gD?-ozps@{Sz`XsW>UoPE{YjfePq{s(^t;ag zr2T{Hf7E)37d5-$;UBdtWXf@R_EX=_BoDP+0|n^xi$FC(YecA2Vr&=<3H6jx@6+0Y z)P4@iCRsds87+Ff!7{k8ekN2Z?A!wS!aNBSKxMfJ+9_z7S6pZSJpx(18KUXsXG;x57-NhiI;eQyS_JL=59Tf}8l4fC}fD zZ_2ZD2Oc+vX;Je$e#`vkYHp`Sz1P1Dc&AY2AB~HSWM5_~v#d0HkkX6xBq(45NL4-* zGokw!B&46l3FQ%W1go3>N5E6)_w!Q{*z)emM1{T5QyC7Z+c0IKsB~CvaX~`^;1Ow+ z_@M0FZZF$8O!-kF+YseW${(P--^ozHyaSaaKqH4KR`y-K;*@ApeusdZO$(G607F|_VmcMc_4 zEQO{Y2$~e_J*I%$`}L6S>{*NDCkwS^0J~YX%Uw%HhJt13)IM_dgx6^wSODPImQk z?)f&_f6$#KqFEFW@6wSE6S`61N-ub>+cNA6`*{4RQ=-$(8nXx&gi4!8W-6Hb3^ zQ6kyQqwd!fdZD}rHmxaO<%<5?9nSJUb$3H9M+br$k)G4W7JlZAlmmXZ9(Uhsp_kuQ zyID8`8}0eZJ=4PX3grIU-Sq4a>NRH4lr?A7L}LrR@vLe>s1Kf1<7w4WucMD&I6x#- zUWT64Huezhx(y&T>Nbz(OzPbmD-m~s!1~XTO?rx8?u(!! zBS0eh#946tZtSTguqQ*bA8aw)5V;svV$~DU51K2#oesiVVHGFXw~^XO#{d(gUEb+R zJg6M*!vMPTCOv=`#>=e-W0I&a4oi@C8<;4IRGkNjzP@MOZs&h)-+I?Bb!qnPfQG#PvhHNEc9rVTmE-84Kr3S`|nr^?Yr8 zygC{-C#P=ye5BnT%QJ6R{q`$~La8xbYe#``G(Q7*!8T`TgXvaVj9siR^xorAB1`V2 z)!E5;zZ)bQ+1leY3z9V>7#xIvni6%5k$TWIYTq~%(-&|+gTIofiGsz!sJ;N2X|(r1R^->Ddv z)ymy=vswF4ZJc7$hbSEw0qfYrTy2Ph_72c`SU3uo9UrTu$aM4$#79Ms*YYI#bSGl) z-dW?0DK}RTQ;*@+3|%J+STb|5jH35AMwOdzg4a`1)5&jWDCcQO0`4;fTMYf&I}zzk zfAoaW{A=7d1vqXf?RV}Q1AepPzjM!$s4Wk=?x^eBLul~2q$nN7nvsz~r)r{8=-74c zpK0kO?x+Z{A=DQ?-WK%c_3muCZfjU1)xDXS~Poft-D-K?boZ9GY{JV zUaL%`Xo2x6lZTgNLJO@BiXHO6_hee1%?hjg4;4Qo~tklKLc)bZ4jtsLn_D!sJX9DZsbrTU-ZSpReZ7 z?J5?f=QGuhsN0{QGlU;Q^zE-(pgC=MF5F5#od+KN@TYKyB6B-dJ|t*O7>+rKa9nJ4 z_53M%N~+Rn1!F`4l{7l|0CdrSJoq_9Tq1N>9~7XEjX`SM#2$#HINDd8OS7&7 z5dT1!+LNv9r$$Q*72Xj_M>j>r5-2<4Xy2#Eh>^7(WDjliA+Z$k8MK`6NopAw7jf)^ zSqK+IXk{dYZi*bhRj7Ce3|3Xx*dQarBwKgtGc*Ew{6(r&nn~fCBD3hj`@tag>MeHF z0n~_oq1crRnw~k6)Cd_+ud@9}T#O(X2W=T27Q(hnQbA~0?^f#>8n{N%oW*928lOH( z5Nt{*r`)l~E&@8zYn>r9_Fbf;Soa!;N#~w&r&HD~sK=Sj2&QRugSK?-$IvS3CqTbA zdj_ri{KxJAv?mrk+``}x5 zZ#(sU7Pnn>H|!{(-@C75yL+j(%i{dAXWU4l*t;bqoV86>|0z?RTirt8`QU~*c0!J1 zcl^`6Llx%<=ND|dHAhw0;ht)VBJw)28wRO!A*SxMge#K^W|1^p(^%-GY8VV(Xij~+ z?ubw?QP|E9^)V^hkU}t03P6UDG>F!0MNA@>RSAKzieD8Vs%UCImzUm=5gzV25yktW z4<8(M>h^q?GtwA)}$DDGamfa0s7sljv|3 zy3tV`tJ0cBp*=f)Z;7-DX-a!GhR4frNVZ$SEe44L}M~Kg{zgWR_x6QqpD%XO8 zFKz;ovU9_fh}HVE&Keo-1kg_xt}y>iG4vaM#WWh41fq-)k604D9Z8EIn~(*e1BEe; zYgN!xA8}8kkTYsas9`(cItbM-^=b&=k-*k_TLN79+%bRPj5^xNurk6`V|w&0tbT&_ z0zx}0!R(h+0+}tScQy}F5Q}yWIE3EUsJF`CPQd90cBxbRWDOBdsHx1cTfJGL!ky~) zXyf608xdeWAbuG=c}z(KeUN%sqReO25DMR>Zm90OF2jJpY2c9MByfQ>S8YU)H8fp# z+P^e|pbJ4u!S{+aUBI7c>wZ-gDVI0yS7XJOmfdnDWid60Eq_dX1H490tCtQj>!fP~ zynRt(&_V77=zI*$6lxz72VV1?Y6?5>v|1|B>W9^D=&F6H!J$j9?^8F;F-tOEiu)Nl z7bfZ}y0-Hf7%n>>*I%D&ERdUYd{CU18;ru)U-zre$yB=!xr-_uQQcrC_Oo#qaM9qx z*(WcmpfD1>JbWi;rO-{o3(dRC>i$PPbg@o|&`JZ$Y+#5q{E{Rbod111{?VmavcELwQI<0w7eL>${vSAOYa0_gHQT6`MU;NHJYIG;F z5l!8wXd$Ayyu(CA?Z(cRuHLA`sJUDYne4Hc*!ZpPN0p?18cH%j+$wW#2^>xLV4~9-gdNpvNJB;{H62s z`hP(urxg_{(KTDcx+nV&8_Ne$g^n(qJn;&l?K)ZZJXMzH#;s7bCVhf9P5XScmG&@% zZH}k_tCh%;q^}y0m1;Y?VZItG^W?@LmF}sAU6>v*sY;D&$)7mAVA|yT>EmV=lonkv zd3yfkr6VU6j+#(fFnVl35$ZP^Ir7Gh;np4QO_)3yx%jZki|l;H=eRL&`09rOFY_P# zt-BZVLG9Q8;=D~veQI`ds;0MG>kqEHkl=vx5==Av=XAC-h%5%g;(+6#? zr2!P|Uh~*UA?6niXNG!U3;;D#2p~Hc3$NAxPYd08DI(VXj!I+k{s4O%+xF(=TM~dW6g>oS)x0!5W>e1VArq zD6CGyZdKFzrHV!U!cz5THtC#|T>f#3NO|psbx~TpNK#-vHcc!DqLc|$l=U?B%=P6K zYs*f%@M=vd(qb3vmYCu z_Y+-Fu@}pD$CFfmoV<5bOgwj?93pF z104dtO3v}o*7fQRIyXZdOzE%nNMI9YVynm?);uofl=06p1VSJSmdEzT7OU*OWn@P(RAt;WYB?=>%lN#DKLD; zP|@#@5F4GSWYV7PaAc+=DZN7c3K;Emdt%6DQ^IMVO%B%#MS5vfBNX`xy&9B~5|TuD zR?sN}X?!LK7u>U(0+4gkdAYQ!r;d+RCi->u;lIeSR1}6@5bn9tH+wuZ;upD<6~`&* zSO)L4b)(b2NJ#E3$@UGB3~h3$9LlE1%3q~krZ%XfT*r0z$0`Ku)&D+~UW&FU$w4k| z{>DKEc373fu9~2GKryCn-`NjN;x)dqDBUxRwh~U*fL(`foyWwit1qmbSyfkE4u?6A zxM;g@Hrc8ymTAQnMP+}mD+eWd;GfZP?BNgvfHjaY$FL8bN_kjUZF%c?`4TGLh8{$t z#Sm%`LD$DBi5q?acKZD}2?m6bH!H&xgB04MVv@B!1}ydRPzm`so>RPTqs|8AcqRuY z3s3LiGcgW&S1r4jtVd+tk$PVVC^Dx3yu!NmNrB3F)gm3{zGh@cXn{8Ml(=G_zL z+VH%xm-ak?==cNoVXL_<8DsJGtuXiQegt~g+2@tnR5c0D$EGioG9Opk$vqfb;`p6P zxZ#lT?S#8ACKqUh7gHTJc4()v!%piS!|Fa~pYke&ZB%lE(>2=M3j}XnFot8bgf9AS z8eAO+ZmXar8{uo7Vv()1?jdC)eRDW1nQ|im1y6iHxkhFWY*ywd{DBd4({|+}iVO9q zwC=4K7?19QPI2oF<$7L;82WvQ#h&6^>ED$7Mt$fb-sY_v6{pJ_yL?Eos)v-baF3mq zfpvdIak5p9D4Ig|e4f;k>gR=ar<(oBDe7QtOOWKRz~+?s^zKw&_`5T_1f$Nk?$L6v%xku1~{6aQ_DGuz|A5%{7HgVBE2`wt{9jI_3wA>3?hql}gpZuwZ zlq7cJJxZN`|=gl_*7y|V88kU^jvQHRpm zui|4^*g6HE()O618qHp>Orn3ZW8c!YUb%thtOD<_{VqJN><%TBUS1v&N%MH3NRY(A zD0#oz65=P|XTQHgDUe9IOZkqzyG!{nR47@x`+^SMh0*=(-3s)`ryW){YJ;*)(ml#$ zw<7?i{%u7u*bP5 z=||ug_*gK3JQIFYvW-c;@<%1*vRtex4cyA=6*`*Wx-?uK<|r`d6f{17B(c5mH7#%A zaC!3rK8@(DAAxz8)Gylqq|-ktTF^|R@U!T`N(M>s8U7d9B*S$k;VStYWcSTLs- zjxNl>ez;dZ|Dz0P2|SE$R`lsmKExCC@L0rje*CP`4nA2KW8%AH2{xV2;Y6?h8l1e% zsZvB2a-7|rDmf&1b_v_oU3$Y2qpNwG1TmjGc+41aI^t8{RsUJnh~Si-6eFC`oB=t& zISp-BIHd_r>1E{Ug-GLl=Wyc`4NNobiP{{x??dPq+*n9anNlg`+=81;3%F0C zFVAqgn(ptWrP8AVkl zA&-|>EUE1M1AiN_d%9M9$ONuRy8&bw{ z4na4!)o7H%b3(lMN{YgNgXbW9fC-)3+gLuOG5WBLde!HRz@LYdMU(Ewa6L? zey~c8jEB1Gox8$YwyMkvSXWuk4b@6!RC?|(!@gNLqBu7<1KM;y(0nhb2A&N6w5U?C z!5Sfk9?!qIlCmlgqsPzLN`Z1{93kl7#Q}P~8f(&?@4%3FqFNb3-WmY1yjh`k%CAud z@}Ke4T%+6;Icy&EGcF~K(n+dS67_<2*C?T(9SCTn^zeEVjFN!iuT}a`eLe79D9%a; zYB5H{w+VIVK=JGkYL&|qIv%0>H%6rA_T;_P2q*B=C1}d=b;{a^VGAm2D;uijnf2f# z_weGQ+M=XWb(jPtyx=LdinHTtQP96zwRrYKy)r~D%gjY*7gzM=|N9nKpp#ee&)yl{ z?p`#97kX(^Bezok;y)LNNH2%N^RD8b0Csq55G8=@S(SYk^v&U%yxE-gHoI>hFaONU z7O%ymMkPU#(T`GQXsm`FLk};&h#N6`RnL+P{06mD6Pzgfo0O<*bB3Brk_h(;5Ju)6 zVMZ%iKU%OHaE?X};S}Z#Zt&<_vS=|r^7(qVDsZ*SrOX;@ zBK_3l*Ou+gfXe0Wii@FX<6?VK%TnL~-)#rU<=L;H>Myu5p*v046BkB1W~D*PUW>jw zwm2a~^;fdP)4ie9rd0#wV^o+|B7@uH#C%0)j=$bMz=oRYiUgE49W-8s_o%Bk)B_;> zXk4V$65CqQbS1R6M2kyBNAhNAOgD!)CvB+VfR$0`=(*+d7SmQQ7K4qs5fK^s?Oi=7 zgWG;gLJJ;I^%rYwOGlN(i-`Mp_!+kf8L8#@rl<146ldbnz}Li@#_vHV0&(fDbLXmx ztNibHx#&SX4jFMp^_3{7Ts3Z#USkC#M8J1e150C*J(yBG6GPqPQ4_$+8hhw|g!!Tgw2jsAYelQM`CA4fattCz~_hS;H*bgo(P#fcHeuLKms zpDUV6Jjz|F#Pl-z(0^Hg#L_LO25n3!No@`_KR__(gQa7r@#G+e*yD76#yg{R1Tu!# zh|fOCj#Z1b3b2s0@&)`;VB{VuE#aqj^y8!#wav7+@Kr{nIqbmh7^2asy*ujS@3Nrv&{xvJW#I)Uc@LlmMW*8p z^nmF63#)0$!2hV8Ef=k*S**TtBgP@HqW+T|kyK)U`+TC#MsmxbQRTlye<8iLwJq2K z4DHw`h>@&cAO!BkWq0tX674NQnEbu(m#7?g8!#&TjV&rPf$KoXn(&sm@X)}w6PC2*LUiz z3oqk(CB~Od6kF;}vk$w-P&O?p4QArKAWg=QlK_V(c}}4U<@8yVmO(ExD=FRm)A*vY zKwohOcUo}+`aEDV8dJg$34X~mFbeMxD3gl&2#IuA;DYG=U&skMGF*uj%fgVZdgtG6 zpI-f;CmLGtoW8xGqAu)};p?mKp{5m#Ex5dN`V~_Oiu(Hg!*{8wYOy7TVY+t0M z;|3VD_VtA_Y9@>BkX^=Y|5y8B%|Uxy9GA03P!__m_+o%z$lH&nijSL-0Nm0$K3=NoX&INd>XRdKXAjzRD>AE{#)Ul+QcXg?o4`FXi zRr*N8w!xe-B{bGWC39h`@}7>hQhK-02pZ~&hx_S1$-=HEQjXc^WG{sC3v2WDu*=Y{ z2GFaNT&YBL7kx6luBfuSVcxo?=5(~WZ zaJa{k#$#MQ{VF2n?kuFPD)EJe4$>ucaaFA@$6#tIU%=rjhFzvH;8A+kdk(;)T`POU zQrisd{Hyn+`DpSj*tuRF;?US1W-F5wzVG(YJLQT~Gh4-!F&rFAdj?zLHax6o%rh5# z$XybXgn=-j>*2@z|$thx$U&vVo4BDXl#lm-5}|4bgdg;nQ#A=r&;$P2qSg7 zGLF_Q!M6h{@@%~jE*+=u8}RMcP$?_W8o9wG#Uva3%0ou<#D9UFn_Sv^GFFWb>|(Q? zI`0UJb4dt$LwxTv-R6BJ9L}|cugR{!7|P-5H7Sh z5^+nyjD#o5kSRPynw6nr%dt1Es%fslZGna-A^vL0my1)hcVKiH-PRgoqsL>U9kePA zhP>KX=??a5tb~AL5eW;Di#0kuk1(O-J%wn{1t;XYhMAo&Qj_sP1wD_mHDS~W1|t8@ z;3|mTpp@_A1jA%B^gB5{LO1$%nCmzd&>g=-(M#U~nzVPBJKnhXkIURYJE&({Y!cwk z?ql30ZKIpt#U%Rj4UC{C+CrmQ=$lFv2q<`NSnnb&UKWOR+H=Nc3k9yDs0cu0NN<`_ ztxeNQrLEOkv+>naqb)MIn98q0Ov~Lh+A9va2V4Yabtt_RVhQ(|O=XTOuKjcorOAE@v22$)t;l%(uN&RB$Ll5U)uHJu zWR~_%8?_AyQE5wyEuC&{1oi(rm0ARwI7eF%N-r)(MDo$0(sm1Fj)0$eQyv1xB8Op= z?ah;hIZPfSb}~W zq(ct6`=pXWU!7JKx0o+?aoa7o{8v{_=@iddJbht9-7?)XphpOHF;KvjR9|0RRaqfM zSl*|fO`AdlQTC0F;tYJegG4L#H0*3bn;lktuA zz8-QZd+1JSyKOAC-Zfy_#zwRJlKunw_wPTXeDHv*A(ev%XJ=Q;yL3?Yy#9md4#}Q3 zcfi28{f7)3P??Rg(_rP~W+%SY(Ql@b`=yLgT}2Y`rOyl3#|8K3#*B2n`9~ojQtIQq z6kJtDdd6y0dY{y-pwk^7F~uOLZJM9%^A4+m1RRmxqcLMxKk=2v=LA(M13P0Mj?(J; zq(`z54CMqR5n9*Vz_TOOROT3Er1r(Z(wWGbF|KfOU!PeVEs4a;Xun^&m)`nFj%S-c zl*=UgBpP1wRc89`X!d=H@=WI(c&}GZieQ1*+Q>w!~(eavYug-+bBEem?H1) zW6BUyK+apnq1EQmQFXQRs}_ti5Fm84UhYP(SmdVQwhjwwYl;HmfGx1fw@E|(4Hsmt z`DDKjk}H067@!Z;R1A4QI;NvIF~BZYP?N>djh?d0b12OL>|nC|oFS$%--eHUlUH8n)SZWb)5D6`R7npk z?-9pxd&`Kp6*N&TC*vHfTR%Aj5AEa0sssuN}%mdU5(1oFNtx!IN{C5wU~`|vYTfBNxF$=$=WZHw@=ig5{N;~$ zR=QD#LhF_Klu7+4{%-(1x4kKKqe0I}gTsPWH9D{xb$Q@9=?D63kL0lMdeXzsOI6|< zOWr5_OQz86QlA!6l@%GB1E+|X)m(Z8OdD~m27Ct%Jc!VoOu7f7yrLriA`7eO;^+*6 z0?3I5?7-Z;dOKR018P|NcBxIGm?$ZRJ^i?JyTsnuC~c55;cKgES|RK^J}9E#USe}L zNoyol_=E&snCM0W^JQUue=lv9(CX`7le)_YO#c2&kSOwor||fgXi7dHUFvUKnsGq7 zL+@~&;ER4f01v!q+cOU2haA%;O^XO>TljsBAAsuecAJ#!GAFrc;8V#lv3gS<>1|QB z4L%6=0)B#xdr7(#aF>lpV8{s(7>4U@(r=8X8@5Wn{?;JA>S1Yvg+4hf9pU_xb_(Au zPwxuyZ<2^0QUohn`z^M~boeTpja*LwCEs!&9yzub$o=S}eX#?OpBgkB?dzjM>2C|< z7lqal-+gvILV;lyLX0inGGm!tSXo`~%P66?h4R1XqubnxNZ2jEO`8{C;oP@KzE0*i z{sh{xF51e9Yvi30`|u%oE6{y)@<2}LSwNBNu|mzPlY8m}n`K{0HuiqAoD2Y`QI8r{ zwoJZC>Lyk?XBU;g4CHnA>vDO9O&^6FE7Juay`q4jS_C}ZvT{&~VMk?t4LBXVEWpu@ zNIRaKRX-kZA@QY{s_(?)!?zK%-2s5n)mO`X$Pd09XpnmKsTnAYmNwrJl zZ1&kzveO=3P&lTq*UJep@y$oSUx_~W>$P$e^Iao<8qFr%E8py-!+WrN_pJl*4w{a$ zQG#L9Y@i&PvRz*8?V@F>ky|@cti`;6>gwgWeh1`#@N(Pmau&*4FQw3)5Ail(+na%Z_a+g=AW`bPNvBuUPNR6kN6XnRDKI2Urbl|#) zatceFD8C^GEg@WGj%Fc+aJuxxr<>qPZk8K;xbEve1o?OY>+F<8vPK`@2#qm( z6?9RPbvFBuJj;RzJ|E>Cl6~~@Avr3De3t$Bko<_ox6m=P;vY(a%UE5+fD{x>f@GJy z^bZB{t?ggR8p``Yxu4d)t1L*Yc(-@hcMtw@Pp=a<`j#%b?&!=-%O95i>%abM?8r$Y F{|{MrYJmU% delta 103784 zcmd4)cU)B07dMPL!_bB{n?BTm8O|AyYF7lYcflG9Du}2k0s{7in#5j@x->>bW3Ol? z8GG+t6MIdJu`6n-8hzI~XAf%LU!HrP``7jJNxr)4T5GSi*Euuu&*N`YKb~BuDoa-f z^v>>+lb7AwEH-P_sddjzjoY1+(sW`Z^`V$IERffu?pG zvnoUtZ=K<+YNU2;QkavS*SjdS53Xjt<)X4UI7b`An3&AGq8ym*sT$;CsF&=fUGSt* zCB0pxN~}_)N-F$Mdi^AU9d)l%>FTmMnS|NP^G8{v^NYNt>3_Ju$ToIftUivXZo>Db zqe&L&-5<@}sO2KAuw`d8Y%$D}C(QZF1IoYi)%wI1^eeFA^9Tp3-~VZmW>2eF)5ARXi1{dv!NEuTjPle)s;(H4E{Je`-qO{_umm)^@(2ixQn>QqN;M ztxLFFcizb&?f*t06~_hWSE`k6Lbvz7l-rgHlU}?s$O}YrUI}{y4ZLlU9=?iUMSjXW z!k^P7Ad6qTh^n2=S0hZjTepgBHCNocs4y!otuVVU$*+k{nN2u!xWQG9R~Es^BYbn{Qg4goak3_R9;!?v+|*=E3ybv48-W4ROmZXaAGT+_W!^JY z9p=P^K?unME?eNdN>z*P;?0EL->J9N0s(4OqJF2nvIgOV@&F$jNwH90r82+_waNir zSGRLvfAjf-GtO;(WP#c$RRdWdZECm**nHk@hC}xggs+Mbf#ru;9MO$ z9dqXV62@HJmu8XnzHcJ$@Ql>;`lu9(r2eNebL5In*zL;t`7)1w(6Xvs7+XRkae2b= z^)9(sq~w3%n3}Ui_*Y?hxka*n7cZ~89micarFg(DoZy!%S|ENbc>@Dm^`ZMJ=hP0B_v;8D$w(|G7la0MnD z-_$tTHpDCsfuwjlZ|1-ci*TJL@G%kS2XPve6O^n_X@kjNPQ)sN5jN=}G`Fo&LsDuEHgb9hcmFysln&Al-fL7ki1|jPXM6dX5l-whBGLj6 zG^#3Wuc&NK_;AFFCGs?B##|IESZ_8CDEYgFg)mSI4MugKH$_HB{>r(^k>#HzD=y{g#Fia?qnMg zAqCwC49Uss+b+9kaBeXvVLl&9STosg4+%kJ&G^QIk*|%tEYjNRG4dhkk-!D(EwwDt zn@cflBDYM!%&JGw!oB`5u^AYcNi2k>KZ5pJq^RE`*=)WO;e>fJFjO}C!@wr-V(xu;{Su|glu;!sh-7He?-v#!N zQ%2}MBOSxSz8BS4PbXys!t1S?pckYV-};5fOngVe*83--G9=9Omg1iWvu9jQ2pc!- zunv19Z)x{)6Pw2sg3#fIFjtFIvVeNLAZ?e*2jU&Qm2mx-9~fb)pyve^sr(>~(@RsI zyRilQ=n0qHI&%usnbL|?^sKA1LNa0Z;kE8qq?zUQ*pK{x2m?mPhues9mr|ek>bZwL9$HqY7g$c{kyL{m*}*mX%(e_T$N^C)_u8)HRGvoK7{m<2uWA-7V7b-%RpGj<`|l z-pz_IBYiEfIDUkL%s9(xk;l@EdFq7@My#f1;n?B*>OFyipNlC03 zH#@@XPUDx8BKb(8x4A&it9Jfu6L+_S`KeESwnznEQMa#DX7y!y?$QafC(K7jpK(~3 zyr+rUn^om9ApA4v0;)yN?FQ-AHbEBoW|YCj71wK!QOT2}S>Gv#aT3|8ns}-M8Kbh? z<7;*S?7l$}DPiT3MHex({;n#kh0Bmq5ca!t^^1z-Ao!-8fwjP+rf$MNTTR$VZbe!1 z#ud9jw#`H7CVa5HHCn^|Zxmv7eXnPcJnJSb`f28UBxsJ0^lXP4IMq?Rv)f#vgkSZW z{SP{_@ziZ#fAIq%41Y181@5{dQRX@i1=-&ZgcG- z*#XWmVZ`*H`ielh?NzLGNdVF~{tntN3K44CsZGp|i=XgS*5|iK>3pQG_qs{v_5?EE zQG@Vi?=Ds8M17=cdqP;FNQDN%6CKaQDaZEpUV)wBnIz$FbDy9MC(QJR*JXBkDSox$ z+A5)InbZFfDhO@{!^`Z@?ct82JjL&b3R!PI4{1B#CZ+i%9fn^2Xg zi*UP28n2LbZdC|7iB>{Agqq=1a0fc^dIwDMQoo_7V_F=>FhNH0c(sSLW_6g{GZA}^ zEO!4|VgK=JGkd95RwB&&{RSq^hI#TFn10gEU&>gckthC*B)r|baHL{ch80G+^(rb+ z?4wzM=oY{9k#4W7D!0zTu}dyg!swm0q9KdoOc17LR*EN5{iOFRLfFrkRudD1qh7CA zuWbF#3MV*yPZi2SF)ULz;mV@UISTjG-R3TamPew}O}Mgd^=~ZF$i=bD2N|SEgk!&G z;De{K&_`OjD2#1J%c34asj2-Hi=U8U)az{L%c4<}Xg1;WSHm#3AdRB#CP!8NYygG| z>L%1TZ(o`2_`Xv9*Y?ozGrJ&G4T~AnO*pkvLNJvts<0%~G-@R*+IwNC;$iZ>c9Zsf z9WG1$B)a~+%@eXKmXmIN6~wlo`=xn=@%K7jk~LK_eCsML-OA*7{%A(`7M^KI^L(UR zn>`@O%g;gZJN(HXV< z)&!*{wFcU3$3;gA%5=iQ(f3^}bB_2(sg?w$tDxm3sW0dcdp@twI=*!#G^phO5N)$c0MeKYXG57 zhpufDQ@XWTF{KQ2oPh%-YAbew(Oc|1Sp&`_VM$bOK6Xp~C{hFaE=b{maO<^;#WrGe zlGdUa%@s77rRz+1nQHrOJ(=+JXd2yq?1CJVs8EXT;JVe$nPtW+YY`sknT@tdN<@@b zH>y3@SZ*MMfnyh7u0&yqy1Ry|ec3QhBjJ+SRWuf<`Fu>=40RD^e6_QhEeO<+N*0E~W+$~HL@l!OV#4yvn;MGgv;YrJ|>CP zV6I$Q2v4;;hT6~*{qA${gjNeN?48DdOq>!nf!v5p}O-W2EuXkMd-g6 zZ~i?|Of;CVn!ynnqJTYpp{LXp^vuNBB@8;ed_~1hQilbB>@rsZ!gYf?pkEj_zm>dE z3`%c)jTFf?K0$8%0ndH-_Bk(TTx}TW5#S>2TIeKqRYq3c%&&1Aw_m87-vJcF*>Jx? zGE*O^|GHpyf^SDCypbNFFwi?}TxXD1xP*)E`08YDMH3gVH8Bl$PK0h%ot{{vfOS!9 zUWURj;htb8Ka13IZ8ZB5XOkERM-KBumqnRG@UAF%?ZZgRteW#E9AW+xyh|(H+8HeO z9KrZJ{MLbG=*V`qVQcv+g#HTy(Z!VQYV1SnW@1afy9bMG$DbnUcKJc#X}f4v6Jrz& zAw2lYYeDfB_0|jW26m`7uGWc|-x9ND)+o&Gtc16#`rl1f+{CDT?$XNrCjFP(nh7`j z7Pr{8S$!#gU$E3-zsPhLscA35pqrnaut?YTHCnt;A6k%BFg|YBS`q5VsEl!yYa+Ld`xW%<(Di&y)=8 zNAxPR3}LO~%k3$c)@3W=lvctM>q8FUcqyJ;;sJqh!X&S8l!W+8vu0~RzZ+v$Io&I8 zDZ&fyHYY2QuY9hXG;xL}%j3O-X+IRNwUOWk<;T&zSK($zIP;(>O!0ryXS+#;If|N) zKp)gy8DiU23)7EaZEy#-ZbB)0SzS6^#k^*sXa0MVravWl)#MYnh=k9KpN}zsVsiOh zcj@pfAGxOs3g+VLi(h@9YRP`2DwcChc)f>!_LVR*9Ln}$etL_GlyKn%&l1`tT-r6) zoyB1?OmZNc^x1NZs)l(X5HG4jK1phR`ND|GNuHUwESbgFBd&aek*n@But@H+!ol?j z-k9EUts-=7^XhM#5L{ryQ6%OuR|dizr>3Kf5@sf_ecTiXuc%IoimRGF+fkZ1Q()zs z0m6_M0nCILJ0kQf+K7%# zk#i_(!3~G-+2p5ZNH-hElHY~Q<_|f5c^E|@Bn~!2prpch03dwkI(a_Hq8{_&+DbUh zAq!nOg=~^vo9W>Ucy>fM<%$k>S!1oh4zd&WF(nUO!ro+4IvNobuLxx#GZajx^(dzs%J#%(c!&HAE93 zCyPC>)JGl6*74;Czw>HYg#=WM?crKR*gPcn9m!grBt1P8z$$YmL0IOx2|aZA!DM+8 zEpGqivE64sY;tQo>dI1nu!Qwjo$sRL$3)%UgO1YhgMRweoM*!0W4jNw`JH;w>_fhg z#?;X)iytN7rMwZyIC+dEhYV~dpG;^R88TNn1J0rjp8BXgtKA6WD^Ba z=>qv1FdzDsYZ+nG{rjsd(z1h!S`5H_|7p`6EzUM;)=K29XZ z+@DkiR?H8d@Gn)jo|Np^D0h?|4)O*O6#_q|jc<9~I0>t1DCzj@IW4wTYsZe5fXj z1)u$L481wt{E0Q`?1)gg=O2s-pTF(!Gugha#~wEHw~JtHxpWDCiksM0c1SR{5W7xs z$4uD%?gcMpx4Ijcv|zm`uiFR39i5+CNfBn<4FVg;m6EXdb+suL>D2l*^4Q8a_Wkc` zCMlAwyTJoelGTn<{3hi(vJE*eogYkzFnR&(mL_lXW^ehq5{`3@2#~KoGI$=}#eS>EskiUVBXJzcDo6=6dto5v$A;WM9k&q-6{ULq%m4e(baOt@?3 zEj&e1lO7Yj z!|i}@QAZOBj+Es6q^fKSKL)SnNT;O*5MCw?C}Ra7<|V?LU<`n zRfhy6!0kWqA!N15mu>Z>ylC^Sx|ANu`5m>Qp4uEsvIWeTcczqn}2uRW!WEaz~hPQ5DVXIN^lFZ>QF#vui0& z*oeezXcy8z(arQFo-o!O)0ay;_agkNL(Ni))O1NJc9gdg){3?c$BY8&t2jwIxumkJ zckPiX`=mRSZF-j?r7j5rorgM{C1V#I1L4Am8kBf^<1Z~K)xwlZSSq6mH+2)<3ryHY zQul>c*><5UfS*6%-=Pzml8F3a%w?79{3|L?){Rp|_~?s^CdK&EN+V?k>)?9H(`#c+ zNhx1ishhN>G)V3V!SUY>eKML%sFB>V9>p{F*eB@rogn^RkX}w3?YT)39^JbYW9^qWl$zQ&ycOq;s=3!9)xKO^-3$cnoe;P=wj)y>gw4ErOJEjz&cVqM8ZawbeJ5t9w$ud8HEmw|xg*N&1@m8#_ zT49NB`Nj1(uF>(PjSu63BqhRw5BCqTZGh?`KdtLnoReEb&*?^Uz6pQH=`_MN5W_(w zIIq=s!7Qyt!;Sk%H(wy9n3L^kBA~1!?b{Ah?;2FA03Xxgb1X{eGEkh=CL5J+^*c zX72D2$|FaimO>-p^oQyo+vqx+=MMP;vh#9qa9q>uyzIiv;{3umqPM6ZGb_7y`{F`; z0YDy8(M=p2=QI#DfV+OSRk74rsYtTB707#x5 zD`X5;d$Mw_KZMIpIqksiTM_Vj5T-tj_^pJ{q49fkZrCO5y{iKMiS!@@DI}%^o&zMCeqOis`I1<`-OW*LTh^LOPUZ4O9$Wstb=2M@lB~J097yG=_!4^2bUh zL4tX+YW_5uu6WpONcPf#YVF9X6PcNZN5Z5ng>7|T&&ho}1`y!7SoPEMc>ra;88z1-TvS0Ypg!Xf5o})9Z$0l=m5N@j8{64;C z_G<^m_zHxNwp{*_tgvDeB*lld=ITdyYi>)-NNl{n?yJ_ZYP_3p$aQGiWjgA=(aTa7;kwVuPFbWWzeKXvToi=ub`>16 zNV9GlS^EykSi&Dx&BO;E4)>J8;8onN`GP5N_(H{#P-fz%N7#BxREk9!^4g#u#jmx5 z>BXPjvmIKrWVq=IDPQ{fz`5CW8a9sKKnN3_8@|CeylyB@Q6o{35toOAVJ+)aI2*us zA>1?KFO1FcKln+vPKGjfE(F5J?%&MCeBr#Gly}lmT6@xsHRrvA1rP1;E}uoX_tEWWEFhjT!P8Foz-I^VA}nxxfvH3NQ$}gW zStSv_j;$AFZ^QHiTcJ%C%tSZy353C>ZbOs_8RwM=-(%~u&Q%X8n-6)2n}_lVgzX1j zTcVI0_tcKDxx9;T@t|$jlx@no;Wo#37vc5macFGuKZHWiGb|pJJ+*UXFL^)V2l&27P<}nf%`WSD0=PqbiBR+<(-vzH=iwQ(SB86J;&w+!-Z&jK`S`kFR^8Q0ejlbKygL8^U$M zxL@Ti>Dg)JIGoT>=Z~wiky@3qA&q-+^lCL_iKVY7o#smro^hF(taMfW9lJgjPs*Tw zu)a>}cJ{Fy(|6{x2!sA<@X}@xQPS*--jMhJ>!6Cs>(to;jxwY0WsKdJnj!qFR? z{nHY2E9$BvA6*Q#9DHZRkevEss5IcTtK6zVTV63O-i`>UF1P%N<5FvTEwD&uPQ`ul znD57tB9>RqoUg)4IRS*>zxboglX6F0RD?q+|E+E%K2ZxgYi75&Ya)ET`EwK`nGY(Q zC+ma*$+8H4JFyjg>t`pG$`8H6{iScO8WySlrP?xCB(V#l?Y^R|{J^EP+Q@EmuSq!2 z&-XaKd3x1Hnsqfmp0E-f{i`Kkpt+8{Y+^weZD=dPmqx>8ixhlCWJ5RsgmC0bT*38f zIGf4WCG0UW{Q~lQMY)Q+#5GT8D~+*8&n}0sRs1qTxTNitTKFm(&R)sABw@hepN|q% zaWX~yahD$|k3o~OT#jTOTt5kiZQYB~nt7#)JnnDY<-oJMc>U^lMY+vH;mjdxwok@F zxto$Nm0`>N*%L9V4r|ejJ;WKr9bta97M;z>9syEPbG+ov#LVMc-c1O9^mav&G;bnr zwFX;;^?&?1UJY9`WaZp>5+=2E?}Kl+)sdHx-ZfXsXv1-QnYI5teCsr~Vgm+eXKL)_ zdqzus*o1BRH(OjKbFG_758=)bZIKYzs<+7ALIwrqyMVjJ&ussfwQ6 z;=P0suO{LhZ`L4X>&1OEL2NDGk#KsLJ09Azjsak9VIQtf;xh@C?6@h?dR6oE! zH@_Dp;}5uc5e{?hg(*NtVmw>R&4lom@4l;Pk#t=Gq|&;MQb}Sc+rWDXA63r57Yaz) zO0NstJcgNtFCRiU?btK4-SeG349V}OacA@R5W=G3@Y;BD>_9`Dq^b2?*oTEdje>aGKSSPM86%uk2e3I@ zK7=8f%18jIM#Vbu15v#6vL&4jp?*o!MZ7WBYsKh}POXFmrzCWyoI81S=}}!J=Cs9y z^SbZd^)CWv4MGB`phZg%jy*gWlh}_5l%A#purK-EgexOM(?|r3*>v7YxbFV3D`XNM zsFsrJ`Lj$ugz$O%O$@#K^c3dToWm&pmNQRy`i&o6O-Q3Fm|uJbA5VR}&gm8Atcr7{ zb+nLp0V}8x{I*N@M~}}@J)d+})_K}rqh;^S3Y&y3Ee?2M^qpRti8&1$VY0;5#E%jLB{S9D9!Rf56SUQjMAjav1~A>matRyHVlucQDRU+Tw1?^ zS_$O#{JFLe9xZ8pgj6g*(zSI0w%YIArkg}?~88qJW8B)!Es@1A@3%f{nF(&nL#+<>LGGSYR2O% z;q2e5^s-3P((ADptY6U46SkP25U%Wtlk||*++Fz?z{i)vzwWHTa5bu1TUk68Y z9ndAjckd{-TtX2o>#D+g1E)>u*;OmO@2X@(YCO+p!w+Ma&Fm76JIyCKdA1JcK z%Aa_narB9|i<7=ZElX`5E){filumY3a)ewI&hR?hbQWnba--|yCLhBMzCPjM_Gk7Y zN1f_0##;${4jR%44YX5zwuHA5mZ)7WlU>StKz}PWoe z!sJJPS}<8`s}MK+GbNa;Mm%!?6FtQ1{s0wt5xo-0T(1;gs~l} zcB_2lji)2HxM5c+CV^u+g-eEfH`tY^@nmDT8WQ#^+qXt}(y4qU*FJ(hhx4yr zRgT$^uRJ_`i~H|eJAW&kp%KawHLg%65sjxQUypFcn?QUFRlluLC;1Tx*j@F;JDEF} zRi<{87PWI>VLY4?jt?C^o=!%2XUB-IU^`C>tNOt_agvLq>!7?t_YJC_)8hnam1@*aY5_Y>W7WX@w9WM7vsqNg@V*b#Y(BAU-LxTvfsPyQmr=`n-fS&>mB!{NxinpBCk=h{l(J^j zmRv2&tcSV9RK70Z_*Z#2u}!X0EM0{yUMDX%Q^E=EBu^T>YVB?UWg9Xv@{oU$ zHG1|nUzhOL_F5FHtlhY6Pzu)N=JRgCt52ix3iN(}^7h6YY&o5po^9iRNoCc2K1r4@ zo!Z@1v4)gPFX?%vauaHcKCZZQ(hwy%!5&x)n7EzbRz~=|?;q=AO9tIS)Qoo-TB&=c zq8+2rZ*F;1wTE&d*d6@Ii%|&?4`$MdDD}uck;L!rrQG3zzrw-y!LJRAsm!>Z_yPWG z<;~t7kd&PbGWL+xR%f|_LIq)LdMOqi&}{*2C57~6@<*dc{ph1n@1CB2`_Wc|X{*WT z1F4@7UhjV?>$+5sZ~rQ6OfzK@!f{PDq62F? zAc+-lr$X4qeZpPEhRXYTNT>TKj~4W(k9QXLes7WT`^Dl-A2~YAIU?Nk`$;?=g<(gj zWj`f%$-(7Td|xtD;k6(qh|%*4;*s!KVjGmg;+&dFbilFiF5JMH6gnc}T6*8tL0>#P zS9Vv^d1gRZBIRGJkREJqsc~ZTzAG(D_~3`qvGP&NqC3?b>$Ekoj!E5w)16j7Cngfv zZQPMs36HeBhN6h;pU7IqD6NFm^$S*#S}3QCOF6-eb!tbpC{7te_@;T_V)>*XrYk-) zaO0E^-dr}xPo7R)jTGpUnM&BSe#9TdZlWxJVl?Sg-$aaQ_`kTu$~-UdN$J+alc( zbdlqFD$jE^qw@FO6+XfiHtnHaZG5(oz;&50qx)LCaFF+=wDgXs9PQsYv3{3YNNuQC zg$?JbOBixmhnF5IbtvN>5>Asd7a? zYIv{mO%-QR-n0qfKehLbB72f)rcrZ>+?d2m@q}wG_vuVj1W5au__LQ0%2dKfQ=3nw zBMXpHnmEFeU(|YbwT;qExFa+aGo_6UtFo7|d=lbhVH4i^sj@(my5GkeXWV3s7n{H{ zOu|XOA40>KmR>O?g#C@re~4tlFRHHYO{Z4Tt%aTs)V})5T+oF58humo1kxncZ>$IX z6pg#yoqGntsc$pBu_d07G(?)*(2KpnM+~$P;br??gL#lbTJ!%_Yo*D2(XwJ7V_I!yEvnki}2BYfS&=khf? zaykuK?w=_dEHgDzblL$G?9a{iZ9j0Xo2W6cBF;47pk|$Be~=q?YawDc)WiM?>UdgCri3POrG<12fPo=+frFk_wwotW?iG&%4f+x_M-zHuPDAB>rJ8DEt!Xlv8$ z=&Z0@_&hFFKA!s+T1KxeSwYumYW0)W#0BY3^SA8?vxfAm__RiAX-l*bW@cz&*iEiP zgu8EMe2p$RuB*J{ZHzl&_}o@xV9IM=&e$?BreEt1rH1EmOp1w79{$opFWv0bSOcJA zz#b^rgDEO~Wdu(wHM#` z$|ZW?1AMkJH#-vFV5prbuQWLc->-k3Uyl;204cGdm*mjUUG90K#-~i@zs2l_>S5R; zJHw?s4ItDWifu{fu2gXCw3y;d|9q!KTG&AOxY0w@wc3quV~*S*a6CgYW`Dg*9 zx>(k6x=L1C!onv_FjMvLsK-tUiaN@e8<1y_Mz|;HMYIc2aYFC3qOCSL#YkH`yrd`( zFKFRur)9^H5E@3f;+Ufr-y`s-%@VkGBpg}i-AyE17bto7_^_5?%6P)JT^p{mNVj#- zdMjs?Frv!i$+pdc<;~K3-1JfW90?CS6Vq)Y!sQX~J)8sjqy{5y$_~7LWw?D^nQ$Owo36J)fh%s!JXEU}5wVJ3T9RJIg{irno;ymyP z@^Q`p;ib)2HW35(g+}gn&eGT3ZZeHSk&Dl&b^pvpV{J}jBwOL7tVsU1w z%q2}Y!a6V!-<@Pt**%_z5Z2vs8LLEe_$Uk5sk77S>9goWBH>S7F%<$)M206Rb#r%T zy}1Gtc3rj#4P&iG6f5ItFJV%bYS`K>sI&g#x11f}Z7mPSM|->Ueb@lLKH($J3GFRXl0J`(;e-)hd{Gl?dLDs_kD);O zyYrxmx9K`cVTR^XMxYi_eeLYo06vj$^3@r5_k9=KRLU@D;kGY+_V{BP=;5tJ-!(Qc zoek%rC(Pe^WRN@w76;--?9O3=L~Ia>A-ap$<%h2sp+ZnA;qv)of20XLWL3%b#4k0N z()_YbOwCYC4Wy(nH<|S;bn%m#uR*&%6Vgp?xr^iVYO!82-RhN2jHx4Mo*q&<2Onw6%5h{fyuqc@O-`s z9Tsfst%|(?aJWPrG)GWwO&PeNVN&M={KSP(ad=ebJm0+i6^pdS*g{@q6}BwaAC0xG zk|dQGjW9Pz6Wo3)cF}nf)(p{BJg5-x-$U>VDDll$bowz_MKOJHhT#jdy>t5XiKB1% zY1nUY-T(>+9eAK4tdh4nfY|pM`#wU_KtgrI!fFU9-A64&NeIUe{T$-k(#8qN1Q>z4Rz;KoJEuW zJxLlqxN6+*JVhm3XZM%Rwh^iA{}3yvCaa_HMKXmt!Uc_*nr)LB{Kur{5t_I-dPkR7 zBD~n{XvJ%?|1}AB@`c5d)%v)Po%;MEJ<@F3rTp*hB*WmCxMBF>8SO@R!Snm~wmA*| z_Z--4(!|FBcG4um{GYo7+9uWik4Zm$u8xh{#&v{HfNKNd#PFO%EITHNY?YB4DxY4Kf7A>pPdw*@u|+x-WHcP6Uq zRk!C6fpFK5(bH{{FmbEYs(Hi4ZQ3`kiyncPAUtupcA`Zk&35zk-+gCrq1WobR#4vAOAGrVMNimU%jf{t!^C(WXa zyfcWG;XBl-NXBz`E2dR#idQ5HVU_K|?D* z+pD6F-QdDZ=+Rd+LV22_ll6XxI8g;X+K9UOlicm0To8R=kwGkkJ8AgcBCpRHy`Xix z7zPDlVm4@E#FinZfjN0O0|yWMgc5^kVCFDtg%{o?BP@;)H-o>)#T~lEii@p($BI?$ zpe$1Kg^&obolKG8KX^jX6y!F+{2Fc*nT=ND>$wVCrC=|Zu~LYE;XBc%PdQ<7fs3uY zLZH!?_6C?WA;RAJ>rSCW4K7l!Hx0~(hywhERu9o+Zw+51*r~L6*+UIQ*|~kpkydfF zaMB67Z;x<92CqHceSF$v4=a{G%#hlLKAd4T732S*ZJduUL`o)qz5I!d zoL;&3nFq5eC$D$*uxNuareu*R!Y3zxaMAxy)2;Dag%)<^`h|s=!yD)IHs|CO8lo_czqBK@rrhiy*|~-!LqZ~i{1{|_WQ*Vk_o^8T;5*gi0nZKu;|C%)1lz;2fesA5 zO^ooBJ6se_WNJY-E7$=4ScF)JIT7jwn+N$hL-}ocU+5VsGWdFy$;m2xCsbF#Q9~}7gY$|}oc(f&aD?%DLA1`?CTLaGueJ-_Rge;F?*qCydZ$oD@a?&b zKghu*=lVYddclaVOl{$-9fCV}Pc<>;ilc&MVA4aqr3NQ>zC&mZ@jn_JA!xX;)}>>c zmTgi$YlEc3!;9f)!-t0p-?C2(vN*GNFf3aTpy(599wDr>)*ULAY2efehhQjMVqY6t zjS{`p+L175tmtnYKT2Gyf)Q&pL9l6wy(5&C+6TkHF=)L%&$P!H+J~`b>+Lb(L8tjg z1#j{e_SOLlghwY`6tbxkW$|p-zgt%bb>qKNV`jbu?bvD5L~VK z0miFN@?Qb}S^}`&>|=dnG?qBQl19cTA2B0Cj5Q6(%pIH^OMg$)j*d1!N+V+cq&G6g z_-Xs(7iMQ>^)r}FnYp?7L$iC+mwXG5w%XkQ*BTi;UGZzdwaNm9BzV@y*i4UW$luug zQHMd^2VOKb`sw7&B5k{AM?-#NW299RYusx8FNWS<5*;DqS*Q*Mdl~)IS}l~Ronm0t z9=!%inlXFpF)!m8dt%-J(yaa(>%OW+e|wo*hur)u{LB&Pu8Vr8JzWTbX+~pR>)_f( zClzcp8-3wiqA>*0Qj89s;putld05&Snpv2K7Fwr{0d#eZ^;NNuBpSOwsb~y_&?IBJ zW7SAx4GBK~$Q%VL>lpupFOtyF^$?6Y7=G1U%jUylY3Yb$qfU%A&>XF)cYc;3Hpx)8 zZryh6JD~b}vRlU@NVsbD3)0e8m5($jfgrmmt1w4?lVG$K=fFm@G0EC4#kkw<|8EY? ziU&8s6AB{Cju85T=mqg#V=$SxNIaz0#YIJFQ~D0XFNUY^6%_|*OT^Z8Rb#8bvL&L) zw*!9sD-#*aM1`Y2N_+$NQWUIwym^a)yse>2#kCI3wl9xQf-hEyk?`9paYZ6Jj_$Hx zv+@TH%qd3u6yt03>fNh%pRC?B5^5*Zs@l7E&CG<%8nvs{s#+tyPp!;8HLLcjot>4P z1s=FcJyh9j4FP0EVVhWKbhP1MpzG6}7=FuQngVV=P@3-+&Z z4TSX7Zr<>AwfM#SXtN&}YMT?SkD%`vQ96OtT4hYL0SWrCNY{L9r z`O@2NA|?4^_eiU{i}}3@{CY&hLl;L(9|}Uu4sa{N?B>X0KD>@FFSefVW(G~gh(Kn_ z?A^P5K|yX#cJC&1X()ng{$3GKFcV#c`6@=~ZgwuN(A|LFb$_std7ldE{2}U~^iO+@ z^{Xc4nJTC^6TL%+mS(NJ6$x)?2hZ!8-C%fKbA$<KAk zlT}bF9z}34*&OFw!6dv-Hh%`|TASlxcs=uVS7Hx;Qd%>pm=JvEt0H~IE z=|SvZ4y*m|%`hP1@uGQSNF>hwi?K*+K?k#!3QKkWKB`#y&4I?Lt>DEGcfECONAmy` z#DDyw6x`AY}5pJ0x#epk)h)b9Uu@;f` z>10f}Y6B~3&ujJnSBfzmPqU_z4)(=i7)~^spQ~Y3gjqw&bcfj?X3;~-rBRe!T%?UO zSPzGo_uD~KW%ETcTu(@~h)$Rnh|Qfp*y2))sJHI1h|}!g!g+BCWMsH&z~iv!0{c39 z*+Y+Q;?K}zyI3utB1R?~x`{=@2lmR(6%9$r2C*K%c2RW1J8WM5&^&x=L^Q$s9pVDW z*&)t{#mxmRe7;@02cudD&QQ8jJO>YFxVXT#yU>+1s_o?ob(7rPy-;8Nod#Qf-6cji zLBR#g7E`vNgI_XNZ~(($@d1=R(S=!S91-K}Vdoi9tLrm3FNwhMJXK8=s$8=AAFbWy&hi{&wEtJ2J`T&p}paqhm$Y7ydqBi zm(<{X8=bp#-&Jv%3ii|zwACuIcMPTjGmAfVdAJm2h4^9_HdYKP$Sm#$JFknq;m0(` zAV|I;_JBwaH&@79ZuW+?H&8ym6q|jm_il(UTp_{7?B|izub}a;?5x4X^gA5pNH{;h z$r}o)2@b2vABxVb!7$3*5lYVJHCFR0ahnPzhT>}LzZM!=YyU3x)PiHG zucvkId+~@JoE(o|lyoab=VUFlGdrtbjmA6>yzR{blojfoA@~7aB4+yHCFbmXF%$;b zo6Qkgbf0;Ba{3M~wD~2>@G5>EMDbKw>n?lqVy91keIwi5JYEf_n+Gx2I6^nP>h%MRX4Q zkMn5?1ufk|;LRZOM(qdsA+D8x-%~!o>;$(8&B-4b)0SPLk7vb!ps8dR7UpB9+gDle z(VB{i^9zR3cVJf-q7NV;Q=n;M!3{nOQrJGT-w3zdp_?l6fX(qYgTIIVM|U2bgEsL9BzfKe*+a<1im^w4y)vmBkSU zWv9)JK9vbx^lielY7U!g+e7hMoetV(n(GID%yAxmWd0L>VcnH!&QMi&JVE}Ob<7Df zIy4l$yw@9L@k?hgylQTUq1Jw9%}=ph@qekaZ7-M?Ib%^T96yT;{-NM>!yICVsR1N6 zGGekyS%UIIJ@GvSZ~On_z2LhW=Fhxr<3G9=fcs5z9kq6}wZl#GN^jV=Ry0}{tr3yI zO&2gCoR^m*Ne+lbmQ~1T|P`u9^xMl=Vpj;Fd)WX3w@ghd&0iSei-TZ z3(k(Fg2Mb^!<)dMv#3&(tXe1R7fS4{aaE`!@+bnG()p@l5agf5P#*qN=OzEmzQJ(( z`U5E2td02S0@J#h_|)CHXNs^x1vjb*{*Zb}6zPBX!POd=%Iyd@dxGvI2JVg1Ey-W_U zSupujsuy3HF5ejlygpv!(qDihSL@HO@)VErD*uG121IsfblR5Ml zl2ep}zjW0&H+vxJN)c??tTkCZqlK5M==7YTp837{XJ?^vpe!TOP|uLwH@moJR&Hid zk*%$c+-7x;6@u*`)Xjw7U?`YmI&VQ~v{^GR#mmW`rnk!;n2(p+PtEn9x2ct#)!pBe z>;PsrQ=weM5_5{$56;TUE-LCX_|x$Q(k|+dSCQ|#R(E$(U*z0?a_Jmqx`@YPOBJk% z;ig~}d?lEcgS*B{2L;WTt}3OsT5X?9{6#NAQc{vZ=B8)%u$-deB6E7f{DB2XY-4hz zb?V4{ky@zlXNrPnJ|@S2!8ohf_T?R9)JlGWHzC+^*Db)BDw@`*z%kMk=VZVuHkAh8 zwb?Wiju=dH;CeLPVLmsR@cWp#XzcJ}1s-_F;N@cqVa0{R$^NOL6O)Wxx$u|CWcaYu zS%WFCrU{SYlR{;b$?qRx!mB^lWbNg61LxBmL#?Mn zOn<3pkSolKG*$kTz1gj>G_-NE7N1o|nJzhG6=qefVg}Y8ivw7+{NA%^6gzb;oL|}oi-o!u!p1Z0d5d_O+e3M@8N2Fkm=oKsEhuLZ|dIiXQ;TZ)eAV+I_fat6tVH-Z0mUtF#C>?KUJT*vjk+s)Z zL9c=xufntel)du+{n4@%wV`cyRk-#1Ibo+7l71F+u;vG$HEg;hEP(ZS5w7!xMrdH| zJ)xd^W-g}xd9ncT*Yn{1Js}j_eifnv((BbT7!CPy5eSQK!wq?ZbLHRJ)58ABZU*T8 zs}QB!?9%&1rH=&FLqQMP`$7$9bYG|gJ)hw7)ba;-%UXV4s17gg3o~H$11y7^9-{6~4u{;DxuLW_QtLUZ^yW_6{ z#)()AGLxW3!RXg0le>b07qq&H(*9+nJAT0KCXyA`4r|LLQ$!8aZ-C$3vacg1)-Qe+ zI>YlRSXFPn(BIWs@P}|mrTlxqUqYre+)mVMOd{Tx(NlA`Na`bhPf|=WMkCu-Jz2Xu z;*HY%BQ?XSqT-x_oyCFwqvqD^G8XJdT^33}eMML-3&Xnkig3oxWu$C|qtnxiDqBl$ z2)9+Bchb9Bx84$NXms78()*!irVYH9|o-=#`p!CO3XYlwl#2z+}7KVa2Mo5ILF+yEy=@_Ar3hs>+9>e(( z;WDfpCyaz8V}&qllkq~43d)O6kzN!FZDhympeQ{AGbcaD>4V|DELZTg?j9_3wo`@< z&Bi16J6$j;I_i8C%M?~(Sx z412jwWzFayY;^=}u3(IBFgPc-cXlC`u|8ILWghSQBm;qI1;P?|GyxN;q(MSAND1`t zg?D|?c&GLiqM*kh^b*eo2|J-YUgc}uRVcJjLF+VpVzXF>G%sHe5DK%#yE?-5G@%xp z>4o!NYcX)t*{E}c)V9JFC_jbHO^y-u@|@g=%K#|oh5ln~q>}@*Xoq{EAn=1=>B14K z{{W$uiq6c#C%Z6Jc5VMJY7?wGbA^sr=bkIPx2Gq;=`ir3h+i2y5B>Xz2PiPP;{R|$ zFjffcy_zQ}F%d z!A>zsJ{PvUunz~_Q#{e?9n68&8#9GBs>p6yF|LO>y)s%z99E*`f5d$Bj}-p*?!b!l zF;=fR!W1<=#BqR)t;G=dCks_`@LbVkMO|o&Pl=U>I69Ay?!!<; z$z{DGB)1j)tTCSpbMb44_XzG*@1w$Rj?i(cSi?Gds`!^0I^gGB;NV1Y0Gw#$73xiy zbs84LK2{URpCtOZn=(HsfV1mpXoV^G5Ha2j(;NBe?$t?R8A`YiB_nHS=@il8{wW6# z+Y0Yp-Y>Df;k?k*&6@nuY*54h!`hp`MOC)%UmSG#1IWu!+J!cp;1q6461XNtg z9W)mZP*8CJ1We5h>&>iOE4fQ8u`+E_wDhswQmnMna;dB=OKh<{vDeq$R)5!X&J2s` zclrOn_4x>#S2bzk@O6kP@w(|kE`Bf+hUYW+s$_V4b;2oc>l^l*GCpKH^sZ#{mnLRif;~8XY#sAb0{5L zXtC4D9^Plz@}Ay-I;E2)UWg2*i0HUb`k^?%08gULT;d(z8h=~CFUwFRO6N0M_G^(Q zHm)S$wg4)=WFA6Q`^-A_&6;Q z)0<328ez7FvV-H@3j&!T&AJt{Zn>pD8MKyg$`mZ2Y|ldX`4CF;SjMvZK6c~$Plu&0 z0o}UOT)U}+vL7<)+1j&i8R3MP<}h0LnY(}j?vvx`RW{b}ww zcNSS5u|-n$mu?q*%KvmWyKkq%LmeU=EOSQ_J&vIH&ad5}EbS>q6>_lJT_H(=Pvyj+@lHdeq+HCBXpzH|Rdb*J1P zUhm~|>`s|2d)IwiAWd22HS34_%#*H#l(Say(1S*M485HUo4WZvuNc;L8Z*usGs2n+ zO~C4NfuQV4k;3WIUo3i7_ksIrAT?}_i)49)?)!nbA5BbWCs(=+0Y;_$dBk+~jI#2I z+m#Q{@1WaCzu)V=ll|j9-h`!R#nBYK+P#{td@9yZ^Bz|)bFFcoH?X>i7OWZ43cH(H zvP~~g<2)0VfkyX8YFJ|}Aa9yorpNZUV`%f+ws;!%ygPwepLZ_^KqSryBWW)h`s4%F zG1QP~2cDa09!Mw0h(@v>l)6x_-z7++cC)9_qc6F;fr8_PiND{e)1=ex42O}rJc{q< ze#t$U{;^cF($&X2LA352GvdMjbf?jK(Qz@9oe>v7O|$UD>yEf0=-eS8h#q|tpY!-X z-QDSyKR_ptXlslIdFtKG;HG{n>&S2fu<4L(l9?J#JM>gHK*HWaUm~je$5S>h8JbOI zdh-V{nm-SFNxke&rO%>43u%2+eJwt~NCpSVheRe(xsSOii!w zw)n{UC`r~hJ*5d26I*@EeMb-(2FYpEcutOHr-!@$z<2b0yca-%$T6*_<~vMb+>TJ< zFubIy!}J0BQ@I7~qQAD7(&^+@ zTOxa~#a*b0s^PxnRLNUiR#lx}nNKV3a}U3H>b&aN3yY>yBPYIS3cAlMHSV*BuZh@3 zyac;@Do65*2IdaR89OW=#{pYam-vp}I%H^mZr-Sz0l9Q(RjfT&i5ev)(5ADZjmqZ5 z#suOBrN?_*6tUW!5&>w!cjs7)rSeZj&oY?mdVk%N%HM)HY5=^YDJ4^9;r;mA>+_5H zkIBusMJXO}y_{)qxRl00Me~aWWF` zv4OfiA+hz(QNEjf9V@4%21JOPBn2)gnl`((S!IZm`+6DgjQEDh?XIVi z&m9)p+2RfjNJ^rnf4k*nYGK!uaJ|03xj;()R;mH`+UIU52iw2VjZ193s;w+7eRAp0_mirfGLd*co_R>;3P zOD?L*z?7{#r)91?j1GL{?o4UP)eb%Ln_`USTd~0p)H)6{;?pf+UqW zax3B$W2;KR;Z&|lMC~}5gYUv#nCUJIpm83o=FV3f2(RCU<*TvUYoUl|oqERE!$kjl*BM4{{AruL%nu}7_eG?B zev%-1gP+)<0|Hh-i!zq-(!`wjCMq`0}nb2gIX^dt6^}ZGo$#ui`(CT%~iwb%x34^wB;X8n60~F zwM_Ghvji5;PN^rgIS}|Qfi(`3;c7M9VM?UpuYfx>_Vk!o(K+eWpdc09BI$x;)dSEP zgwHmjWDXm0L3$#nzS;<>{VP&13;I!N3<%Y$jagPhRfpwV+Eou5t!lBzH;jqUvT-fa z7n*>w1(bP3%H%&6{tR>Y=pcai{GzrGz# zp;SVd(Q-F-&+pP;UJ!ft59x&fUK^AYM|B^VjRf7iV0!baZxGELk=iZy;OGZk# z8!ue7#jK@5jVXjpGRfZsvvsdZQ+52(^ADI!Ec8t&Qlmp)qh=DVe@`+|+FQ~GILktg zN^a$eNynsJ$`e0+M~dZVuD&BhhSDL~nMA3_L~LUPtv~v7rf8w&xo$hXSB#iQ-6N(b zR`DU;UY&k>Z#IR~fwN`@U7YL2Zy({p?87D<^jKs)4O#^wx2eh#PVr}?J7AE)w$vp{ z7W%JmdpX}3NiD()|Jz9WJrZU8~!9i^rr7dGph(@Nn8Qe?SVU3cN8Md^n7Wj8g zMd_Hbs@X8H`J3|TkmJF$dX0TqggT?~w)#Qn9JqK19Uw=3Z-|mh{2{3vR z3TgEx5(qCZNe()BB2HWEt>K-47l}4W#8fQt-~AXmVzlZe3W-TcDgA)B@EsMvFIUV$ zZqxZ{fJKZ)QQH@$!1D{MXym3K^N{u@)Tdmx!?yNk<#E&1jS%p>);f}W$!qTkF3WXZ zw&PLdWkIHDy;VT=5+It!@$Mi>7%BIms61&2MRf)P{OU+K znZ`YAwshhl>_L^4$wHRZ|OsCb6W#BLfZhiHS#6fZiFMyJ^@E!ko6uesL&zQzIp zA>PkG#$UF?gekBu5U1BB$WKN1u1A%P(X&)j!m?)WUrIP;Q5uWh00+Z#L}E@|srC8&Kp^F8OQ_o%>BrWoP5$ zS0ni<)6iWO^n886N10TZL31ZceJQ&{4x_UtuqK7~kUtCM*Zt5>Zs0%HWXbDwlM<3K z+&tOxd45QjBj2axMUXp37U-!QIT451dpWXB6Qp()I@e$JsMqYwk?lIgN}{*{at~fW z!2p@BT(o=ukd1{`BBQDJJ)@RB9w3|f;hzV{llae(1LcMM=h1<3GXHtVn=qW--YI4B z&T)mBGThmM+6XhJB4cVw*=#@KJm(L)g(m6(qG>^t%}gyJSnb?-?jn-nuFd8rY_EN3@aQrX(%R z`O|>V;!bB6`_tw42^M>bNvBW9%mNIaAjvn;!Ff&>8RH#xnw#J-vlrqW7X#U;Q}Shm zdgeLK@&(Vs5pjVX%ymSebJbb2RNT#_Wkbh0EPBzm)evzbXTMrs#cbZt*OLk;d#C(JdpNb4oq{cx=pK3g7 zj|v8Jdd{4(QfiusRkA7C3<_x~aIsC@?MQg@n1++I)1J}Z1nl{({TKSt7KBZ{V#R42 zn!xK^7j2EA=Ki)g$_}z5Qrbj!2s3|gzZnzvBjCJ)JU5VKe=5BXPQ)R5m6k?jC4|sR z`BEC-x$LiCSoICCCc>Vz6YmEwl#En=#QrS*W8fS1LHy^cH|&YM^gO6vUNH|28|VZe z!uT^-RJUG9KLNQ%Nf5zkQKqW0nk0Jph+SmgzhU1OPQ6aslc?&ny^AKTKHDMFr>E^% zwEF`)DCsAq2z44Q9%|EamtLT?ky!nI2ooatCHM1x%IMc5e2T^o>_upKi>w~IxQSZ{ zSA}5p&yi>B23C2-{wDIZlVJ`5bcws3@rD_C?w9rtsqwNMCZ+83v>It4s+re!GiI4q zI}Vp;|Hs^uq-0RnQvPF#p>^Y>AolTB_95V_AF;i~0YicRqa|C5?QQy@#r7@xv+8?5{%GQ;~F{5?#1uy66hV7n2e*B)Zf~HqxWt z#9{h+*BQ!A&bFllP-CLWu0{juN1N~D12rkK-7LrhXS(NXPleHgL!%7r$bQ>n5p3NP zW{~sKx7x}>=~0L6_4>2u@(nA*9;|bfZ5!f|MYcipWU|oNS3M$IQf*rm5&-mGzsUA9 zId(gZ?C2ufmpU9`yO!Jbz_ITxyh10BIUiz=owd!;(xU;kWP0u)PcVH@2gJESw&qgW zBj`g-lhO2Vowpqer2CeN0zLbct#2S^O&UE5cJZHI+4y2d{Vv!__|L5uZ1?h?DPP<2 zeSaHS{ns`S2KJv0j^0p=b*27W+h!`d)1srC{aEYY?jq<}-uJdhS22nt9{UB(E4*v7(HZb3Q{M? z<{kD(*6R)1=K zywJTG8kOvtL7$v~k8#n7nLTj@n(ATJZTAS~%MhxK0zJ-ZN5^R5Y!%`<4kIQJwV?EpwIwTOdSB5!)$$5`!7BAu6dtCSN zpO$-Fo%m09SuSdJnOxNH6o!xVN*qYhzIi(YEI5~iF7Cuv!BEw)kMDKWX@b-xoYqgU zILI>!&cSErFz;&zI}II3!vP_gNVud@;~P^WPB=l{kaG~$E|(U%{y{PKM8wd_+g;Px#oJxK!sWwTGQ4HK za9Yya6&$UYgf-lgNld6MtEo+(u=^3+FY4>crN1V`1+kff+(R|p+g+w6?nnSG%SvaL zCHoS25IHSbh^wZ~g3AH@!`Vo%d}&jRjc0BZ;Fj5C6^XuEz^7B_HEIE*dD`Wr4`x`+ zWGHeO*w=&Iv4P0Rc15wO!_FcEkb0R*)i%||;5FvPxcZ0j&%f8{njEaS@SD3;aU#;nIeUw|hKG*G1ETNfhwU^bq zU9Q&0EI;P5(+6(XI9_6^UE{(1hPbfr1; z&2HCnR=LNu1^&OUyN&c?xf99od2A?)XmQOA<*~?*k&Egwvd-_g*64Uga|bAcn2)zv zY}m)nj3BnU+3CdMFx(Qynm%`~M`-L3BOKoUIHTC&AD!Sce)f~IXDBUhu_{M{=&Qe+ z>*?30JYgF|yvQGs7So2eU7>r6TsP_H=m1MJxuZb7Y&a7e#F})j1v)x;T#RPJ!d#aE zDA8c%a(4zD8yD#s7|2c>a|UYIM{he<;<+8h4jZ+>SdAHGgq)*RIpKxC80wtodY?VK z)ipan0|!46U`RzzYj8kPA)Wfkp29{y;rd2Tqn?J(UniP|slYZ8n5I=$EK~>>7w!~6 zz)&t|HBqQ3%ha1adW$;|(dPTbK`cAP{)&dpdRBzb|4X>VKt)3xM%_&bJf*qns@qJv zb^`}lz0DRz(nAP69j#Di#eJQ*~_~{!lDuAs>mzFX;QJ zxQ`*^Ixm=h>MI9P7b}9!>t?yZaUJXprK4YoUjur8GC|bWBJ9+rKP(oi3Pd3DU>Q*S zao>vTsb#VQDf)$u5So2KOrf{Nxg*H-6_z8h4%8h)Gfh-{2%vn$Gv;t=G$QgSe=V9w z*ek|S;Ih?rqOa&xqf(pB~N>YBQ;4F%D0qKOK>=ahcbLbf-z`cA z=&S3tIf$dZaC{o0(bP-Lwp37Rkjb;-(+D%wEeGW|QN>B&bz`X8hiKVo zX9kU$Xt_cSy+8}9dP)Y}{w>Q=I`}~X?B!-@Vp2P+D0_M(OyXJa3){S;Hu?(t=CT7B zpkMq5W40<30hbY>&SbjV6=!DIzdHVDWq8i*z;-uVZ&3&Yl)TYVO7$BZUi!sliDbt& zI$UA&<2J`O8k`sBptSXNNOIO$!>Id{F#H>z1WuMNIL7cwyJtoBZRz{idw?Bd6cz#w+-mk#7gZitCAQ{#JBFS9=of|ntv3Nkx4I{TM# zBfmcnMEk)UAUM7t2re65UQ>hk7>{~YSI$OP6FHIuu6r(z?_8M!(s4y; zKF5pVuY1+N%3EiEvD9{s?Y`i+iWJYDNbjlt$uW{@x<*@Q&A;t>Ew47M`@@TF^E4ti zz#US_SSQ>=7mL8wiwFXT?!`L5iyMxD?Ye6W=E>r_1TCf9D~NRU3xr9!kf4XC!rWpr zm_}OQ4|&gH`9G22iqs|n-K5>G8LhN#r7M^uorKT22=<1w*Aaw!)*ls}05tI_F7Gv^ zP+d?Q5a9g|Ye3~3s!Ot4>10nB-znj-;XRa;Xf%uR)<6t=4L8YuTv`2ih*-%O_8p}| zj~dPOOR+4KT#!vcJgd5_f;8)75G4Caq4dTHgctRPoLyqnQ)+mLe~c;BRQCiBkeP>^ zVNtE6DlCJ1DsI8FwP-&&RCA;$SeHKs5q?ZwPGJJB`cHEqSB5I#-M;I1G* zy>fm=DNngB1K1W1iFLR+LrO{UmUBD|uGKqchgV9G(m9}|cA81va%D*K@>|tAGDu^G z)AZXLvP{1|4wQe_S-XKA|HNa3l)yT8Zqz&igw$ipuoOf(Z2Dv+@p*(c>%}xbs>N$l`lZCPhe4~+6FGorfo8&gbT91z8uLF ziHqzeay*Y|aKsbn3;#L@6QJ>e0};-HwrmCvDgZ_Z?d(eZ9w#8l@QR0Hz12 z*}OEO#BR0&Mr*~)c&t~sNa>?BWT+Fm=Y0D_l{jBCr>uH92CI5= z+Y>6(a(J=ooT2`mMDjVbL-7P5C>i`vpWWFOMa9yi(mG_079;HlYBx)eC`ViOfKGFf zSt9GV1LfIz5&CkEhQ`{$+EtOFH^63U+<P_Q8E=I< zKMTvpmp`HzcMTSUsA#Vvyq*D!$=Zx{ApJ21e5$X-5Os+6rL^YQ2)cN|Wu-qhd-OV` z-_!2BaW2K((ehzHqYg+ZWH>13I_I?pdNC4}@tm*(WDW)U_H|Tc;N-$PzLe=g)*mV; z)8vg7Y|b1ngv9yJDkBSK_aa|BuXV`b&Y^VZUnXOy0?zO$gUt{Ip0hb+3JwvsR@ zNCmYX{y?5bIHIxwixzw_zQW;4QF^9FvY`X0L6E;)LRs&@v}{}@YiaOPz{AjKgQEX_ z)n8kX5imIlQ(lz@@7)}MuCLT>#UGM^vKImKa{n8vn7<$ZW;?__trLui-kT!#qkz{e zu?m;6;Z0B+j31fPctc^b$9S(DK-qd15?2iI5zG8jkJ9XXx=w~30hB@{bYWF2qypaN zuvRrB-)g`Qs<&XsDrI7+Dp8JLWoSFw52xE2-FF^~g#U`r1xm-npS1q0$z<}C>R%U? z>qzb@83U6bu66YeZ$fw>PxL}(=0(t{U*ja3`nxjOr1bNl|BxU7s79ymcf`}`*=~Ur z&i9JJ2n8v(72W2x_fPk`x4!q|r7Hj7ngzAUlmqLeqQBB1K@2LzCswipeL*gz99}ar z%z?4*T!C?X!y9X>6<}3O{54#{EEE|h$=!JwN}DKe)NY+^J>g$w+uD$3?-t|f*9uSA z|LB?eDNrJsMeDa4`%v~cIifzyZb-jDJ%R4EcN4sWwY)P%P;&uUF)^F5K z6#a?WMlEaMyELuvSg0ixz4os_ht=alm(|gD-P=iCXEw!LGrUHif0Ps;O3jx`xwRhG z9g6%~^d&R(%k)GH#9wL?`@580FLQw7?+;KdwUmD4H9q?oc$X3gm-)!HX?aPc`PgH_ zBGL2)Ou)XGo@kv?K5d=qwqzzjkW0_k9_0Zw{_^}CatS&lPG0}nN*`BxQfM+Ce1-Uj z=Kkq*XYlU+|FKkR{Fm1>>VI%^ZL2xuAJyD$^N*#RiiL@j5@kk;QP^a_B6N5#ty8)eVOtl2!?WDu_Rp@&lXSdS5(@!&Su z63F`tH@lVE2%O&V|EC&CNq@IOOpfbzId$+u6QRjr)2XvV<7|(JH}rpqb|bCBYJ+sV z%Ab&D;{L>JG%Tp?aITt)*28YD(>g+U+5~S}kckxQir1p;THid1L)34H)n?GwfT~wf zJ1sGxOI(e&O9B}_GI!2S0s$F3Sf$z9?oHOGD`Ex;L^r?vLU_%EsT6(2obL8jM859V ztIenM(`K{G=@!+HJS-bp!<(i;5oYPnNzy*yqUBZ} z!*`t0Z^q2i^cKv%C1+zTv}G^cL7o{L;lGgs63CIW*hGFsDE;R@*3@AC-CJAWI5^|o zCK|;}oQ5k1Kq*&M-(myz3|tZ7v8>P$Xi#;Ej4qFZa^veTCH`6@#?Zy5u_{QZaawEc zu)N&DWIZfz{@c(&_#HvvWZ*>_yNlL-s}CN^muCK%y#H+j@VTq4Z**0c!nWoo`4^W= zkq;U}g4L;Z37yaMi1puz!J}ZPtBpDw6!UV<)$~tvzP5wm-o9{{0^YWgG1s=*p2}s) zCli7@cUJzQLls_|j^D0YR>8hSo*y>_!e^tofeus3HR}rJ=c*b*t)H*m6?A9~7Jkf| z6rBw9yi>_YZi)EF+%uHdrERqE6DCS}LXM+`DG(!v-GrDh77A{^#kARPNqh-FGt)!c zzR!-IOnTWP#daS&?yf*!*3QUA;KD#{ zBM*j1g2V;ZlqTS&kpB`o{<5Q2P`NU4$nd;5fjlo;toGLPt)sN90Z-Kl$Yt6DyP9RV z;)B%bk4}E+7*1WPy;cejiVunK`EhM0`_MgKILv{VjVUWQUQ`RX220^rQ_gfaWmS=g zr*yzlbWwUt`}}`i{qmX|%DxLT@P~S!h&x_zM5xWCxNvATa{zKHigJOgO0_2Bi@*9sOLa6R0(I%?j_-ZTmSbH$`a#S z(5N^U5&fnn3k0Mx;2$)Iz=Vq#=7O?ZV7)jIM9)q|r8bB0ylrc zGlP~3AL*1?kG6hklFW-#`{+iaL$v@j$kpO=0gx37vL+C;!ca(}w+kFj+WsYkgkTsO zX#5@UoEpvuA@ul{Fa)>Vfo?Uss~Oo}_$??|$}bu^h<$R0phI%?IYbZ6O@deY-JL*j z&VB(_z=%~sDs?M&n5>wL07qbz;SM-oFSzB4zD9FjGPz7(qjRPlH=YvVE+uh)iN3i@ zxQRYEBp7wd&GhK|HYZ(u3XI0C#fADC>x=oUo-dh3D+bciHQIvQ$ zriw1RfB+3V31+Fk&Hh0~6G$<08Uf^8oM+QfVLc+Id~gP-gOf@E@hK3!K&J7_mZ)oC zrtA}Nfl_8!K|wJh9uCtrk%VM`5XA$9kP!Y-`ZPY9Vch%B3D~@yf)cqCrA%&}DB^Wj zGW|JFh@sQPUQ7MsNDZqR2AnnSs6%wf3TUWQ(2=&zCPRNlw^}Hio^bO1eMSCEDLw@;1 z!*h@nM5AAX&c&;xW~5W{`-ZJWlRmIUkaYu;(}&gwZo1!%;KLiG2$1n>7_Kov+~aNp z?n2hP9=^cDg|0R06 zA4}yXoYK$(R09Z2Kyx>ntf77*LQl^-1#u?h-^+<@E5@T16MMr_prv!^ zA$+ev=S@gl)B+d%G8yRFsewW=y<85(5XDyWNlE0jrjUEnAy4sHm?Vh___d?ClA7S{ z%8e}EG?aEL2p6X3&9U^?-R`i^){jQA!EB|-RdA;7+5)b@@nhx`vc8Y5UHl1hBAd4& zOO=Lu4O;GpQST}QQa0Gw| zx=rfG>h82IN2GL+FoK2OEnR`g1J9Ifm|)B#*DiZ78$VC_DoQQ5DG7{}x2vSh0rbE| z*jic46CCPyUnSs=Py#~gZ)e)J9GRwFK17eMWS(y9#~KN7-Qo{LFKc;HDuycRHYv-` zYeVwWwGqcZ@0WfCS%QaLz)yA$AUV(^-_f5Go zTk)2h7C`;>A~ckJlwbai{3maM6qN*t=+oyDyvblc#%mA*Wn+C!p%8`mCY|@ zHkBGSV3=-yMZW7g73e}~D_v25s&%wzD>$~R$07@$;Zb8Sy`AIL2m9h`^ygOD!>2bB z-Sn8;nG7c&M%`UZqC3XIUBTr#gJPa@_{pbwP9wwO+zRcOmOLhpuHRyepf!ixkud7A(>0EZWf4gQVFm*K?}zPps*<937~(8`zgdHh7Di3HHM@VyDO5K zZV7~UH4Pd^&^dijO>3^Z%REsfY>paa?OAU@iqUg-xb^Jqr{sJMt$Pe+Q_+)x&I^6# z+>rwTELQ6IPcCP}|HD)?rKCDR`MZz~KJMuX2-Jj z#WRA~mgsi=6a>}J4TcoQ+RB6|Lt=tQ8Gc1G%3w(&@o?v}LVQrK)NY+q6KL{D1Ef8k z6`ahqOFj`mQl=Cf!=1Ge1B-^_j>#Q3asY>5=+a^IwzNHR1g$WLG+3ziaB1Amnf8rG({PJ{kGWggci84QOmmi?71tDUir5tj!yjPk?F+0 z(JNCHc*e6iS3EsJXktl-NRuDOcwV(AI)qjxh~bfb`PZZjiR+p_`UhfhN$jt`JhueU z`~ujMy(Jm(`gt_+Ml zhCX$tXsJJKbg{aprQupy+sm3ojioL(XB58$<(W?{<#-ZNfduqJh63qVEY&8Y9oB1ee1y=j;N^xfpFK{u9S_PWtp(9q0I`K8!jue%aH?5F@ z7A!^d@+Vfzc1Nvw!APQo_(BO;j#i>F-?e_CA^i>~mN+b-igZza z$@E0zS%7j|UWyb5xTO8x2Zvzu`>43ZYqcmA3hQ>-`anP{%`8EE+xldr-hlss#z+-s z6K5aN+Ci{uPo#E~2y~WdXsE_y{|HsOf^c8;tA@32Rk=@@<{6Is-UxJM^ zQx}5p?`eCelE%mm=7`v6W6sxZE_4`fubk>f9sC3}ALPQ3#nC2Z6uD zj4XiaVdBOBs&llMjP(y@;gj#{Af0hlr=w3% zNBVJs%TQkmGU}?)_%yGKh4VSMi|C>+Z$;4f&C%jedT2bN_=ZP7;9NHfRH3i(a4dR^ z*ol5ljQ3J;EXXKV>tH|4%NIQ~x6o+QDm`ddlaxe<^Tm~9Sc70){R?h`1{|cj;;mG7 z+Ae`WiRURhue>!DO*eOe%beQ!1-LYC>mRCCb!%!+jh{wHtHz1hiCwa*N~%ldKp_i? zWCeMP3u+RxQd+9a{qew}yn^_E2}t3X7w4aB)7K56%(OJ^`SV46Uh z-!IlYI@xF~;S)w;a80FDJENqQ(iU6HnV@HsNz=-!YtYYXXOvY)#o4u7jG(3%GfJ!G zVCy+`((s+5%2-y=QQf9LI3#FiaGyH+X5Q(GXlqr6Kyh8*SKO#T+3h- zZ}ptElIhqMt7PV9#wZ&6?M@}qs%P9uRA)hA!EZI9nX($JQP(fzQdm5ojh4hvD*D_i z>6A}PIlaB8-4#m+M`e~9A;*kI*C@TLX^2LkFF&`&8KDWMye^FL1oh<-NScgnx%e-v z$w5j%H8kl9>*q=esc_wj(lw7)%AxGuUWrD0i&%BnD;8szTKF}OH&04X9>JgPtB2y7 zr(Xe(gBr*N#R)?9foK9xn66>;l{Gd%p^m9$@qJ0wX9KS>TuJkj#mIh(v%aeEbA3WU z=o-G+ms{C6oM5bolLb=%=ULy@Eg+J9KZ9u>x-QQl@oE9TJ1hHPha94r%xe| z4sQZKjtsF@E8R57YGWriST}0unNJ}=iBumQ)e$IzGsOgl1Aq8!%eqNeek7YCRQlg%c^J7DU(+g7*GT}ir z)LSJ3aM;vVMZa!^>QQ5N98KuQM;?|jUOylfBQ{$5>6Aa{_~m#p5JyS&#+ta^u|+W> zLX@+x9ys&E-h{~^n!HgXN+1WG-Wk4F#L%~7K7aS4lkVI(CTh*ySkhPX^r zy2)zOKqNTXK7!jRk|6vD7rB_aL6rFI0I*J0}iXC)_ zxdANAE#l1-rY-;o`GJ%7htZWD0Dk!T%CNpZ4&(C~z_`jp3&Dh`&}^RoAK0+MtYg!P zt?)|P1Rh%6u^eNdRUZJy>vf}^BrOyKQ+|U2@24}ZW9Z)JfIUX-2gLTtEbHBrz0-c2 z0~g)6-w^b`y!%Bq=V|LN+BV+-^Z8qryRfH%HIxMztn;CV^@uT=t#?@e0|kgK*1-Xw zZu4PUpJTVPTf184V?QRJyYj5&+V0B^^|AKH#x)t%TkD5dgPASUIx~PGL>WW4HxiM` zd8GTZP?J8WMhRvRRxE+N($Cr{fSM26l+h*ej=J@_OVjWaE3g}XW3{bMs_DY&nyf1V zb?|?aC8m4b3Q5Vnh0yjIcG?Cfh9ruXim25|bY{z$CV+EU@=dyH@ znDC8tXSkZyc)e7$?Wb;o-S2p>?ULMT{C5jT7UR#)e#u+Ks53TBgkwVucJaF-!y;Gg-vx!$ApR#+npak%Q=vMZe`@;4^I`zch68dP0LpUqNw<#u(Bc`OVYqWYwxf8!)Sn$Z zC*OgD38bd7)!%xM4a!CSXj47Fe#NmJLLR$;$1I>1HNUdDRGKpnoR&p6N~=#GANkzV zaxh}J^QG~0b*XR*RYlpIEb3v;sQ`Mcli;O;n>|F{%@8XAR1E-pF!1V-u^w333RP_p zCYFS6%rQ|utg9RgXLT(oeogz3R)6!O9w%wa5p6Hzi5634z@?`q5mF!^1Dw z!@>~hR!jpP|B(^}J1A*MRI=SZf`5V!(L3%z7GsYd!c0I&UI*Rxtj)uoz0H%}ex-uY zt0$fU{*73*lx`Zz?pol<(J}2(&ln9=_Ju$V66>_AWtnF>S1eKUb>-2*L<-6BC}~pt zvOJzn+_vzRVCRyBTtNcO44h?ZS>-e-52*gs8GdaE4jmL_d5U>Shq64W0t^uM@quGpJ zp7R9{D0dOyw&x#tkt+s?em(Kq zz=}{39`Zoin+oTEwpK`;plFCprIBxfmig!vm@!eKMT4zXgZw)81jPxV01*e~4j7g* zhGx0J7pr>S5fr6Top}fndUL~a>Cg#qK#Kc$djH>lZu50NcNrZjg&)SFTntgJ%K+|0 z(}Z@2t)d(u-RiknLG+dMAJ+Rx&+8gn0ptk*OP3}l@X$rhu-v=>xkb67$L3&nuWlv} zv+h7=RyT;6^PDGFM^`#UL{pv9s%1y_c)IftfvI# zJJSXu;)sgoXVqJf;8@@>-Q3!B4=M5lgbo_^!0b07>BDuNd6ed|1+zI9Jgz|Yaet3R zk=Mxi$(TfrTu)bgBQ`46;|=%O2PdbyC$}Y(vL9RIX&P*oOouMXCN}eDd5i`^u&wH6 zrDbKX6I3oOkJYLF`A*X}|B_=V`m%g4O?)0C7JY*WjWe-BJd=OR5qNJ3WDP27-RoufRfG&INV31LSJp2=Eh)M0?uaffn{;7O%p4|9R& zm5?Bx;r3)u*Ji6n$(SfJd!C^~sZNQ;TCj?Ikckq*Wj>Ks*vLNi9E%eJQ%$moFk=Yk2V7Vza0HgfH<>`9ulMOA< zVJa?kMv=2juprjYWA*%Bb>I|I`UzwcS9L`)PxcqUzn9Iy1`KTvM4bd$Vv&MblI-~b zX5~>N=T%KY=%IM46iky}ltVQVn-=Qf=1`(knUyib7>6l3Y(f{MHrkc}PR~ zNuC!dH4bl=(h1;EQ76w$0V#+`#bLR7#f8Qz`UatZp+-*>6;1XySX5`vvLFv&Bc4Gr zuXbARqS7+H>n=1CFlJia$|QO+-7`tN(RE48(A8syIQ$OdkhYF`t^LFcpkwfBm1BV;vaN2SaP+dQw$1Y=cAaRxAk6_Wjyv*RSsNq)F3&C z4y2i$8I~gzD_da|tNWfPhJgf}N}5q}TUqP5Ic2poDobk=P`udJaf>DYQEp7|duV)^ zNvhufzi@3=Y{YRq-E;`G$iu3gP+*MIAPLwR0@!h*c^0K@v4(AM1IhiqyJ0ufX zpi|j7yLy?PVbgn?hH0pKrfEA}%{0BhtbI)zHSC3(OmpxSGb{(y+{DjZ2>!i3&-8O3 zeRLZT7wLA>etIql%XW4x_&Hm?L2Bk-x0~DwF=_$CfX^GvtluKjdqKW5)aDP26T@iV zE=yGXcX4sFtI!$FrD)l#&y64waBGogDC*e8Z;XqPykBKr%Fa$OHmNVg@KX5o%~$a} z_ve;gv}CgJXVzF`#LjF7-$DF%dxa;RHBB)N4`kVC*13p$)!HZXWc3t9m4_X9&XkQ( zSJ?;iSr5@)pOI;-&$q0krp?B1Hg&gYCNxS8K#6(jXh%3ZvBmT4b8nhu%@Stpurq_##qX7 zpEcg8rGAYF>e+T1pXI+{`<*?;x9FEW#tNGCyzv2gtqRt#>jfh=KPY`oZ=lG1#xb<# ziwF$IUmZ&oqlR*rF^%%`T>|d}tbrMqhOqc1<69a@xF_^)NMkYf9qoZaAC&z44ep#dqWUD2?eOEkX8W;dbBx z*V)5@>wvQvWE>K$`ViUKHi3OAnz{rk+pV)yr|FTfRu^fhszc47Lp?Bn^&Mb(B9y)u zX8JA=gvt8*uwg~ZaFZCw5=NVj#d7Q>NW)Ghnc&59ScO4?W}}fB8l~=(_W(@V#~v{K zs)vA%cqD>~ik%R!=Q;9<{CM-rF!G{)LQgJoV>{+SUn_xg@ zoShmUG7h6rjrJ(gq&V-PRU0uIVy?)cwF?pbtaJf1DNlvWPVd<;>JhDy6(J#dEY&%S zdJB$QxH#kh)&6`r)_GGf#2($zc*~7oc8nbA3}zdbI7e$4u6hq_g(<=!)>!I%H-ej~ z*rI!|JeUgiSVPz+)y_@69DiPame${S2{PBB>ZgunC(@huX5lQV^DO_xSTN~ zzzGFds&1@HA7wf{A<0rY$YlUN2PMU&Gx;Vb(xp2pvf!n9M3W`~>0gfTZ4&)+A_PLV zih_~-Inj9`fPG%*TpB- z2|byUG8gAthTOy7J~b|(*$-Kg$h67q#gs0~!M0H4evWKX!zQyiQ~{2VZV1D_lYr!{ zd=PFGF+fQ&g)>~zq@~9`v?Z_=4d$7E`=)?;C*2D>#PF^Nm_@>(ojuGJ%2FOPe-o&B z44sd}byp-$>c6o@u}uY*`~X_p4f)U)ry6lz5e8w!uTE_0Z2<-N%ucT%3<*g8)7LW6 zAN6uiwywzX8BC=Ti!GoqgO*F{pp3MGN7ZuX>izT{g1?J*Cb zJ##EEv~Y^$b}E20GapUNQGNhx= zxfMILe)O3as!vlbB`j^4B{UH7JCCtP@3Ax@IxyV*!rv8zy9kyykPmGFQq$3-XVL}> zLa;t9VD%fb-DK$mBl(hfAh+|oF^ASt6HedW4rt_YgXJ|vXGKMj7~l&7Ft|UB;S?Eb zNvDTu@M*5pfH^g=7It_s5L+MC`w2^- zmhIYMISysIudPKi^GWkwu0m(%URhBlAOyT;GtdYTyFmb&`;w_Ao!*1Fx%L3+s#?Qs^-w;US>OXN8y@7(hjMZD-9vR z`)!+!?Z`0q3#6x31jn%7`=LYj1?29;U};ce!theK9D{w2E{>dOQ-4PjtrkvttKY?u=xwHIo7qoLOh) zOFRo+Z+=?wS)PBu{5HRP`Ge-}A^dJ0v7mk%%x0Z}qp*)2G*8he>I~UGp;PA9oA+zb z#b&CEou;uuANJX3^9D?sE5%aEF0$y^=Xqx6kIdk^N-I>&UK7k`qxn(^^*%G0Xvwq8 zgA^Sxgx9eWv#MF<9|AcRh!tCL_(#2lsKUB)(i9H+&!y~td(7;Su9g9zezDtQE0H33 zsM`7@ZP&#b+5SvRWk*tppPF(#Qc1^iK2k|~KXm;Lyp)cYU9)$gZ{uUNc(n*Z5jOU9 zw&lfek3t~;t1tmQj{kre55XMYZwQJYNAZ*4mI<`ycSw~UxCMw~@dyi`AuhkAsy6_U zy!hYnrmzg}r-DP!O-l-dderiL=66DUQ>@%N#d^yYR6*#pOjT9rI3MNksVEWo#c;^r zmGOP%#YmFYBLSxF5QfI@>+vze51H@N{+|-4pf=n^HiP65Ms>G3eBNc}6J`VZ?XY>8 zE=Wy9WRs7XZvyao8QWHX!Hr#d{-$RhM+FZ+8YKLTK9oA;NXmv0LF~8VK$Q4sO1YL} z29$Fqdk)G`mpu=UI~26O0OXse{8HbM!k%`cmR76JutYPqE* z;D6VR6vL>FZ^;5$_iRg7-k-v0(ua_OFidoWwe}~COrt-vi5ptrUh=QU8>KTFKgY5% zz~{pH^IXh4bevN?eI8FjP$q7k>4Hq?BM2EaT}EC=(_mYO8*k>r+|`{a2CDmr_-~|= z14awgwm|sepxdHjMOBt4xSR+i1gTfjfq#J=4+&fc8J@--lnp7cpZ>VrY@n8{=5RKs z)*|ZI^np^$wU`|(&Xp#!=3HrS8133_e_!2J=-vD6RWKL1R<)uR_~Q(|eVi}OflEVK@I3o+tm}MR9c2V4>rU%PRH{R$P9!ZY4YX00yY0z} zOBI3*r66GgMoY?CY^3$%-S$Zoy%HqdSu5>P2A(+PYhUFulBQ`a!OE{NcAg%SkQ>dZ z2YwEq*ozZq!N$ipCxa!uZ8~@vZkEEP(B2+U{%XB^@4QZM|Vm z`GT_2w(DD;gFbvu`$x1@tpdUT)oph`Fy$2lhPJFrh$VZR7ZPE2S#M^e?zK+{rgfsd zGY{H1{6cDqERunSA9M$^>_Gc$J^fR(BLdPMjxOSsl!4jY_6u5W&IEYv6=Chfq3APa zLi$+-%;lC(V`2R+b8D&SeG_^|Dtx_fPJ?4!bsr|lZ00dii`Q=DrRd}AHdV=&>uHyh zyxM4^A#wJC4wY2&Z2u;cc_`8z0e(-iJ%?Jx8%ve0#+pale}XXVXnQ{nDSa2p_Qu=q zYcBzr)XRQZq^LK9q*jC2t6(?uaItU`J6kLyU@L8|+5GH_!Wf@6@0^nI+3iJ%16~q< zHz@X(g72MqSs0;Hq&BH4DM-t5UKM`Pf>u$lVHhir{CU(kIT915vXg=)#?6CXN&`bp+7i zi~q)m@h?A*UjJPv;0fU`I-ChaYvndUHYt#z!r9^(zkQQOBn=JN zDGbB<>zB;wM=v@7FmmBtwrrQs02A~%&_J?w3ta(R9&|aYy>v~sEEIiW$HfQ z?MuPQzMSu;$R{8b6u;urO(`!eEvw)WJ*=PpM`rQs_{B;JjvB|pk*q9KMX3ue=TgWw zey3$n7FYJT!fpTcdzDR{QCS3gt3ut>>pCyTQw;_T8OdWDqoBZ-&uf0eGSxZ{qqAe= z&>UV@HJ*FpnyTAr-JnQp87B+Ncri6f;J9ciHmtmHS$xm08k~MMZ^&z=6jd~>x^m8cQ(n=aF(Zfj3;i$4RPw-K1!Es|?9N72UBpnH z&*KdMo$lNNNFOSEEg`r_?cscZ;J>N(4=4I4&`;~$-Td4&9~H$T@~X0eK=V>*eyU^^ z=l3aWAqfityCv+3wMbAdd`Li78y(A+J?JOEsjFgUCx7L8msF zl6A_T&~A3vLR-(&XE+6m?}^ur7xk%1-a_6!eT@A&QvoJt<-1Z&iQPy+Yeg$htXg(W zZG2Zvx=sO{QLGX`Iq_4K*Jzz_lo?R5*A)qr>mAQTUI>46e`+!BVN>arUqSo+aWYg# zx%8;MtvZVI45e*yM?|$9RGvUr*Bag2DT3a_BEcJ^p000{1rvIqUx2K&l}Tf=V}F*f zkrv4>Z*9<_RI&z=X${+K57W_y5U34q7N*g5Df- zY@Ttzid{?JFx_^oCNp?r3)!D$^V-mG%yY^PeO$hYq?w3zH;;FL4!X!im_=*;}=FLs*$v7zbV?IoKZ4fTS4cV zlzvlZBg!?Vqyox&deRh_+)}&ilnidDuT|ERsl5*FE?|Sh&e05?7H-eS4RkpZB7@ry##_0BLu`NSBMt2B~us}NE@fcB~#rVgd96(3kiIa z-w-;J>|MxSIvq98Xb#RYhg_64l+c>Vgt6w*g^avL~x^G$0N4*ek{BIb!Tfgr}RZT|3)YFGkX;V z@`?co3GDd+3BO}I-t#e5dTUt1XH;cEz}qkmF46c05~2jC6R6vsx7GtWP*nI)yd|l; zluu#&zg9#DG8xs?B@3@PPCp&>9_ZdayHEK}lhT09bVN|wj{DHleaF1_T<6a88{El{ z`=HyQZ+ma$agv62yaW2{^?!T%bsz1&o3FB<)$`d8xdFD>k9aC< z{rotsu{9k^y^U`)PwDIR7BY+l{dmMZm}|4Q8nw$5T)8!^Y!R#k?7E|Fxaz|fu;CLn zB*mdYuz2#7$=mlD9Kml}fqnNW`$72=%7iuJYTZ-I_g^yb*-qbt}Aop0erQ-X8r;w z$lZ=;UT{tME;xDs@<~RwlN|^oj0GN76s}e{2>FmoC36xGwIl5E&f`oE*dBDLnbO;g zwzSiBfbV7C?ydXM7B9+9JAp@FwY7bSS?r9qMxroM-O*4x5hs!Ej+~(%@bIX1msJgx z07`k2hr+|*Or2ArcXZa9*p}wKIl9iSZ(R~U7wO!8IsyN6HwN?h_^D=RFzn{Lu0IgFAO?Ku>4X$xueIG(q(R#xM;u0Qr^}%JndpbI zA{tXJiPRt2VnsM6wML@)%|0J7Q8y}Z8(sF14G?Y@WEoWaHSIXtxt=DEH6_r3bDWpa zmTkZ}nOW_;3T|Xh2eEe{3EERIzN=S+o>U;Q{Phy*4{htGBTDCRt8h98s7*Jw}E zy3rFOr(RTZ)U5$VDWeg4>b6$Iuo&_n3to$AXSt4N&O!9wSR2snKE#m_S+a#I#o=;n! zGGwv020N57@W0W*m-#WZjvX51Xyu^Q-f@r??n}r@=#oFnN#))IqiP~|ZQn5~CxeDo zI!tWmc*iXUYTTyNQ^q7mJS#uXG07k?0_DAr`N)t+mz&Dga9f}QmvKI*z3f7{7nOv4 z38sJ^s&kB{ef5q@>Chpkie}V17SYT#z)v2!8a_Bn<~ZJ0Qs+=$x6f&G@2 zEY}un3;GJ^;{%Ql*$IoYR72~l`{?hPnu>1hKFirkNqb@wnbGdN4{-SS%|03B+yt4- zXvB{+UJYy8a}He)Xy9!B^cE)T~mgy#9iaUsC8xGb(@pmUOv2B$iWtR%^)QqqUt*)0@0f>C}p1S1;D z2%wW|e|Ee_?vW76W-P@uS3;Vvx-dP4#%XeZe9M8qbiX*x;<)u??D}6Ei2^Utz)v;S zH^w;wQBycz(9;bL0G(cBi(|9(&Y^-)g8Py70cMz+{s)?hf&7?_( zVStJ;%wUye&W{vyQvi;Y-~I&gZOxmRyul(XD|UXTkj9M`n4JGe>23sC$@gkBTAXax z;f&gKoZ43D3eO3F&W%ejq6&NW;Ljg>9O(+!)&dy~R&{$EE*?(%&&P zgu&@zyUb4b((Eg8PNa{%vzyuDzdCN#gL*kTY5V<F|~Ctq+56q#k0QxMh;f;M*Po1mx9yzcbU?rh+54SLPFMlvBH{Tt3*^x@4| zP0Q!vcItlJxq`0#qt9TPa~yFDvUfY7(UC%N;JOvhCLMKt1i(ZGKsh$fN{0+#3A9|> z|3G+~+fF#WLK)k0!dY%2=tPs)dv`f2;l0I!x^>H#@2z)U19vChr7k@Xd+2uOYXTQ& zTiLaDqL?m&0yxt1lFonDxlt`WO7Jo4#E;GoVNN(2Ve+dz!%Peu#~(A%EuE= zT3~worISbRqkF$}@;FEAoiCk*BGr766GNV*sE00ej#W7zQlr}sfC2OvMFXwA*lA@M z7dbToB`L0RTXjd zIjNm3t>NaAl5ph)_O>xgnpxgz3wyG|StHPG9e`L+(Mmddk#hrGsZ2Il`8f9KFFn=bOi@Xy_4&&X z@K^S-w&j5~Zoefbi5|+bXy{5IK80;q?7RuFh%N?H@V~pf`+-t^=FDSPUE#b%pif=^ zRcyS#VP)kjG2!f!tDLu~5Y#X*-!XvhU+qj6Z0x1g&WUiEj89EsB{w?vYUrk0VXf-9 zjZ;x+tAp?jAw*0qAw<`X;T9Pc+)}lW{F~6Q(p4@qtJ~xpqK=V+ZQC3nYW~QU%$|S9 zIS59DGo2TSQa}RA`py#1R?l+Qifq~fN2h{5UgSunKNdNh5dkKocq8Z&V2r0A_(3Q< zHqbst9=RS9!*9`WkYDV8c5<=f5S86z(^=;P+U4N(4mjmWC4Js5 zw#3mWi8%%?bquCUw&YmjxvYc7Vso^^I$v7o;dZuisiQ?fqeV>$OI+^QtEN|;$VsP; zO)3OGcvytIcZOEaiZ6BS7P_Mgc*ybyl-$NLobKOGhm3Z^`v6Vc`!ZTM`EtjVPU%w0 zLzXOP?&#M~_KAn4I_d?_Wj&DgjJm?{i`o=1oq}|DUIR=oXq}_4mOt@Z0Bc_5_)cr? z%EDd$9RbSwAvH-Y-z2H|Mn{Ht8MGHWZBWgA6C5M)tzR|IeELUZxrts3Dcq2Wo zpzsr;e=bk#qmwF@4c!ipjkmFDZgSioQxSD-=JErHU4>MLdpk?Mf%0Qd7dkHMgiIsy zVj%Z^e`-lOs!z zN{vTcg2)Tp`+5I?7xFW}?_S;n2)L9*YP}{nhf5+uG-(cuR1d9y6+-z8eGKio#-(AV zdmVE$+(tN-R&H_JPqX6?FK*0M$8d#+n9b*h>B4IraTe*G<%z(}^VHk_4rGsMs~lD% ze10ZM7~o^4P8d(~lg#OAFW1MqNqEGO#8yAz*ohzt8{iXFH3Xqwo1Sni7A&s(zA`#N z)O7mxrx7FQjVIw&4Tx4#BCtYbxMY|HHMMpukuM6Y-&2kXC0nq~QLQCdoyF4oFJNb9 zzJvfRdtPwZbwg|(X;Az1BkxO&A#C7_4tOapUIRNigrCyV$K;4%Ltl0j2y9W<2@E7i z-qh?H2Li}!s2}OMFtH$ zheVoEV{d0K*4Up`%FNP3#%vAS5VU_I(9<^HacnUnve_MBJGjRE)%F!sl?Upx;xfC5 zuAXUc&5^9Is-{dX(3Rt_m($O_`8r9}RmUT3Oh%PcQ0belbk0-7(XTV?lZai0j!A_a z9RS$keq}BTt*N%3L$f#8XHo7B`)vC1V*6fZyvyD$tkJ#|N9Jwz>D2rxx^v}I_O~Rl zD-Xn}S@(p!jy2q2p97saM6puZV^7!<6h!ALx<8AdpC7P)!aNt*#|tcThkaU)?7Rq? zb41yl8$|UEdpc#_37qlGPub0M-Y)wCWV^^dm|zfo4SR*zp~Sb{VlQP=pSN$tNw~!B zU_&mmrvmcq3i}X&`BvH&DM+!vel9a#W4~31;U*GL*fuuO{0rdi@5wk1E&N*Qodnon3#U{aRc!qdk^J zVae-u9LlZr_LX$cPd$1QL-*Zd-*r;vW6#*L(FJsgSvu`nsW&C;q37&(K$$t;9-vF+ z+rOlaHv3Taa+}=_puO)iZ>FKw*mbmFfqeqBSauD2aG~8VP{#FW|HoSBIlftBUqp|- zVDC#~*4i^^`C_|+R5#m)Q0XJ~uL;8rzwK|8T6r?_FSUQzyHQj(t;dvUN!)JV+bc&s zyLyHFhLfg_{Z?1q2RhMe&J&U%z96!?S_CR{@w&$Un1 zN;?Y%7LDcOB**e_G9-G+!%533z_&_iF@5#F`V1;wL1S*>!^H8k=Y zKwlR8+TJRzea&H}!sGT;3YfJ8ZZXBfWJpkT;jkeyqLN}?(~;x$Cupa_(U*o?pJ8Bs zC>+xi^oHR0iR?%0*-|0}j-YePkJ!rv6+VHX%R*3+_kXs}P~s;mJ<11q`ae~O*ZG7& z#V-HN{)xiu2n9Lu{t^P&>l(ULe*;pL}O8 z@1BHs#CL5*yw|p#ZK7F6>?!o@K@cDJ2Qbase$Xz`rh`zVyfJd7rm4dU70yo6wLu%hx3A*bOve>bWj2d11koD zpqefbQB94cpo(&05M57!M^=#X78?=)mSUJlIm-+WC^^XdEyqQNlEeI)mK$pS-VGLX`^ePU8iw?$IsUI04L9UzjeowA2I5Q8Huf3K1(E z=MuMJtEi-5I}LGcxk9^0u$}ygeDKRTM}t_9?I&Fddr76e1~gRArqC}+Z998+zJb%~ zr*tOhu4HZLg64+BwcI6CS01gkygLoFqehI=$>ok|Y^jCQnKP3a@6lbVW(%8iZz-s< zRp%#bp&^;B^+VEE$aHA{j?e|{QWLw2I$iNn>Fk{Ox`T?r5uF~``>7aC2}Df#A8dN} ztElwc4J`)t0}PD3Gi_yM)Y74=WQUjP)+&llml-#FN$B3ItX|bn`R67--L^w#rJ?h6 zTH4m3E2F7rnUX{)8y!Amj2B^dQxCky35dQRETq@uNlT{iV9~^xGmG3`ri#P>~+-f7#|GI-@|NN)36`+N6syOCuJT z(-e~TIKBCeu7+lQr+c4nI#-X_Wq&{jKm4HXC6@HPu1-arJ9MMz;8Lg`uDcWJQ_s`7 zbZY%V2c)FubiWD|+>2{?;?ue;B|UdEHkR&xRu`jfXlh@)VA#mB*{jd$KE~2`UZ+v< z+Ss_~b#n!}^+A;8X;MJ~hte2Ids9wi8{gJtsTtnmNL>D-E{1*iitcKqHY)XJ^Iz9h zLuGSRRI!*ny1qDhFc6fvOPA{7R3@r4!(GV+eQ|IBj**3kbqe)4u6WYqxMy%Hp-8Nf z`F*uHs+~ zcVZsDTdK1#{R_HL3Jvce{;|53bmu`d{E|*o*9Yc?0*lxe`*mLkwCyRKHJZ}#gzg*! zw8ucOy&vk%7N|j~Ph*uI>o#cF7t3{@E2yAR7sn1>s5>{7;*Y5;F(Vt=5R9gw4FESc z=q^tOWst7U(a4XW7cGqo!y#mA?@!;}pzBKsYjtbb{cCmewd?+-n?1F@p`)R`83to~ z=T-$e=AekK=t9o+{JgFVAiGjcvf?cZlo?iLA&D|Ox-vhqJX3HUW|lGp#FGtinJb#vCO z#yOa`+t80%9yTCW=Nm?mj(=m+v%4NPe5ypeYeNisWQzfcLp*wUCdfC*l!)(=*;_Xn zo)qcmPq^|lUuVFj@KeL9wD||1b56eAFpqt^(eS*+R43U0xgD(y9IKIibdLdy(d^d^ z2{c-7?$4_3H_TUPpvAVi2MuDcJ!tq^!49l4bO@&_m!Vvpk31S6DSos3~35FZUK9{Vz%L; z=s1kJr)HNyU})bS;Zz01vZoCEKJCzG=+$i)nJb?$Bmj2c8H1DF-ewp^u4fJH?15(u z^+H^f^vhPu*cWi%@myt?BG4sQ8z!>1t~QvI3P5%iHmchmp=Qdc$>)rk3uiZ>_4ER?Mi zdE0Obp+S(*$%b5bp5d4$3HBCp!VW&EN0Fl@p3_~PbK#$U5;X=vX*BFzP_Qk>)X6M0 zO9M*l`%Rrex7jpRYiDV*X?q|xhOBl?6M{o%9-!?bjZl3Jg!p{-5_3NPqor>O!RS6T z(rBk!M;iZ+HqW;jskzu_pr#_@18nh~8IkN9T)v%)C@wIWfeB2wt*xca#e6l!`&INx zjwO~nE=vk~uFmL2^o^4!ApcZSID`HjY&Ci*W4>|lzsxmjzR^J!&Nmhrq0aG3P?d2oRa;?j@aiqb$LWvnAwD{|!MH@A z`VCP272E=hkP9~$YiYn*m!2)(Xq=!CrNv3J??w#xFYY!z$=BZyFk<4*l!v| ztDiH%w6YPv^tcdcXj`);f%R3GKT!ci!URWep0Vn<$w@2rn!E^oV2Y#Hzrdd=gE^i( z{H1AyK<+P12%d1jWT11uG?{7janm@Oa0S#9zkX>#XsSa9j-GzPlx^Z?dz8=WSVHA* z>0q|3HjDJxbU0-3Cl)+mS|$LN&@>j(&b_7#I<(*9Je6#v955{ujAgllIi4y4lT=p^ zW_N#MLUi}951Z124jS}>X^f>KP%oV+5JTJYQ8T;c2h$WK{Ub9w*3z<|qjdq0qqD0$ z*?iN{cSlSGO0W|2&k^Pn%V1tE|KpG|(&3-PG^#pe5n1KWrl100i=;gPzH@9_xGut2 zf~{n~|6-aU(p8_EQu#n2JVk#uoDXYp3T2Epm6LkBDRJ#|bLqPMrVt&-Fk5K*aZ?gq zyWcc&?LM=ahJK9^ylpS=g`}ajd}Xq;?>;vT5_pk@wcnecq9LO!S~l=Q({Bptk%l~n zY25yeaU{EQmubCH?XGQUY0RaedrXg8~`?pED^D`sXFnMfBcFrkmK3mrXY* z>Dsf5CU$3nd5eO++o(!s5Gc=4P{I>Nz}KuXsp-HRV*+VX&81{(gR#iIdSnl!nlD$d z0pqRfw0&gJ>cD}Zog?LqGZDMr&3>6`eM+QP&a-CH8w+zpcH}(k1_dW)9rW&MlaHPl zXuOz8F49=2a*#1ZWyM+xy)ejFCqI=9HqMiuo*8VMD?be!Vw@vCJvzjAq5M=a)Hqgt zx@)NMEcr=MW*jL$O)oQ6(rORT2Ue77MS8Z(cxR8FOUjL7x_`3w%8g$G1!TX;O^p}B zO7%jGInKoN1*Ri{EIjGsH^s7izv(tDSt?91?7=Z6I4*A)X@Np!mphrNDoj>(`2rC71>0E|$NGWukMsgDtw3P)EWdt{<%hL)P=qPY8Kn_kjrBBur2GRIU(&2umT zFO3%B=-?bv{J_Y&I^1rWquUYkn<*V3Q0FNNT3fkQFISPcAh;QrpWiOMaG^$oYR6I? z{kf@#H~lO!PcxkpFJCF83n&*NOLson6NHV}^RrC}?8a%PFCop|4^je315EX3AIUNV z&6+gAbO6Wg;E|^J;Gt&A8~)_1?5SofRfamDi2(G2RYfPlAXt~=I$~METeP?kW_mxF_sGpYwV9RzhG&-n z@Tw`Mi&<%^X#{p_n#o3`+{nwCZpx)+OF#*)NjJ?g`Zo2+2ZW}5DybDjVkXv}i}K`pnLW)iB-picv_CaFzq^Bcx51xW3& z)e7D;&Y-n>jFt%fpY^6OogRDBxQqT#0bF3$JJ^`7?KQ@*SKcxXP?=;MQ8g+D)`FXk zzXx_9>oT~?P5TUkS^mCpQyi}>Ns>OWyYfu+ka|`a)oU%Li)HSb{b0-zXyt4nR#HNBmiG7wxy33fA7ce<#(Z-Y zTfNc@s#ESXUrMVp%^vpgSo1h7Ty^&J2WZo{NoE+GbT83Et?r>@S!No-%G%A7`p}lE z%rJTPBmoZ_S9-0`4W!oI$jFbK9 zRLBbq&zZShEF* zS`ui-9hNI2WlXT_qpA^>5E&nW7-QQA%gk&?Jr488SM@N`lw>8Cg6KV>-c7^6R`8a% z_*k@4CBJx1nPO?D4?j}JvUjIghH0qvGF>cl&9DF+s&l^u>{zSYK(=wl622Jq%=VB4 ziq|Mj*Ygu05o8>EMO%NdRCE_a zvA=6ItTHajgEsGL|xOu}x0=Vd+bKk6YYI z9&xqtgypBT0qbElRj?jNgdGWddIE)UNvuA}`m3Op+$nA3`5EKYFV&h&52aWqot&D( zYE!M>39KsJI!Lc7tl8|?J(hPwnO=hHEbVjZ%*u0Fk#A8U-&vU!s_|Ril%F^^$SMjgP}ZkY zLme%e01qZU)wF+@Dii&EfyK6N zo}ghhL#^-Q+Ooz{%5L>rhavjeXiSR4%{?>GVy5fEmLmFUq6OF%b(Z$nD0nO`8kMab zP;j-=2Vsjl#(}s}_08}wLA*B0bW#uHmjSN4pIu|IFnhfvTZjU9cjX+WH+yM|4;XM) z&9O|Njr+_Ree`8+ZZ4T7S%y)+2FsI)kzL(gsU(CT&lkAjS?5}EXxb8pl_$(a%(ZQE zj2dmU6xKEun}vloTNW#5?^es%{kyFB8aRQ5wMID5G^oo29%gaCwuszc2eGprww!Ol zf?PQqm+bR)S{5oD@a*-xf@;d2x73q*1Ss#fdn|cu|MQkv@GTr+%wpBMECH4DitX8B zS*oN7?^qVI7v8aq*RYCtmOiHuNrf9N2qM_;c`=zLmRa-Jo_0%>ApdU4#bwko)SASm zFRCotsT_RMarc zYN1TCL(SSAHEq+fRjW*m8g|;$|+XY-0n zi;GHqUZ20DsKDnfEFRVG&r7YGQZstkgo^RgPwjp8tNymu>Z&=d#RUTg;^th_(q2;+ zP&YL+E^+5l<};dpLKe*~HVrUvkxNuqjo6~5Gz$m-C%uq1g`4@FpdEjYjn_oVqU(xH zspgZi(4>cBGbr&LOWc@fQ9P0!3aM#mhwx?zCo23WDvJgg=xW_*GtwS|CfzBaYKOTI zMOf}?SLr?8(AEcI6XGJx>yhrJ)vv}nMB64IRp3pgZQ`H-yDV2a*BO2ibUljQ;%ZT)v8AND-S%mhoE>VLQ0(@JxJ> zUA?%(lg$OtGaPdz{e$$Tw@_Qo-6>}u(JMQ?A5oBv>f2}V3Qto4Hdj=}9jStU;vgjH#h$yjs zC6}>N2M-3Q|MsBCt+D0saT*OFaCH257cdU;VB*I}{sXKID(=w>`8)4ueAhX6u&s#8 zn4_=xB+ZmF_>cidR@V#!G0+8tMckvC4~rwnZH`@K(D+BR5M9-xNdtAfB&@)$#8FaP zqNPdSIT~EHenV_nsL>Llv(lqlY2azgXQ}Zg53;c}N~$=eB6A^b2j4xe({#F~!KN7u zi)4(TLOoCNcX=9ANch|auVvHYd{i1MZ^Xs(T474@0qZY2Ci`;4(+Hv-Cp;_yU zYJPB4PLV8(dL{7jKD&8dGqB95T-2l|oR*x>>TStMozYD!?KK#!4;5g6@c+H7w5B=ityP z!rpO9T?2|y&6JAsMj;+<0k?>Uj_prg&~?jkRPaOO)N^KKi^)mD8e`+6_cUW(Y+4#O zJXp{cgyEnouNv}r+09=*GiXC&Yz}R^B37q#G=*u~hnCd5$T@>qkc?QSOdVNK8Hr&B zTzMD=Mvfa^4lD$_YRk*DErM@7tO0EN%mcJA5Xum52NwPa=ZPT<2OH`dfEgC4`t~bg zUG(VzjlQ2W((*~kT{N=f;fqw$`}m_BOSFldSiWcp<|Sfb5omSuR&_w?vIy9EAR7F= zv{5@?Y>15AvTtdv4*^}4JF}pz!8McD8p%-?%J*PJo|K_`NoL_3)}l^ws7p0{f*?}~_ z-V~PuMd#uOAAm~2sG#M~Wx2ihFc5NwsGU7x>Bi+%1oonGw-XTM5 z1H5Q9&pR6CbX;@AK^$v1f(yWcZTuN`s9wM88W9Jw$Gh&|18Zxr&}$-5l0j6Y?|G7( z2My>_*-I$gHC&h0(FR+23M@9ngUf}VD<|qBM-4xFOwI6NBhH#Sc^E?XRE(KeIeAnK z@am>Shbz~{5hdyn(G@Yfmr9!^Lbs$e;2=eOcw93j@DFb7*gJ!C1whOhKC-SBtiDdZ z{7&~Z&r#jb9CgY$B@0%5WB_HugGdH$c8jT&{4ye^3O}X!{?3vdJAiA!+YcNnDQBnj zHHI83g)5H+>Euy5AI26np#@E?5&=Z=snaOy8zW>6B}ntYC(#Xx<}JoIppz$mHfxAX zAfxng0<03c_{A=Q%M18#31$}icTZ*dC_JyTDF9urW3UNUX8jVX5~n{KK})hc#vH{@8e?e=)Wn z(An{u;rD$Ib?lCv*{8Z{1l9?xOQuv*PUMa_u97@ofs1{yJGO5U%{CftPmwJzo5Kt0 zu<(2QgB^}`pkcamom>Ar{b7Ut_@TA&TGqT-zdME2EP`<zgpYdI>p^&aQpx3g}pY$~f z!9zFwtiLKo=UCJbg2h=s%0H^_!7}-(mnjVa9fM4J?>UxcD>*WzdIWR zPUwBK^$)#`-upwJ4QZ=Bjk1pG&!^ju>xa|+JNCernD#Q6}FEI>X`0oUP4B5Mo1{DCH31}Kh> zF&%#jmY33Ke(cuwH>M!cD`IZ9FD>Z5tltGQW>rtI&6GmAx@=U_-{7DX1NHFoOL1x0 zg+=;OAQKG7n0|CfKa{pq>UA{K>#(plrt0^q*`TZS$JA`_8vPAQb`R;lO(dikY4=aqC#_)C^iZ z^MEY;jo0fbEx-@{zt6*(F4Lb-(1ll`NpD}NFW~<9(ToM9eop~1;{Os~kHnHf5?1O{ zI}7nrF0!Dss1P+HXHj8SJ@`@NmlKP7lvz}QAIJ$<_3qD$y>dmx-X5P9OU*=1Uysj= z{c@Sbh4!vgpBF*^6k6;nE-8%`iXWvO+O|@kX6kBZG4A+2`g*1Q03EwZpGp`rJ-cb9 z{$4>*Sjx_>(Lb(W8MXR{1Vu?Hdp)RMCn)?LstfB^Gfkb|jbA0qTd%)NFhs|rxTv_0 zJv>LhM5Tj-qra}G)L&RcGn(`s+S;Tqr9YbV|Hpo8)?cck1MT{SY-NWYrqhQO=o2Vq zp+25QEYy!jL`;K&JupN68B`}Vu(b08AsV&>48?3ht>H>D-|g9yAA~{~i6;;UQ6IzR z)fhGi*x^rDC2@Ong-TX1YPzl1V9^Anfaq@8_%3REG~O_dU6NopKe5L)x0b-V ze(eEl+J5~F{SgT4usQ*V6PjE-ok-G@(|d`UPWkDsKAH>Y`!vlkYDv;u#M7RTU#L@H zj4ox~)%A2kYBX&|n&vY8+2eASBk7v+<)>#dG)}5~D^5!_pQvEoGXS6$$1*foDO6T4Qedzajx>Twfqd{Q#CRo`Yo2&CjE#7-#_Llc>Z-|gY?2w_2xH2Wb#bZ#Iwy4G{CG~UWFN{wc1_mmnzLrg}z64aSBv{r7W7FDW(%sG)XFu-1>E8 zu6|TG6$|O4jPYcuf<9^SRIH?|N!B=;b+$$m{Uk|N$L*V^ajS~plU)_$6eYWAg9Q>0>(i!>MM*yY1CcZ#W}7TLAX=!0?%;u;-OA6C)Vzp67S zbWA;h!5niNV#NKXwyOu1;d%|j@?+`&w5~p4oS6lgQ3*U=Be-+&a_-R{wB;>9Gha*Y z41+n9<8I=1ggb*99`sq9)0=~U=N;UbYt|%v3dQL)@s_CR2HcH#_FS6pgO&tL2BJOU zuZOVsXVWWf@K2xEpsNK8AGZ?Syi#jsJKMGIyw0*##9a9`!$QAu2t9Kt?4K>iU~!(I z#=+lDssBpBR{x}1#LaRwM|D1t;l+0`bZs+?bIoeKnGHOqdkEpZlZC0aP^~9a6sj#L zF7SkkgZ@BK$Xi-kR2MD|mDC3Pbsn0TA|%n-_o?FO#1V!4%=w4^toVkmJE{oK#BrjN z9y_XV!X81?u9@9tVh4{ZHVBzqDjW(Gg$w++nv|4=!bOFFaB*#&*BioNQA%5nD*CS3 z=Thkl@?jj;fh!esbC-@62hiqU6~9Hqe%{{|32ftUils{CKdzW5M3N_|lu*oRl?Fv| z!P<#Hw7>T^g_+%ULeUCBrd9rv4jGg>T6VEuq#+Hec(Rz4iLAw-{J}%(vs5+%R=|K@ z`+zzCzqiryOB8+R!!o6j4rQtQz2E)w5=Ftf3Wb3@4+|<L%Bk`BECM#2W=h}FwB8j#=3~M!qUFGQgZjxQ)?5?5UG6k&ahN|LwXF@aLY1w58 zTX)WQhbl9*?csjIO zm`oY-EFQoj_G=Oq4GzljA0A* zhOI$*&1J4~ipccP}*zX(=p`CVwD ztFBf0)?{9h#PY6Heh)+fr6Pd_kP?ti>y)ZBo1X!ItB5{ZZcu7i0x5Bn?c1nC$g~@k z-iwJC!+PxmT%Qv-!nT`eY=wj^`ewo<2!X zQ=NXXg`M=DZT>wU`K`qQd%MHW3s$l@te=+~@%)J7kdDeROmOp(U6yssQ6 z(&eMk)Z1o6ve35Ciiz^@Oo1CVzS6P0PnDx%Xiyc%!dd&3h&sRhkWxiYovlb>Ro^RN zgtuLxilJGxioTRCsEXIz`(-YDQmYs#{i4dCVk(<`TzO1y<0xs80Zw%_H)}lwMU7UE zP{Ok752Y@nD{KDga?-YuN*Lh;75Y9=7|iPGsSvDnp<_~31qPoNl^D&D-#f$YcMEB> zyB&09OEU&}*DxjA%*-l)x9L4qbu&}u^RqgOCeGwb7D5P?&sq~oWffp4i%r-~$q>eST ztF|Z8&~M=_j#Y@|b+syX&GCv@+OSIHrboU72Z9pP*z9Xn2`X(twX93)BHfyTe4Lxb z1tc6+WY9~8ut@kx0ICjXqU%*F*s3+EEy9^klbW@v;b+dZW38(6%(+t5sY+utwjEG~-5&C;1wg+Kr+A)ZJ z7$B4n;!ZSGFlBF8%(YXJs0V&xI4L3gkUVT6FF7X?kpV@&pv-T~c3PGvJVn`?)rkcV zT_aMRthI|6tH|wxLjPWGGxm?zdTHbEXMe0XY*S_*}>otv!z? zqXtMyS^ropoT5gX9ovuvj z11{29Mo&)?QgV8a4uo|*zL$7C=>wXZFO<>)`9dT8)&iyf`=6=%(|I1Dh*}NCK5-KQ z4b4-esf1)z`ahR;dLXGOf7g^?sOp+|$as>x!gvLMb4@;>Pu7UBqeh$s37~9lD35!d z>jI#d$|+5>71`DDs4{hd&?cA=?_C-rIXA8K2{($;Vxa+kA%`0M!t|8r@{vD`$nLl^ zPcD7s7nYeNA-uawi$~kX2?<(=&*XA0E5u6JQ3%_ebJDctbyL8KPA?Lyyw#6+asF&5 z5>~0@B4|LdaFnt?M{vAVpKIc1ObO1fni8QuRj1*)#G##H8`|X!Gc4Ev&rvtlHoaXU zIH_TvCW#ECf+Yq!P10iKk_V_ml=PG?foe(xZ49h3CI6;e2#V0AX*<=4^l~W< ziiyJ}M{EkZb3$`vi|i5ZQ`OPZVgvRNR$Cs|X+=bYbj=Xq+^JK7fo3>}BKSsKL%myG z#9cM^EGN_gI4iDdX$y1vep@>}M3{MCLo~FXrsQP$Vu-L#D5GnJ3is2nGQn?&?s@LP zg~?ima0WJnvWh`?^SjD~BsgL>wW2BgZ8>sJx~NEG#o%>CGgokzb6*oI2lyUDzHrgj z_=L2$NDXKbcSUXI!f!UST*wtb)c~k0xo*>~!-V;w^qUff3trh@c=T|=p~McRdBZWa zM}`X}@S^WOLMW!WBZSGRd>%kKP`5m1d>G}S&!rDW2-l^_$&rRewh%Uk9 zCnuQc)1iXNBIV_96>=+c*}EeJr;sBT5s_3+9)&2DlL4_b62TXGZ5aD#p&E;L#b{w1 zJz+D(Cu2?;>R_$W(uxW>m$@2G)&$0 zj|B^M`#`aeT5d31tGEqNHSe3z#k6|3ofDbmbu!!zb-{tx1rf0_qE$DatS;AO(Bi(kE zkj{3VCBS<3mJDNJC%p0zqN4Y5Mo|&9QkFYPjd`~!CRWr;88K`kOqwRUa=B(Lizg#s z%;<_SHKQxWkLr3YsohQ*iopn1>-GA$8m{Y&wQ?dKC9dz1BZlSDR+}-6J{m8?#pGbN z>smPJ7L_1 zI7LQ6UT1VH70gB82=368v%uST6+-1{f?3n^W4b0y0OZ~g6@Ynp)^l^!iAfmEkyvZP znnPd`aTs=0H#A-7N6XTM^(M)K5^EAF9N7GkKSP*AReMn(XLT4@oqS<#7q@W+W~G}g zkd}J5&psz>m z!X@@uTkP7`!LGMG;BjwGF_U(>6uFyKriONW#_XT0atGqXw7(+kVhA~ zghKkY0zn*ixo|H=zGnJhT#nR8n31~#jVg>aN{ih>=ek^Bhzu0>noH0dC2q0n;9Q(5 z+(7frN{gfPzL1aXd>#M`H*!z3bNYf%pSKgo<<)(KSk5v;x{kr>njJnA^m1QeVb{X5 zQ0*>5Y&^0{>|iaH=8_g}DvQ0f{YEhxa#NGq>E@IhqaRWFbE8%Mt0e?bCzLNKt#j#} zvxPe&C&}`2gmcyMAw!>@BRoz&4S-T;^E8aibJK+MNUkrY39!KCcFDXJ8gZ_WT+ACD zY~t{QGM^L1!HTE|(k`uOpVLqWExUA#^p`-o<-gzg&J`dia(voQcoPJik3wiq331R{TCWtBg<^d$&38E$q zpULNy8)2*<_>ydAbaE11*CzI%nmSP&mbZ97D7=tc>_qqu*~Z3~=gTX|E0zC6bHJJ$ zj?!|RuSiJ%5!(|MHkp-^$a8-RwS#8>30D+$yU`)W(W!EliN z84~*zA=rAfx|2$CVg0~hAl#PU9&SR5PHA-!Z&%T2+KbdY4^RK|R_2%Z!i8Qh7ZrxW zz5?jReE#ARKO~fBZP@Ge2TKdR#f2VTJa6KfEOQ^jsVykT^W+tr(gG><%q{R275hUW zU!b_KxUe=*Phg3>^7$X8P8_4!J>T96ulY73O!JTC?6#P}>c@bNf9 zzjF&~i;7AD;W}@TrxfNJB~X|7N(+OYf?!Fhuhv@|@cQbC!=4fsjc*W>H9c2}=tcQn zx^9ISpPuJELrw7mN{alowRMH19)Ga5q^_{G*5~urm6jHGN^AWk9&bruK|!6z&qogf zOb0_^s-9bj^{ny#<+>dI@2<Trp# zBU+1L4Q=@EhoGpmE*$m-(05-!pg33?sPzScAbN$R-qJ!}C{P*Hc+}2S{B<~w{Js)jFn|N1v>*r-RzXR? zR|~yXU9qR6t`-JCRI{ijasHpCB|qThhI~MR@`j5%9?U^$peR^e;Aa7k@l zL0xTW*Rm9rh{?UD#ayiH6};au|3suf~lhVRUqAlF|M48csM6z6QHuGCjj7YY^BdVKH# zsV%Gv1`5MCw>;jUTwQLjn$*0e$PtLT&P*x2Mc8e%SX70ekG>**0oQ^S25L)+pc@6( zQS7Pp6&3mlrLLu|*PSSH51y~X~3FI0k^>jBX(2?YYhbv_&e!6NLbLQgFK0&DAnMRI*y z{c0>Y`6&Gl`Y2Ty@cIi1yoFdK0bfZ;N!W+;6C^Dh4#1nIsJO@G;A|J#D8 zs||oR@&$b*{!o#>xF}HT_1A%5gM%pw7Z#Kh2Ls@ka4g6py7^~?NR^$U_+JkzXQOjr zspSDZ2#36Z(tD<$6lVO&vXd__@_*IQcW z3x!Jy!*xN>L@@1jC0bkqgGu6YzP$9)E3N zF^=mXj;tU~ZGWgX5Gch3#|L(;w6@ko*Ig{8bx-vFM*h*QU=e0J2;$)L!dL>kHOxlM~^q`3!<;MzLgXN ziabGi-f=YJ>UwxG?%CxNfqMOnc51d35jjSLu@Z4cE$4lf?moHKJ@XsYPwk>KEk^i0U1T~o#Uf1P9Q*`nuP<#3bk9I=2N zoi1k3)^o(9|DgS+&zeJXr$I!x<$Z^m4^d7`l)altTc(S4%G4XwH1yp62Q^LZs-%b) zJ>>N5kw)$0p+9}r9J=;A(bZL|^i$7^cF?cYqB%1nvy`V5LMaI98XLo*8L}*5Caoxe zUS;=mQI#E7#O0Ba9P&>-qQE|=cz{WfO0U+4eQESMRqh!zv~1NnRo%a#6#n!^RRZ&NeFCV@;shP?b;x0>5?bQ;$%ta4$g|3;b(Pee#VYHXF^ns zBe_Q)(5)tZ%K6-1L6ZML>Iel0{1>TUPJ36n^~XS9Ig*JdZVfzW!XS?yq+pq?91xU$E0-rZ%e%YtKrkoeknH?>mfwkct3MBi+kaU{6+ZvddL$1D;4@&# z+QRb}G_-|*OAT#8O^q!NfjR>VIuLT`CY3l+%7|V^8p3In3{{4Yd-W<13XR|)ACcZ8 zhpg(o?j}{5Tl(~*6(g0<&>U=B5RyP#xx$40xeh}1Q8%fqBhEZ$91flXb<3Uye3VZv zjZc+P$`$FtGSc6y8hz#^KL2J_K}pmV#TJ#wO_oRNOf4gPokYLftQu>Mj<3{IKyH@Z zqAKspy-6h7$f$4fUsB30d50uR{Yy&umz45Pq~{SH{4XixpXnj~l2V>dNcWeN@-Hc6 z^m6`}l=43iUjHSf{7Xvt?+cp$l2ZO9rTj}u`TtZ(nfISbDQRP;;IJaF3YSB;5pIgx z1J>lybt!;HTU8-G%YDh5^zI>rZO!q%arDMn5Hwbf6KAoQv&2i!>`S)ikRtbFKe85j zs8dMzlS*0nB0-3HlWkoh0N(nLB8KZj6a}uelazgAkFu)80z!P=(J5s8NjY?^Q`jnb zn=yEsofx30t{yRGLGwKNXQv`T-@|C3x0jiXGA~eAdcE)EX{L_2lATh@>HN*EyGYTe zS5dv(&48VEa#g3eoaOcQh&qk8*&~-JQvO|Uvy$GWo$6>drgw%@eaucO;ZNMl66iP_ z&3c!0s*l-8W&MeJ+2G#Aoa$NTI<>OXxR)uatLf0?LQ3z_dU=?Q>iw>_a~Xqk*`YM< zR~AcoUkH7;OPQLs%~X0B+|0%a^v7)YiH-jZ)~#>s5i~R?pseirsb=g=p+1(u$Ltcs zgMuF!+x3-DY9x4yCDCplT(!85*qY`m`q28zl|#tz7HZ&0Y}U_$NyXqxR;y)j7vpgm z;Somg2uow-YQ?)M2Dh-kYrFlx*!c;HOZzgobS)McytdRa3_e-$vO5-oJ657W^2B2B z#F}I{v$K_+!9usZRq_A8*{b<&m`w7b&gg8#;B0l=Kya+epcS{nMQX(|L8P;mfe@5u zir`Zz&!~V(`Vfs)wf)Cv2y9 zS#2ixRT(+8v@_KYiWosz-~kf&kBSOqL0%zM|EL(y>1YBz4Gcd=Er!PockSsm{Dy2A zmauZFEZm0c!`$|kW?8Cz>X$&rhqHu~<8+^Pw9E@PbNO_S?~8g>Ef>(8FXC5nYE5MQ zQQ;4AsHwUZZc~g>xcuJM)n4v;VXFvTmHbO4%=FUmntn}o*b6a59 zm&Jis3&QR6>Q9Q2T*S*kM4TSqBY_9Vk@HC7)X?Gfdi=Dt-H=JUFGW1@nme#6*58Le z8S7QKw0b?X6tmZ>0BW#a1qI}KcpJB7i5i-bEgG3+gUTQndb&w*lUNt+ycJGrH*8dG zq$jtl^el9nYKg#xX{=Udfz0!{G3zh<@$t~Gamq_WVX->H_+w{@Br8s!C%u&q;zH1nX!L+cKzhOvDI zRY#O`s6(Af6U=~)t~m&6)uV@0Mi%#@Y7rv6Ys8}pcIi;@?+SJ>Q>>TTA@vYldYLyW z`a|m9P4r8)xRSEmz-K^6VguW37ZLa7pGU=HHr6S=B~Z3YY}V?^As2(1iOOrBrF_vP zPG*^Iu`ZErI&9R_^*XUuid#oWOs5sUnN=)PFJ=j>beIU#1-SCrX!Cv8RGoLUKZgNpDaG0h6}E$kgd2|bx;9lWNw1Y=w8+Df;>6*-5;4I zw*P)rJTSDmiE_>k)dA#1@8S`bCst2GZHNIdDk(D)FxD5>3Aa&eoe;-L>V-uDJ@Yg|N^G$s7UDnV z;7#M-0bIVQL3ou6)A7R7mZPF`=L+A_(!YzbRQ3uW`e)4(rjfG>!1RbKuA@&H;Y;UN zBqh`3O+pQszfS=5%>upe55=S6yQA>8a<-68g;PoG8{&ZbUv z9vgdD+$Ye5{Sj`r{6{e_5*z3jSQ%O_SF7lmAH}b`-s)|0fa9AU}zS3=;iL zPt$%Dp$^}KO}+YI?Dji;7Oxhi8Kl+M3Q2PKK}=!!2kH^baul0_S*};#DzJywsH?FE z_d{!ZXa~0cfKD}Rz&{fc*?IS=XDeyjgKD>k6^n1JscIWDKcxOaFKrb%wAC5I`aY?y zF_0xetw-D;7>zG8B0~4hL(r&8X(v7t@27|UPei#S_VHt`W9Tdhzph^5voqR0-tp&l1Qp8M4CY)Gg2tynVtAE;C2bK+eB zef=Ch`*|mVNG0tQ9c<+D;(8?~auUhVy(B)O=rN6{3F>nM8vbK!Je_+04v^0#s@3el zMD==3WH?!5!DRL8aPD`bJWhAnbhrALg1+xir?Ex-)PE$ahTe!lqSH& z|Mj&EYlhPq)YdJ{Qo_K2Lu}dQ**%gc;^JhR5bl`M5*h)8z3!CnqzwGKNelkJ-mU~T zit7w#*PgMx>vMjawawbB&-HCECULN1d=oHWz}Q@40`UP3#tX(SkkEvPlq0D)m?dvA8vTvgLbt+djcdGqF7^UweO zH~atJhkuI&NTbYI?y47yW2-pv-Q+Ftg13lE+$FBp!$Sn5l?X*l26fzX4`lr`>milh zTT0di$KXyx(6x&=9vL`?M2Z7aAxGYRyl_`-{!#zPdwoMG^Li$jxP;5iR%+$|^38=m zciX#t1bA~?5a{+6pjrCnInNej&Y{05$?m(DEqQ8m=6#v2$*pZ2tq523bXG5IZj}*u zW)Xg|Tun5-sZzH`g$Xcv`7gR)5;i_*R9yl0=5fIcwIz3;m>I|=@aJKjn7$aD%_1CT zpomdCQ++GWfD|nY=7w*e+2p%$Yz^s$zxn98`miU4K$@RKL=6PEn0FkEmkJDS>cd9#3XmuMmeWyn8mecC%{Mr}l4dc#NswdDWKBMlp@`%%Ft℘tpM%b33W8T ze_Wl<-~Aor7YEN^J=QLOvUg(vtxGqf;_!S0CbEo>n>?p;u6W=ASsK13@)9=;r~TZ2 z9wbZKj)F1+L>yq^v)dJ(P)I@C7igCk6kb?J$-L$bu)psvqy%vxn!hR}n3p1^t1jHF zaCo>omMcbp=6Kc!TE*iI2ZE>2->DOEZozW{A0StGRh8h{ask29%$Qs~zOGSb0mhj7 z#?j2!RH4mL#`GO(m{9p-`GnEcRXMD@mp%=Qj**K@5BrAd&gSDww<{tI2JI))1Hyw>5=E0~>`B zNcUkX3+&Py;K;(KancxS!~k}VA!voMa`c!Y2kT>LF!Gm-rLGcP20i;`z>I+QK%LrJ zJi_rtT&RWo=<{0<&h0IR4#_-Ds-@wjI{2%>?BRP565wGVPxk#eABs1Ww2p{G(8&5) z1ji!v-Y3?3E&_x-`>!MIPZDz#RzcqjBD+jE4it9PtsQx$^qjS z(o%!@6(140J@TkY;sToy_uzWn-h|E4#T;rWe8_EZmb~j$d3N9J+j1!l?S7p@^&Fc= zX__w<*yN`Xy*Ac3X(#vs$GBs-HjzeJ^iAg}5jSO9D2accNTYDv89;ID96}K|t_zkg z{iGrC1=$!(gL%ymdJGEeLKfm>fd!E&LUUnWfJL&kYh3#R7)3$=$A?e}?w{bodU4T4 z(KvqDMO!%|iMnyTC5hsF`3I9|5wc2>rT%;-nbsTD6v_q@mXVuEGXe(N@W!D9=x7mR zUESG&U~wonIiUTK^oC_RsLtEk;Fu|bp<7y)0)jzgprr3qOuoF1OX65Ai~^~_56YirW)bt$it;&7HUTFHw!f&8D^DduUcv1V87loXQR7o84xzS`tOcaN=s^hOz@nA z?BLO74(J;RI#(xHb9s9n&EOA?U>_g>SoG3EHv`~R)VK7LMkEoDDb^b zKAvg$G}Jm!BOeYRo%b$=oZtIi8mklv2QGw)sr^W$m;RecaN32#vM{W-aI8u2c8?G;fgOo-IxDISr_ z3H3A@qiCt8`AGg!FZImjdYUrWYlp!i0G<;l!^E9XY0}1fdJ6Qo&LIu*wasfFA=Zap za>Q^;11(LI4V#vSXv8!WvAB0+U~8cBod!y9{HqQPYozy4*||n4byRv5F6(NaJFnZ7 z0osy+p~DJt3lRHd#FHg0(Acb4##rMY>f{b&6?bOuF9V!0!u8#^OYzOZ8r|Dry;A7!oVgdr zeqQo$c;T1?c#Oc6!Ji}k>tJr*a7r5#jBqZQhZz_x|1|N0SQ0HmjddZGDr;y>S37LU z#dU4yqjAD+=~F{s6XfR3!9OXyQL}V8e^$OV<4#N8g~|Uodg=M*@|6|w@$Xn4dE}AN I72_-Z2@rP=Z~y=R diff --git a/tools/phpunit.phar b/tools/phpunit.phar index 42eaa5b..8f6bc1b 100755 --- a/tools/phpunit.phar +++ b/tools/phpunit.phar @@ -19,7 +19,7 @@ if (version_compare('7.3.0', PHP_VERSION, '>')) { fwrite( STDERR, sprintf( - 'PHPUnit 9.5.10 by Sebastian Bergmann and contributors.' . PHP_EOL . PHP_EOL . + 'PHPUnit 9.5.26 by Sebastian Bergmann and contributors.' . PHP_EOL . PHP_EOL . 'This version of PHPUnit requires PHP >= 7.3.' . PHP_EOL . 'You are using PHP %s (%s).' . PHP_EOL, PHP_VERSION, @@ -52,7 +52,7 @@ if (__FILE__ === realpath($_SERVER['SCRIPT_NAME'])) { $execute = false; } -$options = getopt('', array('prepend:', 'manifest')); +$options = getopt('', array('prepend:', 'manifest', 'sbom')); if (isset($options['prepend'])) { require $options['prepend']; @@ -60,14 +60,16 @@ if (isset($options['prepend'])) { if (isset($options['manifest'])) { $printManifest = true; +} elseif (isset($options['sbom'])) { + $printSbom = true; } unset($options); define('__PHPUNIT_PHAR__', str_replace(DIRECTORY_SEPARATOR, '/', __FILE__)); -define('__PHPUNIT_PHAR_ROOT__', 'phar://phpunit-9.5.10.phar'); +define('__PHPUNIT_PHAR_ROOT__', 'phar://phpunit-9.5.26.phar'); -Phar::mapPhar('phpunit-9.5.10.phar'); +Phar::mapPhar('phpunit-9.5.26.phar'); spl_autoload_register( function ($class) { @@ -223,7 +225,6 @@ spl_autoload_register( 'PHPUnit\\Framework\\MockObject\\MockObject' => '/phpunit/Framework/MockObject/MockObject.php', 'PHPUnit\\Framework\\MockObject\\MockTrait' => '/phpunit/Framework/MockObject/MockTrait.php', 'PHPUnit\\Framework\\MockObject\\MockType' => '/phpunit/Framework/MockObject/MockType.php', - 'PHPUnit\\Framework\\MockObject\\MockedCloneMethod' => '/phpunit/Framework/MockObject/Api/MockedCloneMethod.php', 'PHPUnit\\Framework\\MockObject\\OriginalConstructorInvocationRequiredException' => '/phpunit/Framework/MockObject/Exception/OriginalConstructorInvocationRequiredException.php', 'PHPUnit\\Framework\\MockObject\\ReflectionException' => '/phpunit/Framework/MockObject/Exception/ReflectionException.php', 'PHPUnit\\Framework\\MockObject\\ReturnValueNotConfiguredException' => '/phpunit/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php', @@ -254,7 +255,6 @@ spl_autoload_register( 'PHPUnit\\Framework\\MockObject\\UnknownClassException' => '/phpunit/Framework/MockObject/Exception/UnknownClassException.php', 'PHPUnit\\Framework\\MockObject\\UnknownTraitException' => '/phpunit/Framework/MockObject/Exception/UnknownTraitException.php', 'PHPUnit\\Framework\\MockObject\\UnknownTypeException' => '/phpunit/Framework/MockObject/Exception/UnknownTypeException.php', - 'PHPUnit\\Framework\\MockObject\\UnmockedCloneMethod' => '/phpunit/Framework/MockObject/Api/UnmockedCloneMethod.php', 'PHPUnit\\Framework\\MockObject\\Verifiable' => '/phpunit/Framework/MockObject/Verifiable.php', 'PHPUnit\\Framework\\NoChildTestSuiteException' => '/phpunit/Framework/Exception/NoChildTestSuiteException.php', 'PHPUnit\\Framework\\OutputError' => '/phpunit/Framework/Exception/OutputError.php', @@ -333,11 +333,13 @@ spl_autoload_register( 'PHPUnit\\PharIo\\Version\\AbstractVersionConstraint' => '/phar-io-version/constraints/AbstractVersionConstraint.php', 'PHPUnit\\PharIo\\Version\\AndVersionConstraintGroup' => '/phar-io-version/constraints/AndVersionConstraintGroup.php', 'PHPUnit\\PharIo\\Version\\AnyVersionConstraint' => '/phar-io-version/constraints/AnyVersionConstraint.php', + 'PHPUnit\\PharIo\\Version\\BuildMetaData' => '/phar-io-version/BuildMetaData.php', 'PHPUnit\\PharIo\\Version\\ExactVersionConstraint' => '/phar-io-version/constraints/ExactVersionConstraint.php', 'PHPUnit\\PharIo\\Version\\Exception' => '/phar-io-version/exceptions/Exception.php', 'PHPUnit\\PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => '/phar-io-version/constraints/GreaterThanOrEqualToVersionConstraint.php', 'PHPUnit\\PharIo\\Version\\InvalidPreReleaseSuffixException' => '/phar-io-version/exceptions/InvalidPreReleaseSuffixException.php', 'PHPUnit\\PharIo\\Version\\InvalidVersionException' => '/phar-io-version/exceptions/InvalidVersionException.php', + 'PHPUnit\\PharIo\\Version\\NoBuildMetaDataException' => '/phar-io-version/exceptions/NoBuildMetaDataException.php', 'PHPUnit\\PharIo\\Version\\NoPreReleaseSuffixException' => '/phar-io-version/exceptions/NoPreReleaseSuffixException.php', 'PHPUnit\\PharIo\\Version\\OrVersionConstraintGroup' => '/phar-io-version/constraints/OrVersionConstraintGroup.php', 'PHPUnit\\PharIo\\Version\\PreReleaseSuffix' => '/phar-io-version/PreReleaseSuffix.php', @@ -355,6 +357,8 @@ spl_autoload_register( 'PHPUnit\\PhpParser\\Builder\\ClassConst' => '/nikic-php-parser/PhpParser/Builder/ClassConst.php', 'PHPUnit\\PhpParser\\Builder\\Class_' => '/nikic-php-parser/PhpParser/Builder/Class_.php', 'PHPUnit\\PhpParser\\Builder\\Declaration' => '/nikic-php-parser/PhpParser/Builder/Declaration.php', + 'PHPUnit\\PhpParser\\Builder\\EnumCase' => '/nikic-php-parser/PhpParser/Builder/EnumCase.php', + 'PHPUnit\\PhpParser\\Builder\\Enum_' => '/nikic-php-parser/PhpParser/Builder/Enum_.php', 'PHPUnit\\PhpParser\\Builder\\FunctionLike' => '/nikic-php-parser/PhpParser/Builder/FunctionLike.php', 'PHPUnit\\PhpParser\\Builder\\Function_' => '/nikic-php-parser/PhpParser/Builder/Function_.php', 'PHPUnit\\PhpParser\\Builder\\Interface_' => '/nikic-php-parser/PhpParser/Builder/Interface_.php', @@ -636,10 +640,7 @@ spl_autoload_register( 'PHPUnit\\SebastianBergmann\\CliParser\\UnknownOptionException' => '/sebastian-cli-parser/exceptions/UnknownOptionException.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\BranchAndPathCoverageNotSupportedException' => '/php-code-coverage/Exception/BranchAndPathCoverageNotSupportedException.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\CodeCoverage' => '/php-code-coverage/CodeCoverage.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\CrapIndex' => '/php-code-coverage/CrapIndex.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\DeadCodeDetectionNotSupportedException' => '/php-code-coverage/Exception/DeadCodeDetectionNotSupportedException.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Directory' => '/php-code-coverage/Directory.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\DirectoryCouldNotBeCreatedException' => '/php-code-coverage/Exception/DirectoryCouldNotBeCreatedException.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Driver\\Driver' => '/php-code-coverage/Driver/Driver.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Driver\\PathExistsButIsNotDirectoryException' => '/php-code-coverage/Exception/PathExistsButIsNotDirectoryException.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Driver\\PcovDriver' => '/php-code-coverage/Driver/PcovDriver.php', @@ -661,11 +662,11 @@ spl_autoload_register( 'PHPUnit\\SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverWithPathCoverageSupportAvailableException' => '/php-code-coverage/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => '/php-code-coverage/Node/AbstractNode.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Node\\Builder' => '/php-code-coverage/Node/Builder.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Node\\CrapIndex' => '/php-code-coverage/Node/CrapIndex.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Node\\Directory' => '/php-code-coverage/Node/Directory.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Node\\File' => '/php-code-coverage/Node/File.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Node\\Iterator' => '/php-code-coverage/Node/Iterator.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\ParserException' => '/php-code-coverage/Exception/ParserException.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Percentage' => '/php-code-coverage/Percentage.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\ProcessedCodeCoverageData' => '/php-code-coverage/ProcessedCodeCoverageData.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\RawCodeCoverageData' => '/php-code-coverage/RawCodeCoverageData.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\ReflectionException' => '/php-code-coverage/Exception/ReflectionException.php', @@ -694,19 +695,18 @@ spl_autoload_register( 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => '/php-code-coverage/Report/Xml/Totals.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => '/php-code-coverage/Report/Xml/Unit.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysisCacheNotConfiguredException' => '/php-code-coverage/Exception/StaticAnalysisCacheNotConfiguredException.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\Cache' => '/php-code-coverage/StaticAnalysis/Cache.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CacheWarmer' => '/php-code-coverage/StaticAnalysis/CacheWarmer.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingCoveredFileAnalyser' => '/php-code-coverage/StaticAnalysis/CachingCoveredFileAnalyser.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingUncoveredFileAnalyser' => '/php-code-coverage/StaticAnalysis/CachingUncoveredFileAnalyser.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingFileAnalyser' => '/php-code-coverage/StaticAnalysis/CachingFileAnalyser.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CodeUnitFindingVisitor' => '/php-code-coverage/StaticAnalysis/CodeUnitFindingVisitor.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CoveredFileAnalyser' => '/php-code-coverage/StaticAnalysis/CoveredFileAnalyser.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ExecutableLinesFindingVisitor' => '/php-code-coverage/StaticAnalysis/ExecutableLinesFindingVisitor.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\FileAnalyser' => '/php-code-coverage/StaticAnalysis/FileAnalyser.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\IgnoredLinesFindingVisitor' => '/php-code-coverage/StaticAnalysis/IgnoredLinesFindingVisitor.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingCoveredFileAnalyser' => '/php-code-coverage/StaticAnalysis/ParsingCoveredFileAnalyser.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingUncoveredFileAnalyser' => '/php-code-coverage/StaticAnalysis/ParsingUncoveredFileAnalyser.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\UncoveredFileAnalyser' => '/php-code-coverage/StaticAnalysis/UncoveredFileAnalyser.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingFileAnalyser' => '/php-code-coverage/StaticAnalysis/ParsingFileAnalyser.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\TestIdMissingException' => '/php-code-coverage/Exception/TestIdMissingException.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => '/php-code-coverage/Exception/UnintentionallyCoveredCodeException.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Util\\DirectoryCouldNotBeCreatedException' => '/php-code-coverage/Exception/DirectoryCouldNotBeCreatedException.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Util\\Filesystem' => '/php-code-coverage/Util/Filesystem.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Util\\Percentage' => '/php-code-coverage/Util/Percentage.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Version' => '/php-code-coverage/Version.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\XmlException' => '/php-code-coverage/Exception/XmlException.php', 'PHPUnit\\SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => '/sebastian-code-unit-reverse-lookup/Wizard.php', @@ -810,26 +810,28 @@ spl_autoload_register( 'PHPUnit\\SebastianBergmann\\Timer\\ResourceUsageFormatter' => '/php-timer/ResourceUsageFormatter.php', 'PHPUnit\\SebastianBergmann\\Timer\\TimeSinceStartOfRequestNotAvailableException' => '/php-timer/exceptions/TimeSinceStartOfRequestNotAvailableException.php', 'PHPUnit\\SebastianBergmann\\Timer\\Timer' => '/php-timer/Timer.php', - 'PHPUnit\\SebastianBergmann\\Type\\CallableType' => '/sebastian-type/CallableType.php', + 'PHPUnit\\SebastianBergmann\\Type\\CallableType' => '/sebastian-type/type/CallableType.php', 'PHPUnit\\SebastianBergmann\\Type\\Exception' => '/sebastian-type/exception/Exception.php', - 'PHPUnit\\SebastianBergmann\\Type\\FalseType' => '/sebastian-type/FalseType.php', - 'PHPUnit\\SebastianBergmann\\Type\\GenericObjectType' => '/sebastian-type/GenericObjectType.php', - 'PHPUnit\\SebastianBergmann\\Type\\IterableType' => '/sebastian-type/IterableType.php', - 'PHPUnit\\SebastianBergmann\\Type\\LogicException' => '/sebastian-type/exception/LogicException.php', - 'PHPUnit\\SebastianBergmann\\Type\\MixedType' => '/sebastian-type/MixedType.php', - 'PHPUnit\\SebastianBergmann\\Type\\NullType' => '/sebastian-type/NullType.php', - 'PHPUnit\\SebastianBergmann\\Type\\ObjectType' => '/sebastian-type/ObjectType.php', + 'PHPUnit\\SebastianBergmann\\Type\\FalseType' => '/sebastian-type/type/FalseType.php', + 'PHPUnit\\SebastianBergmann\\Type\\GenericObjectType' => '/sebastian-type/type/GenericObjectType.php', + 'PHPUnit\\SebastianBergmann\\Type\\IntersectionType' => '/sebastian-type/type/IntersectionType.php', + 'PHPUnit\\SebastianBergmann\\Type\\IterableType' => '/sebastian-type/type/IterableType.php', + 'PHPUnit\\SebastianBergmann\\Type\\MixedType' => '/sebastian-type/type/MixedType.php', + 'PHPUnit\\SebastianBergmann\\Type\\NeverType' => '/sebastian-type/type/NeverType.php', + 'PHPUnit\\SebastianBergmann\\Type\\NullType' => '/sebastian-type/type/NullType.php', + 'PHPUnit\\SebastianBergmann\\Type\\ObjectType' => '/sebastian-type/type/ObjectType.php', + 'PHPUnit\\SebastianBergmann\\Type\\Parameter' => '/sebastian-type/Parameter.php', 'PHPUnit\\SebastianBergmann\\Type\\ReflectionMapper' => '/sebastian-type/ReflectionMapper.php', 'PHPUnit\\SebastianBergmann\\Type\\RuntimeException' => '/sebastian-type/exception/RuntimeException.php', - 'PHPUnit\\SebastianBergmann\\Type\\SimpleType' => '/sebastian-type/SimpleType.php', - 'PHPUnit\\SebastianBergmann\\Type\\StaticType' => '/sebastian-type/StaticType.php', - 'PHPUnit\\SebastianBergmann\\Type\\Type' => '/sebastian-type/Type.php', + 'PHPUnit\\SebastianBergmann\\Type\\SimpleType' => '/sebastian-type/type/SimpleType.php', + 'PHPUnit\\SebastianBergmann\\Type\\StaticType' => '/sebastian-type/type/StaticType.php', + 'PHPUnit\\SebastianBergmann\\Type\\TrueType' => '/sebastian-type/type/TrueType.php', + 'PHPUnit\\SebastianBergmann\\Type\\Type' => '/sebastian-type/type/Type.php', 'PHPUnit\\SebastianBergmann\\Type\\TypeName' => '/sebastian-type/TypeName.php', - 'PHPUnit\\SebastianBergmann\\Type\\UnionType' => '/sebastian-type/UnionType.php', - 'PHPUnit\\SebastianBergmann\\Type\\UnknownType' => '/sebastian-type/UnknownType.php', - 'PHPUnit\\SebastianBergmann\\Type\\VoidType' => '/sebastian-type/VoidType.php', + 'PHPUnit\\SebastianBergmann\\Type\\UnionType' => '/sebastian-type/type/UnionType.php', + 'PHPUnit\\SebastianBergmann\\Type\\UnknownType' => '/sebastian-type/type/UnknownType.php', + 'PHPUnit\\SebastianBergmann\\Type\\VoidType' => '/sebastian-type/type/VoidType.php', 'PHPUnit\\SebastianBergmann\\Version' => '/sebastian-version/Version.php', - 'PHPUnit\\Symfony\\Polyfill\\Ctype\\Ctype' => '/symfony-polyfill-ctype/Ctype.php', 'PHPUnit\\TextUI\\CliArguments\\Builder' => '/phpunit/TextUI/CliArguments/Builder.php', 'PHPUnit\\TextUI\\CliArguments\\Configuration' => '/phpunit/TextUI/CliArguments/Configuration.php', 'PHPUnit\\TextUI\\CliArguments\\Exception' => '/phpunit/TextUI/CliArguments/Exception.php', @@ -935,6 +937,7 @@ spl_autoload_register( 'PHPUnit\\Util\\Annotation\\DocBlock' => '/phpunit/Util/Annotation/DocBlock.php', 'PHPUnit\\Util\\Annotation\\Registry' => '/phpunit/Util/Annotation/Registry.php', 'PHPUnit\\Util\\Blacklist' => '/phpunit/Util/Blacklist.php', + 'PHPUnit\\Util\\Cloner' => '/phpunit/Util/Cloner.php', 'PHPUnit\\Util\\Color' => '/phpunit/Util/Color.php', 'PHPUnit\\Util\\ErrorHandler' => '/phpunit/Util/ErrorHandler.php', 'PHPUnit\\Util\\Exception' => '/phpunit/Util/Exception.php', @@ -951,6 +954,7 @@ spl_autoload_register( 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => '/phpunit/Util/PHP/DefaultPhpProcess.php', 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => '/phpunit/Util/PHP/WindowsPhpProcess.php', 'PHPUnit\\Util\\Printer' => '/phpunit/Util/Printer.php', + 'PHPUnit\\Util\\Reflection' => '/phpunit/Util/Reflection.php', 'PHPUnit\\Util\\RegularExpression' => '/phpunit/Util/RegularExpression.php', 'PHPUnit\\Util\\Test' => '/phpunit/Util/Test.php', 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => '/phpunit/Util/TestDox/CliTestDoxPrinter.php', @@ -1030,10 +1034,15 @@ spl_autoload_register( 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\CallableString' => '/phpdocumentor-type-resolver/PseudoTypes/CallableString.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\False_' => '/phpdocumentor-type-resolver/PseudoTypes/False_.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\HtmlEscapedString' => '/phpdocumentor-type-resolver/PseudoTypes/HtmlEscapedString.php', + 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\IntegerRange' => '/phpdocumentor-type-resolver/PseudoTypes/IntegerRange.php', + 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\List_' => '/phpdocumentor-type-resolver/PseudoTypes/List_.php', + 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\LiteralString' => '/phpdocumentor-type-resolver/PseudoTypes/LiteralString.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\LowercaseString' => '/phpdocumentor-type-resolver/PseudoTypes/LowercaseString.php', + 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\NegativeInteger' => '/phpdocumentor-type-resolver/PseudoTypes/NegativeInteger.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyLowercaseString' => '/phpdocumentor-type-resolver/PseudoTypes/NonEmptyLowercaseString.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyString' => '/phpdocumentor-type-resolver/PseudoTypes/NonEmptyString.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\NumericString' => '/phpdocumentor-type-resolver/PseudoTypes/NumericString.php', + 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\Numeric_' => '/phpdocumentor-type-resolver/PseudoTypes/Numeric_.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\PositiveInteger' => '/phpdocumentor-type-resolver/PseudoTypes/PositiveInteger.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\TraitString' => '/phpdocumentor-type-resolver/PseudoTypes/TraitString.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\True_' => '/phpdocumentor-type-resolver/PseudoTypes/True_.php', @@ -1167,7 +1176,7 @@ spl_autoload_register( } if (isset($classes[$class])) { - require_once 'phar://phpunit-9.5.10.phar' . $classes[$class]; + require_once 'phar://phpunit-9.5.26.phar' . $classes[$class]; } }, true, @@ -1323,7 +1332,6 @@ foreach (['PHPUnit\\DeepCopy\\DeepCopy' => '/myclabs-deep-copy/DeepCopy/DeepCopy 'PHPUnit\\Framework\\MockObject\\MockObject' => '/phpunit/Framework/MockObject/MockObject.php', 'PHPUnit\\Framework\\MockObject\\MockTrait' => '/phpunit/Framework/MockObject/MockTrait.php', 'PHPUnit\\Framework\\MockObject\\MockType' => '/phpunit/Framework/MockObject/MockType.php', - 'PHPUnit\\Framework\\MockObject\\MockedCloneMethod' => '/phpunit/Framework/MockObject/Api/MockedCloneMethod.php', 'PHPUnit\\Framework\\MockObject\\OriginalConstructorInvocationRequiredException' => '/phpunit/Framework/MockObject/Exception/OriginalConstructorInvocationRequiredException.php', 'PHPUnit\\Framework\\MockObject\\ReflectionException' => '/phpunit/Framework/MockObject/Exception/ReflectionException.php', 'PHPUnit\\Framework\\MockObject\\ReturnValueNotConfiguredException' => '/phpunit/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php', @@ -1354,7 +1362,6 @@ foreach (['PHPUnit\\DeepCopy\\DeepCopy' => '/myclabs-deep-copy/DeepCopy/DeepCopy 'PHPUnit\\Framework\\MockObject\\UnknownClassException' => '/phpunit/Framework/MockObject/Exception/UnknownClassException.php', 'PHPUnit\\Framework\\MockObject\\UnknownTraitException' => '/phpunit/Framework/MockObject/Exception/UnknownTraitException.php', 'PHPUnit\\Framework\\MockObject\\UnknownTypeException' => '/phpunit/Framework/MockObject/Exception/UnknownTypeException.php', - 'PHPUnit\\Framework\\MockObject\\UnmockedCloneMethod' => '/phpunit/Framework/MockObject/Api/UnmockedCloneMethod.php', 'PHPUnit\\Framework\\MockObject\\Verifiable' => '/phpunit/Framework/MockObject/Verifiable.php', 'PHPUnit\\Framework\\NoChildTestSuiteException' => '/phpunit/Framework/Exception/NoChildTestSuiteException.php', 'PHPUnit\\Framework\\OutputError' => '/phpunit/Framework/Exception/OutputError.php', @@ -1433,11 +1440,13 @@ foreach (['PHPUnit\\DeepCopy\\DeepCopy' => '/myclabs-deep-copy/DeepCopy/DeepCopy 'PHPUnit\\PharIo\\Version\\AbstractVersionConstraint' => '/phar-io-version/constraints/AbstractVersionConstraint.php', 'PHPUnit\\PharIo\\Version\\AndVersionConstraintGroup' => '/phar-io-version/constraints/AndVersionConstraintGroup.php', 'PHPUnit\\PharIo\\Version\\AnyVersionConstraint' => '/phar-io-version/constraints/AnyVersionConstraint.php', + 'PHPUnit\\PharIo\\Version\\BuildMetaData' => '/phar-io-version/BuildMetaData.php', 'PHPUnit\\PharIo\\Version\\ExactVersionConstraint' => '/phar-io-version/constraints/ExactVersionConstraint.php', 'PHPUnit\\PharIo\\Version\\Exception' => '/phar-io-version/exceptions/Exception.php', 'PHPUnit\\PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => '/phar-io-version/constraints/GreaterThanOrEqualToVersionConstraint.php', 'PHPUnit\\PharIo\\Version\\InvalidPreReleaseSuffixException' => '/phar-io-version/exceptions/InvalidPreReleaseSuffixException.php', 'PHPUnit\\PharIo\\Version\\InvalidVersionException' => '/phar-io-version/exceptions/InvalidVersionException.php', + 'PHPUnit\\PharIo\\Version\\NoBuildMetaDataException' => '/phar-io-version/exceptions/NoBuildMetaDataException.php', 'PHPUnit\\PharIo\\Version\\NoPreReleaseSuffixException' => '/phar-io-version/exceptions/NoPreReleaseSuffixException.php', 'PHPUnit\\PharIo\\Version\\OrVersionConstraintGroup' => '/phar-io-version/constraints/OrVersionConstraintGroup.php', 'PHPUnit\\PharIo\\Version\\PreReleaseSuffix' => '/phar-io-version/PreReleaseSuffix.php', @@ -1455,6 +1464,8 @@ foreach (['PHPUnit\\DeepCopy\\DeepCopy' => '/myclabs-deep-copy/DeepCopy/DeepCopy 'PHPUnit\\PhpParser\\Builder\\ClassConst' => '/nikic-php-parser/PhpParser/Builder/ClassConst.php', 'PHPUnit\\PhpParser\\Builder\\Class_' => '/nikic-php-parser/PhpParser/Builder/Class_.php', 'PHPUnit\\PhpParser\\Builder\\Declaration' => '/nikic-php-parser/PhpParser/Builder/Declaration.php', + 'PHPUnit\\PhpParser\\Builder\\EnumCase' => '/nikic-php-parser/PhpParser/Builder/EnumCase.php', + 'PHPUnit\\PhpParser\\Builder\\Enum_' => '/nikic-php-parser/PhpParser/Builder/Enum_.php', 'PHPUnit\\PhpParser\\Builder\\FunctionLike' => '/nikic-php-parser/PhpParser/Builder/FunctionLike.php', 'PHPUnit\\PhpParser\\Builder\\Function_' => '/nikic-php-parser/PhpParser/Builder/Function_.php', 'PHPUnit\\PhpParser\\Builder\\Interface_' => '/nikic-php-parser/PhpParser/Builder/Interface_.php', @@ -1736,10 +1747,7 @@ foreach (['PHPUnit\\DeepCopy\\DeepCopy' => '/myclabs-deep-copy/DeepCopy/DeepCopy 'PHPUnit\\SebastianBergmann\\CliParser\\UnknownOptionException' => '/sebastian-cli-parser/exceptions/UnknownOptionException.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\BranchAndPathCoverageNotSupportedException' => '/php-code-coverage/Exception/BranchAndPathCoverageNotSupportedException.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\CodeCoverage' => '/php-code-coverage/CodeCoverage.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\CrapIndex' => '/php-code-coverage/CrapIndex.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\DeadCodeDetectionNotSupportedException' => '/php-code-coverage/Exception/DeadCodeDetectionNotSupportedException.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Directory' => '/php-code-coverage/Directory.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\DirectoryCouldNotBeCreatedException' => '/php-code-coverage/Exception/DirectoryCouldNotBeCreatedException.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Driver\\Driver' => '/php-code-coverage/Driver/Driver.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Driver\\PathExistsButIsNotDirectoryException' => '/php-code-coverage/Exception/PathExistsButIsNotDirectoryException.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Driver\\PcovDriver' => '/php-code-coverage/Driver/PcovDriver.php', @@ -1761,11 +1769,11 @@ foreach (['PHPUnit\\DeepCopy\\DeepCopy' => '/myclabs-deep-copy/DeepCopy/DeepCopy 'PHPUnit\\SebastianBergmann\\CodeCoverage\\NoCodeCoverageDriverWithPathCoverageSupportAvailableException' => '/php-code-coverage/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => '/php-code-coverage/Node/AbstractNode.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Node\\Builder' => '/php-code-coverage/Node/Builder.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Node\\CrapIndex' => '/php-code-coverage/Node/CrapIndex.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Node\\Directory' => '/php-code-coverage/Node/Directory.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Node\\File' => '/php-code-coverage/Node/File.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Node\\Iterator' => '/php-code-coverage/Node/Iterator.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\ParserException' => '/php-code-coverage/Exception/ParserException.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Percentage' => '/php-code-coverage/Percentage.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\ProcessedCodeCoverageData' => '/php-code-coverage/ProcessedCodeCoverageData.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\RawCodeCoverageData' => '/php-code-coverage/RawCodeCoverageData.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\ReflectionException' => '/php-code-coverage/Exception/ReflectionException.php', @@ -1794,19 +1802,18 @@ foreach (['PHPUnit\\DeepCopy\\DeepCopy' => '/myclabs-deep-copy/DeepCopy/DeepCopy 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => '/php-code-coverage/Report/Xml/Totals.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => '/php-code-coverage/Report/Xml/Unit.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysisCacheNotConfiguredException' => '/php-code-coverage/Exception/StaticAnalysisCacheNotConfiguredException.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\Cache' => '/php-code-coverage/StaticAnalysis/Cache.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CacheWarmer' => '/php-code-coverage/StaticAnalysis/CacheWarmer.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingCoveredFileAnalyser' => '/php-code-coverage/StaticAnalysis/CachingCoveredFileAnalyser.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingUncoveredFileAnalyser' => '/php-code-coverage/StaticAnalysis/CachingUncoveredFileAnalyser.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CachingFileAnalyser' => '/php-code-coverage/StaticAnalysis/CachingFileAnalyser.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CodeUnitFindingVisitor' => '/php-code-coverage/StaticAnalysis/CodeUnitFindingVisitor.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\CoveredFileAnalyser' => '/php-code-coverage/StaticAnalysis/CoveredFileAnalyser.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ExecutableLinesFindingVisitor' => '/php-code-coverage/StaticAnalysis/ExecutableLinesFindingVisitor.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\FileAnalyser' => '/php-code-coverage/StaticAnalysis/FileAnalyser.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\IgnoredLinesFindingVisitor' => '/php-code-coverage/StaticAnalysis/IgnoredLinesFindingVisitor.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingCoveredFileAnalyser' => '/php-code-coverage/StaticAnalysis/ParsingCoveredFileAnalyser.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingUncoveredFileAnalyser' => '/php-code-coverage/StaticAnalysis/ParsingUncoveredFileAnalyser.php', - 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\UncoveredFileAnalyser' => '/php-code-coverage/StaticAnalysis/UncoveredFileAnalyser.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\StaticAnalysis\\ParsingFileAnalyser' => '/php-code-coverage/StaticAnalysis/ParsingFileAnalyser.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\TestIdMissingException' => '/php-code-coverage/Exception/TestIdMissingException.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => '/php-code-coverage/Exception/UnintentionallyCoveredCodeException.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Util\\DirectoryCouldNotBeCreatedException' => '/php-code-coverage/Exception/DirectoryCouldNotBeCreatedException.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Util\\Filesystem' => '/php-code-coverage/Util/Filesystem.php', + 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Util\\Percentage' => '/php-code-coverage/Util/Percentage.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\Version' => '/php-code-coverage/Version.php', 'PHPUnit\\SebastianBergmann\\CodeCoverage\\XmlException' => '/php-code-coverage/Exception/XmlException.php', 'PHPUnit\\SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => '/sebastian-code-unit-reverse-lookup/Wizard.php', @@ -1910,26 +1917,28 @@ foreach (['PHPUnit\\DeepCopy\\DeepCopy' => '/myclabs-deep-copy/DeepCopy/DeepCopy 'PHPUnit\\SebastianBergmann\\Timer\\ResourceUsageFormatter' => '/php-timer/ResourceUsageFormatter.php', 'PHPUnit\\SebastianBergmann\\Timer\\TimeSinceStartOfRequestNotAvailableException' => '/php-timer/exceptions/TimeSinceStartOfRequestNotAvailableException.php', 'PHPUnit\\SebastianBergmann\\Timer\\Timer' => '/php-timer/Timer.php', - 'PHPUnit\\SebastianBergmann\\Type\\CallableType' => '/sebastian-type/CallableType.php', + 'PHPUnit\\SebastianBergmann\\Type\\CallableType' => '/sebastian-type/type/CallableType.php', 'PHPUnit\\SebastianBergmann\\Type\\Exception' => '/sebastian-type/exception/Exception.php', - 'PHPUnit\\SebastianBergmann\\Type\\FalseType' => '/sebastian-type/FalseType.php', - 'PHPUnit\\SebastianBergmann\\Type\\GenericObjectType' => '/sebastian-type/GenericObjectType.php', - 'PHPUnit\\SebastianBergmann\\Type\\IterableType' => '/sebastian-type/IterableType.php', - 'PHPUnit\\SebastianBergmann\\Type\\LogicException' => '/sebastian-type/exception/LogicException.php', - 'PHPUnit\\SebastianBergmann\\Type\\MixedType' => '/sebastian-type/MixedType.php', - 'PHPUnit\\SebastianBergmann\\Type\\NullType' => '/sebastian-type/NullType.php', - 'PHPUnit\\SebastianBergmann\\Type\\ObjectType' => '/sebastian-type/ObjectType.php', + 'PHPUnit\\SebastianBergmann\\Type\\FalseType' => '/sebastian-type/type/FalseType.php', + 'PHPUnit\\SebastianBergmann\\Type\\GenericObjectType' => '/sebastian-type/type/GenericObjectType.php', + 'PHPUnit\\SebastianBergmann\\Type\\IntersectionType' => '/sebastian-type/type/IntersectionType.php', + 'PHPUnit\\SebastianBergmann\\Type\\IterableType' => '/sebastian-type/type/IterableType.php', + 'PHPUnit\\SebastianBergmann\\Type\\MixedType' => '/sebastian-type/type/MixedType.php', + 'PHPUnit\\SebastianBergmann\\Type\\NeverType' => '/sebastian-type/type/NeverType.php', + 'PHPUnit\\SebastianBergmann\\Type\\NullType' => '/sebastian-type/type/NullType.php', + 'PHPUnit\\SebastianBergmann\\Type\\ObjectType' => '/sebastian-type/type/ObjectType.php', + 'PHPUnit\\SebastianBergmann\\Type\\Parameter' => '/sebastian-type/Parameter.php', 'PHPUnit\\SebastianBergmann\\Type\\ReflectionMapper' => '/sebastian-type/ReflectionMapper.php', 'PHPUnit\\SebastianBergmann\\Type\\RuntimeException' => '/sebastian-type/exception/RuntimeException.php', - 'PHPUnit\\SebastianBergmann\\Type\\SimpleType' => '/sebastian-type/SimpleType.php', - 'PHPUnit\\SebastianBergmann\\Type\\StaticType' => '/sebastian-type/StaticType.php', - 'PHPUnit\\SebastianBergmann\\Type\\Type' => '/sebastian-type/Type.php', + 'PHPUnit\\SebastianBergmann\\Type\\SimpleType' => '/sebastian-type/type/SimpleType.php', + 'PHPUnit\\SebastianBergmann\\Type\\StaticType' => '/sebastian-type/type/StaticType.php', + 'PHPUnit\\SebastianBergmann\\Type\\TrueType' => '/sebastian-type/type/TrueType.php', + 'PHPUnit\\SebastianBergmann\\Type\\Type' => '/sebastian-type/type/Type.php', 'PHPUnit\\SebastianBergmann\\Type\\TypeName' => '/sebastian-type/TypeName.php', - 'PHPUnit\\SebastianBergmann\\Type\\UnionType' => '/sebastian-type/UnionType.php', - 'PHPUnit\\SebastianBergmann\\Type\\UnknownType' => '/sebastian-type/UnknownType.php', - 'PHPUnit\\SebastianBergmann\\Type\\VoidType' => '/sebastian-type/VoidType.php', + 'PHPUnit\\SebastianBergmann\\Type\\UnionType' => '/sebastian-type/type/UnionType.php', + 'PHPUnit\\SebastianBergmann\\Type\\UnknownType' => '/sebastian-type/type/UnknownType.php', + 'PHPUnit\\SebastianBergmann\\Type\\VoidType' => '/sebastian-type/type/VoidType.php', 'PHPUnit\\SebastianBergmann\\Version' => '/sebastian-version/Version.php', - 'PHPUnit\\Symfony\\Polyfill\\Ctype\\Ctype' => '/symfony-polyfill-ctype/Ctype.php', 'PHPUnit\\TextUI\\CliArguments\\Builder' => '/phpunit/TextUI/CliArguments/Builder.php', 'PHPUnit\\TextUI\\CliArguments\\Configuration' => '/phpunit/TextUI/CliArguments/Configuration.php', 'PHPUnit\\TextUI\\CliArguments\\Exception' => '/phpunit/TextUI/CliArguments/Exception.php', @@ -2035,6 +2044,7 @@ foreach (['PHPUnit\\DeepCopy\\DeepCopy' => '/myclabs-deep-copy/DeepCopy/DeepCopy 'PHPUnit\\Util\\Annotation\\DocBlock' => '/phpunit/Util/Annotation/DocBlock.php', 'PHPUnit\\Util\\Annotation\\Registry' => '/phpunit/Util/Annotation/Registry.php', 'PHPUnit\\Util\\Blacklist' => '/phpunit/Util/Blacklist.php', + 'PHPUnit\\Util\\Cloner' => '/phpunit/Util/Cloner.php', 'PHPUnit\\Util\\Color' => '/phpunit/Util/Color.php', 'PHPUnit\\Util\\ErrorHandler' => '/phpunit/Util/ErrorHandler.php', 'PHPUnit\\Util\\Exception' => '/phpunit/Util/Exception.php', @@ -2051,6 +2061,7 @@ foreach (['PHPUnit\\DeepCopy\\DeepCopy' => '/myclabs-deep-copy/DeepCopy/DeepCopy 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => '/phpunit/Util/PHP/DefaultPhpProcess.php', 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => '/phpunit/Util/PHP/WindowsPhpProcess.php', 'PHPUnit\\Util\\Printer' => '/phpunit/Util/Printer.php', + 'PHPUnit\\Util\\Reflection' => '/phpunit/Util/Reflection.php', 'PHPUnit\\Util\\RegularExpression' => '/phpunit/Util/RegularExpression.php', 'PHPUnit\\Util\\Test' => '/phpunit/Util/Test.php', 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => '/phpunit/Util/TestDox/CliTestDoxPrinter.php', @@ -2130,10 +2141,15 @@ foreach (['PHPUnit\\DeepCopy\\DeepCopy' => '/myclabs-deep-copy/DeepCopy/DeepCopy 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\CallableString' => '/phpdocumentor-type-resolver/PseudoTypes/CallableString.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\False_' => '/phpdocumentor-type-resolver/PseudoTypes/False_.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\HtmlEscapedString' => '/phpdocumentor-type-resolver/PseudoTypes/HtmlEscapedString.php', + 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\IntegerRange' => '/phpdocumentor-type-resolver/PseudoTypes/IntegerRange.php', + 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\List_' => '/phpdocumentor-type-resolver/PseudoTypes/List_.php', + 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\LiteralString' => '/phpdocumentor-type-resolver/PseudoTypes/LiteralString.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\LowercaseString' => '/phpdocumentor-type-resolver/PseudoTypes/LowercaseString.php', + 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\NegativeInteger' => '/phpdocumentor-type-resolver/PseudoTypes/NegativeInteger.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyLowercaseString' => '/phpdocumentor-type-resolver/PseudoTypes/NonEmptyLowercaseString.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyString' => '/phpdocumentor-type-resolver/PseudoTypes/NonEmptyString.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\NumericString' => '/phpdocumentor-type-resolver/PseudoTypes/NumericString.php', + 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\Numeric_' => '/phpdocumentor-type-resolver/PseudoTypes/Numeric_.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\PositiveInteger' => '/phpdocumentor-type-resolver/PseudoTypes/PositiveInteger.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\TraitString' => '/phpdocumentor-type-resolver/PseudoTypes/TraitString.php', 'PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\True_' => '/phpdocumentor-type-resolver/PseudoTypes/True_.php', @@ -2264,7 +2280,7 @@ foreach (['PHPUnit\\DeepCopy\\DeepCopy' => '/myclabs-deep-copy/DeepCopy/DeepCopy 'Prophecy\\Prophet' => '/phpspec-prophecy/Prophecy/Prophet.php', 'Prophecy\\Util\\ExportUtil' => '/phpspec-prophecy/Prophecy/Util/ExportUtil.php', 'Prophecy\\Util\\StringUtil' => '/phpspec-prophecy/Prophecy/Util/StringUtil.php'] as $file) { - require_once 'phar://phpunit-9.5.10.phar' . $file; + require_once 'phar://phpunit-9.5.26.phar' . $file; } require __PHPUNIT_PHAR_ROOT__ . '/phpunit/Framework/Assert/Functions.php'; @@ -2276,48287 +2292,50049 @@ if ($execute) { exit; } + if (isset($printSbom)) { + print file_get_contents(__PHPUNIT_PHAR_ROOT__ . '/sbom.xml'); + + exit; + } + unset($execute); PHPUnit\TextUI\Command::main(); } __HALT_COMPILER(); ?> -gh—phpunit-9.5.10.pharwebmozart-assert/Assert.phpŸÈ ÒNaŸÈvA8X¤webmozart-assert/Mixin.php( ÒNa(G Zl¤webmozart-assert/LICENSE< ÒNa<tØ}õ¤-webmozart-assert/InvalidArgumentException.phpb ÒNabÙAþº¤)phpdocumentor-reflection-common/Fqsen.phpÅ ÒNaÅ—â¤?¤2phpdocumentor-reflection-common/ProjectFactory.php_ ÒNa_j÷\"¤(phpdocumentor-reflection-common/File.phpŸ ÒNaŸ°ˆI)¤,phpdocumentor-reflection-common/Location.php‘ ÒNa‘=­(œ¤+phpdocumentor-reflection-common/Project.php ÒNa¬¦J¤+phpdocumentor-reflection-common/Element.php  ÒNa %â¤'phpdocumentor-reflection-common/LICENSE9 ÒNa9*2Ȥphp-text-template/Template.php( ÒNa( Áä¤1php-text-template/exceptions/RuntimeException.phpµ ÒNaµYm'¤*php-text-template/exceptions/Exception.phpy ÒNayæn³µ¤9php-text-template/exceptions/InvalidArgumentException.php  ÒNa …aM¤php-text-template/LICENSE ÒNau¹¤.sebastian-object-reflector/ObjectReflector.phpÕ ÒNaÕ÷ÎƤ(sebastian-object-reflector/Exception.php ÒNaЬۤ7sebastian-object-reflector/InvalidArgumentException.php¢ ÒNa¢ -ÖâM¤php-invoker/Invoker.php  ÒNa “«O¤Dphp-invoker/exceptions/ProcessControlExtensionNotLoadedException.php· ÒNa· áí¤+php-invoker/exceptions/TimeoutException.phpž ÒNažö™.¢¤$php-invoker/exceptions/Exception.phpr ÒNarvvdu¤8phar-io-version/constraints/OrVersionConstraintGroup.php ÒNaM%¤1phar-io-version/constraints/VersionConstraint.phpö ÒNaöe¤Dq¤6phar-io-version/constraints/ExactVersionConstraint.php> ÒNa>t¿„Τ4phar-io-version/constraints/AnyVersionConstraint.phpR ÒNaR #²¤>phar-io-version/constraints/SpecificMajorVersionConstraint.php ÒNa`9q:¤Fphar-io-version/constraints/SpecificMajorAndMinorVersionConstraint.phpÉ ÒNaÉ©Éþ¤Ephar-io-version/constraints/GreaterThanOrEqualToVersionConstraint.php† ÒNa†²VU…¤9phar-io-version/constraints/AbstractVersionConstraint.php¾ ÒNa¾xB‘¤9phar-io-version/constraints/AndVersionConstraintGroup.phpæ ÒNaæªYí¤!phar-io-version/VersionNumber.php³ ÒNa³O£1¤+phar-io-version/VersionConstraintParser.php< ÒNa< Í®*Ò¤phar-io-version/Version.php ÒNa¿<&¯¤?phar-io-version/exceptions/InvalidPreReleaseSuffixException.php— ÒNa—…±Òµ¤Dphar-io-version/exceptions/UnsupportedVersionConstraintException.phpÛ ÒNaÛµˆ9ð¤(phar-io-version/exceptions/Exception.php¯ ÒNa¯$eœb¤:phar-io-version/exceptions/NoPreReleaseSuffixException.php’ ÒNa’ŽÜT4¤6phar-io-version/exceptions/InvalidVersionException.php ÒNa4/S¤$phar-io-version/PreReleaseSuffix.phpf ÒNaf#«Ñ¤phar-io-version/LICENSE1 ÒNa1>²»:¤*phar-io-version/VersionConstraintValue.phpH - ÒNaH -F{~4¤*sebastian-object-enumerator/Enumerator.php› ÒNa›÷x}ƒ¤)sebastian-object-enumerator/Exception.phpƒ ÒNaƒç}êȤ8sebastian-object-enumerator/InvalidArgumentException.php¤ ÒNa¤÷⤠phpunit.xsd F ÒNa F£uyå¤nikic-php-parser/LICENSEð ÒNað¥ä”*¤)nikic-php-parser/PhpParser/NodeDumper.phpd ÒNadY lˆ¤3nikic-php-parser/PhpParser/Internal/TokenStream.php%# ÒNa%# D–«¤0nikic-php-parser/PhpParser/Internal/DiffElem.php7 ÒNa7$À‡‹¤.nikic-php-parser/PhpParser/Internal/Differ.php- ÒNa-åõî^¤Anikic-php-parser/PhpParser/Internal/PrintableNewAnonClassNode.php$ ÒNa$'¬c¢¤4nikic-php-parser/PhpParser/PrettyPrinterAbstract.phpïÝ ÒNaïÝ ›‹Þ¤*nikic-php-parser/PhpParser/Comment/Doc.phpx ÒNaxpŠ¤0nikic-php-parser/PhpParser/Builder/Function_.phpF ÒNaFu‹x¤1nikic-php-parser/PhpParser/Builder/Interface_.phpÈ ÒNaÈ øà¤-nikic-php-parser/PhpParser/Builder/Method.php ÒNað”}¤-nikic-php-parser/PhpParser/Builder/Class_.phpñ ÒNañ ôª°¤-nikic-php-parser/PhpParser/Builder/Trait_.phpÖ ÒNaÖkj†¤3nikic-php-parser/PhpParser/Builder/FunctionLike.phpé ÒNaéZqe¤/nikic-php-parser/PhpParser/Builder/TraitUse.phpW ÒNaW³L@á¤2nikic-php-parser/PhpParser/Builder/Declaration.phpÝ ÒNaÝÕEÊ7¤,nikic-php-parser/PhpParser/Builder/Param.php ÒNa èƒÖ¤+nikic-php-parser/PhpParser/Builder/Use_.phpß ÒNaß·s¸°¤1nikic-php-parser/PhpParser/Builder/Namespace_.php: ÒNa:ˆp¤1nikic-php-parser/PhpParser/Builder/ClassConst.phpm ÒNam ðz˜¤/nikic-php-parser/PhpParser/Builder/Property.php| ÒNa|O ì¤9nikic-php-parser/PhpParser/Builder/TraitUseAdaptation.phpŠ ÒNaŠUVx®¤$nikic-php-parser/PhpParser/Error.php¸ ÒNa¸ªQZ¤7nikic-php-parser/PhpParser/NodeVisitor/NameResolver.phpm& ÒNam&f[&¤Bnikic-php-parser/PhpParser/NodeVisitor/ParentConnectingVisitor.phpu ÒNauME¨¤9nikic-php-parser/PhpParser/NodeVisitor/CloningVisitor.php ÒNa"WJ¤9nikic-php-parser/PhpParser/NodeVisitor/FindingVisitor.php„ ÒNa„¨òB ¤>nikic-php-parser/PhpParser/NodeVisitor/FirstFindingVisitor.phpü ÒNaüm4”Ť@nikic-php-parser/PhpParser/NodeVisitor/NodeConnectingVisitor.phpŒ ÒNaŒ†u -ä,nikic-php-parser/PhpParser/ParserFactory.phpè ÒNaè -~&¤1nikic-php-parser/PhpParser/ConstExprEvaluator.phpÞ$ ÒNaÞ$¹.( ¤Hnikic-php-parser/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php¡ ÒNa¡*Ä#ò¤Dnikic-php-parser/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php« ÒNa«’LF„¤Lnikic-php-parser/PhpParser/Lexer/TokenEmulator/CoaleseEqualTokenEmulator.php  ÒNa *§o¤@nikic-php-parser/PhpParser/Lexer/TokenEmulator/TokenEmulator.phpu ÒNauD4h²¤Dnikic-php-parser/PhpParser/Lexer/TokenEmulator/AttributeEmulator.phpç ÒNaçrà†—¤Bnikic-php-parser/PhpParser/Lexer/TokenEmulator/ReverseEmulator.phpè ÒNaèI¯Ö}¤Bnikic-php-parser/PhpParser/Lexer/TokenEmulator/FnTokenEmulator.php­ ÒNa­jµ¤Hnikic-php-parser/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php¿ ÒNa¿0åk¤Enikic-php-parser/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php¶ ÒNa¶›cŠ/¤Lnikic-php-parser/PhpParser/Lexer/TokenEmulator/FlexibleDocStringEmulator.phpn ÒNan 1‡¤Rnikic-php-parser/PhpParser/Lexer/TokenEmulator/NumericLiteralSeparatorEmulator.phpV ÒNaVÒþê¤Bnikic-php-parser/PhpParser/Lexer/TokenEmulator/KeywordEmulator.phpÎ ÒNaÎ —¡þ¤Hnikic-php-parser/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.phpÓ ÒNaÓ:&E—¤.nikic-php-parser/PhpParser/Lexer/Emulative.phpÄ" ÒNaÄ"A ‘‹¤*nikic-php-parser/PhpParser/NameContext.phpï% ÒNaï%G-á¤&nikic-php-parser/PhpParser/Comment.php´ ÒNa´A¤-nikic-php-parser/PhpParser/ParserAbstract.phpŠ˜ ÒNaŠ˜®Á¤;nikic-php-parser/PhpParser/ConstExprEvaluationException.php_ ÒNa_ÞIÌ ¤2nikic-php-parser/PhpParser/NodeVisitorAbstract.phpÌ ÒNa̧½Ä¤-nikic-php-parser/PhpParser/BuilderFactory.phpè( ÒNaè(ÆçÀ¤5nikic-php-parser/PhpParser/NodeTraverserInterface.php| ÒNa|Åš À¤&nikic-php-parser/PhpParser/Builder.phpÔ ÒNaÔ©·6¤4nikic-php-parser/PhpParser/ErrorHandler/Throwing.php† ÒNa†–S}<¤6nikic-php-parser/PhpParser/ErrorHandler/Collecting.php” ÒNa”¶&ØȤ)nikic-php-parser/PhpParser/NodeFinder.php· ÒNa· †À¤#nikic-php-parser/PhpParser/Node.php€ ÒNa€yÝ—´¤-nikic-php-parser/PhpParser/BuilderHelpers.php_# ÒNa_#,”1¤5nikic-php-parser/PhpParser/PrettyPrinter/Standard.phpx¢ ÒNax¢Lu®ó¤+nikic-php-parser/PhpParser/ErrorHandler.php/ ÒNa/#Òä\¤-nikic-php-parser/PhpParser/Node/Attribute.phpH ÒNaHÂhqK¤5nikic-php-parser/PhpParser/Node/VarLikeIdentifier.php ÒNa‰»&œ¤'nikic-php-parser/PhpParser/Node/Arg.php0 ÒNa0q ¥H¤-nikic-php-parser/PhpParser/Node/UnionType.php• ÒNa•jViΤ/nikic-php-parser/PhpParser/Node/ComplexType.phpS ÒNaSî(‰·¤0nikic-php-parser/PhpParser/Node/FunctionLike.phpý ÒNaý·4üͤ5nikic-php-parser/PhpParser/Node/Stmt/HaltCompiler.php ÒNa]–;¤/nikic-php-parser/PhpParser/Node/Stmt/Break_.phpÊ ÒNaÊçßÖ¤,nikic-php-parser/PhpParser/Node/Stmt/If_.php: ÒNa:¬uÙ¤/nikic-php-parser/PhpParser/Node/Stmt/While_.phpE ÒNaEÕ¡´¹¤2nikic-php-parser/PhpParser/Node/Stmt/Function_.php - ÒNa -®¶ç̤0nikic-php-parser/PhpParser/Node/Stmt/ElseIf_.phpI ÒNaI›EÐä3nikic-php-parser/PhpParser/Node/Stmt/Interface_.phpæ ÒNaæŽL/Ǥ/nikic-php-parser/PhpParser/Node/Stmt/Class_.phpA ÒNaA™ÚO¤1nikic-php-parser/PhpParser/Node/Stmt/GroupUse.php - ÒNa -ߎ0|¤/nikic-php-parser/PhpParser/Node/Stmt/Throw_.php® ÒNa®ÕȤ2nikic-php-parser/PhpParser/Node/Stmt/Continue_.phpÙ ÒNaÙﶤ.nikic-php-parser/PhpParser/Node/Stmt/Else_.php§ ÒNa§’|ŸÃ¤/nikic-php-parser/PhpParser/Node/Stmt/Trait_.php ÒNa÷“$v¤/nikic-php-parser/PhpParser/Node/Stmt/Unset_.php° ÒNa°=o¨B¤.nikic-php-parser/PhpParser/Node/Stmt/Echo_.php¤ ÒNa¤͘œÆ¤.nikic-php-parser/PhpParser/Node/Stmt/Label.phpê ÒNaê®°Ó¤,nikic-php-parser/PhpParser/Node/Stmt/Do_.phpB ÒNaB -@¤7nikic-php-parser/PhpParser/Node/Stmt/DeclareDeclare.php– ÒNa–äÆ€›¤1nikic-php-parser/PhpParser/Node/Stmt/Finally_.php¯ ÒNa¯ö1·A¤Anikic-php-parser/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.phpA ÒNaA°d¤Fnikic-php-parser/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.phpZ ÒNaZP¦Ö¤0nikic-php-parser/PhpParser/Node/Stmt/Switch_.php5 ÒNa5FF¦Y¤1nikic-php-parser/PhpParser/Node/Stmt/TraitUse.php— ÒNa—gž,Š¤3nikic-php-parser/PhpParser/Node/Stmt/InlineHTML.phpž ÒNaž]þ¤2nikic-php-parser/PhpParser/Node/Stmt/ClassLike.php ÒNa øò¤.nikic-php-parser/PhpParser/Node/Stmt/Goto_.php ÒNaVyPn¤0nikic-php-parser/PhpParser/Node/Stmt/Return_.php¶ ÒNa¶Í¿)e¤1nikic-php-parser/PhpParser/Node/Stmt/Declare_.php† ÒNa†.. -¤2nikic-php-parser/PhpParser/Node/Stmt/StaticVar.php— ÒNa—½àã¤.nikic-php-parser/PhpParser/Node/Stmt/Case_.phpl ÒNalÆìÙu¤/nikic-php-parser/PhpParser/Node/Stmt/Const_.phpÊ ÒNaʳÁ¦æ¤,nikic-php-parser/PhpParser/Node/Stmt/Nop.php@ ÒNa@G즤0nikic-php-parser/PhpParser/Node/Stmt/Static_.phpÅ ÒNaÅÈà‹¤1nikic-php-parser/PhpParser/Node/Stmt/TryCatch.php$ ÒNa$—WÑì¤1nikic-php-parser/PhpParser/Node/Stmt/EnumCase.php³ ÒNa³jDˆ¢¤1nikic-php-parser/PhpParser/Node/Stmt/Foreach_.phpo ÒNao9õ¢¤/nikic-php-parser/PhpParser/Node/Stmt/UseUse.phpd ÒNadbŠ‰­¤.nikic-php-parser/PhpParser/Node/Stmt/Enum_.php= ÒNa=œdA¤3nikic-php-parser/PhpParser/Node/Stmt/Expression.phpâ ÒNaâÂRK¤4nikic-php-parser/PhpParser/Node/Stmt/ClassMethod.phpË ÒNaË((Æ -¤/nikic-php-parser/PhpParser/Node/Stmt/Catch_.php| ÒNa|*V>¤0nikic-php-parser/PhpParser/Node/Stmt/Global_.php¸ ÒNa¸Ùͤ9nikic-php-parser/PhpParser/Node/Stmt/PropertyProperty.phpÝ ÒNaÝ·Ò‰ñ¤-nikic-php-parser/PhpParser/Node/Stmt/For_.php> ÒNa>N¤æQ¤-nikic-php-parser/PhpParser/Node/Stmt/Use_.phpl ÒNalù9=|¤3nikic-php-parser/PhpParser/Node/Stmt/Namespace_.php¿ ÒNa¿ÿã¹€¤3nikic-php-parser/PhpParser/Node/Stmt/ClassConst.phpº ÒNaºeX?ͤ1nikic-php-parser/PhpParser/Node/Stmt/Property.phpO - ÒNaO -™¿³=¤;nikic-php-parser/PhpParser/Node/Stmt/TraitUseAdaptation.php ÒNaa8‚¤>nikic-php-parser/PhpParser/Node/Expr/NullsafePropertyFetch.phpñ ÒNañ º/N¤2nikic-php-parser/PhpParser/Node/Expr/ArrayItem.phpx ÒNax| ¡2¤/nikic-php-parser/PhpParser/Node/Expr/PreDec.php‹ ÒNa‹tÀg¤-nikic-php-parser/PhpParser/Node/Expr/Cast.phpA ÒNaAÎ:Vs¤/nikic-php-parser/PhpParser/Node/Expr/Clone_.php‹ ÒNa‹„©W¤2nikic-php-parser/PhpParser/Node/Expr/UnaryPlus.php¤ ÒNa¤e»‹Ì¤1nikic-php-parser/PhpParser/Node/Expr/AssignOp.phpã ÒNaãš,¸¶¤1nikic-php-parser/PhpParser/Node/Expr/CallLike.php& ÒNa&ŽKS0¤/nikic-php-parser/PhpParser/Node/Expr/Throw_.php¨ ÒNa¨ †?Á¤/nikic-php-parser/PhpParser/Node/Expr/Yield_.php\ ÒNa\‚Áµ ¤/nikic-php-parser/PhpParser/Node/Expr/Match_.phpª ÒNaª–WÇ ¤/nikic-php-parser/PhpParser/Node/Expr/Print_.phpŽ ÒNaŽnX¤1nikic-php-parser/PhpParser/Node/Expr/Variable.php• ÒNa•mJÃr¤.nikic-php-parser/PhpParser/Node/Expr/Error.php ÒNaœa\¤0nikic-php-parser/PhpParser/Node/Expr/PostDec.phpŽ ÒNaŽ‚w´:¤.nikic-php-parser/PhpParser/Node/Expr/Eval_.php‹ ÒNa‹3ó56¤-nikic-php-parser/PhpParser/Node/Expr/New_.php‹ ÒNa‹ÅÜiĤ6nikic-php-parser/PhpParser/Node/Expr/ArrowFunction.php ÒNa ëK¤5nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Mul.phpB ÒNaB|ô¯¤;nikic-php-parser/PhpParser/Node/Expr/BinaryOp/BooleanOr.phpO ÒNaOŸeÓ¸¤9nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Smaller.phpJ ÒNaJ€f‡¤<nikic-php-parser/PhpParser/Node/Expr/BinaryOp/LogicalXor.phpR ÒNaR4˜e¤5nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Pow.phpC ÒNaC’Æð¤;nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Identical.phpP ÒNaP"§¤;nikic-php-parser/PhpParser/Node/Expr/BinaryOp/BitwiseOr.phpN ÒNaNÕ_|±¤7nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Equal.phpG ÒNaGÝ™³Ê¤;nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Spaceship.phpP ÒNaPHƉ.¤6nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Plus.phpD ÒNaD' ,¤@nikic-php-parser/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.phpY ÒNaYæÕâ¤<nikic-php-parser/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.phpP ÒNaP6LÂ6¤<nikic-php-parser/PhpParser/Node/Expr/BinaryOp/BitwiseXor.phpP ÒNaP~ÝƤ;nikic-php-parser/PhpParser/Node/Expr/BinaryOp/LogicalOr.phpO ÒNaO@½ßò¤<nikic-php-parser/PhpParser/Node/Expr/BinaryOp/BooleanAnd.phpQ ÒNaQù5v¤<nikic-php-parser/PhpParser/Node/Expr/BinaryOp/LogicalAnd.phpR ÒNaRi«Š¬¤9nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Greater.phpJ ÒNaJ4í—ͤ5nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Div.phpB ÒNaBiåÁ‘¤<nikic-php-parser/PhpParser/Node/Expr/BinaryOp/ShiftRight.phpQ ÒNaQ„¬Ǥ:nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Coalesce.phpM ÒNaMYì ‡¤;nikic-php-parser/PhpParser/Node/Expr/BinaryOp/ShiftLeft.phpO ÒNaOõÈQ#¤5nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Mod.phpB ÒNaB”Þʤ:nikic-php-parser/PhpParser/Node/Expr/BinaryOp/NotEqual.phpM ÒNaMᦤ7nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Minus.phpF ÒNaFØ$Lˤ>nikic-php-parser/PhpParser/Node/Expr/BinaryOp/NotIdentical.phpV ÒNaV“h< -¤@nikic-php-parser/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.phpY ÒNaY^…ز¤8nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Concat.phpH ÒNaH @q¤0nikic-php-parser/PhpParser/Node/Expr/PostInc.phpŽ ÒNaŽᦦ!¤0nikic-php-parser/PhpParser/Node/Expr/Ternary.phpî ÒNaîQ³åͤ;nikic-php-parser/PhpParser/Node/Expr/NullsafeMethodCall.php¨ ÒNa¨Yî,l¤6nikic-php-parser/PhpParser/Node/Expr/PropertyFetch.php× ÒNa×ɾŠ¤4nikic-php-parser/PhpParser/Node/Expr/Instanceof_.phpa ÒNaa<± œ¤/nikic-php-parser/PhpParser/Node/Expr/Empty_.phpŽ ÒNaŽÉ'‡‹¤6nikic-php-parser/PhpParser/Node/Expr/ArrayDimFetch.phpM ÒNaMIÊY¤8nikic-php-parser/PhpParser/Node/Expr/ClassConstFetch.phpô ÒNaôÖØ÷¤3nikic-php-parser/PhpParser/Node/Expr/ConstFetch.phpÁ ÒNaÁÞ¶%þ¤3nikic-php-parser/PhpParser/Node/Expr/StaticCall.phpe ÒNaeîפ1nikic-php-parser/PhpParser/Node/Expr/FuncCall.php3 ÒNa3ö%Aõ¤.nikic-php-parser/PhpParser/Node/Expr/List_.phpæ ÒNaæ™þå¤/nikic-php-parser/PhpParser/Node/Expr/Isset_.php ÒNaI‹¤5nikic-php-parser/PhpParser/Node/Expr/AssignOp/Mul.phpò ÒNaòÏ€/¤5nikic-php-parser/PhpParser/Node/Expr/AssignOp/Pow.phpò ÒNaòžy“V¤;nikic-php-parser/PhpParser/Node/Expr/AssignOp/BitwiseOr.phpþ ÒNaþ‡Ø;¤6nikic-php-parser/PhpParser/Node/Expr/AssignOp/Plus.phpô ÒNaô&|<nikic-php-parser/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php ÒNaõ†­u¤<nikic-php-parser/PhpParser/Node/Expr/AssignOp/BitwiseXor.php ÒNalÞÏš¤5nikic-php-parser/PhpParser/Node/Expr/AssignOp/Div.phpò ÒNaòùYP -¤<nikic-php-parser/PhpParser/Node/Expr/AssignOp/ShiftRight.php ÒNas¸*†¤:nikic-php-parser/PhpParser/Node/Expr/AssignOp/Coalesce.phpü ÒNaüïq,¤;nikic-php-parser/PhpParser/Node/Expr/AssignOp/ShiftLeft.phpþ ÒNaþÞÛˆ¤5nikic-php-parser/PhpParser/Node/Expr/AssignOp/Mod.phpò ÒNaò]10Y¤7nikic-php-parser/PhpParser/Node/Expr/AssignOp/Minus.phpö ÒNaöÂð隤8nikic-php-parser/PhpParser/Node/Expr/AssignOp/Concat.phpø ÒNaø†³¾¤6nikic-php-parser/PhpParser/Node/Expr/ErrorSuppress.php¤ ÒNa¤Úg”å¤3nikic-php-parser/PhpParser/Node/Expr/BooleanNot.php§ ÒNa§DíæC¤/nikic-php-parser/PhpParser/Node/Expr/Array_.php8 ÒNa8í;±p¤3nikic-php-parser/PhpParser/Node/Expr/UnaryMinus.phpš ÒNašl›ÔA¤0nikic-php-parser/PhpParser/Node/Expr/Closure.php¤ - ÒNa¤ -U;¤4nikic-php-parser/PhpParser/Node/Expr/Cast/Double.php› ÒNa›ˆ>,„¤4nikic-php-parser/PhpParser/Node/Expr/Cast/Unset_.phpç ÒNaç1ÂîÓ¤2nikic-php-parser/PhpParser/Node/Expr/Cast/Int_.phpã ÒNaãá§c¤5nikic-php-parser/PhpParser/Node/Expr/Cast/String_.phpé ÒNaéó…°¤3nikic-php-parser/PhpParser/Node/Expr/Cast/Bool_.phpå ÒNaå V]S¤4nikic-php-parser/PhpParser/Node/Expr/Cast/Array_.phpç ÒNaçI|–¤5nikic-php-parser/PhpParser/Node/Expr/Cast/Object_.phpé ÒNaéþ˜æá¤/nikic-php-parser/PhpParser/Node/Expr/PreInc.php‹ ÒNa‹Yä/nikic-php-parser/PhpParser/Node/Expr/Assign.php ÒNa󆈤1nikic-php-parser/PhpParser/Node/Expr/BinaryOp.phpo ÒNao „åѤ2nikic-php-parser/PhpParser/Node/Expr/YieldFrom.php¨ ÒNa¨µw8³¤<nikic-php-parser/PhpParser/Node/Expr/StaticPropertyFetch.php& ÒNa&ÙÜ€¤2nikic-php-parser/PhpParser/Node/Expr/AssignRef.phpH ÒNaHE`ob¤3nikic-php-parser/PhpParser/Node/Expr/MethodCall.phpO ÒNaO·DWX¤3nikic-php-parser/PhpParser/Node/Expr/BitwiseNot.phpš ÒNaš~'›ÿ¤3nikic-php-parser/PhpParser/Node/Expr/ClosureUse.php‡ ÒNa‡ö¦¹h¤2nikic-php-parser/PhpParser/Node/Expr/ShellExec.php¿ ÒNa¿™hóy¤.nikic-php-parser/PhpParser/Node/Expr/Exit_.php ÒNa©•ù¤1nikic-php-parser/PhpParser/Node/Expr/Include_.php¢ ÒNa¢‘i„¤0nikic-php-parser/PhpParser/Node/NullableType.php× ÒNa×Ä6C¤5nikic-php-parser/PhpParser/Node/Scalar/MagicConst.phpc ÒNac,ãxG¤=nikic-php-parser/PhpParser/Node/Scalar/EncapsedStringPart.phpæ ÒNaæ%‡¤2nikic-php-parser/PhpParser/Node/Scalar/LNumber.phpŠ ÒNaŠ v6훤2nikic-php-parser/PhpParser/Node/Scalar/String_.phpR ÒNaR¾Ëؽ¤?nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Function_.php] ÒNa]HnY¤<nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Method.phpV ÒNaV·Τ<nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Class_.phpT ÒNaT㨘X¤9nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Dir.phpM ÒNaM±aïl¤<nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Trait_.phpT ÒNaT‹d¤:nikic-php-parser/PhpParser/Node/Scalar/MagicConst/File.phpP ÒNaP#Íä¤:nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Line.phpP ÒNaPM4û¤@nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Namespace_.php` ÒNa`>£Š¤3nikic-php-parser/PhpParser/Node/Scalar/Encapsed.phpÙ ÒNaÙRU¼¤2nikic-php-parser/PhpParser/Node/Scalar/DNumber.phpQ ÒNaQ_ÞÉ ¤7nikic-php-parser/PhpParser/Node/VariadicPlaceholder.phpš ÒNašŽPñ¤(nikic-php-parser/PhpParser/Node/Name.php ÒNa-òÉg¤2nikic-php-parser/PhpParser/Node/AttributeGroup.php© ÒNa©B9ÅÁ¤*nikic-php-parser/PhpParser/Node/Const_.phpî ÒNaîyþh¤1nikic-php-parser/PhpParser/Node/Name/Relative.php½ ÒNa½Ç›Ef¤7nikic-php-parser/PhpParser/Node/Name/FullyQualified.phpÀ ÒNaÀ ¤.nikic-php-parser/PhpParser/Node/Identifier.phpí ÒNaíáJa¤*nikic-php-parser/PhpParser/Node/Scalar.phpk ÒNakô,ߤ(nikic-php-parser/PhpParser/Node/Expr.php• ÒNa•hÊ傤(nikic-php-parser/PhpParser/Node/Stmt.php• ÒNa•¿v2/¤)nikic-php-parser/PhpParser/Node/Param.phpb ÒNabM®ºß¤,nikic-php-parser/PhpParser/Node/MatchArm.php® ÒNa®¢+m6¤4nikic-php-parser/PhpParser/Node/IntersectionType.phpÏ ÒNaÏäo¤,nikic-php-parser/PhpParser/NodeTraverser.php]' ÒNa]'TG:Ƥ%nikic-php-parser/PhpParser/Parser.php} ÒNa}²ñü{¤*nikic-php-parser/PhpParser/NodeVisitor.phpð ÒNað½ÜÍ3¤*nikic-php-parser/PhpParser/JsonDecoder.php ÒNa Ùxg¤+nikic-php-parser/PhpParser/NodeAbstract.phpZ ÒNaZ×»Ì@¤$nikic-php-parser/PhpParser/Lexer.phpuZ ÒNauZ~½gê¤*nikic-php-parser/PhpParser/Parser/Php7.php™A ÒNa™A­ó¤,nikic-php-parser/PhpParser/Parser/Tokens.php& ÒNa&<£ìþ¤.nikic-php-parser/PhpParser/Parser/Multiple.php¦ ÒNa¦sF)7¤*nikic-php-parser/PhpParser/Parser/Php5.php÷* ÒNa÷* ’[Q¤php-timer/Timer.phpˆ ÒNaˆc²Aɤ$php-timer/ResourceUsageFormatter.php¨ ÒNa¨PÚ¾¤php-timer/Duration.php - ÒNa -tX÷y¤/php-timer/exceptions/NoActiveTimerException.phpœ ÒNaœüólÙ¤Ephp-timer/exceptions/TimeSinceStartOfRequestNotAvailableException.php¶ ÒNa¶´$bž¤"php-timer/exceptions/Exception.phpn ÒNan«iuÛ¤php-timer/LICENSE ÒNax™¸œ¤#sebastian-global-state/Snapshot.phpî) ÒNaî)ñªñ¤'sebastian-global-state/CodeExporter.php— ÒNa— j!²Õ¤#sebastian-global-state/Restorer.php› ÒNa›G‡J ¤6sebastian-global-state/exceptions/RuntimeException.php ÒNa;¤/sebastian-global-state/exceptions/Exception.phpy ÒNayùJ¡¤sebastian-global-state/LICENSE ÒNaûô½¤&sebastian-global-state/ExcludeList.php· - ÒNa· -RÕ{˜¤:myclabs-deep-copy/DeepCopy/Matcher/PropertyNameMatcher.phpþ ÒNaþŒR×÷¤6myclabs-deep-copy/DeepCopy/Matcher/PropertyMatcher.php¶ ÒNa¶=ŽBv¤.myclabs-deep-copy/DeepCopy/Matcher/Matcher.phpÝ ÒNaݺ§³ê¤Dmyclabs-deep-copy/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php† ÒNa†äåŠP¤:myclabs-deep-copy/DeepCopy/Matcher/PropertyTypeMatcher.php2 ÒNa2ZÁQͤ:myclabs-deep-copy/DeepCopy/Exception/PropertyException.php ÒNa3Gzœ¤7myclabs-deep-copy/DeepCopy/Exception/CloneException.php† ÒNa† {¿Ë¤(myclabs-deep-copy/DeepCopy/deep_copy.phpŸ ÒNaŸrÞx¤3myclabs-deep-copy/DeepCopy/Filter/ReplaceFilter.php ÒNa±ž¤3myclabs-deep-copy/DeepCopy/Filter/SetNullFilter.phpñ ÒNañØ䊉¤0myclabs-deep-copy/DeepCopy/Filter/KeepFilter.php ÒNa¶Ynž¤,myclabs-deep-copy/DeepCopy/Filter/Filter.phpd ÒNad³Mð¤Gmyclabs-deep-copy/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php - ÒNa -²Dg¤Lmyclabs-deep-copy/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.phpà ÒNaà)$ð¤Bmyclabs-deep-copy/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php¢ ÒNa¢)ë¢ÿ¤6myclabs-deep-copy/DeepCopy/TypeMatcher/TypeMatcher.phpÝ ÒNaÝ„QBŤ7myclabs-deep-copy/DeepCopy/TypeFilter/ReplaceFilter.php ÒNaŒz†—¤4myclabs-deep-copy/DeepCopy/TypeFilter/TypeFilter.phpÊ ÒNaÊ’VDº¤?myclabs-deep-copy/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.phpä ÒNaä^—ú¤Amyclabs-deep-copy/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php¸ ÒNa¸Ôîv|¤Gmyclabs-deep-copy/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php ÒNaT¿Ø+¤;myclabs-deep-copy/DeepCopy/TypeFilter/ShallowCopyFilter.phpç ÒNaç‚ëõؤAmyclabs-deep-copy/DeepCopy/TypeFilter/Date/DateIntervalFilter.php‹ ÒNa‹¯ÃƤ:myclabs-deep-copy/DeepCopy/Reflection/ReflectionHelper.php5 ÒNa5Ù‰«¤'myclabs-deep-copy/DeepCopy/DeepCopy.phpÁ ÒNaÁwv˾¤myclabs-deep-copy/LICENSE5 ÒNa5Ê­Ë„¤sebastian-type/UnknownType.php- ÒNa-åÞ}Y¤$sebastian-type/GenericObjectType.php¨ ÒNa¨+M¤sebastian-type/UnionType.phpO ÒNaO »ŸE¨¤sebastian-type/MixedType.php£ ÒNa£„ -HK¤sebastian-type/CallableType.php4 ÒNa4/p®«¤sebastian-type/VoidType.phpQ ÒNaQ“úü¤sebastian-type/NullType.php< ÒNa<°4´¤sebastian-type/ObjectType.php× ÒNa×Å‚…œ¤sebastian-type/SimpleType.php  ÒNa íŤsebastian-type/TypeName.php~ ÒNa~ h=Úx¤sebastian-type/StaticType.php@ ÒNa@›Æ`þ¤sebastian-type/FalseType.php° ÒNa°mÈZé¤#sebastian-type/ReflectionMapper.phpÙ ÒNaÙ )R ¤sebastian-type/IterableType.php” ÒNa”+Þó¦¤sebastian-type/Type.phpé ÒNaé ·[¹œ¤sebastian-type/LICENSE  ÒNa  +Τ-sebastian-type/exception/RuntimeException.php ÒNaùŠò%¤+sebastian-type/exception/LogicException.php} ÒNa}/§[H¤&sebastian-type/exception/Exception.phpj ÒNajbᮧ¤sebastian-version/Version.php® ÒNa® ƪ¤sebastian-version/LICENSE ÒNa­ZÌù¤schema/8.5.xsd™B ÒNa™Bè´…ª¤schema/9.2.xsdÕB ÒNaÕB„|l¤Aphpdocumentor-reflection-docblock/DocBlock/StandardTagFactory.phpì0 ÒNaì0‹¢<¤9phpdocumentor-reflection-docblock/DocBlock/Serializer.php ÒNaºËiB¤9phpdocumentor-reflection-docblock/DocBlock/TagFactory.php† ÒNa†JMx¤7phpdocumentor-reflection-docblock/DocBlock/Tags/See.php ÒNa ÿ -¶¤;phpdocumentor-reflection-docblock/DocBlock/Tags/Generic.phpx ÒNax Bðån¤>phpdocumentor-reflection-docblock/DocBlock/Tags/InvalidTag.php& ÒNa&,­ül¤:phpdocumentor-reflection-docblock/DocBlock/Tags/Source.phpH ÒNaH Q%΋¤:phpdocumentor-reflection-docblock/DocBlock/Tags/Method.php¹ ÒNa¹BD7¤=phpdocumentor-reflection-docblock/DocBlock/Tags/Formatter.php ÒNað}BܤAphpdocumentor-reflection-docblock/DocBlock/Tags/Reference/Url.phpÍ ÒNaÍc[]î¤Cphpdocumentor-reflection-docblock/DocBlock/Tags/Reference/Fqsen.php, ÒNa,%8¤Gphpdocumentor-reflection-docblock/DocBlock/Tags/Reference/Reference.phpÔ ÒNaÔª ¢¤;phpdocumentor-reflection-docblock/DocBlock/Tags/BaseTag.phpŒ ÒNaŒÖÌZr¤:phpdocumentor-reflection-docblock/DocBlock/Tags/Author.phpÅ ÒNaÅ LÅût¤9phpdocumentor-reflection-docblock/DocBlock/Tags/Since.phpW - ÒNaW -1>Íó¤Rphpdocumentor-reflection-docblock/DocBlock/Tags/Formatter/PassthroughFormatter.php¹ ÒNa¹PæŸ~¤Lphpdocumentor-reflection-docblock/DocBlock/Tags/Formatter/AlignFormatter.phpq ÒNaqÀ¯­ë¤@phpdocumentor-reflection-docblock/DocBlock/Tags/PropertyRead.phpÚ ÒNaÚ äQ'H¤?phpdocumentor-reflection-docblock/DocBlock/Tags/TagWithType.php¨ ÒNa¨;u•¤Hphpdocumentor-reflection-docblock/DocBlock/Tags/Factory/StaticMethod.php ÒNa.ý·Í¤Aphpdocumentor-reflection-docblock/DocBlock/Tags/PropertyWrite.phpØ ÒNaØ ‘½}¿¤;phpdocumentor-reflection-docblock/DocBlock/Tags/Version.php¬ - ÒNa¬ -@S³±¤>phpdocumentor-reflection-docblock/DocBlock/Tags/Deprecated.phpë - ÒNaë -}CœO¤8phpdocumentor-reflection-docblock/DocBlock/Tags/Link.phpŒ ÒNaŒ¿¤8phpdocumentor-reflection-docblock/DocBlock/Tags/Var_.phpà ÒNaà oÇÔ¤;phpdocumentor-reflection-docblock/DocBlock/Tags/Return_.php% ÒNa%5’ä:phpdocumentor-reflection-docblock/DocBlock/Tags/Covers.phpg - ÒNag -w8«¤;phpdocumentor-reflection-docblock/DocBlock/Tags/Example.phpè ÒNaèUV¤b¤9phpdocumentor-reflection-docblock/DocBlock/Tags/Param.php ÒNaÈW€¤8phpdocumentor-reflection-docblock/DocBlock/Tags/Uses.php> - ÒNa> +jphpunit-9.5.26.pharLdoctrine-instantiator/Doctrine/Instantiator/Exception/ExceptionInterface.phpÇp[cÇŒµb¤Rdoctrine-instantiator/Doctrine/Instantiator/Exception/InvalidArgumentException.php™p[c™ªú¯¤Rdoctrine-instantiator/Doctrine/Instantiator/Exception/UnexpectedValueException.php:p[c:_Y%[¤<doctrine-instantiator/Doctrine/Instantiator/Instantiator.php†p[c†²ˆ5¹¤Edoctrine-instantiator/Doctrine/Instantiator/InstantiatorInterface.php p[c LŒȤdoctrine-instantiator/LICENSE$p[c$ +Í‚å¤ manifest.txtÎp[cαŒÂ¤'myclabs-deep-copy/DeepCopy/DeepCopy.php>p[c>¼Ê¼Y¤7myclabs-deep-copy/DeepCopy/Exception/CloneException.php†p[c† {¿Ë¤:myclabs-deep-copy/DeepCopy/Exception/PropertyException.phpp[c3Gzœ¤Gmyclabs-deep-copy/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php +p[c +²Dg¤Lmyclabs-deep-copy/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.phpàp[cà)$ð¤Bmyclabs-deep-copy/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php¢p[c¢)ë¢ÿ¤,myclabs-deep-copy/DeepCopy/Filter/Filter.phpdp[cd³Mð¤0myclabs-deep-copy/DeepCopy/Filter/KeepFilter.phpp[c¶Ynž¤3myclabs-deep-copy/DeepCopy/Filter/ReplaceFilter.phpp[c±ž¤3myclabs-deep-copy/DeepCopy/Filter/SetNullFilter.phpñp[cñØ䊉¤Dmyclabs-deep-copy/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.phpp[cpr°¤.myclabs-deep-copy/DeepCopy/Matcher/Matcher.phpÝp[cݺ§³ê¤6myclabs-deep-copy/DeepCopy/Matcher/PropertyMatcher.php¶p[c¶=ŽBv¤:myclabs-deep-copy/DeepCopy/Matcher/PropertyNameMatcher.phpþp[cþŒR×÷¤:myclabs-deep-copy/DeepCopy/Matcher/PropertyTypeMatcher.php2p[c2ZÁQͤ:myclabs-deep-copy/DeepCopy/Reflection/ReflectionHelper.php5p[c5Ù‰«¤Amyclabs-deep-copy/DeepCopy/TypeFilter/Date/DateIntervalFilter.php‹p[c‹¯ÃƤ7myclabs-deep-copy/DeepCopy/TypeFilter/ReplaceFilter.phpp[cŒz†—¤;myclabs-deep-copy/DeepCopy/TypeFilter/ShallowCopyFilter.phpçp[cç‚ëõؤ?myclabs-deep-copy/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.phpäp[cä^—ú¤Amyclabs-deep-copy/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php¸p[c¸Ôîv|¤Gmyclabs-deep-copy/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.phpp[cT¿Ø+¤4myclabs-deep-copy/DeepCopy/TypeFilter/TypeFilter.phpÊp[cÊ’VDº¤6myclabs-deep-copy/DeepCopy/TypeMatcher/TypeMatcher.phpÝp[cÝ„QBŤ(myclabs-deep-copy/DeepCopy/deep_copy.phpŸp[cŸrÞx¤myclabs-deep-copy/LICENSE5p[c5Ê­Ë„¤nikic-php-parser/LICENSEðp[cð¥ä”*¤&nikic-php-parser/PhpParser/Builder.phpÔp[cÔ©·6¤1nikic-php-parser/PhpParser/Builder/ClassConst.phpm p[cm ðz˜¤-nikic-php-parser/PhpParser/Builder/Class_.php§p[c§c3­‹¤2nikic-php-parser/PhpParser/Builder/Declaration.phpÝp[cÝÕEÊ7¤/nikic-php-parser/PhpParser/Builder/EnumCase.php^p[c^šçɤ,nikic-php-parser/PhpParser/Builder/Enum_.phpŒ p[cŒ ¸‰#±¤3nikic-php-parser/PhpParser/Builder/FunctionLike.phpép[céZqe¤0nikic-php-parser/PhpParser/Builder/Function_.phpFp[cFu‹x¤1nikic-php-parser/PhpParser/Builder/Interface_.phpÈ p[cÈ øà¤-nikic-php-parser/PhpParser/Builder/Method.phpp[cð”}¤1nikic-php-parser/PhpParser/Builder/Namespace_.php:p[c:ˆp¤,nikic-php-parser/PhpParser/Builder/Param.php p[c èƒÖ¤/nikic-php-parser/PhpParser/Builder/Property.php|p[c|O ì¤/nikic-php-parser/PhpParser/Builder/TraitUse.phpWp[cW³L@á¤9nikic-php-parser/PhpParser/Builder/TraitUseAdaptation.phpŠp[cŠUVx®¤-nikic-php-parser/PhpParser/Builder/Trait_.phpÖp[cÖkj†¤+nikic-php-parser/PhpParser/Builder/Use_.phpßp[cß·s¸°¤-nikic-php-parser/PhpParser/BuilderFactory.php+p[c+òÞ¶¤-nikic-php-parser/PhpParser/BuilderHelpers.phpÎ$p[cÎ$·Ó6N¤&nikic-php-parser/PhpParser/Comment.php´p[c´A¤*nikic-php-parser/PhpParser/Comment/Doc.phpxp[cxpŠ¤;nikic-php-parser/PhpParser/ConstExprEvaluationException.php_p[c_ÞIÌ ¤1nikic-php-parser/PhpParser/ConstExprEvaluator.phpl%p[cl%evÄQ¤$nikic-php-parser/PhpParser/Error.php¸p[c¸ªQZ¤+nikic-php-parser/PhpParser/ErrorHandler.php/p[c/#Òä\¤6nikic-php-parser/PhpParser/ErrorHandler/Collecting.php”p[c”¶&ØȤ4nikic-php-parser/PhpParser/ErrorHandler/Throwing.php†p[c†–S}<¤0nikic-php-parser/PhpParser/Internal/DiffElem.php7p[c7$À‡‹¤.nikic-php-parser/PhpParser/Internal/Differ.php-p[c-åõî^¤Anikic-php-parser/PhpParser/Internal/PrintableNewAnonClassNode.php$p[c$'¬c¢¤3nikic-php-parser/PhpParser/Internal/TokenStream.php%#p[c%# D–«¤*nikic-php-parser/PhpParser/JsonDecoder.php p[c Ùxg¤$nikic-php-parser/PhpParser/Lexer.php›Zp[c›ZÆSnikic-php-parser/PhpParser/Node/Expr/BinaryOp/NotIdentical.phpVp[cV“h< +¤6nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Plus.phpDp[cD' ,¤5nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Pow.phpCp[cC’Æð¤;nikic-php-parser/PhpParser/Node/Expr/BinaryOp/ShiftLeft.phpOp[cOõÈQ#¤<nikic-php-parser/PhpParser/Node/Expr/BinaryOp/ShiftRight.phpQp[cQ„¬Ǥ9nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Smaller.phpJp[cJ€f‡¤@nikic-php-parser/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.phpYp[cYæÕâ¤;nikic-php-parser/PhpParser/Node/Expr/BinaryOp/Spaceship.phpPp[cPHƉ.¤3nikic-php-parser/PhpParser/Node/Expr/BitwiseNot.phpšp[cš~'›ÿ¤3nikic-php-parser/PhpParser/Node/Expr/BooleanNot.php§p[c§DíæC¤1nikic-php-parser/PhpParser/Node/Expr/CallLike.php&p[c&ŽKS0¤-nikic-php-parser/PhpParser/Node/Expr/Cast.phpAp[cAÎ:Vs¤4nikic-php-parser/PhpParser/Node/Expr/Cast/Array_.phpçp[cçI|–¤3nikic-php-parser/PhpParser/Node/Expr/Cast/Bool_.phpåp[cå V]S¤4nikic-php-parser/PhpParser/Node/Expr/Cast/Double.php›p[c›ˆ>,„¤2nikic-php-parser/PhpParser/Node/Expr/Cast/Int_.phpãp[cãá§c¤5nikic-php-parser/PhpParser/Node/Expr/Cast/Object_.phpép[céþ˜æá¤5nikic-php-parser/PhpParser/Node/Expr/Cast/String_.phpép[céó…°¤4nikic-php-parser/PhpParser/Node/Expr/Cast/Unset_.phpçp[cç1ÂîÓ¤8nikic-php-parser/PhpParser/Node/Expr/ClassConstFetch.phpôp[côÖØ÷¤/nikic-php-parser/PhpParser/Node/Expr/Clone_.php‹p[c‹„©W¤0nikic-php-parser/PhpParser/Node/Expr/Closure.php¤ +p[c¤ +U;¤3nikic-php-parser/PhpParser/Node/Expr/ClosureUse.php‡p[c‡ö¦¹h¤3nikic-php-parser/PhpParser/Node/Expr/ConstFetch.phpÁp[cÁÞ¶%þ¤/nikic-php-parser/PhpParser/Node/Expr/Empty_.phpŽp[cŽÉ'‡‹¤.nikic-php-parser/PhpParser/Node/Expr/Error.phpp[cœa\¤6nikic-php-parser/PhpParser/Node/Expr/ErrorSuppress.php¤p[c¤Úg”å¤.nikic-php-parser/PhpParser/Node/Expr/Eval_.php‹p[c‹3ó56¤.nikic-php-parser/PhpParser/Node/Expr/Exit_.phpp[c©•ù¤1nikic-php-parser/PhpParser/Node/Expr/FuncCall.php3p[c3ö%Aõ¤1nikic-php-parser/PhpParser/Node/Expr/Include_.php¢p[c¢‘i„¤4nikic-php-parser/PhpParser/Node/Expr/Instanceof_.phpap[ca<± œ¤/nikic-php-parser/PhpParser/Node/Expr/Isset_.phpp[cI‹¤.nikic-php-parser/PhpParser/Node/Expr/List_.phpæp[cæ™þå¤/nikic-php-parser/PhpParser/Node/Expr/Match_.phpªp[cª–WÇ ¤3nikic-php-parser/PhpParser/Node/Expr/MethodCall.phpOp[cO·DWX¤-nikic-php-parser/PhpParser/Node/Expr/New_.php‹p[c‹ÅÜiĤ;nikic-php-parser/PhpParser/Node/Expr/NullsafeMethodCall.phpfp[cføɤ>nikic-php-parser/PhpParser/Node/Expr/NullsafePropertyFetch.phpñp[cñ º/N¤0nikic-php-parser/PhpParser/Node/Expr/PostDec.phpŽp[cŽ‚w´:¤0nikic-php-parser/PhpParser/Node/Expr/PostInc.phpŽp[cŽᦦ!¤/nikic-php-parser/PhpParser/Node/Expr/PreDec.php‹p[c‹tÀg¤/nikic-php-parser/PhpParser/Node/Expr/PreInc.php‹p[c‹Yä/nikic-php-parser/PhpParser/Node/Expr/Print_.phpŽp[cŽnX¤6nikic-php-parser/PhpParser/Node/Expr/PropertyFetch.php×p[c×ɾŠ¤2nikic-php-parser/PhpParser/Node/Expr/ShellExec.php¿p[c¿™hóy¤3nikic-php-parser/PhpParser/Node/Expr/StaticCall.phpep[ceîפ<nikic-php-parser/PhpParser/Node/Expr/StaticPropertyFetch.php&p[c&ÙÜ€¤0nikic-php-parser/PhpParser/Node/Expr/Ternary.phpîp[cîQ³åͤ/nikic-php-parser/PhpParser/Node/Expr/Throw_.php¨p[c¨ †?Á¤3nikic-php-parser/PhpParser/Node/Expr/UnaryMinus.phpšp[cšl›ÔA¤2nikic-php-parser/PhpParser/Node/Expr/UnaryPlus.php¤p[c¤e»‹Ì¤1nikic-php-parser/PhpParser/Node/Expr/Variable.php•p[c•mJÃr¤2nikic-php-parser/PhpParser/Node/Expr/YieldFrom.php¨p[c¨µw8³¤/nikic-php-parser/PhpParser/Node/Expr/Yield_.php\p[c\‚Áµ ¤0nikic-php-parser/PhpParser/Node/FunctionLike.phpýp[cý·4üͤ.nikic-php-parser/PhpParser/Node/Identifier.phpíp[cíáJa¤4nikic-php-parser/PhpParser/Node/IntersectionType.phpÏp[cÏäo¤,nikic-php-parser/PhpParser/Node/MatchArm.php®p[c®¢+m6¤(nikic-php-parser/PhpParser/Node/Name.php p[c Qé…¯¤7nikic-php-parser/PhpParser/Node/Name/FullyQualified.phpÀp[cÀ ¤1nikic-php-parser/PhpParser/Node/Name/Relative.php½p[c½Ç›Ef¤0nikic-php-parser/PhpParser/Node/NullableType.php×p[c×Ä6C¤)nikic-php-parser/PhpParser/Node/Param.phpbp[cbM®ºß¤*nikic-php-parser/PhpParser/Node/Scalar.phpkp[ckô,ߤ2nikic-php-parser/PhpParser/Node/Scalar/DNumber.phpap[cakõ·¤3nikic-php-parser/PhpParser/Node/Scalar/Encapsed.phpÙp[cÙRU¼¤=nikic-php-parser/PhpParser/Node/Scalar/EncapsedStringPart.phpæp[cæ%‡¤2nikic-php-parser/PhpParser/Node/Scalar/LNumber.php² p[c² äŸzð¤5nikic-php-parser/PhpParser/Node/Scalar/MagicConst.phpcp[cc,ãxG¤<nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Class_.phpTp[cT㨘X¤9nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Dir.phpMp[cM±aïl¤:nikic-php-parser/PhpParser/Node/Scalar/MagicConst/File.phpPp[cP#Íä¤?nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Function_.php]p[c]HnY¤:nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Line.phpPp[cPM4û¤<nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Method.phpVp[cV·Τ@nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Namespace_.php`p[c`>£Š¤<nikic-php-parser/PhpParser/Node/Scalar/MagicConst/Trait_.phpTp[cT‹d¤2nikic-php-parser/PhpParser/Node/Scalar/String_.phpqp[cqT$œQ¤(nikic-php-parser/PhpParser/Node/Stmt.php•p[c•¿v2/¤/nikic-php-parser/PhpParser/Node/Stmt/Break_.phpÊp[cÊçßÖ¤.nikic-php-parser/PhpParser/Node/Stmt/Case_.phplp[clÆìÙu¤/nikic-php-parser/PhpParser/Node/Stmt/Catch_.php|p[c|*V>¤3nikic-php-parser/PhpParser/Node/Stmt/ClassConst.phpºp[cºeX?ͤ2nikic-php-parser/PhpParser/Node/Stmt/ClassLike.phpœ p[cœ ‘–Ó0¤4nikic-php-parser/PhpParser/Node/Stmt/ClassMethod.phpýp[cýÒXÀñ¤/nikic-php-parser/PhpParser/Node/Stmt/Class_.phpup[cu_­Ä¼¤/nikic-php-parser/PhpParser/Node/Stmt/Const_.phpÊp[cʳÁ¦æ¤2nikic-php-parser/PhpParser/Node/Stmt/Continue_.phpÙp[cÙﶤ7nikic-php-parser/PhpParser/Node/Stmt/DeclareDeclare.php–p[c–äÆ€›¤1nikic-php-parser/PhpParser/Node/Stmt/Declare_.php†p[c†.. +¤,nikic-php-parser/PhpParser/Node/Stmt/Do_.phpBp[cB +@¤.nikic-php-parser/PhpParser/Node/Stmt/Echo_.php¤p[c¤͘œÆ¤0nikic-php-parser/PhpParser/Node/Stmt/ElseIf_.phpIp[cI›EÐä.nikic-php-parser/PhpParser/Node/Stmt/Else_.php§p[c§’|ŸÃ¤1nikic-php-parser/PhpParser/Node/Stmt/EnumCase.php³p[c³jDˆ¢¤.nikic-php-parser/PhpParser/Node/Stmt/Enum_.php=p[c=œdA¤3nikic-php-parser/PhpParser/Node/Stmt/Expression.phpâp[câÂRK¤1nikic-php-parser/PhpParser/Node/Stmt/Finally_.php¯p[c¯ö1·A¤-nikic-php-parser/PhpParser/Node/Stmt/For_.php>p[c>N¤æQ¤1nikic-php-parser/PhpParser/Node/Stmt/Foreach_.phpop[co9õ¢¤2nikic-php-parser/PhpParser/Node/Stmt/Function_.php, +p[c, +ãn«L¤0nikic-php-parser/PhpParser/Node/Stmt/Global_.php¸p[c¸Ùͤ.nikic-php-parser/PhpParser/Node/Stmt/Goto_.phpp[cVyPn¤1nikic-php-parser/PhpParser/Node/Stmt/GroupUse.php +p[c +ߎ0|¤5nikic-php-parser/PhpParser/Node/Stmt/HaltCompiler.phpp[c]–;¤,nikic-php-parser/PhpParser/Node/Stmt/If_.php:p[c:¬uÙ¤3nikic-php-parser/PhpParser/Node/Stmt/InlineHTML.phpžp[cž]þ¤3nikic-php-parser/PhpParser/Node/Stmt/Interface_.phpæp[cæŽL/Ǥ.nikic-php-parser/PhpParser/Node/Stmt/Label.phpêp[cê®°Ó¤3nikic-php-parser/PhpParser/Node/Stmt/Namespace_.php¿p[c¿ÿã¹€¤,nikic-php-parser/PhpParser/Node/Stmt/Nop.php@p[c@G즤1nikic-php-parser/PhpParser/Node/Stmt/Property.phpO +p[cO +™¿³=¤9nikic-php-parser/PhpParser/Node/Stmt/PropertyProperty.phpÝp[cÝ·Ò‰ñ¤0nikic-php-parser/PhpParser/Node/Stmt/Return_.php¶p[c¶Í¿)e¤2nikic-php-parser/PhpParser/Node/Stmt/StaticVar.php—p[c—½àã¤0nikic-php-parser/PhpParser/Node/Stmt/Static_.phpÅp[cÅÈà‹¤0nikic-php-parser/PhpParser/Node/Stmt/Switch_.php5p[c5FF¦Y¤/nikic-php-parser/PhpParser/Node/Stmt/Throw_.php®p[c®ÕȤ1nikic-php-parser/PhpParser/Node/Stmt/TraitUse.php—p[c—gž,Š¤;nikic-php-parser/PhpParser/Node/Stmt/TraitUseAdaptation.phpp[ca8‚¤Anikic-php-parser/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.phpAp[cA°d¤Fnikic-php-parser/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.phpZp[cZP¦Ö¤/nikic-php-parser/PhpParser/Node/Stmt/Trait_.phpp[c÷“$v¤1nikic-php-parser/PhpParser/Node/Stmt/TryCatch.php$p[c$—WÑì¤/nikic-php-parser/PhpParser/Node/Stmt/Unset_.php°p[c°=o¨B¤/nikic-php-parser/PhpParser/Node/Stmt/UseUse.phpdp[cdbŠ‰­¤-nikic-php-parser/PhpParser/Node/Stmt/Use_.phplp[clù9=|¤/nikic-php-parser/PhpParser/Node/Stmt/While_.phpEp[cEÕ¡´¹¤-nikic-php-parser/PhpParser/Node/UnionType.php¦p[c¦^º·m¤5nikic-php-parser/PhpParser/Node/VarLikeIdentifier.phpp[c‰»&œ¤7nikic-php-parser/PhpParser/Node/VariadicPlaceholder.phpšp[cšŽPñ¤+nikic-php-parser/PhpParser/NodeAbstract.phpZp[cZ×»Ì@¤)nikic-php-parser/PhpParser/NodeDumper.phpdp[cdY lˆ¤)nikic-php-parser/PhpParser/NodeFinder.php· p[c· †À¤,nikic-php-parser/PhpParser/NodeTraverser.php]'p[c]'TG:Ƥ5nikic-php-parser/PhpParser/NodeTraverserInterface.php|p[c|Åš À¤*nikic-php-parser/PhpParser/NodeVisitor.phpðp[cð½ÜÍ3¤9nikic-php-parser/PhpParser/NodeVisitor/CloningVisitor.phpp[c"WJ¤9nikic-php-parser/PhpParser/NodeVisitor/FindingVisitor.php„p[c„¨òB ¤>nikic-php-parser/PhpParser/NodeVisitor/FirstFindingVisitor.phpüp[cüm4”Ť7nikic-php-parser/PhpParser/NodeVisitor/NameResolver.phpm&p[cm&f[&¤@nikic-php-parser/PhpParser/NodeVisitor/NodeConnectingVisitor.phpŒp[cŒ†u +äBnikic-php-parser/PhpParser/NodeVisitor/ParentConnectingVisitor.phpup[cuME¨¤2nikic-php-parser/PhpParser/NodeVisitorAbstract.phpÌp[ç½Ä¤%nikic-php-parser/PhpParser/Parser.php}p[c}²ñü{¤.nikic-php-parser/PhpParser/Parser/Multiple.php¦p[c¦sF)7¤*nikic-php-parser/PhpParser/Parser/Php5.php*(p[c*(2“l=¤*nikic-php-parser/PhpParser/Parser/Php7.phpSHp[cSHt5Ô5¤,nikic-php-parser/PhpParser/Parser/Tokens.php&p[c&<£ìþ¤-nikic-php-parser/PhpParser/ParserAbstract.phpÀ™p[cÀ™6û­(¤,nikic-php-parser/PhpParser/ParserFactory.phpèp[cè +~&¤5nikic-php-parser/PhpParser/PrettyPrinter/Standard.php†£p[c†£'ƒó¤4nikic-php-parser/PhpParser/PrettyPrinterAbstract.phpzàp[czà>«¢(¤object-enumerator/LICENSEp[c×y{¤object-reflector/LICENSEp[c¢9v¤phar-io-manifest/LICENSE`p[c`÷þp¤+phar-io-manifest/ManifestDocumentMapper.phpp[c÷Ç:Á¤#phar-io-manifest/ManifestLoader.phpËp[cË.ü-a¤'phar-io-manifest/ManifestSerializer.php¬p[c¬šróp¤:phar-io-manifest/exceptions/ElementCollectionException.phpÔp[cÔÙ ßI¤)phar-io-manifest/exceptions/Exception.php£p[c£¢„ü¤?phar-io-manifest/exceptions/InvalidApplicationNameException.phpýp[cý:@Ä>¤5phar-io-manifest/exceptions/InvalidEmailException.phpÏp[cÏ<»·†¤3phar-io-manifest/exceptions/InvalidUrlException.phpÍp[cÍ£ ¤9phar-io-manifest/exceptions/ManifestDocumentException.php˜p[c˜!P4¶¤@phar-io-manifest/exceptions/ManifestDocumentLoadingException.phpHp[cHǃ·ê¤?phar-io-manifest/exceptions/ManifestDocumentMapperException.phpžp[cž’:9z¤8phar-io-manifest/exceptions/ManifestElementException.php—p[c—“ÂA4¤7phar-io-manifest/exceptions/ManifestLoaderException.phpp[cDªØ>¤'phar-io-manifest/values/Application.phpèp[cèI$Û¤+phar-io-manifest/values/ApplicationName.php;p[c;D»ö¤"phar-io-manifest/values/Author.phpp[cÑÌFì¤,phar-io-manifest/values/AuthorCollection.phpžp[cž”o¤4phar-io-manifest/values/AuthorCollectionIterator.php3p[c3ÑŸƒé¤,phar-io-manifest/values/BundledComponent.php@p[c@öDP`¤6phar-io-manifest/values/BundledComponentCollection.php p[c ¾W6¤>phar-io-manifest/values/BundledComponentCollectionIterator.php¡p[c¡‰Vh¤0phar-io-manifest/values/CopyrightInformation.phpPp[cP aºi¤!phar-io-manifest/values/Email.phpNp[cNZÀ&½¤%phar-io-manifest/values/Extension.php p[c ŽÛq}¤#phar-io-manifest/values/Library.phpàp[càÇÀO¤#phar-io-manifest/values/License.phpïp[cï¥&!o¤$phar-io-manifest/values/Manifest.php +p[c +=La¡¤3phar-io-manifest/values/PhpExtensionRequirement.php›p[c›¹1¤1phar-io-manifest/values/PhpVersionRequirement.phpp[cm¨?¤'phar-io-manifest/values/Requirement.php’p[c’¯÷d÷¤1phar-io-manifest/values/RequirementCollection.phpßp[cßÕì¤P¤9phar-io-manifest/values/RequirementCollectionIterator.phpjp[cjÜ­:’¤ phar-io-manifest/values/Type.php´p[c´ðÕ=%¤phar-io-manifest/values/Url.php…p[c…¬æÍš¤&phar-io-manifest/xml/AuthorElement.phprp[cr¡<¤0phar-io-manifest/xml/AuthorElementCollection.php,p[c,ð¥-­¤'phar-io-manifest/xml/BundlesElement.phpSp[cSúWN>¤)phar-io-manifest/xml/ComponentElement.phpyp[cyæ·ìݤ3phar-io-manifest/xml/ComponentElementCollection.php5p[c5(†Á\¤(phar-io-manifest/xml/ContainsElement.phpnp[cnfÇü¤)phar-io-manifest/xml/CopyrightElement.phpÓp[cÓ—·7¤*phar-io-manifest/xml/ElementCollection.phpp[c@¨ é¤#phar-io-manifest/xml/ExtElement.php p[c y>¾¤-phar-io-manifest/xml/ExtElementCollection.php#p[c#E¼Éí¤)phar-io-manifest/xml/ExtensionElement.php}p[c}0¢ý¤'phar-io-manifest/xml/LicenseElement.phpop[co%Ã:'¤)phar-io-manifest/xml/ManifestDocument.php + p[c + ›ª4º¤(phar-io-manifest/xml/ManifestElement.php4p[c4ãó¤#phar-io-manifest/xml/PhpElement.phpp[c“B:5¤(phar-io-manifest/xml/RequiresElement.php$p[c$>¶¦¤!phar-io-version/BuildMetaData.phpáp[cáê¤phar-io-version/LICENSE&p[c&Òª ¤$phar-io-version/PreReleaseSuffix.phpp[cò:¼¤phar-io-version/Version.phpp[c¥u#¤+phar-io-version/VersionConstraintParser.phpT p[cT ¯¬Ð¤*phar-io-version/VersionConstraintValue.phpH +p[cH +F{~4¤!phar-io-version/VersionNumber.php³p[c³O£1¤9phar-io-version/constraints/AbstractVersionConstraint.php¾p[c¾xB‘¤9phar-io-version/constraints/AndVersionConstraintGroup.phpæp[cæªYí¤4phar-io-version/constraints/AnyVersionConstraint.phpRp[cR #²¤6phar-io-version/constraints/ExactVersionConstraint.phpÓp[cÓý¢!¤Ephar-io-version/constraints/GreaterThanOrEqualToVersionConstraint.php†p[c†²VU…¤8phar-io-version/constraints/OrVersionConstraintGroup.phpp[cM%¤Fphar-io-version/constraints/SpecificMajorAndMinorVersionConstraint.phpÉp[cÉ©Éþ¤>phar-io-version/constraints/SpecificMajorVersionConstraint.phpp[c`9q:¤1phar-io-version/constraints/VersionConstraint.phpöp[cöe¤Dq¤(phar-io-version/exceptions/Exception.php¯p[c¯$eœb¤?phar-io-version/exceptions/InvalidPreReleaseSuffixException.php—p[c—…±Òµ¤6phar-io-version/exceptions/InvalidVersionException.phpp[c4/S¤7phar-io-version/exceptions/NoBuildMetaDataException.phpp[c]Š¤:phar-io-version/exceptions/NoPreReleaseSuffixException.php’p[c’ŽÜT4¤Dphar-io-version/exceptions/UnsupportedVersionConstraintException.phpÛp[cÛµˆ9ð¤"php-code-coverage/CodeCoverage.php©Bp[c©B½ž“w¤#php-code-coverage/Driver/Driver.php¡p[c¡3ËA•¤'php-code-coverage/Driver/PcovDriver.phpJp[cJÂ÷ø¤)php-code-coverage/Driver/PhpdbgDriver.php^ +p[c^ +_¿2G¤%php-code-coverage/Driver/Selector.php p[c ó6¦]¤*php-code-coverage/Driver/Xdebug2Driver.phpA p[cA ûŠÝ¤*php-code-coverage/Driver/Xdebug3Driver.php p[c åh*¤Jphp-code-coverage/Exception/BranchAndPathCoverageNotSupportedException.phpÃp[cóÀ77¤Fphp-code-coverage/Exception/DeadCodeDetectionNotSupportedException.php¿p[c¿÷ý›¤Cphp-code-coverage/Exception/DirectoryCouldNotBeCreatedException.php÷p[c÷ë·ï‹¤)php-code-coverage/Exception/Exception.php}p[c}íz¤™¤8php-code-coverage/Exception/InvalidArgumentException.php¤p[c¤ñK.n¤Fphp-code-coverage/Exception/NoCodeCoverageDriverAvailableException.php/p[c/6§R¤]php-code-coverage/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.phpap[ca"A£¤/php-code-coverage/Exception/ParserException.php¨p[c¨, /ô¤Dphp-code-coverage/Exception/PathExistsButIsNotDirectoryException.phpp[cô.2¤9php-code-coverage/Exception/PcovNotAvailableException.phpap[caj®¤;php-code-coverage/Exception/PhpdbgNotAvailableException.php`p[c`ðˆ›¤3php-code-coverage/Exception/ReflectionException.php¬p[c¬Ýäk)¤?php-code-coverage/Exception/ReportAlreadyFinalizedException.php:p[c:d%6¤Iphp-code-coverage/Exception/StaticAnalysisCacheNotConfiguredException.phpÂp[c»ïÍ}¤6php-code-coverage/Exception/TestIdMissingException.phpp[c‰ +Þÿ¤Cphp-code-coverage/Exception/UnintentionallyCoveredCodeException.php+p[c+Q_ª¤=php-code-coverage/Exception/WriteOperationFailedException.phpˆp[cˆù¹(e¤;php-code-coverage/Exception/WrongXdebugVersionException.phpñp[cñ³ ºÈ¤:php-code-coverage/Exception/Xdebug2NotEnabledException.phpfp[cf†®,'¤:php-code-coverage/Exception/Xdebug3NotEnabledException.phpyp[cy<ÿ>¤;php-code-coverage/Exception/XdebugNotAvailableException.phpep[ceN·‰G¤,php-code-coverage/Exception/XmlException.php¥p[c¥W–ƒÜ¤php-code-coverage/Filter.phpê p[cê Í4¤php-code-coverage/LICENSEp[c?€i¤'php-code-coverage/Node/AbstractNode.php:p[c:%›^‘¤"php-code-coverage/Node/Builder.php p[c Õ2N¤$php-code-coverage/Node/CrapIndex.phpîp[cî# é¤$php-code-coverage/Node/Directory.php +&p[c +&™}ç¤php-code-coverage/Node/File.php’Kp[c’K˜{ê¤#php-code-coverage/Node/Iterator.phpp[cH˜k¤/php-code-coverage/ProcessedCodeCoverageData.php$p[c$äŽ'¤)php-code-coverage/RawCodeCoverageData.phpÝp[cÝ—ç>}¤#php-code-coverage/Report/Clover.phpú'p[cú'òlá4¤&php-code-coverage/Report/Cobertura.phpã0p[cã0êȆ̤#php-code-coverage/Report/Crap4j.phpßp[cßJÅ#D¤(php-code-coverage/Report/Html/Facade.php"p[c"ù;ŸÚ¤*php-code-coverage/Report/Html/Renderer.phpU!p[cU!åž}¤4php-code-coverage/Report/Html/Renderer/Dashboard.phpC p[cC €LÅ+¤4php-code-coverage/Report/Html/Renderer/Directory.php p[c §Ù(¤/php-code-coverage/Report/Html/Renderer/File.phpÕŒp[cÕŒ=Ž¯E¤Bphp-code-coverage/Report/Html/Renderer/Template/branches.html.distôp[côh2+¤Fphp-code-coverage/Report/Html/Renderer/Template/coverage_bar.html.dist'p[c'õO}¤Mphp-code-coverage/Report/Html/Renderer/Template/coverage_bar_branch.html.dist'p[c'õO}¤Ephp-code-coverage/Report/Html/Renderer/Template/css/bootstrap.min.cssáxp[cáxvX²¤>php-code-coverage/Report/Html/Renderer/Template/css/custom.cssp[c¤Aphp-code-coverage/Report/Html/Renderer/Template/css/nv.d3.min.cssX%p[cX%0,¤@php-code-coverage/Report/Html/Renderer/Template/css/octicons.cssXp[cX'#ï¤=php-code-coverage/Report/Html/Renderer/Template/css/style.css­p[c­Y– ¤Cphp-code-coverage/Report/Html/Renderer/Template/dashboard.html.distGp[cGäÄl¤Jphp-code-coverage/Report/Html/Renderer/Template/dashboard_branch.html.distGp[cGäÄl¤Cphp-code-coverage/Report/Html/Renderer/Template/directory.html.distÌp[cÌGÉM³¤Jphp-code-coverage/Report/Html/Renderer/Template/directory_branch.html.distjp[cj¡HØâ¤Hphp-code-coverage/Report/Html/Renderer/Template/directory_item.html.distAp[cAds¤Ophp-code-coverage/Report/Html/Renderer/Template/directory_item_branch.html.dist;p[c;ªm½Û¤>php-code-coverage/Report/Html/Renderer/Template/file.html.distîp[cîGd=r¤Ephp-code-coverage/Report/Html/Renderer/Template/file_branch.html.dist‹ p[c‹ göõ¤Cphp-code-coverage/Report/Html/Renderer/Template/file_item.html.distrp[créð/y¤Jphp-code-coverage/Report/Html/Renderer/Template/file_item_branch.html.distlp[cl¡-°÷¤Cphp-code-coverage/Report/Html/Renderer/Template/icons/file-code.svg0p[c0ÙQUU¤Hphp-code-coverage/Report/Html/Renderer/Template/icons/file-directory.svgêp[cêýÚZÿ¤Cphp-code-coverage/Report/Html/Renderer/Template/js/bootstrap.min.jsèóp[cèóQÀU<¤<php-code-coverage/Report/Html/Renderer/Template/js/d3.min.js­Pp[c­PÅhéb¤:php-code-coverage/Report/Html/Renderer/Template/js/file.jsùp[cùb䆤@php-code-coverage/Report/Html/Renderer/Template/js/jquery.min.js]p[c]Æ2]¤?php-code-coverage/Report/Html/Renderer/Template/js/nv.d3.min.jsÚRp[cÚRphp-code-coverage/Report/Html/Renderer/Template/line.html.distÅp[cÅãç­{¤?php-code-coverage/Report/Html/Renderer/Template/lines.html.distep[cedf ¤Ephp-code-coverage/Report/Html/Renderer/Template/method_item.html.dist«p[c«‹jפLphp-code-coverage/Report/Html/Renderer/Template/method_item_branch.html.dist¥p[c¥yÄŽk¤?php-code-coverage/Report/Html/Renderer/Template/paths.html.distòp[còã*'ݤ php-code-coverage/Report/PHP.php²p[c²$&aë¤!php-code-coverage/Report/Text.phpå'p[cå' 6H¤1php-code-coverage/Report/Xml/BuildInformation.phpç p[cç T3›e¤)php-code-coverage/Report/Xml/Coverage.php+p[c+Ô9ùE¤*php-code-coverage/Report/Xml/Directory.phpép[céAfà¤'php-code-coverage/Report/Xml/Facade.php"p[c"O}¤%php-code-coverage/Report/Xml/File.php+p[c+g׃¤'php-code-coverage/Report/Xml/Method.phpWp[cW »Ê¤%php-code-coverage/Report/Xml/Node.php3p[c3¹šª¤(php-code-coverage/Report/Xml/Project.phpfp[cfP›e¤'php-code-coverage/Report/Xml/Report.php p[c ¦HC¤'php-code-coverage/Report/Xml/Source.phpzp[cz'Â1Š¤&php-code-coverage/Report/Xml/Tests.php®p[c®•äÊò¤'php-code-coverage/Report/Xml/Totals.phpp[có:6í¤%php-code-coverage/Report/Xml/Unit.php¡p[c¡Yˆ¬¤0php-code-coverage/StaticAnalysis/CacheWarmer.php)p[c)„ ŒÛ¤8php-code-coverage/StaticAnalysis/CachingFileAnalyser.phpÍp[c͹Z*¤;php-code-coverage/StaticAnalysis/CodeUnitFindingVisitor.php_&p[c_&mqi¤Bphp-code-coverage/StaticAnalysis/ExecutableLinesFindingVisitor.php$p[c$39Ó¤1php-code-coverage/StaticAnalysis/FileAnalyser.php½p[c½öçÜJ¤?php-code-coverage/StaticAnalysis/IgnoredLinesFindingVisitor.php p[c §¹ä¤8php-code-coverage/StaticAnalysis/ParsingFileAnalyser.php‚p[c‚¸û}Á¤%php-code-coverage/Util/Filesystem.phpªp[cªŒëÿ¤%php-code-coverage/Util/Percentage.php„p[c„¹ù«ö¤php-code-coverage/Version.phpÃp[cà y[Ö¤php-file-iterator/Facade.php% +p[c% +Üë®Î¤php-file-iterator/Factory.phpÛp[cÛg Ï,¤php-file-iterator/Iterator.phpZ p[cZ CÜŽ¤php-file-iterator/LICENSEp[co™:¤php-invoker/Invoker.phpp[cÂ+L¤$php-invoker/exceptions/Exception.phprp[crvvdu¤Dphp-invoker/exceptions/ProcessControlExtensionNotLoadedException.php·p[c· áí¤+php-invoker/exceptions/TimeoutException.phpžp[cžö™.¢¤php-text-template/LICENSEp[cu¹¤php-text-template/Template.php( p[c( Áä¤*php-text-template/exceptions/Exception.phpyp[cyæn³µ¤9php-text-template/exceptions/InvalidArgumentException.php p[c …aM¤1php-text-template/exceptions/RuntimeException.phpµp[cµYm'¤php-timer/Duration.php +p[c +tX÷y¤php-timer/LICENSEp[cx™¸œ¤$php-timer/ResourceUsageFormatter.php¨p[c¨PÚ¾¤php-timer/Timer.phpˆp[cˆc²Aɤ"php-timer/exceptions/Exception.phpnp[cn«iuÛ¤/php-timer/exceptions/NoActiveTimerException.phpœp[cœüólÙ¤Ephp-timer/exceptions/TimeSinceStartOfRequestNotAvailableException.php¶p[c¶´$bž¤+phpdocumentor-reflection-common/Element.php p[c %â¤(phpdocumentor-reflection-common/File.phpŸp[cŸ°ˆI)¤)phpdocumentor-reflection-common/Fqsen.phpÅp[cÅ—â¤?¤'phpdocumentor-reflection-common/LICENSE9p[c9*2Ȥ,phpdocumentor-reflection-common/Location.php‘p[c‘=­(œ¤+phpdocumentor-reflection-common/Project.phpp[c¬¦J¤2phpdocumentor-reflection-common/ProjectFactory.php_p[c_j÷\"¤.phpdocumentor-reflection-docblock/DocBlock.php“p[c“Hx>$¤:phpdocumentor-reflection-docblock/DocBlock/Description.phpÖ p[cÖ 54¬¤Aphpdocumentor-reflection-docblock/DocBlock/DescriptionFactory.phpòp[còËd=¤<phpdocumentor-reflection-docblock/DocBlock/ExampleFinder.php,p[c,ׯƒf¤9phpdocumentor-reflection-docblock/DocBlock/Serializer.php p[c µ]–¤Aphpdocumentor-reflection-docblock/DocBlock/StandardTagFactory.phpì0p[cì0‹¢<¤2phpdocumentor-reflection-docblock/DocBlock/Tag.php¡p[c¡·¶”¤9phpdocumentor-reflection-docblock/DocBlock/TagFactory.php†p[c†JMx¤:phpdocumentor-reflection-docblock/DocBlock/Tags/Author.php¹ p[c¹ Ø·’¤;phpdocumentor-reflection-docblock/DocBlock/Tags/BaseTag.phpŒp[cŒÖÌZr¤:phpdocumentor-reflection-docblock/DocBlock/Tags/Covers.phpg +p[cg +w8«¤>phpdocumentor-reflection-docblock/DocBlock/Tags/Deprecated.phpë +p[cë +}CœO¤;phpdocumentor-reflection-docblock/DocBlock/Tags/Example.phpßp[cßalN@¤Hphpdocumentor-reflection-docblock/DocBlock/Tags/Factory/StaticMethod.phpp[c.ý·Í¤=phpdocumentor-reflection-docblock/DocBlock/Tags/Formatter.phpp[cð}BܤLphpdocumentor-reflection-docblock/DocBlock/Tags/Formatter/AlignFormatter.phpqp[cqÀ¯­ë¤Rphpdocumentor-reflection-docblock/DocBlock/Tags/Formatter/PassthroughFormatter.php¹p[c¹PæŸ~¤;phpdocumentor-reflection-docblock/DocBlock/Tags/Generic.phpx p[cx Bðån¤>phpdocumentor-reflection-docblock/DocBlock/Tags/InvalidTag.php,p[c,õMd8¤8phpdocumentor-reflection-docblock/DocBlock/Tags/Link.phpƒp[cƒGŠ›¤:phpdocumentor-reflection-docblock/DocBlock/Tags/Method.php›p[c›YK¼c¤9phpdocumentor-reflection-docblock/DocBlock/Tags/Param.phpp[cêB¥®¤<phpdocumentor-reflection-docblock/DocBlock/Tags/Property.phpË p[cË |yCϤ@phpdocumentor-reflection-docblock/DocBlock/Tags/PropertyRead.phpÙ p[cÙ â#k:¤Aphpdocumentor-reflection-docblock/DocBlock/Tags/PropertyWrite.php× p[c× v ФCphpdocumentor-reflection-docblock/DocBlock/Tags/Reference/Fqsen.php,p[c,%8¤Gphpdocumentor-reflection-docblock/DocBlock/Tags/Reference/Reference.phpÔp[cÔª ¢¤Aphpdocumentor-reflection-docblock/DocBlock/Tags/Reference/Url.phpÍp[cÍc[]î¤;phpdocumentor-reflection-docblock/DocBlock/Tags/Return_.phpp[c Nœ¤7phpdocumentor-reflection-docblock/DocBlock/Tags/See.php p[c ±:e¤9phpdocumentor-reflection-docblock/DocBlock/Tags/Since.phpW +p[cW +1>Íó¤:phpdocumentor-reflection-docblock/DocBlock/Tags/Source.php³ p[c³ «[K¤?phpdocumentor-reflection-docblock/DocBlock/Tags/TagWithType.php¨p[c¨;u•¤:phpdocumentor-reflection-docblock/DocBlock/Tags/Throws.phpp[c"»îG¤8phpdocumentor-reflection-docblock/DocBlock/Tags/Uses.php> +p[c> ¸ -¦¤:phpdocumentor-reflection-docblock/DocBlock/Tags/Throws.php ÒNa"»îG¤<phpdocumentor-reflection-docblock/DocBlock/Tags/Property.phpÌ ÒNaÌ ýÇe_¤2phpdocumentor-reflection-docblock/DocBlock/Tag.php¨ ÒNa¨78^¤<phpdocumentor-reflection-docblock/DocBlock/ExampleFinder.php0 ÒNa0«ÛŽ«¤Aphpdocumentor-reflection-docblock/DocBlock/DescriptionFactory.phpø ÒNaø—"êL¤:phpdocumentor-reflection-docblock/DocBlock/Description.phpÖ ÒNaÖ 54¬¤5phpdocumentor-reflection-docblock/DocBlockFactory.phpÖ$ ÒNaÖ$³br¤+phpdocumentor-reflection-docblock/Utils.php@ ÒNa@ $昤=phpdocumentor-reflection-docblock/Exception/PcreException.php  ÒNa ÏŠWƤ.phpdocumentor-reflection-docblock/DocBlock.php; ÒNa;%§áp¤)phpdocumentor-reflection-docblock/LICENSE8 ÒNa8á‰Ê¤>phpdocumentor-reflection-docblock/DocBlockFactoryInterface.php… ÒNa…)%ùߤ/phpdocumentor-type-resolver/Types/Resource_.php ÒNaÅžX¡¤.phpdocumentor-type-resolver/Types/Compound.php ÒNa>7¢¤-phpdocumentor-type-resolver/Types/Integer.phpj ÒNajœv£¤,phpdocumentor-type-resolver/Types/Never_.php ÒNa€j¤+phpdocumentor-type-resolver/Types/Null_.phpx ÒNax”sú¤-phpdocumentor-type-resolver/Types/Parent_.phpä ÒNaäO!.¤+phpdocumentor-type-resolver/Types/Void_.php ÒNak¤-phpdocumentor-type-resolver/Types/Boolean.phpn ÒNanrõĤ.phpdocumentor-type-resolver/Types/ArrayKey.phpµ ÒNaµÊ« ¤4phpdocumentor-type-resolver/Types/ContextFactory.php7 ÒNa7q⬤2phpdocumentor-type-resolver/Types/AbstractList.phpt ÒNatt»¤-phpdocumentor-type-resolver/Types/String_.phps ÒNasåâüH¤1phpdocumentor-type-resolver/Types/ClassString.php¦ ÒNa¦¦=t¤+phpdocumentor-type-resolver/Types/Self_.phpÌ ÒNaÌåoȤ,phpdocumentor-type-resolver/Types/Float_.phpm ÒNam)J¤-phpdocumentor-type-resolver/Types/Static_.php ÒNaëèÉ8¤-phpdocumentor-type-resolver/Types/Context.phpÌ ÒNaÌ º]ëZ¤,phpdocumentor-type-resolver/Types/Array_.phpÛ ÒNaÛì„D¤-phpdocumentor-type-resolver/Types/Object_.phpè ÒNaèwEhN¤/phpdocumentor-type-resolver/Types/Callable_.php{ ÒNa{ëE§ã¤0phpdocumentor-type-resolver/Types/Collection.php  ÒNa ?¬¼ÿ¤,phpdocumentor-type-resolver/Types/Scalar.php´ ÒNa´·ÅÁ¤0phpdocumentor-type-resolver/Types/Expression.php8 ÒNa8’g¸ð¤,phpdocumentor-type-resolver/Types/Mixed_.php€ ÒNa€3ši«¤4phpdocumentor-type-resolver/Types/AggregatedType.phpÓ - ÒNaÓ -ôHɵ¤/phpdocumentor-type-resolver/Types/Iterable_.php? ÒNa?úQ8¤2phpdocumentor-type-resolver/Types/Intersection.php ÒNaUz$´¤*phpdocumentor-type-resolver/Types/This.phpY ÒNaY^?Öˆ¤.phpdocumentor-type-resolver/Types/Nullable.phpR ÒNaRCp\¤5phpdocumentor-type-resolver/Types/InterfaceString.php² ÒNa²Áùø¤-phpdocumentor-type-resolver/FqsenResolver.phpý ÒNaýjƒ²^¤=phpdocumentor-type-resolver/PseudoTypes/HtmlEscapedString.phpg ÒNagÐãwe¤2phpdocumentor-type-resolver/PseudoTypes/False_.php§ ÒNa§¡o䈤:phpdocumentor-type-resolver/PseudoTypes/NonEmptyString.phpa ÒNaa²,¤7phpdocumentor-type-resolver/PseudoTypes/TraitString.phpZ ÒNaZ´g†C¤1phpdocumentor-type-resolver/PseudoTypes/True_.php£ ÒNa£»l´¤:phpdocumentor-type-resolver/PseudoTypes/CallableString.php` ÒNa`Z‚¤Cphpdocumentor-type-resolver/PseudoTypes/NonEmptyLowercaseString.phpt ÒNatõÃ)¤9phpdocumentor-type-resolver/PseudoTypes/NumericString.php^ ÒNa^ÌÃ8M¤;phpdocumentor-type-resolver/PseudoTypes/LowercaseString.phpb ÒNab¦7 æ¤;phpdocumentor-type-resolver/PseudoTypes/PositiveInteger.php^ ÒNa^òê¤$phpdocumentor-type-resolver/Type.phpÜ ÒNaÜ’b¾&¤*phpdocumentor-type-resolver/PseudoType.phpu ÒNauœ]ú\¤#phpdocumentor-type-resolver/LICENSE8 ÒNa8á‰Ê¤,phpdocumentor-type-resolver/TypeResolver.phpçJ ÒNaçJ«¤!sebastian-environment/Console.php’ ÒNa’ÊuåÒ¤)sebastian-environment/OperatingSystem.phpé ÒNaé¿^ì¤!sebastian-environment/Runtime.phpà ÒNaÃør*u¤sebastian-environment/LICENSE ÒNalm|ð¤*sebastian-comparator/ComparisonFailure.phpÌ ÒNaÌ Ú%½¶¤+sebastian-comparator/ResourceComparator.php ÒNaJ”¤)sebastian-comparator/DoubleComparator.phpÄ ÒNaÄaò¤*sebastian-comparator/NumericComparator.phpˆ ÒNaˆ IФ sebastian-comparator/Factory.phpÛ ÒNaÛæŒ$/¤*sebastian-comparator/DOMNodeComparator.php ÒNa 1iî¤)sebastian-comparator/ObjectComparator.phpX ÒNaX º»×Œ¤)sebastian-comparator/ScalarComparator.phpí ÒNaí ¸ò½d¤+sebastian-comparator/DateTimeComparator.php± ÒNa± ¬µKQ¤'sebastian-comparator/TypeComparator.phpæ ÒNaæcX\¤,sebastian-comparator/ExceptionComparator.phpÆ ÒNaƆÓ1¤4sebastian-comparator/exceptions/RuntimeException.php ÒNaV¬'¤-sebastian-comparator/exceptions/Exception.phpv ÒNavîEᵤ3sebastian-comparator/SplObjectStorageComparator.phpý ÒNaý?Ñ/é¤#sebastian-comparator/Comparator.php… ÒNa…tð„ž¤(sebastian-comparator/ArrayComparator.phpu ÒNauEmhf¤sebastian-comparator/LICENSE  ÒNa =(èã¤-sebastian-comparator/MockObjectComparator.phpÎ ÒNa΃I½ˆ¤+phar-io-manifest/ManifestDocumentMapper.php ÒNa÷Ç:Á¤?phar-io-manifest/exceptions/ManifestDocumentMapperException.phpž ÒNaž’:9z¤3phar-io-manifest/exceptions/InvalidUrlException.phpÍ ÒNaÍ£ ¤?phar-io-manifest/exceptions/InvalidApplicationNameException.phpý ÒNaý:@Ä>¤8phar-io-manifest/exceptions/ManifestElementException.php— ÒNa—“ÂA4¤7phar-io-manifest/exceptions/ManifestLoaderException.php ÒNaDªØ>¤9phar-io-manifest/exceptions/ManifestDocumentException.php˜ ÒNa˜!P4¶¤5phar-io-manifest/exceptions/InvalidEmailException.phpÏ ÒNaÏ<»·†¤)phar-io-manifest/exceptions/Exception.php£ ÒNa£¢„ü¤@phar-io-manifest/exceptions/ManifestDocumentLoadingException.phpH ÒNaHǃ·ê¤:phar-io-manifest/exceptions/ElementCollectionException.phpÔ ÒNaÔÙ ßI¤'phar-io-manifest/ManifestSerializer.php¬ ÒNa¬šróp¤#phar-io-manifest/xml/ExtElement.php  ÒNa y>¾¤)phar-io-manifest/xml/CopyrightElement.phpÓ ÒNaÓ—·7¤#phar-io-manifest/xml/PhpElement.php ÒNa“B:5¤0phar-io-manifest/xml/AuthorElementCollection.php, ÒNa,ð¥-­¤*phar-io-manifest/xml/ElementCollection.php ÒNa@¨ é¤)phar-io-manifest/xml/ExtensionElement.php} ÒNa}0¢ý¤'phar-io-manifest/xml/LicenseElement.phpo ÒNao%Ã:'¤-phar-io-manifest/xml/ExtElementCollection.php# ÒNa#E¼Éí¤(phar-io-manifest/xml/RequiresElement.php$ ÒNa$>¶¦¤'phar-io-manifest/xml/BundlesElement.phpS ÒNaSúWN>¤(phar-io-manifest/xml/ContainsElement.phpn ÒNanfÇü¤)phar-io-manifest/xml/ManifestDocument.php - ÒNa - ›ª4º¤)phar-io-manifest/xml/ComponentElement.phpy ÒNayæ·ìݤ(phar-io-manifest/xml/ManifestElement.php4 ÒNa4ãó¤&phar-io-manifest/xml/AuthorElement.phpr ÒNar¡<¤3phar-io-manifest/xml/ComponentElementCollection.php5 ÒNa5(†Á\¤phar-io-manifest/LICENSE` ÒNa`÷þp¤$phar-io-manifest/values/Manifest.php - ÒNa -=La¡¤phar-io-manifest/values/Url.php… ÒNa…¬æÍš¤4phar-io-manifest/values/AuthorCollectionIterator.php3 ÒNa3ÑŸƒé¤"phar-io-manifest/values/Author.php ÒNaÑÌFì¤+phar-io-manifest/values/ApplicationName.php; ÒNa;D»ö¤'phar-io-manifest/values/Application.phpè ÒNaèI$Û¤1phar-io-manifest/values/PhpVersionRequirement.php ÒNam¨?¤#phar-io-manifest/values/License.phpï ÒNaï¥&!o¤#phar-io-manifest/values/Library.phpà ÒNaàÇÀO¤,phar-io-manifest/values/AuthorCollection.phpž ÒNaž”o¤'phar-io-manifest/values/Requirement.php’ ÒNa’¯÷d÷¤%phar-io-manifest/values/Extension.php  ÒNa ŽÛq}¤>phar-io-manifest/values/BundledComponentCollectionIterator.php¡ ÒNa¡‰Vh¤1phar-io-manifest/values/RequirementCollection.phpß ÒNaßÕì¤P¤9phar-io-manifest/values/RequirementCollectionIterator.phpj ÒNajÜ­:’¤!phar-io-manifest/values/Email.phpN ÒNaNZÀ&½¤ phar-io-manifest/values/Type.php´ ÒNa´ðÕ=%¤6phar-io-manifest/values/BundledComponentCollection.php  ÒNa ¾W6¤3phar-io-manifest/values/PhpExtensionRequirement.php› ÒNa›¹1¤,phar-io-manifest/values/BundledComponent.php@ ÒNa@öDP`¤0phar-io-manifest/values/CopyrightInformation.phpP ÒNaP aºi¤#phar-io-manifest/ManifestLoader.phpË ÒNaË.ü-a¤<sebastian-cli-parser/exceptions/AmbiguousOptionException.phpF ÒNaFòm\¤:sebastian-cli-parser/exceptions/UnknownOptionException.php? ÒNa?v¥¡D¤Gsebastian-cli-parser/exceptions/OptionDoesNotAllowArgumentException.php_ ÒNa_|13¬¤-sebastian-cli-parser/exceptions/Exception.phpu ÒNauãÓ«¤Jsebastian-cli-parser/exceptions/RequiredOptionArgumentMissingException.phph ÒNah‚CËê¤sebastian-cli-parser/Parser.phpŽ ÒNaŽ•k®M¤sebastian-cli-parser/LICENSE ÒNaÑÝu¤$symfony-polyfill-ctype/bootstrap.php ÒNaÊ(S¤&symfony-polyfill-ctype/bootstrap80.phpR ÒNaRÆLµ -¤ symfony-polyfill-ctype/Ctype.php~ ÒNa~JÎÆÒ¤symfony-polyfill-ctype/LICENSE) ÒNa)´`e0¤3sebastian-complexity/Exception/RuntimeException.php ÒNaC†dW¤,sebastian-complexity/Exception/Exception.phpv ÒNav7ý®¤#sebastian-complexity/Calculator.phpe ÒNae (6œÀ¤8sebastian-complexity/Complexity/ComplexityCollection.phpØ ÒNaØil¤.sebastian-complexity/Complexity/Complexity.phpQ ÒNaQ‚l½¤@sebastian-complexity/Complexity/ComplexityCollectionIterator.php, ÒNa,úäe§¤sebastian-complexity/LICENSE ÒNa=‘®Ý¤=sebastian-complexity/Visitor/ComplexityCalculatingVisitor.php• ÒNa• öO¤Gsebastian-complexity/Visitor/CyclomaticComplexityCalculatingVisitor.php  ÒNa 7ÖY–¤object-reflector/LICENSE ÒNa¢9v¤<sebastian-lines-of-code/Exception/NegativeValueException.php¼ ÒNa¼«Ç -Ú¤>sebastian-lines-of-code/Exception/IllogicalValuesException.phpª ÒNaªëžG¤6sebastian-lines-of-code/Exception/RuntimeException.php‘ ÒNa‘§K¥¤/sebastian-lines-of-code/Exception/Exception.phpz ÒNaz a×V¤#sebastian-lines-of-code/Counter.phpß ÒNaßH5è¤'sebastian-lines-of-code/LinesOfCode.phpñ ÒNañ fŠöÓ¤/sebastian-lines-of-code/LineCountingVisitor.phpŠ ÒNaŠ˜“~A¤sebastian-lines-of-code/LICENSE ÒNa÷bS~¤ manifest.txtì ÒNaìò.õ¤Rdoctrine-instantiator/Doctrine/Instantiator/Exception/UnexpectedValueException.php, ÒNa,œ›A»¤Ldoctrine-instantiator/Doctrine/Instantiator/Exception/ExceptionInterface.phpÇ ÒNaÇŒµb¤Rdoctrine-instantiator/Doctrine/Instantiator/Exception/InvalidArgumentException.phpÛ ÒNaÛÑ+ª¤<doctrine-instantiator/Doctrine/Instantiator/Instantiator.php ÒNa¨ùÊ=¤Edoctrine-instantiator/Doctrine/Instantiator/InstantiatorInterface.phpó ÒNaóvˆôh¤doctrine-instantiator/LICENSE$ ÒNa$ -Í‚å¤4sebastian-resource-operations/ResourceOperations.phpß² ÒNaß²·¦¤%sebastian-resource-operations/LICENSE ÒNa]<â¤$sebastian-code-unit/FunctionUnit.php ÒNaþ`¹¤2sebastian-code-unit/CodeUnitCollectionIterator.php; ÒNa;äLʤsebastian-code-unit/Mapper.phpÔ- ÒNaÔ-#øž¢¤%sebastian-code-unit/InterfaceUnit.php ÒNa›c¸¤ sebastian-code-unit/CodeUnit.php~% ÒNa~%D){¬¤!sebastian-code-unit/TraitUnit.php ÒNaëXAé¤+sebastian-code-unit/InterfaceMethodUnit.php ÒNaǦŽç¤'sebastian-code-unit/ClassMethodUnit.php ÒNaÃ@[¤3sebastian-code-unit/exceptions/NoTraitException.phpŸ ÒNaŸ“Q3¤6sebastian-code-unit/exceptions/ReflectionException.php¢ ÒNa¢•„²$¤,sebastian-code-unit/exceptions/Exception.phps ÒNastg§¤;sebastian-code-unit/exceptions/InvalidCodeUnitException.php§ ÒNa§Ë6þ-¤!sebastian-code-unit/ClassUnit.php ÒNaù÷ÝF¤'sebastian-code-unit/TraitMethodUnit.php ÒNaq¸z¤sebastian-code-unit/LICENSE  ÒNa p”ˆð¤*sebastian-code-unit/CodeUnitCollection.php ÒNaØý¯J¤.phpstorm.meta.php‘ ÒNa‘Oßò¤;php-code-coverage/Exception/WrongXdebugVersionException.phpñ ÒNañ³ ºÈ¤;php-code-coverage/Exception/PhpdbgNotAvailableException.php` ÒNa`ðˆ›¤Fphp-code-coverage/Exception/NoCodeCoverageDriverAvailableException.php/ ÒNa/6§R¤,php-code-coverage/Exception/XmlException.php¥ ÒNa¥W–ƒÜ¤?php-code-coverage/Exception/ReportAlreadyFinalizedException.php: ÒNa:d%6¤;php-code-coverage/Exception/XdebugNotAvailableException.phpe ÒNaeN·‰G¤=php-code-coverage/Exception/WriteOperationFailedException.phpˆ ÒNaˆù¹(e¤Cphp-code-coverage/Exception/DirectoryCouldNotBeCreatedException.php¼ ÒNa¼C*e¤Fphp-code-coverage/Exception/DeadCodeDetectionNotSupportedException.php¿ ÒNa¿÷ý›¤:php-code-coverage/Exception/Xdebug2NotEnabledException.phpf ÒNaf†®,'¤6php-code-coverage/Exception/TestIdMissingException.php ÒNa‰ -Þÿ¤3php-code-coverage/Exception/ReflectionException.php¬ ÒNa¬Ýäk)¤:php-code-coverage/Exception/Xdebug3NotEnabledException.phpy ÒNay<ÿ>¤]php-code-coverage/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.phpa ÒNaa"A£¤)php-code-coverage/Exception/Exception.php} ÒNa}íz¤™¤9php-code-coverage/Exception/PcovNotAvailableException.phpa ÒNaaj®¤Dphp-code-coverage/Exception/PathExistsButIsNotDirectoryException.php ÒNaô.2¤Iphp-code-coverage/Exception/StaticAnalysisCacheNotConfiguredException.php ÒNa»ïÍ}¤Cphp-code-coverage/Exception/UnintentionallyCoveredCodeException.php+ ÒNa+Q_ª¤Jphp-code-coverage/Exception/BranchAndPathCoverageNotSupportedException.phpà ÒNaóÀ77¤8php-code-coverage/Exception/InvalidArgumentException.php¤ ÒNa¤ñK.n¤/php-code-coverage/Exception/ParserException.php¨ ÒNa¨, /ô¤ php-code-coverage/Percentage.php ÒNa„†°Ý¤php-code-coverage/Filter.php ÒNa Ž }ã¤'php-code-coverage/Driver/PcovDriver.php¤ ÒNa¤ †¯¤#php-code-coverage/Driver/Driver.php¡ ÒNa¡3ËA•¤*php-code-coverage/Driver/Xdebug3Driver.php ÒNa ¬T‚J¤*php-code-coverage/Driver/Xdebug2Driver.phpO ÒNaO =󛫤)php-code-coverage/Driver/PhpdbgDriver.php` - ÒNa` -ŸWH¤%php-code-coverage/Driver/Selector.php ÒNa ó6¦]¤?php-code-coverage/StaticAnalysis/CachingCoveredFileAnalyser.php¾ - ÒNa¾ -èËȤ:php-code-coverage/StaticAnalysis/UncoveredFileAnalyser.php+ ÒNa+Bº=¤?php-code-coverage/StaticAnalysis/ParsingCoveredFileAnalyser.phpF ÒNaFiaÙð¤Bphp-code-coverage/StaticAnalysis/ExecutableLinesFindingVisitor.php - ÒNa -z´p{¤*php-code-coverage/StaticAnalysis/Cache.php6 ÒNa6‘ÛM`¤;php-code-coverage/StaticAnalysis/CodeUnitFindingVisitor.phpà ÒNaÃÕÍ8¨¤Aphp-code-coverage/StaticAnalysis/ParsingUncoveredFileAnalyser.phpo ÒNao¥ ã­¤Aphp-code-coverage/StaticAnalysis/CachingUncoveredFileAnalyser.php¡ ÒNa¡¢hf„¤8php-code-coverage/StaticAnalysis/CoveredFileAnalyser.phpN ÒNaNý|íÖ¤?php-code-coverage/StaticAnalysis/IgnoredLinesFindingVisitor.php¢ ÒNa¢ vµ²Ù¤0php-code-coverage/StaticAnalysis/CacheWarmer.phpB ÒNaB¥J¤php-code-coverage/Version.php ÒNaÂCK(*¤"php-code-coverage/CodeCoverage.php€D ÒNa€DP÷Lý¤/php-code-coverage/ProcessedCodeCoverageData.php$ ÒNa$äŽ'¤#php-code-coverage/Report/Crap4j.phpÏ ÒNaϾ+“¤!php-code-coverage/Report/Text.phpá' ÒNaá' éƤ(php-code-coverage/Report/Html/Facade.php4 ÒNa4ƒ­k¤*php-code-coverage/Report/Html/Renderer.phpU! ÒNaU!åž}¤>php-code-coverage/Report/Html/Renderer/Template/file.html.distî ÒNaî‹­F¬¤Mphp-code-coverage/Report/Html/Renderer/Template/coverage_bar_branch.html.dist' ÒNa'õO}¤Cphp-code-coverage/Report/Html/Renderer/Template/dashboard.html.distG ÒNaGäÄl¤?php-code-coverage/Report/Html/Renderer/Template/paths.html.distò ÒNaòã*'ݤCphp-code-coverage/Report/Html/Renderer/Template/directory.html.distÌ ÒNaÌGÉM³¤?php-code-coverage/Report/Html/Renderer/Template/js/nv.d3.min.jsÚR ÒNaÚRphp-code-coverage/Report/Html/Renderer/Template/line.html.distÅ ÒNaÅãç­{¤Hphp-code-coverage/Report/Html/Renderer/Template/directory_item.html.distA ÒNaAds¤Fphp-code-coverage/Report/Html/Renderer/Template/coverage_bar.html.dist' ÒNa'õO}¤Ephp-code-coverage/Report/Html/Renderer/Template/method_item.html.dist‚ ÒNa‚†îs:¤>php-code-coverage/Report/Html/Renderer/Template/css/custom.css ÒNa¤Ephp-code-coverage/Report/Html/Renderer/Template/css/bootstrap.min.css“r ÒNa“r?ßl¤=php-code-coverage/Report/Html/Renderer/Template/css/style.cssþ ÒNaþ¥¶:¤@php-code-coverage/Report/Html/Renderer/Template/css/octicons.cssX ÒNaX'#ï¤Aphp-code-coverage/Report/Html/Renderer/Template/css/nv.d3.min.cssX% ÒNaX%0,¤Jphp-code-coverage/Report/Html/Renderer/Template/directory_branch.html.distj ÒNaj¡HØâ¤Bphp-code-coverage/Report/Html/Renderer/Template/branches.html.distô ÒNaôh2+¤Cphp-code-coverage/Report/Html/Renderer/Template/file_item.html.distt ÒNatØ¿ê¤Ophp-code-coverage/Report/Html/Renderer/Template/directory_item_branch.html.dist; ÒNa;ªm½Û¤Jphp-code-coverage/Report/Html/Renderer/Template/dashboard_branch.html.distG ÒNaGäÄl¤Cphp-code-coverage/Report/Html/Renderer/Template/icons/file-code.svg0 ÒNa0ÙQUU¤Hphp-code-coverage/Report/Html/Renderer/Template/icons/file-directory.svgê ÒNaêýÚZÿ¤/php-code-coverage/Report/Html/Renderer/File.phpSŒ ÒNaSŒí×Yð¤4php-code-coverage/Report/Html/Renderer/Dashboard.phpC ÒNaC €LÅ+¤4php-code-coverage/Report/Html/Renderer/Directory.php  ÒNa §Ù(¤ php-code-coverage/Report/PHP.php¢ ÒNa¢í>*\¤1php-code-coverage/Report/Xml/BuildInformation.phpç ÒNaç T3›e¤'php-code-coverage/Report/Xml/Source.phpz ÒNaz'Â1Š¤'php-code-coverage/Report/Xml/Facade.phpü! ÒNaü!‰ ÷P¤'php-code-coverage/Report/Xml/Method.phpW ÒNaW »Ê¤'php-code-coverage/Report/Xml/Report.php ÒNa ¦HC¤%php-code-coverage/Report/Xml/File.php+ ÒNa+g׃¤'php-code-coverage/Report/Xml/Totals.php ÒNakÀ ˆ¤&php-code-coverage/Report/Xml/Tests.php® ÒNa®•äÊò¤%php-code-coverage/Report/Xml/Node.php3 ÒNa3¹šª¤(php-code-coverage/Report/Xml/Project.phpf ÒNafP›e¤)php-code-coverage/Report/Xml/Coverage.php+ ÒNa+Ô9ùE¤*php-code-coverage/Report/Xml/Directory.phpé ÒNaéAfà¤%php-code-coverage/Report/Xml/Unit.php¡ ÒNa¡Yˆ¬¤#php-code-coverage/Report/Clover.phpê' ÒNaê'-€”¤&php-code-coverage/Report/Cobertura.phpÆ0 ÒNaÆ0ýqåä¤)php-code-coverage/RawCodeCoverageData.phpœ ÒNaœ…å<¤php-code-coverage/CrapIndex.php´ ÒNa´kSÀ;¤php-code-coverage/Node/File.phpÔJ ÒNaÔJ‚ÅK¤"php-code-coverage/Node/Builder.phpƒ ÒNaƒÏq¤#php-code-coverage/Node/Iterator.php  ÒNa &•‹¤$php-code-coverage/Node/Directory.phpK$ ÒNaK$Œm'…¤'php-code-coverage/Node/AbstractNode.php ÒNaå5sÿ¤php-code-coverage/LICENSE ÒNa\T¤php-code-coverage/Directory.php› ÒNa›ö H¤phpunit/Util/Xml.php· ÒNa·‡xŸ@¤phpunit/Util/GlobalState.php ÒNa=Ut§¤(phpunit/Util/InvalidDataSetException.phpî ÒNaî1 ¿¤phpunit/Util/Log/JUnit.phpn* ÒNan*)†LB¤phpunit/Util/Log/TeamCity.php& ÒNa&c¶µ±¤phpunit/Util/Blacklist.phpá ÒNaá­s«€¤phpunit/Util/Filter.php¨ ÒNa¨ l* ¤phpunit/Util/Test.phpã] ÒNaã]¬Á‡¤phpunit/Util/FileLoader.php™ ÒNa™ ‚Mê–¤$phpunit/Util/XmlTestListRenderer.phpÛ ÒNaÛ ²­Z¤,phpunit/Util/XdebugFilterScriptGenerator.phpx ÒNax=Ë—¤phpunit/Util/Filesystem.php ÒNaf”Þ¤*phpunit/Util/VersionComparisonOperator.php‰ ÒNa‰ŸÕ`,¤phpunit/Util/Color.phpë ÒNaë÷–º×¤%phpunit/Util/TextTestListRenderer.php8 ÒNa8Ï>´6¤"phpunit/Util/RegularExpression.phpÞ ÒNaÞ0uR)¤phpunit/Util/ErrorHandler.phpŽ ÒNaŽ`uâΤphpunit/Util/Exception.phpà ÒNaछ다,phpunit/Util/PHP/Template/TestCaseMethod.tpl¿ ÒNa¿ mÑD€+phpunit/Util/PHP/Template/TestCaseClass.tplp ÒNap 3 HÝ€*phpunit/Util/PHP/Template/PhptTestCase.tplÐ ÒNaÐ1õ€&phpunit/Util/PHP/WindowsPhpProcess.phpñ ÒNañ…è$”¤&phpunit/Util/PHP/DefaultPhpProcess.phpz ÒNaz˜ðCp¤'phpunit/Util/PHP/AbstractPhpProcess.phpÂ& ÒNaÂ&‚{99¤phpunit/Util/Printer.php÷ ÒNa÷ êèaV¤phpunit/Util/Type.phpž ÒNažÜŒ…*¤phpunit/Util/Json.phpH ÒNaH AçÏ$¤$phpunit/Util/Annotation/DocBlock.phpA ÒNaAË.¤$phpunit/Util/Annotation/Registry.phpL - ÒNaL -°Iò ¤phpunit/Util/ExcludeList.php= ÒNa=(Õ1m¤!phpunit/Util/Xml/SchemaFinder.php  ÒNa ŠÛS¤phpunit/Util/Xml/Validator.php ÒNaVöˆŠ¤phpunit/Util/Xml/Loader.php„ ÒNa„ ­,?µ¤%phpunit/Util/Xml/ValidationResult.php• ÒNa•xv:€¤phpunit/Util/Xml/Exception.phpä ÒNaä•û±Ó¤0phpunit/Util/Xml/FailedSchemaDetectionResult.phpð ÒNaðÖ#S˜¤*phpunit/Util/Xml/SchemaDetectionResult.phpµ ÒNaµ4χz¤#phpunit/Util/Xml/SchemaDetector.php- ÒNa-ó´¤4phpunit/Util/Xml/SuccessfulSchemaDetectionResult.php' ÒNa'ð–ìg¤%phpunit/Util/Xml/SnapshotNodeList.phpú ÒNaúÓ`6é¤*phpunit/Util/TestDox/TextResultPrinter.php­ ÒNa­ȹ!.¤'phpunit/Util/TestDox/NamePrettifier.phpê# ÒNaê#[Ö¤*phpunit/Util/TestDox/CliTestDoxPrinter.php1* ÒNa1*ìàDl¤&phpunit/Util/TestDox/ResultPrinter.php" ÒNa"1Ïq$¤)phpunit/Util/TestDox/XmlResultPrinter.phpÝ ÒNaÝy¤'phpunit/Util/TestDox/TestDoxPrinter.phpõ) ÒNaõ)¸ªËÚ¤*phpunit/Util/TestDox/HtmlResultPrinter.phpñ - ÒNañ -t&“¤*phpunit/Runner/StandardTestSuiteLoader.php> ÒNa> "åuë¤"phpunit/Runner/TestSuiteSorter.php¦, ÒNa¦,ÇkÚ¤"phpunit/Runner/TestSuiteLoader.php˜ ÒNa˜›¥ÐÞ¤"phpunit/Runner/TestResultCache.phpÕ ÒNaÕÏK¤'phpunit/Runner/Extension/PharLoader.phpÌ ÒNaÌ Rïþ ¤-phpunit/Runner/Extension/ExtensionHandler.phpz ÒNaz ·3Τ4phpunit/Runner/Filter/ExcludeGroupFilterIterator.phps ÒNas} -Z¤4phpunit/Runner/Filter/IncludeGroupFilterIterator.phpr ÒNarP;AD¤!phpunit/Runner/Filter/Factory.php® ÒNa®d€cΤ-phpunit/Runner/Filter/GroupFilterIterator.php¬ ÒNa¬™=¢;¤,phpunit/Runner/Filter/NameFilterIterator.phpv ÒNav ­Z³¤phpunit/Runner/Version.php ÒNak«r3¤)phpunit/Runner/DefaultTestResultCache.php ÒNa×ÆñW¤phpunit/Runner/Exception.phpâ ÒNaâzZÖ¤*phpunit/Runner/Hook/AfterTestErrorHook.php+ ÒNa+ fz¤,phpunit/Runner/Hook/AfterTestWarningHook.php/ ÒNa/)pÔ¤,phpunit/Runner/Hook/AfterTestFailureHook.php/ ÒNa/u.¨¤/phpunit/Runner/Hook/AfterIncompleteTestHook.php5 ÒNa5÷ ɤ,phpunit/Runner/Hook/AfterSkippedTestHook.php/ ÒNa/¿7ÏÔ¤+phpunit/Runner/Hook/TestListenerAdapter.phpÇ ÒNaÇ\î6E¤*phpunit/Runner/Hook/AfterRiskyTestHook.php+ ÒNa+5ÿ‡¤+phpunit/Runner/Hook/BeforeFirstTestHook.phpÿ ÒNaÿ?]{Õ¤/phpunit/Runner/Hook/AfterSuccessfulTestHook.php$ ÒNa$•]ÁO¤ phpunit/Runner/Hook/TestHook.php¿ ÒNa¿aµÝB¤&phpunit/Runner/Hook/BeforeTestHook.php ÒNa…žR -¤%phpunit/Runner/Hook/AfterTestHook.phpÙ ÒNaÙ3uݤphpunit/Runner/Hook/Hook.phpž ÒNaž¥¬¸b¤)phpunit/Runner/Hook/AfterLastTestHook.phpû ÒNaû -"ܤ&phpunit/Runner/NullTestResultCache.php™ ÒNa™¾W<ª¤phpunit/Runner/PhptTestCase.phpWV ÒNaWVïT_y¤!phpunit/Runner/BaseTestRunner.phpÀ ÒNaÀ C +¤'phpunit/Runner/ResultCacheExtension.php< ÒNa<–6 _¤Aphpunit/TextUI/XmlConfiguration/Group/GroupCollectionIterator.phpA ÒNaA8§%‹¤9phpunit/TextUI/XmlConfiguration/Group/GroupCollection.phpÁ ÒNaÁ›k0phpunit/TextUI/XmlConfiguration/Group/Groups.phpÙ ÒNaÙÒóúí¤/phpunit/TextUI/XmlConfiguration/Group/Group.php ÒNaE§L£¤-phpunit/TextUI/XmlConfiguration/Generator.php¾ ÒNa¾F𠜤0phpunit/TextUI/XmlConfiguration/Logging/Text.phpÆ ÒNaÆ-ƒ30¤1phpunit/TextUI/XmlConfiguration/Logging/Junit.phpÇ ÒNaÇz祤3phpunit/TextUI/XmlConfiguration/Logging/Logging.phpÝ ÒNaÝ d4°¤4phpunit/TextUI/XmlConfiguration/Logging/TeamCity.phpÊ ÒNaÊím˜¤7phpunit/TextUI/XmlConfiguration/Logging/TestDox/Xml.phpÍ ÒNaÍšo¦¤8phpunit/TextUI/XmlConfiguration/Logging/TestDox/Html.phpÎ ÒNaÎ}Ó7¤8phpunit/TextUI/XmlConfiguration/Logging/TestDox/Text.phpÎ ÒNaÎ*J‹j¤Jphpunit/TextUI/XmlConfiguration/Filesystem/DirectoryCollectionIterator.phpo ÒNao\†V¤Bphpunit/TextUI/XmlConfiguration/Filesystem/DirectoryCollection.phpœ ÒNaœV9”î¤3phpunit/TextUI/XmlConfiguration/Filesystem/File.phpŽ ÒNaŽ¢ÏÉú¤Ephpunit/TextUI/XmlConfiguration/Filesystem/FileCollectionIterator.php7 ÒNa7óte7¤=phpunit/TextUI/XmlConfiguration/Filesystem/FileCollection.phpC ÒNaCÊÑè¤8phpunit/TextUI/XmlConfiguration/Filesystem/Directory.php“ ÒNa“s”ÃO¤*phpunit/TextUI/XmlConfiguration/Loader.phpÌ— ÒNaÌ—m_|`¤1phpunit/TextUI/XmlConfiguration/Configuration.php2 ÒNa2âN'Ƥ3phpunit/TextUI/XmlConfiguration/PHPUnit/PHPUnit.phpiC ÒNaiC 6¤5phpunit/TextUI/XmlConfiguration/PHPUnit/Extension.php– ÒNa–þ -J.¤?phpunit/TextUI/XmlConfiguration/PHPUnit/ExtensionCollection.php¸ ÒNa¸Ü”ñí¤Gphpunit/TextUI/XmlConfiguration/PHPUnit/ExtensionCollectionIterator.phpi ÒNaiòoÐ(¤7phpunit/TextUI/XmlConfiguration/TestSuite/TestSuite.php ÒNaÏ„Ÿ¤;phpunit/TextUI/XmlConfiguration/TestSuite/TestDirectory.php@ ÒNa@)Æe‰¤Iphpunit/TextUI/XmlConfiguration/TestSuite/TestSuiteCollectionIterator.phpi ÒNaió #©¤6phpunit/TextUI/XmlConfiguration/TestSuite/TestFile.phpÉ ÒNaÉ Æî¤Ephpunit/TextUI/XmlConfiguration/TestSuite/TestDirectoryCollection.php¸ ÒNa¸±4X—¤Aphpunit/TextUI/XmlConfiguration/TestSuite/TestSuiteCollection.php“ ÒNa“C†Sñ¤Hphpunit/TextUI/XmlConfiguration/TestSuite/TestFileCollectionIterator.phpG ÒNaGw¾ÒǤ@phpunit/TextUI/XmlConfiguration/TestSuite/TestFileCollection.php_ ÒNa_.+Þ¤Mphpunit/TextUI/XmlConfiguration/TestSuite/TestDirectoryCollectionIterator.php ÒNayp¸¤Sphpunit/TextUI/XmlConfiguration/CodeCoverage/Filter/DirectoryCollectionIterator.php« ÒNa«¶šje¤Kphpunit/TextUI/XmlConfiguration/CodeCoverage/Filter/DirectoryCollection.php– ÒNa–Q4X¤Aphpunit/TextUI/XmlConfiguration/CodeCoverage/Filter/Directory.phpÌ ÒNaÌé Ï•¤=phpunit/TextUI/XmlConfiguration/CodeCoverage/CodeCoverage.phpŒ ÒNaŒÕc%š¤=phpunit/TextUI/XmlConfiguration/CodeCoverage/FilterMapper.php¿ ÒNa¿}Ýšƒ¤;phpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Xml.phpå ÒNaåúŒ8¤;phpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Php.phpÑ ÒNaÑN_A¤<phpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Html.php  ÒNa Ú´Q¤>phpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Crap4j.php– ÒNa–caѤ<phpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Text.php¶ ÒNa¶Ï»¤>phpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Clover.phpÔ ÒNaÔ:± ¤Aphpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Cobertura.php× ÒNa×"ãe¿¤-phpunit/TextUI/XmlConfiguration/Exception.phpó ÒNaóN€5+¤+phpunit/TextUI/XmlConfiguration/PHP/Php.php ÒNaÁïó¤:phpunit/TextUI/XmlConfiguration/PHP/VariableCollection.php- ÒNa-€cýç¤0phpunit/TextUI/XmlConfiguration/PHP/Variable.phpá ÒNaá\üM,¤Bphpunit/TextUI/XmlConfiguration/PHP/ConstantCollectionIterator.php_ ÒNa_ô4V¿¤Dphpunit/TextUI/XmlConfiguration/PHP/IniSettingCollectionIterator.phps ÒNasiBt ¤<phpunit/TextUI/XmlConfiguration/PHP/IniSettingCollection.phpM ÒNaMB›1¤2phpunit/TextUI/XmlConfiguration/PHP/PhpHandler.phpy ÒNayŠ]‡b¤0phpunit/TextUI/XmlConfiguration/PHP/Constant.php4 ÒNa4,-Ïq¤Bphpunit/TextUI/XmlConfiguration/PHP/VariableCollectionIterator.php_ ÒNa_¦ëK¤:phpunit/TextUI/XmlConfiguration/PHP/ConstantCollection.php- ÒNa-U%ߤ2phpunit/TextUI/XmlConfiguration/PHP/IniSetting.phpG ÒNaG¼T+¤6phpunit/TextUI/XmlConfiguration/Migration/Migrator.php× ÒNa×o$ŠV¤Gphpunit/TextUI/XmlConfiguration/Migration/MigrationBuilderException.php ÒNaUWĤdphpunit/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php¬ ÒNa¬U%5¸¤Yphpunit/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromRootToCoverage.phpC ÒNaCÿÅcF¤Sphpunit/TextUI/XmlConfiguration/Migration/Migrations/RemoveCacheTokensAttribute.phpß ÒNaß‘w¾ ¤Hphpunit/TextUI/XmlConfiguration/Migration/Migrations/ConvertLogTypes.php« ÒNa«hoÁe¤Ophpunit/TextUI/XmlConfiguration/Migration/Migrations/CoverageCloverToReport.phpX ÒNaXijÁ¤Lphpunit/TextUI/XmlConfiguration/Migration/Migrations/CoveragePhpToReport.phpF ÒNaF‹£^Ó¤Bphpunit/TextUI/XmlConfiguration/Migration/Migrations/Migration.phpð ÒNað'ˆžþ¤Qphpunit/TextUI/XmlConfiguration/Migration/Migrations/UpdateSchemaLocationTo93.phpñ ÒNañ bJï¤Ophpunit/TextUI/XmlConfiguration/Migration/Migrations/CoverageCrap4jToReport.phpœ ÒNaœ$¯i'¤Qphpunit/TextUI/XmlConfiguration/Migration/Migrations/IntroduceCoverageElement.phpá ÒNaáUž¤Jphpunit/TextUI/XmlConfiguration/Migration/Migrations/RemoveEmptyFilter.php{ ÒNa{æK¤[phpunit/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistDirectoriesToCoverage.php¤ ÒNa¤†踤Gphpunit/TextUI/XmlConfiguration/Migration/Migrations/RemoveLogTypes.php& ÒNa&ùq3{¤Mphpunit/TextUI/XmlConfiguration/Migration/Migrations/CoverageHtmlToReport.php© ÒNa©Õ„j‰¤Mphpunit/TextUI/XmlConfiguration/Migration/Migrations/LogToReportMigration.php ÒNa»áU¤Mphpunit/TextUI/XmlConfiguration/Migration/Migrations/CoverageTextToReport.phpª ÒNaªÇV_¤Xphpunit/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistExcludesToCoverage.php} ÒNa}ì -¤Lphpunit/TextUI/XmlConfiguration/Migration/Migrations/CoverageXmlToReport.phpK ÒNaK«È_ ¤>phpunit/TextUI/XmlConfiguration/Migration/MigrationBuilder.php# ÒNa# g©µ¤@phpunit/TextUI/XmlConfiguration/Migration/MigrationException.phpü ÒNaü\Z¤phpunit/TextUI/Help.phpë. ÒNaë.%¡»ò¤phpunit/TextUI/TestRunner.phpÛÁ ÒNaÛÁÔŠ¤6phpunit/TextUI/Exception/TestFileNotFoundException.php– ÒNa–™âpC¤0phpunit/TextUI/Exception/ReflectionException.php÷ ÒNa÷ Y”¤-phpunit/TextUI/Exception/RuntimeException.phpß ÒNaß…žF¤;phpunit/TextUI/Exception/TestDirectoryNotFoundException.php  ÒNa Õ̤&phpunit/TextUI/Exception/Exception.php¸ ÒNa¸D{i¤ phpunit/TextUI/ResultPrinter.phpp ÒNap¢¥Ü¤'phpunit/TextUI/DefaultResultPrinter.php67 ÒNa67lˆ¤&phpunit/TextUI/CliArguments/Mapper.php+, ÒNa+,'aˆ“¤-phpunit/TextUI/CliArguments/Configuration.phpó² ÒNaó²—0˜¤'phpunit/TextUI/CliArguments/Builder.php±T ÒNa±T6ø6¤)phpunit/TextUI/CliArguments/Exception.phpï ÒNaï%ézE¤phpunit/TextUI/Command.php&f ÒNa&f–Š’ë¤"phpunit/TextUI/TestSuiteMapper.php ÒNa A+8¤#phpunit/Framework/ErrorTestCase.php ÒNa¡¾Ì¤!phpunit/Framework/SkippedTest.php¹ ÒNa¹S±.¤phpunit/Framework/TestSuite.phpÏb ÒNaÏbÃ!S»¤+phpunit/Framework/DataProviderTestSuite.php ÒNa\8¤$phpunit/Framework/IncompleteTest.php¼ ÒNa¼,+Ѥ!phpunit/Framework/TestFailure.php ÒNa'„qŸ¤%phpunit/Framework/SkippedTestCase.php„ ÒNa„¤lÇ]¤8phpunit/Framework/Exception/PHPTAssertionFailedError.php4 ÒNa4#M¤Sphpunit/Framework/Exception/ComparisonMethodDoesNotAcceptParameterTypeException.phpl ÒNal.~2ˆ¤5phpunit/Framework/Exception/SyntheticSkippedError.phpø ÒNaø£Ô—¤Ephpunit/Framework/Exception/ComparisonMethodDoesNotExistException.php0 ÒNa0}éšc¤+phpunit/Framework/Exception/OutputError.phpÊ ÒNaÊ©¢¤3phpunit/Framework/Exception/IncompleteTestError.phpÿ ÒNaÿגܤ5phpunit/Framework/Exception/CodeCoverageException.phpà ÒNaõ£[è¤.phpunit/Framework/Exception/RiskyTestError.phpÇ ÒNaÇ*Ãy¤%phpunit/Framework/Exception/Error.phpŠ ÒNaŠ‡j˜1¤0phpunit/Framework/Exception/SkippedTestError.phpù ÒNaù O~¤?phpunit/Framework/Exception/CoveredCodeNotExecutedException.phpØ ÒNaØ8YÉФ9phpunit/Framework/Exception/NoChildTestSuiteException.phpÍ ÒNaÍPÚ$¤'phpunit/Framework/Exception/Warning.phpŒ ÒNaŒð8;«¤Zphpunit/Framework/Exception/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php] ÒNa]Nès~¤:phpunit/Framework/Exception/ExpectationFailedException.phpÍ ÒNaÍÿgÓÙ¤5phpunit/Framework/Exception/SkippedTestSuiteError.phpþ ÒNaþx«Ž¤@phpunit/Framework/Exception/MissingCoversAnnotationException.phpÙ ÒNaÙ|î¤Aphpunit/Framework/Exception/ActualValueIsNotAnObjectException.php ÒNaÂi­Op¤.phpunit/Framework/Exception/SyntheticError.php5 ÒNa5K‡Y¤?phpunit/Framework/Exception/UnintentionallyCoveredCodeError.phpØ ÒNaؼ£¤<phpunit/Framework/Exception/InvalidDataProviderException.phpÐ ÒNaÐ.ڜɤ)phpunit/Framework/Exception/Exception.php² ÒNa² ·w¤4phpunit/Framework/Exception/AssertionFailedError.php“ ÒNa“ÓÂà¤Uphpunit/Framework/Exception/ComparisonMethodDoesNotDeclareBoolReturnTypeException.phpS ÒNaSzGt}¤<phpunit/Framework/Exception/InvalidCoversTargetException.phpÜ ÒNaÜo–苤Tphpunit/Framework/Exception/ComparisonMethodDoesNotDeclareParameterTypeException.php[ ÒNa[]Ý8A¤8phpunit/Framework/Exception/InvalidArgumentException.php  ÒNa À‹º¤&phpunit/Framework/Assert/Functions.phpa› ÒNaa›¸Æ¶¤phpunit/Framework/Test.php~ ÒNa~wýt¤phpunit/Framework/Assert.phppR ÒNapR4b„¤'phpunit/Framework/TestSuiteIterator.phpþ ÒNaþò¨”¬¤%phpunit/Framework/MockObject/Stub.php ÒNaÅŽ»¤*phpunit/Framework/MockObject/MockClass.phpÀ ÒNaÀó'Cµ¤)phpunit/Framework/MockObject/MockType.phpû ÒNaûFñFt¤8phpunit/Framework/MockObject/Builder/MethodNameMatch.phpw ÒNawáŽTy¤-phpunit/Framework/MockObject/Builder/Stub.php ÒNa‹®(¤:phpunit/Framework/MockObject/Builder/InvocationStubber.phpÔ ÒNaÔêËû¤1phpunit/Framework/MockObject/Builder/Identity.php’ ÒNa’¨×¤8phpunit/Framework/MockObject/Builder/ParametersMatch.phpî ÒNaîï Úƒ¤9phpunit/Framework/MockObject/Builder/InvocationMocker.php ÒNa ÊbK¤Lphpunit/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.phpº ÒNaºz®'ý¤Yphpunit/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php  ÒNa É…¢W¤Fphpunit/Framework/MockObject/Exception/ClassAlreadyExistsException.php± ÒNa±‰Ý¤Lphpunit/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php! ÒNa!$ÑÛ¤Kphpunit/Framework/MockObject/Exception/IncompatibleReturnValueException.php« ÒNa«ù8=¤Mphpunit/Framework/MockObject/Exception/SoapExtensionNotAvailableException.php¥ ÒNa¥©¿Šz¤Gphpunit/Framework/MockObject/Exception/CannotUseAddMethodsException.php5 ÒNa5ˆçƒ{¤Uphpunit/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.php ÒNa r€¤Hphpunit/Framework/MockObject/Exception/MatchBuilderNotFoundException.php ÒNa£¤¤Yphpunit/Framework/MockObject/Exception/OriginalConstructorInvocationRequiredException.php¶ ÒNa¶Ú©ûû¤?phpunit/Framework/MockObject/Exception/UnknownTypeException.php­ ÒNa­’~ùµ¤Hphpunit/Framework/MockObject/Exception/CannotUseOnlyMethodsException.phpE ÒNaEÀËî¤>phpunit/Framework/MockObject/Exception/ReflectionException.php ÒNa.Ø”¶¤@phpunit/Framework/MockObject/Exception/UnknownClassException.php« ÒNa«5uþW¤;phpunit/Framework/MockObject/Exception/RuntimeException.php÷ ÒNa÷ô¨_|¤Aphpunit/Framework/MockObject/Exception/BadMethodCallException.php ÒNaΫýX¤Ophpunit/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.php† ÒNa†ÓƤ4phpunit/Framework/MockObject/Exception/Exception.php ÒNaÂB¯Õ'¤@phpunit/Framework/MockObject/Exception/UnknownTraitException.php« ÒNa«qÂ¥—¤Lphpunit/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php ÒNa}Q¡ˆ¤Kphpunit/Framework/MockObject/Exception/MethodNameNotConfiguredException.php~ ÒNa~Þx1)¤Cphpunit/Framework/MockObject/Exception/DuplicateMethodException.php ÒNa«Éï_¤Ephpunit/Framework/MockObject/Exception/InvalidMethodNameException.php¼ ÒNa¼ ðÚܤ@phpunit/Framework/MockObject/Exception/ClassIsFinalException.phpÆ ÒNaƆ(¸)¤5phpunit/Framework/MockObject/Stub/ReturnReference.php  ÒNa œfÝû¤*phpunit/Framework/MockObject/Stub/Stub.php3 ÒNa3>+œ¤4phpunit/Framework/MockObject/Stub/ReturnValueMap.phpý ÒNaýößÛ¤4phpunit/Framework/MockObject/Stub/ReturnCallback.phpë ÒNaëD0Ó¤0phpunit/Framework/MockObject/Stub/ReturnSelf.php4 ÒNa4ìDD©¤/phpunit/Framework/MockObject/Stub/Exception.php( ÒNa(ŸJâ¤4phpunit/Framework/MockObject/Stub/ReturnArgument.php ÒNa?ð}6¤0phpunit/Framework/MockObject/Stub/ReturnStub.phpè ÒNa辶¤6phpunit/Framework/MockObject/Stub/ConsecutiveCalls.php  ÒNa þÊä.¤*phpunit/Framework/MockObject/Generator.phpw ÒNaw4Iɇ¤=phpunit/Framework/MockObject/Generator/mocked_method_void.tpl ÒNaßpç¤7phpunit/Framework/MockObject/Generator/mocked_class.tpl ÒNa‚wZ¤8phpunit/Framework/MockObject/Generator/mocked_method.tplF ÒNaFŒK¤6phpunit/Framework/MockObject/Generator/wsdl_method.tpl< ÒNa<¾Ði‰¤5phpunit/Framework/MockObject/Generator/wsdl_class.tplÍ ÒNaÍô’±¤9phpunit/Framework/MockObject/Generator/proxied_method.tpl} ÒNa}@üÄ—¤>phpunit/Framework/MockObject/Generator/proxied_method_void.tplv ÒNavÖÃT¤?phpunit/Framework/MockObject/Generator/mocked_static_method.tplî ÒNaî 4éR¤6phpunit/Framework/MockObject/Generator/trait_class.tplQ ÒNaQ÷<‹È¤6phpunit/Framework/MockObject/Generator/deprecation.tpl; ÒNa;O5øs¤,phpunit/Framework/MockObject/MockBuilder.php=+ ÒNa=+BÑ5ƒ¤.phpunit/Framework/MockObject/MockMethodSet.php8 ÒNa8G¶¤\¤+phpunit/Framework/MockObject/Invocation.php“ ÒNa“¥å ¤+phpunit/Framework/MockObject/MockMethod.php”) ÒNa”)ŒÞ™¤5phpunit/Framework/MockObject/MethodNameConstraint.php - ÒNa -ªA1|¤;phpunit/Framework/MockObject/Rule/ConsecutiveParameters.phpl ÒNal “z'%¤0phpunit/Framework/MockObject/Rule/MethodName.php‡ ÒNa‡Ç -WG¤4phpunit/Framework/MockObject/Rule/InvokedAtIndex.php) ÒNa)ßAžˆ¤3phpunit/Framework/MockObject/Rule/AnyParameters.phpû ÒNaû~'³¤5phpunit/Framework/MockObject/Rule/InvocationOrder.phpÈ ÒNaÈ’LDÓ¤8phpunit/Framework/MockObject/Rule/InvokedAtLeastOnce.php- ÒNa-… µ(¤8phpunit/Framework/MockObject/Rule/InvokedAtMostCount.php‹ ÒNa‹®gØY¤9phpunit/Framework/MockObject/Rule/InvokedAtLeastCount.php– ÒNa–ãBû¤5phpunit/Framework/MockObject/Rule/AnyInvokedCount.phpj ÒNaj¡ƒ`Ť4phpunit/Framework/MockObject/Rule/ParametersRule.phpc ÒNac?‘(¤2phpunit/Framework/MockObject/Rule/InvokedCount.php¦ ÒNa¦ ^¤ ¤0phpunit/Framework/MockObject/Rule/Parameters.phpQ ÒNaQ`g|¤¤*phpunit/Framework/MockObject/MockTrait.php† ÒNa†&¢nä3phpunit/Framework/MockObject/ConfigurableMethod.phpˆ ÒNaˆ¤+phpunit/Framework/MockObject/Verifiable.phpÌ ÒNaÌÌ s¤+phpunit/Framework/MockObject/Api/Method.php¿ ÒNa¿ÿ¡Ž¤(phpunit/Framework/MockObject/Api/Api.php° ÒNa° äsÆé¤6phpunit/Framework/MockObject/Api/MockedCloneMethod.php* ÒNa*íô?z¤8phpunit/Framework/MockObject/Api/UnmockedCloneMethod.phpG ÒNaGÒÓ©¤(phpunit/Framework/MockObject/Matcher.phpB ÒNaBâÇ*à¤2phpunit/Framework/MockObject/InvocationHandler.php: ÒNa:ô‰Æˤ+phpunit/Framework/MockObject/MockObject.php— ÒNa—ÍÜbt¤$phpunit/Framework/SelfDescribing.php - ÒNa -ÀÎÂs¤phpunit/Framework/TestCase.phpÂ" ÒNaÂ"`áq¤%phpunit/Framework/WarningTestCase.php$ ÒNa$ÐHÞ¤4phpunit/Framework/InvalidParameterGroupException.phpÒ ÒNaÒ†©€¤;phpunit/Framework/Constraint/Exception/ExceptionMessage.phpŸ ÒNaŸw;¤8phpunit/Framework/Constraint/Exception/ExceptionCode.phpÁ ÒNaÁiØ£¤Lphpunit/Framework/Constraint/Exception/ExceptionMessageRegularExpression.phpà ÒNaÃLj[i¤4phpunit/Framework/Constraint/Exception/Exception.php ÒNaRuž{¤8phpunit/Framework/Constraint/Operator/BinaryOperator.php) ÒNa)O¯®w¤4phpunit/Framework/Constraint/Operator/LogicalXor.php$ ÒNa$O¤4phpunit/Framework/Constraint/Operator/LogicalNot.phpº ÒNaº Óüý¤7phpunit/Framework/Constraint/Operator/UnaryOperator.php - ÒNa - „a¤2phpunit/Framework/Constraint/Operator/Operator.php& ÒNa&È Dܤ3phpunit/Framework/Constraint/Operator/LogicalOr.phpú ÒNaú·ÄøZ¤4phpunit/Framework/Constraint/Operator/LogicalAnd.php ÒNa˜bJ±¤6phpunit/Framework/Constraint/Filesystem/FileExists.phpe ÒNaeKô£¤6phpunit/Framework/Constraint/Filesystem/IsWritable.phpe ÒNae¾Ý¤;phpunit/Framework/Constraint/Filesystem/DirectoryExists.phpj ÒNajœi+¬¤6phpunit/Framework/Constraint/Filesystem/IsReadable.phpe ÒNae•ó1º¤/phpunit/Framework/Constraint/Boolean/IsTrue.php— ÒNa—‹­}¤0phpunit/Framework/Constraint/Boolean/IsFalse.phpš ÒNaš×ýµŠ¤?phpunit/Framework/Constraint/Equality/IsEqualCanonicalizing.php¨ - ÒNa¨ +¦¤8phpdocumentor-reflection-docblock/DocBlock/Tags/Var_.php p[c u:—Ú¤;phpdocumentor-reflection-docblock/DocBlock/Tags/Version.php¬ +p[c¬ +@S³±¤5phpdocumentor-reflection-docblock/DocBlockFactory.phpÖ$p[cÖ$³br¤>phpdocumentor-reflection-docblock/DocBlockFactoryInterface.php…p[c…)%ùߤ=phpdocumentor-reflection-docblock/Exception/PcreException.php™p[c™ èV¤)phpdocumentor-reflection-docblock/LICENSE8p[c8á‰Ê¤+phpdocumentor-reflection-docblock/Utils.php¾ p[c¾ -phpdocumentor-type-resolver/FqsenResolver.phpýp[cýjƒ²^¤#phpdocumentor-type-resolver/LICENSE8p[c8á‰Ê¤*phpdocumentor-type-resolver/PseudoType.phpup[cuœ]ú\¤:phpdocumentor-type-resolver/PseudoTypes/CallableString.php`p[c`Z‚¤2phpdocumentor-type-resolver/PseudoTypes/False_.php§p[c§¡o䈤=phpdocumentor-type-resolver/PseudoTypes/HtmlEscapedString.phpgp[cgÐãwe¤8phpdocumentor-type-resolver/PseudoTypes/IntegerRange.php%p[c%ô…¯R¤1phpdocumentor-type-resolver/PseudoTypes/List_.phpœp[cœªÃwu¤9phpdocumentor-type-resolver/PseudoTypes/LiteralString.php^p[c^=oNW¤;phpdocumentor-type-resolver/PseudoTypes/LowercaseString.phpbp[cb¦7 æ¤;phpdocumentor-type-resolver/PseudoTypes/NegativeInteger.php[p[c[DEÛ¤Cphpdocumentor-type-resolver/PseudoTypes/NonEmptyLowercaseString.phptp[ctõÃ)¤:phpdocumentor-type-resolver/PseudoTypes/NonEmptyString.phpap[ca²,¤9phpdocumentor-type-resolver/PseudoTypes/NumericString.php^p[c^ÌÃ8M¤4phpdocumentor-type-resolver/PseudoTypes/Numeric_.php÷p[c÷=šçk¤;phpdocumentor-type-resolver/PseudoTypes/PositiveInteger.php[p[c[ÜHǤ7phpdocumentor-type-resolver/PseudoTypes/TraitString.phpZp[cZ´g†C¤1phpdocumentor-type-resolver/PseudoTypes/True_.php£p[c£»l´¤$phpdocumentor-type-resolver/Type.phpÜp[cÜ’b¾&¤,phpdocumentor-type-resolver/TypeResolver.php%Up[c%UUðŒ­¤2phpdocumentor-type-resolver/Types/AbstractList.phptp[ctt»¤4phpdocumentor-type-resolver/Types/AggregatedType.phpÓ +p[cÓ +ôHɵ¤.phpdocumentor-type-resolver/Types/ArrayKey.phpœp[cœîºPĤ,phpdocumentor-type-resolver/Types/Array_.phpÕp[cÕø4¤-phpdocumentor-type-resolver/Types/Boolean.phpnp[cnrõĤ/phpdocumentor-type-resolver/Types/Callable_.php{p[c{ëE§ã¤1phpdocumentor-type-resolver/Types/ClassString.phpCp[cCrvyµ¤0phpdocumentor-type-resolver/Types/Collection.php p[c ?¬¼ÿ¤.phpdocumentor-type-resolver/Types/Compound.phpp[c>7¢¤-phpdocumentor-type-resolver/Types/Context.phpÌ p[cÌ º]ëZ¤4phpdocumentor-type-resolver/Types/ContextFactory.phpþ6p[cþ6ù´\¤0phpdocumentor-type-resolver/Types/Expression.php8p[c8’g¸ð¤,phpdocumentor-type-resolver/Types/Float_.phpmp[cm)J¤-phpdocumentor-type-resolver/Types/Integer.phpjp[cjœv£¤5phpdocumentor-type-resolver/Types/InterfaceString.php²p[c²Áùø¤2phpdocumentor-type-resolver/Types/Intersection.phpp[cUz$´¤/phpdocumentor-type-resolver/Types/Iterable_.php?p[c?úQ8¤,phpdocumentor-type-resolver/Types/Mixed_.php€p[c€3ši«¤,phpdocumentor-type-resolver/Types/Never_.phpp[c€j¤+phpdocumentor-type-resolver/Types/Null_.phpxp[cx”sú¤.phpdocumentor-type-resolver/Types/Nullable.phpRp[cRCp\¤-phpdocumentor-type-resolver/Types/Object_.phpèp[cèwEhN¤-phpdocumentor-type-resolver/Types/Parent_.phpäp[cäO!.¤/phpdocumentor-type-resolver/Types/Resource_.phpp[cÅžX¡¤,phpdocumentor-type-resolver/Types/Scalar.php´p[c´·ÅÁ¤+phpdocumentor-type-resolver/Types/Self_.phpÌp[cÌåoȤ-phpdocumentor-type-resolver/Types/Static_.phpp[cëèÉ8¤-phpdocumentor-type-resolver/Types/String_.phpsp[csåâüH¤*phpdocumentor-type-resolver/Types/This.phpYp[cY^?Öˆ¤+phpdocumentor-type-resolver/Types/Void_.phpp[ck¤phpspec-prophecy/LICENSE}p[c} ðߦ¤&phpspec-prophecy/Prophecy/Argument.php’p[c’ün¼¤8phpspec-prophecy/Prophecy/Argument/ArgumentsWildcard.phpY p[cY ¸0?Š¤:phpspec-prophecy/Prophecy/Argument/Token/AnyValueToken.phpÂp[cÂÍ{ƒÜ¤;phpspec-prophecy/Prophecy/Argument/Token/AnyValuesToken.phpñp[cñÃ'Þ`¤Bphpspec-prophecy/Prophecy/Argument/Token/ApproximateValueToken.php©p[c©‰ óð¤<phpspec-prophecy/Prophecy/Argument/Token/ArrayCountToken.phpõp[cõ»/*2¤<phpspec-prophecy/Prophecy/Argument/Token/ArrayEntryToken.php½p[c½¹‰‘¥¤Aphpspec-prophecy/Prophecy/Argument/Token/ArrayEveryEntryToken.phpÝp[cݲ‘ª#¤:phpspec-prophecy/Prophecy/Argument/Token/CallbackToken.phpp[cv¸þ¤<phpspec-prophecy/Prophecy/Argument/Token/ExactValueToken.phpÔ p[cÔ j\£¤@phpspec-prophecy/Prophecy/Argument/Token/IdenticalValueToken.phpúp[cúu`S…¤9phpspec-prophecy/Prophecy/Argument/Token/InArrayToken.phpép[céŠ?xn¤<phpspec-prophecy/Prophecy/Argument/Token/LogicalAndToken.phpDp[cD(bL‘¤<phpspec-prophecy/Prophecy/Argument/Token/LogicalNotToken.phpXp[cXÊ5)ð¤<phpspec-prophecy/Prophecy/Argument/Token/NotInArrayToken.phpñp[cñ;®¤=phpspec-prophecy/Prophecy/Argument/Token/ObjectStateToken.phpø p[cø ×ÛTá¤@phpspec-prophecy/Prophecy/Argument/Token/StringContainsToken.php-p[c-3xÖD¤;phpspec-prophecy/Prophecy/Argument/Token/TokenInterface.phpp[c(nGw¤6phpspec-prophecy/Prophecy/Argument/Token/TypeToken.php¢p[c¢’ú$¤'phpspec-prophecy/Prophecy/Call/Call.phpc p[cc ÚŸøJ¤-phpspec-prophecy/Prophecy/Call/CallCenter.phpàp[càÉ.í¤:phpspec-prophecy/Prophecy/Comparator/ClosureComparator.phpÛp[cÛ4†ý’¤0phpspec-prophecy/Prophecy/Comparator/Factory.phpp[c8! +Ô¤;phpspec-prophecy/Prophecy/Comparator/ProphecyComparator.phpœp[cœ^ß^¤3phpspec-prophecy/Prophecy/Doubler/CachedDoubler.phpƒp[cƒOd\¤Dphpspec-prophecy/Prophecy/Doubler/ClassPatch/ClassPatchInterface.phphp[chýq!ʤHphpspec-prophecy/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.phpòp[cò”‹Åã¤Cphpspec-prophecy/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.phpõp[cõ…9Ú¤=phpspec-prophecy/Prophecy/Doubler/ClassPatch/KeywordPatch.php p[c ’ª¤«¤?phpspec-prophecy/Prophecy/Doubler/ClassPatch/MagicCallPatch.phpÄ p[cÄ Q)š7¤Ephpspec-prophecy/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.phpý p[cý ç/äPphpspec-prophecy/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php‰p[c‰Æ¯Û¤Aphpspec-prophecy/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.phpi p[ci [§ê¢¤?phpspec-prophecy/Prophecy/Doubler/ClassPatch/ThrowablePatch.php p[c 83§û¤Aphpspec-prophecy/Prophecy/Doubler/ClassPatch/TraversablePatch.phpô p[cô Œwp¤5phpspec-prophecy/Prophecy/Doubler/DoubleInterface.phpáp[cáBÿÛ¤-phpspec-prophecy/Prophecy/Doubler/Doubler.php5p[c5¹ôú5¤Bphpspec-prophecy/Prophecy/Doubler/Generator/ClassCodeGenerator.phpé p[cé phpspec-prophecy/Prophecy/Doubler/Generator/Node/ClassNode.phpp[c"BË(¤?phpspec-prophecy/Prophecy/Doubler/Generator/Node/MethodNode.phpop[což}-¤Cphpspec-prophecy/Prophecy/Doubler/Generator/Node/ReturnTypeNode.phpp[c,®X;¤Ephpspec-prophecy/Prophecy/Doubler/Generator/Node/TypeNodeAbstract.phpÚ p[cÚ ¬‰°¾¤Cphpspec-prophecy/Prophecy/Doubler/Generator/ReflectionInterface.phpñp[cñ Y¤Aphpspec-prophecy/Prophecy/Doubler/Generator/TypeHintReference.php–p[c–°ÿi¶¤0phpspec-prophecy/Prophecy/Doubler/LazyDouble.phpÎ p[cÎ ¾äÙ¤3phpspec-prophecy/Prophecy/Doubler/NameGenerator.php‰p[c‰¬Öd´¤Dphpspec-prophecy/Prophecy/Exception/Call/UnexpectedCallException.php°p[c°èª}â¤Ephpspec-prophecy/Prophecy/Exception/Doubler/ClassCreatorException.phpÌp[cÌr™çý¤Dphpspec-prophecy/Prophecy/Exception/Doubler/ClassMirrorException.phpÁp[cÁb¤Fphpspec-prophecy/Prophecy/Exception/Doubler/ClassNotFoundException.phpÝp[cÝï>Âí¤?phpspec-prophecy/Prophecy/Exception/Doubler/DoubleException.phpÃp[cÃV”"^¤@phpspec-prophecy/Prophecy/Exception/Doubler/DoublerException.php•p[c•hîú¤Jphpspec-prophecy/Prophecy/Exception/Doubler/InterfaceNotFoundException.phpûp[cû&¾q¤Lphpspec-prophecy/Prophecy/Exception/Doubler/MethodNotExtendableException.phpÝp[cÝÐã[–¤Gphpspec-prophecy/Prophecy/Exception/Doubler/MethodNotFoundException.php÷p[c÷æe:°¤Jphpspec-prophecy/Prophecy/Exception/Doubler/ReturnByReferenceException.php£p[c£0+5,¤1phpspec-prophecy/Prophecy/Exception/Exception.phpõp[cõxò•¤@phpspec-prophecy/Prophecy/Exception/InvalidArgumentException.php¨p[c¨õ󱙤Ephpspec-prophecy/Prophecy/Exception/Prediction/AggregateException.php8p[c8 ¹.Ú¤Lphpspec-prophecy/Prophecy/Exception/Prediction/FailedPredictionException.phpgp[cg3'}}¤Cphpspec-prophecy/Prophecy/Exception/Prediction/NoCallsException.php÷p[c÷ò½½Z¤Fphpspec-prophecy/Prophecy/Exception/Prediction/PredictionException.php›p[c›R2ìͤPphpspec-prophecy/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php#p[c#þªÝߤKphpspec-prophecy/Prophecy/Exception/Prediction/UnexpectedCallsException.phpFp[cFà|‚b¤Hphpspec-prophecy/Prophecy/Exception/Prophecy/MethodProphecyException.phpAp[cA’‚Ãc¤Hphpspec-prophecy/Prophecy/Exception/Prophecy/ObjectProphecyException.php2p[c2øŒËe¤Bphpspec-prophecy/Prophecy/Exception/Prophecy/ProphecyException.php—p[c—D¬7j¤Iphpspec-prophecy/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php¸p[c¸—ŠùƤ=phpspec-prophecy/Prophecy/PhpDocumentor/ClassTagRetriever.phpÿp[cÿ@¿Ž%¤Cphpspec-prophecy/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php”p[c”|6õ¤Gphpspec-prophecy/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.phpíp[cí®’³1¤7phpspec-prophecy/Prophecy/Prediction/CallPrediction.phpZp[cZ%…÷U¤<phpspec-prophecy/Prophecy/Prediction/CallTimesPrediction.phpÇ +p[cÇ +#c©¤;phpspec-prophecy/Prophecy/Prediction/CallbackPrediction.phpÒp[cÒ~Ï*»¤:phpspec-prophecy/Prophecy/Prediction/NoCallsPrediction.php‡p[c‡˜Ü¼ò¤<phpspec-prophecy/Prophecy/Prediction/PredictionInterface.phpp[cávñ¤5phpspec-prophecy/Prophecy/Promise/CallbackPromise.phpÉp[cÉÔŒòÓ¤6phpspec-prophecy/Prophecy/Promise/PromiseInterface.phpIp[cIyv²¤;phpspec-prophecy/Prophecy/Promise/ReturnArgumentPromise.php +p[c +¤,Ôs¤3phpspec-prophecy/Prophecy/Promise/ReturnPromise.php%p[c%•¦¾&¤2phpspec-prophecy/Prophecy/Promise/ThrowPromise.php% p[c% ›Q3¤5phpspec-prophecy/Prophecy/Prophecy/MethodProphecy.php29p[c29SÑȤ5phpspec-prophecy/Prophecy/Prophecy/ObjectProphecy.phpÚp[cÚŸð#=¤8phpspec-prophecy/Prophecy/Prophecy/ProphecyInterface.php+p[c+´ãXì¤?phpspec-prophecy/Prophecy/Prophecy/ProphecySubjectInterface.phpðp[cð<¤/phpspec-prophecy/Prophecy/Prophecy/Revealer.phpµp[cµ ”m€¤8phpspec-prophecy/Prophecy/Prophecy/RevealerInterface.phpGp[cG§WnZ¤%phpspec-prophecy/Prophecy/Prophet.phpEp[cE³:.b¤-phpspec-prophecy/Prophecy/Util/ExportUtil.phpdp[cd/ü,¤-phpspec-prophecy/Prophecy/Util/StringUtil.phpŽ +p[cŽ +S‚–¤ phpunit.xsdDFp[cDFûùs|¤phpunit/Exception.php­p[c­aµ•#¤phpunit/Framework/Assert.php˜Rp[c˜R6ë’¤&phpunit/Framework/Assert/Functions.phpäšp[cäš lO•¤0phpunit/Framework/Constraint/Boolean/IsFalse.phpšp[cš×ýµŠ¤/phpunit/Framework/Constraint/Boolean/IsTrue.php—p[c—‹­}¤)phpunit/Framework/Constraint/Callback.php?p[c?ù +¼b¤2phpunit/Framework/Constraint/Cardinality/Count.phpj p[cj xR@ؤ8phpunit/Framework/Constraint/Cardinality/GreaterThan.phpãp[cãh,d}¤4phpunit/Framework/Constraint/Cardinality/IsEmpty.php¾p[c¾¥hfà¤5phpunit/Framework/Constraint/Cardinality/LessThan.phpÝp[cÝa ýT¤5phpunit/Framework/Constraint/Cardinality/SameSize.php_p[c_uáËŤ+phpunit/Framework/Constraint/Constraint.phpk"p[ck"§@Ƥ1phpunit/Framework/Constraint/Equality/IsEqual.phpÎ p[cÎ éÀÓ¤?phpunit/Framework/Constraint/Equality/IsEqualCanonicalizing.php¨ +p[c¨ ¶~á¤=phpunit/Framework/Constraint/Equality/IsEqualIgnoringCase.php¦ - ÒNa¦ +p[c¦ ì±C\¤:phpunit/Framework/Constraint/Equality/IsEqualWithDelta.php - ÒNa -•É6Œ¤1phpunit/Framework/Constraint/Equality/IsEqual.phpÎ ÒNaÎ éÀÓ¤)phpunit/Framework/Constraint/Callback.php? ÒNa?ù -¼b¤+phpunit/Framework/Constraint/IsAnything.php† ÒNa†€E•¸¤+phpunit/Framework/Constraint/Math/IsNan.php¨ ÒNa¨4Ïg0¤.phpunit/Framework/Constraint/Math/IsFinite.php´ ÒNa´ZÒ—ã¤0phpunit/Framework/Constraint/Math/IsInfinite.php¼ ÒNa¼'*~‘¤2phpunit/Framework/Constraint/Cardinality/Count.phpj ÒNaj xR@ؤ8phpunit/Framework/Constraint/Cardinality/GreaterThan.phpã ÒNaãh,d}¤4phpunit/Framework/Constraint/Cardinality/IsEmpty.php¾ ÒNa¾¥hfà¤5phpunit/Framework/Constraint/Cardinality/LessThan.phpÝ ÒNaÝa ýT¤5phpunit/Framework/Constraint/Cardinality/SameSize.php_ ÒNa_uáËŤ,phpunit/Framework/Constraint/IsIdentical.php€ ÒNa€îOˆ°¤4phpunit/Framework/Constraint/Object/ObjectEquals.php - ÒNa -0ÒW¤:phpunit/Framework/Constraint/Object/ObjectHasAttribute.php[ ÒNa[F÷ƒm¤9phpunit/Framework/Constraint/Object/ClassHasAttribute.phpn ÒNan9“Ð<¤?phpunit/Framework/Constraint/Object/ClassHasStaticAttribute.phpå ÒNaådRõ¤8phpunit/Framework/Constraint/Traversable/ArrayHasKey.php¾ ÒNa¾6¸@!¤Iphpunit/Framework/Constraint/Traversable/TraversableContainsIdentical.php' ÒNa's‡‘Ó¤@phpunit/Framework/Constraint/Traversable/TraversableContains.php ÒNa™¼½ç¤Ephpunit/Framework/Constraint/Traversable/TraversableContainsEqual.phpa ÒNaaw«A­¤Dphpunit/Framework/Constraint/Traversable/TraversableContainsOnly.php ÒNa R‰uФ+phpunit/Framework/Constraint/Constraint.phpc" ÒNac"€eø@¤@phpunit/Framework/Constraint/JsonMatchesErrorMessageProvider.php; ÒNa;éत,phpunit/Framework/Constraint/JsonMatches.phpz ÒNaz '÷R­¤Fphpunit/Framework/Constraint/String/StringMatchesFormatDescription.php¾ - ÒNa¾ -1öñè¤.phpunit/Framework/Constraint/String/IsJson.php ÒNa´\@¤8phpunit/Framework/Constraint/String/StringStartsWith.phpB ÒNaB›¨ß¤6phpunit/Framework/Constraint/String/StringContains.phpÕ ÒNaÕij"„¤9phpunit/Framework/Constraint/String/RegularExpression.php¥ ÒNa¥+±J±¤6phpunit/Framework/Constraint/String/StringEndsWith.php£ ÒNa£{Š´¤,phpunit/Framework/Constraint/Type/IsNull.php– ÒNa–ª½?)¤,phpunit/Framework/Constraint/Type/IsType.phpŒ ÒNaŒGïÏȤ2phpunit/Framework/Constraint/Type/IsInstanceOf.php: ÒNa:ç@¿¤.phpunit/Framework/ExecutionOrderDependency.php ÒNaR-ª ¤"phpunit/Framework/TestListener.phpÈ ÒNaÈ ×b¤!phpunit/Framework/TestBuilder.php" ÒNa"©14j¤ phpunit/Framework/TestResult.phpC| ÒNaC|d$´ü¤!phpunit/Framework/Reorderable.php‹ ÒNa‹¼zš0¤7phpunit/Framework/TestListenerDefaultImplementation.php$ ÒNa$·Cÿ‚¤!phpunit/Framework/Error/Error.phpl ÒNal¸‰Ö]¤#phpunit/Framework/Error/Warning.phpw ÒNawÙãG¤&phpunit/Framework/Error/Deprecated.phpz ÒNazñàV¤"phpunit/Framework/Error/Notice.phpv ÒNav¯úÂˤ&phpunit/Framework/ExceptionWrapper.php¥ ÒNa¥ ÒÁÝm¤(phpunit/Framework/IncompleteTestCase.phpŠ ÒNaŠœ±I ¤phpunit/Exception.php­ ÒNa­aµ•#¤sebastian-exporter/Exporter.phpy" ÒNay"­OϤsebastian-exporter/LICENSE ÒNa螷ͤphp-file-iterator/Facade.php* - ÒNa* -Í Kº¤php-file-iterator/Factory.phpÜ ÒNaÜ{‡0Ô¤php-file-iterator/Iterator.phpZ ÒNaZ CÜŽ¤php-file-iterator/LICENSE ÒNaŽ†.¤/phpspec-prophecy/Prophecy/Prophecy/Revealer.phpµ ÒNaµ ”m€¤5phpspec-prophecy/Prophecy/Prophecy/MethodProphecy.php29 ÒNa29SÑȤ8phpspec-prophecy/Prophecy/Prophecy/RevealerInterface.phpG ÒNaG§WnZ¤?phpspec-prophecy/Prophecy/Prophecy/ProphecySubjectInterface.phpð ÒNað<¤8phpspec-prophecy/Prophecy/Prophecy/ProphecyInterface.php+ ÒNa+´ãXì¤5phpspec-prophecy/Prophecy/Prophecy/ObjectProphecy.phpÚ ÒNaÚŸð#=¤&phpspec-prophecy/Prophecy/Argument.php’ ÒNa’ün¼¤-phpspec-prophecy/Prophecy/Util/StringUtil.phpŽ - ÒNaŽ -S‚–¤-phpspec-prophecy/Prophecy/Util/ExportUtil.phpb ÒNab¨íô¤Bphpspec-prophecy/Prophecy/Exception/Prophecy/ProphecyException.php— ÒNa—D¬7j¤Hphpspec-prophecy/Prophecy/Exception/Prophecy/MethodProphecyException.phpA ÒNaA’‚Ãc¤Hphpspec-prophecy/Prophecy/Exception/Prophecy/ObjectProphecyException.php2 ÒNa2øŒËe¤Pphpspec-prophecy/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php# ÒNa#þªÝߤKphpspec-prophecy/Prophecy/Exception/Prediction/UnexpectedCallsException.phpF ÒNaFà|‚b¤Lphpspec-prophecy/Prophecy/Exception/Prediction/FailedPredictionException.phpg ÒNag3'}}¤Ephpspec-prophecy/Prophecy/Exception/Prediction/AggregateException.php8 ÒNa8 ¹.Ú¤Cphpspec-prophecy/Prophecy/Exception/Prediction/NoCallsException.php÷ ÒNa÷ò½½Z¤Fphpspec-prophecy/Prophecy/Exception/Prediction/PredictionException.php› ÒNa›R2ìͤDphpspec-prophecy/Prophecy/Exception/Call/UnexpectedCallException.php° ÒNa°èª}â¤1phpspec-prophecy/Prophecy/Exception/Exception.phpõ ÒNaõxò•¤Gphpspec-prophecy/Prophecy/Exception/Doubler/MethodNotFoundException.php÷ ÒNa÷æe:°¤Fphpspec-prophecy/Prophecy/Exception/Doubler/ClassNotFoundException.phpÝ ÒNaÝï>Âí¤Dphpspec-prophecy/Prophecy/Exception/Doubler/ClassMirrorException.phpÁ ÒNaÁb¤@phpspec-prophecy/Prophecy/Exception/Doubler/DoublerException.php• ÒNa•hîú¤Jphpspec-prophecy/Prophecy/Exception/Doubler/InterfaceNotFoundException.phpû ÒNaû&¾q¤Jphpspec-prophecy/Prophecy/Exception/Doubler/ReturnByReferenceException.php£ ÒNa£0+5,¤Lphpspec-prophecy/Prophecy/Exception/Doubler/MethodNotExtendableException.phpÝ ÒNaÝÐã[–¤?phpspec-prophecy/Prophecy/Exception/Doubler/DoubleException.phpà ÒNaÃV”"^¤Ephpspec-prophecy/Prophecy/Exception/Doubler/ClassCreatorException.phpÌ ÒNaÌr™çý¤@phpspec-prophecy/Prophecy/Exception/InvalidArgumentException.php¨ ÒNa¨õ󱙤6phpspec-prophecy/Prophecy/Promise/PromiseInterface.phpI ÒNaIyv²¤2phpspec-prophecy/Prophecy/Promise/ThrowPromise.php% ÒNa% ›Q3¤3phpspec-prophecy/Prophecy/Promise/ReturnPromise.php% ÒNa%•¦¾&¤;phpspec-prophecy/Prophecy/Promise/ReturnArgumentPromise.php - ÒNa -¤,Ôs¤5phpspec-prophecy/Prophecy/Promise/CallbackPromise.phpÉ ÒNaÉÔŒòÓ¤;phpspec-prophecy/Prophecy/Prediction/CallbackPrediction.phpÒ ÒNaÒ~Ï*»¤7phpspec-prophecy/Prophecy/Prediction/CallPrediction.phpZ ÒNaZ%…÷U¤<phpspec-prophecy/Prophecy/Prediction/CallTimesPrediction.phpÇ - ÒNaÇ -#c©¤<phpspec-prophecy/Prophecy/Prediction/PredictionInterface.php ÒNaávñ¤:phpspec-prophecy/Prophecy/Prediction/NoCallsPrediction.php‡ ÒNa‡˜Ü¼ò¤Cphpspec-prophecy/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php” ÒNa”|6õ¤Gphpspec-prophecy/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.phpí ÒNaí®’³1¤=phpspec-prophecy/Prophecy/PhpDocumentor/ClassTagRetriever.phpÿ ÒNaÿ@¿Ž%¤Iphpspec-prophecy/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php¸ ÒNa¸—ŠùƤ-phpspec-prophecy/Prophecy/Call/CallCenter.phpà ÒNaàÉ.í¤'phpspec-prophecy/Prophecy/Call/Call.phpc ÒNac ÚŸøJ¤;phpspec-prophecy/Prophecy/Comparator/ProphecyComparator.php| ÒNa|©bë¤0phpspec-prophecy/Prophecy/Comparator/Factory.php ÒNa8! -Ô¤:phpspec-prophecy/Prophecy/Comparator/ClosureComparator.phpÍ ÒNaÍWý–p¤%phpspec-prophecy/Prophecy/Prophet.phpE ÒNaE³:.b¤3phpspec-prophecy/Prophecy/Doubler/NameGenerator.php‰ ÒNa‰¬Öd´¤0phpspec-prophecy/Prophecy/Doubler/LazyDouble.phpÎ ÒNaÎ ¾äÙ¤3phpspec-prophecy/Prophecy/Doubler/CachedDoubler.phpƒ ÒNaƒOd\¤5phpspec-prophecy/Prophecy/Doubler/DoubleInterface.phpá ÒNaáBÿÛ¤Aphpspec-prophecy/Prophecy/Doubler/Generator/TypeHintReference.php– ÒNa–°ÿi¶¤Bphpspec-prophecy/Prophecy/Doubler/Generator/ClassCodeGenerator.phpé ÒNaé phpspec-prophecy/Prophecy/Doubler/Generator/Node/ClassNode.php ÒNa"BË(¤?phpspec-prophecy/Prophecy/Doubler/Generator/Node/MethodNode.phpo ÒNaož}-¤Aphpspec-prophecy/Prophecy/Doubler/Generator/Node/ArgumentNode.phpz ÒNaz C¢ºi¤;phpspec-prophecy/Prophecy/Doubler/Generator/ClassMirror.phpª ÒNaª«Èçt¤Cphpspec-prophecy/Prophecy/Doubler/Generator/ReflectionInterface.phpñ ÒNañ Y¤-phpspec-prophecy/Prophecy/Doubler/Doubler.php5 ÒNa5¹ôú5¤?phpspec-prophecy/Prophecy/Doubler/ClassPatch/ThrowablePatch.php ÒNa 83§û¤Hphpspec-prophecy/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.phpò ÒNaò”‹Åã¤?phpspec-prophecy/Prophecy/Doubler/ClassPatch/MagicCallPatch.phpÄ ÒNaÄ Q)š7¤Dphpspec-prophecy/Prophecy/Doubler/ClassPatch/ClassPatchInterface.phph ÒNahýq!ʤEphpspec-prophecy/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.phpý ÒNaý ç/äAphpspec-prophecy/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.phpi ÒNai [§ê¢¤=phpspec-prophecy/Prophecy/Doubler/ClassPatch/KeywordPatch.php  ÒNa ’ª¤«¤Cphpspec-prophecy/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.phpì ÒNaìÑé›·¤Aphpspec-prophecy/Prophecy/Doubler/ClassPatch/TraversablePatch.phpô ÒNaô Œwp¤Pphpspec-prophecy/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php‰ ÒNa‰Æ¯Û¤<phpspec-prophecy/Prophecy/Argument/Token/LogicalNotToken.phpX ÒNaXÊ5)ð¤Aphpspec-prophecy/Prophecy/Argument/Token/ArrayEveryEntryToken.phpÝ ÒNaݲ‘ª#¤<phpspec-prophecy/Prophecy/Argument/Token/LogicalAndToken.phpD ÒNaD(bL‘¤<phpspec-prophecy/Prophecy/Argument/Token/ArrayEntryToken.php½ ÒNa½¹‰‘¥¤<phpspec-prophecy/Prophecy/Argument/Token/NotInArrayToken.phpñ ÒNañ;®¤@phpspec-prophecy/Prophecy/Argument/Token/IdenticalValueToken.phpú ÒNaúu`S…¤6phpspec-prophecy/Prophecy/Argument/Token/TypeToken.php¢ ÒNa¢’ú$¤=phpspec-prophecy/Prophecy/Argument/Token/ObjectStateToken.phpø ÒNaø ×ÛTá¤9phpspec-prophecy/Prophecy/Argument/Token/InArrayToken.phpé ÒNaéŠ?xn¤:phpspec-prophecy/Prophecy/Argument/Token/AnyValueToken.php ÒNaÂÍ{ƒÜ¤Bphpspec-prophecy/Prophecy/Argument/Token/ApproximateValueToken.php© ÒNa©‰ óð¤;phpspec-prophecy/Prophecy/Argument/Token/AnyValuesToken.phpñ ÒNañÃ'Þ`¤<phpspec-prophecy/Prophecy/Argument/Token/ExactValueToken.phpÔ ÒNaÔ j\£¤<phpspec-prophecy/Prophecy/Argument/Token/ArrayCountToken.phpõ ÒNaõ»/*2¤@phpspec-prophecy/Prophecy/Argument/Token/StringContainsToken.php- ÒNa-3xÖD¤;phpspec-prophecy/Prophecy/Argument/Token/TokenInterface.php ÒNa(nGw¤:phpspec-prophecy/Prophecy/Argument/Token/CallbackToken.php ÒNav¸þ¤8phpspec-prophecy/Prophecy/Argument/ArgumentsWildcard.phpY ÒNaY ¸0?Š¤phpspec-prophecy/LICENSE} ÒNa} ðߦ¤/sebastian-diff/Output/DiffOnlyOutputBuilder.phpz ÒNazc·ò¤4sebastian-diff/Output/DiffOutputBuilderInterface.php ÒNaVŽáå¤2sebastian-diff/Output/UnifiedDiffOutputBuilder.php> ÒNa>'q)¤8sebastian-diff/Output/StrictUnifiedDiffOutputBuilder.phpŠ( ÒNaŠ(kvƒ¤4sebastian-diff/Output/AbstractChunkOutputBuilder.phpö ÒNaö˜ù\t¤3sebastian-diff/Exception/ConfigurationException.php= ÒNa=1/Ff¤&sebastian-diff/Exception/Exception.phpj ÒNajÚ0îå¤5sebastian-diff/Exception/InvalidArgumentException.php‹ ÒNa‹qÁ«¤Bsebastian-diff/TimeEfficientLongestCommonSubsequenceCalculator.phpõ ÒNaõæ¬tÙ¤Dsebastian-diff/MemoryEfficientLongestCommonSubsequenceCalculator.phpŸ ÒNaŸ9ù š¤sebastian-diff/Chunk.php_ ÒNa_ÖÛv€¤sebastian-diff/Diff.phpj ÒNajbXØA¤5sebastian-diff/LongestCommonSubsequenceCalculator.phpñ ÒNañ}e7z¤sebastian-diff/Differ.php$ ÒNa$]©ÜE¤sebastian-diff/Parser.phpš ÒNaš °åX{¤sebastian-diff/Line.phpL ÒNaL -óq¤sebastian-diff/LICENSE  ÒNa a¸©1¤theseer-tokenizer/Token.php– ÒNa–4ê†ã¤theseer-tokenizer/Tokenizer.phpþ - ÒNaþ -z’l¬¤+theseer-tokenizer/NamespaceUriException.phpy ÒNay'Heå¤.theseer-tokenizer/TokenCollectionException.php| ÒNa|`g«-¤theseer-tokenizer/Exception.phpn ÒNan¹'Ǥ#theseer-tokenizer/XMLSerializer.phpè ÒNaè–g; ¤"theseer-tokenizer/NamespaceUri.phpH ÒNaHê=C«¤theseer-tokenizer/LICENSEü ÒNaüïR (¤%theseer-tokenizer/TokenCollection.php - ÒNa -ž¾aà¤object-enumerator/LICENSE ÒNa×y{¤-sebastian-code-unit-reverse-lookup/Wizard.phpÞ ÒNaÞ }Z[¤*sebastian-code-unit-reverse-lookup/LICENSE ÒNa3G (¤'sebastian-recursion-context/Context.phpÝ ÒNaÝ`Mm¤)sebastian-recursion-context/Exception.php… ÒNa…PFA¤#sebastian-recursion-context/LICENSE ÒNa`Äó¤8sebastian-recursion-context/InvalidArgumentException.php¬ ÒNa¬b×21¤phpunit/Framework/MockObject/Exception/ReflectionException.phpp[c.Ø”¶¤Lphpunit/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php6p[c6?먙¤;phpunit/Framework/MockObject/Exception/RuntimeException.php÷p[c÷ô¨_|¤Mphpunit/Framework/MockObject/Exception/SoapExtensionNotAvailableException.php¥p[c¥©¿Šz¤@phpunit/Framework/MockObject/Exception/UnknownClassException.php«p[c«5uþW¤@phpunit/Framework/MockObject/Exception/UnknownTraitException.php«p[c«qÂ¥—¤?phpunit/Framework/MockObject/Exception/UnknownTypeException.php­p[c­’~ùµ¤*phpunit/Framework/MockObject/Generator.phpˆp[cˆäiƤ6phpunit/Framework/MockObject/Generator/deprecation.tpl;p[c;O5øs¤7phpunit/Framework/MockObject/Generator/intersection.tplLp[cL®Ž-X¤7phpunit/Framework/MockObject/Generator/mocked_class.tplp[c‚wZ¤8phpunit/Framework/MockObject/Generator/mocked_method.tplFp[cFŒK¤Fphpunit/Framework/MockObject/Generator/mocked_method_never_or_void.tplp[cßpç¤?phpunit/Framework/MockObject/Generator/mocked_static_method.tplîp[cî 4éR¤9phpunit/Framework/MockObject/Generator/proxied_method.tpl}p[c}@üÄ—¤Gphpunit/Framework/MockObject/Generator/proxied_method_never_or_void.tplvp[cvÖÃT¤6phpunit/Framework/MockObject/Generator/trait_class.tplQp[cQ÷<‹È¤5phpunit/Framework/MockObject/Generator/wsdl_class.tplÍp[cÍô’±¤6phpunit/Framework/MockObject/Generator/wsdl_method.tpl<p[c<¾Ði‰¤+phpunit/Framework/MockObject/Invocation.php›p[c›idô»¤2phpunit/Framework/MockObject/InvocationHandler.php:p[c:ô‰Æˤ(phpunit/Framework/MockObject/Matcher.phpëp[cë¡DË-¤5phpunit/Framework/MockObject/MethodNameConstraint.php +p[c +ªA1|¤,phpunit/Framework/MockObject/MockBuilder.php=+p[c=+BÑ5ƒ¤*phpunit/Framework/MockObject/MockClass.phpÀp[cÀó'Cµ¤+phpunit/Framework/MockObject/MockMethod.php†&p[c†&[ù(·¤.phpunit/Framework/MockObject/MockMethodSet.php8p[c8G¶¤\¤+phpunit/Framework/MockObject/MockObject.php—p[c—ÍÜbt¤*phpunit/Framework/MockObject/MockTrait.php†p[c†&¢nä)phpunit/Framework/MockObject/MockType.phpûp[cûFñFt¤5phpunit/Framework/MockObject/Rule/AnyInvokedCount.phpjp[cj¡ƒ`Ť3phpunit/Framework/MockObject/Rule/AnyParameters.phpûp[cû~'³¤;phpunit/Framework/MockObject/Rule/ConsecutiveParameters.phpl p[cl “z'%¤5phpunit/Framework/MockObject/Rule/InvocationOrder.phpÈp[cÈ’LDÓ¤4phpunit/Framework/MockObject/Rule/InvokedAtIndex.php,p[c,kK»‘¤9phpunit/Framework/MockObject/Rule/InvokedAtLeastCount.php–p[c–ãBû¤8phpunit/Framework/MockObject/Rule/InvokedAtLeastOnce.php-p[c-… µ(¤8phpunit/Framework/MockObject/Rule/InvokedAtMostCount.php‹p[c‹®gØY¤2phpunit/Framework/MockObject/Rule/InvokedCount.php¦ p[c¦ ^¤ ¤0phpunit/Framework/MockObject/Rule/MethodName.php‡p[c‡Ç +WG¤0phpunit/Framework/MockObject/Rule/Parameters.phpQp[cQ`g|¤¤4phpunit/Framework/MockObject/Rule/ParametersRule.phpcp[cc?‘(¤%phpunit/Framework/MockObject/Stub.phpp[cÅŽ»¤6phpunit/Framework/MockObject/Stub/ConsecutiveCalls.php p[c þÊä.¤/phpunit/Framework/MockObject/Stub/Exception.php(p[c(ŸJâ¤4phpunit/Framework/MockObject/Stub/ReturnArgument.phpp[c?ð}6¤4phpunit/Framework/MockObject/Stub/ReturnCallback.phpëp[cëD0Ó¤5phpunit/Framework/MockObject/Stub/ReturnReference.php p[c œfÝû¤0phpunit/Framework/MockObject/Stub/ReturnSelf.php4p[c4ìDD©¤0phpunit/Framework/MockObject/Stub/ReturnStub.phpèp[c辶¤4phpunit/Framework/MockObject/Stub/ReturnValueMap.phpýp[cýößÛ¤*phpunit/Framework/MockObject/Stub/Stub.php3p[c3>+œ¤+phpunit/Framework/MockObject/Verifiable.phpÌp[cÌÌ s¤!phpunit/Framework/Reorderable.php‹p[c‹¼zš0¤$phpunit/Framework/SelfDescribing.php +p[c +ÀÎÂs¤!phpunit/Framework/SkippedTest.php¹p[c¹S±.¤%phpunit/Framework/SkippedTestCase.php„p[c„¤lÇ]¤phpunit/Framework/Test.php~p[c~wýt¤!phpunit/Framework/TestBuilder.php"p[c"©14j¤phpunit/Framework/TestCase.php $p[c $ÆŒh¤!phpunit/Framework/TestFailure.phpp[c'„qŸ¤"phpunit/Framework/TestListener.phprp[crÓªc^¤7phpunit/Framework/TestListenerDefaultImplementation.php'p[c'Å!Ìñ¤ phpunit/Framework/TestResult.phpð~p[cð~Ö‚t¤phpunit/Framework/TestSuite.php)cp[c)cwe:ä'phpunit/Framework/TestSuiteIterator.phpþp[cþò¨”¬¤%phpunit/Framework/WarningTestCase.php$p[c$ÐHÞ¤!phpunit/Runner/BaseTestRunner.phpÀ p[cÀ C +¤)phpunit/Runner/DefaultTestResultCache.php!p[c!/i^´¤phpunit/Runner/Exception.phpâp[câzZÖ¤-phpunit/Runner/Extension/ExtensionHandler.php‰ p[c‰ ¢+1 ¤'phpunit/Runner/Extension/PharLoader.phpð p[cð Øcñ¤4phpunit/Runner/Filter/ExcludeGroupFilterIterator.phpsp[cs} +Z¤!phpunit/Runner/Filter/Factory.php®p[c®d€cΤ-phpunit/Runner/Filter/GroupFilterIterator.php¬p[c¬™=¢;¤4phpunit/Runner/Filter/IncludeGroupFilterIterator.phprp[crP;AD¤,phpunit/Runner/Filter/NameFilterIterator.phpv p[cv ­Z³¤/phpunit/Runner/Hook/AfterIncompleteTestHook.php-p[c-ÀzÔ¤)phpunit/Runner/Hook/AfterLastTestHook.phpóp[có0B­Ö¤*phpunit/Runner/Hook/AfterRiskyTestHook.php#p[c#ûdm¤,phpunit/Runner/Hook/AfterSkippedTestHook.php'p[c'±üÓ:¤/phpunit/Runner/Hook/AfterSuccessfulTestHook.phpp[c¾5Îw¤*phpunit/Runner/Hook/AfterTestErrorHook.php#p[c#Ý®´ä¤,phpunit/Runner/Hook/AfterTestFailureHook.php'p[c'¾2F¤%phpunit/Runner/Hook/AfterTestHook.phpÑp[cÑ;gA¤,phpunit/Runner/Hook/AfterTestWarningHook.php'p[c''»:¤+phpunit/Runner/Hook/BeforeFirstTestHook.php÷p[c÷hWŒt¤&phpunit/Runner/Hook/BeforeTestHook.phpýp[cý"§b’¤phpunit/Runner/Hook/Hook.php–p[c–©.¤ phpunit/Runner/Hook/TestHook.php·p[c·ÆZ_ +¤+phpunit/Runner/Hook/TestListenerAdapter.phpÇp[cÇ\î6E¤&phpunit/Runner/NullTestResultCache.php™p[c™¾W<ª¤phpunit/Runner/PhptTestCase.php\Vp[c\V†Ç™¤'phpunit/Runner/ResultCacheExtension.php<p[c<–6 _¤*phpunit/Runner/StandardTestSuiteLoader.php¡ p[c¡ ¶§Hm¤"phpunit/Runner/TestResultCache.phpÕp[cÕÏK¤"phpunit/Runner/TestSuiteLoader.php˜p[c˜›¥ÐÞ¤"phpunit/Runner/TestSuiteSorter.php¦,p[c¦,ÇkÚ¤phpunit/Runner/Version.phpp[cÈ„Q¤'phpunit/TextUI/CliArguments/Builder.php±Tp[c±T6ø6¤-phpunit/TextUI/CliArguments/Configuration.phpö²p[cö²àì¼X¤)phpunit/TextUI/CliArguments/Exception.phpïp[cï%ézE¤&phpunit/TextUI/CliArguments/Mapper.php+,p[c+,'aˆ“¤phpunit/TextUI/Command.php…np[c…nhN¤'phpunit/TextUI/DefaultResultPrinter.phpY7p[cY7}G(J¤&phpunit/TextUI/Exception/Exception.php¸p[c¸D{i¤0phpunit/TextUI/Exception/ReflectionException.php÷p[c÷ Y”¤-phpunit/TextUI/Exception/RuntimeException.phpßp[cß…žF¤;phpunit/TextUI/Exception/TestDirectoryNotFoundException.php p[c Õ̤6phpunit/TextUI/Exception/TestFileNotFoundException.php–p[c–™âpC¤phpunit/TextUI/Help.phpÝ.p[cÝ.„ª ‡¤ phpunit/TextUI/ResultPrinter.phppp[cp¢¥Ü¤phpunit/TextUI/TestRunner.phpêÁp[cêÁ©á&ˆ¤"phpunit/TextUI/TestSuiteMapper.phpü p[cü ¨È¤=phpunit/TextUI/XmlConfiguration/CodeCoverage/CodeCoverage.phpp[cr›¾™¤Aphpunit/TextUI/XmlConfiguration/CodeCoverage/Filter/Directory.phpÏp[cψc‹{¤Kphpunit/TextUI/XmlConfiguration/CodeCoverage/Filter/DirectoryCollection.php™p[c™Í‹êÁ¤Sphpunit/TextUI/XmlConfiguration/CodeCoverage/Filter/DirectoryCollectionIterator.php«p[c«¶šje¤=phpunit/TextUI/XmlConfiguration/CodeCoverage/FilterMapper.php¿p[c¿}Ýšƒ¤>phpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Clover.php×p[c×=C¤Aphpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Cobertura.phpÚp[cÚi­©ò¤>phpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Crap4j.php™p[c™êGù¤<phpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Html.php£p[c£EûŸ6¤;phpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Php.phpÔp[cÔpÚS¤<phpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Text.php¹p[c¹Kkw¤;phpunit/TextUI/XmlConfiguration/CodeCoverage/Report/Xml.phpèp[cèÁ?Çu¤1phpunit/TextUI/XmlConfiguration/Configuration.php5p[c5Ëž¤-phpunit/TextUI/XmlConfiguration/Exception.phpóp[cóN€5+¤8phpunit/TextUI/XmlConfiguration/Filesystem/Directory.php–p[c–@–Áš¤Bphpunit/TextUI/XmlConfiguration/Filesystem/DirectoryCollection.phpŸp[cŸylr:¤Jphpunit/TextUI/XmlConfiguration/Filesystem/DirectoryCollectionIterator.phpop[co\†V¤3phpunit/TextUI/XmlConfiguration/Filesystem/File.php‘p[c‘Ô.P ¤=phpunit/TextUI/XmlConfiguration/Filesystem/FileCollection.phpFp[cF¬U5b¤Ephpunit/TextUI/XmlConfiguration/Filesystem/FileCollectionIterator.php7p[c7óte7¤-phpunit/TextUI/XmlConfiguration/Generator.php¾p[c¾F𠜤/phpunit/TextUI/XmlConfiguration/Group/Group.php’p[c’­êÙ¤9phpunit/TextUI/XmlConfiguration/Group/GroupCollection.phpÄp[cÄß ™¤Aphpunit/TextUI/XmlConfiguration/Group/GroupCollectionIterator.phpAp[cA8§%‹¤0phpunit/TextUI/XmlConfiguration/Group/Groups.phpÜp[cܧ@—I¤*phpunit/TextUI/XmlConfiguration/Loader.phpÉ—p[cÉ—Õf—¤1phpunit/TextUI/XmlConfiguration/Logging/Junit.phpÊp[cÊcíiG¤3phpunit/TextUI/XmlConfiguration/Logging/Logging.phpà p[cà €“]Ù¤4phpunit/TextUI/XmlConfiguration/Logging/TeamCity.phpÍp[cÍ7Z鵤8phpunit/TextUI/XmlConfiguration/Logging/TestDox/Html.phpÑp[cÑÕV2ܤ8phpunit/TextUI/XmlConfiguration/Logging/TestDox/Text.phpÑp[cÑ‚ÏŽ´¤7phpunit/TextUI/XmlConfiguration/Logging/TestDox/Xml.phpÐp[cÐë÷t¤0phpunit/TextUI/XmlConfiguration/Logging/Text.phpÉp[cÉäŽCn¤>phpunit/TextUI/XmlConfiguration/Migration/MigrationBuilder.php# p[c# g©µ¤Gphpunit/TextUI/XmlConfiguration/Migration/MigrationBuilderException.phpp[cUWĤ@phpunit/TextUI/XmlConfiguration/Migration/MigrationException.phpüp[cü\Z¤Hphpunit/TextUI/XmlConfiguration/Migration/Migrations/ConvertLogTypes.php«p[c«hoÁe¤Ophpunit/TextUI/XmlConfiguration/Migration/Migrations/CoverageCloverToReport.phpXp[cXijÁ¤Ophpunit/TextUI/XmlConfiguration/Migration/Migrations/CoverageCrap4jToReport.phpœp[cœ$¯i'¤Mphpunit/TextUI/XmlConfiguration/Migration/Migrations/CoverageHtmlToReport.php©p[c©Õ„j‰¤Lphpunit/TextUI/XmlConfiguration/Migration/Migrations/CoveragePhpToReport.phpFp[cF‹£^Ó¤Mphpunit/TextUI/XmlConfiguration/Migration/Migrations/CoverageTextToReport.phpªp[cªÇV_¤Lphpunit/TextUI/XmlConfiguration/Migration/Migrations/CoverageXmlToReport.phpKp[cK«È_ ¤Qphpunit/TextUI/XmlConfiguration/Migration/Migrations/IntroduceCoverageElement.phpáp[cáUž¤Mphpunit/TextUI/XmlConfiguration/Migration/Migrations/LogToReportMigration.phpp[c»áU¤Bphpunit/TextUI/XmlConfiguration/Migration/Migrations/Migration.phpðp[cð'ˆžþ¤dphpunit/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php¬p[c¬U%5¸¤Yphpunit/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromRootToCoverage.phpCp[cCÿÅcF¤[phpunit/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistDirectoriesToCoverage.php¤p[c¤†踤Xphpunit/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistExcludesToCoverage.php§p[c§ƒÖϤSphpunit/TextUI/XmlConfiguration/Migration/Migrations/RemoveCacheTokensAttribute.phpßp[cß‘w¾ ¤Jphpunit/TextUI/XmlConfiguration/Migration/Migrations/RemoveEmptyFilter.php{p[c{æK¤Gphpunit/TextUI/XmlConfiguration/Migration/Migrations/RemoveLogTypes.php&p[c&ùq3{¤Qphpunit/TextUI/XmlConfiguration/Migration/Migrations/UpdateSchemaLocationTo93.phpñp[cñ bJï¤6phpunit/TextUI/XmlConfiguration/Migration/Migrator.php×p[c×o$ŠV¤0phpunit/TextUI/XmlConfiguration/PHP/Constant.php7p[c7$‘Ò¤:phpunit/TextUI/XmlConfiguration/PHP/ConstantCollection.php0p[c0:‘ª²¤Bphpunit/TextUI/XmlConfiguration/PHP/ConstantCollectionIterator.php_p[c_ô4V¿¤2phpunit/TextUI/XmlConfiguration/PHP/IniSetting.phpJp[cJÑOtÀ¤<phpunit/TextUI/XmlConfiguration/PHP/IniSettingCollection.phpPp[cP¯Ânœ¤Dphpunit/TextUI/XmlConfiguration/PHP/IniSettingCollectionIterator.phpsp[csiBt ¤+phpunit/TextUI/XmlConfiguration/PHP/Php.phpp[c6žåƒ¤2phpunit/TextUI/XmlConfiguration/PHP/PhpHandler.phpwp[cw` + ö¤0phpunit/TextUI/XmlConfiguration/PHP/Variable.phpäp[cäNãâ¤:phpunit/TextUI/XmlConfiguration/PHP/VariableCollection.php0p[c0ï׈T¤Bphpunit/TextUI/XmlConfiguration/PHP/VariableCollectionIterator.php_p[c_¦ëK¤5phpunit/TextUI/XmlConfiguration/PHPUnit/Extension.php p[c Ú}¾Q¤?phpunit/TextUI/XmlConfiguration/PHPUnit/ExtensionCollection.php»p[c»°1W¤Gphpunit/TextUI/XmlConfiguration/PHPUnit/ExtensionCollectionIterator.phpip[ciòoÐ(¤3phpunit/TextUI/XmlConfiguration/PHPUnit/PHPUnit.phplCp[clC¯Ñv©¤;phpunit/TextUI/XmlConfiguration/TestSuite/TestDirectory.phpCp[cC0ª¸‡¤Ephpunit/TextUI/XmlConfiguration/TestSuite/TestDirectoryCollection.php»p[c»ùâȤMphpunit/TextUI/XmlConfiguration/TestSuite/TestDirectoryCollectionIterator.phpp[cyp¸¤6phpunit/TextUI/XmlConfiguration/TestSuite/TestFile.phpÌp[ċ?y¤@phpunit/TextUI/XmlConfiguration/TestSuite/TestFileCollection.phpbp[cbçÉͤHphpunit/TextUI/XmlConfiguration/TestSuite/TestFileCollectionIterator.phpGp[cGw¾ÒǤ7phpunit/TextUI/XmlConfiguration/TestSuite/TestSuite.phpp[cêª8w¤Aphpunit/TextUI/XmlConfiguration/TestSuite/TestSuiteCollection.php–p[c–)èß2¤Iphpunit/TextUI/XmlConfiguration/TestSuite/TestSuiteCollectionIterator.phpip[ció #©¤$phpunit/Util/Annotation/DocBlock.phpAp[cAŸÓ:„¤$phpunit/Util/Annotation/Registry.phpZ +p[cZ +îD]X¤phpunit/Util/Blacklist.phpáp[cá­s«€¤phpunit/Util/Cloner.phpñp[cñ"Ɩܤphpunit/Util/Color.phpóp[cój­°?¤phpunit/Util/ErrorHandler.php†p[c†í=‡¤phpunit/Util/Exception.phpàp[cछ다phpunit/Util/ExcludeList.phpÄp[cĈ¤phpunit/Util/FileLoader.php£ p[c£ à'¤phpunit/Util/Filesystem.phpp[c¼äܤphpunit/Util/Filter.php© p[c© ®†Ä‡¤phpunit/Util/GlobalState.php>p[c>ph£Ç¤(phpunit/Util/InvalidDataSetException.phpîp[cî1 ¿¤phpunit/Util/Json.phpE p[cE û˜Ë!¤phpunit/Util/Log/JUnit.phpn*p[cn*)†LB¤phpunit/Util/Log/TeamCity.php&p[c&c¶µ±¤'phpunit/Util/PHP/AbstractPhpProcess.phpÂ&p[cÂ&%m˜•¤&phpunit/Util/PHP/DefaultPhpProcess.phpzp[cz˜ðCp¤*phpunit/Util/PHP/Template/PhptTestCase.tplØp[cب›€+phpunit/Util/PHP/Template/TestCaseClass.tplp p[cp 3 HÝ€,phpunit/Util/PHP/Template/TestCaseMethod.tpl¿ p[c¿ mÑD€&phpunit/Util/PHP/WindowsPhpProcess.phpðp[cðÄ)aB¤phpunit/Util/Printer.phpó p[có s¾¡h¤phpunit/Util/Reflection.php‹p[c‹W챤"phpunit/Util/RegularExpression.phpÞp[cÞ0uR)¤phpunit/Util/Test.phpÄ]p[cÄ]qço$¤*phpunit/Util/TestDox/CliTestDoxPrinter.php(*p[c(*@f©ÿ¤*phpunit/Util/TestDox/HtmlResultPrinter.phpñ +p[cñ +t&“¤'phpunit/Util/TestDox/NamePrettifier.php;"p[c;"45hÕ¤&phpunit/Util/TestDox/ResultPrinter.php"p[c"1Ïq$¤'phpunit/Util/TestDox/TestDoxPrinter.phpò)p[cò)KŸ¤Ì¤*phpunit/Util/TestDox/TextResultPrinter.php­p[c­ȹ!.¤)phpunit/Util/TestDox/XmlResultPrinter.phpÝp[cÝy¤%phpunit/Util/TextTestListRenderer.php6p[c6….š¤phpunit/Util/Type.php£p[c£ù|ä*phpunit/Util/VersionComparisonOperator.phpŒp[cŒ±b“¤,phpunit/Util/XdebugFilterScriptGenerator.phpwp[cw¡Øª¤phpunit/Util/Xml.php¶p[c¶[•¤phpunit/Util/Xml/Exception.phpäp[cä•û±Ó¤0phpunit/Util/Xml/FailedSchemaDetectionResult.phpðp[cðÖ#S˜¤phpunit/Util/Xml/Loader.php„ p[c„ ­,?µ¤*phpunit/Util/Xml/SchemaDetectionResult.phpµp[cµ4χz¤#phpunit/Util/Xml/SchemaDetector.php-p[c-ó´¤!phpunit/Util/Xml/SchemaFinder.php¡p[c¡9:š8¤%phpunit/Util/Xml/SnapshotNodeList.php p[c BÉ¢¤4phpunit/Util/Xml/SuccessfulSchemaDetectionResult.php'p[c'ð–ìg¤%phpunit/Util/Xml/ValidationResult.php•p[c•xv:€¤phpunit/Util/Xml/Validator.phpp[cVöˆŠ¤$phpunit/Util/XmlTestListRenderer.php +p[c +¤É8¤sbom.xml /p[c /¢B¿¤schema/8.5.xsd™Bp[c™Bè´…ª¤schema/9.2.xsdÕBp[cÕB„|l¤sebastian-cli-parser/LICENSEp[cÑÝu¤sebastian-cli-parser/Parser.phpŽp[cŽ•k®M¤<sebastian-cli-parser/exceptions/AmbiguousOptionException.phpFp[cFòm\¤-sebastian-cli-parser/exceptions/Exception.phpup[cuãÓ«¤Gsebastian-cli-parser/exceptions/OptionDoesNotAllowArgumentException.php_p[c_|13¬¤Jsebastian-cli-parser/exceptions/RequiredOptionArgumentMissingException.phphp[ch‚CËê¤:sebastian-cli-parser/exceptions/UnknownOptionException.php?p[c?v¥¡D¤*sebastian-code-unit-reverse-lookup/LICENSEp[c3G (¤-sebastian-code-unit-reverse-lookup/Wizard.phpÞ p[cÞ }Z[¤'sebastian-code-unit/ClassMethodUnit.phpp[cÃ@[¤!sebastian-code-unit/ClassUnit.phpp[cù÷ÝF¤ sebastian-code-unit/CodeUnit.php~%p[c~%D){¬¤*sebastian-code-unit/CodeUnitCollection.phpp[cØý¯J¤2sebastian-code-unit/CodeUnitCollectionIterator.php;p[c;äLʤ$sebastian-code-unit/FunctionUnit.phpp[cþ`¹¤+sebastian-code-unit/InterfaceMethodUnit.phpp[cǦŽç¤%sebastian-code-unit/InterfaceUnit.phpp[c›c¸¤sebastian-code-unit/LICENSE p[c p”ˆð¤sebastian-code-unit/Mapper.phpÔ-p[cÔ-#øž¢¤'sebastian-code-unit/TraitMethodUnit.phpp[cq¸z¤!sebastian-code-unit/TraitUnit.phpp[cëXAé¤,sebastian-code-unit/exceptions/Exception.phpsp[cstg§¤;sebastian-code-unit/exceptions/InvalidCodeUnitException.php§p[c§Ë6þ-¤3sebastian-code-unit/exceptions/NoTraitException.phpŸp[cŸ“Q3¤6sebastian-code-unit/exceptions/ReflectionException.php¢p[c¢•„²$¤(sebastian-comparator/ArrayComparator.phpup[cuEmhf¤#sebastian-comparator/Comparator.php…p[c…tð„ž¤*sebastian-comparator/ComparisonFailure.phpÌ p[cÌ Ú%½¶¤*sebastian-comparator/DOMNodeComparator.php p[c 1iî¤+sebastian-comparator/DateTimeComparator.php± p[c± ¬µKQ¤)sebastian-comparator/DoubleComparator.phpîp[cî:Ín¤,sebastian-comparator/ExceptionComparator.phpÆp[cƆÓ1¤ sebastian-comparator/Factory.php™p[c™ž?§N¤sebastian-comparator/LICENSE p[c =(èã¤-sebastian-comparator/MockObjectComparator.phpÎp[c΃I½ˆ¤*sebastian-comparator/NumericComparator.php3 p[c3 i{’l¤)sebastian-comparator/ObjectComparator.phpX p[cX º»×Œ¤+sebastian-comparator/ResourceComparator.phpp[cJ”¤)sebastian-comparator/ScalarComparator.php/ p[c/ ¶dF¤3sebastian-comparator/SplObjectStorageComparator.phpýp[cý?Ñ/é¤'sebastian-comparator/TypeComparator.phpæp[cæcX\¤-sebastian-comparator/exceptions/Exception.phpvp[cvîEᵤ4sebastian-comparator/exceptions/RuntimeException.phpp[cV¬'¤#sebastian-complexity/Calculator.phpe p[ce (6œÀ¤.sebastian-complexity/Complexity/Complexity.phpQp[cQ‚l½¤8sebastian-complexity/Complexity/ComplexityCollection.phpØp[cØil¤@sebastian-complexity/Complexity/ComplexityCollectionIterator.php,p[c,úäe§¤,sebastian-complexity/Exception/Exception.phpvp[cv7ý®¤3sebastian-complexity/Exception/RuntimeException.phpp[cC†dW¤sebastian-complexity/LICENSEp[c=‘®Ý¤=sebastian-complexity/Visitor/ComplexityCalculatingVisitor.php• p[c• öO¤Gsebastian-complexity/Visitor/CyclomaticComplexityCalculatingVisitor.php p[c 7ÖY–¤sebastian-diff/Chunk.php_p[c_ÖÛv€¤sebastian-diff/Diff.phpjp[cjbXØA¤sebastian-diff/Differ.php $p[c $wk¿z¤3sebastian-diff/Exception/ConfigurationException.php=p[c=1/Ff¤&sebastian-diff/Exception/Exception.phpjp[cjÚ0îå¤5sebastian-diff/Exception/InvalidArgumentException.php‹p[c‹qÁ«¤sebastian-diff/LICENSE p[c a¸©1¤sebastian-diff/Line.phpLp[cL +óq¤5sebastian-diff/LongestCommonSubsequenceCalculator.phpñp[cñ}e7z¤Dsebastian-diff/MemoryEfficientLongestCommonSubsequenceCalculator.phpŸp[cŸ9ù š¤4sebastian-diff/Output/AbstractChunkOutputBuilder.phpöp[cö˜ù\t¤/sebastian-diff/Output/DiffOnlyOutputBuilder.phpzp[czc·ò¤4sebastian-diff/Output/DiffOutputBuilderInterface.phpp[cVŽáå¤8sebastian-diff/Output/StrictUnifiedDiffOutputBuilder.phpŠ(p[cŠ(kvƒ¤2sebastian-diff/Output/UnifiedDiffOutputBuilder.php>p[c>'q)¤sebastian-diff/Parser.phpš p[cš °åX{¤Bsebastian-diff/TimeEfficientLongestCommonSubsequenceCalculator.phpõp[cõæ¬tÙ¤!sebastian-environment/Console.phpp[c72e4¤sebastian-environment/LICENSEp[c®FyÙ¤)sebastian-environment/OperatingSystem.phpæp[cæÚÌ„¤!sebastian-environment/Runtime.phpp[c¶Y/¸¤sebastian-exporter/Exporter.phpx$p[cx$úˆ’õ¤sebastian-exporter/LICENSEp[c 5Ù¤'sebastian-global-state/CodeExporter.php– p[c– ¦·¸¤&sebastian-global-state/ExcludeList.php· +p[c· +RÕ{˜¤sebastian-global-state/LICENSEp[cØJ‚€¤#sebastian-global-state/Restorer.php›p[c›G‡J ¤#sebastian-global-state/Snapshot.php¿*p[c¿*X%·¤/sebastian-global-state/exceptions/Exception.phpyp[cyùJ¡¤6sebastian-global-state/exceptions/RuntimeException.phpp[c;¤#sebastian-lines-of-code/Counter.phpßp[cßH5è¤/sebastian-lines-of-code/Exception/Exception.phpzp[cz a×V¤>sebastian-lines-of-code/Exception/IllogicalValuesException.phpªp[cªëžG¤<sebastian-lines-of-code/Exception/NegativeValueException.php¼p[c¼«Ç +Ú¤6sebastian-lines-of-code/Exception/RuntimeException.php‘p[c‘§K¥¤sebastian-lines-of-code/LICENSEp[c÷bS~¤/sebastian-lines-of-code/LineCountingVisitor.phpŠp[cŠ˜“~A¤'sebastian-lines-of-code/LinesOfCode.phpñ p[cñ fŠöÓ¤*sebastian-object-enumerator/Enumerator.php›p[c›÷x}ƒ¤)sebastian-object-enumerator/Exception.phpƒp[cƒç}êȤ8sebastian-object-enumerator/InvalidArgumentException.php¤p[c¤÷â¤(sebastian-object-reflector/Exception.phpp[cЬۤ7sebastian-object-reflector/InvalidArgumentException.php¢p[c¢ +ÖâM¤.sebastian-object-reflector/ObjectReflector.php×p[c×ÓãÏ_¤'sebastian-recursion-context/Context.php×p[c×êaDy¤)sebastian-recursion-context/Exception.php…p[c…PFA¤8sebastian-recursion-context/InvalidArgumentException.php¬p[c¬b×21¤#sebastian-recursion-context/LICENSEp[c`Äó¤%sebastian-resource-operations/LICENSEp[c]<â¤4sebastian-resource-operations/ResourceOperations.phpß²p[cß²·¦¤sebastian-type/LICENSE p[c Ò&.ç¤sebastian-type/Parameter.phpp[c‚äý,¤#sebastian-type/ReflectionMapper.phppp[cp&õÑÞ¤sebastian-type/TypeName.php:p[c:n +é¤&sebastian-type/exception/Exception.phpjp[cjbᮧ¤-sebastian-type/exception/RuntimeException.phpp[cùŠò%¤$sebastian-type/type/CallableType.phpªp[cªŵ`£¤!sebastian-type/type/FalseType.phpbp[cb¼_&ë¤)sebastian-type/type/GenericObjectType.php<p[c<C¬hò¤(sebastian-type/type/IntersectionType.phpd +p[cd +énÑc¤$sebastian-type/type/IterableType.phpp[c†ùf•¤!sebastian-type/type/MixedType.php'p[c'êîo¶¤!sebastian-type/type/NeverType.php×p[c×FÒ¹ƒ¤ sebastian-type/type/NullType.php"p[c"¶9$F¤"sebastian-type/type/ObjectType.php]p[c]±’L&¤"sebastian-type/type/SimpleType.phpùp[cù¬]º¤"sebastian-type/type/StaticType.phpÆp[cÆj~£á¤ sebastian-type/type/TrueType.php]p[c]<iפsebastian-type/type/Type.phpÌp[cÌDj e¤!sebastian-type/type/UnionType.php$ p[c$ ¢)Ϥ#sebastian-type/type/UnknownType.phpp[c‘ÕÙǤ sebastian-type/type/VoidType.phpÓp[cÓɳ¤sebastian-version/LICENSEp[c­ZÌù¤sebastian-version/Version.php®p[c® ƪ¤theseer-tokenizer/Exception.phpnp[cn¹'Ǥtheseer-tokenizer/LICENSEüp[cüïR (¤"theseer-tokenizer/NamespaceUri.phpHp[cHê=C«¤+theseer-tokenizer/NamespaceUriException.phpyp[cy'Heå¤theseer-tokenizer/Token.php–p[c–4ê†ã¤%theseer-tokenizer/TokenCollection.php +p[c +ž¾aà¤.theseer-tokenizer/TokenCollectionException.php|p[c|`g«-¤theseer-tokenizer/Tokenizer.phpþ +p[cþ +z’l¬¤#theseer-tokenizer/XMLSerializer.phpèp[cè–g; ¤webmozart-assert/Assert.php³Ép[c³ÉYTä¤-webmozart-assert/InvalidArgumentException.phpbp[cbÙAþº¤webmozart-assert/LICENSE<p[c<tØ}õ¤webmozart-assert/Mixin.php.Õp[c.Õ› a¤.phpstorm.meta.php‘p[c‘Oßò¤ - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Webmozart\Assert; +namespace PHPUnit\Doctrine\Instantiator\Exception; -use ArrayAccess; -use BadMethodCallException; -use Closure; -use Countable; -use DateTime; -use DateTimeImmutable; -use Exception; -use ResourceBundle; -use SimpleXMLElement; use Throwable; -use Traversable; /** - * Efficient assertions to validate the input/output of your methods. - * - * @since 1.0 - * - * @author Bernhard Schussek + * Base exception marker interface for the instantiator component */ -class Assert +interface ExceptionInterface extends Throwable { - use Mixin; - /** - * @psalm-pure - * @psalm-assert string $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function string($value, $message = '') +} + $reflectionClass * - * @throws InvalidArgumentException + * @template T of object */ - public static function stringNotEmpty($value, $message = '') + public static function fromAbstractClass(ReflectionClass $reflectionClass) : self { - static::string($value, $message); - static::notEq($value, '', $message); + return new self(sprintf('The provided class "%s" is abstract, and cannot be instantiated', $reflectionClass->getName())); + } + public static function fromEnum(string $className) : self + { + return new self(sprintf('The provided class "%s" is an enum, and cannot be instantiated', $className)); } +} + $reflectionClass * - * @throws InvalidArgumentException + * @template T of object */ - public static function integer($value, $message = '') + public static function fromSerializationTriggeredException(ReflectionClass $reflectionClass, Exception $exception) : self { - if (!\is_int($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an integer. Got: %s', static::typeToString($value))); - } + return new self(sprintf('An exception was raised while trying to instantiate an instance of "%s" via un-serialization', $reflectionClass->getName()), 0, $exception); } /** - * @psalm-pure - * @psalm-assert numeric $value - * - * @param mixed $value - * @param string $message + * @phpstan-param ReflectionClass $reflectionClass * - * @throws InvalidArgumentException + * @template T of object */ - public static function integerish($value, $message = '') + public static function fromUncleanUnSerialization(ReflectionClass $reflectionClass, string $errorString, int $errorCode, string $errorFile, int $errorLine) : self { - if (!\is_numeric($value) || $value != (int) $value) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an integerish value. Got: %s', static::typeToString($value))); - } + return new self(sprintf('Could not produce an instance of "%s" via un-serialization, since an error was triggered ' . 'in file "%s" at line "%d"', $reflectionClass->getName(), $errorFile, $errorLine), 0, new Exception($errorString, $errorCode)); } +} + 0)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a positive integer. Got: %s', static::valueToString($value))); - } - } + private static $cachedCloneables = []; /** - * @psalm-pure - * @psalm-assert float $value + * @param string $className + * @phpstan-param class-string $className * - * @param mixed $value - * @param string $message + * @return object + * @phpstan-return T * - * @throws InvalidArgumentException + * @throws ExceptionInterface + * + * @template T of object */ - public static function float($value, $message = '') + public function instantiate($className) { - if (!\is_float($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a float. Got: %s', static::typeToString($value))); + if (isset(self::$cachedCloneables[$className])) { + /** + * @phpstan-var T + */ + $cachedCloneable = self::$cachedCloneables[$className]; + return clone $cachedCloneable; + } + if (isset(self::$cachedInstantiators[$className])) { + $factory = self::$cachedInstantiators[$className]; + return $factory(); } + return $this->buildAndCacheFromFactory($className); } /** - * @psalm-pure - * @psalm-assert numeric $value + * Builds the requested object and caches it in static properties for performance * - * @param mixed $value - * @param string $message + * @phpstan-param class-string $className * - * @throws InvalidArgumentException + * @return object + * @phpstan-return T + * + * @template T of object */ - public static function numeric($value, $message = '') + private function buildAndCacheFromFactory(string $className) { - if (!\is_numeric($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a numeric. Got: %s', static::typeToString($value))); + $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className); + $instance = $factory(); + if ($this->isSafeToClone(new ReflectionClass($instance))) { + self::$cachedCloneables[$className] = clone $instance; } + return $instance; } /** - * @psalm-pure - * @psalm-assert positive-int|0 $value + * Builds a callable capable of instantiating the given $className without + * invoking its constructor. * - * @param mixed $value - * @param string $message + * @phpstan-param class-string $className + * + * @phpstan-return callable(): T * * @throws InvalidArgumentException + * @throws UnexpectedValueException + * @throws ReflectionException + * + * @template T of object */ - public static function natural($value, $message = '') + private function buildFactory(string $className) : callable { - if (!\is_int($value) || $value < 0) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a non-negative integer. Got: %s', static::valueToString($value))); + $reflectionClass = $this->getReflectionClass($className); + if ($this->isInstantiableViaReflection($reflectionClass)) { + return [$reflectionClass, 'newInstanceWithoutConstructor']; } + $serializedString = sprintf('%s:%d:"%s":0:{}', is_subclass_of($className, Serializable::class) ? self::SERIALIZATION_FORMAT_USE_UNSERIALIZER : self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER, strlen($className), $className); + $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString); + return static function () use($serializedString) { + return unserialize($serializedString); + }; } /** - * @psalm-pure - * @psalm-assert bool $value + * @phpstan-param class-string $className * - * @param mixed $value - * @param string $message + * @phpstan-return ReflectionClass * * @throws InvalidArgumentException + * @throws ReflectionException + * + * @template T of object */ - public static function boolean($value, $message = '') + private function getReflectionClass(string $className) : ReflectionClass { - if (!\is_bool($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a boolean. Got: %s', static::typeToString($value))); + if (!class_exists($className)) { + throw InvalidArgumentException::fromNonExistingClass($className); + } + if (PHP_VERSION_ID >= 80100 && enum_exists($className, \false)) { + throw InvalidArgumentException::fromEnum($className); + } + $reflection = new ReflectionClass($className); + if ($reflection->isAbstract()) { + throw InvalidArgumentException::fromAbstractClass($reflection); } + return $reflection; } /** - * @psalm-pure - * @psalm-assert scalar $value + * @phpstan-param ReflectionClass $reflectionClass * - * @param mixed $value - * @param string $message + * @throws UnexpectedValueException * - * @throws InvalidArgumentException + * @template T of object */ - public static function scalar($value, $message = '') + private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, string $serializedString) : void { - if (!\is_scalar($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a scalar. Got: %s', static::typeToString($value))); + set_error_handler(static function (int $code, string $message, string $file, int $line) use($reflectionClass, &$error) : bool { + $error = UnexpectedValueException::fromUncleanUnSerialization($reflectionClass, $message, $code, $file, $line); + return \true; + }); + try { + $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString); + } finally { + restore_error_handler(); + } + if ($error) { + throw $error; } } /** - * @psalm-pure - * @psalm-assert object $value + * @phpstan-param ReflectionClass $reflectionClass * - * @param mixed $value - * @param string $message + * @throws UnexpectedValueException * - * @throws InvalidArgumentException + * @template T of object */ - public static function object($value, $message = '') + private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, string $serializedString) : void { - if (!\is_object($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an object. Got: %s', static::typeToString($value))); + try { + unserialize($serializedString); + } catch (Exception $exception) { + throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception); } } /** - * @psalm-pure - * @psalm-assert resource $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message + * @phpstan-param ReflectionClass $reflectionClass * - * @throws InvalidArgumentException + * @template T of object */ - public static function resource($value, $type = null, $message = '') + private function isInstantiableViaReflection(ReflectionClass $reflectionClass) : bool { - if (!\is_resource($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a resource. Got: %s', static::typeToString($value))); - } - if ($type && $type !== \get_resource_type($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a resource of type %2$s. Got: %s', static::typeToString($value), $type)); - } + return !($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal()); } /** - * @psalm-pure - * @psalm-assert callable $value + * Verifies whether the given class is to be considered internal * - * @param mixed $value - * @param string $message + * @phpstan-param ReflectionClass $reflectionClass * - * @throws InvalidArgumentException + * @template T of object */ - public static function isCallable($value, $message = '') + private function hasInternalAncestors(ReflectionClass $reflectionClass) : bool { - if (!\is_callable($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a callable. Got: %s', static::typeToString($value))); - } + do { + if ($reflectionClass->isInternal()) { + return \true; + } + $reflectionClass = $reflectionClass->getParentClass(); + } while ($reflectionClass); + return \false; } /** - * @psalm-pure - * @psalm-assert array $value + * Checks if a class is cloneable * - * @param mixed $value - * @param string $message + * Classes implementing `__clone` cannot be safely cloned, as that may cause side-effects. * - * @throws InvalidArgumentException + * @phpstan-param ReflectionClass $reflectionClass + * + * @template T of object */ - public static function isArray($value, $message = '') + private function isSafeToClone(ReflectionClass $reflectionClass) : bool { - if (!\is_array($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an array. Got: %s', static::typeToString($value))); - } + return $reflectionClass->isCloneable() && !$reflectionClass->hasMethod('__clone') && !$reflectionClass->isSubclassOf(ArrayIterator::class); } +} + $className * - * @deprecated use "isIterable" or "isInstanceOf" instead + * @return object + * @phpstan-return T * - * @param mixed $value - * @param string $message + * @throws ExceptionInterface * - * @throws InvalidArgumentException + * @template T of object */ - public static function isTraversable($value, $message = '') - { - @\trigger_error(\sprintf('The "%s" assertion is deprecated. You should stop using it, as it will soon be removed in 2.0 version. Use "isIterable" or "isInstanceOf" instead.', __METHOD__), \E_USER_DEPRECATED); - if (!\is_array($value) && !$value instanceof Traversable) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a traversable. Got: %s', static::typeToString($value))); - } - } + public function instantiate($className); +} +Copyright (c) 2014 Doctrine Project + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +phpunit/phpunit: 9.5.26 +doctrine/instantiator: 1.4.1 +myclabs/deep-copy: 1.11.0 +nikic/php-parser: v4.15.1 +phar-io/manifest: 2.0.3 +phar-io/version: 3.2.1 +phpdocumentor/reflection-common: 2.2.0 +phpdocumentor/reflection-docblock: 5.3.0 +phpdocumentor/type-resolver: 1.6.1 +phpspec/prophecy: v1.15.0 +phpunit/php-code-coverage: 9.2.18 +phpunit/php-file-iterator: 3.0.6 +phpunit/php-invoker: 3.1.1 +phpunit/php-text-template: 2.0.4 +phpunit/php-timer: 5.0.3 +sebastian/cli-parser: 1.0.1 +sebastian/code-unit: 1.0.8 +sebastian/code-unit-reverse-lookup: 2.0.3 +sebastian/comparator: 4.0.8 +sebastian/complexity: 2.0.2 +sebastian/diff: 4.0.4 +sebastian/environment: 5.1.4 +sebastian/exporter: 4.0.5 +sebastian/global-state: 5.0.5 +sebastian/lines-of-code: 1.0.3 +sebastian/object-enumerator: 4.0.4 +sebastian/object-reflector: 2.0.4 +sebastian/recursion-context: 4.0.4 +sebastian/resource-operations: 3.0.3 +sebastian/type: 3.2.0 +sebastian/version: 3.0.2 +theseer/tokenizer: 1.2.1 +webmozart/assert: 1.11.0 + Filter, 'matcher' => Matcher] pairs. + */ + private $filters = []; + /** + * Type Filters to apply. * - * @throws InvalidArgumentException + * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. */ - public static function isArrayAccessible($value, $message = '') + private $typeFilters = []; + /** + * @var bool + */ + private $skipUncloneable = \false; + /** + * @var bool + */ + private $useCloneMethod; + /** + * @param bool $useCloneMethod If set to true, when an object implements the __clone() function, it will be used + * instead of the regular deep cloning. + */ + public function __construct($useCloneMethod = \false) { - if (!\is_array($value) && !$value instanceof ArrayAccess) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an array accessible. Got: %s', static::typeToString($value))); - } + $this->useCloneMethod = $useCloneMethod; + $this->addTypeFilter(new ArrayObjectFilter($this), new TypeMatcher(ArrayObject::class)); + $this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class)); + $this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class)); } /** - * @psalm-pure - * @psalm-assert countable $value + * If enabled, will not throw an exception when coming across an uncloneable property. * - * @param mixed $value - * @param string $message + * @param $skipUncloneable * - * @throws InvalidArgumentException + * @return $this */ - public static function isCountable($value, $message = '') + public function skipUncloneable($skipUncloneable = \true) { - if (!\is_array($value) && !$value instanceof Countable && !$value instanceof ResourceBundle && !$value instanceof SimpleXMLElement) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a countable. Got: %s', static::typeToString($value))); - } + $this->skipUncloneable = $skipUncloneable; + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value + * Deep copies the given object. * - * @param mixed $value - * @param string $message + * @param mixed $object * - * @throws InvalidArgumentException + * @return mixed */ - public static function isIterable($value, $message = '') + public function copy($object) { - if (!\is_array($value) && !$value instanceof Traversable) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an iterable. Got: %s', static::typeToString($value))); - } - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isInstanceOf($value, $class, $message = '') + $this->hashMap = []; + return $this->recursiveCopy($object); + } + public function addFilter(Filter $filter, Matcher $matcher) { - if (!$value instanceof $class) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of %2$s. Got: %s', static::typeToString($value), $class)); + $this->filters[] = ['matcher' => $matcher, 'filter' => $filter]; + } + public function prependFilter(Filter $filter, Matcher $matcher) + { + \array_unshift($this->filters, ['matcher' => $matcher, 'filter' => $filter]); + } + public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher) + { + $this->typeFilters[] = ['matcher' => $matcher, 'filter' => $filter]; + } + private function recursiveCopy($var) + { + // Matches Type Filter + if ($filter = $this->getFirstMatchedTypeFilter($this->typeFilters, $var)) { + return $filter->apply($var); + } + // Resource + if (\is_resource($var)) { + return $var; + } + // Array + if (\is_array($var)) { + return $this->copyArray($var); + } + // Scalar + if (!\is_object($var)) { + return $var; + } + // Enum + if (\PHP_VERSION_ID >= 80100 && \enum_exists(\get_class($var))) { + return $var; } + // Object + return $this->copyObject($var); } /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert !ExpectedType $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException + * Copy an array + * @param array $array + * @return array */ - public static function notInstanceOf($value, $class, $message = '') + private function copyArray(array $array) { - if ($value instanceof $class) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance other than %2$s. Got: %s', static::typeToString($value), $class)); + foreach ($array as $key => $value) { + $array[$key] = $this->recursiveCopy($value); } + return $array; } /** - * @psalm-pure - * @psalm-param array $classes + * Copies an object. * - * @param mixed $value - * @param array $classes - * @param string $message + * @param object $object * - * @throws InvalidArgumentException + * @throws CloneException + * + * @return object */ - public static function isInstanceOfAny($value, array $classes, $message = '') + private function copyObject($object) { - foreach ($classes as $class) { - if ($value instanceof $class) { - return; + $objectHash = \spl_object_hash($object); + if (isset($this->hashMap[$objectHash])) { + return $this->hashMap[$objectHash]; + } + $reflectedObject = new ReflectionObject($object); + $isCloneable = $reflectedObject->isCloneable(); + if (\false === $isCloneable) { + if ($this->skipUncloneable) { + $this->hashMap[$objectHash] = $object; + return $object; } + throw new CloneException(\sprintf('The class "%s" is not cloneable.', $reflectedObject->getName())); + } + $newObject = clone $object; + $this->hashMap[$objectHash] = $newObject; + if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) { + return $newObject; + } + if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) { + return $newObject; + } + foreach (ReflectionHelper::getProperties($reflectedObject) as $property) { + $this->copyObjectProperty($newObject, $property); } - static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of any of %2$s. Got: %s', static::typeToString($value), \implode(', ', \array_map(array('static', 'valueToString'), $classes)))); + return $newObject; } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType|class-string $value - * - * @param object|string $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function isAOf($value, $class, $message = '') + private function copyObjectProperty($object, ReflectionProperty $property) { - static::string($class, 'Expected class as a string. Got: %s'); - if (!\is_a($value, $class, \is_string($value))) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of this class or to this class among his parents %2$s. Got: %s', static::typeToString($value), $class)); + // Ignore static properties + if ($property->isStatic()) { + return; } + // Apply the filters + foreach ($this->filters as $item) { + /** @var Matcher $matcher */ + $matcher = $item['matcher']; + /** @var Filter $filter */ + $filter = $item['filter']; + if ($matcher->matches($object, $property->getName())) { + $filter->apply($object, $property->getName(), function ($object) { + return $this->recursiveCopy($object); + }); + // If a filter matches, we stop processing this property + return; + } + } + $property->setAccessible(\true); + // Ignore uninitialized properties (for PHP >7.4) + if (\method_exists($property, 'isInitialized') && !$property->isInitialized($object)) { + return; + } + $propertyValue = $property->getValue($object); + // Copy the property + $property->setValue($object, $this->recursiveCopy($propertyValue)); } /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * @psalm-assert !UnexpectedType $value - * @psalm-assert !class-string $value + * Returns first filter that matches variable, `null` if no such filter found. * - * @param object|string $value - * @param string $class - * @param string $message + * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and + * 'matcher' with value of type {@see TypeMatcher} + * @param mixed $var * - * @throws InvalidArgumentException + * @return TypeFilter|null */ - public static function isNotA($value, $class, $message = '') + private function getFirstMatchedTypeFilter(array $filterRecords, $var) { - static::string($class, 'Expected class as a string. Got: %s'); - if (\is_a($value, $class, \is_string($value))) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of this class or to this class among his parents other than %2$s. Got: %s', static::typeToString($value), $class)); - } + $matched = $this->first($filterRecords, function (array $record) use($var) { + /* @var TypeMatcher $matcher */ + $matcher = $record['matcher']; + return $matcher->matches($var); + }); + return isset($matched) ? $matched['filter'] : null; } /** - * @psalm-pure - * @psalm-param array $classes + * Returns first element that matches predicate, `null` if no such element found. * - * @param object|string $value - * @param string[] $classes - * @param string $message + * @param array $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs. + * @param callable $predicate Predicate arguments are: element. * - * @throws InvalidArgumentException + * @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher' + * with value of type {@see TypeMatcher} or `null`. */ - public static function isAnyOf($value, array $classes, $message = '') + private function first(array $elements, callable $predicate) { - foreach ($classes as $class) { - static::string($class, 'Expected class as a string. Got: %s'); - if (\is_a($value, $class, \is_string($value))) { - return; + foreach ($elements as $element) { + if (\call_user_func($predicate, $element)) { + return $element; } } - static::reportInvalidArgument(\sprintf($message ?: 'Expected an any of instance of this class or to this class among his parents other than %2$s. Got: %s', static::typeToString($value), \implode(', ', \array_map(array('static', 'valueToString'), $classes)))); + return null; } +} +setAccessible(\true); + $oldCollection = $reflectionProperty->getValue($object); + $newCollection = $oldCollection->map(function ($item) use($objectCopier) { + return $objectCopier($item); + }); + $reflectionProperty->setValue($object, $newCollection); } +} +setAccessible(\true); + $reflectionProperty->setValue($object, new ArrayCollection()); } +} +__load(); } +} +callback = $callable; } /** - * @psalm-pure - * @psalm-assert false $value - * - * @param mixed $value - * @param string $message + * Replaces the object property by the result of the callback called with the object property. * - * @throws InvalidArgumentException + * {@inheritdoc} */ - public static function false($value, $message = '') + public function apply($object, $property, $objectCopier) { - if (\false !== $value) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be false. Got: %s', static::valueToString($value))); - } + $reflectionProperty = ReflectionHelper::getProperty($object, $property); + $reflectionProperty->setAccessible(\true); + $value = \call_user_func($this->callback, $reflectionProperty->getValue($object)); + $reflectionProperty->setValue($object, $value); } +} +setAccessible(\true); + $reflectionProperty->setValue($object, null); } +} +class = $class; + $this->property = $property; } /** - * @param mixed $value - * @param string $message + * Matches a specific property of a specific class. * - * @throws InvalidArgumentException + * {@inheritdoc} */ - public static function ipv6($value, $message = '') + public function matches($object, $property) { - if (\false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be an IPv6. Got: %s', static::valueToString($value))); - } + return $object instanceof $this->class && $property == $this->property; } +} +property = $property; } /** - * Does non strict comparisons on the items, so ['3', 3] will not pass the assertion. - * - * @param array $values - * @param string $message + * Matches a property by its name. * - * @throws InvalidArgumentException + * {@inheritdoc} */ - public static function uniqueValues(array $values, $message = '') + public function matches($object, $property) { - $allValues = \count($values); - $uniqueValues = \count(\array_unique($values)); - if ($allValues !== $uniqueValues) { - $difference = $allValues - $uniqueValues; - static::reportInvalidArgument(\sprintf($message ?: 'Expected an array of unique values, but %s of them %s duplicated', $difference, 1 === $difference ? 'is' : 'are')); - } + return $property == $this->property; } +} +propertyType = $propertyType; } /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException + * {@inheritdoc} */ - public static function same($value, $expect, $message = '') + public function matches($object, $property) { - if ($expect !== $value) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value identical to %2$s. Got: %s', static::valueToString($value), static::valueToString($expect))); + try { + $reflectionProperty = ReflectionHelper::getProperty($object, $property); + } catch (ReflectionException $exception) { + return \false; } - } - /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function notSame($value, $expect, $message = '') - { - if ($expect === $value) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value not identical to %s.', static::valueToString($expect))); + $reflectionProperty->setAccessible(\true); + // Uninitialized properties (for PHP >7.4) + if (\method_exists($reflectionProperty, 'isInitialized') && !$reflectionProperty->isInitialized($object)) { + // null instanceof $this->propertyType + return \false; } + return $reflectionProperty->getValue($object) instanceof $this->propertyType; } +} +getProperties() does not return private properties from ancestor classes. * - * @throws InvalidArgumentException - */ - public static function greaterThan($value, $limit, $message = '') - { - if ($value <= $limit) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value greater than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); - } - } - /** - * @psalm-pure + * @author muratyaman@gmail.com + * @see http://php.net/manual/en/reflectionclass.getproperties.php * - * @param mixed $value - * @param mixed $limit - * @param string $message + * @param ReflectionClass $ref * - * @throws InvalidArgumentException + * @return ReflectionProperty[] */ - public static function greaterThanEq($value, $limit, $message = '') + public static function getProperties(ReflectionClass $ref) { - if ($value < $limit) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value greater than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); + $props = $ref->getProperties(); + $propsArr = array(); + foreach ($props as $prop) { + $propertyName = $prop->getName(); + $propsArr[$propertyName] = $prop; + } + if ($parentClass = $ref->getParentClass()) { + $parentPropsArr = self::getProperties($parentClass); + foreach ($propsArr as $key => $property) { + $parentPropsArr[$key] = $property; + } + return $parentPropsArr; } + return $propsArr; } /** - * @psalm-pure + * Retrieves property by name from object and all its ancestors. * - * @param mixed $value - * @param mixed $limit - * @param string $message + * @param object|string $object + * @param string $name * - * @throws InvalidArgumentException + * @throws PropertyException + * @throws ReflectionException + * + * @return ReflectionProperty */ - public static function lessThan($value, $limit, $message = '') + public static function getProperty($object, $name) { - if ($value >= $limit) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value less than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); + $reflection = \is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object); + if ($reflection->hasProperty($name)) { + return $reflection->getProperty($name); + } + if ($parentClass = $reflection->getParentClass()) { + return self::getProperty($parentClass->getName(), $name); } + throw new PropertyException(\sprintf('The class "%s" doesn\'t have a property with the given name: "%s".', \is_object($object) ? \get_class($object) : $object, $name)); } +} + $limit) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value less than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); + $copy = new DateInterval('P0D'); + foreach ($element as $propertyName => $propertyValue) { + $copy->{$propertyName} = $propertyValue; } + return $copy; } +} + $max) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value between %2$s and %3$s. Got: %s', static::valueToString($value), static::valueToString($min), static::valueToString($max))); - } - } + protected $callback; /** - * A more human-readable alias of Assert::inArray(). - * - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException + * @param callable $callable Will be called to get the new value for each element to replace */ - public static function oneOf($value, array $values, $message = '') + public function __construct(callable $callable) { - static::inArray($value, $values, $message); + $this->callback = $callable; } /** - * Does strict comparison, so Assert::inArray(3, ['3']) does not pass the assertion. - * - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message - * - * @throws InvalidArgumentException + * {@inheritdoc} */ - public static function inArray($value, array $values, $message = '') + public function apply($element) { - if (!\in_array($value, $values, \true)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected one of: %2$s. Got: %s', static::valueToString($value), \implode(', ', \array_map(array('static', 'valueToString'), $values)))); - } + return \call_user_func($this->callback, $element); } +} +copier = $copier; } /** - * @psalm-pure - * - * @param string $value - * @param string $message - * - * @throws InvalidArgumentException + * {@inheritdoc} */ - public static function notWhitespaceOnly($value, $message = '') + public function apply($arrayObject) { - if (\preg_match('/^\\s*$/', $value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a non-whitespace string. Got: %s', static::valueToString($value))); + $clone = clone $arrayObject; + foreach ($arrayObject->getArrayCopy() as $k => $v) { + $clone->offsetSet($k, $this->copier->copy($v)); } + return $clone; } - /** - * @psalm-pure - * - * @param string $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function startsWith($value, $prefix, $message = '') +} +copier = $copier; } /** - * @psalm-pure - * - * @param string $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException + * {@inheritdoc} */ - public static function notStartsWith($value, $prefix, $message = '') + public function apply($element) { - if (0 === \strpos($value, $prefix)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value not to start with %2$s. Got: %s', static::valueToString($value), static::valueToString($prefix))); - } + $newElement = clone $element; + $copy = $this->createCopyClosure(); + return $copy($newElement); } - /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - */ - public static function startsWithLetter($value, $message = '') + private function createCopyClosure() { - static::string($value); - $valid = isset($value[0]); - if ($valid) { - $locale = \setlocale(\LC_CTYPE, 0); - \setlocale(\LC_CTYPE, 'C'); - $valid = \ctype_alpha($value[0]); - \setlocale(\LC_CTYPE, $locale); - } - if (!$valid) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to start with a letter. Got: %s', static::valueToString($value))); - } + $copier = $this->copier; + $copy = function (SplDoublyLinkedList $list) use($copier) { + // Replace each element in the list with a deep copy of itself + for ($i = 1; $i <= $list->count(); $i++) { + $copy = $copier->recursiveCopy($list->shift()); + $list->push($copy); + } + return $list; + }; + return Closure::bind($copy, null, DeepCopy::class); } +} +type = $type; } /** - * @psalm-pure - * - * @param string $value - * @param string $pattern - * @param string $message + * @param mixed $element * - * @throws InvalidArgumentException + * @return boolean */ - public static function notRegex($value, $pattern, $message = '') + public function matches($element) { - if (\preg_match($pattern, $value, $matches, \PREG_OFFSET_CAPTURE)) { - static::reportInvalidArgument(\sprintf($message ?: 'The value %s matches the pattern %s (at offset %d).', static::valueToString($value), static::valueToString($pattern), $matches[0][1])); - } + return \is_object($element) ? \is_a($element, $this->type) : \gettype($element) === $this->type; } +} +copy($value); } +} +The MIT License (MIT) + +Copyright (c) 2013 My C-Sense + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +BSD 3-Clause License + +Copyright (c) 2011, Nikita Popov +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +constants = [new Const_($name, BuilderHelpers::normalizeValue($value))]; } /** - * @psalm-pure + * Add another constant to const group * - * @param string $value - * @param string $message + * @param string|Identifier $name Name + * @param Node\Expr|bool|null|int|float|string|array $value Value * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function alnum($value, $message = '') + public function addConst($name, $value) { - $locale = \setlocale(\LC_CTYPE, 0); - \setlocale(\LC_CTYPE, 'C'); - $valid = !\ctype_alnum($value); - \setlocale(\LC_CTYPE, $locale); - if ($valid) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain letters and digits only. Got: %s', static::valueToString($value))); - } + $this->constants[] = new Const_($name, BuilderHelpers::normalizeValue($value)); + return $this; } /** - * @psalm-pure - * @psalm-assert lowercase-string $value - * - * @param string $value - * @param string $message + * Makes the constant public. * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function lower($value, $message = '') + public function makePublic() { - $locale = \setlocale(\LC_CTYPE, 0); - \setlocale(\LC_CTYPE, 'C'); - $valid = !\ctype_lower($value); - \setlocale(\LC_CTYPE, $locale); - if ($valid) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain lowercase characters only. Got: %s', static::valueToString($value))); - } + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); + return $this; } /** - * @psalm-pure - * @psalm-assert !lowercase-string $value - * - * @param string $value - * @param string $message + * Makes the constant protected. * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function upper($value, $message = '') + public function makeProtected() { - $locale = \setlocale(\LC_CTYPE, 0); - \setlocale(\LC_CTYPE, 'C'); - $valid = !\ctype_upper($value); - \setlocale(\LC_CTYPE, $locale); - if ($valid) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain uppercase characters only. Got: %s', static::valueToString($value))); - } + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); + return $this; } /** - * @psalm-pure - * - * @param string $value - * @param int $length - * @param string $message + * Makes the constant private. * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function length($value, $length, $message = '') + public function makePrivate() { - if ($length !== static::strlen($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain %2$s characters. Got: %s', static::valueToString($value), $length)); - } + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); + return $this; } /** - * Inclusive min. - * - * @psalm-pure - * - * @param string $value - * @param int|float $min - * @param string $message + * Makes the constant final. * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function minLength($value, $min, $message = '') + public function makeFinal() { - if (static::strlen($value) < $min) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain at least %2$s characters. Got: %s', static::valueToString($value), $min)); - } + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + return $this; } /** - * Inclusive max. - * - * @psalm-pure + * Sets doc comment for the constant. * - * @param string $value - * @param int|float $max - * @param string $message + * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function maxLength($value, $max, $message = '') + public function setDocComment($docComment) { - if (static::strlen($value) > $max) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain at most %2$s characters. Got: %s', static::valueToString($value), $max)); - } + $this->attributes = ['comments' => [BuilderHelpers::normalizeDocComment($docComment)]]; + return $this; } /** - * Inclusive , so Assert::lengthBetween('asd', 3, 5); passes the assertion. - * - * @psalm-pure + * Adds an attribute group. * - * @param string $value - * @param int|float $min - * @param int|float $max - * @param string $message + * @param Node\Attribute|Node\AttributeGroup $attribute * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function lengthBetween($value, $min, $max, $message = '') + public function addAttribute($attribute) { - $length = static::strlen($value); - if ($length < $min || $length > $max) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s', static::valueToString($value), $min, $max)); - } + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + return $this; } /** - * Will also pass if $value is a directory, use Assert::file() instead if you need to be sure it is a file. - * - * @param mixed $value - * @param string $message + * Returns the built class node. * - * @throws InvalidArgumentException + * @return Stmt\ClassConst The built constant node */ - public static function fileExists($value, $message = '') + public function getNode() : PhpParser\Node { - static::string($value); - if (!\file_exists($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'The file %s does not exist.', static::valueToString($value))); - } + return new Stmt\ClassConst($this->constants, $this->flags, $this->attributes, $this->attributeGroups); } +} +name = $name; } /** - * @param mixed $value - * @param string $message + * Extends a class. * - * @throws InvalidArgumentException + * @param Name|string $class Name of class to extend + * + * @return $this The builder instance (for fluid interface) */ - public static function directory($value, $message = '') + public function extend($class) { - static::fileExists($value, $message); - if (!\is_dir($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'The path %s is no directory.', static::valueToString($value))); - } + $this->extends = BuilderHelpers::normalizeName($class); + return $this; } /** - * @param string $value - * @param string $message + * Implements one or more interfaces. * - * @throws InvalidArgumentException + * @param Name|string ...$interfaces Names of interfaces to implement + * + * @return $this The builder instance (for fluid interface) */ - public static function readable($value, $message = '') + public function implement(...$interfaces) { - if (!\is_readable($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'The path %s is not readable.', static::valueToString($value))); + foreach ($interfaces as $interface) { + $this->implements[] = BuilderHelpers::normalizeName($interface); } + return $this; } /** - * @param string $value - * @param string $message + * Makes the class abstract. * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function writable($value, $message = '') + public function makeAbstract() { - if (!\is_writable($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'The path %s is not writable.', static::valueToString($value))); - } + $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); + return $this; } /** - * @psalm-assert class-string $value - * - * @param mixed $value - * @param string $message + * Makes the class final. * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function classExists($value, $message = '') + public function makeFinal() { - if (!\class_exists($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an existing class name. Got: %s', static::valueToString($value))); - } + $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + return $this; + } + public function makeReadonly() + { + $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); + return $this; } /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert class-string|ExpectedType $value + * Adds a statement. * - * @param mixed $value - * @param string|object $class - * @param string $message + * @param Stmt|PhpParser\Builder $stmt The statement to add * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function subclassOf($value, $class, $message = '') + public function addStmt($stmt) { - if (!\is_subclass_of($value, $class)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected a sub-class of %2$s. Got: %s', static::valueToString($value), static::valueToString($class))); + $stmt = BuilderHelpers::normalizeNode($stmt); + $targets = [Stmt\TraitUse::class => &$this->uses, Stmt\ClassConst::class => &$this->constants, Stmt\Property::class => &$this->properties, Stmt\ClassMethod::class => &$this->methods]; + $class = \get_class($stmt); + if (!isset($targets[$class])) { + throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); } + $targets[$class][] = $stmt; + return $this; } /** - * @psalm-assert class-string $value + * Adds an attribute group. * - * @param mixed $value - * @param string $message + * @param Node\Attribute|Node\AttributeGroup $attribute * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function interfaceExists($value, $message = '') + public function addAttribute($attribute) { - if (!\interface_exists($value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an existing interface name. got %s', static::valueToString($value))); - } + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + return $this; } /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert class-string $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message + * Returns the built class node. * - * @throws InvalidArgumentException + * @return Stmt\Class_ The built class node */ - public static function implementsInterface($value, $interface, $message = '') + public function getNode() : PhpParser\Node { - if (!\in_array($interface, \class_implements($value))) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an implementation of %2$s. Got: %s', static::valueToString($value), static::valueToString($interface))); - } + return new Stmt\Class_($this->name, ['flags' => $this->flags, 'extends' => $this->extends, 'implements' => $this->implements, 'stmts' => \array_merge($this->uses, $this->constants, $this->properties, $this->methods), 'attrGroups' => $this->attributeGroups], $this->attributes); } +} +addStmt($stmt); } + return $this; } /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject + * Sets doc comment for the declaration. * - * @param string|object $classOrObject - * @param mixed $property - * @param string $message + * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function propertyNotExists($classOrObject, $property, $message = '') + public function setDocComment($docComment) { - if (\property_exists($classOrObject, $property)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected the property %s to not exist.', static::valueToString($property))); - } + $this->attributes['comments'] = [BuilderHelpers::normalizeDocComment($docComment)]; + return $this; } +} +name = $name; } /** - * @psalm-pure - * @psalm-param class-string|object $classOrObject + * Sets the value. * - * @param string|object $classOrObject - * @param mixed $method - * @param string $message + * @param Node\Expr|string|int $value * - * @throws InvalidArgumentException + * @return $this */ - public static function methodNotExists($classOrObject, $method, $message = '') + public function setValue($value) { - if ((\is_string($classOrObject) || \is_object($classOrObject)) && \method_exists($classOrObject, $method)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected the method %s to not exist.', static::valueToString($method))); - } + $this->value = BuilderHelpers::normalizeValue($value); + return $this; } /** - * @psalm-pure + * Sets doc comment for the constant. * - * @param array $array - * @param string|int $key - * @param string $message + * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function keyExists($array, $key, $message = '') + public function setDocComment($docComment) { - if (!(isset($array[$key]) || \array_key_exists($key, $array))) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected the key %s to exist.', static::valueToString($key))); - } + $this->attributes = ['comments' => [BuilderHelpers::normalizeDocComment($docComment)]]; + return $this; } /** - * @psalm-pure + * Adds an attribute group. * - * @param array $array - * @param string|int $key - * @param string $message + * @param Node\Attribute|Node\AttributeGroup $attribute * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function keyNotExists($array, $key, $message = '') + public function addAttribute($attribute) { - if (isset($array[$key]) || \array_key_exists($key, $array)) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected the key %s to not exist.', static::valueToString($key))); - } + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + return $this; } /** - * Checks if a value is a valid array key (int or string). + * Returns the built enum case node. * - * @psalm-pure - * @psalm-assert array-key $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * @return Stmt\EnumCase The built constant node */ - public static function validArrayKey($value, $message = '') + public function getNode() : PhpParser\Node { - if (!(\is_int($value) || \is_string($value))) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected string or integer. Got: %s', static::typeToString($value))); - } + return new Stmt\EnumCase($this->name, $this->value, $this->attributes, $this->attributeGroups); } +} +name = $name; } /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * Sets the scalar type. * - * @param Countable|array $array - * @param int|float $min - * @param string $message + * @param string|Identifier $type * - * @throws InvalidArgumentException + * @return $this */ - public static function minCount($array, $min, $message = '') + public function setScalarType($scalarType) { - if (\count($array) < $min) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an array to contain at least %2$d elements. Got: %d', \count($array), $min)); - } + $this->scalarType = BuilderHelpers::normalizeType($scalarType); + return $this; } /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * Implements one or more interfaces. * - * @param Countable|array $array - * @param int|float $max - * @param string $message + * @param Name|string ...$interfaces Names of interfaces to implement * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function maxCount($array, $max, $message = '') + public function implement(...$interfaces) { - if (\count($array) > $max) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an array to contain at most %2$d elements. Got: %d', \count($array), $max)); + foreach ($interfaces as $interface) { + $this->implements[] = BuilderHelpers::normalizeName($interface); } + return $this; } /** - * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * Adds a statement. * - * @param Countable|array $array - * @param int|float $min - * @param int|float $max - * @param string $message + * @param Stmt|PhpParser\Builder $stmt The statement to add * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function countBetween($array, $min, $max, $message = '') + public function addStmt($stmt) { - $count = \count($array); - if ($count < $min || $count > $max) { - static::reportInvalidArgument(\sprintf($message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d', $count, $min, $max)); + $stmt = BuilderHelpers::normalizeNode($stmt); + $targets = [Stmt\TraitUse::class => &$this->uses, Stmt\EnumCase::class => &$this->enumCases, Stmt\ClassConst::class => &$this->constants, Stmt\ClassMethod::class => &$this->methods]; + $class = \get_class($stmt); + if (!isset($targets[$class])) { + throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); } + $targets[$class][] = $stmt; + return $this; } /** - * @psalm-pure - * @psalm-assert list $array + * Adds an attribute group. * - * @param mixed $array - * @param string $message + * @param Node\Attribute|Node\AttributeGroup $attribute * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function isList($array, $message = '') + public function addAttribute($attribute) { - if (!\is_array($array) || $array !== \array_values($array)) { - static::reportInvalidArgument($message ?: 'Expected list - non-associative array.'); - } + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + return $this; } /** - * @psalm-pure - * @psalm-assert non-empty-list $array - * - * @param mixed $array - * @param string $message + * Returns the built class node. * - * @throws InvalidArgumentException + * @return Stmt\Enum_ The built enum node */ - public static function isNonEmptyList($array, $message = '') + public function getNode() : PhpParser\Node { - static::isList($array, $message); - static::notEmpty($array, $message); + return new Stmt\Enum_($this->name, ['scalarType' => $this->scalarType, 'implements' => $this->implements, 'stmts' => \array_merge($this->uses, $this->enumCases, $this->constants, $this->methods), 'attrGroups' => $this->attributeGroups], $this->attributes); } +} + $array - * @psalm-assert array $array - * - * @param mixed $array - * @param string $message + * Make the function return by reference. * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function isMap($array, $message = '') + public function makeReturnByRef() { - if (!\is_array($array) || \array_keys($array) !== \array_filter(\array_keys($array), '\\is_string')) { - static::reportInvalidArgument($message ?: 'Expected map - associative array with string keys.'); - } + $this->returnByRef = \true; + return $this; } /** - * @psalm-pure - * @psalm-template T - * @psalm-param mixed|array $array - * @psalm-assert array $array - * @psalm-assert !empty $array + * Adds a parameter. * - * @param mixed $array - * @param string $message + * @param Node\Param|Param $param The parameter to add * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function isNonEmptyMap($array, $message = '') + public function addParam($param) { - static::isMap($array, $message); - static::notEmpty($array, $message); + $param = BuilderHelpers::normalizeNode($param); + if (!$param instanceof Node\Param) { + throw new \LogicException(\sprintf('Expected parameter node, got "%s"', $param->getType())); + } + $this->params[] = $param; + return $this; } /** - * @psalm-pure + * Adds multiple parameters. * - * @param string $value - * @param string $message + * @param array $params The parameters to add * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function uuid($value, $message = '') + public function addParams(array $params) { - $value = \str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); - // The nil UUID is special form of UUID that is specified to have all - // 128 bits set to zero. - if ('00000000-0000-0000-0000-000000000000' === $value) { - return; - } - if (!\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { - static::reportInvalidArgument(\sprintf($message ?: 'Value %s is not a valid UUID.', static::valueToString($value))); + foreach ($params as $param) { + $this->addParam($param); } + return $this; } /** - * @psalm-param class-string $class + * Sets the return type for PHP 7. * - * @param Closure $expression - * @param string $class - * @param string $message + * @param string|Node\Name|Node\Identifier|Node\ComplexType $type * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) */ - public static function throws(Closure $expression, $class = 'Exception', $message = '') + public function setReturnType($type) { - static::string($class); - $actual = 'none'; - try { - $expression(); - } catch (Exception $e) { - $actual = \get_class($e); - if ($e instanceof $class) { - return; - } - } catch (Throwable $e) { - $actual = \get_class($e); - if ($e instanceof $class) { - return; - } - } - static::reportInvalidArgument($message ?: \sprintf('Expected to throw "%s", got "%s"', $class, $actual)); + $this->returnType = BuilderHelpers::normalizeType($type); + return $this; } +} +name = $name; } /** - * @param mixed $value + * Adds a statement. * - * @return string + * @param Node|PhpParser\Builder $stmt The statement to add + * + * @return $this The builder instance (for fluid interface) */ - protected static function valueToString($value) + public function addStmt($stmt) { - if (null === $value) { - return 'null'; - } - if (\true === $value) { - return 'true'; - } - if (\false === $value) { - return 'false'; - } - if (\is_array($value)) { - return 'array'; - } - if (\is_object($value)) { - if (\method_exists($value, '__toString')) { - return \get_class($value) . ': ' . self::valueToString($value->__toString()); - } - if ($value instanceof DateTime || $value instanceof DateTimeImmutable) { - return \get_class($value) . ': ' . self::valueToString($value->format('c')); - } - return \get_class($value); - } - if (\is_resource($value)) { - return 'resource'; - } - if (\is_string($value)) { - return '"' . $value . '"'; - } - return (string) $value; + $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); + return $this; } /** - * @param mixed $value + * Adds an attribute group. * - * @return string + * @param Node\Attribute|Node\AttributeGroup $attribute + * + * @return $this The builder instance (for fluid interface) */ - protected static function typeToString($value) - { - return \is_object($value) ? \get_class($value) : \gettype($value); - } - protected static function strlen($value) + public function addAttribute($attribute) { - if (!\function_exists('mb_detect_encoding')) { - return \strlen($value); - } - if (\false === ($encoding = \mb_detect_encoding($value))) { - return \strlen($value); - } - return \mb_strlen($value, $encoding); + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + return $this; } /** - * @param string $message - * - * @throws InvalidArgumentException + * Returns the built function node. * - * @psalm-pure this method is not supposed to perform side-effects + * @return Stmt\Function_ The built function node */ - protected static function reportInvalidArgument($message) - { - throw new InvalidArgumentException($message); - } - private function __construct() + public function getNode() : Node { + return new Stmt\Function_($this->name, ['byRef' => $this->returnByRef, 'params' => $this->params, 'returnType' => $this->returnType, 'stmts' => $this->stmts, 'attrGroups' => $this->attributeGroups], $this->attributes); } } name = $name; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message + * Extends one or more interfaces. * - * @throws InvalidArgumentException + * @param Name|string ...$interfaces Names of interfaces to extend * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allString($value, $message = '') + public function extend(...$interfaces) { - static::__callStatic('allString', array($value, $message)); + foreach ($interfaces as $interface) { + $this->extends[] = BuilderHelpers::normalizeName($interface); + } + return $this; } /** - * @psalm-pure - * @psalm-assert non-empty-string|null $value - * - * @param mixed $value - * @param string $message + * Adds a statement. * - * @throws InvalidArgumentException + * @param Stmt|PhpParser\Builder $stmt The statement to add * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrStringNotEmpty($value, $message = '') + public function addStmt($stmt) { - static::__callStatic('nullOrStringNotEmpty', array($value, $message)); + $stmt = BuilderHelpers::normalizeNode($stmt); + if ($stmt instanceof Stmt\ClassConst) { + $this->constants[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassMethod) { + // we erase all statements in the body of an interface method + $stmt->stmts = null; + $this->methods[] = $stmt; + } else { + throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); + } + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message + * Adds an attribute group. * - * @throws InvalidArgumentException + * @param Node\Attribute|Node\AttributeGroup $attribute * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allStringNotEmpty($value, $message = '') + public function addAttribute($attribute) { - static::__callStatic('allStringNotEmpty', array($value, $message)); + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + return $this; } /** - * @psalm-pure - * @psalm-assert int|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Returns the built interface node. * - * @return void + * @return Stmt\Interface_ The built interface node */ - public static function nullOrInteger($value, $message = '') + public function getNode() : PhpParser\Node { - static::__callStatic('nullOrInteger', array($value, $message)); + return new Stmt\Interface_($this->name, ['extends' => $this->extends, 'stmts' => \array_merge($this->constants, $this->methods), 'attrGroups' => $this->attributeGroups], $this->attributes); } +} + $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Creates a method builder. * - * @return void + * @param string $name Name of the method */ - public static function allInteger($value, $message = '') + public function __construct(string $name) { - static::__callStatic('allInteger', array($value, $message)); + $this->name = $name; } /** - * @psalm-pure - * @psalm-assert numeric|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Makes the method public. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrIntegerish($value, $message = '') + public function makePublic() { - static::__callStatic('nullOrIntegerish', array($value, $message)); + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Makes the method protected. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allIntegerish($value, $message = '') + public function makeProtected() { - static::__callStatic('allIntegerish', array($value, $message)); + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); + return $this; } /** - * @psalm-pure - * @psalm-assert positive-int|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Makes the method private. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrPositiveInteger($value, $message = '') + public function makePrivate() { - static::__callStatic('nullOrPositiveInteger', array($value, $message)); + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Makes the method static. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allPositiveInteger($value, $message = '') + public function makeStatic() { - static::__callStatic('allPositiveInteger', array($value, $message)); - } + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); + return $this; + } /** - * @psalm-pure - * @psalm-assert float|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Makes the method abstract. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrFloat($value, $message = '') + public function makeAbstract() { - static::__callStatic('nullOrFloat', array($value, $message)); + if (!empty($this->stmts)) { + throw new \LogicException('Cannot make method with statements abstract'); + } + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); + $this->stmts = null; + // abstract methods don't have statements + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Makes the method final. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allFloat($value, $message = '') + public function makeFinal() { - static::__callStatic('allFloat', array($value, $message)); + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + return $this; } /** - * @psalm-pure - * @psalm-assert numeric|null $value - * - * @param mixed $value - * @param string $message + * Adds a statement. * - * @throws InvalidArgumentException + * @param Node|PhpParser\Builder $stmt The statement to add * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrNumeric($value, $message = '') + public function addStmt($stmt) { - static::__callStatic('nullOrNumeric', array($value, $message)); + if (null === $this->stmts) { + throw new \LogicException('Cannot add statements to an abstract method'); + } + $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message + * Adds an attribute group. * - * @throws InvalidArgumentException + * @param Node\Attribute|Node\AttributeGroup $attribute * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allNumeric($value, $message = '') + public function addAttribute($attribute) { - static::__callStatic('allNumeric', array($value, $message)); + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + return $this; } /** - * @psalm-pure - * @psalm-assert positive-int|0|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Returns the built method node. * - * @return void + * @return Stmt\ClassMethod The built method node */ - public static function nullOrNatural($value, $message = '') + public function getNode() : Node { - static::__callStatic('nullOrNatural', array($value, $message)); + return new Stmt\ClassMethod($this->name, ['flags' => $this->flags, 'byRef' => $this->returnByRef, 'params' => $this->params, 'returnType' => $this->returnType, 'stmts' => $this->stmts, 'attrGroups' => $this->attributeGroups], $this->attributes); } +} + $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Creates a namespace builder. * - * @return void + * @param Node\Name|string|null $name Name of the namespace */ - public static function allNatural($value, $message = '') + public function __construct($name) { - static::__callStatic('allNatural', array($value, $message)); + $this->name = null !== $name ? BuilderHelpers::normalizeName($name) : null; } /** - * @psalm-pure - * @psalm-assert bool|null $value - * - * @param mixed $value - * @param string $message + * Adds a statement. * - * @throws InvalidArgumentException + * @param Node|PhpParser\Builder $stmt The statement to add * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrBoolean($value, $message = '') + public function addStmt($stmt) { - static::__callStatic('nullOrBoolean', array($value, $message)); + $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Returns the built node. * - * @return void + * @return Stmt\Namespace_ The built node */ - public static function allBoolean($value, $message = '') + public function getNode() : Node { - static::__callStatic('allBoolean', array($value, $message)); + return new Stmt\Namespace_($this->name, $this->stmts, $this->attributes); } +} +name = $name; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message + * Sets default value for the parameter. * - * @throws InvalidArgumentException + * @param mixed $value Default value to use * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allScalar($value, $message = '') + public function setDefault($value) { - static::__callStatic('allScalar', array($value, $message)); + $this->default = BuilderHelpers::normalizeValue($value); + return $this; } /** - * @psalm-pure - * @psalm-assert object|null $value - * - * @param mixed $value - * @param string $message + * Sets type for the parameter. * - * @throws InvalidArgumentException + * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrObject($value, $message = '') + public function setType($type) { - static::__callStatic('nullOrObject', array($value, $message)); + $this->type = BuilderHelpers::normalizeType($type); + if ($this->type == 'void') { + throw new \LogicException('Parameter type cannot be void'); + } + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value + * Sets type for the parameter. * - * @param mixed $value - * @param string $message + * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type * - * @throws InvalidArgumentException + * @return $this The builder instance (for fluid interface) * - * @return void + * @deprecated Use setType() instead */ - public static function allObject($value, $message = '') + public function setTypeHint($type) { - static::__callStatic('allObject', array($value, $message)); + return $this->setType($type); } /** - * @psalm-pure - * @psalm-assert resource|null $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message - * - * @throws InvalidArgumentException + * Make the parameter accept the value by reference. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrResource($value, $type = null, $message = '') + public function makeByRef() { - static::__callStatic('nullOrResource', array($value, $type, $message)); + $this->byRef = \true; + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php - * @param string $message - * - * @throws InvalidArgumentException + * Make the parameter variadic * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allResource($value, $type = null, $message = '') + public function makeVariadic() { - static::__callStatic('allResource', array($value, $type, $message)); + $this->variadic = \true; + return $this; } /** - * @psalm-pure - * @psalm-assert callable|null $value - * - * @param mixed $value - * @param string $message + * Adds an attribute group. * - * @throws InvalidArgumentException + * @param Node\Attribute|Node\AttributeGroup $attribute * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrIsCallable($value, $message = '') + public function addAttribute($attribute) { - static::__callStatic('nullOrIsCallable', array($value, $message)); + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Returns the built parameter node. * - * @return void + * @return Node\Param The built parameter node */ - public static function allIsCallable($value, $message = '') + public function getNode() : Node { - static::__callStatic('allIsCallable', array($value, $message)); + return new Node\Param(new Node\Expr\Variable($this->name), $this->default, $this->type, $this->byRef, $this->variadic, [], 0, $this->attributeGroups); } +} +name = $name; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Makes the property public. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allIsArray($value, $message = '') + public function makePublic() { - static::__callStatic('allIsArray', array($value, $message)); + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); + return $this; } /** - * @psalm-pure - * @psalm-assert iterable|null $value - * - * @deprecated use "isIterable" or "isInstanceOf" instead - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Makes the property protected. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrIsTraversable($value, $message = '') + public function makeProtected() { - static::__callStatic('nullOrIsTraversable', array($value, $message)); + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @deprecated use "isIterable" or "isInstanceOf" instead - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Makes the property private. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allIsTraversable($value, $message = '') + public function makePrivate() { - static::__callStatic('allIsTraversable', array($value, $message)); + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); + return $this; } /** - * @psalm-pure - * @psalm-assert array|ArrayAccess|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Makes the property static. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrIsArrayAccessible($value, $message = '') + public function makeStatic() { - static::__callStatic('nullOrIsArrayAccessible', array($value, $message)); + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Makes the property readonly. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allIsArrayAccessible($value, $message = '') + public function makeReadonly() { - static::__callStatic('allIsArrayAccessible', array($value, $message)); + $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); + return $this; } /** - * @psalm-pure - * @psalm-assert countable|null $value - * - * @param mixed $value - * @param string $message + * Sets default value for the property. * - * @throws InvalidArgumentException + * @param mixed $value Default value to use * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrIsCountable($value, $message = '') + public function setDefault($value) { - static::__callStatic('nullOrIsCountable', array($value, $message)); + $this->default = BuilderHelpers::normalizeValue($value); + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message + * Sets doc comment for the property. * - * @throws InvalidArgumentException + * @param PhpParser\Comment\Doc|string $docComment Doc comment to set * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allIsCountable($value, $message = '') + public function setDocComment($docComment) { - static::__callStatic('allIsCountable', array($value, $message)); + $this->attributes = ['comments' => [BuilderHelpers::normalizeDocComment($docComment)]]; + return $this; } /** - * @psalm-pure - * @psalm-assert iterable|null $value - * - * @param mixed $value - * @param string $message + * Sets the property type for PHP 7.4+. * - * @throws InvalidArgumentException + * @param string|Name|Identifier|ComplexType $type * - * @return void + * @return $this */ - public static function nullOrIsIterable($value, $message = '') + public function setType($type) { - static::__callStatic('nullOrIsIterable', array($value, $message)); + $this->type = BuilderHelpers::normalizeType($type); + return $this; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message + * Adds an attribute group. * - * @throws InvalidArgumentException + * @param Node\Attribute|Node\AttributeGroup $attribute * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allIsIterable($value, $message = '') + public function addAttribute($attribute) { - static::__callStatic('allIsIterable', array($value, $message)); + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + return $this; } /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType|null $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException + * Returns the built class node. * - * @return void + * @return Stmt\Property The built property node */ - public static function nullOrIsInstanceOf($value, $class, $message = '') + public function getNode() : PhpParser\Node { - static::__callStatic('nullOrIsInstanceOf', array($value, $class, $message)); + return new Stmt\Property($this->flags !== 0 ? $this->flags : Stmt\Class_::MODIFIER_PUBLIC, [new Stmt\PropertyProperty($this->name, $this->default)], $this->attributes, $this->type, $this->attributeGroups); } +} + $class - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string|object $class - * @param string $message - * - * @throws InvalidArgumentException + * Creates a trait use builder. * - * @return void + * @param Node\Name|string ...$traits Names of used traits */ - public static function allIsInstanceOf($value, $class, $message = '') + public function __construct(...$traits) { - static::__callStatic('allIsInstanceOf', array($value, $class, $message)); + foreach ($traits as $trait) { + $this->and($trait); + } } /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * - * @param mixed $value - * @param string|object $class - * @param string $message + * Adds used trait. * - * @throws InvalidArgumentException + * @param Node\Name|string $trait Trait name * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrNotInstanceOf($value, $class, $message = '') + public function and($trait) { - static::__callStatic('nullOrNotInstanceOf', array($value, $class, $message)); + $this->traits[] = BuilderHelpers::normalizeName($trait); + return $this; } /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * - * @param mixed $value - * @param string|object $class - * @param string $message + * Adds trait adaptation. * - * @throws InvalidArgumentException + * @param Stmt\TraitUseAdaptation|Builder\TraitUseAdaptation $adaptation Trait adaptation * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allNotInstanceOf($value, $class, $message = '') + public function with($adaptation) { - static::__callStatic('allNotInstanceOf', array($value, $class, $message)); - } + $adaptation = BuilderHelpers::normalizeNode($adaptation); + if (!$adaptation instanceof Stmt\TraitUseAdaptation) { + throw new \LogicException('Adaptation must have type TraitUseAdaptation'); + } + $this->adaptations[] = $adaptation; + return $this; + } /** - * @psalm-pure - * @psalm-param array $classes - * - * @param mixed $value - * @param array $classes - * @param string $message - * - * @throws InvalidArgumentException + * Returns the built node. * - * @return void + * @return Node The built node */ - public static function nullOrIsInstanceOfAny($value, $classes, $message = '') + public function getNode() : Node { - static::__callStatic('nullOrIsInstanceOfAny', array($value, $classes, $message)); + return new Stmt\TraitUse($this->traits, $this->adaptations); } +} + $classes - * - * @param mixed $value - * @param array $classes - * @param string $message - * - * @throws InvalidArgumentException + * Creates a trait use adaptation builder. * - * @return void + * @param Node\Name|string|null $trait Name of adaptated trait + * @param Node\Identifier|string $method Name of adaptated method */ - public static function allIsInstanceOfAny($value, $classes, $message = '') + public function __construct($trait, $method) { - static::__callStatic('allIsInstanceOfAny', array($value, $classes, $message)); + $this->type = self::TYPE_UNDEFINED; + $this->trait = \is_null($trait) ? null : BuilderHelpers::normalizeName($trait); + $this->method = BuilderHelpers::normalizeIdentifier($method); } /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert ExpectedType|class-string|null $value - * - * @param object|string|null $value - * @param string $class - * @param string $message + * Sets alias of method. * - * @throws InvalidArgumentException + * @param Node\Identifier|string $alias Alias for adaptated method * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrIsAOf($value, $class, $message = '') + public function as($alias) { - static::__callStatic('nullOrIsAOf', array($value, $class, $message)); + if ($this->type === self::TYPE_UNDEFINED) { + $this->type = self::TYPE_ALIAS; + } + if ($this->type !== self::TYPE_ALIAS) { + throw new \LogicException('Cannot set alias for not alias adaptation buider'); + } + $this->alias = $alias; + return $this; } /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable> $value - * - * @param iterable $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException + * Sets adaptated method public. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allIsAOf($value, $class, $message = '') + public function makePublic() { - static::__callStatic('allIsAOf', array($value, $class, $message)); + $this->setModifier(Stmt\Class_::MODIFIER_PUBLIC); + return $this; } /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * - * @param object|string|null $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException + * Sets adaptated method protected. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrIsNotA($value, $class, $message = '') + public function makeProtected() { - static::__callStatic('nullOrIsNotA', array($value, $class, $message)); + $this->setModifier(Stmt\Class_::MODIFIER_PROTECTED); + return $this; } /** - * @psalm-pure - * @psalm-template UnexpectedType of object - * @psalm-param class-string $class - * - * @param iterable $value - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException + * Sets adaptated method private. * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allIsNotA($value, $class, $message = '') + public function makePrivate() { - static::__callStatic('allIsNotA', array($value, $class, $message)); + $this->setModifier(Stmt\Class_::MODIFIER_PRIVATE); + return $this; } /** - * @psalm-pure - * @psalm-param array $classes - * - * @param object|string|null $value - * @param string[] $classes - * @param string $message + * Adds overwritten traits. * - * @throws InvalidArgumentException + * @param Node\Name|string ...$traits Traits for overwrite * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrIsAnyOf($value, $classes, $message = '') + public function insteadof(...$traits) + { + if ($this->type === self::TYPE_UNDEFINED) { + if (\is_null($this->trait)) { + throw new \LogicException('Precedence adaptation must have trait'); + } + $this->type = self::TYPE_PRECEDENCE; + } + if ($this->type !== self::TYPE_PRECEDENCE) { + throw new \LogicException('Cannot add overwritten traits for not precedence adaptation buider'); + } + foreach ($traits as $trait) { + $this->insteadof[] = BuilderHelpers::normalizeName($trait); + } + return $this; + } + protected function setModifier(int $modifier) { - static::__callStatic('nullOrIsAnyOf', array($value, $classes, $message)); + if ($this->type === self::TYPE_UNDEFINED) { + $this->type = self::TYPE_ALIAS; + } + if ($this->type !== self::TYPE_ALIAS) { + throw new \LogicException('Cannot set access modifier for not alias adaptation buider'); + } + if (\is_null($this->modifier)) { + $this->modifier = $modifier; + } else { + throw new \LogicException('Multiple access type modifiers are not allowed'); + } } /** - * @psalm-pure - * @psalm-param array $classes - * - * @param iterable $value - * @param string[] $classes - * @param string $message - * - * @throws InvalidArgumentException + * Returns the built node. * - * @return void + * @return Node The built node */ - public static function allIsAnyOf($value, $classes, $message = '') + public function getNode() : Node { - static::__callStatic('allIsAnyOf', array($value, $classes, $message)); + switch ($this->type) { + case self::TYPE_ALIAS: + return new Stmt\TraitUseAdaptation\Alias($this->trait, $this->method, $this->modifier, $this->alias); + case self::TYPE_PRECEDENCE: + return new Stmt\TraitUseAdaptation\Precedence($this->trait, $this->method, $this->insteadof); + default: + throw new \LogicException('Type of adaptation is not defined'); + } } +} +name = $name; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message + * Adds a statement. * - * @throws InvalidArgumentException + * @param Stmt|PhpParser\Builder $stmt The statement to add * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allIsEmpty($value, $message = '') + public function addStmt($stmt) { - static::__callStatic('allIsEmpty', array($value, $message)); + $stmt = BuilderHelpers::normalizeNode($stmt); + if ($stmt instanceof Stmt\Property) { + $this->properties[] = $stmt; + } elseif ($stmt instanceof Stmt\ClassMethod) { + $this->methods[] = $stmt; + } elseif ($stmt instanceof Stmt\TraitUse) { + $this->uses[] = $stmt; + } else { + throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); + } + return $this; } /** - * @psalm-pure - * - * @param mixed $value - * @param string $message + * Adds an attribute group. * - * @throws InvalidArgumentException + * @param Node\Attribute|Node\AttributeGroup $attribute * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function nullOrNotEmpty($value, $message = '') + public function addAttribute($attribute) { - static::__callStatic('nullOrNotEmpty', array($value, $message)); + $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); + return $this; } /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Returns the built trait node. * - * @return void + * @return Stmt\Trait_ The built interface node */ - public static function allNotEmpty($value, $message = '') + public function getNode() : PhpParser\Node { - static::__callStatic('allNotEmpty', array($value, $message)); + return new Stmt\Trait_($this->name, ['stmts' => \array_merge($this->uses, $this->properties, $this->methods), 'attrGroups' => $this->attributeGroups], $this->attributes); } +} + $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Creates a name use (alias) builder. * - * @return void + * @param Node\Name|string $name Name of the entity (namespace, class, function, constant) to alias + * @param int $type One of the Stmt\Use_::TYPE_* constants */ - public static function allNull($value, $message = '') + public function __construct($name, int $type) { - static::__callStatic('allNull', array($value, $message)); + $this->name = BuilderHelpers::normalizeName($name); + $this->type = $type; } /** - * @psalm-pure - * - * @param mixed $value - * @param string $message + * Sets alias for used name. * - * @throws InvalidArgumentException + * @param string $alias Alias to use (last component of full name by default) * - * @return void + * @return $this The builder instance (for fluid interface) */ - public static function allNotNull($value, $message = '') + public function as(string $alias) { - static::__callStatic('allNotNull', array($value, $message)); + $this->alias = $alias; + return $this; } /** - * @psalm-pure - * @psalm-assert true|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Returns the built node. * - * @return void + * @return Stmt\Use_ The built node */ - public static function nullOrTrue($value, $message = '') + public function getNode() : Node { - static::__callStatic('nullOrTrue', array($value, $message)); + return new Stmt\Use_([new Stmt\UseUse($this->name, $this->alias)], $this->type); } +} + $value - * - * @param mixed $value - * @param string $message + * Creates an attribute node. * - * @throws InvalidArgumentException + * @param string|Name $name Name of the attribute + * @param array $args Attribute named arguments * - * @return void + * @return Node\Attribute */ - public static function allTrue($value, $message = '') + public function attribute($name, array $args = []) : Node\Attribute { - static::__callStatic('allTrue', array($value, $message)); + return new Node\Attribute(BuilderHelpers::normalizeName($name), $this->args($args)); } /** - * @psalm-pure - * @psalm-assert false|null $value - * - * @param mixed $value - * @param string $message + * Creates a namespace builder. * - * @throws InvalidArgumentException + * @param null|string|Node\Name $name Name of the namespace * - * @return void + * @return Builder\Namespace_ The created namespace builder */ - public static function nullOrFalse($value, $message = '') + public function namespace($name) : Builder\Namespace_ { - static::__callStatic('nullOrFalse', array($value, $message)); + return new Builder\Namespace_($name); } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message + * Creates a class builder. * - * @throws InvalidArgumentException + * @param string $name Name of the class * - * @return void + * @return Builder\Class_ The created class builder */ - public static function allFalse($value, $message = '') + public function class(string $name) : Builder\Class_ { - static::__callStatic('allFalse', array($value, $message)); + return new Builder\Class_($name); } /** - * @psalm-pure - * - * @param mixed $value - * @param string $message + * Creates an interface builder. * - * @throws InvalidArgumentException + * @param string $name Name of the interface * - * @return void + * @return Builder\Interface_ The created interface builder */ - public static function nullOrNotFalse($value, $message = '') + public function interface(string $name) : Builder\Interface_ { - static::__callStatic('nullOrNotFalse', array($value, $message)); + return new Builder\Interface_($name); } /** - * @psalm-pure - * - * @param mixed $value - * @param string $message + * Creates a trait builder. * - * @throws InvalidArgumentException + * @param string $name Name of the trait * - * @return void + * @return Builder\Trait_ The created trait builder */ - public static function allNotFalse($value, $message = '') + public function trait(string $name) : Builder\Trait_ { - static::__callStatic('allNotFalse', array($value, $message)); + return new Builder\Trait_($name); } /** - * @param mixed $value - * @param string $message + * Creates an enum builder. * - * @throws InvalidArgumentException + * @param string $name Name of the enum * - * @return void + * @return Builder\Enum_ The created enum builder */ - public static function nullOrIp($value, $message = '') + public function enum(string $name) : Builder\Enum_ { - static::__callStatic('nullOrIp', array($value, $message)); + return new Builder\Enum_($name); } /** - * @param mixed $value - * @param string $message + * Creates a trait use builder. * - * @throws InvalidArgumentException + * @param Node\Name|string ...$traits Trait names * - * @return void + * @return Builder\TraitUse The create trait use builder */ - public static function allIp($value, $message = '') + public function useTrait(...$traits) : Builder\TraitUse { - static::__callStatic('allIp', array($value, $message)); + return new Builder\TraitUse(...$traits); } /** - * @param mixed $value - * @param string $message + * Creates a trait use adaptation builder. * - * @throws InvalidArgumentException + * @param Node\Name|string|null $trait Trait name + * @param Node\Identifier|string $method Method name * - * @return void + * @return Builder\TraitUseAdaptation The create trait use adaptation builder */ - public static function nullOrIpv4($value, $message = '') + public function traitUseAdaptation($trait, $method = null) : Builder\TraitUseAdaptation { - static::__callStatic('nullOrIpv4', array($value, $message)); + if ($method === null) { + $method = $trait; + $trait = null; + } + return new Builder\TraitUseAdaptation($trait, $method); } /** - * @param mixed $value - * @param string $message + * Creates a method builder. * - * @throws InvalidArgumentException + * @param string $name Name of the method * - * @return void + * @return Builder\Method The created method builder */ - public static function allIpv4($value, $message = '') + public function method(string $name) : Builder\Method { - static::__callStatic('allIpv4', array($value, $message)); + return new Builder\Method($name); } /** - * @param mixed $value - * @param string $message + * Creates a parameter builder. * - * @throws InvalidArgumentException + * @param string $name Name of the parameter * - * @return void + * @return Builder\Param The created parameter builder */ - public static function nullOrIpv6($value, $message = '') + public function param(string $name) : Builder\Param { - static::__callStatic('nullOrIpv6', array($value, $message)); + return new Builder\Param($name); } /** - * @param mixed $value - * @param string $message + * Creates a property builder. * - * @throws InvalidArgumentException + * @param string $name Name of the property * - * @return void + * @return Builder\Property The created property builder */ - public static function allIpv6($value, $message = '') + public function property(string $name) : Builder\Property { - static::__callStatic('allIpv6', array($value, $message)); + return new Builder\Property($name); } /** - * @param mixed $value - * @param string $message + * Creates a function builder. * - * @throws InvalidArgumentException + * @param string $name Name of the function * - * @return void + * @return Builder\Function_ The created function builder */ - public static function nullOrEmail($value, $message = '') + public function function(string $name) : Builder\Function_ { - static::__callStatic('nullOrEmail', array($value, $message)); + return new Builder\Function_($name); } /** - * @param mixed $value - * @param string $message + * Creates a namespace/class use builder. * - * @throws InvalidArgumentException + * @param Node\Name|string $name Name of the entity (namespace or class) to alias * - * @return void + * @return Builder\Use_ The created use builder */ - public static function allEmail($value, $message = '') + public function use($name) : Builder\Use_ { - static::__callStatic('allEmail', array($value, $message)); + return new Builder\Use_($name, Use_::TYPE_NORMAL); } /** - * @param array|null $values - * @param string $message + * Creates a function use builder. * - * @throws InvalidArgumentException + * @param Node\Name|string $name Name of the function to alias * - * @return void + * @return Builder\Use_ The created use function builder */ - public static function nullOrUniqueValues($values, $message = '') + public function useFunction($name) : Builder\Use_ { - static::__callStatic('nullOrUniqueValues', array($values, $message)); + return new Builder\Use_($name, Use_::TYPE_FUNCTION); } /** - * @param iterable $values - * @param string $message + * Creates a constant use builder. * - * @throws InvalidArgumentException + * @param Node\Name|string $name Name of the const to alias * - * @return void + * @return Builder\Use_ The created use const builder */ - public static function allUniqueValues($values, $message = '') + public function useConst($name) : Builder\Use_ { - static::__callStatic('allUniqueValues', array($values, $message)); + return new Builder\Use_($name, Use_::TYPE_CONSTANT); } /** - * @param mixed $value - * @param mixed $expect - * @param string $message + * Creates a class constant builder. * - * @throws InvalidArgumentException + * @param string|Identifier $name Name + * @param Node\Expr|bool|null|int|float|string|array $value Value * - * @return void + * @return Builder\ClassConst The created use const builder */ - public static function nullOrEq($value, $expect, $message = '') + public function classConst($name, $value) : Builder\ClassConst { - static::__callStatic('nullOrEq', array($value, $expect, $message)); + return new Builder\ClassConst($name, $value); } /** - * @param mixed $value - * @param mixed $expect - * @param string $message + * Creates an enum case builder. * - * @throws InvalidArgumentException + * @param string|Identifier $name Name * - * @return void + * @return Builder\EnumCase The created use const builder */ - public static function allEq($value, $expect, $message = '') + public function enumCase($name) : Builder\EnumCase { - static::__callStatic('allEq', array($value, $expect, $message)); + return new Builder\EnumCase($name); } /** - * @param mixed $value - * @param mixed $expect - * @param string $message + * Creates node a for a literal value. * - * @throws InvalidArgumentException + * @param Expr|bool|null|int|float|string|array $value $value * - * @return void + * @return Expr */ - public static function nullOrNotEq($value, $expect, $message = '') + public function val($value) : Expr { - static::__callStatic('nullOrNotEq', array($value, $expect, $message)); + return BuilderHelpers::normalizeValue($value); } /** - * @param mixed $value - * @param mixed $expect - * @param string $message + * Creates variable node. * - * @throws InvalidArgumentException + * @param string|Expr $name Name * - * @return void + * @return Expr\Variable */ - public static function allNotEq($value, $expect, $message = '') + public function var($name) : Expr\Variable { - static::__callStatic('allNotEq', array($value, $expect, $message)); + if (!\is_string($name) && !$name instanceof Expr) { + throw new \LogicException('Variable name must be string or Expr'); + } + return new Expr\Variable($name); } /** - * @psalm-pure + * Normalizes an argument list. * - * @param mixed $value - * @param mixed $expect - * @param string $message + * Creates Arg nodes for all arguments and converts literal values to expressions. * - * @throws InvalidArgumentException + * @param array $args List of arguments to normalize * - * @return void + * @return Arg[] */ - public static function nullOrSame($value, $expect, $message = '') + public function args(array $args) : array { - static::__callStatic('nullOrSame', array($value, $expect, $message)); + $normalizedArgs = []; + foreach ($args as $key => $arg) { + if (!$arg instanceof Arg) { + $arg = new Arg(BuilderHelpers::normalizeValue($arg)); + } + if (\is_string($key)) { + $arg->name = BuilderHelpers::normalizeIdentifier($key); + } + $normalizedArgs[] = $arg; + } + return $normalizedArgs; } /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message + * Creates a function call node. * - * @throws InvalidArgumentException + * @param string|Name|Expr $name Function name + * @param array $args Function arguments * - * @return void + * @return Expr\FuncCall */ - public static function allSame($value, $expect, $message = '') + public function funcCall($name, array $args = []) : Expr\FuncCall { - static::__callStatic('allSame', array($value, $expect, $message)); + return new Expr\FuncCall(BuilderHelpers::normalizeNameOrExpr($name), $this->args($args)); } /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message + * Creates a method call node. * - * @throws InvalidArgumentException + * @param Expr $var Variable the method is called on + * @param string|Identifier|Expr $name Method name + * @param array $args Method arguments * - * @return void + * @return Expr\MethodCall */ - public static function nullOrNotSame($value, $expect, $message = '') + public function methodCall(Expr $var, $name, array $args = []) : Expr\MethodCall { - static::__callStatic('nullOrNotSame', array($value, $expect, $message)); + return new Expr\MethodCall($var, BuilderHelpers::normalizeIdentifierOrExpr($name), $this->args($args)); } /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $expect - * @param string $message + * Creates a static method call node. * - * @throws InvalidArgumentException + * @param string|Name|Expr $class Class name + * @param string|Identifier|Expr $name Method name + * @param array $args Method arguments * - * @return void + * @return Expr\StaticCall */ - public static function allNotSame($value, $expect, $message = '') + public function staticCall($class, $name, array $args = []) : Expr\StaticCall { - static::__callStatic('allNotSame', array($value, $expect, $message)); + return new Expr\StaticCall(BuilderHelpers::normalizeNameOrExpr($class), BuilderHelpers::normalizeIdentifierOrExpr($name), $this->args($args)); } /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message + * Creates an object creation node. * - * @throws InvalidArgumentException + * @param string|Name|Expr $class Class name + * @param array $args Constructor arguments * - * @return void + * @return Expr\New_ */ - public static function nullOrGreaterThan($value, $limit, $message = '') + public function new($class, array $args = []) : Expr\New_ { - static::__callStatic('nullOrGreaterThan', array($value, $limit, $message)); + return new Expr\New_(BuilderHelpers::normalizeNameOrExpr($class), $this->args($args)); } /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message + * Creates a constant fetch node. * - * @throws InvalidArgumentException + * @param string|Name $name Constant name * - * @return void + * @return Expr\ConstFetch */ - public static function allGreaterThan($value, $limit, $message = '') + public function constFetch($name) : Expr\ConstFetch { - static::__callStatic('allGreaterThan', array($value, $limit, $message)); + return new Expr\ConstFetch(BuilderHelpers::normalizeName($name)); } /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message + * Creates a property fetch node. * - * @throws InvalidArgumentException + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Property name * - * @return void + * @return Expr\PropertyFetch */ - public static function nullOrGreaterThanEq($value, $limit, $message = '') + public function propertyFetch(Expr $var, $name) : Expr\PropertyFetch { - static::__callStatic('nullOrGreaterThanEq', array($value, $limit, $message)); + return new Expr\PropertyFetch($var, BuilderHelpers::normalizeIdentifierOrExpr($name)); } /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message + * Creates a class constant fetch node. * - * @throws InvalidArgumentException + * @param string|Name|Expr $class Class name + * @param string|Identifier $name Constant name * - * @return void + * @return Expr\ClassConstFetch */ - public static function allGreaterThanEq($value, $limit, $message = '') + public function classConstFetch($class, $name) : Expr\ClassConstFetch { - static::__callStatic('allGreaterThanEq', array($value, $limit, $message)); + return new Expr\ClassConstFetch(BuilderHelpers::normalizeNameOrExpr($class), BuilderHelpers::normalizeIdentifier($name)); } /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message + * Creates nested Concat nodes from a list of expressions. * - * @throws InvalidArgumentException + * @param Expr|string ...$exprs Expressions or literal strings * - * @return void + * @return Concat */ - public static function nullOrLessThan($value, $limit, $message = '') + public function concat(...$exprs) : Concat { - static::__callStatic('nullOrLessThan', array($value, $limit, $message)); + $numExprs = \count($exprs); + if ($numExprs < 2) { + throw new \LogicException('Expected at least two expressions'); + } + $lastConcat = $this->normalizeStringExpr($exprs[0]); + for ($i = 1; $i < $numExprs; $i++) { + $lastConcat = new Concat($lastConcat, $this->normalizeStringExpr($exprs[$i])); + } + return $lastConcat; } /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $limit - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void + * @param string|Expr $expr + * @return Expr */ - public static function allLessThan($value, $limit, $message = '') + private function normalizeStringExpr($expr) : Expr { - static::__callStatic('allLessThan', array($value, $limit, $message)); + if ($expr instanceof Expr) { + return $expr; + } + if (\is_string($expr)) { + return new String_($expr); + } + throw new \LogicException('Expected string or Expr'); } +} +getNode(); + } + if ($node instanceof Node) { + return $node; + } + throw new \LogicException('Expected node or builder object'); } /** - * @psalm-pure + * Normalizes a node to a statement. * - * @param mixed $value - * @param mixed $limit - * @param string $message + * Expressions are wrapped in a Stmt\Expression node. * - * @throws InvalidArgumentException + * @param Node|Builder $node The node to normalize * - * @return void + * @return Stmt The normalized statement node */ - public static function allLessThanEq($value, $limit, $message = '') + public static function normalizeStmt($node) : Stmt { - static::__callStatic('allLessThanEq', array($value, $limit, $message)); + $node = self::normalizeNode($node); + if ($node instanceof Stmt) { + return $node; + } + if ($node instanceof Expr) { + return new Stmt\Expression($node); + } + throw new \LogicException('Expected statement or expression node'); } /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $min - * @param mixed $max - * @param string $message + * Normalizes strings to Identifier. * - * @throws InvalidArgumentException + * @param string|Identifier $name The identifier to normalize * - * @return void + * @return Identifier The normalized identifier */ - public static function nullOrRange($value, $min, $max, $message = '') + public static function normalizeIdentifier($name) : Identifier { - static::__callStatic('nullOrRange', array($value, $min, $max, $message)); + if ($name instanceof Identifier) { + return $name; + } + if (\is_string($name)) { + return new Identifier($name); + } + throw new \LogicException('PHPUnit\\Expected string or instance of Node\\Identifier'); } /** - * @psalm-pure - * - * @param mixed $value - * @param mixed $min - * @param mixed $max - * @param string $message + * Normalizes strings to Identifier, also allowing expressions. * - * @throws InvalidArgumentException + * @param string|Identifier|Expr $name The identifier to normalize * - * @return void + * @return Identifier|Expr The normalized identifier or expression */ - public static function allRange($value, $min, $max, $message = '') + public static function normalizeIdentifierOrExpr($name) { - static::__callStatic('allRange', array($value, $min, $max, $message)); + if ($name instanceof Identifier || $name instanceof Expr) { + return $name; + } + if (\is_string($name)) { + return new Identifier($name); + } + throw new \LogicException('PHPUnit\\Expected string or instance of Node\\Identifier or Node\\Expr'); } /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message + * Normalizes a name: Converts string names to Name nodes. * - * @throws InvalidArgumentException + * @param Name|string $name The name to normalize * - * @return void + * @return Name The normalized name */ - public static function nullOrOneOf($value, $values, $message = '') + public static function normalizeName($name) : Name { - static::__callStatic('nullOrOneOf', array($value, $values, $message)); + if ($name instanceof Name) { + return $name; + } + if (\is_string($name)) { + if (!$name) { + throw new \LogicException('Name cannot be empty'); + } + if ($name[0] === '\\') { + return new Name\FullyQualified(\substr($name, 1)); + } + if (0 === \strpos($name, 'namespace\\')) { + return new Name\Relative(\substr($name, \strlen('namespace\\'))); + } + return new Name($name); + } + throw new \LogicException('PHPUnit\\Name must be a string or an instance of Node\\Name'); } /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message + * Normalizes a name: Converts string names to Name nodes, while also allowing expressions. * - * @throws InvalidArgumentException + * @param Expr|Name|string $name The name to normalize * - * @return void + * @return Name|Expr The normalized name or expression */ - public static function allOneOf($value, $values, $message = '') + public static function normalizeNameOrExpr($name) { - static::__callStatic('allOneOf', array($value, $values, $message)); + if ($name instanceof Expr) { + return $name; + } + if (!\is_string($name) && !$name instanceof Name) { + throw new \LogicException('PHPUnit\\Name must be a string or an instance of Node\\Name or Node\\Expr'); + } + return self::normalizeName($name); } /** - * @psalm-pure + * Normalizes a type: Converts plain-text type names into proper AST representation. * - * @param mixed $value - * @param array $values - * @param string $message + * In particular, builtin types become Identifiers, custom types become Names and nullables + * are wrapped in NullableType nodes. * - * @throws InvalidArgumentException + * @param string|Name|Identifier|ComplexType $type The type to normalize * - * @return void + * @return Name|Identifier|ComplexType The normalized type */ - public static function nullOrInArray($value, $values, $message = '') + public static function normalizeType($type) { - static::__callStatic('nullOrInArray', array($value, $values, $message)); + if (!\is_string($type)) { + if (!$type instanceof Name && !$type instanceof Identifier && !$type instanceof ComplexType) { + throw new \LogicException('Type must be a string, or an instance of Name, Identifier or ComplexType'); + } + return $type; + } + $nullable = \false; + if (\strlen($type) > 0 && $type[0] === '?') { + $nullable = \true; + $type = \substr($type, 1); + } + $builtinTypes = ['array', 'callable', 'bool', 'int', 'float', 'string', 'iterable', 'void', 'object', 'null', 'false', 'mixed', 'never', 'true']; + $lowerType = \strtolower($type); + if (\in_array($lowerType, $builtinTypes)) { + $type = new Identifier($lowerType); + } else { + $type = self::normalizeName($type); + } + $notNullableTypes = ['void', 'mixed', 'never']; + if ($nullable && \in_array((string) $type, $notNullableTypes)) { + throw new \LogicException(\sprintf('%s type cannot be nullable', $type)); + } + return $nullable ? new NullableType($type) : $type; } /** - * @psalm-pure - * - * @param mixed $value - * @param array $values - * @param string $message + * Normalizes a value: Converts nulls, booleans, integers, + * floats, strings and arrays into their respective nodes * - * @throws InvalidArgumentException + * @param Node\Expr|bool|null|int|float|string|array $value The value to normalize * - * @return void + * @return Expr The normalized value */ - public static function allInArray($value, $values, $message = '') + public static function normalizeValue($value) : Expr { - static::__callStatic('allInArray', array($value, $values, $message)); + if ($value instanceof Node\Expr) { + return $value; + } + if (\is_null($value)) { + return new Expr\ConstFetch(new Name('null')); + } + if (\is_bool($value)) { + return new Expr\ConstFetch(new Name($value ? 'true' : 'false')); + } + if (\is_int($value)) { + return new Scalar\LNumber($value); + } + if (\is_float($value)) { + return new Scalar\DNumber($value); + } + if (\is_string($value)) { + return new Scalar\String_($value); + } + if (\is_array($value)) { + $items = []; + $lastKey = -1; + foreach ($value as $itemKey => $itemValue) { + // for consecutive, numeric keys don't generate keys + if (null !== $lastKey && ++$lastKey === $itemKey) { + $items[] = new Expr\ArrayItem(self::normalizeValue($itemValue)); + } else { + $lastKey = null; + $items[] = new Expr\ArrayItem(self::normalizeValue($itemValue), self::normalizeValue($itemKey)); + } + } + return new Expr\Array_($items); + } + throw new \LogicException('Invalid value'); } /** - * @psalm-pure - * - * @param string|null $value - * @param string $subString - * @param string $message + * Normalizes a doc comment: Converts plain strings to PhpParser\Comment\Doc. * - * @throws InvalidArgumentException + * @param Comment\Doc|string $docComment The doc comment to normalize * - * @return void + * @return Comment\Doc The normalized doc comment */ - public static function nullOrContains($value, $subString, $message = '') + public static function normalizeDocComment($docComment) : Comment\Doc { - static::__callStatic('nullOrContains', array($value, $subString, $message)); + if ($docComment instanceof Comment\Doc) { + return $docComment; + } + if (\is_string($docComment)) { + return new Comment\Doc($docComment); + } + throw new \LogicException('PHPUnit\\Doc comment must be a string or an instance of PhpParser\\Comment\\Doc'); } /** - * @psalm-pure - * - * @param iterable $value - * @param string $subString - * @param string $message + * Normalizes a attribute: Converts attribute to the Attribute Group if needed. * - * @throws InvalidArgumentException + * @param Node\Attribute|Node\AttributeGroup $attribute * - * @return void + * @return Node\AttributeGroup The Attribute Group */ - public static function allContains($value, $subString, $message = '') + public static function normalizeAttribute($attribute) : Node\AttributeGroup { - static::__callStatic('allContains', array($value, $subString, $message)); + if ($attribute instanceof Node\AttributeGroup) { + return $attribute; + } + if (!$attribute instanceof Node\Attribute) { + throw new \LogicException('PHPUnit\\Attribute must be an instance of PhpParser\\Node\\Attribute or PhpParser\\Node\\AttributeGroup'); + } + return new Node\AttributeGroup([$attribute]); } /** - * @psalm-pure - * - * @param string|null $value - * @param string $subString - * @param string $message + * Adds a modifier and returns new modifier bitmask. * - * @throws InvalidArgumentException + * @param int $modifiers Existing modifiers + * @param int $modifier Modifier to set * - * @return void + * @return int New modifiers */ - public static function nullOrNotContains($value, $subString, $message = '') + public static function addModifier(int $modifiers, int $modifier) : int { - static::__callStatic('nullOrNotContains', array($value, $subString, $message)); + Stmt\Class_::verifyModifier($modifiers, $modifier); + return $modifiers | $modifier; } /** - * @psalm-pure - * - * @param iterable $value - * @param string $subString - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void + * Adds a modifier and returns new modifier bitmask. + * @return int New modifiers */ - public static function allNotContains($value, $subString, $message = '') + public static function addClassModifier(int $existingModifiers, int $modifierToSet) : int { - static::__callStatic('allNotContains', array($value, $subString, $message)); + Stmt\Class_::verifyClassModifier($existingModifiers, $modifierToSet); + return $existingModifiers | $modifierToSet; } +} + $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void + * @param string $text Comment text (including comment delimiters like /*) + * @param int $startLine Line number the comment started on + * @param int $startFilePos File offset the comment started on + * @param int $startTokenPos Token offset the comment started on */ - public static function allNotWhitespaceOnly($value, $message = '') + public function __construct(string $text, int $startLine = -1, int $startFilePos = -1, int $startTokenPos = -1, int $endLine = -1, int $endFilePos = -1, int $endTokenPos = -1) { - static::__callStatic('allNotWhitespaceOnly', array($value, $message)); + $this->text = $text; + $this->startLine = $startLine; + $this->startFilePos = $startFilePos; + $this->startTokenPos = $startTokenPos; + $this->endLine = $endLine; + $this->endFilePos = $endFilePos; + $this->endTokenPos = $endTokenPos; } /** - * @psalm-pure - * - * @param string|null $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException + * Gets the comment text. * - * @return void + * @return string The comment text (including comment delimiters like /*) */ - public static function nullOrStartsWith($value, $prefix, $message = '') + public function getText() : string { - static::__callStatic('nullOrStartsWith', array($value, $prefix, $message)); + return $this->text; } /** - * @psalm-pure - * - * @param iterable $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException + * Gets the line number the comment started on. * - * @return void + * @return int Line number (or -1 if not available) */ - public static function allStartsWith($value, $prefix, $message = '') + public function getStartLine() : int { - static::__callStatic('allStartsWith', array($value, $prefix, $message)); + return $this->startLine; } /** - * @psalm-pure - * - * @param string|null $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException + * Gets the file offset the comment started on. * - * @return void + * @return int File offset (or -1 if not available) */ - public static function nullOrNotStartsWith($value, $prefix, $message = '') + public function getStartFilePos() : int { - static::__callStatic('nullOrNotStartsWith', array($value, $prefix, $message)); + return $this->startFilePos; } /** - * @psalm-pure - * - * @param iterable $value - * @param string $prefix - * @param string $message - * - * @throws InvalidArgumentException + * Gets the token offset the comment started on. * - * @return void + * @return int Token offset (or -1 if not available) */ - public static function allNotStartsWith($value, $prefix, $message = '') + public function getStartTokenPos() : int { - static::__callStatic('allNotStartsWith', array($value, $prefix, $message)); + return $this->startTokenPos; } /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Gets the line number the comment ends on. * - * @return void + * @return int Line number (or -1 if not available) */ - public static function nullOrStartsWithLetter($value, $message = '') + public function getEndLine() : int { - static::__callStatic('nullOrStartsWithLetter', array($value, $message)); + return $this->endLine; } /** - * @psalm-pure - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Gets the file offset the comment ends on. * - * @return void + * @return int File offset (or -1 if not available) */ - public static function allStartsWithLetter($value, $message = '') + public function getEndFilePos() : int { - static::__callStatic('allStartsWithLetter', array($value, $message)); + return $this->endFilePos; } /** - * @psalm-pure - * - * @param string|null $value - * @param string $suffix - * @param string $message - * - * @throws InvalidArgumentException + * Gets the token offset the comment ends on. * - * @return void + * @return int Token offset (or -1 if not available) */ - public static function nullOrEndsWith($value, $suffix, $message = '') + public function getEndTokenPos() : int { - static::__callStatic('nullOrEndsWith', array($value, $suffix, $message)); + return $this->endTokenPos; } /** - * @psalm-pure - * - * @param iterable $value - * @param string $suffix - * @param string $message + * Gets the line number the comment started on. * - * @throws InvalidArgumentException + * @deprecated Use getStartLine() instead * - * @return void + * @return int Line number */ - public static function allEndsWith($value, $suffix, $message = '') + public function getLine() : int { - static::__callStatic('allEndsWith', array($value, $suffix, $message)); + return $this->startLine; } /** - * @psalm-pure - * - * @param string|null $value - * @param string $suffix - * @param string $message + * Gets the file offset the comment started on. * - * @throws InvalidArgumentException + * @deprecated Use getStartFilePos() instead * - * @return void + * @return int File offset */ - public static function nullOrNotEndsWith($value, $suffix, $message = '') + public function getFilePos() : int { - static::__callStatic('nullOrNotEndsWith', array($value, $suffix, $message)); + return $this->startFilePos; } /** - * @psalm-pure - * - * @param iterable $value - * @param string $suffix - * @param string $message + * Gets the token offset the comment started on. * - * @throws InvalidArgumentException + * @deprecated Use getStartTokenPos() instead * - * @return void + * @return int Token offset */ - public static function allNotEndsWith($value, $suffix, $message = '') + public function getTokenPos() : int { - static::__callStatic('allNotEndsWith', array($value, $suffix, $message)); + return $this->startTokenPos; } /** - * @psalm-pure - * - * @param string|null $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException + * Gets the comment text. * - * @return void + * @return string The comment text (including comment delimiters like /*) */ - public static function nullOrRegex($value, $pattern, $message = '') + public function __toString() : string { - static::__callStatic('nullOrRegex', array($value, $pattern, $message)); + return $this->text; } /** - * @psalm-pure - * - * @param iterable $value - * @param string $pattern - * @param string $message + * Gets the reformatted comment text. * - * @throws InvalidArgumentException + * "Reformatted" here means that we try to clean up the whitespace at the + * starts of the lines. This is necessary because we receive the comments + * without trailing whitespace on the first line, but with trailing whitespace + * on all subsequent lines. * - * @return void + * @return mixed|string */ - public static function allRegex($value, $pattern, $message = '') + public function getReformattedText() { - static::__callStatic('allRegex', array($value, $pattern, $message)); + $text = \trim($this->text); + $newlinePos = \strpos($text, "\n"); + if (\false === $newlinePos) { + // Single line comments don't need further processing + return $text; + } elseif (\preg_match('((*BSR_ANYCRLF)(*ANYCRLF)^.*(?:\\R\\s+\\*.*)+$)', $text)) { + // Multi line comment of the type + // + // /* + // * Some text. + // * Some more text. + // */ + // + // is handled by replacing the whitespace sequences before the * by a single space + return \preg_replace('(^\\s+\\*)m', ' *', $this->text); + } elseif (\preg_match('(^/\\*\\*?\\s*[\\r\\n])', $text) && \preg_match('(\\n(\\s*)\\*/$)', $text, $matches)) { + // Multi line comment of the type + // + // /* + // Some text. + // Some more text. + // */ + // + // is handled by removing the whitespace sequence on the line before the closing + // */ on all lines. So if the last line is " */", then " " is removed at the + // start of all lines. + return \preg_replace('(^' . \preg_quote($matches[1]) . ')m', '', $text); + } elseif (\preg_match('(^/\\*\\*?\\s*(?!\\s))', $text, $matches)) { + // Multi line comment of the type + // + // /* Some text. + // Some more text. + // Indented text. + // Even more text. */ + // + // is handled by removing the difference between the shortest whitespace prefix on all + // lines and the length of the "/* " opening sequence. + $prefixLen = $this->getShortestWhitespacePrefixLen(\substr($text, $newlinePos + 1)); + $removeLen = $prefixLen - \strlen($matches[0]); + return \preg_replace('(^\\s{' . $removeLen . '})m', '', $text); + } + // No idea how to format this comment, so simply return as is + return $text; } /** - * @psalm-pure - * - * @param string|null $value - * @param string $pattern - * @param string $message + * Get length of shortest whitespace prefix (at the start of a line). * - * @throws InvalidArgumentException + * If there is a line with no prefix whitespace, 0 is a valid return value. * - * @return void + * @param string $str String to check + * @return int Length in characters. Tabs count as single characters. */ - public static function nullOrNotRegex($value, $pattern, $message = '') + private function getShortestWhitespacePrefixLen(string $str) : int { - static::__callStatic('nullOrNotRegex', array($value, $pattern, $message)); + $lines = \explode("\n", $str); + $shortestPrefixLen = \INF; + foreach ($lines as $line) { + \preg_match('(^\\s*)', $line, $matches); + $prefixLen = \strlen($matches[0]); + if ($prefixLen < $shortestPrefixLen) { + $shortestPrefixLen = $prefixLen; + } + } + return $shortestPrefixLen; } /** - * @psalm-pure - * - * @param iterable $value - * @param string $pattern - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void + * @return array + * @psalm-return array{nodeType:string, text:mixed, line:mixed, filePos:mixed} */ - public static function allNotRegex($value, $pattern, $message = '') + public function jsonSerialize() : array { - static::__callStatic('allNotRegex', array($value, $pattern, $message)); + // Technically not a node, but we make it look like one anyway + $type = $this instanceof Comment\Doc ? 'Comment_Doc' : 'Comment'; + return [ + 'nodeType' => $type, + 'text' => $this->text, + // TODO: Rename these to include "start". + 'line' => $this->startLine, + 'filePos' => $this->startFilePos, + 'tokenPos' => $this->startTokenPos, + 'endLine' => $this->endLine, + 'endFilePos' => $this->endFilePos, + 'endTokenPos' => $this->endTokenPos, + ]; } +} +fallbackEvaluator = $fallbackEvaluator ?? function (Expr $expr) { + throw new ConstExprEvaluationException("Expression of type {$expr->getType()} cannot be evaluated"); + }; } /** - * @psalm-pure - * - * @param mixed $value - * @param string $message + * Silently evaluates a constant expression into a PHP value. * - * @throws InvalidArgumentException + * Thrown Errors, warnings or notices will be converted into a ConstExprEvaluationException. + * The original source of the exception is available through getPrevious(). * - * @return void - */ - public static function allUnicodeLetters($value, $message = '') - { - static::__callStatic('allUnicodeLetters', array($value, $message)); - } - /** - * @psalm-pure + * If some part of the expression cannot be evaluated, the fallback evaluator passed to the + * constructor will be invoked. By default, if no fallback is provided, an exception of type + * ConstExprEvaluationException is thrown. * - * @param mixed $value - * @param string $message + * See class doc comment for caveats and limitations. * - * @throws InvalidArgumentException + * @param Expr $expr Constant expression to evaluate + * @return mixed Result of evaluation * - * @return void + * @throws ConstExprEvaluationException if the expression cannot be evaluated or an error occurred */ - public static function nullOrAlpha($value, $message = '') + public function evaluateSilently(Expr $expr) { - static::__callStatic('nullOrAlpha', array($value, $message)); + \set_error_handler(function ($num, $str, $file, $line) { + throw new \ErrorException($str, 0, $num, $file, $line); + }); + try { + return $this->evaluate($expr); + } catch (\Throwable $e) { + if (!$e instanceof ConstExprEvaluationException) { + $e = new ConstExprEvaluationException("An error occurred during constant expression evaluation", 0, $e); + } + throw $e; + } finally { + \restore_error_handler(); + } } /** - * @psalm-pure - * - * @param mixed $value - * @param string $message + * Directly evaluates a constant expression into a PHP value. * - * @throws InvalidArgumentException + * May generate Error exceptions, warnings or notices. Use evaluateSilently() to convert these + * into a ConstExprEvaluationException. * - * @return void - */ - public static function allAlpha($value, $message = '') - { - static::__callStatic('allAlpha', array($value, $message)); - } - /** - * @psalm-pure + * If some part of the expression cannot be evaluated, the fallback evaluator passed to the + * constructor will be invoked. By default, if no fallback is provided, an exception of type + * ConstExprEvaluationException is thrown. * - * @param string|null $value - * @param string $message + * See class doc comment for caveats and limitations. * - * @throws InvalidArgumentException + * @param Expr $expr Constant expression to evaluate + * @return mixed Result of evaluation * - * @return void + * @throws ConstExprEvaluationException if the expression cannot be evaluated */ - public static function nullOrDigits($value, $message = '') + public function evaluateDirectly(Expr $expr) { - static::__callStatic('nullOrDigits', array($value, $message)); + return $this->evaluate($expr); } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allDigits($value, $message = '') + private function evaluate(Expr $expr) { - static::__callStatic('allDigits', array($value, $message)); + if ($expr instanceof Scalar\LNumber || $expr instanceof Scalar\DNumber || $expr instanceof Scalar\String_) { + return $expr->value; + } + if ($expr instanceof Expr\Array_) { + return $this->evaluateArray($expr); + } + // Unary operators + if ($expr instanceof Expr\UnaryPlus) { + return +$this->evaluate($expr->expr); + } + if ($expr instanceof Expr\UnaryMinus) { + return -$this->evaluate($expr->expr); + } + if ($expr instanceof Expr\BooleanNot) { + return !$this->evaluate($expr->expr); + } + if ($expr instanceof Expr\BitwiseNot) { + return ~$this->evaluate($expr->expr); + } + if ($expr instanceof Expr\BinaryOp) { + return $this->evaluateBinaryOp($expr); + } + if ($expr instanceof Expr\Ternary) { + return $this->evaluateTernary($expr); + } + if ($expr instanceof Expr\ArrayDimFetch && null !== $expr->dim) { + return $this->evaluate($expr->var)[$this->evaluate($expr->dim)]; + } + if ($expr instanceof Expr\ConstFetch) { + return $this->evaluateConstFetch($expr); + } + return ($this->fallbackEvaluator)($expr); } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrAlnum($value, $message = '') + private function evaluateArray(Expr\Array_ $expr) { - static::__callStatic('nullOrAlnum', array($value, $message)); + $array = []; + foreach ($expr->items as $item) { + if (null !== $item->key) { + $array[$this->evaluate($item->key)] = $this->evaluate($item->value); + } elseif ($item->unpack) { + $array = array_merge($array, $this->evaluate($item->value)); + } else { + $array[] = $this->evaluate($item->value); + } + } + return $array; } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allAlnum($value, $message = '') + private function evaluateTernary(Expr\Ternary $expr) { - static::__callStatic('allAlnum', array($value, $message)); + if (null === $expr->if) { + return $this->evaluate($expr->cond) ?: $this->evaluate($expr->else); + } + return $this->evaluate($expr->cond) ? $this->evaluate($expr->if) : $this->evaluate($expr->else); } - /** - * @psalm-pure - * @psalm-assert lowercase-string|null $value - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrLower($value, $message = '') + private function evaluateBinaryOp(Expr\BinaryOp $expr) { - static::__callStatic('nullOrLower', array($value, $message)); - } - /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allLower($value, $message = '') - { - static::__callStatic('allLower', array($value, $message)); + if ($expr instanceof Expr\BinaryOp\Coalesce && $expr->left instanceof Expr\ArrayDimFetch) { + // This needs to be special cased to respect BP_VAR_IS fetch semantics + return $this->evaluate($expr->left->var)[$this->evaluate($expr->left->dim)] ?? $this->evaluate($expr->right); + } + // The evaluate() calls are repeated in each branch, because some of the operators are + // short-circuiting and evaluating the RHS in advance may be illegal in that case + $l = $expr->left; + $r = $expr->right; + switch ($expr->getOperatorSigil()) { + case '&': + return $this->evaluate($l) & $this->evaluate($r); + case '|': + return $this->evaluate($l) | $this->evaluate($r); + case '^': + return $this->evaluate($l) ^ $this->evaluate($r); + case '&&': + return $this->evaluate($l) && $this->evaluate($r); + case '||': + return $this->evaluate($l) || $this->evaluate($r); + case '??': + return $this->evaluate($l) ?? $this->evaluate($r); + case '.': + return $this->evaluate($l) . $this->evaluate($r); + case '/': + return $this->evaluate($l) / $this->evaluate($r); + case '==': + return $this->evaluate($l) == $this->evaluate($r); + case '>': + return $this->evaluate($l) > $this->evaluate($r); + case '>=': + return $this->evaluate($l) >= $this->evaluate($r); + case '===': + return $this->evaluate($l) === $this->evaluate($r); + case 'and': + return $this->evaluate($l) and $this->evaluate($r); + case 'or': + return $this->evaluate($l) or $this->evaluate($r); + case 'xor': + return $this->evaluate($l) xor $this->evaluate($r); + case '-': + return $this->evaluate($l) - $this->evaluate($r); + case '%': + return $this->evaluate($l) % $this->evaluate($r); + case '*': + return $this->evaluate($l) * $this->evaluate($r); + case '!=': + return $this->evaluate($l) != $this->evaluate($r); + case '!==': + return $this->evaluate($l) !== $this->evaluate($r); + case '+': + return $this->evaluate($l) + $this->evaluate($r); + case '**': + return $this->evaluate($l) ** $this->evaluate($r); + case '<<': + return $this->evaluate($l) << $this->evaluate($r); + case '>>': + return $this->evaluate($l) >> $this->evaluate($r); + case '<': + return $this->evaluate($l) < $this->evaluate($r); + case '<=': + return $this->evaluate($l) <= $this->evaluate($r); + case '<=>': + return $this->evaluate($l) <=> $this->evaluate($r); + } + throw new \Exception('Should not happen'); } - /** - * @psalm-pure - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrUpper($value, $message = '') + private function evaluateConstFetch(Expr\ConstFetch $expr) { - static::__callStatic('nullOrUpper', array($value, $message)); + $name = $expr->name->toLowerString(); + switch ($name) { + case 'null': + return null; + case 'false': + return \false; + case 'true': + return \true; + } + return ($this->fallbackEvaluator)($expr); } +} + $value - * @param string $message - * - * @throws InvalidArgumentException + * Creates an Exception signifying a parse error. * - * @return void + * @param string $message Error message + * @param array|int $attributes Attributes of node/token where error occurred + * (or start line of error -- deprecated) */ - public static function allUpper($value, $message = '') + public function __construct(string $message, $attributes = []) { - static::__callStatic('allUpper', array($value, $message)); + $this->rawMessage = $message; + if (\is_array($attributes)) { + $this->attributes = $attributes; + } else { + $this->attributes = ['startLine' => $attributes]; + } + $this->updateMessage(); } /** - * @psalm-pure - * - * @param string|null $value - * @param int $length - * @param string $message - * - * @throws InvalidArgumentException + * Gets the error message * - * @return void + * @return string Error message */ - public static function nullOrLength($value, $length, $message = '') + public function getRawMessage() : string { - static::__callStatic('nullOrLength', array($value, $length, $message)); + return $this->rawMessage; } /** - * @psalm-pure - * - * @param iterable $value - * @param int $length - * @param string $message - * - * @throws InvalidArgumentException + * Gets the line the error starts in. * - * @return void + * @return int Error start line */ - public static function allLength($value, $length, $message = '') + public function getStartLine() : int { - static::__callStatic('allLength', array($value, $length, $message)); + return $this->attributes['startLine'] ?? -1; } /** - * @psalm-pure - * - * @param string|null $value - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException + * Gets the line the error ends in. * - * @return void + * @return int Error end line */ - public static function nullOrMinLength($value, $min, $message = '') + public function getEndLine() : int { - static::__callStatic('nullOrMinLength', array($value, $min, $message)); + return $this->attributes['endLine'] ?? -1; } /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException + * Gets the attributes of the node/token the error occurred at. * - * @return void + * @return array */ - public static function allMinLength($value, $min, $message = '') + public function getAttributes() : array { - static::__callStatic('allMinLength', array($value, $min, $message)); + return $this->attributes; } /** - * @psalm-pure - * - * @param string|null $value - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException + * Sets the attributes of the node/token the error occurred at. * - * @return void + * @param array $attributes */ - public static function nullOrMaxLength($value, $max, $message = '') + public function setAttributes(array $attributes) { - static::__callStatic('nullOrMaxLength', array($value, $max, $message)); + $this->attributes = $attributes; + $this->updateMessage(); } /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException + * Sets the line of the PHP file the error occurred in. * - * @return void + * @param string $message Error message */ - public static function allMaxLength($value, $max, $message = '') + public function setRawMessage(string $message) { - static::__callStatic('allMaxLength', array($value, $max, $message)); + $this->rawMessage = $message; + $this->updateMessage(); } /** - * @psalm-pure - * - * @param string|null $value - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException + * Sets the line the error starts in. * - * @return void + * @param int $line Error start line */ - public static function nullOrLengthBetween($value, $min, $max, $message = '') + public function setStartLine(int $line) { - static::__callStatic('nullOrLengthBetween', array($value, $min, $max, $message)); + $this->attributes['startLine'] = $line; + $this->updateMessage(); } /** - * @psalm-pure - * - * @param iterable $value - * @param int|float $min - * @param int|float $max - * @param string $message + * Returns whether the error has start and end column information. * - * @throws InvalidArgumentException + * For column information enable the startFilePos and endFilePos in the lexer options. * - * @return void + * @return bool */ - public static function allLengthBetween($value, $min, $max, $message = '') + public function hasColumnInfo() : bool { - static::__callStatic('allLengthBetween', array($value, $min, $max, $message)); + return isset($this->attributes['startFilePos'], $this->attributes['endFilePos']); } /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Gets the start column (1-based) into the line where the error started. * - * @return void + * @param string $code Source code of the file + * @return int */ - public static function nullOrFileExists($value, $message = '') + public function getStartColumn(string $code) : int { - static::__callStatic('nullOrFileExists', array($value, $message)); + if (!$this->hasColumnInfo()) { + throw new \RuntimeException('Error does not have column information'); + } + return $this->toColumn($code, $this->attributes['startFilePos']); } /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Gets the end column (1-based) into the line where the error ended. * - * @return void + * @param string $code Source code of the file + * @return int */ - public static function allFileExists($value, $message = '') + public function getEndColumn(string $code) : int { - static::__callStatic('allFileExists', array($value, $message)); + if (!$this->hasColumnInfo()) { + throw new \RuntimeException('Error does not have column information'); + } + return $this->toColumn($code, $this->attributes['endFilePos']); } /** - * @param mixed $value - * @param string $message + * Formats message including line and column information. * - * @throws InvalidArgumentException + * @param string $code Source code associated with the error, for calculation of the columns * - * @return void + * @return string Formatted message */ - public static function nullOrFile($value, $message = '') + public function getMessageWithColumnInfo(string $code) : string { - static::__callStatic('nullOrFile', array($value, $message)); + return \sprintf('%s from %d:%d to %d:%d', $this->getRawMessage(), $this->getStartLine(), $this->getStartColumn($code), $this->getEndLine(), $this->getEndColumn($code)); } /** - * @param mixed $value - * @param string $message + * Converts a file offset into a column. * - * @throws InvalidArgumentException + * @param string $code Source code that $pos indexes into + * @param int $pos 0-based position in $code * - * @return void + * @return int 1-based column (relative to start of line) */ - public static function allFile($value, $message = '') + private function toColumn(string $code, int $pos) : int { - static::__callStatic('allFile', array($value, $message)); + if ($pos > \strlen($code)) { + throw new \RuntimeException('Invalid position information'); + } + $lineStartPos = \strrpos($code, "\n", $pos - \strlen($code)); + if (\false === $lineStartPos) { + $lineStartPos = -1; + } + return $pos - $lineStartPos; } /** - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void + * Updates the exception message after a change to rawMessage or rawLine. */ - public static function nullOrDirectory($value, $message = '') + protected function updateMessage() { - static::__callStatic('nullOrDirectory', array($value, $message)); + $this->message = $this->rawMessage; + if (-1 === $this->getStartLine()) { + $this->message .= ' on unknown line'; + } else { + $this->message .= ' on line ' . $this->getStartLine(); + } } +} +errors[] = $error; } /** - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException + * Get collected errors. * - * @return void + * @return Error[] */ - public static function nullOrReadable($value, $message = '') + public function getErrors() : array { - static::__callStatic('nullOrReadable', array($value, $message)); + return $this->errors; } /** - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException + * Check whether there are any errors. * - * @return void + * @return bool */ - public static function allReadable($value, $message = '') + public function hasErrors() : bool { - static::__callStatic('allReadable', array($value, $message)); + return !empty($this->errors); } /** - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void + * Reset/clear collected errors. */ - public static function nullOrWritable($value, $message = '') + public function clearErrors() { - static::__callStatic('nullOrWritable', array($value, $message)); + $this->errors = []; } - /** - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allWritable($value, $message = '') +} +type = $type; + $this->old = $old; + $this->new = $new; } +} + $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Create differ over the given equality relation. * - * @return void + * @param callable $isEqual Equality relation with signature function($a, $b) : bool */ - public static function allClassExists($value, $message = '') + public function __construct(callable $isEqual) { - static::__callStatic('allClassExists', array($value, $message)); + $this->isEqual = $isEqual; } /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert class-string|ExpectedType|null $value - * - * @param mixed $value - * @param string|object $class - * @param string $message + * Calculate diff (edit script) from $old to $new. * - * @throws InvalidArgumentException + * @param array $old Original array + * @param array $new New array * - * @return void + * @return DiffElem[] Diff (edit script) */ - public static function nullOrSubclassOf($value, $class, $message = '') + public function diff(array $old, array $new) { - static::__callStatic('nullOrSubclassOf', array($value, $class, $message)); + list($trace, $x, $y) = $this->calculateTrace($old, $new); + return $this->extractDiff($trace, $x, $y, $old, $new); } /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $class - * @psalm-assert iterable|ExpectedType> $value + * Calculate diff, including "replace" operations. * - * @param mixed $value - * @param string|object $class - * @param string $message + * If a sequence of remove operations is followed by the same number of add operations, these + * will be coalesced into replace operations. * - * @throws InvalidArgumentException + * @param array $old Original array + * @param array $new New array * - * @return void + * @return DiffElem[] Diff (edit script), including replace operations */ - public static function allSubclassOf($value, $class, $message = '') + public function diffWithReplacements(array $old, array $new) { - static::__callStatic('allSubclassOf', array($value, $class, $message)); + return $this->coalesceReplacements($this->diff($old, $new)); } - /** - * @psalm-assert class-string|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrInterfaceExists($value, $message = '') + private function calculateTrace(array $a, array $b) { - static::__callStatic('nullOrInterfaceExists', array($value, $message)); - } - /** - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allInterfaceExists($value, $message = '') - { - static::__callStatic('allInterfaceExists', array($value, $message)); - } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert class-string|null $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrImplementsInterface($value, $interface, $message = '') - { - static::__callStatic('nullOrImplementsInterface', array($value, $interface, $message)); + $n = \count($a); + $m = \count($b); + $max = $n + $m; + $v = [1 => 0]; + $trace = []; + for ($d = 0; $d <= $max; $d++) { + $trace[] = $v; + for ($k = -$d; $k <= $d; $k += 2) { + if ($k === -$d || $k !== $d && $v[$k - 1] < $v[$k + 1]) { + $x = $v[$k + 1]; + } else { + $x = $v[$k - 1] + 1; + } + $y = $x - $k; + while ($x < $n && $y < $m && ($this->isEqual)($a[$x], $b[$y])) { + $x++; + $y++; + } + $v[$k] = $x; + if ($x >= $n && $y >= $m) { + return [$trace, $x, $y]; + } + } + } + throw new \Exception('Should not happen'); } - /** - * @psalm-pure - * @psalm-template ExpectedType of object - * @psalm-param class-string $interface - * @psalm-assert iterable> $value - * - * @param mixed $value - * @param mixed $interface - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allImplementsInterface($value, $interface, $message = '') + private function extractDiff(array $trace, int $x, int $y, array $a, array $b) { - static::__callStatic('allImplementsInterface', array($value, $interface, $message)); + $result = []; + for ($d = \count($trace) - 1; $d >= 0; $d--) { + $v = $trace[$d]; + $k = $x - $y; + if ($k === -$d || $k !== $d && $v[$k - 1] < $v[$k + 1]) { + $prevK = $k + 1; + } else { + $prevK = $k - 1; + } + $prevX = $v[$prevK]; + $prevY = $prevX - $prevK; + while ($x > $prevX && $y > $prevY) { + $result[] = new DiffElem(DiffElem::TYPE_KEEP, $a[$x - 1], $b[$y - 1]); + $x--; + $y--; + } + if ($d === 0) { + break; + } + while ($x > $prevX) { + $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $a[$x - 1], null); + $x--; + } + while ($y > $prevY) { + $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $b[$y - 1]); + $y--; + } + } + return \array_reverse($result); } /** - * @psalm-pure - * @psalm-param class-string|object|null $classOrObject - * - * @param string|object|null $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException + * Coalesce equal-length sequences of remove+add into a replace operation. * - * @return void + * @param DiffElem[] $diff + * @return DiffElem[] */ - public static function nullOrPropertyExists($classOrObject, $property, $message = '') + private function coalesceReplacements(array $diff) { - static::__callStatic('nullOrPropertyExists', array($classOrObject, $property, $message)); + $newDiff = []; + $c = \count($diff); + for ($i = 0; $i < $c; $i++) { + $diffType = $diff[$i]->type; + if ($diffType !== DiffElem::TYPE_REMOVE) { + $newDiff[] = $diff[$i]; + continue; + } + $j = $i; + while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { + $j++; + } + $k = $j; + while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { + $k++; + } + if ($j - $i === $k - $j) { + $len = $j - $i; + for ($n = 0; $n < $len; $n++) { + $newDiff[] = new DiffElem(DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new); + } + } else { + for (; $i < $k; $i++) { + $newDiff[] = $diff[$i]; + } + } + $i = $k - 1; + } + return $newDiff; } - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allPropertyExists($classOrObject, $property, $message = '') +} +attrGroups = $attrGroups; + $this->args = $args; + $this->extends = $extends; + $this->implements = $implements; + $this->stmts = $stmts; } - /** - * @psalm-pure - * @psalm-param class-string|object|null $classOrObject - * - * @param string|object|null $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrPropertyNotExists($classOrObject, $property, $message = '') + public static function fromNewNode(Expr\New_ $newNode) { - static::__callStatic('nullOrPropertyNotExists', array($classOrObject, $property, $message)); + $class = $newNode->class; + \assert($class instanceof Node\Stmt\Class_); + // We don't assert that $class->name is null here, to allow consumers to assign unique names + // to anonymous classes for their own purposes. We simplify ignore the name here. + return new self($class->attrGroups, $newNode->args, $class->extends, $class->implements, $class->stmts, $newNode->getAttributes()); } - /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $property - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allPropertyNotExists($classOrObject, $property, $message = '') + public function getType() : string { - static::__callStatic('allPropertyNotExists', array($classOrObject, $property, $message)); + return 'Expr_PrintableNewAnonClass'; } - /** - * @psalm-pure - * @psalm-param class-string|object|null $classOrObject - * - * @param string|object|null $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMethodExists($classOrObject, $method, $message = '') + public function getSubNodeNames() : array { - static::__callStatic('nullOrMethodExists', array($classOrObject, $method, $message)); + return ['attrGroups', 'args', 'extends', 'implements', 'stmts']; } +} + $classOrObject - * - * @param iterable $classOrObject - * @param mixed $method - * @param string $message - * - * @throws InvalidArgumentException + * Create token stream instance. * - * @return void + * @param array $tokens Tokens in token_get_all() format */ - public static function allMethodExists($classOrObject, $method, $message = '') + public function __construct(array $tokens) { - static::__callStatic('allMethodExists', array($classOrObject, $method, $message)); + $this->tokens = $tokens; + $this->indentMap = $this->calcIndentMap(); } /** - * @psalm-pure - * @psalm-param class-string|object|null $classOrObject - * - * @param string|object|null $classOrObject - * @param mixed $method - * @param string $message + * Whether the given position is immediately surrounded by parenthesis. * - * @throws InvalidArgumentException + * @param int $startPos Start position + * @param int $endPos End position * - * @return void + * @return bool */ - public static function nullOrMethodNotExists($classOrObject, $method, $message = '') + public function haveParens(int $startPos, int $endPos) : bool { - static::__callStatic('nullOrMethodNotExists', array($classOrObject, $method, $message)); + return $this->haveTokenImmediatelyBefore($startPos, '(') && $this->haveTokenImmediatelyAfter($endPos, ')'); } /** - * @psalm-pure - * @psalm-param iterable $classOrObject - * - * @param iterable $classOrObject - * @param mixed $method - * @param string $message + * Whether the given position is immediately surrounded by braces. * - * @throws InvalidArgumentException + * @param int $startPos Start position + * @param int $endPos End position * - * @return void + * @return bool */ - public static function allMethodNotExists($classOrObject, $method, $message = '') + public function haveBraces(int $startPos, int $endPos) : bool { - static::__callStatic('allMethodNotExists', array($classOrObject, $method, $message)); + return ($this->haveTokenImmediatelyBefore($startPos, '{') || $this->haveTokenImmediatelyBefore($startPos, \T_CURLY_OPEN)) && $this->haveTokenImmediatelyAfter($endPos, '}'); } /** - * @psalm-pure + * Check whether the position is directly preceded by a certain token type. * - * @param array|null $array - * @param string|int $key - * @param string $message + * During this check whitespace and comments are skipped. * - * @throws InvalidArgumentException + * @param int $pos Position before which the token should occur + * @param int|string $expectedTokenType Token to check for * - * @return void + * @return bool Whether the expected token was found */ - public static function nullOrKeyExists($array, $key, $message = '') + public function haveTokenImmediatelyBefore(int $pos, $expectedTokenType) : bool { - static::__callStatic('nullOrKeyExists', array($array, $key, $message)); + $tokens = $this->tokens; + $pos--; + for (; $pos >= 0; $pos--) { + $tokenType = $tokens[$pos][0]; + if ($tokenType === $expectedTokenType) { + return \true; + } + if ($tokenType !== \T_WHITESPACE && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { + break; + } + } + return \false; } /** - * @psalm-pure + * Check whether the position is directly followed by a certain token type. * - * @param iterable $array - * @param string|int $key - * @param string $message + * During this check whitespace and comments are skipped. * - * @throws InvalidArgumentException + * @param int $pos Position after which the token should occur + * @param int|string $expectedTokenType Token to check for * - * @return void + * @return bool Whether the expected token was found */ - public static function allKeyExists($array, $key, $message = '') + public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType) : bool { - static::__callStatic('allKeyExists', array($array, $key, $message)); + $tokens = $this->tokens; + $pos++; + for (; $pos < \count($tokens); $pos++) { + $tokenType = $tokens[$pos][0]; + if ($tokenType === $expectedTokenType) { + return \true; + } + if ($tokenType !== \T_WHITESPACE && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { + break; + } + } + return \false; } - /** - * @psalm-pure - * - * @param array|null $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrKeyNotExists($array, $key, $message = '') + public function skipLeft(int $pos, $skipTokenType) { - static::__callStatic('nullOrKeyNotExists', array($array, $key, $message)); + $tokens = $this->tokens; + $pos = $this->skipLeftWhitespace($pos); + if ($skipTokenType === \T_WHITESPACE) { + return $pos; + } + if ($tokens[$pos][0] !== $skipTokenType) { + // Shouldn't happen. The skip token MUST be there + throw new \Exception('Encountered unexpected token'); + } + $pos--; + return $this->skipLeftWhitespace($pos); } - /** - * @psalm-pure - * - * @param iterable $array - * @param string|int $key - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allKeyNotExists($array, $key, $message = '') + public function skipRight(int $pos, $skipTokenType) { - static::__callStatic('allKeyNotExists', array($array, $key, $message)); + $tokens = $this->tokens; + $pos = $this->skipRightWhitespace($pos); + if ($skipTokenType === \T_WHITESPACE) { + return $pos; + } + if ($tokens[$pos][0] !== $skipTokenType) { + // Shouldn't happen. The skip token MUST be there + throw new \Exception('Encountered unexpected token'); + } + $pos++; + return $this->skipRightWhitespace($pos); } /** - * @psalm-pure - * @psalm-assert array-key|null $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Return first non-whitespace token position smaller or equal to passed position. * - * @return void + * @param int $pos Token position + * @return int Non-whitespace token position */ - public static function nullOrValidArrayKey($value, $message = '') + public function skipLeftWhitespace(int $pos) { - static::__callStatic('nullOrValidArrayKey', array($value, $message)); + $tokens = $this->tokens; + for (; $pos >= 0; $pos--) { + $type = $tokens[$pos][0]; + if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { + break; + } + } + return $pos; } /** - * @psalm-pure - * @psalm-assert iterable $value - * - * @param mixed $value - * @param string $message - * - * @throws InvalidArgumentException + * Return first non-whitespace position greater or equal to passed position. * - * @return void + * @param int $pos Token position + * @return int Non-whitespace token position */ - public static function allValidArrayKey($value, $message = '') + public function skipRightWhitespace(int $pos) { - static::__callStatic('allValidArrayKey', array($value, $message)); + $tokens = $this->tokens; + for ($count = \count($tokens); $pos < $count; $pos++) { + $type = $tokens[$pos][0]; + if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { + break; + } + } + return $pos; } - /** - * @param Countable|array|null $array - * @param int $number - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrCount($array, $number, $message = '') + public function findRight(int $pos, $findTokenType) { - static::__callStatic('nullOrCount', array($array, $number, $message)); + $tokens = $this->tokens; + for ($count = \count($tokens); $pos < $count; $pos++) { + $type = $tokens[$pos][0]; + if ($type === $findTokenType) { + return $pos; + } + } + return -1; } /** - * @param iterable $array - * @param int $number - * @param string $message - * - * @throws InvalidArgumentException + * Whether the given position range contains a certain token type. * - * @return void + * @param int $startPos Starting position (inclusive) + * @param int $endPos Ending position (exclusive) + * @param int|string $tokenType Token type to look for + * @return bool Whether the token occurs in the given range */ - public static function allCount($array, $number, $message = '') + public function haveTokenInRange(int $startPos, int $endPos, $tokenType) { - static::__callStatic('allCount', array($array, $number, $message)); + $tokens = $this->tokens; + for ($pos = $startPos; $pos < $endPos; $pos++) { + if ($tokens[$pos][0] === $tokenType) { + return \true; + } + } + return \false; } - /** - * @param Countable|array|null $array - * @param int|float $min - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrMinCount($array, $min, $message = '') + public function haveBracesInRange(int $startPos, int $endPos) { - static::__callStatic('nullOrMinCount', array($array, $min, $message)); + return $this->haveTokenInRange($startPos, $endPos, '{') || $this->haveTokenInRange($startPos, $endPos, \T_CURLY_OPEN) || $this->haveTokenInRange($startPos, $endPos, '}'); } /** - * @param iterable $array - * @param int|float $min - * @param string $message + * Get indentation before token position. * - * @throws InvalidArgumentException + * @param int $pos Token position * - * @return void + * @return int Indentation depth (in spaces) */ - public static function allMinCount($array, $min, $message = '') + public function getIndentationBefore(int $pos) : int { - static::__callStatic('allMinCount', array($array, $min, $message)); + return $this->indentMap[$pos]; } /** - * @param Countable|array|null $array - * @param int|float $max - * @param string $message + * Get the code corresponding to a token offset range, optionally adjusted for indentation. * - * @throws InvalidArgumentException + * @param int $from Token start position (inclusive) + * @param int $to Token end position (exclusive) + * @param int $indent By how much the code should be indented (can be negative as well) * - * @return void + * @return string Code corresponding to token range, adjusted for indentation */ - public static function nullOrMaxCount($array, $max, $message = '') + public function getTokenCode(int $from, int $to, int $indent) : string { - static::__callStatic('nullOrMaxCount', array($array, $max, $message)); + $tokens = $this->tokens; + $result = ''; + for ($pos = $from; $pos < $to; $pos++) { + $token = $tokens[$pos]; + if (\is_array($token)) { + $type = $token[0]; + $content = $token[1]; + if ($type === \T_CONSTANT_ENCAPSED_STRING || $type === \T_ENCAPSED_AND_WHITESPACE) { + $result .= $content; + } else { + // TODO Handle non-space indentation + if ($indent < 0) { + $result .= \str_replace("\n" . \str_repeat(" ", -$indent), "\n", $content); + } elseif ($indent > 0) { + $result .= \str_replace("\n", "\n" . \str_repeat(" ", $indent), $content); + } else { + $result .= $content; + } + } + } else { + $result .= $token; + } + } + return $result; } /** - * @param iterable $array - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException + * Precalculate the indentation at every token position. * - * @return void + * @return int[] Token position to indentation map */ - public static function allMaxCount($array, $max, $message = '') + private function calcIndentMap() { - static::__callStatic('allMaxCount', array($array, $max, $message)); + $indentMap = []; + $indent = 0; + foreach ($this->tokens as $token) { + $indentMap[] = $indent; + if ($token[0] === \T_WHITESPACE) { + $content = $token[1]; + $newlinePos = \strrpos($content, "\n"); + if (\false !== $newlinePos) { + $indent = \strlen($content) - $newlinePos - 1; + } + } + } + // Add a sentinel for one past end of the file + $indentMap[] = $indent; + return $indentMap; } - /** - * @param Countable|array|null $array - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrCountBetween($array, $min, $max, $message = '') +} +decodeRecursive($value); } - /** - * @param iterable $array - * @param int|float $min - * @param int|float $max - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allCountBetween($array, $min, $max, $message = '') + private function decodeRecursive($value) { - static::__callStatic('allCountBetween', array($array, $min, $max, $message)); + if (\is_array($value)) { + if (isset($value['nodeType'])) { + if ($value['nodeType'] === 'Comment' || $value['nodeType'] === 'Comment_Doc') { + return $this->decodeComment($value); + } + return $this->decodeNode($value); + } + return $this->decodeArray($value); + } + return $value; } - /** - * @psalm-pure - * @psalm-assert list|null $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsList($array, $message = '') + private function decodeArray(array $array) : array { - static::__callStatic('nullOrIsList', array($array, $message)); + $decodedArray = []; + foreach ($array as $key => $value) { + $decodedArray[$key] = $this->decodeRecursive($value); + } + return $decodedArray; } - /** - * @psalm-pure - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsList($array, $message = '') + private function decodeNode(array $value) : Node { - static::__callStatic('allIsList', array($array, $message)); + $nodeType = $value['nodeType']; + if (!\is_string($nodeType)) { + throw new \RuntimeException('Node type must be a string'); + } + $reflectionClass = $this->reflectionClassFromNodeType($nodeType); + /** @var Node $node */ + $node = $reflectionClass->newInstanceWithoutConstructor(); + if (isset($value['attributes'])) { + if (!\is_array($value['attributes'])) { + throw new \RuntimeException('Attributes must be an array'); + } + $node->setAttributes($this->decodeArray($value['attributes'])); + } + foreach ($value as $name => $subNode) { + if ($name === 'nodeType' || $name === 'attributes') { + continue; + } + $node->{$name} = $this->decodeRecursive($subNode); + } + return $node; } - /** - * @psalm-pure - * @psalm-assert non-empty-list|null $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsNonEmptyList($array, $message = '') + private function decodeComment(array $value) : Comment { - static::__callStatic('nullOrIsNonEmptyList', array($array, $message)); + $className = $value['nodeType'] === 'Comment' ? Comment::class : Comment\Doc::class; + if (!isset($value['text'])) { + throw new \RuntimeException('Comment must have text'); + } + return new $className($value['text'], $value['line'] ?? -1, $value['filePos'] ?? -1, $value['tokenPos'] ?? -1, $value['endLine'] ?? -1, $value['endFilePos'] ?? -1, $value['endTokenPos'] ?? -1); } - /** - * @psalm-pure - * @psalm-assert iterable $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsNonEmptyList($array, $message = '') + private function reflectionClassFromNodeType(string $nodeType) : \ReflectionClass { - static::__callStatic('allIsNonEmptyList', array($array, $message)); + if (!isset($this->reflectionClassCache[$nodeType])) { + $className = $this->classNameFromNodeType($nodeType); + $this->reflectionClassCache[$nodeType] = new \ReflectionClass($className); + } + return $this->reflectionClassCache[$nodeType]; } - /** - * @psalm-pure - * @psalm-template T - * @psalm-param mixed|array|null $array - * @psalm-assert array|null $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function nullOrIsMap($array, $message = '') + private function classNameFromNodeType(string $nodeType) : string { - static::__callStatic('nullOrIsMap', array($array, $message)); + $className = 'PhpParser\\Node\\' . \strtr($nodeType, '_', '\\'); + if (\class_exists($className)) { + return $className; + } + $className .= '_'; + if (\class_exists($className)) { + return $className; + } + throw new \RuntimeException("Unknown node type \"{$nodeType}\""); } +} +> $array - * @psalm-assert iterable> $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException + * Creates a Lexer. * - * @return void + * @param array $options Options array. Currently only the 'usedAttributes' option is supported, + * which is an array of attributes to add to the AST nodes. Possible + * attributes are: 'comments', 'startLine', 'endLine', 'startTokenPos', + * 'endTokenPos', 'startFilePos', 'endFilePos'. The option defaults to the + * first three. For more info see getNextToken() docs. */ - public static function allIsMap($array, $message = '') + public function __construct(array $options = []) { - static::__callStatic('allIsMap', array($array, $message)); + // Create Map from internal tokens to PhpParser tokens. + $this->defineCompatibilityTokens(); + $this->tokenMap = $this->createTokenMap(); + $this->identifierTokens = $this->createIdentifierTokenMap(); + // map of tokens to drop while lexing (the map is only used for isset lookup, + // that's why the value is simply set to 1; the value is never actually used.) + $this->dropTokens = \array_fill_keys([\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT, \T_BAD_CHARACTER], 1); + $defaultAttributes = ['comments', 'startLine', 'endLine']; + $usedAttributes = \array_fill_keys($options['usedAttributes'] ?? $defaultAttributes, \true); + // Create individual boolean properties to make these checks faster. + $this->attributeStartLineUsed = isset($usedAttributes['startLine']); + $this->attributeEndLineUsed = isset($usedAttributes['endLine']); + $this->attributeStartTokenPosUsed = isset($usedAttributes['startTokenPos']); + $this->attributeEndTokenPosUsed = isset($usedAttributes['endTokenPos']); + $this->attributeStartFilePosUsed = isset($usedAttributes['startFilePos']); + $this->attributeEndFilePosUsed = isset($usedAttributes['endFilePos']); + $this->attributeCommentsUsed = isset($usedAttributes['comments']); } /** - * @psalm-pure - * @psalm-template T - * @psalm-param mixed|array|null $array - * - * @param mixed $array - * @param string $message + * Initializes the lexer for lexing the provided source code. * - * @throws InvalidArgumentException + * This function does not throw if lexing errors occur. Instead, errors may be retrieved using + * the getErrors() method. * - * @return void + * @param string $code The source code to lex + * @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to + * ErrorHandler\Throwing */ - public static function nullOrIsNonEmptyMap($array, $message = '') + public function startLexing(string $code, ErrorHandler $errorHandler = null) { - static::__callStatic('nullOrIsNonEmptyMap', array($array, $message)); + if (null === $errorHandler) { + $errorHandler = new ErrorHandler\Throwing(); + } + $this->code = $code; + // keep the code around for __halt_compiler() handling + $this->pos = -1; + $this->line = 1; + $this->filePos = 0; + // If inline HTML occurs without preceding code, treat it as if it had a leading newline. + // This ensures proper composability, because having a newline is the "safe" assumption. + $this->prevCloseTagHasNewline = \true; + $scream = \ini_set('xdebug.scream', '0'); + $this->tokens = @\token_get_all($code); + $this->postprocessTokens($errorHandler); + if (\false !== $scream) { + \ini_set('xdebug.scream', $scream); + } } - /** - * @psalm-pure - * @psalm-template T - * @psalm-param iterable> $array - * - * @param mixed $array - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allIsNonEmptyMap($array, $message = '') + private function handleInvalidCharacterRange($start, $end, $line, ErrorHandler $errorHandler) { - static::__callStatic('allIsNonEmptyMap', array($array, $message)); + $tokens = []; + for ($i = $start; $i < $end; $i++) { + $chr = $this->code[$i]; + if ($chr === "\x00") { + // PHP cuts error message after null byte, so need special case + $errorMsg = 'Unexpected null byte'; + } else { + $errorMsg = \sprintf('Unexpected character "%s" (ASCII %d)', $chr, \ord($chr)); + } + $tokens[] = [\T_BAD_CHARACTER, $chr, $line]; + $errorHandler->handleError(new Error($errorMsg, ['startLine' => $line, 'endLine' => $line, 'startFilePos' => $i, 'endFilePos' => $i])); + } + return $tokens; } /** - * @psalm-pure - * - * @param string|null $value - * @param string $message - * - * @throws InvalidArgumentException + * Check whether comment token is unterminated. * - * @return void + * @return bool */ - public static function nullOrUuid($value, $message = '') + private function isUnterminatedComment($token) : bool { - static::__callStatic('nullOrUuid', array($value, $message)); + return ($token[0] === \T_COMMENT || $token[0] === \T_DOC_COMMENT) && \substr($token[1], 0, 2) === '/*' && \substr($token[1], -2) !== '*/'; } - /** - * @psalm-pure - * - * @param iterable $value - * @param string $message - * - * @throws InvalidArgumentException - * - * @return void - */ - public static function allUuid($value, $message = '') + protected function postprocessTokens(ErrorHandler $errorHandler) { - static::__callStatic('allUuid', array($value, $message)); + // PHP's error handling for token_get_all() is rather bad, so if we want detailed + // error information we need to compute it ourselves. Invalid character errors are + // detected by finding "gaps" in the token array. Unterminated comments are detected + // by checking if a trailing comment has a "*/" at the end. + // + // Additionally, we perform a number of canonicalizations here: + // * Use the PHP 8.0 comment format, which does not include trailing whitespace anymore. + // * Use PHP 8.0 T_NAME_* tokens. + // * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and + // T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types. + $filePos = 0; + $line = 1; + $numTokens = \count($this->tokens); + for ($i = 0; $i < $numTokens; $i++) { + $token = $this->tokens[$i]; + // Since PHP 7.4 invalid characters are represented by a T_BAD_CHARACTER token. + // In this case we only need to emit an error. + if ($token[0] === \T_BAD_CHARACTER) { + $this->handleInvalidCharacterRange($filePos, $filePos + 1, $line, $errorHandler); + } + if ($token[0] === \T_COMMENT && \substr($token[1], 0, 2) !== '/*' && \preg_match('/(\\r\\n|\\n|\\r)$/D', $token[1], $matches)) { + $trailingNewline = $matches[0]; + $token[1] = \substr($token[1], 0, -\strlen($trailingNewline)); + $this->tokens[$i] = $token; + if (isset($this->tokens[$i + 1]) && $this->tokens[$i + 1][0] === \T_WHITESPACE) { + // Move trailing newline into following T_WHITESPACE token, if it already exists. + $this->tokens[$i + 1][1] = $trailingNewline . $this->tokens[$i + 1][1]; + $this->tokens[$i + 1][2]--; + } else { + // Otherwise, we need to create a new T_WHITESPACE token. + \array_splice($this->tokens, $i + 1, 0, [[\T_WHITESPACE, $trailingNewline, $line]]); + $numTokens++; + } + } + // Emulate PHP 8 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and T_STRING + // into a single token. + if (\is_array($token) && ($token[0] === \T_NS_SEPARATOR || isset($this->identifierTokens[$token[0]]))) { + $lastWasSeparator = $token[0] === \T_NS_SEPARATOR; + $text = $token[1]; + for ($j = $i + 1; isset($this->tokens[$j]); $j++) { + if ($lastWasSeparator) { + if (!isset($this->identifierTokens[$this->tokens[$j][0]])) { + break; + } + $lastWasSeparator = \false; + } else { + if ($this->tokens[$j][0] !== \T_NS_SEPARATOR) { + break; + } + $lastWasSeparator = \true; + } + $text .= $this->tokens[$j][1]; + } + if ($lastWasSeparator) { + // Trailing separator is not part of the name. + $j--; + $text = \substr($text, 0, -1); + } + if ($j > $i + 1) { + if ($token[0] === \T_NS_SEPARATOR) { + $type = \T_NAME_FULLY_QUALIFIED; + } else { + if ($token[0] === \T_NAMESPACE) { + $type = \T_NAME_RELATIVE; + } else { + $type = \T_NAME_QUALIFIED; + } + } + $token = [$type, $text, $line]; + \array_splice($this->tokens, $i, $j - $i, [$token]); + $numTokens -= $j - $i - 1; + } + } + if ($token === '&') { + $next = $i + 1; + while (isset($this->tokens[$next]) && $this->tokens[$next][0] === \T_WHITESPACE) { + $next++; + } + $followedByVarOrVarArg = isset($this->tokens[$next]) && ($this->tokens[$next][0] === \T_VARIABLE || $this->tokens[$next][0] === \T_ELLIPSIS); + $this->tokens[$i] = $token = [$followedByVarOrVarArg ? \T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG : \T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG, '&', $line]; + } + $tokenValue = \is_string($token) ? $token : $token[1]; + $tokenLen = \strlen($tokenValue); + if (\substr($this->code, $filePos, $tokenLen) !== $tokenValue) { + // Something is missing, must be an invalid character + $nextFilePos = \strpos($this->code, $tokenValue, $filePos); + $badCharTokens = $this->handleInvalidCharacterRange($filePos, $nextFilePos, $line, $errorHandler); + $filePos = (int) $nextFilePos; + \array_splice($this->tokens, $i, 0, $badCharTokens); + $numTokens += \count($badCharTokens); + $i += \count($badCharTokens); + } + $filePos += $tokenLen; + $line += \substr_count($tokenValue, "\n"); + } + if ($filePos !== \strlen($this->code)) { + if (\substr($this->code, $filePos, 2) === '/*') { + // Unlike PHP, HHVM will drop unterminated comments entirely + $comment = \substr($this->code, $filePos); + $errorHandler->handleError(new Error('Unterminated comment', ['startLine' => $line, 'endLine' => $line + \substr_count($comment, "\n"), 'startFilePos' => $filePos, 'endFilePos' => $filePos + \strlen($comment)])); + // Emulate the PHP behavior + $isDocComment = isset($comment[3]) && $comment[3] === '*'; + $this->tokens[] = [$isDocComment ? \T_DOC_COMMENT : \T_COMMENT, $comment, $line]; + } else { + // Invalid characters at the end of the input + $badCharTokens = $this->handleInvalidCharacterRange($filePos, \strlen($this->code), $line, $errorHandler); + $this->tokens = \array_merge($this->tokens, $badCharTokens); + } + return; + } + if (\count($this->tokens) > 0) { + // Check for unterminated comment + $lastToken = $this->tokens[\count($this->tokens) - 1]; + if ($this->isUnterminatedComment($lastToken)) { + $errorHandler->handleError(new Error('Unterminated comment', ['startLine' => $line - \substr_count($lastToken[1], "\n"), 'endLine' => $line, 'startFilePos' => $filePos - \strlen($lastToken[1]), 'endFilePos' => $filePos])); + } + } } /** - * @psalm-param class-string $class - * - * @param Closure|null $expression - * @param string $class - * @param string $message - * - * @throws InvalidArgumentException + * Fetches the next token. * - * @return void - */ - public static function nullOrThrows($expression, $class = 'Exception', $message = '') - { - static::__callStatic('nullOrThrows', array($expression, $class, $message)); - } - /** - * @psalm-param class-string $class + * The available attributes are determined by the 'usedAttributes' option, which can + * be specified in the constructor. The following attributes are supported: * - * @param iterable $expression - * @param string $class - * @param string $message + * * 'comments' => Array of PhpParser\Comment or PhpParser\Comment\Doc instances, + * representing all comments that occurred between the previous + * non-discarded token and the current one. + * * 'startLine' => Line in which the node starts. + * * 'endLine' => Line in which the node ends. + * * 'startTokenPos' => Offset into the token array of the first token in the node. + * * 'endTokenPos' => Offset into the token array of the last token in the node. + * * 'startFilePos' => Offset into the code string of the first character that is part of the node. + * * 'endFilePos' => Offset into the code string of the last character that is part of the node. * - * @throws InvalidArgumentException + * @param mixed $value Variable to store token content in + * @param mixed $startAttributes Variable to store start attributes in + * @param mixed $endAttributes Variable to store end attributes in * - * @return void + * @return int Token id */ - public static function allThrows($expression, $class = 'Exception', $message = '') + public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) : int { - static::__callStatic('allThrows', array($expression, $class, $message)); - } -} -The MIT License (MIT) - -Copyright (c) 2014 Bernhard Schussek - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Webmozart\Assert; - -class InvalidArgumentException extends \InvalidArgumentException -{ -} -tokens[++$this->pos])) { + $token = $this->tokens[$this->pos]; + } else { + // EOF token with ID 0 + $token = "\x00"; + } + if ($this->attributeStartLineUsed) { + $startAttributes['startLine'] = $this->line; + } + if ($this->attributeStartTokenPosUsed) { + $startAttributes['startTokenPos'] = $this->pos; + } + if ($this->attributeStartFilePosUsed) { + $startAttributes['startFilePos'] = $this->filePos; + } + if (\is_string($token)) { + $value = $token; + if (isset($token[1])) { + // bug in token_get_all + $this->filePos += 2; + $id = \ord('"'); + } else { + $this->filePos += 1; + $id = \ord($token); + } + } elseif (!isset($this->dropTokens[$token[0]])) { + $value = $token[1]; + $id = $this->tokenMap[$token[0]]; + if (\T_CLOSE_TAG === $token[0]) { + $this->prevCloseTagHasNewline = \false !== \strpos($token[1], "\n") || \false !== \strpos($token[1], "\r"); + } elseif (\T_INLINE_HTML === $token[0]) { + $startAttributes['hasLeadingNewline'] = $this->prevCloseTagHasNewline; + } + $this->line += \substr_count($value, "\n"); + $this->filePos += \strlen($value); + } else { + $origLine = $this->line; + $origFilePos = $this->filePos; + $this->line += \substr_count($token[1], "\n"); + $this->filePos += \strlen($token[1]); + if (\T_COMMENT === $token[0] || \T_DOC_COMMENT === $token[0]) { + if ($this->attributeCommentsUsed) { + $comment = \T_DOC_COMMENT === $token[0] ? new Comment\Doc($token[1], $origLine, $origFilePos, $this->pos, $this->line, $this->filePos - 1, $this->pos) : new Comment($token[1], $origLine, $origFilePos, $this->pos, $this->line, $this->filePos - 1, $this->pos); + $startAttributes['comments'][] = $comment; + } + } + continue; + } + if ($this->attributeEndLineUsed) { + $endAttributes['endLine'] = $this->line; + } + if ($this->attributeEndTokenPosUsed) { + $endAttributes['endTokenPos'] = $this->pos; + } + if ($this->attributeEndFilePosUsed) { + $endAttributes['endFilePos'] = $this->filePos - 1; + } + return $id; + } + throw new \RuntimeException('Reached end of lexer loop'); + } /** - * Initializes the object. + * Returns the token array for current code. * - * @throws InvalidArgumentException when $fqsen is not matching the format. + * The token array is in the same format as provided by the + * token_get_all() function and does not discard tokens (i.e. + * whitespace and comments are included). The token position + * attributes are against this token array. + * + * @return array Array of tokens in token_get_all() format */ - public function __construct(string $fqsen) + public function getTokens() : array { - $matches = []; - $result = preg_match( - //phpcs:ignore Generic.Files.LineLength.TooLong - '/^\\\\([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff\\\\]*)?(?:[:]{2}\\$?([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*))?(?:\\(\\))?$/', - $fqsen, - $matches - ); - if ($result === 0) { - throw new InvalidArgumentException(sprintf('"%s" is not a valid Fqsen.', $fqsen)); - } - $this->fqsen = $fqsen; - if (isset($matches[2])) { - $this->name = $matches[2]; - } else { - $matches = explode('\\', $fqsen); - $name = end($matches); - assert(is_string($name)); - $this->name = trim($name, '()'); - } + return $this->tokens; } /** - * converts this class to string. + * Handles __halt_compiler() by returning the text after it. + * + * @return string Remaining text */ - public function __toString() : string + public function handleHaltCompiler() : string { - return $this->fqsen; + // text after T_HALT_COMPILER, still including (); + $textAfter = \substr($this->code, $this->filePos); + // ensure that it is followed by (); + // this simplifies the situation, by not allowing any comments + // in between of the tokens. + if (!\preg_match('~^\\s*\\(\\s*\\)\\s*(?:;|\\?>\\r?\\n?)~', $textAfter, $matches)) { + throw new Error('__HALT_COMPILER must be followed by "();"'); + } + // prevent the lexer from returning any further tokens + $this->pos = \count($this->tokens); + // return with (); removed + return \substr($textAfter, \strlen($matches[0])); } - /** - * Returns the name of the element without path. - */ - public function getName() : string + private function defineCompatibilityTokens() { - return $this->name; + static $compatTokensDefined = \false; + if ($compatTokensDefined) { + return; + } + $compatTokens = [ + // PHP 7.4 + 'T_BAD_CHARACTER', + 'T_FN', + 'T_COALESCE_EQUAL', + // PHP 8.0 + 'T_NAME_QUALIFIED', + 'T_NAME_FULLY_QUALIFIED', + 'T_NAME_RELATIVE', + 'T_MATCH', + 'T_NULLSAFE_OBJECT_OPERATOR', + 'T_ATTRIBUTE', + // PHP 8.1 + 'T_ENUM', + 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', + 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', + 'T_READONLY', + ]; + // PHP-Parser might be used together with another library that also emulates some or all + // of these tokens. Perform a sanity-check that all already defined tokens have been + // assigned a unique ID. + $usedTokenIds = []; + foreach ($compatTokens as $token) { + if (\defined($token)) { + $tokenId = \constant($token); + $clashingToken = $usedTokenIds[$tokenId] ?? null; + if ($clashingToken !== null) { + throw new \Error(\sprintf('Token %s has same ID as token %s, ' . 'you may be using a library with broken token emulation', $token, $clashingToken)); + } + $usedTokenIds[$tokenId] = $token; + } + } + // Now define any tokens that have not yet been emulated. Try to assign IDs from -1 + // downwards, but skip any IDs that may already be in use. + $newTokenId = -1; + foreach ($compatTokens as $token) { + if (!\defined($token)) { + while (isset($usedTokenIds[$newTokenId])) { + $newTokenId--; + } + \define($token, $newTokenId); + $newTokenId--; + } + } + $compatTokensDefined = \true; } -} -lineNumber = $lineNumber; - $this->columnNumber = $columnNumber; + $this->targetPhpVersion = $options['phpVersion'] ?? Emulative::PHP_8_1; + unset($options['phpVersion']); + parent::__construct($options); + $emulators = [new FlexibleDocStringEmulator(), new FnTokenEmulator(), new MatchTokenEmulator(), new CoaleseEqualTokenEmulator(), new NumericLiteralSeparatorEmulator(), new NullsafeTokenEmulator(), new AttributeEmulator(), new EnumTokenEmulator(), new ReadonlyTokenEmulator(), new ExplicitOctalEmulator()]; + // Collect emulators that are relevant for the PHP version we're running + // and the PHP version we're targeting for emulation. + foreach ($emulators as $emulator) { + $emulatorPhpVersion = $emulator->getPhpVersion(); + if ($this->isForwardEmulationNeeded($emulatorPhpVersion)) { + $this->emulators[] = $emulator; + } else { + if ($this->isReverseEmulationNeeded($emulatorPhpVersion)) { + $this->emulators[] = new ReverseEmulator($emulator); + } + } + } } - /** - * Returns the line number that is covered by this location. - */ - public function getLineNumber() : int + public function startLexing(string $code, ErrorHandler $errorHandler = null) { - return $this->lineNumber; + $emulators = \array_filter($this->emulators, function ($emulator) use($code) { + return $emulator->isEmulationNeeded($code); + }); + if (empty($emulators)) { + // Nothing to emulate, yay + parent::startLexing($code, $errorHandler); + return; + } + $this->patches = []; + foreach ($emulators as $emulator) { + $code = $emulator->preprocessCode($code, $this->patches); + } + $collector = new ErrorHandler\Collecting(); + parent::startLexing($code, $collector); + $this->sortPatches(); + $this->fixupTokens(); + $errors = $collector->getErrors(); + if (!empty($errors)) { + $this->fixupErrors($errors); + foreach ($errors as $error) { + $errorHandler->handleError($error); + } + } + foreach ($emulators as $emulator) { + $this->tokens = $emulator->emulate($code, $this->tokens); + } } - /** - * Returns the column number (character position on a line) for this location object. - */ - public function getColumnNumber() : int + private function isForwardEmulationNeeded(string $emulatorPhpVersion) : bool { - return $this->columnNumber; + return \version_compare(\PHP_VERSION, $emulatorPhpVersion, '<') && \version_compare($this->targetPhpVersion, $emulatorPhpVersion, '>='); } -} -=') && \version_compare($this->targetPhpVersion, $emulatorPhpVersion, '<'); + } + private function sortPatches() + { + // Patches may be contributed by different emulators. + // Make sure they are sorted by increasing patch position. + \usort($this->patches, function ($p1, $p2) { + return $p1[0] <=> $p2[0]; + }); + } + private function fixupTokens() + { + if (\count($this->patches) === 0) { + return; + } + // Load first patch + $patchIdx = 0; + list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; + // We use a manual loop over the tokens, because we modify the array on the fly + $pos = 0; + for ($i = 0, $c = \count($this->tokens); $i < $c; $i++) { + $token = $this->tokens[$i]; + if (\is_string($token)) { + if ($patchPos === $pos) { + // Only support replacement for string tokens. + \assert($patchType === 'replace'); + $this->tokens[$i] = $patchText; + // Fetch the next patch + $patchIdx++; + if ($patchIdx >= \count($this->patches)) { + // No more patches, we're done + return; + } + list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; + } + $pos += \strlen($token); + continue; + } + $len = \strlen($token[1]); + $posDelta = 0; + while ($patchPos >= $pos && $patchPos < $pos + $len) { + $patchTextLen = \strlen($patchText); + if ($patchType === 'remove') { + if ($patchPos === $pos && $patchTextLen === $len) { + // Remove token entirely + \array_splice($this->tokens, $i, 1, []); + $i--; + $c--; + } else { + // Remove from token string + $this->tokens[$i][1] = \substr_replace($token[1], '', $patchPos - $pos + $posDelta, $patchTextLen); + $posDelta -= $patchTextLen; + } + } elseif ($patchType === 'add') { + // Insert into the token string + $this->tokens[$i][1] = \substr_replace($token[1], $patchText, $patchPos - $pos + $posDelta, 0); + $posDelta += $patchTextLen; + } else { + if ($patchType === 'replace') { + // Replace inside the token string + $this->tokens[$i][1] = \substr_replace($token[1], $patchText, $patchPos - $pos + $posDelta, $patchTextLen); + } else { + \assert(\false); + } + } + // Fetch the next patch + $patchIdx++; + if ($patchIdx >= \count($this->patches)) { + // No more patches, we're done + return; + } + list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; + // Multiple patches may apply to the same token. Reload the current one to check + // If the new patch applies + $token = $this->tokens[$i]; + } + $pos += $len; + } + // A patch did not apply + \assert(\false); + } + /** + * Fixup line and position information in errors. + * + * @param Error[] $errors + */ + private function fixupErrors(array $errors) + { + foreach ($errors as $error) { + $attrs = $error->getAttributes(); + $posDelta = 0; + $lineDelta = 0; + foreach ($this->patches as $patch) { + list($patchPos, $patchType, $patchText) = $patch; + if ($patchPos >= $attrs['startFilePos']) { + // No longer relevant + break; + } + if ($patchType === 'add') { + $posDelta += \strlen($patchText); + $lineDelta += \substr_count($patchText, "\n"); + } else { + if ($patchType === 'remove') { + $posDelta -= \strlen($patchText); + $lineDelta -= \substr_count($patchText, "\n"); + } + } + } + $attrs['startFilePos'] += $posDelta; + $attrs['endFilePos'] += $posDelta; + $attrs['startLine'] += $lineDelta; + $attrs['endLine'] += $lineDelta; + $error->setAttributes($attrs); + } + } +} - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Template; +namespace PHPUnit\PhpParser\Lexer\TokenEmulator; -use function array_merge; -use function file_exists; -use function file_get_contents; -use function file_put_contents; -use function sprintf; -use function str_replace; -final class Template +use PHPUnit\PhpParser\Lexer\Emulative; +final class AttributeEmulator extends TokenEmulator { - /** - * @var string - */ - private $template = ''; - /** - * @var string - */ - private $openDelimiter; - /** - * @var string - */ - private $closeDelimiter; - /** - * @var array - */ - private $values = []; - /** - * @throws InvalidArgumentException - */ - public function __construct(string $file = '', string $openDelimiter = '{', string $closeDelimiter = '}') + public function getPhpVersion() : string { - $this->setFile($file); - $this->openDelimiter = $openDelimiter; - $this->closeDelimiter = $closeDelimiter; + return Emulative::PHP_8_0; } - /** - * @throws InvalidArgumentException - */ - public function setFile(string $file) : void + public function isEmulationNeeded(string $code) : bool { - $distFile = $file . '.dist'; - if (file_exists($file)) { - $this->template = file_get_contents($file); - } elseif (file_exists($distFile)) { - $this->template = file_get_contents($distFile); - } else { - throw new InvalidArgumentException(sprintf('Failed to load template "%s"', $file)); - } + return \strpos($code, '#[') !== \false; } - public function setVar(array $values, bool $merge = \true) : void + public function emulate(string $code, array $tokens) : array { - if (!$merge || empty($this->values)) { - $this->values = $values; - } else { - $this->values = array_merge($this->values, $values); + // We need to manually iterate and manage a count because we'll change + // the tokens array on the way. + $line = 1; + for ($i = 0, $c = \count($tokens); $i < $c; ++$i) { + if ($tokens[$i] === '#' && isset($tokens[$i + 1]) && $tokens[$i + 1] === '[') { + \array_splice($tokens, $i, 2, [[\T_ATTRIBUTE, '#[', $line]]); + $c--; + continue; + } + if (\is_array($tokens[$i])) { + $line += \substr_count($tokens[$i][1], "\n"); + } } + return $tokens; } - public function render() : string + public function reverseEmulate(string $code, array $tokens) : array { - $keys = []; - foreach ($this->values as $key => $value) { - $keys[] = $this->openDelimiter . $key . $this->closeDelimiter; - } - return str_replace($keys, $this->values, $this->template); + // TODO + return $tokens; } - /** - * @codeCoverageIgnore - */ - public function renderTo(string $target) : void + public function preprocessCode(string $code, array &$patches) : string { - if (!file_put_contents($target, $this->render())) { - throw new RuntimeException(sprintf('Writing rendered result to "%s" failed', $target)); + $pos = 0; + while (\false !== ($pos = \strpos($code, '#[', $pos))) { + // Replace #[ with %[ + $code[$pos] = '%'; + $patches[] = [$pos, 'replace', '#']; + $pos += 2; } + return $code; } } - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Template; +namespace PHPUnit\PhpParser\Lexer\TokenEmulator; -use InvalidArgumentException; -final class RuntimeException extends InvalidArgumentException implements Exception +use PHPUnit\PhpParser\Lexer\Emulative; +final class CoaleseEqualTokenEmulator extends TokenEmulator { + public function getPhpVersion() : string + { + return Emulative::PHP_7_4; + } + public function isEmulationNeeded(string $code) : bool + { + return \strpos($code, '??=') !== \false; + } + public function emulate(string $code, array $tokens) : array + { + // We need to manually iterate and manage a count because we'll change + // the tokens array on the way + $line = 1; + for ($i = 0, $c = \count($tokens); $i < $c; ++$i) { + if (isset($tokens[$i + 1])) { + if ($tokens[$i][0] === \T_COALESCE && $tokens[$i + 1] === '=') { + \array_splice($tokens, $i, 2, [[\T_COALESCE_EQUAL, '??=', $line]]); + $c--; + continue; + } + } + if (\is_array($tokens[$i])) { + $line += \substr_count($tokens[$i][1], "\n"); + } + } + return $tokens; + } + public function reverseEmulate(string $code, array $tokens) : array + { + // ??= was not valid code previously, don't bother. + return $tokens; + } } - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Template; +namespace PHPUnit\PhpParser\Lexer\TokenEmulator; -use Throwable; -interface Exception extends Throwable +use PHPUnit\PhpParser\Lexer\Emulative; +final class EnumTokenEmulator extends KeywordEmulator { + public function getPhpVersion() : string + { + return Emulative::PHP_8_1; + } + public function getKeywordString() : string + { + return 'enum'; + } + public function getKeywordToken() : int + { + return \T_ENUM; + } + protected function isKeywordContext(array $tokens, int $pos) : bool + { + return parent::isKeywordContext($tokens, $pos) && isset($tokens[$pos + 2]) && $tokens[$pos + 1][0] === \T_WHITESPACE && $tokens[$pos + 2][0] === \T_STRING; + } } - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Template; +namespace PHPUnit\PhpParser\Lexer\TokenEmulator; -final class InvalidArgumentException extends \InvalidArgumentException implements Exception +use PHPUnit\PhpParser\Lexer\Emulative; +class ExplicitOctalEmulator extends TokenEmulator { + public function getPhpVersion() : string + { + return Emulative::PHP_8_1; + } + public function isEmulationNeeded(string $code) : bool + { + return \strpos($code, '0o') !== \false || \strpos($code, '0O') !== \false; + } + public function emulate(string $code, array $tokens) : array + { + for ($i = 0, $c = \count($tokens); $i < $c; ++$i) { + if ($tokens[$i][0] == \T_LNUMBER && $tokens[$i][1] === '0' && isset($tokens[$i + 1]) && $tokens[$i + 1][0] == \T_STRING && \preg_match('/[oO][0-7]+(?:_[0-7]+)*/', $tokens[$i + 1][1])) { + $tokenKind = $this->resolveIntegerOrFloatToken($tokens[$i + 1][1]); + \array_splice($tokens, $i, 2, [[$tokenKind, '0' . $tokens[$i + 1][1], $tokens[$i][2]]]); + $c--; + } + } + return $tokens; + } + private function resolveIntegerOrFloatToken(string $str) : int + { + $str = \substr($str, 1); + $str = \str_replace('_', '', $str); + $num = \octdec($str); + return \is_float($num) ? \T_DNUMBER : \T_LNUMBER; + } + public function reverseEmulate(string $code, array $tokens) : array + { + // Explicit octals were not legal code previously, don't bother. + return $tokens; + } } -phpunit/php-text-template - -Copyright (c) 2009-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\ObjectReflector; +namespace PHPUnit\PhpParser\Lexer\TokenEmulator; -use function count; -use function explode; -use function get_class; -use function is_object; -class ObjectReflector +use PHPUnit\PhpParser\Lexer\Emulative; +final class FlexibleDocStringEmulator extends TokenEmulator { - /** - * @param object $object - * - * @throws InvalidArgumentException - */ - public function getAttributes($object) : array + const FLEXIBLE_DOC_STRING_REGEX = <<<'REGEX' +/<<<[ \t]*(['"]?)([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)\1\r?\n +(?:.*\r?\n)*? +(?\h*)\2(?![a-zA-Z0-9_\x80-\xff])(?(?:;?[\r\n])?)/x +REGEX; + public function getPhpVersion() : string { - if (!is_object($object)) { - throw new InvalidArgumentException(); + return Emulative::PHP_7_3; + } + public function isEmulationNeeded(string $code) : bool + { + return \strpos($code, '<<<') !== \false; + } + public function emulate(string $code, array $tokens) : array + { + // Handled by preprocessing + fixup. + return $tokens; + } + public function reverseEmulate(string $code, array $tokens) : array + { + // Not supported. + return $tokens; + } + public function preprocessCode(string $code, array &$patches) : string + { + if (!\preg_match_all(self::FLEXIBLE_DOC_STRING_REGEX, $code, $matches, \PREG_SET_ORDER | \PREG_OFFSET_CAPTURE)) { + // No heredoc/nowdoc found + return $code; } - $attributes = []; - $className = get_class($object); - foreach ((array) $object as $name => $value) { - $name = explode("\0", (string) $name); - if (count($name) === 1) { - $name = $name[0]; - } else { - if ($name[1] !== $className) { - $name = $name[1] . '::' . $name[2]; - } else { - $name = $name[2]; - } + // Keep track of how much we need to adjust string offsets due to the modifications we + // already made + $posDelta = 0; + foreach ($matches as $match) { + $indentation = $match['indentation'][0]; + $indentationStart = $match['indentation'][1]; + $separator = $match['separator'][0]; + $separatorStart = $match['separator'][1]; + if ($indentation === '' && $separator !== '') { + // Ordinary heredoc/nowdoc + continue; + } + if ($indentation !== '') { + // Remove indentation + $indentationLen = \strlen($indentation); + $code = \substr_replace($code, '', $indentationStart + $posDelta, $indentationLen); + $patches[] = [$indentationStart + $posDelta, 'add', $indentation]; + $posDelta -= $indentationLen; + } + if ($separator === '') { + // Insert newline as separator + $code = \substr_replace($code, "\n", $separatorStart + $posDelta, 0); + $patches[] = [$separatorStart + $posDelta, 'remove', "\n"]; + $posDelta += 1; } - $attributes[$name] = $value; } - return $attributes; + return $code; } } - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\ObjectReflector; +namespace PHPUnit\PhpParser\Lexer\TokenEmulator; -use Throwable; -interface Exception extends Throwable +use PHPUnit\PhpParser\Lexer\Emulative; +final class FnTokenEmulator extends KeywordEmulator { + public function getPhpVersion() : string + { + return Emulative::PHP_7_4; + } + public function getKeywordString() : string + { + return 'fn'; + } + public function getKeywordToken() : int + { + return \T_FN; + } } - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\ObjectReflector; +namespace PHPUnit\PhpParser\Lexer\TokenEmulator; -class InvalidArgumentException extends \InvalidArgumentException implements Exception +abstract class KeywordEmulator extends TokenEmulator { -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Invoker; - -use const SIGALRM; -use function call_user_func_array; -use function function_exists; -use function pcntl_alarm; -use function pcntl_async_signals; -use function pcntl_signal; -use function sprintf; -use Throwable; -final class Invoker -{ - /** - * @var int - */ - private $timeout; - /** - * @throws Throwable - */ - public function invoke(callable $callable, array $arguments, int $timeout) + abstract function getKeywordString() : string; + abstract function getKeywordToken() : int; + public function isEmulationNeeded(string $code) : bool { - if (!$this->canInvokeWithTimeout()) { - throw new ProcessControlExtensionNotLoadedException('The pcntl (process control) extension for PHP is required'); - } - pcntl_signal(\SIGALRM, function () : void { - throw new TimeoutException(sprintf('Execution aborted after %d second%s', $this->timeout, $this->timeout === 1 ? '' : 's')); - }, \true); - $this->timeout = $timeout; - pcntl_async_signals(\true); - pcntl_alarm($timeout); - try { - return call_user_func_array($callable, $arguments); - } finally { - pcntl_alarm(0); - } + return \strpos(\strtolower($code), $this->getKeywordString()) !== \false; } - public function canInvokeWithTimeout() : bool + protected function isKeywordContext(array $tokens, int $pos) : bool { - return function_exists('pcntl_signal') && function_exists('pcntl_async_signals') && function_exists('pcntl_alarm'); + $previousNonSpaceToken = $this->getPreviousNonSpaceToken($tokens, $pos); + return $previousNonSpaceToken === null || $previousNonSpaceToken[0] !== \T_OBJECT_OPERATOR; + } + public function emulate(string $code, array $tokens) : array + { + $keywordString = $this->getKeywordString(); + foreach ($tokens as $i => $token) { + if ($token[0] === \T_STRING && \strtolower($token[1]) === $keywordString && $this->isKeywordContext($tokens, $i)) { + $tokens[$i][0] = $this->getKeywordToken(); + } + } + return $tokens; } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Invoker; - -use RuntimeException; -final class ProcessControlExtensionNotLoadedException extends RuntimeException implements Exception -{ -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Invoker; - -use RuntimeException; -final class TimeoutException extends RuntimeException implements Exception -{ -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Invoker; - -use Throwable; -interface Exception extends Throwable -{ -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; - -class OrVersionConstraintGroup extends AbstractVersionConstraint -{ - /** @var VersionConstraint[] */ - private $constraints = []; /** - * @param string $originalValue - * @param VersionConstraint[] $constraints + * @param mixed[] $tokens + * @return array|string|null */ - public function __construct($originalValue, array $constraints) + private function getPreviousNonSpaceToken(array $tokens, int $start) { - parent::__construct($originalValue); - $this->constraints = $constraints; + for ($i = $start - 1; $i >= 0; --$i) { + if ($tokens[$i][0] === \T_WHITESPACE) { + continue; + } + return $tokens[$i]; + } + return null; } - public function complies(Version $version) : bool + public function reverseEmulate(string $code, array $tokens) : array { - foreach ($this->constraints as $constraint) { - if ($constraint->complies($version)) { - return \true; + $keywordToken = $this->getKeywordToken(); + foreach ($tokens as $i => $token) { + if ($token[0] === $keywordToken) { + $tokens[$i][0] = \T_STRING; } } - return \false; + return $tokens; } } , Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; - -interface VersionConstraint -{ - public function complies(Version $version) : bool; - public function asString() : string; -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; +namespace PHPUnit\PhpParser\Lexer\TokenEmulator; -class ExactVersionConstraint extends AbstractVersionConstraint +use PHPUnit\PhpParser\Lexer\Emulative; +final class MatchTokenEmulator extends KeywordEmulator { - public function complies(Version $version) : bool + public function getPhpVersion() : string { - return $this->asString() === $version->getVersionString(); + return Emulative::PHP_8_0; } -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; - -class AnyVersionConstraint implements VersionConstraint -{ - public function complies(Version $version) : bool + public function getKeywordString() : string { - return \true; + return 'match'; } - public function asString() : string + public function getKeywordToken() : int { - return '*'; + return \T_MATCH; } } , Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; +namespace PHPUnit\PhpParser\Lexer\TokenEmulator; -class SpecificMajorVersionConstraint extends AbstractVersionConstraint +use PHPUnit\PhpParser\Lexer\Emulative; +final class NullsafeTokenEmulator extends TokenEmulator { - /** @var int */ - private $major; - public function __construct(string $originalValue, int $major) + public function getPhpVersion() : string { - parent::__construct($originalValue); - $this->major = $major; + return Emulative::PHP_8_0; } - public function complies(Version $version) : bool + public function isEmulationNeeded(string $code) : bool { - return $version->getMajor()->getValue() === $this->major; + return \strpos($code, '?->') !== \false; + } + public function emulate(string $code, array $tokens) : array + { + // We need to manually iterate and manage a count because we'll change + // the tokens array on the way + $line = 1; + for ($i = 0, $c = \count($tokens); $i < $c; ++$i) { + if ($tokens[$i] === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1][0] === \T_OBJECT_OPERATOR) { + \array_splice($tokens, $i, 2, [[\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line]]); + $c--; + continue; + } + // Handle ?-> inside encapsed string. + if ($tokens[$i][0] === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1]) && $tokens[$i - 1][0] === \T_VARIABLE && \preg_match('/^\\?->([a-zA-Z_\\x80-\\xff][a-zA-Z0-9_\\x80-\\xff]*)/', $tokens[$i][1], $matches)) { + $replacement = [[\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line], [\T_STRING, $matches[1], $line]]; + if (\strlen($matches[0]) !== \strlen($tokens[$i][1])) { + $replacement[] = [\T_ENCAPSED_AND_WHITESPACE, \substr($tokens[$i][1], \strlen($matches[0])), $line]; + } + \array_splice($tokens, $i, 1, $replacement); + $c += \count($replacement) - 1; + continue; + } + if (\is_array($tokens[$i])) { + $line += \substr_count($tokens[$i][1], "\n"); + } + } + return $tokens; + } + public function reverseEmulate(string $code, array $tokens) : array + { + // ?-> was not valid code previously, don't bother. + return $tokens; } } , Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; +namespace PHPUnit\PhpParser\Lexer\TokenEmulator; -class SpecificMajorAndMinorVersionConstraint extends AbstractVersionConstraint +use PHPUnit\PhpParser\Lexer\Emulative; +final class NumericLiteralSeparatorEmulator extends TokenEmulator { - /** @var int */ - private $major; - /** @var int */ - private $minor; - public function __construct(string $originalValue, int $major, int $minor) + const BIN = '(?:0b[01]+(?:_[01]+)*)'; + const HEX = '(?:0x[0-9a-f]+(?:_[0-9a-f]+)*)'; + const DEC = '(?:[0-9]+(?:_[0-9]+)*)'; + const SIMPLE_FLOAT = '(?:' . self::DEC . '\\.' . self::DEC . '?|\\.' . self::DEC . ')'; + const EXP = '(?:e[+-]?' . self::DEC . ')'; + const FLOAT = '(?:' . self::SIMPLE_FLOAT . self::EXP . '?|' . self::DEC . self::EXP . ')'; + const NUMBER = '~' . self::FLOAT . '|' . self::BIN . '|' . self::HEX . '|' . self::DEC . '~iA'; + public function getPhpVersion() : string { - parent::__construct($originalValue); - $this->major = $major; - $this->minor = $minor; + return Emulative::PHP_7_4; } - public function complies(Version $version) : bool + public function isEmulationNeeded(string $code) : bool { - if ($version->getMajor()->getValue() !== $this->major) { - return \false; + return \preg_match('~[0-9]_[0-9]~', $code) || \preg_match('~0x[0-9a-f]+_[0-9a-f]~i', $code); + } + public function emulate(string $code, array $tokens) : array + { + // We need to manually iterate and manage a count because we'll change + // the tokens array on the way + $codeOffset = 0; + for ($i = 0, $c = \count($tokens); $i < $c; ++$i) { + $token = $tokens[$i]; + $tokenLen = \strlen(\is_array($token) ? $token[1] : $token); + if ($token[0] !== \T_LNUMBER && $token[0] !== \T_DNUMBER) { + $codeOffset += $tokenLen; + continue; + } + $res = \preg_match(self::NUMBER, $code, $matches, 0, $codeOffset); + \assert($res, "No number at number token position"); + $match = $matches[0]; + $matchLen = \strlen($match); + if ($matchLen === $tokenLen) { + // Original token already holds the full number. + $codeOffset += $tokenLen; + continue; + } + $tokenKind = $this->resolveIntegerOrFloatToken($match); + $newTokens = [[$tokenKind, $match, $token[2]]]; + $numTokens = 1; + $len = $tokenLen; + while ($matchLen > $len) { + $nextToken = $tokens[$i + $numTokens]; + $nextTokenText = \is_array($nextToken) ? $nextToken[1] : $nextToken; + $nextTokenLen = \strlen($nextTokenText); + $numTokens++; + if ($matchLen < $len + $nextTokenLen) { + // Split trailing characters into a partial token. + \assert(\is_array($nextToken), "Partial token should be an array token"); + $partialText = \substr($nextTokenText, $matchLen - $len); + $newTokens[] = [$nextToken[0], $partialText, $nextToken[2]]; + break; + } + $len += $nextTokenLen; + } + \array_splice($tokens, $i, $numTokens, $newTokens); + $c -= $numTokens - \count($newTokens); + $codeOffset += $matchLen; } - return $version->getMinor()->getValue() === $this->minor; + return $tokens; } -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; - -class GreaterThanOrEqualToVersionConstraint extends AbstractVersionConstraint -{ - /** @var Version */ - private $minimalVersion; - public function __construct(string $originalValue, Version $minimalVersion) + private function resolveIntegerOrFloatToken(string $str) : int { - parent::__construct($originalValue); - $this->minimalVersion = $minimalVersion; + $str = \str_replace('_', '', $str); + if (\stripos($str, '0b') === 0) { + $num = \bindec($str); + } elseif (\stripos($str, '0x') === 0) { + $num = \hexdec($str); + } elseif (\stripos($str, '0') === 0 && \ctype_digit($str)) { + $num = \octdec($str); + } else { + $num = +$str; + } + return \is_float($num) ? \T_DNUMBER : \T_LNUMBER; } - public function complies(Version $version) : bool + public function reverseEmulate(string $code, array $tokens) : array { - return $version->getVersionString() === $this->minimalVersion->getVersionString() || $version->isGreaterThan($this->minimalVersion); + // Numeric separators were not legal code previously, don't bother. + return $tokens; } } , Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; +namespace PHPUnit\PhpParser\Lexer\TokenEmulator; -abstract class AbstractVersionConstraint implements VersionConstraint +use PHPUnit\PhpParser\Lexer\Emulative; +final class ReadonlyTokenEmulator extends KeywordEmulator { - /** @var string */ - private $originalValue; - public function __construct(string $originalValue) + public function getPhpVersion() : string { - $this->originalValue = $originalValue; + return Emulative::PHP_8_1; } - public function asString() : string + public function getKeywordString() : string { - return $this->originalValue; + return 'readonly'; } -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; - -class AndVersionConstraintGroup extends AbstractVersionConstraint -{ - /** @var VersionConstraint[] */ - private $constraints = []; - /** - * @param VersionConstraint[] $constraints - */ - public function __construct(string $originalValue, array $constraints) + public function getKeywordToken() : int { - parent::__construct($originalValue); - $this->constraints = $constraints; + return \T_READONLY; } - public function complies(Version $version) : bool + protected function isKeywordContext(array $tokens, int $pos) : bool { - foreach ($this->constraints as $constraint) { - if (!$constraint->complies($version)) { - return \false; - } + if (!parent::isKeywordContext($tokens, $pos)) { + return \false; } - return \true; + // Support "function readonly(" + return !(isset($tokens[$pos + 1]) && ($tokens[$pos + 1][0] === '(' || $tokens[$pos + 1][0] === \T_WHITESPACE && isset($tokens[$pos + 2]) && $tokens[$pos + 2][0] === '(')); } } , Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; +namespace PHPUnit\PhpParser\Lexer\TokenEmulator; -class VersionNumber +/** + * Reverses emulation direction of the inner emulator. + */ +final class ReverseEmulator extends TokenEmulator { - /** @var ?int */ - private $value; - public function __construct(?int $value) + /** @var TokenEmulator Inner emulator */ + private $emulator; + public function __construct(TokenEmulator $emulator) { - $this->value = $value; + $this->emulator = $emulator; } - public function isAny() : bool + public function getPhpVersion() : string { - return $this->value === null; + return $this->emulator->getPhpVersion(); } - public function getValue() : ?int + public function isEmulationNeeded(string $code) : bool { - return $this->value; + return $this->emulator->isEmulationNeeded($code); + } + public function emulate(string $code, array $tokens) : array + { + return $this->emulator->reverseEmulate($code, $tokens); + } + public function reverseEmulate(string $code, array $tokens) : array + { + return $this->emulator->emulate($code, $tokens); + } + public function preprocessCode(string $code, array &$patches) : string + { + return $code; } } , Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; +namespace PHPUnit\PhpParser\Lexer\TokenEmulator; -class VersionConstraintParser +/** @internal */ +abstract class TokenEmulator { + public abstract function getPhpVersion() : string; + public abstract function isEmulationNeeded(string $code) : bool; /** - * @throws UnsupportedVersionConstraintException + * @return array Modified Tokens */ - public function parse(string $value) : VersionConstraint + public abstract function emulate(string $code, array $tokens) : array; + /** + * @return array Modified Tokens + */ + public abstract function reverseEmulate(string $code, array $tokens) : array; + public function preprocessCode(string $code, array &$patches) : string { - if (\strpos($value, '||') !== \false) { - return $this->handleOrGroup($value); - } - if (!\preg_match('/^[\\^~*]?v?[\\d.*]+(?:-.*)?$/i', $value)) { - throw new UnsupportedVersionConstraintException(\sprintf('Version constraint %s is not supported.', $value)); - } - switch ($value[0]) { - case '~': - return $this->handleTildeOperator($value); - case '^': - return $this->handleCaretOperator($value); - } - $constraint = new VersionConstraintValue($value); - if ($constraint->getMajor()->isAny()) { - return new AnyVersionConstraint(); - } - if ($constraint->getMinor()->isAny()) { - return new SpecificMajorVersionConstraint($constraint->getVersionString(), $constraint->getMajor()->getValue() ?? 0); - } - if ($constraint->getPatch()->isAny()) { - return new SpecificMajorAndMinorVersionConstraint($constraint->getVersionString(), $constraint->getMajor()->getValue() ?? 0, $constraint->getMinor()->getValue() ?? 0); - } - return new ExactVersionConstraint($constraint->getVersionString()); - } - private function handleOrGroup(string $value) : OrVersionConstraintGroup - { - $constraints = []; - foreach (\explode('||', $value) as $groupSegment) { - $constraints[] = $this->parse(\trim($groupSegment)); - } - return new OrVersionConstraintGroup($value, $constraints); - } - private function handleTildeOperator(string $value) : AndVersionConstraintGroup - { - $constraintValue = new VersionConstraintValue(\substr($value, 1)); - if ($constraintValue->getPatch()->isAny()) { - return $this->handleCaretOperator($value); - } - $constraints = [new GreaterThanOrEqualToVersionConstraint($value, new Version(\substr($value, 1))), new SpecificMajorAndMinorVersionConstraint($value, $constraintValue->getMajor()->getValue() ?? 0, $constraintValue->getMinor()->getValue() ?? 0)]; - return new AndVersionConstraintGroup($value, $constraints); - } - private function handleCaretOperator(string $value) : AndVersionConstraintGroup - { - $constraintValue = new VersionConstraintValue(\substr($value, 1)); - $constraints = [new GreaterThanOrEqualToVersionConstraint($value, new Version(\substr($value, 1)))]; - if ($constraintValue->getMajor()->getValue() === 0) { - $constraints[] = new SpecificMajorAndMinorVersionConstraint($value, $constraintValue->getMajor()->getValue() ?? 0, $constraintValue->getMinor()->getValue() ?? 0); - } else { - $constraints[] = new SpecificMajorVersionConstraint($value, $constraintValue->getMajor()->getValue() ?? 0); - } - return new AndVersionConstraintGroup($value, $constraints); + return $code; } } , Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; +namespace PHPUnit\PhpParser; -class Version +use PHPUnit\PhpParser\Node\Name; +use PHPUnit\PhpParser\Node\Name\FullyQualified; +use PHPUnit\PhpParser\Node\Stmt; +class NameContext { - /** @var string */ - private $originalVersionString; - /** @var VersionNumber */ - private $major; - /** @var VersionNumber */ - private $minor; - /** @var VersionNumber */ - private $patch; - /** @var null|PreReleaseSuffix */ - private $preReleaseSuffix; - public function __construct(string $versionString) - { - $this->ensureVersionStringIsValid($versionString); - $this->originalVersionString = $versionString; - } - public function getPreReleaseSuffix() : PreReleaseSuffix + /** @var null|Name Current namespace */ + protected $namespace; + /** @var Name[][] Map of format [aliasType => [aliasName => originalName]] */ + protected $aliases = []; + /** @var Name[][] Same as $aliases but preserving original case */ + protected $origAliases = []; + /** @var ErrorHandler Error handler */ + protected $errorHandler; + /** + * Create a name context. + * + * @param ErrorHandler $errorHandler Error handling used to report errors + */ + public function __construct(ErrorHandler $errorHandler) { - if ($this->preReleaseSuffix === null) { - throw new NoPreReleaseSuffixException('No pre-release suffix set'); - } - return $this->preReleaseSuffix; + $this->errorHandler = $errorHandler; } - public function getOriginalString() : string + /** + * Start a new namespace. + * + * This also resets the alias table. + * + * @param Name|null $namespace Null is the global namespace + */ + public function startNamespace(Name $namespace = null) { - return $this->originalVersionString; + $this->namespace = $namespace; + $this->origAliases = $this->aliases = [Stmt\Use_::TYPE_NORMAL => [], Stmt\Use_::TYPE_FUNCTION => [], Stmt\Use_::TYPE_CONSTANT => []]; } - public function getVersionString() : string + /** + * Add an alias / import. + * + * @param Name $name Original name + * @param string $aliasName Aliased name + * @param int $type One of Stmt\Use_::TYPE_* + * @param array $errorAttrs Attributes to use to report an error + */ + public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []) { - $str = \sprintf('%d.%d.%d', $this->getMajor()->getValue() ?? 0, $this->getMinor()->getValue() ?? 0, $this->getPatch()->getValue() ?? 0); - if (!$this->hasPreReleaseSuffix()) { - return $str; + // Constant names are case sensitive, everything else case insensitive + if ($type === Stmt\Use_::TYPE_CONSTANT) { + $aliasLookupName = $aliasName; + } else { + $aliasLookupName = \strtolower($aliasName); } - return $str . '-' . $this->getPreReleaseSuffix()->asString(); - } - public function hasPreReleaseSuffix() : bool - { - return $this->preReleaseSuffix !== null; + if (isset($this->aliases[$type][$aliasLookupName])) { + $typeStringMap = [Stmt\Use_::TYPE_NORMAL => '', Stmt\Use_::TYPE_FUNCTION => 'function ', Stmt\Use_::TYPE_CONSTANT => 'const ']; + $this->errorHandler->handleError(new Error(\sprintf('Cannot use %s%s as %s because the name is already in use', $typeStringMap[$type], $name, $aliasName), $errorAttrs)); + return; + } + $this->aliases[$type][$aliasLookupName] = $name; + $this->origAliases[$type][$aliasName] = $name; } - public function equals(Version $other) : bool + /** + * Get current namespace. + * + * @return null|Name Namespace (or null if global namespace) + */ + public function getNamespace() { - return $this->getVersionString() === $other->getVersionString(); + return $this->namespace; } - public function isGreaterThan(Version $version) : bool + /** + * Get resolved name. + * + * @param Name $name Name to resolve + * @param int $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT} + * + * @return null|Name Resolved name, or null if static resolution is not possible + */ + public function getResolvedName(Name $name, int $type) { - if ($version->getMajor()->getValue() > $this->getMajor()->getValue()) { - return \false; - } - if ($version->getMajor()->getValue() < $this->getMajor()->getValue()) { - return \true; - } - if ($version->getMinor()->getValue() > $this->getMinor()->getValue()) { - return \false; - } - if ($version->getMinor()->getValue() < $this->getMinor()->getValue()) { - return \true; - } - if ($version->getPatch()->getValue() > $this->getPatch()->getValue()) { - return \false; - } - if ($version->getPatch()->getValue() < $this->getPatch()->getValue()) { - return \true; + // don't resolve special class names + if ($type === Stmt\Use_::TYPE_NORMAL && $name->isSpecialClassName()) { + if (!$name->isUnqualified()) { + $this->errorHandler->handleError(new Error(\sprintf("'\\%s' is an invalid class name", $name->toString()), $name->getAttributes())); + } + return $name; } - if (!$version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { - return \false; + // fully qualified names are already resolved + if ($name->isFullyQualified()) { + return $name; } - if ($version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { - return \true; + // Try to resolve aliases + if (null !== ($resolvedName = $this->resolveAlias($name, $type))) { + return $resolvedName; } - if (!$version->hasPreReleaseSuffix() && $this->hasPreReleaseSuffix()) { - return \false; + if ($type !== Stmt\Use_::TYPE_NORMAL && $name->isUnqualified()) { + if (null === $this->namespace) { + // outside of a namespace unaliased unqualified is same as fully qualified + return new FullyQualified($name, $name->getAttributes()); + } + // Cannot resolve statically + return null; } - return $this->getPreReleaseSuffix()->isGreaterThan($version->getPreReleaseSuffix()); - } - public function getMajor() : VersionNumber - { - return $this->major; - } - public function getMinor() : VersionNumber - { - return $this->minor; - } - public function getPatch() : VersionNumber - { - return $this->patch; + // if no alias exists prepend current namespace + return FullyQualified::concat($this->namespace, $name, $name->getAttributes()); } /** - * @param string[] $matches + * Get resolved class name. * - * @throws InvalidPreReleaseSuffixException + * @param Name $name Class ame to resolve + * + * @return Name Resolved name */ - private function parseVersion(array $matches) : void + public function getResolvedClassName(Name $name) : Name { - $this->major = new VersionNumber((int) $matches['Major']); - $this->minor = new VersionNumber((int) $matches['Minor']); - $this->patch = isset($matches['Patch']) ? new VersionNumber((int) $matches['Patch']) : new VersionNumber(0); - if (isset($matches['PreReleaseSuffix'])) { - $this->preReleaseSuffix = new PreReleaseSuffix($matches['PreReleaseSuffix']); - } + return $this->getResolvedName($name, Stmt\Use_::TYPE_NORMAL); } /** - * @param string $version + * Get possible ways of writing a fully qualified name (e.g., by making use of aliases). * - * @throws InvalidVersionException + * @param string $name Fully-qualified name (without leading namespace separator) + * @param int $type One of Stmt\Use_::TYPE_* + * + * @return Name[] Possible representations of the name */ - private function ensureVersionStringIsValid($version) : void + public function getPossibleNames(string $name, int $type) : array { - $regex = '/^v? - (?(0|(?:[1-9]\\d*))) - \\. - (?(0|(?:[1-9]\\d*))) - (\\. - (?(0|(?:[1-9]\\d*))) - )? - (?: - - - (?(?:(dev|beta|b|rc|alpha|a|patch|p)\\.?\\d*)) - )? - $/xi'; - if (\preg_match($regex, $version, $matches) !== 1) { - throw new InvalidVersionException(\sprintf("Version string '%s' does not follow SemVer semantics", $version)); + $lcName = \strtolower($name); + if ($type === Stmt\Use_::TYPE_NORMAL) { + // self, parent and static must always be unqualified + if ($lcName === "self" || $lcName === "parent" || $lcName === "static") { + return [new Name($name)]; + } } - $this->parseVersion($matches); + // Collect possible ways to write this name, starting with the fully-qualified name + $possibleNames = [new FullyQualified($name)]; + if (null !== ($nsRelativeName = $this->getNamespaceRelativeName($name, $lcName, $type))) { + // Make sure there is no alias that makes the normally namespace-relative name + // into something else + if (null === $this->resolveAlias($nsRelativeName, $type)) { + $possibleNames[] = $nsRelativeName; + } + } + // Check for relevant namespace use statements + foreach ($this->origAliases[Stmt\Use_::TYPE_NORMAL] as $alias => $orig) { + $lcOrig = $orig->toLowerString(); + if (0 === \strpos($lcName, $lcOrig . '\\')) { + $possibleNames[] = new Name($alias . \substr($name, \strlen($lcOrig))); + } + } + // Check for relevant type-specific use statements + foreach ($this->origAliases[$type] as $alias => $orig) { + if ($type === Stmt\Use_::TYPE_CONSTANT) { + // Constants are are complicated-sensitive + $normalizedOrig = $this->normalizeConstName($orig->toString()); + if ($normalizedOrig === $this->normalizeConstName($name)) { + $possibleNames[] = new Name($alias); + } + } else { + // Everything else is case-insensitive + if ($orig->toLowerString() === $lcName) { + $possibleNames[] = new Name($alias); + } + } + } + return $possibleNames; } -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; - -final class UnsupportedVersionConstraintException extends \RuntimeException implements Exception -{ -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Version; - -use Throwable; -interface Exception extends Throwable -{ -} - 0, 'a' => 1, 'alpha' => 1, 'b' => 2, 'beta' => 2, 'rc' => 3, 'p' => 4, 'patch' => 4]; - /** @var string */ - private $value; - /** @var int */ - private $valueScore; - /** @var int */ - private $number = 0; - /** @var string */ - private $full; /** - * @throws InvalidPreReleaseSuffixException + * Get shortest representation of this fully-qualified name. + * + * @param string $name Fully-qualified name (without leading namespace separator) + * @param int $type One of Stmt\Use_::TYPE_* + * + * @return Name Shortest representation */ - public function __construct(string $value) - { - $this->parseValue($value); - } - public function asString() : string - { - return $this->full; - } - public function getValue() : string + public function getShortName(string $name, int $type) : Name { - return $this->value; + $possibleNames = $this->getPossibleNames($name, $type); + // Find shortest name + $shortestName = null; + $shortestLength = \INF; + foreach ($possibleNames as $possibleName) { + $length = \strlen($possibleName->toCodeString()); + if ($length < $shortestLength) { + $shortestName = $possibleName; + $shortestLength = $length; + } + } + return $shortestName; } - public function getNumber() : ?int + private function resolveAlias(Name $name, $type) { - return $this->number; + $firstPart = $name->getFirst(); + if ($name->isQualified()) { + // resolve aliases for qualified names, always against class alias table + $checkName = \strtolower($firstPart); + if (isset($this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName])) { + $alias = $this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName]; + return FullyQualified::concat($alias, $name->slice(1), $name->getAttributes()); + } + } elseif ($name->isUnqualified()) { + // constant aliases are case-sensitive, function aliases case-insensitive + $checkName = $type === Stmt\Use_::TYPE_CONSTANT ? $firstPart : \strtolower($firstPart); + if (isset($this->aliases[$type][$checkName])) { + // resolve unqualified aliases + return new FullyQualified($this->aliases[$type][$checkName], $name->getAttributes()); + } + } + // No applicable aliases + return null; } - public function isGreaterThan(PreReleaseSuffix $suffix) : bool + private function getNamespaceRelativeName(string $name, string $lcName, int $type) { - if ($this->valueScore > $suffix->valueScore) { - return \true; + if (null === $this->namespace) { + return new Name($name); } - if ($this->valueScore < $suffix->valueScore) { - return \false; + if ($type === Stmt\Use_::TYPE_CONSTANT) { + // The constants true/false/null always resolve to the global symbols, even inside a + // namespace, so they may be used without qualification + if ($lcName === "true" || $lcName === "false" || $lcName === "null") { + return new Name($name); + } } - return $this->getNumber() > $suffix->getNumber(); - } - private function mapValueToScore(string $value) : int - { - $value = \strtolower($value); - if (\array_key_exists($value, self::valueScoreMap)) { - return self::valueScoreMap[$value]; + $namespacePrefix = \strtolower($this->namespace . '\\'); + if (0 === \strpos($lcName, $namespacePrefix)) { + return new Name(\substr($name, \strlen($namespacePrefix))); } - return 0; + return null; } - private function parseValue(string $value) : void + private function normalizeConstName(string $name) { - $regex = '/-?((dev|beta|b|rc|alpha|a|patch|p)\\.?(\\d*)).*$/i'; - if (\preg_match($regex, $value, $matches) !== 1) { - throw new InvalidPreReleaseSuffixException(\sprintf('Invalid label %s', $value)); - } - $this->full = $matches[1]; - $this->value = $matches[2]; - if ($matches[3] !== '') { - $this->number = (int) $matches[3]; + $nsSep = \strrpos($name, '\\'); + if (\false === $nsSep) { + return $name; } - $this->valueScore = $this->mapValueToScore($matches[2]); + // Constants have case-insensitive namespace and case-sensitive short-name + $ns = \substr($name, 0, $nsSep); + $shortName = \substr($name, $nsSep + 1); + return \strtolower($ns) . '\\' . $shortName; } } -phar-io/version - -Copyright (c) 2016-2017 Arne Blankerts , Sebastian Heuer and contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Arne Blankerts nor the names of contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - versionString = $versionString; - $this->parseVersion($versionString); - } - public function getLabel() : string - { - return $this->label; - } - public function getBuildMetaData() : string - { - return $this->buildMetaData; - } - public function getVersionString() : string + /** + * Gets the type of the node. + * + * @return string Type of the node + */ + public function getType() : string; + /** + * Gets the names of the sub nodes. + * + * @return array Names of sub nodes + */ + public function getSubNodeNames() : array; + /** + * Gets line the node started in (alias of getStartLine). + * + * @return int Start line (or -1 if not available) + */ + public function getLine() : int; + /** + * Gets line the node started in. + * + * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default). + * + * @return int Start line (or -1 if not available) + */ + public function getStartLine() : int; + /** + * Gets the line the node ended in. + * + * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default). + * + * @return int End line (or -1 if not available) + */ + public function getEndLine() : int; + /** + * Gets the token offset of the first token that is part of this node. + * + * The offset is an index into the array returned by Lexer::getTokens(). + * + * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default). + * + * @return int Token start position (or -1 if not available) + */ + public function getStartTokenPos() : int; + /** + * Gets the token offset of the last token that is part of this node. + * + * The offset is an index into the array returned by Lexer::getTokens(). + * + * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default). + * + * @return int Token end position (or -1 if not available) + */ + public function getEndTokenPos() : int; + /** + * Gets the file offset of the first character that is part of this node. + * + * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default). + * + * @return int File start position (or -1 if not available) + */ + public function getStartFilePos() : int; + /** + * Gets the file offset of the last character that is part of this node. + * + * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default). + * + * @return int File end position (or -1 if not available) + */ + public function getEndFilePos() : int; + /** + * Gets all comments directly preceding this node. + * + * The comments are also available through the "comments" attribute. + * + * @return Comment[] + */ + public function getComments() : array; + /** + * Gets the doc comment of the node. + * + * @return null|Comment\Doc Doc comment object or null + */ + public function getDocComment(); + /** + * Sets the doc comment of the node. + * + * This will either replace an existing doc comment or add it to the comments array. + * + * @param Comment\Doc $docComment Doc comment to set + */ + public function setDocComment(Comment\Doc $docComment); + /** + * Sets an attribute on a node. + * + * @param string $key + * @param mixed $value + */ + public function setAttribute(string $key, $value); + /** + * Returns whether an attribute exists. + * + * @param string $key + * + * @return bool + */ + public function hasAttribute(string $key) : bool; + /** + * Returns the value of an attribute. + * + * @param string $key + * @param mixed $default + * + * @return mixed + */ + public function getAttribute(string $key, $default = null); + /** + * Returns all the attributes of this node. + * + * @return array + */ + public function getAttributes() : array; + /** + * Replaces all the attributes of this node. + * + * @param array $attributes + */ + public function setAttributes(array $attributes); +} +versionString; + $this->attributes = $attributes; + $this->name = $name; + $this->value = $value; + $this->byRef = $byRef; + $this->unpack = $unpack; } - public function getMajor() : VersionNumber + public function getSubNodeNames() : array { - return $this->major; + return ['name', 'value', 'byRef', 'unpack']; } - public function getMinor() : VersionNumber + public function getType() : string { - return $this->minor; + return 'Arg'; } - public function getPatch() : VersionNumber +} +patch; + $this->attributes = $attributes; + $this->name = $name; + $this->args = $args; } - private function parseVersion(string $versionString) : void + public function getSubNodeNames() : array { - $this->extractBuildMetaData($versionString); - $this->extractLabel($versionString); - $this->stripPotentialVPrefix($versionString); - $versionSegments = \explode('.', $versionString); - $this->major = new VersionNumber(\is_numeric($versionSegments[0]) ? (int) $versionSegments[0] : null); - $minorValue = isset($versionSegments[1]) && \is_numeric($versionSegments[1]) ? (int) $versionSegments[1] : null; - $patchValue = isset($versionSegments[2]) && \is_numeric($versionSegments[2]) ? (int) $versionSegments[2] : null; - $this->minor = new VersionNumber($minorValue); - $this->patch = new VersionNumber($patchValue); + return ['name', 'args']; } - private function extractBuildMetaData(string &$versionString) : void + public function getType() : string { - if (\preg_match('/\\+(.*)/', $versionString, $matches) === 1) { - $this->buildMetaData = $matches[1]; - $versionString = \str_replace($matches[0], '', $versionString); - } + return 'Attribute'; } - private function extractLabel(string &$versionString) : void +} +label = $matches[1]; - $versionString = \str_replace($matches[0], '', $versionString); - } + $this->attributes = $attributes; + $this->attrs = $attrs; } - private function stripPotentialVPrefix(string &$versionString) : void + public function getSubNodeNames() : array { - if ($versionString[0] !== 'v') { - return; - } - $versionString = \substr($versionString, 1); + return ['attrs']; + } + public function getType() : string + { + return 'AttributeGroup'; } } - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\ObjectEnumerator; +namespace PHPUnit\PhpParser\Node; -use function array_merge; -use function func_get_args; -use function is_array; -use function is_object; -use PHPUnit\SebastianBergmann\ObjectReflector\ObjectReflector; -use PHPUnit\SebastianBergmann\RecursionContext\Context; +use PHPUnit\PhpParser\NodeAbstract; /** - * Traverses array structures and object graphs - * to enumerate all referenced objects. + * This is a base class for complex types, including nullable types and union types. + * + * It does not provide any shared behavior and exists only for type-checking purposes. */ -class Enumerator +abstract class ComplexType extends NodeAbstract +{ +} +attributes = $attributes; + $this->name = \is_string($name) ? new Identifier($name) : $name; + $this->value = $value; + } + public function getSubNodeNames() : array + { + return ['name', 'value']; + } + public function getType() : string + { + return 'Const'; + } +} +contains($variable)) { - return $objects; - } - $array = $variable; - $processed->add($variable); - if (is_array($variable)) { - foreach ($array as $element) { - if (!is_array($element) && !is_object($element)) { - continue; - } - $objects = array_merge($objects, $this->enumerate($element, $processed)); - } - } else { - $objects[] = $variable; - $reflector = new ObjectReflector(); - foreach ($reflector->getAttributes($variable) as $value) { - if (!is_array($value) && !is_object($value)) { - continue; - } - $objects = array_merge($objects, $this->enumerate($value, $processed)); - } - } - return $objects; + $this->attributes = $attributes; + $this->var = $var; + $this->dim = $dim; + } + public function getSubNodeNames() : array + { + return ['var', 'dim']; + } + public function getType() : string + { + return 'Expr_ArrayDimFetch'; } } - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\ObjectEnumerator; +namespace PHPUnit\PhpParser\Node\Expr; -use Throwable; -interface Exception extends Throwable +use PHPUnit\PhpParser\Node\Expr; +class ArrayItem extends Expr { + /** @var null|Expr Key */ + public $key; + /** @var Expr Value */ + public $value; + /** @var bool Whether to assign by reference */ + public $byRef; + /** @var bool Whether to unpack the argument */ + public $unpack; + /** + * Constructs an array item node. + * + * @param Expr $value Value + * @param null|Expr $key Key + * @param bool $byRef Whether to assign by reference + * @param array $attributes Additional attributes + */ + public function __construct(Expr $value, Expr $key = null, bool $byRef = \false, array $attributes = [], bool $unpack = \false) + { + $this->attributes = $attributes; + $this->key = $key; + $this->value = $value; + $this->byRef = $byRef; + $this->unpack = $unpack; + } + public function getSubNodeNames() : array + { + return ['key', 'value', 'byRef', 'unpack']; + } + public function getType() : string + { + return 'Expr_ArrayItem'; + } } - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\ObjectEnumerator; +namespace PHPUnit\PhpParser\Node\Expr; -class InvalidArgumentException extends \InvalidArgumentException implements Exception +use PHPUnit\PhpParser\Node\Expr; +class Array_ extends Expr { + // For use in "kind" attribute + const KIND_LONG = 1; + // array() syntax + const KIND_SHORT = 2; + // [] syntax + /** @var (ArrayItem|null)[] Items */ + public $items; + /** + * Constructs an array node. + * + * @param (ArrayItem|null)[] $items Items of the array + * @param array $attributes Additional attributes + */ + public function __construct(array $items = [], array $attributes = []) + { + $this->attributes = $attributes; + $this->items = $items; + } + public function getSubNodeNames() : array + { + return ['items']; + } + public function getType() : string + { + return 'Expr_Array'; + } } - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 9.5 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -BSD 3-Clause License - -Copyright (c) 2011, Nikita Popov -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. false : Whether the closure is static + * 'byRef' => false : Whether to return by reference + * 'params' => array() : Parameters + * 'returnType' => null : Return type + * 'expr' => Expr : Expression body + * 'attrGroups' => array() : PHP attribute groups + * @param array $attributes Additional attributes */ - public function __construct(array $options = []) + public function __construct(array $subNodes = [], array $attributes = []) { - $this->dumpComments = !empty($options['dumpComments']); - $this->dumpPositions = !empty($options['dumpPositions']); + $this->attributes = $attributes; + $this->static = $subNodes['static'] ?? \false; + $this->byRef = $subNodes['byRef'] ?? \false; + $this->params = $subNodes['params'] ?? []; + $returnType = $subNodes['returnType'] ?? null; + $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->expr = $subNodes['expr']; + $this->attrGroups = $subNodes['attrGroups'] ?? []; } - /** - * Dumps a node or array. - * - * @param array|Node $node Node or array to dump - * @param string|null $code Code corresponding to dumped AST. This only needs to be passed if - * the dumpPositions option is enabled and the dumping of node offsets - * is desired. - * - * @return string Dumped value - */ - public function dump($node, string $code = null) : string + public function getSubNodeNames() : array { - $this->code = $code; - return $this->dumpRecursive($node); + return ['attrGroups', 'static', 'byRef', 'params', 'returnType', 'expr']; } - protected function dumpRecursive($node) + public function returnsByRef() : bool { - if ($node instanceof Node) { - $r = $node->getType(); - if ($this->dumpPositions && null !== ($p = $this->dumpPosition($node))) { - $r .= $p; - } - $r .= '('; - foreach ($node->getSubNodeNames() as $key) { - $r .= "\n " . $key . ': '; - $value = $node->{$key}; - if (null === $value) { - $r .= 'null'; - } elseif (\false === $value) { - $r .= 'false'; - } elseif (\true === $value) { - $r .= 'true'; - } elseif (\is_scalar($value)) { - if ('flags' === $key || 'newModifier' === $key) { - $r .= $this->dumpFlags($value); - } elseif ('type' === $key && $node instanceof Include_) { - $r .= $this->dumpIncludeType($value); - } elseif ('type' === $key && ($node instanceof Use_ || $node instanceof UseUse || $node instanceof GroupUse)) { - $r .= $this->dumpUseType($value); - } else { - $r .= $value; - } - } else { - $r .= \str_replace("\n", "\n ", $this->dumpRecursive($value)); - } - } - if ($this->dumpComments && ($comments = $node->getComments())) { - $r .= "\n comments: " . \str_replace("\n", "\n ", $this->dumpRecursive($comments)); - } - } elseif (\is_array($node)) { - $r = 'array('; - foreach ($node as $key => $value) { - $r .= "\n " . $key . ': '; - if (null === $value) { - $r .= 'null'; - } elseif (\false === $value) { - $r .= 'false'; - } elseif (\true === $value) { - $r .= 'true'; - } elseif (\is_scalar($value)) { - $r .= $value; - } else { - $r .= \str_replace("\n", "\n ", $this->dumpRecursive($value)); - } - } - } elseif ($node instanceof Comment) { - return $node->getReformattedText(); - } else { - throw new \InvalidArgumentException('Can only dump nodes and arrays.'); - } - return $r . "\n)"; + return $this->byRef; } - protected function dumpFlags($flags) + public function getParams() : array { - $strs = []; - if ($flags & Class_::MODIFIER_PUBLIC) { - $strs[] = 'MODIFIER_PUBLIC'; - } - if ($flags & Class_::MODIFIER_PROTECTED) { - $strs[] = 'MODIFIER_PROTECTED'; - } - if ($flags & Class_::MODIFIER_PRIVATE) { - $strs[] = 'MODIFIER_PRIVATE'; - } - if ($flags & Class_::MODIFIER_ABSTRACT) { - $strs[] = 'MODIFIER_ABSTRACT'; - } - if ($flags & Class_::MODIFIER_STATIC) { - $strs[] = 'MODIFIER_STATIC'; - } - if ($flags & Class_::MODIFIER_FINAL) { - $strs[] = 'MODIFIER_FINAL'; - } - if ($flags & Class_::MODIFIER_READONLY) { - $strs[] = 'MODIFIER_READONLY'; - } - if ($strs) { - return \implode(' | ', $strs) . ' (' . $flags . ')'; - } else { - return $flags; - } + return $this->params; } - protected function dumpIncludeType($type) + public function getReturnType() { - $map = [Include_::TYPE_INCLUDE => 'TYPE_INCLUDE', Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE', Include_::TYPE_REQUIRE => 'TYPE_REQUIRE', Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE']; - if (!isset($map[$type])) { - return $type; - } - return $map[$type] . ' (' . $type . ')'; + return $this->returnType; } - protected function dumpUseType($type) + public function getAttrGroups() : array { - $map = [Use_::TYPE_UNKNOWN => 'TYPE_UNKNOWN', Use_::TYPE_NORMAL => 'TYPE_NORMAL', Use_::TYPE_FUNCTION => 'TYPE_FUNCTION', Use_::TYPE_CONSTANT => 'TYPE_CONSTANT']; - if (!isset($map[$type])) { - return $type; - } - return $map[$type] . ' (' . $type . ')'; + return $this->attrGroups; } /** - * Dump node position, if possible. - * - * @param Node $node Node for which to dump position - * - * @return string|null Dump of position, or null if position information not available + * @return Node\Stmt\Return_[] */ - protected function dumpPosition(Node $node) + public function getStmts() : array { - if (!$node->hasAttribute('startLine') || !$node->hasAttribute('endLine')) { - return null; - } - $start = $node->getStartLine(); - $end = $node->getEndLine(); - if ($node->hasAttribute('startFilePos') && $node->hasAttribute('endFilePos') && null !== $this->code) { - $start .= ':' . $this->toColumn($this->code, $node->getStartFilePos()); - $end .= ':' . $this->toColumn($this->code, $node->getEndFilePos()); - } - return "[{$start} - {$end}]"; + return [new Node\Stmt\Return_($this->expr)]; } - // Copied from Error class - private function toColumn($code, $pos) + public function getType() : string { - if ($pos > \strlen($code)) { - throw new \RuntimeException('Invalid position information'); - } - $lineStartPos = \strrpos($code, "\n", $pos - \strlen($code)); - if (\false === $lineStartPos) { - $lineStartPos = -1; - } - return $pos - $lineStartPos; + return 'Expr_ArrowFunction'; } } tokens = $tokens; - $this->indentMap = $this->calcIndentMap(); + $this->attributes = $attributes; + $this->var = $var; + $this->expr = $expr; } - /** - * Whether the given position is immediately surrounded by parenthesis. - * - * @param int $startPos Start position - * @param int $endPos End position - * - * @return bool - */ - public function haveParens(int $startPos, int $endPos) : bool + public function getSubNodeNames() : array { - return $this->haveTokenImmediatelyBefore($startPos, '(') && $this->haveTokenImmediatelyAfter($endPos, ')'); + return ['var', 'expr']; } - /** - * Whether the given position is immediately surrounded by braces. - * - * @param int $startPos Start position - * @param int $endPos End position - * - * @return bool - */ - public function haveBraces(int $startPos, int $endPos) : bool + public function getType() : string { - return ($this->haveTokenImmediatelyBefore($startPos, '{') || $this->haveTokenImmediatelyBefore($startPos, \T_CURLY_OPEN)) && $this->haveTokenImmediatelyAfter($endPos, '}'); + return 'Expr_Assign'; } +} +tokens; - $pos--; - for (; $pos >= 0; $pos--) { - $tokenType = $tokens[$pos][0]; - if ($tokenType === $expectedTokenType) { - return \true; - } - if ($tokenType !== \T_WHITESPACE && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { - break; - } - } - return \false; + $this->attributes = $attributes; + $this->var = $var; + $this->expr = $expr; } - /** - * Check whether the position is directly followed by a certain token type. - * - * During this check whitespace and comments are skipped. - * - * @param int $pos Position after which the token should occur - * @param int|string $expectedTokenType Token to check for - * - * @return bool Whether the expected token was found - */ - public function haveTokenImmediatelyAfter(int $pos, $expectedTokenType) : bool + public function getSubNodeNames() : array { - $tokens = $this->tokens; - $pos++; - for (; $pos < \count($tokens); $pos++) { - $tokenType = $tokens[$pos][0]; - if ($tokenType === $expectedTokenType) { - return \true; - } - if ($tokenType !== \T_WHITESPACE && $tokenType !== \T_COMMENT && $tokenType !== \T_DOC_COMMENT) { - break; - } - } - return \false; + return ['var', 'expr']; } - public function skipLeft(int $pos, $skipTokenType) +} +tokens; - $pos = $this->skipLeftWhitespace($pos); - if ($skipTokenType === \T_WHITESPACE) { - return $pos; - } - if ($tokens[$pos][0] !== $skipTokenType) { - // Shouldn't happen. The skip token MUST be there - throw new \Exception('Encountered unexpected token'); - } - $pos--; - return $this->skipLeftWhitespace($pos); + return 'Expr_AssignOp_BitwiseAnd'; } - public function skipRight(int $pos, $skipTokenType) +} +tokens; - $pos = $this->skipRightWhitespace($pos); - if ($skipTokenType === \T_WHITESPACE) { - return $pos; - } - if ($tokens[$pos][0] !== $skipTokenType) { - // Shouldn't happen. The skip token MUST be there - throw new \Exception('Encountered unexpected token'); - } - $pos++; - return $this->skipRightWhitespace($pos); + return 'Expr_AssignOp_BitwiseOr'; } - /** - * Return first non-whitespace token position smaller or equal to passed position. - * - * @param int $pos Token position - * @return int Non-whitespace token position - */ - public function skipLeftWhitespace(int $pos) +} +tokens; - for (; $pos >= 0; $pos--) { - $type = $tokens[$pos][0]; - if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { - break; - } - } - return $pos; + return 'Expr_AssignOp_BitwiseXor'; } - /** - * Return first non-whitespace position greater or equal to passed position. - * - * @param int $pos Token position - * @return int Non-whitespace token position - */ - public function skipRightWhitespace(int $pos) +} +tokens; - for ($count = \count($tokens); $pos < $count; $pos++) { - $type = $tokens[$pos][0]; - if ($type !== \T_WHITESPACE && $type !== \T_COMMENT && $type !== \T_DOC_COMMENT) { - break; - } - } - return $pos; + return 'Expr_AssignOp_Coalesce'; } - public function findRight(int $pos, $findTokenType) +} +tokens; - for ($count = \count($tokens); $pos < $count; $pos++) { - $type = $tokens[$pos][0]; - if ($type === $findTokenType) { - return $pos; - } - } - return -1; + return 'Expr_AssignOp_Concat'; } - /** - * Whether the given position range contains a certain token type. - * - * @param int $startPos Starting position (inclusive) - * @param int $endPos Ending position (exclusive) - * @param int|string $tokenType Token type to look for - * @return bool Whether the token occurs in the given range - */ - public function haveTokenInRange(int $startPos, int $endPos, $tokenType) +} +tokens; - for ($pos = $startPos; $pos < $endPos; $pos++) { - if ($tokens[$pos][0] === $tokenType) { - return \true; - } - } - return \false; + return 'Expr_AssignOp_Div'; } - public function haveBracesInRange(int $startPos, int $endPos) +} +haveTokenInRange($startPos, $endPos, '{') || $this->haveTokenInRange($startPos, $endPos, \T_CURLY_OPEN) || $this->haveTokenInRange($startPos, $endPos, '}'); + return 'Expr_AssignOp_Minus'; } - /** - * Get indentation before token position. - * - * @param int $pos Token position - * - * @return int Indentation depth (in spaces) - */ - public function getIndentationBefore(int $pos) : int +} +indentMap[$pos]; + return 'Expr_AssignOp_Mod'; } - /** - * Get the code corresponding to a token offset range, optionally adjusted for indentation. - * - * @param int $from Token start position (inclusive) - * @param int $to Token end position (exclusive) - * @param int $indent By how much the code should be indented (can be negative as well) - * - * @return string Code corresponding to token range, adjusted for indentation - */ - public function getTokenCode(int $from, int $to, int $indent) : string +} +tokens; - $result = ''; - for ($pos = $from; $pos < $to; $pos++) { - $token = $tokens[$pos]; - if (\is_array($token)) { - $type = $token[0]; - $content = $token[1]; - if ($type === \T_CONSTANT_ENCAPSED_STRING || $type === \T_ENCAPSED_AND_WHITESPACE) { - $result .= $content; - } else { - // TODO Handle non-space indentation - if ($indent < 0) { - $result .= \str_replace("\n" . \str_repeat(" ", -$indent), "\n", $content); - } elseif ($indent > 0) { - $result .= \str_replace("\n", "\n" . \str_repeat(" ", $indent), $content); - } else { - $result .= $content; - } - } - } else { - $result .= $token; - } - } - return $result; + return 'Expr_AssignOp_Mul'; } - /** - * Precalculate the indentation at every token position. - * - * @return int[] Token position to indentation map - */ - private function calcIndentMap() +} +tokens as $token) { - $indentMap[] = $indent; - if ($token[0] === \T_WHITESPACE) { - $content = $token[1]; - $newlinePos = \strrpos($content, "\n"); - if (\false !== $newlinePos) { - $indent = \strlen($content) - $newlinePos - 1; - } - } - } - // Add a sentinel for one past end of the file - $indentMap[] = $indent; - return $indentMap; + return 'Expr_AssignOp_Plus'; } } type = $type; - $this->old = $old; - $this->new = $new; + return 'Expr_AssignOp_Pow'; } } isEqual = $isEqual; + return 'Expr_AssignOp_ShiftLeft'; + } +} +calculateTrace($old, $new); - return $this->extractDiff($trace, $x, $y, $old, $new); + $this->attributes = $attributes; + $this->var = $var; + $this->expr = $expr; + } + public function getSubNodeNames() : array + { + return ['var', 'expr']; + } + public function getType() : string + { + return 'Expr_AssignRef'; } +} +coalesceReplacements($this->diff($old, $new)); + $this->attributes = $attributes; + $this->left = $left; + $this->right = $right; } - private function calculateTrace(array $a, array $b) + public function getSubNodeNames() : array { - $n = \count($a); - $m = \count($b); - $max = $n + $m; - $v = [1 => 0]; - $trace = []; - for ($d = 0; $d <= $max; $d++) { - $trace[] = $v; - for ($k = -$d; $k <= $d; $k += 2) { - if ($k === -$d || $k !== $d && $v[$k - 1] < $v[$k + 1]) { - $x = $v[$k + 1]; - } else { - $x = $v[$k - 1] + 1; - } - $y = $x - $k; - while ($x < $n && $y < $m && ($this->isEqual)($a[$x], $b[$y])) { - $x++; - $y++; - } - $v[$k] = $x; - if ($x >= $n && $y >= $m) { - return [$trace, $x, $y]; - } - } - } - throw new \Exception('Should not happen'); - } - private function extractDiff(array $trace, int $x, int $y, array $a, array $b) - { - $result = []; - for ($d = \count($trace) - 1; $d >= 0; $d--) { - $v = $trace[$d]; - $k = $x - $y; - if ($k === -$d || $k !== $d && $v[$k - 1] < $v[$k + 1]) { - $prevK = $k + 1; - } else { - $prevK = $k - 1; - } - $prevX = $v[$prevK]; - $prevY = $prevX - $prevK; - while ($x > $prevX && $y > $prevY) { - $result[] = new DiffElem(DiffElem::TYPE_KEEP, $a[$x - 1], $b[$y - 1]); - $x--; - $y--; - } - if ($d === 0) { - break; - } - while ($x > $prevX) { - $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $a[$x - 1], null); - $x--; - } - while ($y > $prevY) { - $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $b[$y - 1]); - $y--; - } - } - return \array_reverse($result); + return ['left', 'right']; } /** - * Coalesce equal-length sequences of remove+add into a replace operation. + * Get the operator sigil for this binary operation. * - * @param DiffElem[] $diff - * @return DiffElem[] + * In the case there are multiple possible sigils for an operator, this method does not + * necessarily return the one used in the parsed code. + * + * @return string */ - private function coalesceReplacements(array $diff) - { - $newDiff = []; - $c = \count($diff); - for ($i = 0; $i < $c; $i++) { - $diffType = $diff[$i]->type; - if ($diffType !== DiffElem::TYPE_REMOVE) { - $newDiff[] = $diff[$i]; - continue; - } - $j = $i; - while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { - $j++; - } - $k = $j; - while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { - $k++; - } - if ($j - $i === $k - $j) { - $len = $j - $i; - for ($n = 0; $n < $len; $n++) { - $newDiff[] = new DiffElem(DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new); - } - } else { - for (; $i < $k; $i++) { - $newDiff[] = $diff[$i]; - } - } - $i = $k - 1; - } - return $newDiff; - } + public abstract function getOperatorSigil() : string; } attrGroups = $attrGroups; - $this->args = $args; - $this->extends = $extends; - $this->implements = $implements; - $this->stmts = $stmts; + return '&'; } - public static function fromNewNode(Expr\New_ $newNode) + public function getType() : string { - $class = $newNode->class; - \assert($class instanceof Node\Stmt\Class_); - // We don't assert that $class->name is null here, to allow consumers to assign unique names - // to anonymous classes for their own purposes. We simplify ignore the name here. - return new self($class->attrGroups, $newNode->args, $class->extends, $class->implements, $class->stmts, $newNode->getAttributes()); + return 'Expr_BinaryOp_BitwiseAnd'; } - public function getType() : string +} + [0, 1], - Expr\BitwiseNot::class => [10, 1], - Expr\PreInc::class => [10, 1], - Expr\PreDec::class => [10, 1], - Expr\PostInc::class => [10, -1], - Expr\PostDec::class => [10, -1], - Expr\UnaryPlus::class => [10, 1], - Expr\UnaryMinus::class => [10, 1], - Cast\Int_::class => [10, 1], - Cast\Double::class => [10, 1], - Cast\String_::class => [10, 1], - Cast\Array_::class => [10, 1], - Cast\Object_::class => [10, 1], - Cast\Bool_::class => [10, 1], - Cast\Unset_::class => [10, 1], - Expr\ErrorSuppress::class => [10, 1], - Expr\Instanceof_::class => [20, 0], - Expr\BooleanNot::class => [30, 1], - BinaryOp\Mul::class => [40, -1], - BinaryOp\Div::class => [40, -1], - BinaryOp\Mod::class => [40, -1], - BinaryOp\Plus::class => [50, -1], - BinaryOp\Minus::class => [50, -1], - BinaryOp\Concat::class => [50, -1], - BinaryOp\ShiftLeft::class => [60, -1], - BinaryOp\ShiftRight::class => [60, -1], - BinaryOp\Smaller::class => [70, 0], - BinaryOp\SmallerOrEqual::class => [70, 0], - BinaryOp\Greater::class => [70, 0], - BinaryOp\GreaterOrEqual::class => [70, 0], - BinaryOp\Equal::class => [80, 0], - BinaryOp\NotEqual::class => [80, 0], - BinaryOp\Identical::class => [80, 0], - BinaryOp\NotIdentical::class => [80, 0], - BinaryOp\Spaceship::class => [80, 0], - BinaryOp\BitwiseAnd::class => [90, -1], - BinaryOp\BitwiseXor::class => [100, -1], - BinaryOp\BitwiseOr::class => [110, -1], - BinaryOp\BooleanAnd::class => [120, -1], - BinaryOp\BooleanOr::class => [130, -1], - BinaryOp\Coalesce::class => [140, 1], - Expr\Ternary::class => [150, 0], - // parser uses %left for assignments, but they really behave as %right - Expr\Assign::class => [160, 1], - Expr\AssignRef::class => [160, 1], - AssignOp\Plus::class => [160, 1], - AssignOp\Minus::class => [160, 1], - AssignOp\Mul::class => [160, 1], - AssignOp\Div::class => [160, 1], - AssignOp\Concat::class => [160, 1], - AssignOp\Mod::class => [160, 1], - AssignOp\BitwiseAnd::class => [160, 1], - AssignOp\BitwiseOr::class => [160, 1], - AssignOp\BitwiseXor::class => [160, 1], - AssignOp\ShiftLeft::class => [160, 1], - AssignOp\ShiftRight::class => [160, 1], - AssignOp\Pow::class => [160, 1], - AssignOp\Coalesce::class => [160, 1], - Expr\YieldFrom::class => [165, 1], - Expr\Print_::class => [168, 1], - BinaryOp\LogicalAnd::class => [170, -1], - BinaryOp\LogicalXor::class => [180, -1], - BinaryOp\LogicalOr::class => [190, -1], - Expr\Include_::class => [200, -1], - ]; - /** @var int Current indentation level. */ - protected $indentLevel; - /** @var string Newline including current indentation. */ - protected $nl; - /** @var string Token placed at end of doc string to ensure it is followed by a newline. */ - protected $docStringEndToken; - /** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) */ - protected $canUseSemicolonNamespaces; - /** @var array Pretty printer options */ - protected $options; - /** @var TokenStream Original tokens for use in format-preserving pretty print */ - protected $origTokens; - /** @var Internal\Differ Differ for node lists */ - protected $nodeListDiffer; - /** @var bool[] Map determining whether a certain character is a label character */ - protected $labelCharMap; - /** - * @var int[][] Map from token classes and subnode names to FIXUP_* constants. This is used - * during format-preserving prints to place additional parens/braces if necessary. - */ - protected $fixupMap; - /** - * @var int[][] Map from "{$node->getType()}->{$subNode}" to ['left' => $l, 'right' => $r], - * where $l and $r specify the token type that needs to be stripped when removing - * this node. - */ - protected $removalMap; - /** - * @var mixed[] Map from "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight]. - * $find is an optional token after which the insertion occurs. $extraLeft/Right - * are optionally added before/after the main insertions. - */ - protected $insertionMap; - /** - * @var string[] Map From "{$node->getType()}->{$subNode}" to string that should be inserted - * between elements of this list subnode. - */ - protected $listInsertionMap; - protected $emptyListInsertionMap; - /** @var int[] Map from "{$node->getType()}->{$subNode}" to token before which the modifiers - * should be reprinted. */ - protected $modifierChangeMap; - /** - * Creates a pretty printer instance using the given options. - * - * Supported options: - * * bool $shortArraySyntax = false: Whether to use [] instead of array() as the default array - * syntax, if the node does not specify a format. - * - * @param array $options Dictionary of formatting options - */ - public function __construct(array $options = []) + public function getOperatorSigil() : string { - $this->docStringEndToken = '_DOC_STRING_END_' . \mt_rand(); - $defaultOptions = ['shortArraySyntax' => \false]; - $this->options = $options + $defaultOptions; + return '^'; } - /** - * Reset pretty printing state. - */ - protected function resetState() + public function getType() : string { - $this->indentLevel = 0; - $this->nl = "\n"; - $this->origTokens = null; + return 'Expr_BinaryOp_BitwiseXor'; } - /** - * Set indentation level - * - * @param int $level Level in number of spaces - */ - protected function setIndentLevel(int $level) +} +indentLevel = $level; - $this->nl = "\n" . \str_repeat(' ', $level); + return '&&'; } - /** - * Increase indentation level. - */ - protected function indent() + public function getType() : string { - $this->indentLevel += 4; - $this->nl .= ' '; + return 'Expr_BinaryOp_BooleanAnd'; } - /** - * Decrease indentation level. - */ - protected function outdent() +} +indentLevel >= 4); - $this->indentLevel -= 4; - $this->nl = "\n" . \str_repeat(' ', $this->indentLevel); + return '||'; } - /** - * Pretty prints an array of statements. - * - * @param Node[] $stmts Array of statements - * - * @return string Pretty printed statements - */ - public function prettyPrint(array $stmts) : string + public function getType() : string { - $this->resetState(); - $this->preprocessNodes($stmts); - return \ltrim($this->handleMagicTokens($this->pStmts($stmts, \false))); + return 'Expr_BinaryOp_BooleanOr'; } - /** - * Pretty prints an expression. - * - * @param Expr $node Expression node - * - * @return string Pretty printed node - */ - public function prettyPrintExpr(Expr $node) : string +} +resetState(); - return $this->handleMagicTokens($this->p($node)); + return '??'; } - /** - * Pretty prints a file of statements (includes the opening prettyPrint($stmts); - if ($stmts[0] instanceof Stmt\InlineHTML) { - $p = \preg_replace('/^<\\?php\\s+\\?>\\n?/', '', $p); - } - if ($stmts[\count($stmts) - 1] instanceof Stmt\InlineHTML) { - $p = \preg_replace('/<\\?php$/', '', \rtrim($p)); - } - return $p; + return 'Expr_BinaryOp_Coalesce'; } - /** - * Preprocesses the top-level nodes to initialize pretty printer state. - * - * @param Node[] $nodes Array of nodes - */ - protected function preprocessNodes(array $nodes) +} +canUseSemicolonNamespaces = \true; - foreach ($nodes as $node) { - if ($node instanceof Stmt\Namespace_ && null === $node->name) { - $this->canUseSemicolonNamespaces = \false; - break; - } - } + return '.'; } - /** - * Handles (and removes) no-indent and doc-string-end tokens. - * - * @param string $str - * @return string - */ - protected function handleMagicTokens(string $str) : string + public function getType() : string { - // Replace doc-string-end tokens with nothing or a newline - $str = \str_replace($this->docStringEndToken . ";\n", ";\n", $str); - $str = \str_replace($this->docStringEndToken, "\n", $str); - return $str; + return 'Expr_BinaryOp_Concat'; } - /** - * Pretty prints an array of nodes (statements) and indents them optionally. - * - * @param Node[] $nodes Array of nodes - * @param bool $indent Whether to indent the printed nodes - * - * @return string Pretty printed statements - */ - protected function pStmts(array $nodes, bool $indent = \true) : string +} +indent(); - } - $result = ''; - foreach ($nodes as $node) { - $comments = $node->getComments(); - if ($comments) { - $result .= $this->nl . $this->pComments($comments); - if ($node instanceof Stmt\Nop) { - continue; - } - } - $result .= $this->nl . $this->p($node); - } - if ($indent) { - $this->outdent(); - } - return $result; + return '/'; } - /** - * Pretty-print an infix operation while taking precedence into account. - * - * @param string $class Node class of operator - * @param Node $leftNode Left-hand side node - * @param string $operatorString String representation of the operator - * @param Node $rightNode Right-hand side node - * - * @return string Pretty printed infix operation - */ - protected function pInfixOp(string $class, Node $leftNode, string $operatorString, Node $rightNode) : string + public function getType() : string { - list($precedence, $associativity) = $this->precedenceMap[$class]; - return $this->pPrec($leftNode, $precedence, $associativity, -1) . $operatorString . $this->pPrec($rightNode, $precedence, $associativity, 1); + return 'Expr_BinaryOp_Div'; } - /** - * Pretty-print a prefix operation while taking precedence into account. - * - * @param string $class Node class of operator - * @param string $operatorString String representation of the operator - * @param Node $node Node - * - * @return string Pretty printed prefix operation - */ - protected function pPrefixOp(string $class, string $operatorString, Node $node) : string +} +precedenceMap[$class]; - return $operatorString . $this->pPrec($node, $precedence, $associativity, 1); + return '=='; } - /** - * Pretty-print a postfix operation while taking precedence into account. - * - * @param string $class Node class of operator - * @param string $operatorString String representation of the operator - * @param Node $node Node - * - * @return string Pretty printed postfix operation - */ - protected function pPostfixOp(string $class, Node $node, string $operatorString) : string + public function getType() : string { - list($precedence, $associativity) = $this->precedenceMap[$class]; - return $this->pPrec($node, $precedence, $associativity, -1) . $operatorString; + return 'Expr_BinaryOp_Equal'; } - /** - * Prints an expression node with the least amount of parentheses necessary to preserve the meaning. - * - * @param Node $node Node to pretty print - * @param int $parentPrecedence Precedence of the parent operator - * @param int $parentAssociativity Associativity of parent operator - * (-1 is left, 0 is nonassoc, 1 is right) - * @param int $childPosition Position of the node relative to the operator - * (-1 is left, 1 is right) - * - * @return string The pretty printed node - */ - protected function pPrec(Node $node, int $parentPrecedence, int $parentAssociativity, int $childPosition) : string +} +precedenceMap[$class])) { - $childPrecedence = $this->precedenceMap[$class][0]; - if ($childPrecedence > $parentPrecedence || $parentPrecedence === $childPrecedence && $parentAssociativity !== $childPosition) { - return '(' . $this->p($node) . ')'; - } - } - return $this->p($node); + return '>'; + } + public function getType() : string + { + return 'Expr_BinaryOp_Greater'; + } +} +='; + } + public function getType() : string + { + return 'Expr_BinaryOp_GreaterOrEqual'; + } +} +>'; + } + public function getType() : string + { + return 'Expr_BinaryOp_ShiftRight'; + } +} +'; + } + public function getType() : string + { + return 'Expr_BinaryOp_Spaceship'; } +} +p($node); - } - } - return \implode($glue, $pNodes); + $this->attributes = $attributes; + $this->expr = $expr; + } + public function getSubNodeNames() : array + { + return ['expr']; + } + public function getType() : string + { + return 'Expr_BitwiseNot'; } +} +pImplode($nodes, ', '); + $this->attributes = $attributes; + $this->expr = $expr; + } + public function getSubNodeNames() : array + { + return ['expr']; + } + public function getType() : string + { + return 'Expr_BooleanNot'; } +} + */ - protected function pCommaSeparatedMultiline(array $nodes, bool $trailingComma) : string + public abstract function getRawArgs() : array; + /** + * Returns whether this call expression is actually a first class callable. + */ + public function isFirstClassCallable() : bool { - $this->indent(); - $result = ''; - $lastIdx = \count($nodes) - 1; - foreach ($nodes as $idx => $node) { - if ($node !== null) { - $comments = $node->getComments(); - if ($comments) { - $result .= $this->nl . $this->pComments($comments); - } - $result .= $this->nl . $this->p($node); - } else { - $result .= $this->nl; - } - if ($trailingComma || $idx !== $lastIdx) { - $result .= ','; + foreach ($this->getRawArgs() as $arg) { + if ($arg instanceof VariadicPlaceholder) { + return \true; } } - $this->outdent(); - return $result; + return \false; } /** - * Prints reformatted text of the passed comments. - * - * @param Comment[] $comments List of comments + * Assert that this is not a first-class callable and return only ordinary Args. * - * @return string Reformatted text of comments + * @return Arg[] */ - protected function pComments(array $comments) : string + public function getArgs() : array { - $formattedComments = []; - foreach ($comments as $comment) { - $formattedComments[] = \str_replace("\n", $this->nl, $comment->getReformattedText()); - } - return \implode($this->nl, $formattedComments); + \assert(!$this->isFirstClassCallable()); + return $this->getRawArgs(); } +} +attributes = $attributes; + $this->expr = $expr; + } + public function getSubNodeNames() : array + { + return ['expr']; + } +} +initializeNodeListDiffer(); - $this->initializeLabelCharMap(); - $this->initializeFixupMap(); - $this->initializeRemovalMap(); - $this->initializeInsertionMap(); - $this->initializeListInsertionMap(); - $this->initializeEmptyListInsertionMap(); - $this->initializeModifierChangeMap(); - $this->resetState(); - $this->origTokens = new TokenStream($origTokens); - $this->preprocessNodes($stmts); - $pos = 0; - $result = $this->pArray($stmts, $origStmts, $pos, 0, 'File', 'stmts', null); - if (null !== $result) { - $result .= $this->origTokens->getTokenCode($pos, \count($origTokens), 0); - } else { - // Fallback - // TODO Add pStmts($stmts, \false); - } - return \ltrim($this->handleMagicTokens($result)); + $this->attributes = $attributes; + $this->class = $class; + $this->name = \is_string($name) ? new Identifier($name) : $name; } - protected function pFallback(Node $node) + public function getSubNodeNames() : array { - return $this->{'p' . $node->getType()}($node); + return ['class', 'name']; } + public function getType() : string + { + return 'Expr_ClassConstFetch'; + } +} +attributes = $attributes; + $this->expr = $expr; + } + public function getSubNodeNames() : array + { + return ['expr']; + } + public function getType() : string + { + return 'Expr_Clone'; + } +} + false : Whether the closure is static + * 'byRef' => false : Whether to return by reference + * 'params' => array(): Parameters + * 'uses' => array(): use()s + * 'returnType' => null : Return type + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attributes groups + * @param array $attributes Additional attributes + */ + public function __construct(array $subNodes = [], array $attributes = []) + { + $this->attributes = $attributes; + $this->static = $subNodes['static'] ?? \false; + $this->byRef = $subNodes['byRef'] ?? \false; + $this->params = $subNodes['params'] ?? []; + $this->uses = $subNodes['uses'] ?? []; + $returnType = $subNodes['returnType'] ?? null; + $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->stmts = $subNodes['stmts'] ?? []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + } + public function getSubNodeNames() : array + { + return ['attrGroups', 'static', 'byRef', 'params', 'uses', 'returnType', 'stmts']; + } + public function returnsByRef() : bool + { + return $this->byRef; + } + public function getParams() : array + { + return $this->params; + } + public function getReturnType() + { + return $this->returnType; + } + /** @return Node\Stmt[] */ + public function getStmts() : array + { + return $this->stmts; + } + public function getAttrGroups() : array + { + return $this->attrGroups; + } + public function getType() : string + { + return 'Expr_Closure'; + } +} +origTokens) { - return $this->{'p' . $node->getType()}($node); - } - /** @var Node $origNode */ - $origNode = $node->getAttribute('origNode'); - if (null === $origNode) { - return $this->pFallback($node); - } - $class = \get_class($node); - \assert($class === \get_class($origNode)); - $startPos = $origNode->getStartTokenPos(); - $endPos = $origNode->getEndTokenPos(); - \assert($startPos >= 0 && $endPos >= 0); - $fallbackNode = $node; - if ($node instanceof Expr\New_ && $node->class instanceof Stmt\Class_) { - // Normalize node structure of anonymous classes - $node = PrintableNewAnonClassNode::fromNewNode($node); - $origNode = PrintableNewAnonClassNode::fromNewNode($origNode); - } - // InlineHTML node does not contain closing and opening PHP tags. If the parent formatting - // is not preserved, then we need to use the fallback code to make sure the tags are - // printed. - if ($node instanceof Stmt\InlineHTML && !$parentFormatPreserved) { - return $this->pFallback($fallbackNode); - } - $indentAdjustment = $this->indentLevel - $this->origTokens->getIndentationBefore($startPos); - $type = $node->getType(); - $fixupInfo = $this->fixupMap[$class] ?? null; - $result = ''; - $pos = $startPos; - foreach ($node->getSubNodeNames() as $subNodeName) { - $subNode = $node->{$subNodeName}; - $origSubNode = $origNode->{$subNodeName}; - if (!$subNode instanceof Node && $subNode !== null || !$origSubNode instanceof Node && $origSubNode !== null) { - if ($subNode === $origSubNode) { - // Unchanged, can reuse old code - continue; - } - if (\is_array($subNode) && \is_array($origSubNode)) { - // Array subnode changed, we might be able to reconstruct it - $listResult = $this->pArray($subNode, $origSubNode, $pos, $indentAdjustment, $type, $subNodeName, $fixupInfo[$subNodeName] ?? null); - if (null === $listResult) { - return $this->pFallback($fallbackNode); - } - $result .= $listResult; - continue; - } - if (\is_int($subNode) && \is_int($origSubNode)) { - // Check if this is a modifier change - $key = $type . '->' . $subNodeName; - if (!isset($this->modifierChangeMap[$key])) { - return $this->pFallback($fallbackNode); - } - $findToken = $this->modifierChangeMap[$key]; - $result .= $this->pModifiers($subNode); - $pos = $this->origTokens->findRight($pos, $findToken); - continue; - } - // If a non-node, non-array subnode changed, we don't be able to do a partial - // reconstructions, as we don't have enough offset information. Pretty print the - // whole node instead. - return $this->pFallback($fallbackNode); - } - $extraLeft = ''; - $extraRight = ''; - if ($origSubNode !== null) { - $subStartPos = $origSubNode->getStartTokenPos(); - $subEndPos = $origSubNode->getEndTokenPos(); - \assert($subStartPos >= 0 && $subEndPos >= 0); - } else { - if ($subNode === null) { - // Both null, nothing to do - continue; - } - // A node has been inserted, check if we have insertion information for it - $key = $type . '->' . $subNodeName; - if (!isset($this->insertionMap[$key])) { - return $this->pFallback($fallbackNode); - } - list($findToken, $beforeToken, $extraLeft, $extraRight) = $this->insertionMap[$key]; - if (null !== $findToken) { - $subStartPos = $this->origTokens->findRight($pos, $findToken) + (int) (!$beforeToken); - } else { - $subStartPos = $pos; - } - if (null === $extraLeft && null !== $extraRight) { - // If inserting on the right only, skipping whitespace looks better - $subStartPos = $this->origTokens->skipRightWhitespace($subStartPos); - } - $subEndPos = $subStartPos - 1; - } - if (null === $subNode) { - // A node has been removed, check if we have removal information for it - $key = $type . '->' . $subNodeName; - if (!isset($this->removalMap[$key])) { - return $this->pFallback($fallbackNode); - } - // Adjust positions to account for additional tokens that must be skipped - $removalInfo = $this->removalMap[$key]; - if (isset($removalInfo['left'])) { - $subStartPos = $this->origTokens->skipLeft($subStartPos - 1, $removalInfo['left']) + 1; - } - if (isset($removalInfo['right'])) { - $subEndPos = $this->origTokens->skipRight($subEndPos + 1, $removalInfo['right']) - 1; - } - } - $result .= $this->origTokens->getTokenCode($pos, $subStartPos, $indentAdjustment); - if (null !== $subNode) { - $result .= $extraLeft; - $origIndentLevel = $this->indentLevel; - $this->setIndentLevel($this->origTokens->getIndentationBefore($subStartPos) + $indentAdjustment); - // If it's the same node that was previously in this position, it certainly doesn't - // need fixup. It's important to check this here, because our fixup checks are more - // conservative than strictly necessary. - if (isset($fixupInfo[$subNodeName]) && $subNode->getAttribute('origNode') !== $origSubNode) { - $fixup = $fixupInfo[$subNodeName]; - $res = $this->pFixup($fixup, $subNode, $class, $subStartPos, $subEndPos); - } else { - $res = $this->p($subNode, \true); - } - $this->safeAppend($result, $res); - $this->setIndentLevel($origIndentLevel); - $result .= $extraRight; - } - $pos = $subEndPos + 1; - } - $result .= $this->origTokens->getTokenCode($pos, $endPos + 1, $indentAdjustment); - return $result; + $this->attributes = $attributes; + $this->var = $var; + $this->byRef = $byRef; + } + public function getSubNodeNames() : array + { + return ['var', 'byRef']; + } + public function getType() : string + { + return 'Expr_ClosureUse'; } +} +attributes = $attributes; + $this->name = $name; + } + public function getSubNodeNames() : array + { + return ['name']; + } + public function getType() : string + { + return 'Expr_ConstFetch'; + } +} +nodeListDiffer->diffWithReplacements($origNodes, $nodes); - $mapKey = $parentNodeType . '->' . $subNodeName; - $insertStr = $this->listInsertionMap[$mapKey] ?? null; - $isStmtList = $subNodeName === 'stmts'; - $beforeFirstKeepOrReplace = \true; - $skipRemovedNode = \false; - $delayedAdd = []; - $lastElemIndentLevel = $this->indentLevel; - $insertNewline = \false; - if ($insertStr === "\n") { - $insertStr = ''; - $insertNewline = \true; - } - if ($isStmtList && \count($origNodes) === 1 && \count($nodes) !== 1) { - $startPos = $origNodes[0]->getStartTokenPos(); - $endPos = $origNodes[0]->getEndTokenPos(); - \assert($startPos >= 0 && $endPos >= 0); - if (!$this->origTokens->haveBraces($startPos, $endPos)) { - // This was a single statement without braces, but either additional statements - // have been added, or the single statement has been removed. This requires the - // addition of braces. For now fall back. - // TODO: Try to preserve formatting - return null; - } - } - $result = ''; - foreach ($diff as $i => $diffElem) { - $diffType = $diffElem->type; - /** @var Node|null $arrItem */ - $arrItem = $diffElem->new; - /** @var Node|null $origArrItem */ - $origArrItem = $diffElem->old; - if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { - $beforeFirstKeepOrReplace = \false; - if ($origArrItem === null || $arrItem === null) { - // We can only handle the case where both are null - if ($origArrItem === $arrItem) { - continue; - } - return null; - } - if (!$arrItem instanceof Node || !$origArrItem instanceof Node) { - // We can only deal with nodes. This can occur for Names, which use string arrays. - return null; - } - $itemStartPos = $origArrItem->getStartTokenPos(); - $itemEndPos = $origArrItem->getEndTokenPos(); - \assert($itemStartPos >= 0 && $itemEndPos >= 0 && $itemStartPos >= $pos); - $origIndentLevel = $this->indentLevel; - $lastElemIndentLevel = $this->origTokens->getIndentationBefore($itemStartPos) + $indentAdjustment; - $this->setIndentLevel($lastElemIndentLevel); - $comments = $arrItem->getComments(); - $origComments = $origArrItem->getComments(); - $commentStartPos = $origComments ? $origComments[0]->getStartTokenPos() : $itemStartPos; - \assert($commentStartPos >= 0); - if ($commentStartPos < $pos) { - // Comments may be assigned to multiple nodes if they start at the same position. - // Make sure we don't try to print them multiple times. - $commentStartPos = $itemStartPos; - } - if ($skipRemovedNode) { - if ($isStmtList && $this->origTokens->haveBracesInRange($pos, $itemStartPos)) { - // We'd remove the brace of a code block. - // TODO: Preserve formatting. - $this->setIndentLevel($origIndentLevel); - return null; - } - } else { - $result .= $this->origTokens->getTokenCode($pos, $commentStartPos, $indentAdjustment); - } - if (!empty($delayedAdd)) { - /** @var Node $delayedAddNode */ - foreach ($delayedAdd as $delayedAddNode) { - if ($insertNewline) { - $delayedAddComments = $delayedAddNode->getComments(); - if ($delayedAddComments) { - $result .= $this->pComments($delayedAddComments) . $this->nl; - } - } - $this->safeAppend($result, $this->p($delayedAddNode, \true)); - if ($insertNewline) { - $result .= $insertStr . $this->nl; - } else { - $result .= $insertStr; - } - } - $delayedAdd = []; - } - if ($comments !== $origComments) { - if ($comments) { - $result .= $this->pComments($comments) . $this->nl; - } - } else { - $result .= $this->origTokens->getTokenCode($commentStartPos, $itemStartPos, $indentAdjustment); - } - // If we had to remove anything, we have done so now. - $skipRemovedNode = \false; - } elseif ($diffType === DiffElem::TYPE_ADD) { - if (null === $insertStr) { - // We don't have insertion information for this list type - return null; - } - // We go multiline if the original code was multiline, - // or if it's an array item with a comment above it. - if ($insertStr === ', ' && ($this->isMultiline($origNodes) || $arrItem->getComments())) { - $insertStr = ','; - $insertNewline = \true; - } - if ($beforeFirstKeepOrReplace) { - // Will be inserted at the next "replace" or "keep" element - $delayedAdd[] = $arrItem; - continue; - } - $itemStartPos = $pos; - $itemEndPos = $pos - 1; - $origIndentLevel = $this->indentLevel; - $this->setIndentLevel($lastElemIndentLevel); - if ($insertNewline) { - $result .= $insertStr . $this->nl; - $comments = $arrItem->getComments(); - if ($comments) { - $result .= $this->pComments($comments) . $this->nl; - } - } else { - $result .= $insertStr; - } - } elseif ($diffType === DiffElem::TYPE_REMOVE) { - if (!$origArrItem instanceof Node) { - // We only support removal for nodes - return null; - } - $itemStartPos = $origArrItem->getStartTokenPos(); - $itemEndPos = $origArrItem->getEndTokenPos(); - \assert($itemStartPos >= 0 && $itemEndPos >= 0); - // Consider comments part of the node. - $origComments = $origArrItem->getComments(); - if ($origComments) { - $itemStartPos = $origComments[0]->getStartTokenPos(); - } - if ($i === 0) { - // If we're removing from the start, keep the tokens before the node and drop those after it, - // instead of the other way around. - $result .= $this->origTokens->getTokenCode($pos, $itemStartPos, $indentAdjustment); - $skipRemovedNode = \true; - } else { - if ($isStmtList && $this->origTokens->haveBracesInRange($pos, $itemStartPos)) { - // We'd remove the brace of a code block. - // TODO: Preserve formatting. - return null; - } - } - $pos = $itemEndPos + 1; - continue; - } else { - throw new \Exception("Shouldn't happen"); - } - if (null !== $fixup && $arrItem->getAttribute('origNode') !== $origArrItem) { - $res = $this->pFixup($fixup, $arrItem, null, $itemStartPos, $itemEndPos); - } else { - $res = $this->p($arrItem, \true); - } - $this->safeAppend($result, $res); - $this->setIndentLevel($origIndentLevel); - $pos = $itemEndPos + 1; - } - if ($skipRemovedNode) { - // TODO: Support removing single node. - return null; - } - if (!empty($delayedAdd)) { - if (!isset($this->emptyListInsertionMap[$mapKey])) { - return null; - } - list($findToken, $extraLeft, $extraRight) = $this->emptyListInsertionMap[$mapKey]; - if (null !== $findToken) { - $insertPos = $this->origTokens->findRight($pos, $findToken) + 1; - $result .= $this->origTokens->getTokenCode($pos, $insertPos, $indentAdjustment); - $pos = $insertPos; - } - $first = \true; - $result .= $extraLeft; - foreach ($delayedAdd as $delayedAddNode) { - if (!$first) { - $result .= $insertStr; - } - $result .= $this->p($delayedAddNode, \true); - $first = \false; - } - $result .= $extraRight; - } - return $result; + $this->attributes = $attributes; + $this->expr = $expr; } - /** - * Print node with fixups. - * - * Fixups here refer to the addition of extra parentheses, braces or other characters, that - * are required to preserve program semantics in a certain context (e.g. to maintain precedence - * or because only certain expressions are allowed in certain places). - * - * @param int $fixup Fixup type - * @param Node $subNode Subnode to print - * @param string|null $parentClass Class of parent node - * @param int $subStartPos Original start pos of subnode - * @param int $subEndPos Original end pos of subnode - * - * @return string Result of fixed-up print of subnode - */ - protected function pFixup(int $fixup, Node $subNode, $parentClass, int $subStartPos, int $subEndPos) : string + public function getSubNodeNames() : array { - switch ($fixup) { - case self::FIXUP_PREC_LEFT: - case self::FIXUP_PREC_RIGHT: - if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { - list($precedence, $associativity) = $this->precedenceMap[$parentClass]; - return $this->pPrec($subNode, $precedence, $associativity, $fixup === self::FIXUP_PREC_LEFT ? -1 : 1); - } - break; - case self::FIXUP_CALL_LHS: - if ($this->callLhsRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos)) { - return '(' . $this->p($subNode) . ')'; - } - break; - case self::FIXUP_DEREF_LHS: - if ($this->dereferenceLhsRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos)) { - return '(' . $this->p($subNode) . ')'; - } - break; - case self::FIXUP_BRACED_NAME: - case self::FIXUP_VAR_BRACED_NAME: - if ($subNode instanceof Expr && !$this->origTokens->haveBraces($subStartPos, $subEndPos)) { - return ($fixup === self::FIXUP_VAR_BRACED_NAME ? '$' : '') . '{' . $this->p($subNode) . '}'; - } - break; - case self::FIXUP_ENCAPSED: - if (!$subNode instanceof Scalar\EncapsedStringPart && !$this->origTokens->haveBraces($subStartPos, $subEndPos)) { - return '{' . $this->p($subNode) . '}'; - } - break; - default: - throw new \Exception('Cannot happen'); - } - // Nothing special to do - return $this->p($subNode); + return ['expr']; } - /** - * Appends to a string, ensuring whitespace between label characters. - * - * Example: "echo" and "$x" result in "echo$x", but "echo" and "x" result in "echo x". - * Without safeAppend the result would be "echox", which does not preserve semantics. - * - * @param string $str - * @param string $append - */ - protected function safeAppend(string &$str, string $append) + public function getType() : string { - if ($str === "") { - $str = $append; - return; - } - if ($append === "") { - return; - } - if (!$this->labelCharMap[$append[0]] || !$this->labelCharMap[$str[\strlen($str) - 1]]) { - $str .= $append; - } else { - $str .= " " . $append; - } + return 'Expr_Empty'; } +} +attributes = $attributes; } - /** - * Determines whether the LHS of a dereferencing operation must be wrapped in parenthesis. - * - * @param Node $node LHS of dereferencing operation - * - * @return bool Whether parentheses are required - */ - protected function dereferenceLhsRequiresParens(Node $node) : bool + public function getSubNodeNames() : array { - return !($node instanceof Expr\Variable || $node instanceof Node\Name || $node instanceof Expr\ArrayDimFetch || $node instanceof Expr\PropertyFetch || $node instanceof Expr\NullsafePropertyFetch || $node instanceof Expr\StaticPropertyFetch || $node instanceof Expr\FuncCall || $node instanceof Expr\MethodCall || $node instanceof Expr\NullsafeMethodCall || $node instanceof Expr\StaticCall || $node instanceof Expr\Array_ || $node instanceof Scalar\String_ || $node instanceof Expr\ConstFetch || $node instanceof Expr\ClassConstFetch); + return []; } - /** - * Print modifiers, including trailing whitespace. - * - * @param int $modifiers Modifier mask to print - * - * @return string Printed modifiers - */ - protected function pModifiers(int $modifiers) + public function getType() : string { - return ($modifiers & Stmt\Class_::MODIFIER_PUBLIC ? 'public ' : '') . ($modifiers & Stmt\Class_::MODIFIER_PROTECTED ? 'protected ' : '') . ($modifiers & Stmt\Class_::MODIFIER_PRIVATE ? 'private ' : '') . ($modifiers & Stmt\Class_::MODIFIER_STATIC ? 'static ' : '') . ($modifiers & Stmt\Class_::MODIFIER_ABSTRACT ? 'abstract ' : '') . ($modifiers & Stmt\Class_::MODIFIER_FINAL ? 'final ' : '') . ($modifiers & Stmt\Class_::MODIFIER_READONLY ? 'readonly ' : ''); + return 'Expr_Error'; } +} +getEndTokenPos() + 1; - if ($pos >= 0) { - $text = $this->origTokens->getTokenCode($pos, $endPos, 0); - if (\false === \strpos($text, "\n")) { - // We require that a newline is present between *every* item. If the formatting - // is inconsistent, with only some items having newlines, we don't consider it - // as multiline - return \false; - } - } - $pos = $endPos; - } - return \true; + $this->attributes = $attributes; + $this->expr = $expr; } - /** - * Lazily initializes label char map. - * - * The label char map determines whether a certain character may occur in a label. - */ - protected function initializeLabelCharMap() + public function getSubNodeNames() : array { - if ($this->labelCharMap) { - return; - } - $this->labelCharMap = []; - for ($i = 0; $i < 256; $i++) { - // Since PHP 7.1 The lower range is 0x80. However, we also want to support code for - // older versions. - $chr = \chr($i); - $this->labelCharMap[$chr] = $i >= 0x7f || \ctype_alnum($chr); - } + return ['expr']; + } + public function getType() : string + { + return 'Expr_ErrorSuppress'; } +} +nodeListDiffer) { - return; - } - $this->nodeListDiffer = new Internal\Differ(function ($a, $b) { - if ($a instanceof Node && $b instanceof Node) { - return $a === $b->getAttribute('origNode'); - } - // Can happen for array destructuring - return $a === null && $b === null; - }); + $this->attributes = $attributes; + $this->expr = $expr; + } + public function getSubNodeNames() : array + { + return ['expr']; } + public function getType() : string + { + return 'Expr_Eval'; + } +} +fixupMap) { - return; - } - $this->fixupMap = [ - Expr\PreInc::class => ['var' => self::FIXUP_PREC_RIGHT], - Expr\PreDec::class => ['var' => self::FIXUP_PREC_RIGHT], - Expr\PostInc::class => ['var' => self::FIXUP_PREC_LEFT], - Expr\PostDec::class => ['var' => self::FIXUP_PREC_LEFT], - Expr\Instanceof_::class => ['expr' => self::FIXUP_PREC_LEFT, 'class' => self::FIXUP_PREC_RIGHT], - Expr\Ternary::class => ['cond' => self::FIXUP_PREC_LEFT, 'else' => self::FIXUP_PREC_RIGHT], - Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS], - Expr\StaticCall::class => ['class' => self::FIXUP_DEREF_LHS], - Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS], - Expr\ClassConstFetch::class => ['var' => self::FIXUP_DEREF_LHS], - Expr\New_::class => ['class' => self::FIXUP_DEREF_LHS], - // TODO: FIXUP_NEW_VARIABLE - Expr\MethodCall::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], - Expr\NullsafeMethodCall::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], - Expr\StaticPropertyFetch::class => ['class' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_VAR_BRACED_NAME], - Expr\PropertyFetch::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], - Expr\NullsafePropertyFetch::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], - Scalar\Encapsed::class => ['parts' => self::FIXUP_ENCAPSED], - ]; - $binaryOps = [BinaryOp\Pow::class, BinaryOp\Mul::class, BinaryOp\Div::class, BinaryOp\Mod::class, BinaryOp\Plus::class, BinaryOp\Minus::class, BinaryOp\Concat::class, BinaryOp\ShiftLeft::class, BinaryOp\ShiftRight::class, BinaryOp\Smaller::class, BinaryOp\SmallerOrEqual::class, BinaryOp\Greater::class, BinaryOp\GreaterOrEqual::class, BinaryOp\Equal::class, BinaryOp\NotEqual::class, BinaryOp\Identical::class, BinaryOp\NotIdentical::class, BinaryOp\Spaceship::class, BinaryOp\BitwiseAnd::class, BinaryOp\BitwiseXor::class, BinaryOp\BitwiseOr::class, BinaryOp\BooleanAnd::class, BinaryOp\BooleanOr::class, BinaryOp\Coalesce::class, BinaryOp\LogicalAnd::class, BinaryOp\LogicalXor::class, BinaryOp\LogicalOr::class]; - foreach ($binaryOps as $binaryOp) { - $this->fixupMap[$binaryOp] = ['left' => self::FIXUP_PREC_LEFT, 'right' => self::FIXUP_PREC_RIGHT]; - } - $assignOps = [Expr\Assign::class, Expr\AssignRef::class, AssignOp\Plus::class, AssignOp\Minus::class, AssignOp\Mul::class, AssignOp\Div::class, AssignOp\Concat::class, AssignOp\Mod::class, AssignOp\BitwiseAnd::class, AssignOp\BitwiseOr::class, AssignOp\BitwiseXor::class, AssignOp\ShiftLeft::class, AssignOp\ShiftRight::class, AssignOp\Pow::class, AssignOp\Coalesce::class]; - foreach ($assignOps as $assignOp) { - $this->fixupMap[$assignOp] = ['var' => self::FIXUP_PREC_LEFT, 'expr' => self::FIXUP_PREC_RIGHT]; - } - $prefixOps = [Expr\BitwiseNot::class, Expr\BooleanNot::class, Expr\UnaryPlus::class, Expr\UnaryMinus::class, Cast\Int_::class, Cast\Double::class, Cast\String_::class, Cast\Array_::class, Cast\Object_::class, Cast\Bool_::class, Cast\Unset_::class, Expr\ErrorSuppress::class, Expr\YieldFrom::class, Expr\Print_::class, Expr\Include_::class]; - foreach ($prefixOps as $prefixOp) { - $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_RIGHT]; - } + $this->attributes = $attributes; + $this->expr = $expr; + } + public function getSubNodeNames() : array + { + return ['expr']; + } + public function getType() : string + { + return 'Expr_Exit'; } +} + Arguments */ + public $args; /** - * Lazily initializes the removal map. + * Constructs a function call node. * - * The removal map is used to determine which additional tokens should be removed when a - * certain node is replaced by null. + * @param Node\Name|Expr $name Function name + * @param array $args Arguments + * @param array $attributes Additional attributes */ - protected function initializeRemovalMap() + public function __construct($name, array $args = [], array $attributes = []) { - if ($this->removalMap) { - return; - } - $stripBoth = ['left' => \T_WHITESPACE, 'right' => \T_WHITESPACE]; - $stripLeft = ['left' => \T_WHITESPACE]; - $stripRight = ['right' => \T_WHITESPACE]; - $stripDoubleArrow = ['right' => \T_DOUBLE_ARROW]; - $stripColon = ['left' => ':']; - $stripEquals = ['left' => '=']; - $this->removalMap = ['Expr_ArrayDimFetch->dim' => $stripBoth, 'Expr_ArrayItem->key' => $stripDoubleArrow, 'Expr_ArrowFunction->returnType' => $stripColon, 'Expr_Closure->returnType' => $stripColon, 'Expr_Exit->expr' => $stripBoth, 'Expr_Ternary->if' => $stripBoth, 'Expr_Yield->key' => $stripDoubleArrow, 'Expr_Yield->value' => $stripBoth, 'Param->type' => $stripRight, 'Param->default' => $stripEquals, 'Stmt_Break->num' => $stripBoth, 'Stmt_Catch->var' => $stripLeft, 'Stmt_ClassMethod->returnType' => $stripColon, 'Stmt_Class->extends' => ['left' => \T_EXTENDS], 'Stmt_Enum->scalarType' => $stripColon, 'Stmt_EnumCase->expr' => $stripEquals, 'Expr_PrintableNewAnonClass->extends' => ['left' => \T_EXTENDS], 'Stmt_Continue->num' => $stripBoth, 'Stmt_Foreach->keyVar' => $stripDoubleArrow, 'Stmt_Function->returnType' => $stripColon, 'Stmt_If->else' => $stripLeft, 'Stmt_Namespace->name' => $stripLeft, 'Stmt_Property->type' => $stripRight, 'Stmt_PropertyProperty->default' => $stripEquals, 'Stmt_Return->expr' => $stripBoth, 'Stmt_StaticVar->default' => $stripEquals, 'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft, 'Stmt_TryCatch->finally' => $stripLeft]; + $this->attributes = $attributes; + $this->name = $name; + $this->args = $args; } - protected function initializeInsertionMap() + public function getSubNodeNames() : array { - if ($this->insertionMap) { - return; - } - // TODO: "yield" where both key and value are inserted doesn't work - // [$find, $beforeToken, $extraLeft, $extraRight] - $this->insertionMap = [ - 'Expr_ArrayDimFetch->dim' => ['[', \false, null, null], - 'Expr_ArrayItem->key' => [null, \false, null, ' => '], - 'Expr_ArrowFunction->returnType' => [')', \false, ' : ', null], - 'Expr_Closure->returnType' => [')', \false, ' : ', null], - 'Expr_Ternary->if' => ['?', \false, ' ', ' '], - 'Expr_Yield->key' => [\T_YIELD, \false, null, ' => '], - 'Expr_Yield->value' => [\T_YIELD, \false, ' ', null], - 'Param->type' => [null, \false, null, ' '], - 'Param->default' => [null, \false, ' = ', null], - 'Stmt_Break->num' => [\T_BREAK, \false, ' ', null], - 'Stmt_Catch->var' => [null, \false, ' ', null], - 'Stmt_ClassMethod->returnType' => [')', \false, ' : ', null], - 'Stmt_Class->extends' => [null, \false, ' extends ', null], - 'Stmt_Enum->scalarType' => [null, \false, ' : ', null], - 'Stmt_EnumCase->expr' => [null, \false, ' = ', null], - 'Expr_PrintableNewAnonClass->extends' => [null, ' extends ', null], - 'Stmt_Continue->num' => [\T_CONTINUE, \false, ' ', null], - 'Stmt_Foreach->keyVar' => [\T_AS, \false, null, ' => '], - 'Stmt_Function->returnType' => [')', \false, ' : ', null], - 'Stmt_If->else' => [null, \false, ' ', null], - 'Stmt_Namespace->name' => [\T_NAMESPACE, \false, ' ', null], - 'Stmt_Property->type' => [\T_VARIABLE, \true, null, ' '], - 'Stmt_PropertyProperty->default' => [null, \false, ' = ', null], - 'Stmt_Return->expr' => [\T_RETURN, \false, ' ', null], - 'Stmt_StaticVar->default' => [null, \false, ' = ', null], - //'Stmt_TraitUseAdaptation_Alias->newName' => [T_AS, false, ' ', null], // TODO - 'Stmt_TryCatch->finally' => [null, \false, ' ', null], - ]; - } - protected function initializeListInsertionMap() - { - if ($this->listInsertionMap) { - return; - } - $this->listInsertionMap = [ - // special - //'Expr_ShellExec->parts' => '', // TODO These need to be treated more carefully - //'Scalar_Encapsed->parts' => '', - 'Stmt_Catch->types' => '|', - 'UnionType->types' => '|', - 'IntersectionType->types' => '&', - 'Stmt_If->elseifs' => ' ', - 'Stmt_TryCatch->catches' => ' ', - // comma-separated lists - 'Expr_Array->items' => ', ', - 'Expr_ArrowFunction->params' => ', ', - 'Expr_Closure->params' => ', ', - 'Expr_Closure->uses' => ', ', - 'Expr_FuncCall->args' => ', ', - 'Expr_Isset->vars' => ', ', - 'Expr_List->items' => ', ', - 'Expr_MethodCall->args' => ', ', - 'Expr_NullsafeMethodCall->args' => ', ', - 'Expr_New->args' => ', ', - 'Expr_PrintableNewAnonClass->args' => ', ', - 'Expr_StaticCall->args' => ', ', - 'Stmt_ClassConst->consts' => ', ', - 'Stmt_ClassMethod->params' => ', ', - 'Stmt_Class->implements' => ', ', - 'Stmt_Enum->implements' => ', ', - 'Expr_PrintableNewAnonClass->implements' => ', ', - 'Stmt_Const->consts' => ', ', - 'Stmt_Declare->declares' => ', ', - 'Stmt_Echo->exprs' => ', ', - 'Stmt_For->init' => ', ', - 'Stmt_For->cond' => ', ', - 'Stmt_For->loop' => ', ', - 'Stmt_Function->params' => ', ', - 'Stmt_Global->vars' => ', ', - 'Stmt_GroupUse->uses' => ', ', - 'Stmt_Interface->extends' => ', ', - 'Stmt_Match->arms' => ', ', - 'Stmt_Property->props' => ', ', - 'Stmt_StaticVar->vars' => ', ', - 'Stmt_TraitUse->traits' => ', ', - 'Stmt_TraitUseAdaptation_Precedence->insteadof' => ', ', - 'Stmt_Unset->vars' => ', ', - 'Stmt_Use->uses' => ', ', - 'MatchArm->conds' => ', ', - 'AttributeGroup->attrs' => ', ', - // statement lists - 'Expr_Closure->stmts' => "\n", - 'Stmt_Case->stmts' => "\n", - 'Stmt_Catch->stmts' => "\n", - 'Stmt_Class->stmts' => "\n", - 'Stmt_Enum->stmts' => "\n", - 'Expr_PrintableNewAnonClass->stmts' => "\n", - 'Stmt_Interface->stmts' => "\n", - 'Stmt_Trait->stmts' => "\n", - 'Stmt_ClassMethod->stmts' => "\n", - 'Stmt_Declare->stmts' => "\n", - 'Stmt_Do->stmts' => "\n", - 'Stmt_ElseIf->stmts' => "\n", - 'Stmt_Else->stmts' => "\n", - 'Stmt_Finally->stmts' => "\n", - 'Stmt_Foreach->stmts' => "\n", - 'Stmt_For->stmts' => "\n", - 'Stmt_Function->stmts' => "\n", - 'Stmt_If->stmts' => "\n", - 'Stmt_Namespace->stmts' => "\n", - 'Stmt_Class->attrGroups' => "\n", - 'Stmt_Enum->attrGroups' => "\n", - 'Stmt_EnumCase->attrGroups' => "\n", - 'Stmt_Interface->attrGroups' => "\n", - 'Stmt_Trait->attrGroups' => "\n", - 'Stmt_Function->attrGroups' => "\n", - 'Stmt_ClassMethod->attrGroups' => "\n", - 'Stmt_ClassConst->attrGroups' => "\n", - 'Stmt_Property->attrGroups' => "\n", - 'Expr_PrintableNewAnonClass->attrGroups' => ' ', - 'Expr_Closure->attrGroups' => ' ', - 'Expr_ArrowFunction->attrGroups' => ' ', - 'Param->attrGroups' => ' ', - 'Stmt_Switch->cases' => "\n", - 'Stmt_TraitUse->adaptations' => "\n", - 'Stmt_TryCatch->stmts' => "\n", - 'Stmt_While->stmts' => "\n", - // dummy for top-level context - 'File->stmts' => "\n", - ]; + return ['name', 'args']; } - protected function initializeEmptyListInsertionMap() + public function getType() : string { - if ($this->emptyListInsertionMap) { - return; - } - // TODO Insertion into empty statement lists. - // [$find, $extraLeft, $extraRight] - $this->emptyListInsertionMap = ['Expr_ArrowFunction->params' => ['(', '', ''], 'Expr_Closure->uses' => [')', ' use(', ')'], 'Expr_Closure->params' => ['(', '', ''], 'Expr_FuncCall->args' => ['(', '', ''], 'Expr_MethodCall->args' => ['(', '', ''], 'Expr_NullsafeMethodCall->args' => ['(', '', ''], 'Expr_New->args' => ['(', '', ''], 'Expr_PrintableNewAnonClass->args' => ['(', '', ''], 'Expr_PrintableNewAnonClass->implements' => [null, ' implements ', ''], 'Expr_StaticCall->args' => ['(', '', ''], 'Stmt_Class->implements' => [null, ' implements ', ''], 'Stmt_Enum->implements' => [null, ' implements ', ''], 'Stmt_ClassMethod->params' => ['(', '', ''], 'Stmt_Interface->extends' => [null, ' extends ', ''], 'Stmt_Function->params' => ['(', '', '']]; + return 'Expr_FuncCall'; } - protected function initializeModifierChangeMap() + public function getRawArgs() : array { - if ($this->modifierChangeMap) { - return; - } - $this->modifierChangeMap = ['Stmt_ClassConst->flags' => \T_CONST, 'Stmt_ClassMethod->flags' => \T_FUNCTION, 'Stmt_Class->flags' => \T_CLASS, 'Stmt_Property->flags' => \T_VARIABLE, 'Param->flags' => \T_VARIABLE]; - // List of integer subnodes that are not modifiers: - // Expr_Include->type - // Stmt_GroupUse->type - // Stmt_Use->type - // Stmt_UseUse->type + return $this->args; } } name = $name; - } + const TYPE_INCLUDE = 1; + const TYPE_INCLUDE_ONCE = 2; + const TYPE_REQUIRE = 3; + const TYPE_REQUIRE_ONCE = 4; + /** @var Expr Expression */ + public $expr; + /** @var int Type of include */ + public $type; /** - * Adds a statement. - * - * @param Node|PhpParser\Builder $stmt The statement to add + * Constructs an include node. * - * @return $this The builder instance (for fluid interface) + * @param Expr $expr Expression + * @param int $type Type of include + * @param array $attributes Additional attributes */ - public function addStmt($stmt) + public function __construct(Expr $expr, int $type, array $attributes = []) { - $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); - return $this; + $this->attributes = $attributes; + $this->expr = $expr; + $this->type = $type; } - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) + public function getSubNodeNames() : array { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - return $this; + return ['expr', 'type']; } - /** - * Returns the built function node. - * - * @return Stmt\Function_ The built function node - */ - public function getNode() : Node + public function getType() : string { - return new Stmt\Function_($this->name, ['byRef' => $this->returnByRef, 'params' => $this->params, 'returnType' => $this->returnType, 'stmts' => $this->stmts, 'attrGroups' => $this->attributeGroups], $this->attributes); + return 'Expr_Include'; } } name = $name; + $this->attributes = $attributes; + $this->expr = $expr; + $this->class = $class; } - /** - * Extends one or more interfaces. - * - * @param Name|string ...$interfaces Names of interfaces to extend - * - * @return $this The builder instance (for fluid interface) - */ - public function extend(...$interfaces) + public function getSubNodeNames() : array { - foreach ($interfaces as $interface) { - $this->extends[] = BuilderHelpers::normalizeName($interface); - } - return $this; + return ['expr', 'class']; } - /** - * Adds a statement. - * - * @param Stmt|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) + public function getType() : string { - $stmt = BuilderHelpers::normalizeNode($stmt); - if ($stmt instanceof Stmt\ClassConst) { - $this->constants[] = $stmt; - } elseif ($stmt instanceof Stmt\ClassMethod) { - // we erase all statements in the body of an interface method - $stmt->stmts = null; - $this->methods[] = $stmt; - } else { - throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); - } - return $this; + return 'Expr_Instanceof'; } +} +attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - return $this; + $this->attributes = $attributes; + $this->vars = $vars; } - /** - * Returns the built interface node. - * - * @return Stmt\Interface_ The built interface node - */ - public function getNode() : PhpParser\Node + public function getSubNodeNames() : array { - return new Stmt\Interface_($this->name, ['extends' => $this->extends, 'stmts' => \array_merge($this->constants, $this->methods), 'attrGroups' => $this->attributeGroups], $this->attributes); + return ['vars']; + } + public function getType() : string + { + return 'Expr_Isset'; } } name = $name; + $this->attributes = $attributes; + $this->items = $items; } - /** - * Makes the method public. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePublic() + public function getSubNodeNames() : array { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); - return $this; + return ['items']; } - /** - * Makes the method protected. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeProtected() + public function getType() : string { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); - return $this; + return 'Expr_List'; } +} +flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); - return $this; + $this->attributes = $attributes; + $this->cond = $cond; + $this->arms = $arms; } - /** - * Makes the method static. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeStatic() + public function getSubNodeNames() : array { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); - return $this; + return ['cond', 'arms']; } - /** - * Makes the method abstract. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeAbstract() + public function getType() : string { - if (!empty($this->stmts)) { - throw new \LogicException('Cannot make method with statements abstract'); - } - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); - $this->stmts = null; - // abstract methods don't have statements - return $this; + return 'Expr_Match'; } +} + Arguments */ + public $args; /** - * Makes the method final. + * Constructs a function call node. * - * @return $this The builder instance (for fluid interface) + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Method name + * @param array $args Arguments + * @param array $attributes Additional attributes */ - public function makeFinal() + public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); - return $this; + $this->attributes = $attributes; + $this->var = $var; + $this->name = \is_string($name) ? new Identifier($name) : $name; + $this->args = $args; } - /** - * Adds a statement. - * - * @param Node|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) + public function getSubNodeNames() : array { - if (null === $this->stmts) { - throw new \LogicException('Cannot add statements to an abstract method'); - } - $this->stmts[] = BuilderHelpers::normalizeStmt($stmt); - return $this; + return ['var', 'name', 'args']; } - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) + public function getType() : string { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - return $this; + return 'Expr_MethodCall'; } - /** - * Returns the built method node. - * - * @return Stmt\ClassMethod The built method node - */ - public function getNode() : Node + public function getRawArgs() : array { - return new Stmt\ClassMethod($this->name, ['flags' => $this->flags, 'byRef' => $this->returnByRef, 'params' => $this->params, 'returnType' => $this->returnType, 'stmts' => $this->stmts, 'attrGroups' => $this->attributeGroups], $this->attributes); + return $this->args; } } Arguments */ + public $args; /** - * Creates a class builder. + * Constructs a function call node. * - * @param string $name Name of the class + * @param Node\Name|Expr|Node\Stmt\Class_ $class Class name (or class node for anonymous classes) + * @param array $args Arguments + * @param array $attributes Additional attributes */ - public function __construct(string $name) + public function __construct($class, array $args = [], array $attributes = []) { - $this->name = $name; + $this->attributes = $attributes; + $this->class = $class; + $this->args = $args; } - /** - * Extends a class. - * - * @param Name|string $class Name of class to extend - * - * @return $this The builder instance (for fluid interface) - */ - public function extend($class) + public function getSubNodeNames() : array { - $this->extends = BuilderHelpers::normalizeName($class); - return $this; + return ['class', 'args']; } - /** - * Implements one or more interfaces. - * - * @param Name|string ...$interfaces Names of interfaces to implement - * - * @return $this The builder instance (for fluid interface) - */ - public function implement(...$interfaces) + public function getType() : string { - foreach ($interfaces as $interface) { - $this->implements[] = BuilderHelpers::normalizeName($interface); - } - return $this; + return 'Expr_New'; } - /** - * Makes the class abstract. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeAbstract() + public function getRawArgs() : array { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); - return $this; + return $this->args; } +} + Arguments */ + public $args; /** - * Makes the class final. + * Constructs a nullsafe method call node. * - * @return $this The builder instance (for fluid interface) + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Method name + * @param array $args Arguments + * @param array $attributes Additional attributes */ - public function makeFinal() + public function __construct(Expr $var, $name, array $args = [], array $attributes = []) { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); - return $this; + $this->attributes = $attributes; + $this->var = $var; + $this->name = \is_string($name) ? new Identifier($name) : $name; + $this->args = $args; } - /** - * Adds a statement. - * - * @param Stmt|PhpParser\Builder $stmt The statement to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addStmt($stmt) + public function getSubNodeNames() : array { - $stmt = BuilderHelpers::normalizeNode($stmt); - $targets = [Stmt\TraitUse::class => &$this->uses, Stmt\ClassConst::class => &$this->constants, Stmt\Property::class => &$this->properties, Stmt\ClassMethod::class => &$this->methods]; - $class = \get_class($stmt); - if (!isset($targets[$class])) { - throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); - } - $targets[$class][] = $stmt; - return $this; + return ['var', 'name', 'args']; } - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) + public function getType() : string { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - return $this; + return 'Expr_NullsafeMethodCall'; } - /** - * Returns the built class node. - * - * @return Stmt\Class_ The built class node - */ - public function getNode() : PhpParser\Node + public function getRawArgs() : array { - return new Stmt\Class_($this->name, ['flags' => $this->flags, 'extends' => $this->extends, 'implements' => $this->implements, 'stmts' => \array_merge($this->uses, $this->constants, $this->properties, $this->methods), 'attrGroups' => $this->attributeGroups], $this->attributes); + return $this->args; } } name = $name; - } + /** @var Expr Variable holding object */ + public $var; + /** @var Identifier|Expr Property name */ + public $name; /** - * Adds a statement. - * - * @param Stmt|PhpParser\Builder $stmt The statement to add + * Constructs a nullsafe property fetch node. * - * @return $this The builder instance (for fluid interface) + * @param Expr $var Variable holding object + * @param string|Identifier|Expr $name Property name + * @param array $attributes Additional attributes */ - public function addStmt($stmt) + public function __construct(Expr $var, $name, array $attributes = []) { - $stmt = BuilderHelpers::normalizeNode($stmt); - if ($stmt instanceof Stmt\Property) { - $this->properties[] = $stmt; - } elseif ($stmt instanceof Stmt\ClassMethod) { - $this->methods[] = $stmt; - } elseif ($stmt instanceof Stmt\TraitUse) { - $this->uses[] = $stmt; - } else { - throw new \LogicException(\sprintf('Unexpected node of type "%s"', $stmt->getType())); - } - return $this; + $this->attributes = $attributes; + $this->var = $var; + $this->name = \is_string($name) ? new Identifier($name) : $name; } - /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute - * - * @return $this The builder instance (for fluid interface) - */ - public function addAttribute($attribute) + public function getSubNodeNames() : array { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - return $this; + return ['var', 'name']; } - /** - * Returns the built trait node. - * - * @return Stmt\Trait_ The built interface node - */ - public function getNode() : PhpParser\Node + public function getType() : string { - return new Stmt\Trait_($this->name, ['stmts' => \array_merge($this->uses, $this->properties, $this->methods), 'attrGroups' => $this->attributeGroups], $this->attributes); + return 'Expr_NullsafePropertyFetch'; } } returnByRef = \true; - return $this; - } + /** @var Expr Variable */ + public $var; /** - * Adds a parameter. - * - * @param Node\Param|Param $param The parameter to add + * Constructs a post decrement node. * - * @return $this The builder instance (for fluid interface) + * @param Expr $var Variable + * @param array $attributes Additional attributes */ - public function addParam($param) + public function __construct(Expr $var, array $attributes = []) { - $param = BuilderHelpers::normalizeNode($param); - if (!$param instanceof Node\Param) { - throw new \LogicException(\sprintf('Expected parameter node, got "%s"', $param->getType())); - } - $this->params[] = $param; - return $this; + $this->attributes = $attributes; + $this->var = $var; } - /** - * Adds multiple parameters. - * - * @param array $params The parameters to add - * - * @return $this The builder instance (for fluid interface) - */ - public function addParams(array $params) + public function getSubNodeNames() : array { - foreach ($params as $param) { - $this->addParam($param); - } - return $this; + return ['var']; } - /** - * Sets the return type for PHP 7. - * - * @param string|Node\Name|Node\Identifier|Node\ComplexType $type - * - * @return $this The builder instance (for fluid interface) - */ - public function setReturnType($type) + public function getType() : string { - $this->returnType = BuilderHelpers::normalizeType($type); - return $this; + return 'Expr_PostDec'; } } and($trait); - } - } + /** @var Expr Variable */ + public $var; /** - * Adds used trait. - * - * @param Node\Name|string $trait Trait name + * Constructs a post increment node. * - * @return $this The builder instance (for fluid interface) + * @param Expr $var Variable + * @param array $attributes Additional attributes */ - public function and($trait) + public function __construct(Expr $var, array $attributes = []) { - $this->traits[] = BuilderHelpers::normalizeName($trait); - return $this; + $this->attributes = $attributes; + $this->var = $var; } - /** - * Adds trait adaptation. - * - * @param Stmt\TraitUseAdaptation|Builder\TraitUseAdaptation $adaptation Trait adaptation - * - * @return $this The builder instance (for fluid interface) - */ - public function with($adaptation) + public function getSubNodeNames() : array { - $adaptation = BuilderHelpers::normalizeNode($adaptation); - if (!$adaptation instanceof Stmt\TraitUseAdaptation) { - throw new \LogicException('Adaptation must have type TraitUseAdaptation'); - } - $this->adaptations[] = $adaptation; - return $this; + return ['var']; } - /** - * Returns the built node. - * - * @return Node The built node - */ - public function getNode() : Node + public function getType() : string { - return new Stmt\TraitUse($this->traits, $this->adaptations); + return 'Expr_PostInc'; } } addStmt($stmt); - } - return $this; + $this->attributes = $attributes; + $this->var = $var; } - /** - * Sets doc comment for the declaration. - * - * @param PhpParser\Comment\Doc|string $docComment Doc comment to set - * - * @return $this The builder instance (for fluid interface) - */ - public function setDocComment($docComment) + public function getSubNodeNames() : array { - $this->attributes['comments'] = [BuilderHelpers::normalizeDocComment($docComment)]; - return $this; + return ['var']; + } + public function getType() : string + { + return 'Expr_PreDec'; } } name = $name; + $this->attributes = $attributes; + $this->var = $var; } - /** - * Sets default value for the parameter. - * - * @param mixed $value Default value to use - * - * @return $this The builder instance (for fluid interface) - */ - public function setDefault($value) + public function getSubNodeNames() : array { - $this->default = BuilderHelpers::normalizeValue($value); - return $this; + return ['var']; } - /** - * Sets type for the parameter. - * - * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type - * - * @return $this The builder instance (for fluid interface) - */ - public function setType($type) + public function getType() : string { - $this->type = BuilderHelpers::normalizeType($type); - if ($this->type == 'void') { - throw new \LogicException('Parameter type cannot be void'); - } - return $this; + return 'Expr_PreInc'; } +} +setType($type); + $this->attributes = $attributes; + $this->expr = $expr; } - /** - * Make the parameter accept the value by reference. - * - * @return $this The builder instance (for fluid interface) - */ - public function makeByRef() + public function getSubNodeNames() : array { - $this->byRef = \true; - return $this; + return ['expr']; } - /** - * Make the parameter variadic - * - * @return $this The builder instance (for fluid interface) - */ - public function makeVariadic() + public function getType() : string { - $this->variadic = \true; - return $this; + return 'Expr_Print'; } +} +attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - return $this; + $this->attributes = $attributes; + $this->var = $var; + $this->name = \is_string($name) ? new Identifier($name) : $name; } - /** - * Returns the built parameter node. - * - * @return Node\Param The built parameter node - */ - public function getNode() : Node + public function getSubNodeNames() : array { - return new Node\Param(new Node\Expr\Variable($this->name), $this->default, $this->type, $this->byRef, $this->variadic, [], 0, $this->attributeGroups); + return ['var', 'name']; + } + public function getType() : string + { + return 'Expr_PropertyFetch'; } } name = BuilderHelpers::normalizeName($name); - $this->type = $type; + $this->attributes = $attributes; + $this->parts = $parts; } - /** - * Sets alias for used name. - * - * @param string $alias Alias to use (last component of full name by default) - * - * @return $this The builder instance (for fluid interface) - */ - public function as(string $alias) + public function getSubNodeNames() : array { - $this->alias = $alias; - return $this; + return ['parts']; } - /** - * Returns the built node. - * - * @return Stmt\Use_ The built node - */ - public function getNode() : Node + public function getType() : string { - return new Stmt\Use_([new Stmt\UseUse($this->name, $this->alias)], $this->type); + return 'Expr_ShellExec'; } } Arguments */ + public $args; /** - * Creates a namespace builder. + * Constructs a static method call node. * - * @param Node\Name|string|null $name Name of the namespace + * @param Node\Name|Expr $class Class name + * @param string|Identifier|Expr $name Method name + * @param array $args Arguments + * @param array $attributes Additional attributes */ - public function __construct($name) + public function __construct($class, $name, array $args = [], array $attributes = []) { - $this->name = null !== $name ? BuilderHelpers::normalizeName($name) : null; + $this->attributes = $attributes; + $this->class = $class; + $this->name = \is_string($name) ? new Identifier($name) : $name; + $this->args = $args; + } + public function getSubNodeNames() : array + { + return ['class', 'name', 'args']; + } + public function getType() : string + { + return 'Expr_StaticCall'; + } + public function getRawArgs() : array + { + return $this->args; } +} +stmts[] = BuilderHelpers::normalizeStmt($stmt); - return $this; + $this->attributes = $attributes; + $this->class = $class; + $this->name = \is_string($name) ? new VarLikeIdentifier($name) : $name; + } + public function getSubNodeNames() : array + { + return ['class', 'name']; + } + public function getType() : string + { + return 'Expr_StaticPropertyFetch'; } +} +name, $this->stmts, $this->attributes); + $this->attributes = $attributes; + $this->cond = $cond; + $this->if = $if; + $this->else = $else; + } + public function getSubNodeNames() : array + { + return ['cond', 'if', 'else']; + } + public function getType() : string + { + return 'Expr_Ternary'; } } constants = [new Const_($name, BuilderHelpers::normalizeValue($value))]; + $this->attributes = $attributes; + $this->expr = $expr; } - /** - * Add another constant to const group - * - * @param string|Identifier $name Name - * @param Node\Expr|bool|null|int|float|string|array $value Value - * - * @return $this The builder instance (for fluid interface) - */ - public function addConst($name, $value) + public function getSubNodeNames() : array { - $this->constants[] = new Const_($name, BuilderHelpers::normalizeValue($value)); - return $this; + return ['expr']; } - /** - * Makes the constant public. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePublic() + public function getType() : string { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); - return $this; + return 'Expr_Throw'; } +} +flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); - return $this; + $this->attributes = $attributes; + $this->expr = $expr; } - /** - * Makes the constant private. - * - * @return $this The builder instance (for fluid interface) - */ - public function makePrivate() + public function getSubNodeNames() : array { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); - return $this; + return ['expr']; + } + public function getType() : string + { + return 'Expr_UnaryMinus'; } +} +flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); - return $this; + $this->attributes = $attributes; + $this->expr = $expr; + } + public function getSubNodeNames() : array + { + return ['expr']; } + public function getType() : string + { + return 'Expr_UnaryPlus'; + } +} +attributes = ['comments' => [BuilderHelpers::normalizeDocComment($docComment)]]; - return $this; + $this->attributes = $attributes; + $this->name = $name; + } + public function getSubNodeNames() : array + { + return ['name']; } + public function getType() : string + { + return 'Expr_Variable'; + } +} +attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - return $this; + $this->attributes = $attributes; + $this->expr = $expr; + } + public function getSubNodeNames() : array + { + return ['expr']; } + public function getType() : string + { + return 'Expr_YieldFrom'; + } +} +constants, $this->flags, $this->attributes, $this->attributeGroups); + $this->attributes = $attributes; + $this->key = $key; + $this->value = $value; + } + public function getSubNodeNames() : array + { + return ['key', 'value']; + } + public function getType() : string + { + return 'Expr_Yield'; } } name = $name; - } + public function returnsByRef() : bool; /** - * Makes the property public. + * List of parameters * - * @return $this The builder instance (for fluid interface) + * @return Param[] */ - public function makePublic() - { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC); - return $this; - } + public function getParams() : array; /** - * Makes the property protected. + * Get the declared return type or null * - * @return $this The builder instance (for fluid interface) + * @return null|Identifier|Name|ComplexType */ - public function makeProtected() - { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED); - return $this; - } + public function getReturnType(); /** - * Makes the property private. + * The function body * - * @return $this The builder instance (for fluid interface) + * @return Stmt[]|null */ - public function makePrivate() - { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE); - return $this; - } + public function getStmts(); /** - * Makes the property static. + * Get PHP attribute groups. * - * @return $this The builder instance (for fluid interface) + * @return AttributeGroup[] */ - public function makeStatic() - { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC); - return $this; - } + public function getAttrGroups() : array; +} + \true, 'parent' => \true, 'static' => \true]; /** - * Makes the property readonly. + * Constructs an identifier node. * - * @return $this The builder instance (for fluid interface) + * @param string $name Identifier as string + * @param array $attributes Additional attributes */ - public function makeReadonly() + public function __construct(string $name, array $attributes = []) { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); - return $this; + $this->attributes = $attributes; + $this->name = $name; + } + public function getSubNodeNames() : array + { + return ['name']; } /** - * Sets default value for the property. - * - * @param mixed $value Default value to use + * Get identifier as string. * - * @return $this The builder instance (for fluid interface) + * @return string Identifier as string. */ - public function setDefault($value) + public function toString() : string { - $this->default = BuilderHelpers::normalizeValue($value); - return $this; + return $this->name; } /** - * Sets doc comment for the property. - * - * @param PhpParser\Comment\Doc|string $docComment Doc comment to set + * Get lowercased identifier as string. * - * @return $this The builder instance (for fluid interface) + * @return string Lowercased identifier as string */ - public function setDocComment($docComment) + public function toLowerString() : string { - $this->attributes = ['comments' => [BuilderHelpers::normalizeDocComment($docComment)]]; - return $this; + return \strtolower($this->name); } /** - * Sets the property type for PHP 7.4+. - * - * @param string|Name|Identifier|ComplexType $type + * Checks whether the identifier is a special class name (self, parent or static). * - * @return $this + * @return bool Whether identifier is a special class name */ - public function setType($type) + public function isSpecialClassName() : bool { - $this->type = BuilderHelpers::normalizeType($type); - return $this; + return isset(self::$specialClassNames[\strtolower($this->name)]); } /** - * Adds an attribute group. - * - * @param Node\Attribute|Node\AttributeGroup $attribute + * Get identifier as string. * - * @return $this The builder instance (for fluid interface) + * @return string Identifier as string */ - public function addAttribute($attribute) + public function __toString() : string { - $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); - return $this; + return $this->name; + } + public function getType() : string + { + return 'Identifier'; } +} +flags !== 0 ? $this->flags : Stmt\Class_::MODIFIER_PUBLIC, [new Stmt\PropertyProperty($this->name, $this->default)], $this->attributes, $this->type, $this->attributeGroups); + $this->attributes = $attributes; + $this->types = $types; + } + public function getSubNodeNames() : array + { + return ['types']; + } + public function getType() : string + { + return 'IntersectionType'; } } type = self::TYPE_UNDEFINED; - $this->trait = \is_null($trait) ? null : BuilderHelpers::normalizeName($trait); - $this->method = BuilderHelpers::normalizeIdentifier($method); + $this->conds = $conds; + $this->body = $body; + $this->attributes = $attributes; } - /** - * Sets alias of method. - * - * @param Node\Identifier|string $alias Alias for adaptated method - * - * @return $this The builder instance (for fluid interface) - */ - public function as($alias) + public function getSubNodeNames() : array { - if ($this->type === self::TYPE_UNDEFINED) { - $this->type = self::TYPE_ALIAS; - } - if ($this->type !== self::TYPE_ALIAS) { - throw new \LogicException('Cannot set alias for not alias adaptation buider'); - } - $this->alias = $alias; - return $this; + return ['conds', 'body']; } + public function getType() : string + { + return 'MatchArm'; + } +} + \true, 'parent' => \true, 'static' => \true]; /** - * Sets adaptated method public. + * Constructs a name node. * - * @return $this The builder instance (for fluid interface) + * @param string|string[]|self $name Name as string, part array or Name instance (copy ctor) + * @param array $attributes Additional attributes */ - public function makePublic() + public function __construct($name, array $attributes = []) { - $this->setModifier(Stmt\Class_::MODIFIER_PUBLIC); - return $this; + $this->attributes = $attributes; + $this->parts = self::prepareName($name); + } + public function getSubNodeNames() : array + { + return ['parts']; } /** - * Sets adaptated method protected. + * Gets the first part of the name, i.e. everything before the first namespace separator. * - * @return $this The builder instance (for fluid interface) + * @return string First part of the name */ - public function makeProtected() + public function getFirst() : string { - $this->setModifier(Stmt\Class_::MODIFIER_PROTECTED); - return $this; + return $this->parts[0]; } /** - * Sets adaptated method private. + * Gets the last part of the name, i.e. everything after the last namespace separator. * - * @return $this The builder instance (for fluid interface) + * @return string Last part of the name */ - public function makePrivate() + public function getLast() : string { - $this->setModifier(Stmt\Class_::MODIFIER_PRIVATE); - return $this; + return $this->parts[\count($this->parts) - 1]; } /** - * Adds overwritten traits. - * - * @param Node\Name|string ...$traits Traits for overwrite + * Checks whether the name is unqualified. (E.g. Name) * - * @return $this The builder instance (for fluid interface) + * @return bool Whether the name is unqualified */ - public function insteadof(...$traits) - { - if ($this->type === self::TYPE_UNDEFINED) { - if (\is_null($this->trait)) { - throw new \LogicException('Precedence adaptation must have trait'); - } - $this->type = self::TYPE_PRECEDENCE; - } - if ($this->type !== self::TYPE_PRECEDENCE) { - throw new \LogicException('Cannot add overwritten traits for not precedence adaptation buider'); - } - foreach ($traits as $trait) { - $this->insteadof[] = BuilderHelpers::normalizeName($trait); - } - return $this; - } - protected function setModifier(int $modifier) + public function isUnqualified() : bool { - if ($this->type === self::TYPE_UNDEFINED) { - $this->type = self::TYPE_ALIAS; - } - if ($this->type !== self::TYPE_ALIAS) { - throw new \LogicException('Cannot set access modifier for not alias adaptation buider'); - } - if (\is_null($this->modifier)) { - $this->modifier = $modifier; - } else { - throw new \LogicException('Multiple access type modifiers are not allowed'); - } + return 1 === \count($this->parts); } /** - * Returns the built node. + * Checks whether the name is qualified. (E.g. Name\Name) * - * @return Node The built node + * @return bool Whether the name is qualified */ - public function getNode() : Node + public function isQualified() : bool { - switch ($this->type) { - case self::TYPE_ALIAS: - return new Stmt\TraitUseAdaptation\Alias($this->trait, $this->method, $this->modifier, $this->alias); - case self::TYPE_PRECEDENCE: - return new Stmt\TraitUseAdaptation\Precedence($this->trait, $this->method, $this->insteadof); - default: - throw new \LogicException('Type of adaptation is not defined'); - } + return 1 < \count($this->parts); } -} -rawMessage = $message; - if (\is_array($attributes)) { - $this->attributes = $attributes; - } else { - $this->attributes = ['startLine' => $attributes]; - } - $this->updateMessage(); + return \false; } /** - * Gets the error message + * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name) * - * @return string Error message + * @return bool Whether the name is relative */ - public function getRawMessage() : string + public function isRelative() : bool { - return $this->rawMessage; + return \false; } /** - * Gets the line the error starts in. + * Returns a string representation of the name itself, without taking the name type into + * account (e.g., not including a leading backslash for fully qualified names). * - * @return int Error start line + * @return string String representation */ - public function getStartLine() : int + public function toString() : string { - return $this->attributes['startLine'] ?? -1; + return \implode('\\', $this->parts); } /** - * Gets the line the error ends in. + * Returns a string representation of the name as it would occur in code (e.g., including + * leading backslash for fully qualified names. * - * @return int Error end line + * @return string String representation */ - public function getEndLine() : int + public function toCodeString() : string { - return $this->attributes['endLine'] ?? -1; + return $this->toString(); } /** - * Gets the attributes of the node/token the error occurred at. + * Returns lowercased string representation of the name, without taking the name type into + * account (e.g., no leading backslash for fully qualified names). * - * @return array + * @return string Lowercased string representation */ - public function getAttributes() : array + public function toLowerString() : string { - return $this->attributes; + return \strtolower(\implode('\\', $this->parts)); } /** - * Sets the attributes of the node/token the error occurred at. + * Checks whether the identifier is a special class name (self, parent or static). * - * @param array $attributes + * @return bool Whether identifier is a special class name */ - public function setAttributes(array $attributes) + public function isSpecialClassName() : bool { - $this->attributes = $attributes; - $this->updateMessage(); + return \count($this->parts) === 1 && isset(self::$specialClassNames[\strtolower($this->parts[0])]); } /** - * Sets the line of the PHP file the error occurred in. + * Returns a string representation of the name by imploding the namespace parts with the + * namespace separator. * - * @param string $message Error message + * @return string String representation */ - public function setRawMessage(string $message) + public function __toString() : string { - $this->rawMessage = $message; - $this->updateMessage(); + return \implode('\\', $this->parts); } /** - * Sets the line the error starts in. + * Gets a slice of a name (similar to array_slice). * - * @param int $line Error start line + * This method returns a new instance of the same type as the original and with the same + * attributes. + * + * If the slice is empty, null is returned. The null value will be correctly handled in + * concatenations using concat(). + * + * Offset and length have the same meaning as in array_slice(). + * + * @param int $offset Offset to start the slice at (may be negative) + * @param int|null $length Length of the slice (may be negative) + * + * @return static|null Sliced name */ - public function setStartLine(int $line) + public function slice(int $offset, int $length = null) { - $this->attributes['startLine'] = $line; - $this->updateMessage(); + $numParts = \count($this->parts); + $realOffset = $offset < 0 ? $offset + $numParts : $offset; + if ($realOffset < 0 || $realOffset > $numParts) { + throw new \OutOfBoundsException(\sprintf('Offset %d is out of bounds', $offset)); + } + if (null === $length) { + $realLength = $numParts - $realOffset; + } else { + $realLength = $length < 0 ? $length + $numParts - $realOffset : $length; + if ($realLength < 0 || $realLength > $numParts - $realOffset) { + throw new \OutOfBoundsException(\sprintf('Length %d is out of bounds', $length)); + } + } + if ($realLength === 0) { + // Empty slice is represented as null + return null; + } + return new static(\array_slice($this->parts, $realOffset, $realLength), $this->attributes); } /** - * Returns whether the error has start and end column information. + * Concatenate two names, yielding a new Name instance. * - * For column information enable the startFilePos and endFilePos in the lexer options. + * The type of the generated instance depends on which class this method is called on, for + * example Name\FullyQualified::concat() will yield a Name\FullyQualified instance. * - * @return bool + * If one of the arguments is null, a new instance of the other name will be returned. If both + * arguments are null, null will be returned. As such, writing + * Name::concat($namespace, $shortName) + * where $namespace is a Name node or null will work as expected. + * + * @param string|string[]|self|null $name1 The first name + * @param string|string[]|self|null $name2 The second name + * @param array $attributes Attributes to assign to concatenated name + * + * @return static|null Concatenated name */ - public function hasColumnInfo() : bool + public static function concat($name1, $name2, array $attributes = []) { - return isset($this->attributes['startFilePos'], $this->attributes['endFilePos']); + if (null === $name1 && null === $name2) { + return null; + } elseif (null === $name1) { + return new static(self::prepareName($name2), $attributes); + } elseif (null === $name2) { + return new static(self::prepareName($name1), $attributes); + } else { + return new static(\array_merge(self::prepareName($name1), self::prepareName($name2)), $attributes); + } } /** - * Gets the start column (1-based) into the line where the error started. + * Prepares a (string, array or Name node) name for use in name changing methods by converting + * it to an array. * - * @param string $code Source code of the file - * @return int + * @param string|string[]|self $name Name to prepare + * + * @return string[] Prepared name */ - public function getStartColumn(string $code) : int + private static function prepareName($name) : array { - if (!$this->hasColumnInfo()) { - throw new \RuntimeException('Error does not have column information'); + if (\is_string($name)) { + if ('' === $name) { + throw new \InvalidArgumentException('Name cannot be empty'); + } + return \explode('\\', $name); + } elseif (\is_array($name)) { + if (empty($name)) { + throw new \InvalidArgumentException('Name cannot be empty'); + } + return $name; + } elseif ($name instanceof self) { + return $name->parts; } - return $this->toColumn($code, $this->attributes['startFilePos']); + throw new \InvalidArgumentException('Expected string, array of parts or Name instance'); + } + public function getType() : string + { + return 'Name'; } +} +hasColumnInfo()) { - throw new \RuntimeException('Error does not have column information'); - } - return $this->toColumn($code, $this->attributes['endFilePos']); + return \false; } /** - * Formats message including line and column information. - * - * @param string $code Source code associated with the error, for calculation of the columns + * Checks whether the name is qualified. (E.g. Name\Name) * - * @return string Formatted message + * @return bool Whether the name is qualified */ - public function getMessageWithColumnInfo(string $code) : string + public function isQualified() : bool { - return \sprintf('%s from %d:%d to %d:%d', $this->getRawMessage(), $this->getStartLine(), $this->getStartColumn($code), $this->getEndLine(), $this->getEndColumn($code)); + return \false; } /** - * Converts a file offset into a column. - * - * @param string $code Source code that $pos indexes into - * @param int $pos 0-based position in $code + * Checks whether the name is fully qualified. (E.g. \Name) * - * @return int 1-based column (relative to start of line) + * @return bool Whether the name is fully qualified */ - private function toColumn(string $code, int $pos) : int + public function isFullyQualified() : bool { - if ($pos > \strlen($code)) { - throw new \RuntimeException('Invalid position information'); - } - $lineStartPos = \strrpos($code, "\n", $pos - \strlen($code)); - if (\false === $lineStartPos) { - $lineStartPos = -1; - } - return $pos - $lineStartPos; + return \true; } /** - * Updates the exception message after a change to rawMessage or rawLine. + * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name) + * + * @return bool Whether the name is relative */ - protected function updateMessage() + public function isRelative() : bool { - $this->message = $this->rawMessage; - if (-1 === $this->getStartLine()) { - $this->message .= ' on unknown line'; - } else { - $this->message .= ' on line ' . $this->getStartLine(); - } + return \false; + } + public function toCodeString() : string + { + return '\\' . $this->toString(); + } + public function getType() : string + { + return 'Name_FullyQualified'; } } nameContext = new NameContext($errorHandler ?? new ErrorHandler\Throwing()); - $this->preserveOriginalNames = $options['preserveOriginalNames'] ?? \false; - $this->replaceNodes = $options['replaceNodes'] ?? \true; + return \false; } /** - * Get name resolution context. + * Checks whether the name is fully qualified. (E.g. \Name) * - * @return NameContext + * @return bool Whether the name is fully qualified */ - public function getNameContext() : NameContext + public function isFullyQualified() : bool { - return $this->nameContext; + return \false; } - public function beforeTraverse(array $nodes) + /** + * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name) + * + * @return bool Whether the name is relative + */ + public function isRelative() : bool { - $this->nameContext->startNamespace(); - return null; + return \true; } - public function enterNode(Node $node) + public function toCodeString() : string { - if ($node instanceof Stmt\Namespace_) { - $this->nameContext->startNamespace($node->name); - } elseif ($node instanceof Stmt\Use_) { - foreach ($node->uses as $use) { - $this->addAlias($use, $node->type, null); - } - } elseif ($node instanceof Stmt\GroupUse) { - foreach ($node->uses as $use) { - $this->addAlias($use, $node->type, $node->prefix); - } - } elseif ($node instanceof Stmt\Class_) { - if (null !== $node->extends) { - $node->extends = $this->resolveClassName($node->extends); - } - foreach ($node->implements as &$interface) { - $interface = $this->resolveClassName($interface); - } - $this->resolveAttrGroups($node); - if (null !== $node->name) { - $this->addNamespacedName($node); - } - } elseif ($node instanceof Stmt\Interface_) { - foreach ($node->extends as &$interface) { - $interface = $this->resolveClassName($interface); - } - $this->resolveAttrGroups($node); - $this->addNamespacedName($node); - } elseif ($node instanceof Stmt\Enum_) { - foreach ($node->implements as &$interface) { - $interface = $this->resolveClassName($interface); - } - $this->resolveAttrGroups($node); - if (null !== $node->name) { - $this->addNamespacedName($node); - } - } elseif ($node instanceof Stmt\Trait_) { - $this->resolveAttrGroups($node); - $this->addNamespacedName($node); - } elseif ($node instanceof Stmt\Function_) { - $this->resolveSignature($node); - $this->resolveAttrGroups($node); - $this->addNamespacedName($node); - } elseif ($node instanceof Stmt\ClassMethod || $node instanceof Expr\Closure || $node instanceof Expr\ArrowFunction) { - $this->resolveSignature($node); - $this->resolveAttrGroups($node); - } elseif ($node instanceof Stmt\Property) { - if (null !== $node->type) { - $node->type = $this->resolveType($node->type); - } - $this->resolveAttrGroups($node); - } elseif ($node instanceof Stmt\Const_) { - foreach ($node->consts as $const) { - $this->addNamespacedName($const); - } - } else { - if ($node instanceof Stmt\ClassConst) { - $this->resolveAttrGroups($node); - } else { - if ($node instanceof Stmt\EnumCase) { - $this->resolveAttrGroups($node); - } elseif ($node instanceof Expr\StaticCall || $node instanceof Expr\StaticPropertyFetch || $node instanceof Expr\ClassConstFetch || $node instanceof Expr\New_ || $node instanceof Expr\Instanceof_) { - if ($node->class instanceof Name) { - $node->class = $this->resolveClassName($node->class); - } - } elseif ($node instanceof Stmt\Catch_) { - foreach ($node->types as &$type) { - $type = $this->resolveClassName($type); - } - } elseif ($node instanceof Expr\FuncCall) { - if ($node->name instanceof Name) { - $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION); - } - } elseif ($node instanceof Expr\ConstFetch) { - $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT); - } elseif ($node instanceof Stmt\TraitUse) { - foreach ($node->traits as &$trait) { - $trait = $this->resolveClassName($trait); - } - foreach ($node->adaptations as $adaptation) { - if (null !== $adaptation->trait) { - $adaptation->trait = $this->resolveClassName($adaptation->trait); - } - if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) { - foreach ($adaptation->insteadof as &$insteadof) { - $insteadof = $this->resolveClassName($insteadof); - } - } - } - } - } - } - return null; - } - private function addAlias(Stmt\UseUse $use, $type, Name $prefix = null) - { - // Add prefix for group uses - $name = $prefix ? Name::concat($prefix, $use->name) : $use->name; - // Type is determined either by individual element or whole use declaration - $type |= $use->type; - $this->nameContext->addAlias($name, (string) $use->getAlias(), $type, $use->getAttributes()); - } - /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node */ - private function resolveSignature($node) - { - foreach ($node->params as $param) { - $param->type = $this->resolveType($param->type); - $this->resolveAttrGroups($param); - } - $node->returnType = $this->resolveType($node->returnType); + return 'namespace\\' . $this->toString(); } - private function resolveType($node) + public function getType() : string { - if ($node instanceof Name) { - return $this->resolveClassName($node); - } - if ($node instanceof Node\NullableType) { - $node->type = $this->resolveType($node->type); - return $node; - } - if ($node instanceof Node\UnionType || $node instanceof Node\IntersectionType) { - foreach ($node->types as &$type) { - $type = $this->resolveType($type); - } - return $node; - } - return $node; + return 'Name_Relative'; } +} +replaceNodes) { - $resolvedName = $this->nameContext->getResolvedName($name, $type); - if (null !== $resolvedName) { - $name->setAttribute('resolvedName', $resolvedName); - } else { - $name->setAttribute('namespacedName', FullyQualified::concat($this->nameContext->getNamespace(), $name, $name->getAttributes())); - } - return $name; - } - if ($this->preserveOriginalNames) { - // Save the original name - $originalName = $name; - $name = clone $originalName; - $name->setAttribute('originalName', $originalName); - } - $resolvedName = $this->nameContext->getResolvedName($name, $type); - if (null !== $resolvedName) { - return $resolvedName; - } - // unqualified names inside a namespace cannot be resolved at compile-time - // add the namespaced version of the name as an attribute - $name->setAttribute('namespacedName', FullyQualified::concat($this->nameContext->getNamespace(), $name, $name->getAttributes())); - return $name; - } - protected function resolveClassName(Name $name) + public function __construct($type, array $attributes = []) { - return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL); + $this->attributes = $attributes; + $this->type = \is_string($type) ? new Identifier($type) : $type; } - protected function addNamespacedName(Node $node) + public function getSubNodeNames() : array { - $node->namespacedName = Name::concat($this->nameContext->getNamespace(), (string) $node->name); + return ['type']; } - protected function resolveAttrGroups(Node $node) + public function getType() : string { - foreach ($node->attrGroups as $attrGroup) { - foreach ($attrGroup->attrs as $attr) { - $attr->name = $this->resolveClassName($attr->name); - } - } + return 'NullableType'; } } $node->getAttribute('parent'). - */ -final class ParentConnectingVisitor extends NodeVisitorAbstract +use PHPUnit\PhpParser\NodeAbstract; +class Param extends NodeAbstract { + /** @var null|Identifier|Name|ComplexType Type declaration */ + public $type; + /** @var bool Whether parameter is passed by reference */ + public $byRef; + /** @var bool Whether this is a variadic argument */ + public $variadic; + /** @var Expr\Variable|Expr\Error Parameter variable */ + public $var; + /** @var null|Expr Default value */ + public $default; + /** @var int */ + public $flags; + /** @var AttributeGroup[] PHP attribute groups */ + public $attrGroups; /** - * @var Node[] + * Constructs a parameter node. + * + * @param Expr\Variable|Expr\Error $var Parameter variable + * @param null|Expr $default Default value + * @param null|string|Identifier|Name|ComplexType $type Type declaration + * @param bool $byRef Whether is passed by reference + * @param bool $variadic Whether this is a variadic argument + * @param array $attributes Additional attributes + * @param int $flags Optional visibility flags + * @param AttributeGroup[] $attrGroups PHP attribute groups */ - private $stack = []; - public function beforeTraverse(array $nodes) + public function __construct($var, Expr $default = null, $type = null, bool $byRef = \false, bool $variadic = \false, array $attributes = [], int $flags = 0, array $attrGroups = []) { - $this->stack = []; + $this->attributes = $attributes; + $this->type = \is_string($type) ? new Identifier($type) : $type; + $this->byRef = $byRef; + $this->variadic = $variadic; + $this->var = $var; + $this->default = $default; + $this->flags = $flags; + $this->attrGroups = $attrGroups; } - public function enterNode(Node $node) + public function getSubNodeNames() : array { - if (!empty($this->stack)) { - $node->setAttribute('parent', $this->stack[count($this->stack) - 1]); - } - $this->stack[] = $node; + return ['attrGroups', 'flags', 'type', 'byRef', 'variadic', 'var', 'default']; } - public function leaveNode(Node $node) + public function getType() : string { - array_pop($this->stack); + return 'Param'; } } setAttribute('origNode', $origNode); - return $node; - } } filterCallback = $filterCallback; - } + /** @var float Number value */ + public $value; /** - * Get found nodes satisfying the filter callback. - * - * Nodes are returned in pre-order. + * Constructs a float number scalar node. * - * @return Node[] Found nodes + * @param float $value Value of the number + * @param array $attributes Additional attributes */ - public function getFoundNodes() : array + public function __construct(float $value, array $attributes = []) { - return $this->foundNodes; + $this->attributes = $attributes; + $this->value = $value; } - public function beforeTraverse(array $nodes) + public function getSubNodeNames() : array { - $this->foundNodes = []; - return null; + return ['value']; } - public function enterNode(Node $node) + /** + * @param mixed[] $attributes + */ + public static function fromString(string $str, array $attributes = []) : DNumber { - $filterCallback = $this->filterCallback; - if ($filterCallback($node)) { - $this->foundNodes[] = $node; + $attributes['rawValue'] = $str; + $float = self::parse($str); + return new DNumber($float, $attributes); + } + /** + * @internal + * + * Parses a DNUMBER token like PHP would. + * + * @param string $str A string number + * + * @return float The parsed number + */ + public static function parse(string $str) : float + { + $str = \str_replace('_', '', $str); + // if string contains any of .eE just cast it to float + if (\false !== \strpbrk($str, '.eE')) { + return (float) $str; } - return null; + // otherwise it's an integer notation that overflowed into a float + // if it starts with 0 it's one of the special integer notations + if ('0' === $str[0]) { + // hex + if ('x' === $str[1] || 'X' === $str[1]) { + return \hexdec($str); + } + // bin + if ('b' === $str[1] || 'B' === $str[1]) { + return \bindec($str); + } + // oct + // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit (8 or 9) + // so that only the digits before that are used + return \octdec(\substr($str, 0, \strcspn($str, '89'))); + } + // dec + return (float) $str; + } + public function getType() : string + { + return 'Scalar_DNumber'; } } filterCallback = $filterCallback; - } + /** @var Expr[] list of string parts */ + public $parts; /** - * Get found node satisfying the filter callback. - * - * Returns null if no node satisfies the filter callback. + * Constructs an encapsed string node. * - * @return null|Node Found node (or null if not found) + * @param Expr[] $parts Encaps list + * @param array $attributes Additional attributes */ - public function getFoundNode() + public function __construct(array $parts, array $attributes = []) { - return $this->foundNode; + $this->attributes = $attributes; + $this->parts = $parts; } - public function beforeTraverse(array $nodes) + public function getSubNodeNames() : array { - $this->foundNode = null; - return null; + return ['parts']; } - public function enterNode(Node $node) + public function getType() : string { - $filterCallback = $this->filterCallback; - if ($filterCallback($node)) { - $this->foundNode = $node; - return NodeTraverser::STOP_TRAVERSAL; - } - return null; + return 'Scalar_Encapsed'; } } $node->getAttribute('parent'), the previous - * node can be accessed through $node->getAttribute('previous'), - * and the next node can be accessed through $node->getAttribute('next'). - */ -final class NodeConnectingVisitor extends NodeVisitorAbstract +use PHPUnit\PhpParser\Node\Scalar; +class EncapsedStringPart extends Scalar { + /** @var string String value */ + public $value; /** - * @var Node[] - */ - private $stack = []; - /** - * @var ?Node + * Constructs a node representing a string part of an encapsed string. + * + * @param string $value String value + * @param array $attributes Additional attributes */ - private $previous; - public function beforeTraverse(array $nodes) + public function __construct(string $value, array $attributes = []) { - $this->stack = []; - $this->previous = null; + $this->attributes = $attributes; + $this->value = $value; } - public function enterNode(Node $node) + public function getSubNodeNames() : array { - if (!empty($this->stack)) { - $node->setAttribute('parent', $this->stack[\count($this->stack) - 1]); - } - if ($this->previous !== null && $this->previous->getAttribute('parent') === $node->getAttribute('parent')) { - $node->setAttribute('previous', $this->previous); - $this->previous->setAttribute('next', $node); - } - $this->stack[] = $node; + return ['value']; } - public function leaveNode(Node $node) + public function getType() : string { - $this->previous = $node; - \array_pop($this->stack); + return 'Scalar_EncapsedStringPart'; } } attributes = $attributes; + $this->value = $value; + } + public function getSubNodeNames() : array + { + return ['value']; + } + /** + * Constructs an LNumber node from a string number literal. * - * @return Parser The parser instance + * @param string $str String number literal (decimal, octal, hex or binary) + * @param array $attributes Additional attributes + * @param bool $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5) + * + * @return LNumber The constructed LNumber, including kind attribute */ - public function create(int $kind, Lexer $lexer = null, array $parserOptions = []) : Parser + public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = \false) : LNumber { - if (null === $lexer) { - $lexer = new Lexer\Emulative(); + $attributes['rawValue'] = $str; + $str = \str_replace('_', '', $str); + if ('0' !== $str[0] || '0' === $str) { + $attributes['kind'] = LNumber::KIND_DEC; + return new LNumber((int) $str, $attributes); } - switch ($kind) { - case self::PREFER_PHP7: - return new Parser\Multiple([new Parser\Php7($lexer, $parserOptions), new Parser\Php5($lexer, $parserOptions)]); - case self::PREFER_PHP5: - return new Parser\Multiple([new Parser\Php5($lexer, $parserOptions), new Parser\Php7($lexer, $parserOptions)]); - case self::ONLY_PHP7: - return new Parser\Php7($lexer, $parserOptions); - case self::ONLY_PHP5: - return new Parser\Php5($lexer, $parserOptions); - default: - throw new \LogicException('Kind must be one of ::PREFER_PHP7, ::PREFER_PHP5, ::ONLY_PHP7 or ::ONLY_PHP5'); + if ('x' === $str[1] || 'X' === $str[1]) { + $attributes['kind'] = LNumber::KIND_HEX; + return new LNumber(\hexdec($str), $attributes); } + if ('b' === $str[1] || 'B' === $str[1]) { + $attributes['kind'] = LNumber::KIND_BIN; + return new LNumber(\bindec($str), $attributes); + } + if (!$allowInvalidOctal && \strpbrk($str, '89')) { + throw new Error('Invalid numeric literal', $attributes); + } + // Strip optional explicit octal prefix. + if ('o' === $str[1] || 'O' === $str[1]) { + $str = \substr($str, 2); + } + // use intval instead of octdec to get proper cutting behavior with malformed numbers + $attributes['kind'] = LNumber::KIND_OCT; + return new LNumber(\intval($str, 8), $attributes); } -} -fallbackEvaluator = $fallbackEvaluator ?? function (Expr $expr) { - throw new ConstExprEvaluationException("Expression of type {$expr->getType()} cannot be evaluated"); - }; + $this->attributes = $attributes; } - /** - * Silently evaluates a constant expression into a PHP value. - * - * Thrown Errors, warnings or notices will be converted into a ConstExprEvaluationException. - * The original source of the exception is available through getPrevious(). - * - * If some part of the expression cannot be evaluated, the fallback evaluator passed to the - * constructor will be invoked. By default, if no fallback is provided, an exception of type - * ConstExprEvaluationException is thrown. - * - * See class doc comment for caveats and limitations. - * - * @param Expr $expr Constant expression to evaluate - * @return mixed Result of evaluation - * - * @throws ConstExprEvaluationException if the expression cannot be evaluated or an error occurred - */ - public function evaluateSilently(Expr $expr) + public function getSubNodeNames() : array { - \set_error_handler(function ($num, $str, $file, $line) { - throw new \ErrorException($str, 0, $num, $file, $line); - }); - try { - return $this->evaluate($expr); - } catch (\Throwable $e) { - if (!$e instanceof ConstExprEvaluationException) { - $e = new ConstExprEvaluationException("An error occurred during constant expression evaluation", 0, $e); - } - throw $e; - } finally { - \restore_error_handler(); - } + return []; } /** - * Directly evaluates a constant expression into a PHP value. - * - * May generate Error exceptions, warnings or notices. Use evaluateSilently() to convert these - * into a ConstExprEvaluationException. - * - * If some part of the expression cannot be evaluated, the fallback evaluator passed to the - * constructor will be invoked. By default, if no fallback is provided, an exception of type - * ConstExprEvaluationException is thrown. - * - * See class doc comment for caveats and limitations. - * - * @param Expr $expr Constant expression to evaluate - * @return mixed Result of evaluation + * Get name of magic constant. * - * @throws ConstExprEvaluationException if the expression cannot be evaluated + * @return string Name of magic constant */ - public function evaluateDirectly(Expr $expr) - { - return $this->evaluate($expr); - } - private function evaluate(Expr $expr) - { - if ($expr instanceof Scalar\LNumber || $expr instanceof Scalar\DNumber || $expr instanceof Scalar\String_) { - return $expr->value; - } - if ($expr instanceof Expr\Array_) { - return $this->evaluateArray($expr); - } - // Unary operators - if ($expr instanceof Expr\UnaryPlus) { - return +$this->evaluate($expr->expr); - } - if ($expr instanceof Expr\UnaryMinus) { - return -$this->evaluate($expr->expr); - } - if ($expr instanceof Expr\BooleanNot) { - return !$this->evaluate($expr->expr); - } - if ($expr instanceof Expr\BitwiseNot) { - return ~$this->evaluate($expr->expr); - } - if ($expr instanceof Expr\BinaryOp) { - return $this->evaluateBinaryOp($expr); - } - if ($expr instanceof Expr\Ternary) { - return $this->evaluateTernary($expr); - } - if ($expr instanceof Expr\ArrayDimFetch && null !== $expr->dim) { - return $this->evaluate($expr->var)[$this->evaluate($expr->dim)]; - } - if ($expr instanceof Expr\ConstFetch) { - return $this->evaluateConstFetch($expr); - } - return ($this->fallbackEvaluator)($expr); - } - private function evaluateArray(Expr\Array_ $expr) - { - $array = []; - foreach ($expr->items as $item) { - if (null !== $item->key) { - $array[$this->evaluate($item->key)] = $this->evaluate($item->value); - } else { - $array[] = $this->evaluate($item->value); - } - } - return $array; - } - private function evaluateTernary(Expr\Ternary $expr) - { - if (null === $expr->if) { - return $this->evaluate($expr->cond) ?: $this->evaluate($expr->else); - } - return $this->evaluate($expr->cond) ? $this->evaluate($expr->if) : $this->evaluate($expr->else); - } - private function evaluateBinaryOp(Expr\BinaryOp $expr) - { - if ($expr instanceof Expr\BinaryOp\Coalesce && $expr->left instanceof Expr\ArrayDimFetch) { - // This needs to be special cased to respect BP_VAR_IS fetch semantics - return $this->evaluate($expr->left->var)[$this->evaluate($expr->left->dim)] ?? $this->evaluate($expr->right); - } - // The evaluate() calls are repeated in each branch, because some of the operators are - // short-circuiting and evaluating the RHS in advance may be illegal in that case - $l = $expr->left; - $r = $expr->right; - switch ($expr->getOperatorSigil()) { - case '&': - return $this->evaluate($l) & $this->evaluate($r); - case '|': - return $this->evaluate($l) | $this->evaluate($r); - case '^': - return $this->evaluate($l) ^ $this->evaluate($r); - case '&&': - return $this->evaluate($l) && $this->evaluate($r); - case '||': - return $this->evaluate($l) || $this->evaluate($r); - case '??': - return $this->evaluate($l) ?? $this->evaluate($r); - case '.': - return $this->evaluate($l) . $this->evaluate($r); - case '/': - return $this->evaluate($l) / $this->evaluate($r); - case '==': - return $this->evaluate($l) == $this->evaluate($r); - case '>': - return $this->evaluate($l) > $this->evaluate($r); - case '>=': - return $this->evaluate($l) >= $this->evaluate($r); - case '===': - return $this->evaluate($l) === $this->evaluate($r); - case 'and': - return $this->evaluate($l) and $this->evaluate($r); - case 'or': - return $this->evaluate($l) or $this->evaluate($r); - case 'xor': - return $this->evaluate($l) xor $this->evaluate($r); - case '-': - return $this->evaluate($l) - $this->evaluate($r); - case '%': - return $this->evaluate($l) % $this->evaluate($r); - case '*': - return $this->evaluate($l) * $this->evaluate($r); - case '!=': - return $this->evaluate($l) != $this->evaluate($r); - case '!==': - return $this->evaluate($l) !== $this->evaluate($r); - case '+': - return $this->evaluate($l) + $this->evaluate($r); - case '**': - return $this->evaluate($l) ** $this->evaluate($r); - case '<<': - return $this->evaluate($l) << $this->evaluate($r); - case '>>': - return $this->evaluate($l) >> $this->evaluate($r); - case '<': - return $this->evaluate($l) < $this->evaluate($r); - case '<=': - return $this->evaluate($l) <= $this->evaluate($r); - case '<=>': - return $this->evaluate($l) <=> $this->evaluate($r); - } - throw new \Exception('Should not happen'); - } - private function evaluateConstFetch(Expr\ConstFetch $expr) - { - $name = $expr->name->toLowerString(); - switch ($name) { - case 'null': - return null; - case 'false': - return \false; - case 'true': - return \true; - } - return ($this->fallbackEvaluator)($expr); - } + public abstract function getName() : string; } resolveIntegerOrFloatToken($tokens[$i + 1][1]); - \array_splice($tokens, $i, 2, [[$tokenKind, '0' . $tokens[$i + 1][1], $tokens[$i][2]]]); - $c--; - } - } - return $tokens; - } - private function resolveIntegerOrFloatToken(string $str) : int + public function getName() : string { - $str = \substr($str, 1); - $str = \str_replace('_', '', $str); - $num = \octdec($str); - return \is_float($num) ? \T_DNUMBER : \T_LNUMBER; + return '__CLASS__'; } - public function reverseEmulate(string $code, array $tokens) : array + public function getType() : string { - // Explicit octals were not legal code previously, don't bother. - return $tokens; + return 'Scalar_MagicConst_Class'; } } emulator = $emulator; - } - public function getPhpVersion() : string - { - return $this->emulator->getPhpVersion(); - } - public function isEmulationNeeded(string $code) : bool - { - return $this->emulator->isEmulationNeeded($code); - } - public function emulate(string $code, array $tokens) : array - { - return $this->emulator->reverseEmulate($code, $tokens); - } - public function reverseEmulate(string $code, array $tokens) : array + public function getName() : string { - return $this->emulator->emulate($code, $tokens); + return '__METHOD__'; } - public function preprocessCode(string $code, array &$patches) : string + public function getType() : string { - return $code; + return 'Scalar_MagicConst_Method'; } } '\\', '$' => '$', 'n' => "\n", 'r' => "\r", 't' => "\t", 'f' => "\f", 'v' => "\v", 'e' => "\x1b"]; + /** + * Constructs a string scalar node. + * + * @param string $value Value of the string + * @param array $attributes Additional attributes + */ + public function __construct(string $value, array $attributes = []) { - return Emulative::PHP_8_0; + $this->attributes = $attributes; + $this->value = $value; } - public function getKeywordString() : string + public function getSubNodeNames() : array { - return 'match'; + return ['value']; } - public function getKeywordToken() : int + /** + * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes + */ + public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = \true) : self { - return \T_MATCH; + $attributes['kind'] = $str[0] === "'" || $str[1] === "'" && ($str[0] === 'b' || $str[0] === 'B') ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED; + $attributes['rawValue'] = $str; + $string = self::parse($str, $parseUnicodeEscape); + return new self($string, $attributes); } -} -\h*)\2(?![a-zA-Z0-9_\x80-\xff])(?(?:;?[\r\n])?)/x -REGEX; - public function getPhpVersion() : string - { - return Emulative::PHP_7_3; - } - public function isEmulationNeeded(string $code) : bool - { - return \strpos($code, '<<<') !== \false; - } - public function emulate(string $code, array $tokens) : array + /** + * @internal + * + * Parses a string token. + * + * @param string $str String token content + * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes + * + * @return string The parsed string + */ + public static function parse(string $str, bool $parseUnicodeEscape = \true) : string { - // Handled by preprocessing + fixup. - return $tokens; + $bLength = 0; + if ('b' === $str[0] || 'B' === $str[0]) { + $bLength = 1; + } + if ('\'' === $str[$bLength]) { + return \str_replace(['\\\\', '\\\''], ['\\', '\''], \substr($str, $bLength + 1, -1)); + } else { + return self::parseEscapeSequences(\substr($str, $bLength + 1, -1), '"', $parseUnicodeEscape); + } } - public function reverseEmulate(string $code, array $tokens) : array + /** + * @internal + * + * Parses escape sequences in strings (all string types apart from single quoted). + * + * @param string $str String without quotes + * @param null|string $quote Quote type + * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes + * + * @return string String with escape sequences parsed + */ + public static function parseEscapeSequences(string $str, $quote, bool $parseUnicodeEscape = \true) : string { - // Not supported. - return $tokens; + if (null !== $quote) { + $str = \str_replace('\\' . $quote, $quote, $str); + } + $extra = ''; + if ($parseUnicodeEscape) { + $extra = '|u\\{([0-9a-fA-F]+)\\}'; + } + return \preg_replace_callback('~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}' . $extra . ')~', function ($matches) { + $str = $matches[1]; + if (isset(self::$replacements[$str])) { + return self::$replacements[$str]; + } elseif ('x' === $str[0] || 'X' === $str[0]) { + return \chr(\hexdec(\substr($str, 1))); + } elseif ('u' === $str[0]) { + return self::codePointToUtf8(\hexdec($matches[2])); + } else { + return \chr(\octdec($str)); + } + }, $str); } - public function preprocessCode(string $code, array &$patches) : string + /** + * Converts a Unicode code point to its UTF-8 encoded representation. + * + * @param int $num Code point + * + * @return string UTF-8 representation of code point + */ + private static function codePointToUtf8(int $num) : string { - if (!\preg_match_all(self::FLEXIBLE_DOC_STRING_REGEX, $code, $matches, \PREG_SET_ORDER | \PREG_OFFSET_CAPTURE)) { - // No heredoc/nowdoc found - return $code; + if ($num <= 0x7f) { + return \chr($num); } - // Keep track of how much we need to adjust string offsets due to the modifications we - // already made - $posDelta = 0; - foreach ($matches as $match) { - $indentation = $match['indentation'][0]; - $indentationStart = $match['indentation'][1]; - $separator = $match['separator'][0]; - $separatorStart = $match['separator'][1]; - if ($indentation === '' && $separator !== '') { - // Ordinary heredoc/nowdoc - continue; - } - if ($indentation !== '') { - // Remove indentation - $indentationLen = \strlen($indentation); - $code = \substr_replace($code, '', $indentationStart + $posDelta, $indentationLen); - $patches[] = [$indentationStart + $posDelta, 'add', $indentation]; - $posDelta -= $indentationLen; - } - if ($separator === '') { - // Insert newline as separator - $code = \substr_replace($code, "\n", $separatorStart + $posDelta, 0); - $patches[] = [$separatorStart + $posDelta, 'remove', "\n"]; - $posDelta += 1; - } + if ($num <= 0x7ff) { + return \chr(($num >> 6) + 0xc0) . \chr(($num & 0x3f) + 0x80); } - return $code; + if ($num <= 0xffff) { + return \chr(($num >> 12) + 0xe0) . \chr(($num >> 6 & 0x3f) + 0x80) . \chr(($num & 0x3f) + 0x80); + } + if ($num <= 0x1fffff) { + return \chr(($num >> 18) + 0xf0) . \chr(($num >> 12 & 0x3f) + 0x80) . \chr(($num >> 6 & 0x3f) + 0x80) . \chr(($num & 0x3f) + 0x80); + } + throw new Error('Invalid UTF-8 codepoint escape sequence: Codepoint too large'); + } + public function getType() : string + { + return 'Scalar_String'; } } resolveIntegerOrFloatToken($match); - $newTokens = [[$tokenKind, $match, $token[2]]]; - $numTokens = 1; - $len = $tokenLen; - while ($matchLen > $len) { - $nextToken = $tokens[$i + $numTokens]; - $nextTokenText = \is_array($nextToken) ? $nextToken[1] : $nextToken; - $nextTokenLen = \strlen($nextTokenText); - $numTokens++; - if ($matchLen < $len + $nextTokenLen) { - // Split trailing characters into a partial token. - \assert(\is_array($nextToken), "Partial token should be an array token"); - $partialText = \substr($nextTokenText, $matchLen - $len); - $newTokens[] = [$nextToken[0], $partialText, $nextToken[2]]; - break; - } - $len += $nextTokenLen; - } - \array_splice($tokens, $i, $numTokens, $newTokens); - $c -= $numTokens - \count($newTokens); - $codeOffset += $matchLen; - } - return $tokens; + $this->attributes = $attributes; + $this->num = $num; } - private function resolveIntegerOrFloatToken(string $str) : int + public function getSubNodeNames() : array { - $str = \str_replace('_', '', $str); - if (\stripos($str, '0b') === 0) { - $num = \bindec($str); - } elseif (\stripos($str, '0x') === 0) { - $num = \hexdec($str); - } elseif (\stripos($str, '0') === 0 && \ctype_digit($str)) { - $num = \octdec($str); - } else { - $num = +$str; - } - return \is_float($num) ? \T_DNUMBER : \T_LNUMBER; + return ['num']; } - public function reverseEmulate(string $code, array $tokens) : array + public function getType() : string { - // Numeric separators were not legal code previously, don't bother. - return $tokens; + return 'Stmt_Break'; } } getKeywordString()) !== \false; + $this->attributes = $attributes; + $this->cond = $cond; + $this->stmts = $stmts; } - protected function isKeywordContext(array $tokens, int $pos) : bool + public function getSubNodeNames() : array { - $previousNonSpaceToken = $this->getPreviousNonSpaceToken($tokens, $pos); - return $previousNonSpaceToken === null || $previousNonSpaceToken[0] !== \T_OBJECT_OPERATOR; + return ['cond', 'stmts']; } - public function emulate(string $code, array $tokens) : array + public function getType() : string { - $keywordString = $this->getKeywordString(); - foreach ($tokens as $i => $token) { - if ($token[0] === \T_STRING && \strtolower($token[1]) === $keywordString && $this->isKeywordContext($tokens, $i)) { - $tokens[$i][0] = $this->getKeywordToken(); - } - } - return $tokens; + return 'Stmt_Case'; } +} += 0; --$i) { - if ($tokens[$i][0] === \T_WHITESPACE) { - continue; - } - return $tokens[$i]; - } - return null; + $this->attributes = $attributes; + $this->types = $types; + $this->var = $var; + $this->stmts = $stmts; } - public function reverseEmulate(string $code, array $tokens) : array + public function getSubNodeNames() : array { - $keywordToken = $this->getKeywordToken(); - foreach ($tokens as $i => $token) { - if ($token[0] === $keywordToken) { - $tokens[$i][0] = \T_STRING; - } - } - return $tokens; + return ['types', 'var', 'stmts']; + } + public function getType() : string + { + return 'Stmt_Catch'; } } attributes = $attributes; + $this->flags = $flags; + $this->consts = $consts; + $this->attrGroups = $attrGroups; } - public function isEmulationNeeded(string $code) : bool + public function getSubNodeNames() : array { - return \strpos($code, '?->') !== \false; + return ['attrGroups', 'flags', 'consts']; } - public function emulate(string $code, array $tokens) : array + /** + * Whether constant is explicitly or implicitly public. + * + * @return bool + */ + public function isPublic() : bool { - // We need to manually iterate and manage a count because we'll change - // the tokens array on the way - $line = 1; - for ($i = 0, $c = \count($tokens); $i < $c; ++$i) { - if ($tokens[$i] === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1][0] === \T_OBJECT_OPERATOR) { - \array_splice($tokens, $i, 2, [[\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line]]); - $c--; - continue; - } - // Handle ?-> inside encapsed string. - if ($tokens[$i][0] === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1]) && $tokens[$i - 1][0] === \T_VARIABLE && \preg_match('/^\\?->([a-zA-Z_\\x80-\\xff][a-zA-Z0-9_\\x80-\\xff]*)/', $tokens[$i][1], $matches)) { - $replacement = [[\T_NULLSAFE_OBJECT_OPERATOR, '?->', $line], [\T_STRING, $matches[1], $line]]; - if (\strlen($matches[0]) !== \strlen($tokens[$i][1])) { - $replacement[] = [\T_ENCAPSED_AND_WHITESPACE, \substr($tokens[$i][1], \strlen($matches[0])), $line]; - } - \array_splice($tokens, $i, 1, $replacement); - $c += \count($replacement) - 1; - continue; - } - if (\is_array($tokens[$i])) { - $line += \substr_count($tokens[$i][1], "\n"); - } - } - return $tokens; + return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; } - public function reverseEmulate(string $code, array $tokens) : array + /** + * Whether constant is protected. + * + * @return bool + */ + public function isProtected() : bool { - // ?-> was not valid code previously, don't bother. - return $tokens; + return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); + } + /** + * Whether constant is private. + * + * @return bool + */ + public function isPrivate() : bool + { + return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); + } + /** + * Whether constant is final. + * + * @return bool + */ + public function isFinal() : bool + { + return (bool) ($this->flags & Class_::MODIFIER_FINAL); + } + public function getType() : string + { + return 'Stmt_ClassConst'; } } targetPhpVersion = $options['phpVersion'] ?? Emulative::PHP_8_1; - unset($options['phpVersion']); - parent::__construct($options); - $emulators = [new FlexibleDocStringEmulator(), new FnTokenEmulator(), new MatchTokenEmulator(), new CoaleseEqualTokenEmulator(), new NumericLiteralSeparatorEmulator(), new NullsafeTokenEmulator(), new AttributeEmulator(), new EnumTokenEmulator(), new ReadonlyTokenEmulator(), new ExplicitOctalEmulator()]; - // Collect emulators that are relevant for the PHP version we're running - // and the PHP version we're targeting for emulation. - foreach ($emulators as $emulator) { - $emulatorPhpVersion = $emulator->getPhpVersion(); - if ($this->isForwardEmulationNeeded($emulatorPhpVersion)) { - $this->emulators[] = $emulator; - } else { - if ($this->isReverseEmulationNeeded($emulatorPhpVersion)) { - $this->emulators[] = new ReverseEmulator($emulator); - } + $traitUses = []; + foreach ($this->stmts as $stmt) { + if ($stmt instanceof TraitUse) { + $traitUses[] = $stmt; } } + return $traitUses; } - public function startLexing(string $code, ErrorHandler $errorHandler = null) + /** + * @return ClassConst[] + */ + public function getConstants() : array { - $emulators = \array_filter($this->emulators, function ($emulator) use($code) { - return $emulator->isEmulationNeeded($code); - }); - if (empty($emulators)) { - // Nothing to emulate, yay - parent::startLexing($code, $errorHandler); - return; - } - $this->patches = []; - foreach ($emulators as $emulator) { - $code = $emulator->preprocessCode($code, $this->patches); - } - $collector = new ErrorHandler\Collecting(); - parent::startLexing($code, $collector); - $this->sortPatches(); - $this->fixupTokens(); - $errors = $collector->getErrors(); - if (!empty($errors)) { - $this->fixupErrors($errors); - foreach ($errors as $error) { - $errorHandler->handleError($error); + $constants = []; + foreach ($this->stmts as $stmt) { + if ($stmt instanceof ClassConst) { + $constants[] = $stmt; } } - foreach ($emulators as $emulator) { - $this->tokens = $emulator->emulate($code, $this->tokens); - } + return $constants; } - private function isForwardEmulationNeeded(string $emulatorPhpVersion) : bool + /** + * @return Property[] + */ + public function getProperties() : array { - return \version_compare(\PHP_VERSION, $emulatorPhpVersion, '<') && \version_compare($this->targetPhpVersion, $emulatorPhpVersion, '>='); - } - private function isReverseEmulationNeeded(string $emulatorPhpVersion) : bool - { - return \version_compare(\PHP_VERSION, $emulatorPhpVersion, '>=') && \version_compare($this->targetPhpVersion, $emulatorPhpVersion, '<'); - } - private function sortPatches() - { - // Patches may be contributed by different emulators. - // Make sure they are sorted by increasing patch position. - \usort($this->patches, function ($p1, $p2) { - return $p1[0] <=> $p2[0]; - }); + $properties = []; + foreach ($this->stmts as $stmt) { + if ($stmt instanceof Property) { + $properties[] = $stmt; + } + } + return $properties; } - private function fixupTokens() + /** + * Gets property with the given name defined directly in this class/interface/trait. + * + * @param string $name Name of the property + * + * @return Property|null Property node or null if the property does not exist + */ + public function getProperty(string $name) { - if (\count($this->patches) === 0) { - return; - } - // Load first patch - $patchIdx = 0; - list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; - // We use a manual loop over the tokens, because we modify the array on the fly - $pos = 0; - for ($i = 0, $c = \count($this->tokens); $i < $c; $i++) { - $token = $this->tokens[$i]; - if (\is_string($token)) { - if ($patchPos === $pos) { - // Only support replacement for string tokens. - \assert($patchType === 'replace'); - $this->tokens[$i] = $patchText; - // Fetch the next patch - $patchIdx++; - if ($patchIdx >= \count($this->patches)) { - // No more patches, we're done - return; + foreach ($this->stmts as $stmt) { + if ($stmt instanceof Property) { + foreach ($stmt->props as $prop) { + if ($prop instanceof PropertyProperty && $name === $prop->name->toString()) { + return $stmt; } - list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; } - $pos += \strlen($token); - continue; } - $len = \strlen($token[1]); - $posDelta = 0; - while ($patchPos >= $pos && $patchPos < $pos + $len) { - $patchTextLen = \strlen($patchText); - if ($patchType === 'remove') { - if ($patchPos === $pos && $patchTextLen === $len) { - // Remove token entirely - \array_splice($this->tokens, $i, 1, []); - $i--; - $c--; - } else { - // Remove from token string - $this->tokens[$i][1] = \substr_replace($token[1], '', $patchPos - $pos + $posDelta, $patchTextLen); - $posDelta -= $patchTextLen; - } - } elseif ($patchType === 'add') { - // Insert into the token string - $this->tokens[$i][1] = \substr_replace($token[1], $patchText, $patchPos - $pos + $posDelta, 0); - $posDelta += $patchTextLen; - } else { - if ($patchType === 'replace') { - // Replace inside the token string - $this->tokens[$i][1] = \substr_replace($token[1], $patchText, $patchPos - $pos + $posDelta, $patchTextLen); - } else { - \assert(\false); - } - } - // Fetch the next patch - $patchIdx++; - if ($patchIdx >= \count($this->patches)) { - // No more patches, we're done - return; - } - list($patchPos, $patchType, $patchText) = $this->patches[$patchIdx]; - // Multiple patches may apply to the same token. Reload the current one to check - // If the new patch applies - $token = $this->tokens[$i]; + } + return null; + } + /** + * Gets all methods defined directly in this class/interface/trait + * + * @return ClassMethod[] + */ + public function getMethods() : array + { + $methods = []; + foreach ($this->stmts as $stmt) { + if ($stmt instanceof ClassMethod) { + $methods[] = $stmt; } - $pos += $len; } - // A patch did not apply - \assert(\false); + return $methods; } /** - * Fixup line and position information in errors. + * Gets method with the given name defined directly in this class/interface/trait. * - * @param Error[] $errors + * @param string $name Name of the method (compared case-insensitively) + * + * @return ClassMethod|null Method node or null if the method does not exist */ - private function fixupErrors(array $errors) + public function getMethod(string $name) { - foreach ($errors as $error) { - $attrs = $error->getAttributes(); - $posDelta = 0; - $lineDelta = 0; - foreach ($this->patches as $patch) { - list($patchPos, $patchType, $patchText) = $patch; - if ($patchPos >= $attrs['startFilePos']) { - // No longer relevant - break; - } - if ($patchType === 'add') { - $posDelta += \strlen($patchText); - $lineDelta += \substr_count($patchText, "\n"); - } else { - if ($patchType === 'remove') { - $posDelta -= \strlen($patchText); - $lineDelta -= \substr_count($patchText, "\n"); - } - } + $lowerName = \strtolower($name); + foreach ($this->stmts as $stmt) { + if ($stmt instanceof ClassMethod && $lowerName === $stmt->name->toLowerString()) { + return $stmt; } - $attrs['startFilePos'] += $posDelta; - $attrs['endFilePos'] += $posDelta; - $attrs['startLine'] += $lineDelta; - $attrs['endLine'] += $lineDelta; - $error->setAttributes($attrs); } + return null; } } [aliasName => originalName]] */ - protected $aliases = []; - /** @var Name[][] Same as $aliases but preserving original case */ - protected $origAliases = []; - /** @var ErrorHandler Error handler */ - protected $errorHandler; + /** @var int Flags */ + public $flags; + /** @var bool Whether to return by reference */ + public $byRef; + /** @var Node\Identifier Name */ + public $name; + /** @var Node\Param[] Parameters */ + public $params; + /** @var null|Node\Identifier|Node\Name|Node\ComplexType Return type */ + public $returnType; + /** @var Node\Stmt[]|null Statements */ + public $stmts; + /** @var Node\AttributeGroup[] PHP attribute groups */ + public $attrGroups; + private static $magicNames = ['__construct' => \true, '__destruct' => \true, '__call' => \true, '__callstatic' => \true, '__get' => \true, '__set' => \true, '__isset' => \true, '__unset' => \true, '__sleep' => \true, '__wakeup' => \true, '__tostring' => \true, '__set_state' => \true, '__clone' => \true, '__invoke' => \true, '__debuginfo' => \true, '__serialize' => \true, '__unserialize' => \true]; /** - * Create a name context. + * Constructs a class method node. * - * @param ErrorHandler $errorHandler Error handling used to report errors + * @param string|Node\Identifier $name Name + * @param array $subNodes Array of the following optional subnodes: + * 'flags => MODIFIER_PUBLIC: Flags + * 'byRef' => false : Whether to return by reference + * 'params' => array() : Parameters + * 'returnType' => null : Return type + * 'stmts' => array() : Statements + * 'attrGroups' => array() : PHP attribute groups + * @param array $attributes Additional attributes */ - public function __construct(ErrorHandler $errorHandler) + public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->errorHandler = $errorHandler; + $this->attributes = $attributes; + $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; + $this->byRef = $subNodes['byRef'] ?? \false; + $this->name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->params = $subNodes['params'] ?? []; + $returnType = $subNodes['returnType'] ?? null; + $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->stmts = \array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + } + public function getSubNodeNames() : array + { + return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'returnType', 'stmts']; + } + public function returnsByRef() : bool + { + return $this->byRef; + } + public function getParams() : array + { + return $this->params; + } + public function getReturnType() + { + return $this->returnType; + } + public function getStmts() + { + return $this->stmts; + } + public function getAttrGroups() : array + { + return $this->attrGroups; } /** - * Start a new namespace. - * - * This also resets the alias table. + * Whether the method is explicitly or implicitly public. * - * @param Name|null $namespace Null is the global namespace + * @return bool */ - public function startNamespace(Name $namespace = null) + public function isPublic() : bool { - $this->namespace = $namespace; - $this->origAliases = $this->aliases = [Stmt\Use_::TYPE_NORMAL => [], Stmt\Use_::TYPE_FUNCTION => [], Stmt\Use_::TYPE_CONSTANT => []]; + return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; } /** - * Add an alias / import. + * Whether the method is protected. * - * @param Name $name Original name - * @param string $aliasName Aliased name - * @param int $type One of Stmt\Use_::TYPE_* - * @param array $errorAttrs Attributes to use to report an error + * @return bool */ - public function addAlias(Name $name, string $aliasName, int $type, array $errorAttrs = []) + public function isProtected() : bool { - // Constant names are case sensitive, everything else case insensitive - if ($type === Stmt\Use_::TYPE_CONSTANT) { - $aliasLookupName = $aliasName; - } else { - $aliasLookupName = \strtolower($aliasName); - } - if (isset($this->aliases[$type][$aliasLookupName])) { - $typeStringMap = [Stmt\Use_::TYPE_NORMAL => '', Stmt\Use_::TYPE_FUNCTION => 'function ', Stmt\Use_::TYPE_CONSTANT => 'const ']; - $this->errorHandler->handleError(new Error(\sprintf('Cannot use %s%s as %s because the name is already in use', $typeStringMap[$type], $name, $aliasName), $errorAttrs)); - return; - } - $this->aliases[$type][$aliasLookupName] = $name; - $this->origAliases[$type][$aliasName] = $name; + return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); } /** - * Get current namespace. + * Whether the method is private. * - * @return null|Name Namespace (or null if global namespace) + * @return bool */ - public function getNamespace() + public function isPrivate() : bool { - return $this->namespace; + return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); } /** - * Get resolved name. - * - * @param Name $name Name to resolve - * @param int $type One of Stmt\Use_::TYPE_{FUNCTION|CONSTANT} + * Whether the method is abstract. * - * @return null|Name Resolved name, or null if static resolution is not possible + * @return bool */ - public function getResolvedName(Name $name, int $type) + public function isAbstract() : bool { - // don't resolve special class names - if ($type === Stmt\Use_::TYPE_NORMAL && $name->isSpecialClassName()) { - if (!$name->isUnqualified()) { - $this->errorHandler->handleError(new Error(\sprintf("'\\%s' is an invalid class name", $name->toString()), $name->getAttributes())); - } - return $name; - } - // fully qualified names are already resolved - if ($name->isFullyQualified()) { - return $name; - } - // Try to resolve aliases - if (null !== ($resolvedName = $this->resolveAlias($name, $type))) { - return $resolvedName; - } - if ($type !== Stmt\Use_::TYPE_NORMAL && $name->isUnqualified()) { - if (null === $this->namespace) { - // outside of a namespace unaliased unqualified is same as fully qualified - return new FullyQualified($name, $name->getAttributes()); - } - // Cannot resolve statically - return null; - } - // if no alias exists prepend current namespace - return FullyQualified::concat($this->namespace, $name, $name->getAttributes()); + return (bool) ($this->flags & Class_::MODIFIER_ABSTRACT); } /** - * Get resolved class name. - * - * @param Name $name Class ame to resolve + * Whether the method is final. * - * @return Name Resolved name + * @return bool */ - public function getResolvedClassName(Name $name) : Name + public function isFinal() : bool { - return $this->getResolvedName($name, Stmt\Use_::TYPE_NORMAL); + return (bool) ($this->flags & Class_::MODIFIER_FINAL); } /** - * Get possible ways of writing a fully qualified name (e.g., by making use of aliases). - * - * @param string $name Fully-qualified name (without leading namespace separator) - * @param int $type One of Stmt\Use_::TYPE_* + * Whether the method is static. * - * @return Name[] Possible representations of the name + * @return bool */ - public function getPossibleNames(string $name, int $type) : array + public function isStatic() : bool { - $lcName = \strtolower($name); - if ($type === Stmt\Use_::TYPE_NORMAL) { - // self, parent and static must always be unqualified - if ($lcName === "self" || $lcName === "parent" || $lcName === "static") { - return [new Name($name)]; - } - } - // Collect possible ways to write this name, starting with the fully-qualified name - $possibleNames = [new FullyQualified($name)]; - if (null !== ($nsRelativeName = $this->getNamespaceRelativeName($name, $lcName, $type))) { - // Make sure there is no alias that makes the normally namespace-relative name - // into something else - if (null === $this->resolveAlias($nsRelativeName, $type)) { - $possibleNames[] = $nsRelativeName; - } - } - // Check for relevant namespace use statements - foreach ($this->origAliases[Stmt\Use_::TYPE_NORMAL] as $alias => $orig) { - $lcOrig = $orig->toLowerString(); - if (0 === \strpos($lcName, $lcOrig . '\\')) { - $possibleNames[] = new Name($alias . \substr($name, \strlen($lcOrig))); - } - } - // Check for relevant type-specific use statements - foreach ($this->origAliases[$type] as $alias => $orig) { - if ($type === Stmt\Use_::TYPE_CONSTANT) { - // Constants are are complicated-sensitive - $normalizedOrig = $this->normalizeConstName($orig->toString()); - if ($normalizedOrig === $this->normalizeConstName($name)) { - $possibleNames[] = new Name($alias); - } - } else { - // Everything else is case-insensitive - if ($orig->toLowerString() === $lcName) { - $possibleNames[] = new Name($alias); - } - } - } - return $possibleNames; + return (bool) ($this->flags & Class_::MODIFIER_STATIC); } /** - * Get shortest representation of this fully-qualified name. - * - * @param string $name Fully-qualified name (without leading namespace separator) - * @param int $type One of Stmt\Use_::TYPE_* + * Whether the method is magic. * - * @return Name Shortest representation + * @return bool */ - public function getShortName(string $name, int $type) : Name - { - $possibleNames = $this->getPossibleNames($name, $type); - // Find shortest name - $shortestName = null; - $shortestLength = \INF; - foreach ($possibleNames as $possibleName) { - $length = \strlen($possibleName->toCodeString()); - if ($length < $shortestLength) { - $shortestName = $possibleName; - $shortestLength = $length; - } - } - return $shortestName; - } - private function resolveAlias(Name $name, $type) - { - $firstPart = $name->getFirst(); - if ($name->isQualified()) { - // resolve aliases for qualified names, always against class alias table - $checkName = \strtolower($firstPart); - if (isset($this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName])) { - $alias = $this->aliases[Stmt\Use_::TYPE_NORMAL][$checkName]; - return FullyQualified::concat($alias, $name->slice(1), $name->getAttributes()); - } - } elseif ($name->isUnqualified()) { - // constant aliases are case-sensitive, function aliases case-insensitive - $checkName = $type === Stmt\Use_::TYPE_CONSTANT ? $firstPart : \strtolower($firstPart); - if (isset($this->aliases[$type][$checkName])) { - // resolve unqualified aliases - return new FullyQualified($this->aliases[$type][$checkName], $name->getAttributes()); - } - } - // No applicable aliases - return null; - } - private function getNamespaceRelativeName(string $name, string $lcName, int $type) + public function isMagic() : bool { - if (null === $this->namespace) { - return new Name($name); - } - if ($type === Stmt\Use_::TYPE_CONSTANT) { - // The constants true/false/null always resolve to the global symbols, even inside a - // namespace, so they may be used without qualification - if ($lcName === "true" || $lcName === "false" || $lcName === "null") { - return new Name($name); - } - } - $namespacePrefix = \strtolower($this->namespace . '\\'); - if (0 === \strpos($lcName, $namespacePrefix)) { - return new Name(\substr($name, \strlen($namespacePrefix))); - } - return null; + return isset(self::$magicNames[$this->name->toLowerString()]); } - private function normalizeConstName(string $name) + public function getType() : string { - $nsSep = \strrpos($name, '\\'); - if (\false === $nsSep) { - return $name; - } - // Constants have case-insensitive namespace and case-sensitive short-name - $ns = \substr($name, 0, $nsSep); - $shortName = \substr($name, $nsSep + 1); - return \strtolower($ns) . '\\' . $shortName; + return 'Stmt_ClassMethod'; } } 0 : Flags + * 'extends' => null : Name of extended class + * 'implements' => array(): Names of implemented interfaces + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes */ - public function __construct(string $text, int $startLine = -1, int $startFilePos = -1, int $startTokenPos = -1, int $endLine = -1, int $endFilePos = -1, int $endTokenPos = -1) + public function __construct($name, array $subNodes = [], array $attributes = []) { - $this->text = $text; - $this->startLine = $startLine; - $this->startFilePos = $startFilePos; - $this->startTokenPos = $startTokenPos; - $this->endLine = $endLine; - $this->endFilePos = $endFilePos; - $this->endTokenPos = $endTokenPos; + $this->attributes = $attributes; + $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; + $this->name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->extends = $subNodes['extends'] ?? null; + $this->implements = $subNodes['implements'] ?? []; + $this->stmts = $subNodes['stmts'] ?? []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + } + public function getSubNodeNames() : array + { + return ['attrGroups', 'flags', 'name', 'extends', 'implements', 'stmts']; } /** - * Gets the comment text. + * Whether the class is explicitly abstract. * - * @return string The comment text (including comment delimiters like /*) + * @return bool */ - public function getText() : string + public function isAbstract() : bool { - return $this->text; + return (bool) ($this->flags & self::MODIFIER_ABSTRACT); } /** - * Gets the line number the comment started on. + * Whether the class is final. * - * @return int Line number (or -1 if not available) + * @return bool */ - public function getStartLine() : int + public function isFinal() : bool { - return $this->startLine; + return (bool) ($this->flags & self::MODIFIER_FINAL); } - /** - * Gets the file offset the comment started on. - * - * @return int File offset (or -1 if not available) - */ - public function getStartFilePos() : int + public function isReadonly() : bool { - return $this->startFilePos; + return (bool) ($this->flags & self::MODIFIER_READONLY); } /** - * Gets the token offset the comment started on. + * Whether the class is anonymous. * - * @return int Token offset (or -1 if not available) + * @return bool */ - public function getStartTokenPos() : int + public function isAnonymous() : bool { - return $this->startTokenPos; + return null === $this->name; } /** - * Gets the line number the comment ends on. - * - * @return int Line number (or -1 if not available) + * @internal */ - public function getEndLine() : int + public static function verifyClassModifier($a, $b) { - return $this->endLine; + if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { + throw new Error('Multiple abstract modifiers are not allowed'); + } + if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { + throw new Error('Multiple final modifiers are not allowed'); + } + if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { + throw new Error('Multiple readonly modifiers are not allowed'); + } + if ($a & 48 && $b & 48) { + throw new Error('Cannot use the final modifier on an abstract class'); + } } /** - * Gets the file offset the comment ends on. - * - * @return int File offset (or -1 if not available) + * @internal */ - public function getEndFilePos() : int + public static function verifyModifier($a, $b) { - return $this->endFilePos; + if ($a & self::VISIBILITY_MODIFIER_MASK && $b & self::VISIBILITY_MODIFIER_MASK) { + throw new Error('Multiple access type modifiers are not allowed'); + } + if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { + throw new Error('Multiple abstract modifiers are not allowed'); + } + if ($a & self::MODIFIER_STATIC && $b & self::MODIFIER_STATIC) { + throw new Error('Multiple static modifiers are not allowed'); + } + if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { + throw new Error('Multiple final modifiers are not allowed'); + } + if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { + throw new Error('Multiple readonly modifiers are not allowed'); + } + if ($a & 48 && $b & 48) { + throw new Error('Cannot use the final modifier on an abstract class member'); + } } - /** - * Gets the token offset the comment ends on. - * - * @return int Token offset (or -1 if not available) - */ - public function getEndTokenPos() : int + public function getType() : string { - return $this->endTokenPos; + return 'Stmt_Class'; } +} +startLine; + $this->attributes = $attributes; + $this->consts = $consts; + } + public function getSubNodeNames() : array + { + return ['consts']; } + public function getType() : string + { + return 'Stmt_Const'; + } +} +startFilePos; + $this->attributes = $attributes; + $this->num = $num; + } + public function getSubNodeNames() : array + { + return ['num']; + } + public function getType() : string + { + return 'Stmt_Continue'; } +} +value pair node. * - * @return int Token offset + * @param string|Node\Identifier $key Key + * @param Node\Expr $value Value + * @param array $attributes Additional attributes */ - public function getTokenPos() : int + public function __construct($key, Node\Expr $value, array $attributes = []) { - return $this->startTokenPos; + $this->attributes = $attributes; + $this->key = \is_string($key) ? new Node\Identifier($key) : $key; + $this->value = $value; + } + public function getSubNodeNames() : array + { + return ['key', 'value']; + } + public function getType() : string + { + return 'Stmt_DeclareDeclare'; } +} +text; + $this->attributes = $attributes; + $this->declares = $declares; + $this->stmts = $stmts; + } + public function getSubNodeNames() : array + { + return ['declares', 'stmts']; + } + public function getType() : string + { + return 'Stmt_Declare'; } +} +text); - $newlinePos = \strpos($text, "\n"); - if (\false === $newlinePos) { - // Single line comments don't need further processing - return $text; - } elseif (\preg_match('((*BSR_ANYCRLF)(*ANYCRLF)^.*(?:\\R\\s+\\*.*)+$)', $text)) { - // Multi line comment of the type - // - // /* - // * Some text. - // * Some more text. - // */ - // - // is handled by replacing the whitespace sequences before the * by a single space - return \preg_replace('(^\\s+\\*)m', ' *', $this->text); - } elseif (\preg_match('(^/\\*\\*?\\s*[\\r\\n])', $text) && \preg_match('(\\n(\\s*)\\*/$)', $text, $matches)) { - // Multi line comment of the type - // - // /* - // Some text. - // Some more text. - // */ - // - // is handled by removing the whitespace sequence on the line before the closing - // */ on all lines. So if the last line is " */", then " " is removed at the - // start of all lines. - return \preg_replace('(^' . \preg_quote($matches[1]) . ')m', '', $text); - } elseif (\preg_match('(^/\\*\\*?\\s*(?!\\s))', $text, $matches)) { - // Multi line comment of the type - // - // /* Some text. - // Some more text. - // Indented text. - // Even more text. */ - // - // is handled by removing the difference between the shortest whitespace prefix on all - // lines and the length of the "/* " opening sequence. - $prefixLen = $this->getShortestWhitespacePrefixLen(\substr($text, $newlinePos + 1)); - $removeLen = $prefixLen - \strlen($matches[0]); - return \preg_replace('(^\\s{' . $removeLen . '})m', '', $text); - } - // No idea how to format this comment, so simply return as is - return $text; + $this->attributes = $attributes; + $this->cond = $cond; + $this->stmts = $stmts; + } + public function getSubNodeNames() : array + { + return ['stmts', 'cond']; + } + public function getType() : string + { + return 'Stmt_Do'; } +} +attributes = $attributes; + $this->exprs = $exprs; } - /** - * @return array - * @psalm-return array{nodeType:string, text:mixed, line:mixed, filePos:mixed} - */ - public function jsonSerialize() : array + public function getSubNodeNames() : array { - // Technically not a node, but we make it look like one anyway - $type = $this instanceof Comment\Doc ? 'Comment_Doc' : 'Comment'; - return [ - 'nodeType' => $type, - 'text' => $this->text, - // TODO: Rename these to include "start". - 'line' => $this->startLine, - 'filePos' => $this->startFilePos, - 'tokenPos' => $this->startTokenPos, - 'endLine' => $this->endLine, - 'endFilePos' => $this->endFilePos, - 'endTokenPos' => $this->endTokenPos, - ]; + return ['exprs']; + } + public function getType() : string + { + return 'Stmt_Echo'; } } lexer = $lexer; - if (isset($options['throwOnError'])) { - throw new \LogicException('"throwOnError" is no longer supported, use "errorHandler" instead'); - } - $this->initReduceCallbacks(); + $this->attributes = $attributes; + $this->cond = $cond; + $this->stmts = $stmts; + } + public function getSubNodeNames() : array + { + return ['cond', 'stmts']; + } + public function getType() : string + { + return 'Stmt_ElseIf'; } +} +errorHandler = $errorHandler ?: new ErrorHandler\Throwing(); - $this->lexer->startLexing($code, $this->errorHandler); - $result = $this->doParse(); - // Clear out some of the interior state, so we don't hold onto unnecessary - // memory between uses of the parser - $this->startAttributeStack = []; - $this->endAttributeStack = []; - $this->semStack = []; - $this->semValue = null; - return $result; + $this->attributes = $attributes; + $this->stmts = $stmts; } - protected function doParse() + public function getSubNodeNames() : array { - // We start off with no lookahead-token - $symbol = self::SYMBOL_NONE; - // The attributes for a node are taken from the first and last token of the node. - // From the first token only the startAttributes are taken and from the last only - // the endAttributes. Both are merged using the array union operator (+). - $startAttributes = []; - $endAttributes = []; - $this->endAttributes = $endAttributes; - // Keep stack of start and end attributes - $this->startAttributeStack = []; - $this->endAttributeStack = [$endAttributes]; - // Start off in the initial state and keep a stack of previous states - $state = 0; - $stateStack = [$state]; - // Semantic value stack (contains values of tokens and semantic action results) - $this->semStack = []; - // Current position in the stack(s) - $stackPos = 0; - $this->errorState = 0; - for (;;) { - //$this->traceNewState($state, $symbol); - if ($this->actionBase[$state] === 0) { - $rule = $this->actionDefault[$state]; - } else { - if ($symbol === self::SYMBOL_NONE) { - // Fetch the next token id from the lexer and fetch additional info by-ref. - // The end attributes are fetched into a temporary variable and only set once the token is really - // shifted (not during read). Otherwise you would sometimes get off-by-one errors, when a rule is - // reduced after a token was read but not yet shifted. - $tokenId = $this->lexer->getNextToken($tokenValue, $startAttributes, $endAttributes); - // map the lexer token id to the internally used symbols - $symbol = $tokenId >= 0 && $tokenId < $this->tokenToSymbolMapSize ? $this->tokenToSymbol[$tokenId] : $this->invalidSymbol; - if ($symbol === $this->invalidSymbol) { - throw new \RangeException(\sprintf('The lexer returned an invalid token (id=%d, value=%s)', $tokenId, $tokenValue)); - } - // Allow productions to access the start attributes of the lookahead token. - $this->lookaheadStartAttributes = $startAttributes; - //$this->traceRead($symbol); - } - $idx = $this->actionBase[$state] + $symbol; - if (($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol) && ($action = $this->action[$idx]) !== $this->defaultAction) { - /* - * >= numNonLeafStates: shift and reduce - * > 0: shift - * = 0: accept - * < 0: reduce - * = -YYUNEXPECTED: error - */ - if ($action > 0) { - /* shift */ - //$this->traceShift($symbol); - ++$stackPos; - $stateStack[$stackPos] = $state = $action; - $this->semStack[$stackPos] = $tokenValue; - $this->startAttributeStack[$stackPos] = $startAttributes; - $this->endAttributeStack[$stackPos] = $endAttributes; - $this->endAttributes = $endAttributes; - $symbol = self::SYMBOL_NONE; - if ($this->errorState) { - --$this->errorState; - } - if ($action < $this->numNonLeafStates) { - continue; - } - /* $yyn >= numNonLeafStates means shift-and-reduce */ - $rule = $action - $this->numNonLeafStates; - } else { - $rule = -$action; - } - } else { - $rule = $this->actionDefault[$state]; - } - } - for (;;) { - if ($rule === 0) { - /* accept */ - //$this->traceAccept(); - return $this->semValue; - } elseif ($rule !== $this->unexpectedTokenRule) { - /* reduce */ - //$this->traceReduce($rule); - try { - $this->reduceCallbacks[$rule]($stackPos); - } catch (Error $e) { - if (-1 === $e->getStartLine() && isset($startAttributes['startLine'])) { - $e->setStartLine($startAttributes['startLine']); - } - $this->emitError($e); - // Can't recover from this type of error - return null; - } - /* Goto - shift nonterminal */ - $lastEndAttributes = $this->endAttributeStack[$stackPos]; - $ruleLength = $this->ruleToLength[$rule]; - $stackPos -= $ruleLength; - $nonTerminal = $this->ruleToNonTerminal[$rule]; - $idx = $this->gotoBase[$nonTerminal] + $stateStack[$stackPos]; - if ($idx >= 0 && $idx < $this->gotoTableSize && $this->gotoCheck[$idx] === $nonTerminal) { - $state = $this->goto[$idx]; - } else { - $state = $this->gotoDefault[$nonTerminal]; - } - ++$stackPos; - $stateStack[$stackPos] = $state; - $this->semStack[$stackPos] = $this->semValue; - $this->endAttributeStack[$stackPos] = $lastEndAttributes; - if ($ruleLength === 0) { - // Empty productions use the start attributes of the lookahead token. - $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; - } - } else { - /* error */ - switch ($this->errorState) { - case 0: - $msg = $this->getErrorMessage($symbol, $state); - $this->emitError(new Error($msg, $startAttributes + $endAttributes)); - // Break missing intentionally - case 1: - case 2: - $this->errorState = 3; - // Pop until error-expecting state uncovered - while (!(($idx = $this->actionBase[$state] + $this->errorSymbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $this->errorSymbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) || ($action = $this->action[$idx]) === $this->defaultAction) { - // Not totally sure about this - if ($stackPos <= 0) { - // Could not recover from error - return null; - } - $state = $stateStack[--$stackPos]; - //$this->tracePop($state); - } - //$this->traceShift($this->errorSymbol); - ++$stackPos; - $stateStack[$stackPos] = $state = $action; - // We treat the error symbol as being empty, so we reset the end attributes - // to the end attributes of the last non-error symbol - $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; - $this->endAttributeStack[$stackPos] = $this->endAttributeStack[$stackPos - 1]; - $this->endAttributes = $this->endAttributeStack[$stackPos - 1]; - break; - case 3: - if ($symbol === 0) { - // Reached EOF without recovering from error - return null; - } - //$this->traceDiscard($symbol); - $symbol = self::SYMBOL_NONE; - break 2; - } - } - if ($state < $this->numNonLeafStates) { - break; - } - /* >= numNonLeafStates means shift-and-reduce */ - $rule = $state - $this->numNonLeafStates; - } - } - throw new \RuntimeException('Reached end of parser loop'); + return ['stmts']; } - protected function emitError(Error $error) + public function getType() : string { - $this->errorHandler->handleError($error); + return 'Stmt_Else'; } +} +getExpectedTokens($state)) { - $expectedString = ', expecting ' . \implode(' or ', $expected); - } - return 'Syntax error, unexpected ' . $this->symbolToName[$symbol] . $expectedString; + parent::__construct($attributes); + $this->name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->expr = $expr; + $this->attrGroups = $attrGroups; } - /** - * Get limited number of expected tokens in given state. - * - * @param int $state State - * - * @return string[] Expected tokens. If too many, an empty array is returned. - */ - protected function getExpectedTokens(int $state) : array + public function getSubNodeNames() : array { - $expected = []; - $base = $this->actionBase[$state]; - foreach ($this->symbolToName as $symbol => $name) { - $idx = $base + $symbol; - if ($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol) { - if ($this->action[$idx] !== $this->unexpectedTokenRule && $this->action[$idx] !== $this->defaultAction && $symbol !== $this->errorSymbol) { - if (\count($expected) === 4) { - /* Too many expected tokens */ - return []; - } - $expected[] = $name; - } - } - } - return $expected; - } - /* - * Tracing functions used for debugging the parser. - */ - /* - protected function traceNewState($state, $symbol) { - echo '% State ' . $state - . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . "\n"; - } - - protected function traceRead($symbol) { - echo '% Reading ' . $this->symbolToName[$symbol] . "\n"; - } - - protected function traceShift($symbol) { - echo '% Shift ' . $this->symbolToName[$symbol] . "\n"; - } - - protected function traceAccept() { - echo "% Accepted.\n"; - } - - protected function traceReduce($n) { - echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . "\n"; - } - - protected function tracePop($state) { - echo '% Recovering, uncovered state ' . $state . "\n"; + return ['attrGroups', 'name', 'expr']; } - - protected function traceDiscard($symbol) { - echo '% Discard ' . $this->symbolToName[$symbol] . "\n"; + public function getType() : string + { + return 'Stmt_EnumCase'; } - */ - /* - * Helper functions invoked by semantic actions - */ +} +stmts and checks various error conditions. - * - * @param Node\Stmt[] $stmts - * @return Node\Stmt[] + * @param string|Node\Identifier|null $name Name + * @param array $subNodes Array of the following optional subnodes: + * 'scalarType' => null : Scalar type + * 'implements' => array() : Names of implemented interfaces + * 'stmts' => array() : Statements + * 'attrGroups' => array() : PHP attribute groups + * @param array $attributes Additional attributes */ - protected function handleNamespaces(array $stmts) : array + public function __construct($name, array $subNodes = [], array $attributes = []) { - $hasErrored = \false; - $style = $this->getNamespacingStyle($stmts); - if (null === $style) { - // not namespaced, nothing to do - return $stmts; - } elseif ('brace' === $style) { - // For braced namespaces we only have to check that there are no invalid statements between the namespaces - $afterFirstNamespace = \false; - foreach ($stmts as $stmt) { - if ($stmt instanceof Node\Stmt\Namespace_) { - $afterFirstNamespace = \true; - } elseif (!$stmt instanceof Node\Stmt\HaltCompiler && !$stmt instanceof Node\Stmt\Nop && $afterFirstNamespace && !$hasErrored) { - $this->emitError(new Error('No code may exist outside of namespace {}', $stmt->getAttributes())); - $hasErrored = \true; - // Avoid one error for every statement - } - } - return $stmts; - } else { - // For semicolon namespaces we have to move the statements after a namespace declaration into ->stmts - $resultStmts = []; - $targetStmts =& $resultStmts; - $lastNs = null; - foreach ($stmts as $stmt) { - if ($stmt instanceof Node\Stmt\Namespace_) { - if ($lastNs !== null) { - $this->fixupNamespaceAttributes($lastNs); - } - if ($stmt->stmts === null) { - $stmt->stmts = []; - $targetStmts =& $stmt->stmts; - $resultStmts[] = $stmt; - } else { - // This handles the invalid case of mixed style namespaces - $resultStmts[] = $stmt; - $targetStmts =& $resultStmts; - } - $lastNs = $stmt; - } elseif ($stmt instanceof Node\Stmt\HaltCompiler) { - // __halt_compiler() is not moved into the namespace - $resultStmts[] = $stmt; - } else { - $targetStmts[] = $stmt; - } - } - if ($lastNs !== null) { - $this->fixupNamespaceAttributes($lastNs); - } - return $resultStmts; - } + $this->name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->scalarType = $subNodes['scalarType'] ?? null; + $this->implements = $subNodes['implements'] ?? []; + $this->stmts = $subNodes['stmts'] ?? []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + parent::__construct($attributes); } - private function fixupNamespaceAttributes(Node\Stmt\Namespace_ $stmt) + public function getSubNodeNames() : array { - // We moved the statements into the namespace node, as such the end of the namespace node - // needs to be extended to the end of the statements. - if (empty($stmt->stmts)) { - return; - } - // We only move the builtin end attributes here. This is the best we can do with the - // knowledge we have. - $endAttributes = ['endLine', 'endFilePos', 'endTokenPos']; - $lastStmt = $stmt->stmts[\count($stmt->stmts) - 1]; - foreach ($endAttributes as $endAttribute) { - if ($lastStmt->hasAttribute($endAttribute)) { - $stmt->setAttribute($endAttribute, $lastStmt->getAttribute($endAttribute)); - } - } + return ['attrGroups', 'name', 'scalarType', 'implements', 'stmts']; } - /** - * Determine namespacing style (semicolon or brace) - * - * @param Node[] $stmts Top-level statements. - * - * @return null|string One of "semicolon", "brace" or null (no namespaces) - */ - private function getNamespacingStyle(array $stmts) + public function getType() : string { - $style = null; - $hasNotAllowedStmts = \false; - foreach ($stmts as $i => $stmt) { - if ($stmt instanceof Node\Stmt\Namespace_) { - $currentStyle = null === $stmt->stmts ? 'semicolon' : 'brace'; - if (null === $style) { - $style = $currentStyle; - if ($hasNotAllowedStmts) { - $this->emitError(new Error('Namespace declaration statement has to be the very first statement in the script', $stmt->getLine())); - } - } elseif ($style !== $currentStyle) { - $this->emitError(new Error('Cannot mix bracketed namespace declarations with unbracketed namespace declarations', $stmt->getLine())); - // Treat like semicolon style for namespace normalization - return 'semicolon'; - } - continue; - } - /* declare(), __halt_compiler() and nops can be used before a namespace declaration */ - if ($stmt instanceof Node\Stmt\Declare_ || $stmt instanceof Node\Stmt\HaltCompiler || $stmt instanceof Node\Stmt\Nop) { - continue; - } - /* There may be a hashbang line at the very start of the file */ - if ($i === 0 && $stmt instanceof Node\Stmt\InlineHTML && \preg_match('/\\A#!.*\\r?\\n\\z/', $stmt->value)) { - continue; - } - /* Everything else if forbidden before namespace declarations */ - $hasNotAllowedStmts = \true; - } - return $style; + return 'Stmt_Enum'; } +} +name instanceof VarLikeIdentifier ? $prop->name->toString() : $prop->name; - $var = new Expr\Variable($name, $prop->name->getAttributes()); - return new Expr\StaticCall($prop->class, $var, $args, $attributes); - } elseif ($prop instanceof Node\Expr\ArrayDimFetch) { - $tmp = $prop; - while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { - $tmp = $tmp->var; - } - /** @var Expr\StaticPropertyFetch $staticProp */ - $staticProp = $tmp->var; - // Set start attributes to attributes of innermost node - $tmp = $prop; - $this->fixupStartAttributes($tmp, $staticProp->name); - while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { - $tmp = $tmp->var; - $this->fixupStartAttributes($tmp, $staticProp->name); - } - $name = $staticProp->name instanceof VarLikeIdentifier ? $staticProp->name->toString() : $staticProp->name; - $tmp->var = new Expr\Variable($name, $staticProp->name->getAttributes()); - return new Expr\StaticCall($staticProp->class, $prop, $args, $attributes); - } else { - throw new \Exception(); - } + $this->attributes = $attributes; + $this->expr = $expr; } - protected function fixupStartAttributes(Node $to, Node $from) + public function getSubNodeNames() : array { - $startAttributes = ['startLine', 'startFilePos', 'startTokenPos']; - foreach ($startAttributes as $startAttribute) { - if ($from->hasAttribute($startAttribute)) { - $to->setAttribute($startAttribute, $from->getAttribute($startAttribute)); - } - } + return ['expr']; } - protected function handleBuiltinTypes(Name $name) + public function getType() : string { - $builtinTypes = ['bool' => \true, 'int' => \true, 'float' => \true, 'string' => \true, 'iterable' => \true, 'void' => \true, 'object' => \true, 'null' => \true, 'false' => \true, 'mixed' => \true, 'never' => \true]; - if (!$name->isUnqualified()) { - return $name; - } - $lowerName = $name->toLowerString(); - if (!isset($builtinTypes[$lowerName])) { - return $name; - } - return new Node\Identifier($lowerName, $name->getAttributes()); + return 'Stmt_Expression'; } +} +startAttributeStack[$pos] + $this->endAttributeStack[$pos]; + $this->attributes = $attributes; + $this->stmts = $stmts; } - protected function getFloatCastKind(string $cast) : int + public function getSubNodeNames() : array { - $cast = \strtolower($cast); - if (\strpos($cast, 'float') !== \false) { - return Double::KIND_FLOAT; - } - if (\strpos($cast, 'real') !== \false) { - return Double::KIND_REAL; - } - return Double::KIND_DOUBLE; + return ['stmts']; } - protected function parseLNumber($str, $attributes, $allowInvalidOctal = \false) + public function getType() : string { - try { - return LNumber::fromString($str, $attributes, $allowInvalidOctal); - } catch (Error $error) { - $this->emitError($error); - // Use dummy value - return new LNumber(0, $attributes); - } + return 'Stmt_Finally'; } +} + array(): Init expressions + * 'cond' => array(): Loop conditions + * 'loop' => array(): Loop expressions + * 'stmts' => array(): Statements + * @param array $attributes Additional attributes */ - protected function parseNumString(string $str, array $attributes) + public function __construct(array $subNodes = [], array $attributes = []) { - if (!\preg_match('/^(?:0|-?[1-9][0-9]*)$/', $str)) { - return new String_($str, $attributes); - } - $num = +$str; - if (!\is_int($num)) { - return new String_($str, $attributes); - } - return new LNumber($num, $attributes); + $this->attributes = $attributes; + $this->init = $subNodes['init'] ?? []; + $this->cond = $subNodes['cond'] ?? []; + $this->loop = $subNodes['loop'] ?? []; + $this->stmts = $subNodes['stmts'] ?? []; } - protected function stripIndentation(string $string, int $indentLen, string $indentChar, bool $newlineAtStart, bool $newlineAtEnd, array $attributes) + public function getSubNodeNames() : array { - if ($indentLen === 0) { - return $string; - } - $start = $newlineAtStart ? '(?:(?<=\\n)|\\A)' : '(?<=\\n)'; - $end = $newlineAtEnd ? '(?:(?=[\\r\\n])|\\z)' : '(?=[\\r\\n])'; - $regex = '/' . $start . '([ \\t]*)(' . $end . ')?/'; - return \preg_replace_callback($regex, function ($matches) use($indentLen, $indentChar, $attributes) { - $prefix = \substr($matches[1], 0, $indentLen); - if (\false !== \strpos($prefix, $indentChar === " " ? "\t" : " ")) { - $this->emitError(new Error('Invalid indentation - tabs and spaces cannot be mixed', $attributes)); - } elseif (\strlen($prefix) < $indentLen && !isset($matches[2])) { - $this->emitError(new Error('Invalid body indentation level ' . '(expecting an indentation level of at least ' . $indentLen . ')', $attributes)); - } - return \substr($matches[0], \strlen($prefix)); - }, $string); + return ['init', 'cond', 'loop', 'stmts']; } - protected function parseDocString(string $startToken, $contents, string $endToken, array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape) + public function getType() : string { - $kind = \strpos($startToken, "'") === \false ? String_::KIND_HEREDOC : String_::KIND_NOWDOC; - $regex = '/\\A[bB]?<<<[ \\t]*[\'"]?([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)[\'"]?(?:\\r\\n|\\n|\\r)\\z/'; - $result = \preg_match($regex, $startToken, $matches); - \assert($result === 1); - $label = $matches[1]; - $result = \preg_match('/\\A[ \\t]*/', $endToken, $matches); - \assert($result === 1); - $indentation = $matches[0]; - $attributes['kind'] = $kind; - $attributes['docLabel'] = $label; - $attributes['docIndentation'] = $indentation; - $indentHasSpaces = \false !== \strpos($indentation, " "); - $indentHasTabs = \false !== \strpos($indentation, "\t"); - if ($indentHasSpaces && $indentHasTabs) { - $this->emitError(new Error('Invalid indentation - tabs and spaces cannot be mixed', $endTokenAttributes)); - // Proceed processing as if this doc string is not indented - $indentation = ''; - } - $indentLen = \strlen($indentation); - $indentChar = $indentHasSpaces ? " " : "\t"; - if (\is_string($contents)) { - if ($contents === '') { - return new String_('', $attributes); - } - $contents = $this->stripIndentation($contents, $indentLen, $indentChar, \true, \true, $attributes); - $contents = \preg_replace('~(\\r\\n|\\n|\\r)\\z~', '', $contents); - if ($kind === String_::KIND_HEREDOC) { - $contents = String_::parseEscapeSequences($contents, null, $parseUnicodeEscape); - } - return new String_($contents, $attributes); - } else { - \assert(\count($contents) > 0); - if (!$contents[0] instanceof Node\Scalar\EncapsedStringPart) { - // If there is no leading encapsed string part, pretend there is an empty one - $this->stripIndentation('', $indentLen, $indentChar, \true, \false, $contents[0]->getAttributes()); - } - $newContents = []; - foreach ($contents as $i => $part) { - if ($part instanceof Node\Scalar\EncapsedStringPart) { - $isLast = $i === \count($contents) - 1; - $part->value = $this->stripIndentation($part->value, $indentLen, $indentChar, $i === 0, $isLast, $part->getAttributes()); - $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape); - if ($isLast) { - $part->value = \preg_replace('~(\\r\\n|\\n|\\r)\\z~', '', $part->value); - } - if ('' === $part->value) { - continue; - } - } - $newContents[] = $part; - } - return new Encapsed($newContents, $attributes); - } + return 'Stmt_For'; } +} + null : Variable to assign key to + * 'byRef' => false : Whether to assign value by reference + * 'stmts' => array(): Statements + * @param array $attributes Additional attributes */ - protected function createCommentNopAttributes(array $comments) + public function __construct(Node\Expr $expr, Node\Expr $valueVar, array $subNodes = [], array $attributes = []) { - $comment = $comments[\count($comments) - 1]; - $commentEndLine = $comment->getEndLine(); - $commentEndFilePos = $comment->getEndFilePos(); - $commentEndTokenPos = $comment->getEndTokenPos(); - $attributes = ['comments' => $comments]; - if (-1 !== $commentEndLine) { - $attributes['startLine'] = $commentEndLine; - $attributes['endLine'] = $commentEndLine; - } - if (-1 !== $commentEndFilePos) { - $attributes['startFilePos'] = $commentEndFilePos + 1; - $attributes['endFilePos'] = $commentEndFilePos; - } - if (-1 !== $commentEndTokenPos) { - $attributes['startTokenPos'] = $commentEndTokenPos + 1; - $attributes['endTokenPos'] = $commentEndTokenPos; - } - return $attributes; + $this->attributes = $attributes; + $this->expr = $expr; + $this->keyVar = $subNodes['keyVar'] ?? null; + $this->byRef = $subNodes['byRef'] ?? \false; + $this->valueVar = $valueVar; + $this->stmts = $subNodes['stmts'] ?? []; } - protected function checkModifier($a, $b, $modifierPos) + public function getSubNodeNames() : array { - // Jumping through some hoops here because verifyModifier() is also used elsewhere - try { - Class_::verifyModifier($a, $b); - } catch (Error $error) { - $error->setAttributes($this->getAttributesAt($modifierPos)); - $this->emitError($error); - } + return ['expr', 'keyVar', 'byRef', 'valueVar', 'stmts']; } - protected function checkParam(Param $node) + public function getType() : string { - if ($node->variadic && null !== $node->default) { - $this->emitError(new Error('Variadic parameter cannot have a default value', $node->default->getAttributes())); - } + return 'Stmt_Foreach'; } - protected function checkTryCatch(TryCatch $node) +} + false : Whether to return by reference + * 'params' => array(): Parameters + * 'returnType' => null : Return type + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes + */ + public function __construct($name, array $subNodes = [], array $attributes = []) { - if (empty($node->catches) && null === $node->finally) { - $this->emitError(new Error('Cannot use try without catch or finally', $node->getAttributes())); - } + $this->attributes = $attributes; + $this->byRef = $subNodes['byRef'] ?? \false; + $this->name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->params = $subNodes['params'] ?? []; + $returnType = $subNodes['returnType'] ?? null; + $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; + $this->stmts = $subNodes['stmts'] ?? []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; } - protected function checkNamespace(Namespace_ $node) + public function getSubNodeNames() : array { - if (null !== $node->stmts) { - foreach ($node->stmts as $stmt) { - if ($stmt instanceof Namespace_) { - $this->emitError(new Error('Namespace declarations cannot be nested', $stmt->getAttributes())); - } - } - } + return ['attrGroups', 'byRef', 'name', 'params', 'returnType', 'stmts']; } - private function checkClassName($name, $namePos) + public function returnsByRef() : bool { - if (null !== $name && $name->isSpecialClassName()) { - $this->emitError(new Error(\sprintf('Cannot use \'%s\' as class name as it is reserved', $name), $this->getAttributesAt($namePos))); - } + return $this->byRef; } - private function checkImplementedInterfaces(array $interfaces) + public function getParams() : array { - foreach ($interfaces as $interface) { - if ($interface->isSpecialClassName()) { - $this->emitError(new Error(\sprintf('Cannot use \'%s\' as interface name as it is reserved', $interface), $interface->getAttributes())); - } - } + return $this->params; } - protected function checkClass(Class_ $node, $namePos) + public function getReturnType() { - $this->checkClassName($node->name, $namePos); - if ($node->extends && $node->extends->isSpecialClassName()) { - $this->emitError(new Error(\sprintf('Cannot use \'%s\' as class name as it is reserved', $node->extends), $node->extends->getAttributes())); - } - $this->checkImplementedInterfaces($node->implements); + return $this->returnType; } - protected function checkInterface(Interface_ $node, $namePos) + public function getAttrGroups() : array { - $this->checkClassName($node->name, $namePos); - $this->checkImplementedInterfaces($node->extends); + return $this->attrGroups; } - protected function checkEnum(Enum_ $node, $namePos) + /** @return Node\Stmt[] */ + public function getStmts() : array { - $this->checkClassName($node->name, $namePos); - $this->checkImplementedInterfaces($node->implements); + return $this->stmts; } - protected function checkClassMethod(ClassMethod $node, $modifierPos) + public function getType() : string { - if ($node->flags & Class_::MODIFIER_STATIC) { - switch ($node->name->toLowerString()) { - case '__construct': - $this->emitError(new Error(\sprintf('Constructor %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); - break; - case '__destruct': - $this->emitError(new Error(\sprintf('Destructor %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); - break; - case '__clone': - $this->emitError(new Error(\sprintf('Clone method %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); - break; - } - } - if ($node->flags & Class_::MODIFIER_READONLY) { - $this->emitError(new Error(\sprintf('Method %s() cannot be readonly', $node->name), $this->getAttributesAt($modifierPos))); - } + return 'Stmt_Function'; } - protected function checkClassConst(ClassConst $node, $modifierPos) +} +flags & Class_::MODIFIER_STATIC) { - $this->emitError(new Error("Cannot use 'static' as constant modifier", $this->getAttributesAt($modifierPos))); - } - if ($node->flags & Class_::MODIFIER_ABSTRACT) { - $this->emitError(new Error("Cannot use 'abstract' as constant modifier", $this->getAttributesAt($modifierPos))); - } - if ($node->flags & Class_::MODIFIER_READONLY) { - $this->emitError(new Error("Cannot use 'readonly' as constant modifier", $this->getAttributesAt($modifierPos))); - } + $this->attributes = $attributes; + $this->vars = $vars; } - protected function checkProperty(Property $node, $modifierPos) + public function getSubNodeNames() : array { - if ($node->flags & Class_::MODIFIER_ABSTRACT) { - $this->emitError(new Error('Properties cannot be declared abstract', $this->getAttributesAt($modifierPos))); - } - if ($node->flags & Class_::MODIFIER_FINAL) { - $this->emitError(new Error('Properties cannot be declared final', $this->getAttributesAt($modifierPos))); - } + return ['vars']; } - protected function checkUseUse(UseUse $node, $namePos) + public function getType() : string { - if ($node->alias && $node->alias->isSpecialClassName()) { - $this->emitError(new Error(\sprintf('Cannot use %s as %s because \'%2$s\' is a special class name', $node->name, $node->alias), $this->getAttributesAt($namePos))); - } + return 'Stmt_Global'; } } attributes = $attributes; + $this->name = \is_string($name) ? new Identifier($name) : $name; } - public function leaveNode(Node $node) + public function getSubNodeNames() : array { - return null; + return ['name']; } - public function afterTraverse(array $nodes) + public function getType() : string { - return null; + return 'Stmt_Goto'; } } args($args)); - } - /** - * Creates a namespace builder. - * - * @param null|string|Node\Name $name Name of the namespace + * Constructs a group use node. * - * @return Builder\Namespace_ The created namespace builder + * @param Name $prefix Prefix for uses + * @param UseUse[] $uses Uses + * @param int $type Type of group use + * @param array $attributes Additional attributes */ - public function namespace($name) : Builder\Namespace_ + public function __construct(Name $prefix, array $uses, int $type = Use_::TYPE_NORMAL, array $attributes = []) { - return new Builder\Namespace_($name); + $this->attributes = $attributes; + $this->type = $type; + $this->prefix = $prefix; + $this->uses = $uses; } - /** - * Creates a class builder. - * - * @param string $name Name of the class - * - * @return Builder\Class_ The created class builder - */ - public function class(string $name) : Builder\Class_ + public function getSubNodeNames() : array { - return new Builder\Class_($name); + return ['type', 'prefix', 'uses']; } - /** - * Creates an interface builder. - * - * @param string $name Name of the interface - * - * @return Builder\Interface_ The created interface builder - */ - public function interface(string $name) : Builder\Interface_ + public function getType() : string { - return new Builder\Interface_($name); + return 'Stmt_GroupUse'; } +} +attributes = $attributes; + $this->remaining = $remaining; } - /** - * Creates a trait use builder. - * - * @param Node\Name|string ...$traits Trait names - * - * @return Builder\TraitUse The create trait use builder - */ - public function useTrait(...$traits) : Builder\TraitUse + public function getSubNodeNames() : array { - return new Builder\TraitUse(...$traits); + return ['remaining']; } - /** - * Creates a trait use adaptation builder. - * - * @param Node\Name|string|null $trait Trait name - * @param Node\Identifier|string $method Method name - * - * @return Builder\TraitUseAdaptation The create trait use adaptation builder - */ - public function traitUseAdaptation($trait, $method = null) : Builder\TraitUseAdaptation + public function getType() : string { - if ($method === null) { - $method = $trait; - $trait = null; - } - return new Builder\TraitUseAdaptation($trait, $method); + return 'Stmt_HaltCompiler'; } +} + array(): Statements + * 'elseifs' => array(): Elseif clauses + * 'else' => null : Else clause + * @param array $attributes Additional attributes */ - public function method(string $name) : Builder\Method + public function __construct(Node\Expr $cond, array $subNodes = [], array $attributes = []) { - return new Builder\Method($name); + $this->attributes = $attributes; + $this->cond = $cond; + $this->stmts = $subNodes['stmts'] ?? []; + $this->elseifs = $subNodes['elseifs'] ?? []; + $this->else = $subNodes['else'] ?? null; } - /** - * Creates a parameter builder. - * - * @param string $name Name of the parameter - * - * @return Builder\Param The created parameter builder - */ - public function param(string $name) : Builder\Param + public function getSubNodeNames() : array { - return new Builder\Param($name); + return ['cond', 'stmts', 'elseifs', 'else']; } - /** - * Creates a property builder. - * - * @param string $name Name of the property - * - * @return Builder\Property The created property builder - */ - public function property(string $name) : Builder\Property + public function getType() : string { - return new Builder\Property($name); + return 'Stmt_If'; } +} +attributes = $attributes; + $this->value = $value; } - /** - * Creates a namespace/class use builder. - * - * @param Node\Name|string $name Name of the entity (namespace or class) to alias - * - * @return Builder\Use_ The created use builder - */ - public function use($name) : Builder\Use_ + public function getSubNodeNames() : array { - return new Builder\Use_($name, Use_::TYPE_NORMAL); + return ['value']; } - /** - * Creates a function use builder. - * - * @param Node\Name|string $name Name of the function to alias - * - * @return Builder\Use_ The created use function builder - */ - public function useFunction($name) : Builder\Use_ + public function getType() : string { - return new Builder\Use_($name, Use_::TYPE_FUNCTION); + return 'Stmt_InlineHTML'; } +} + array(): Name of extended interfaces + * 'stmts' => array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes */ - public function useConst($name) : Builder\Use_ + public function __construct($name, array $subNodes = [], array $attributes = []) { - return new Builder\Use_($name, Use_::TYPE_CONSTANT); + $this->attributes = $attributes; + $this->name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->extends = $subNodes['extends'] ?? []; + $this->stmts = $subNodes['stmts'] ?? []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; } - /** - * Creates a class constant builder. - * - * @param string|Identifier $name Name - * @param Node\Expr|bool|null|int|float|string|array $value Value - * - * @return Builder\ClassConst The created use const builder - */ - public function classConst($name, $value) : Builder\ClassConst + public function getSubNodeNames() : array { - return new Builder\ClassConst($name, $value); + return ['attrGroups', 'name', 'extends', 'stmts']; } - /** - * Creates node a for a literal value. - * - * @param Expr|bool|null|int|float|string|array $value $value - * - * @return Expr - */ - public function val($value) : Expr + public function getType() : string { - return BuilderHelpers::normalizeValue($value); + return 'Stmt_Interface'; } +} +attributes = $attributes; + $this->name = \is_string($name) ? new Identifier($name) : $name; } - /** - * Normalizes an argument list. - * - * Creates Arg nodes for all arguments and converts literal values to expressions. - * - * @param array $args List of arguments to normalize - * - * @return Arg[] - */ - public function args(array $args) : array + public function getSubNodeNames() : array { - $normalizedArgs = []; - foreach ($args as $key => $arg) { - if (!$arg instanceof Arg) { - $arg = new Arg(BuilderHelpers::normalizeValue($arg)); - } - if (\is_string($key)) { - $arg->name = BuilderHelpers::normalizeIdentifier($key); - } - $normalizedArgs[] = $arg; - } - return $normalizedArgs; + return ['name']; } - /** - * Creates a function call node. - * - * @param string|Name|Expr $name Function name - * @param array $args Function arguments - * - * @return Expr\FuncCall - */ - public function funcCall($name, array $args = []) : Expr\FuncCall + public function getType() : string { - return new Expr\FuncCall(BuilderHelpers::normalizeNameOrExpr($name), $this->args($args)); + return 'Stmt_Label'; } +} +args($args)); + $this->attributes = $attributes; + $this->name = $name; + $this->stmts = $stmts; + } + public function getSubNodeNames() : array + { + return ['name', 'stmts']; + } + public function getType() : string + { + return 'Stmt_Namespace'; + } +} +args($args)); + $this->attributes = $attributes; + $this->flags = $flags; + $this->props = $props; + $this->type = \is_string($type) ? new Identifier($type) : $type; + $this->attrGroups = $attrGroups; + } + public function getSubNodeNames() : array + { + return ['attrGroups', 'flags', 'type', 'props']; } /** - * Creates an object creation node. - * - * @param string|Name|Expr $class Class name - * @param array $args Constructor arguments + * Whether the property is explicitly or implicitly public. * - * @return Expr\New_ + * @return bool */ - public function new($class, array $args = []) : Expr\New_ + public function isPublic() : bool { - return new Expr\New_(BuilderHelpers::normalizeNameOrExpr($class), $this->args($args)); + return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; } /** - * Creates a constant fetch node. - * - * @param string|Name $name Constant name + * Whether the property is protected. * - * @return Expr\ConstFetch + * @return bool */ - public function constFetch($name) : Expr\ConstFetch + public function isProtected() : bool { - return new Expr\ConstFetch(BuilderHelpers::normalizeName($name)); + return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); } /** - * Creates a property fetch node. - * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Property name + * Whether the property is private. * - * @return Expr\PropertyFetch + * @return bool */ - public function propertyFetch(Expr $var, $name) : Expr\PropertyFetch + public function isPrivate() : bool { - return new Expr\PropertyFetch($var, BuilderHelpers::normalizeIdentifierOrExpr($name)); + return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); } /** - * Creates a class constant fetch node. - * - * @param string|Name|Expr $class Class name - * @param string|Identifier $name Constant name + * Whether the property is static. * - * @return Expr\ClassConstFetch + * @return bool */ - public function classConstFetch($class, $name) : Expr\ClassConstFetch + public function isStatic() : bool { - return new Expr\ClassConstFetch(BuilderHelpers::normalizeNameOrExpr($class), BuilderHelpers::normalizeIdentifier($name)); + return (bool) ($this->flags & Class_::MODIFIER_STATIC); } /** - * Creates nested Concat nodes from a list of expressions. - * - * @param Expr|string ...$exprs Expressions or literal strings + * Whether the property is readonly. * - * @return Concat + * @return bool */ - public function concat(...$exprs) : Concat + public function isReadonly() : bool { - $numExprs = \count($exprs); - if ($numExprs < 2) { - throw new \LogicException('Expected at least two expressions'); - } - $lastConcat = $this->normalizeStringExpr($exprs[0]); - for ($i = 1; $i < $numExprs; $i++) { - $lastConcat = new Concat($lastConcat, $this->normalizeStringExpr($exprs[$i])); - } - return $lastConcat; + return (bool) ($this->flags & Class_::MODIFIER_READONLY); } - /** - * @param string|Expr $expr - * @return Expr - */ - private function normalizeStringExpr($expr) : Expr + public function getType() : string { - if ($expr instanceof Expr) { - return $expr; - } - if (\is_string($expr)) { - return new String_($expr); - } - throw new \LogicException('Expected string or Expr'); + return 'Stmt_Property'; } } attributes = $attributes; + $this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name; + $this->default = $default; + } + public function getSubNodeNames() : array + { + return ['name', 'default']; + } + public function getType() : string + { + return 'Stmt_PropertyProperty'; + } } attributes = $attributes; + $this->expr = $expr; + } + public function getSubNodeNames() : array + { + return ['expr']; + } + public function getType() : string + { + return 'Stmt_Return'; + } } attributes = $attributes; + $this->var = $var; + $this->default = $default; + } + public function getSubNodeNames() : array + { + return ['var', 'default']; + } + public function getType() : string + { + return 'Stmt_StaticVar'; } } errors[] = $error; - } + /** @var StaticVar[] Variable definitions */ + public $vars; /** - * Get collected errors. + * Constructs a static variables list node. * - * @return Error[] + * @param StaticVar[] $vars Variable definitions + * @param array $attributes Additional attributes */ - public function getErrors() : array + public function __construct(array $vars, array $attributes = []) { - return $this->errors; + $this->attributes = $attributes; + $this->vars = $vars; } - /** - * Check whether there are any errors. - * - * @return bool - */ - public function hasErrors() : bool + public function getSubNodeNames() : array { - return !empty($this->errors); + return ['vars']; } - /** - * Reset/clear collected errors. - */ - public function clearErrors() + public function getType() : string { - $this->errors = []; + return 'Stmt_Static'; } } addVisitor($visitor); - $traverser->traverse($nodes); - return $visitor->getFoundNodes(); + $this->attributes = $attributes; + $this->cond = $cond; + $this->cases = $cases; } - /** - * Find all nodes that are instances of a certain class. - * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param string $class Class name - * - * @return Node[] Found nodes (all instances of $class) - */ - public function findInstanceOf($nodes, string $class) : array + public function getSubNodeNames() : array { - return $this->find($nodes, function ($node) use($class) { - return $node instanceof $class; - }); + return ['cond', 'cases']; } - /** - * Find first node satisfying a filter callback. - * - * @param Node|Node[] $nodes Single node or array of nodes to search in - * @param callable $filter Filter callback: function(Node $node) : bool - * - * @return null|Node Found node (or null if none found) - */ - public function findFirst($nodes, callable $filter) + public function getType() : string { - if (!\is_array($nodes)) { - $nodes = [$nodes]; - } - $visitor = new FirstFindingVisitor($filter); - $traverser = new NodeTraverser(); - $traverser->addVisitor($visitor); - $traverser->traverse($nodes); - return $visitor->getFoundNode(); + return 'Stmt_Switch'; } +} +findFirst($nodes, function ($node) use($class) { - return $node instanceof $class; - }); + $this->attributes = $attributes; + $this->expr = $expr; + } + public function getSubNodeNames() : array + { + return ['expr']; + } + public function getType() : string + { + return 'Stmt_Throw'; } } attributes = $attributes; + $this->traits = $traits; + $this->adaptations = $adaptations; + } + public function getSubNodeNames() : array + { + return ['traits', 'adaptations']; + } + public function getType() : string + { + return 'Stmt_TraitUse'; + } +} +attributes = $attributes; + $this->trait = $trait; + $this->method = \is_string($method) ? new Node\Identifier($method) : $method; + $this->newModifier = $newModifier; + $this->newName = \is_string($newName) ? new Node\Identifier($newName) : $newName; + } + public function getSubNodeNames() : array + { + return ['trait', 'method', 'newModifier', 'newName']; + } + public function getType() : string + { + return 'Stmt_TraitUseAdaptation_Alias'; + } +} +attributes = $attributes; + $this->trait = $trait; + $this->method = \is_string($method) ? new Node\Identifier($method) : $method; + $this->insteadof = $insteadof; + } + public function getSubNodeNames() : array + { + return ['trait', 'method', 'insteadof']; + } + public function getType() : string + { + return 'Stmt_TraitUseAdaptation_Precedence'; + } +} + array(): Statements + * 'attrGroups' => array(): PHP attribute groups + * @param array $attributes Additional attributes */ - public function getAttribute(string $key, $default = null); + public function __construct($name, array $subNodes = [], array $attributes = []) + { + $this->attributes = $attributes; + $this->name = \is_string($name) ? new Node\Identifier($name) : $name; + $this->stmts = $subNodes['stmts'] ?? []; + $this->attrGroups = $subNodes['attrGroups'] ?? []; + } + public function getSubNodeNames() : array + { + return ['attrGroups', 'name', 'stmts']; + } + public function getType() : string + { + return 'Stmt_Trait'; + } +} +attributes = $attributes; + $this->stmts = $stmts; + $this->catches = $catches; + $this->finally = $finally; + } + public function getSubNodeNames() : array + { + return ['stmts', 'catches', 'finally']; + } + public function getType() : string + { + return 'Stmt_TryCatch'; + } +} +attributes = $attributes; + $this->vars = $vars; + } + public function getSubNodeNames() : array + { + return ['vars']; + } + public function getType() : string + { + return 'Stmt_Unset'; + } } getNode(); - } - if ($node instanceof Node) { - return $node; - } - throw new \LogicException('Expected node or builder object'); + $this->attributes = $attributes; + $this->type = $type; + $this->name = $name; + $this->alias = \is_string($alias) ? new Identifier($alias) : $alias; + } + public function getSubNodeNames() : array + { + return ['type', 'name', 'alias']; } /** - * Normalizes a node to a statement. - * - * Expressions are wrapped in a Stmt\Expression node. - * - * @param Node|Builder $node The node to normalize + * Get alias. If not explicitly given this is the last component of the used name. * - * @return Stmt The normalized statement node + * @return Identifier */ - public static function normalizeStmt($node) : Stmt + public function getAlias() : Identifier { - $node = self::normalizeNode($node); - if ($node instanceof Stmt) { - return $node; - } - if ($node instanceof Expr) { - return new Stmt\Expression($node); + if (null !== $this->alias) { + return $this->alias; } - throw new \LogicException('Expected statement or expression node'); + return new Identifier($this->name->getLast()); + } + public function getType() : string + { + return 'Stmt_UseUse'; } +} +attributes = $attributes; + $this->type = $type; + $this->uses = $uses; + } + public function getSubNodeNames() : array + { + return ['type', 'uses']; + } + public function getType() : string + { + return 'Stmt_Use'; } +} +attributes = $attributes; + $this->cond = $cond; + $this->stmts = $stmts; + } + public function getSubNodeNames() : array + { + return ['cond', 'stmts']; + } + public function getType() : string + { + return 'Stmt_While'; } +} +attributes = $attributes; + $this->types = $types; + } + public function getSubNodeNames() : array + { + return ['types']; + } + public function getType() : string + { + return 'UnionType'; + } +} +attributes = $attributes; + } + public function getType() : string + { + return 'VariadicPlaceholder'; + } + public function getSubNodeNames() : array + { + return []; } +} + 0 && $type[0] === '?') { - $nullable = \true; - $type = \substr($type, 1); - } - $builtinTypes = ['array', 'callable', 'string', 'int', 'float', 'bool', 'iterable', 'void', 'object', 'mixed', 'never']; - $lowerType = \strtolower($type); - if (\in_array($lowerType, $builtinTypes)) { - $type = new Identifier($lowerType); - } else { - $type = self::normalizeName($type); - } - $notNullableTypes = ['void', 'mixed', 'never']; - if ($nullable && \in_array((string) $type, $notNullableTypes)) { - throw new \LogicException(\sprintf('%s type cannot be nullable', $type)); - } - return $nullable ? new NullableType($type) : $type; + $this->attributes = $attributes; } /** - * Normalizes a value: Converts nulls, booleans, integers, - * floats, strings and arrays into their respective nodes - * - * @param Node\Expr|bool|null|int|float|string|array $value The value to normalize + * Gets line the node started in (alias of getStartLine). * - * @return Expr The normalized value + * @return int Start line (or -1 if not available) */ - public static function normalizeValue($value) : Expr + public function getLine() : int { - if ($value instanceof Node\Expr) { - return $value; - } - if (\is_null($value)) { - return new Expr\ConstFetch(new Name('null')); - } - if (\is_bool($value)) { - return new Expr\ConstFetch(new Name($value ? 'true' : 'false')); - } - if (\is_int($value)) { - return new Scalar\LNumber($value); - } - if (\is_float($value)) { - return new Scalar\DNumber($value); - } - if (\is_string($value)) { - return new Scalar\String_($value); - } - if (\is_array($value)) { - $items = []; - $lastKey = -1; - foreach ($value as $itemKey => $itemValue) { - // for consecutive, numeric keys don't generate keys - if (null !== $lastKey && ++$lastKey === $itemKey) { - $items[] = new Expr\ArrayItem(self::normalizeValue($itemValue)); - } else { - $lastKey = null; - $items[] = new Expr\ArrayItem(self::normalizeValue($itemValue), self::normalizeValue($itemKey)); - } - } - return new Expr\Array_($items); - } - throw new \LogicException('Invalid value'); + return $this->attributes['startLine'] ?? -1; } /** - * Normalizes a doc comment: Converts plain strings to PhpParser\Comment\Doc. + * Gets line the node started in. * - * @param Comment\Doc|string $docComment The doc comment to normalize + * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default). * - * @return Comment\Doc The normalized doc comment + * @return int Start line (or -1 if not available) */ - public static function normalizeDocComment($docComment) : Comment\Doc + public function getStartLine() : int { - if ($docComment instanceof Comment\Doc) { - return $docComment; - } - if (\is_string($docComment)) { - return new Comment\Doc($docComment); - } - throw new \LogicException('PHPUnit\\Doc comment must be a string or an instance of PhpParser\\Comment\\Doc'); + return $this->attributes['startLine'] ?? -1; } /** - * Normalizes a attribute: Converts attribute to the Attribute Group if needed. + * Gets the line the node ended in. * - * @param Node\Attribute|Node\AttributeGroup $attribute + * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default). * - * @return Node\AttributeGroup The Attribute Group + * @return int End line (or -1 if not available) */ - public static function normalizeAttribute($attribute) : Node\AttributeGroup + public function getEndLine() : int { - if ($attribute instanceof Node\AttributeGroup) { - return $attribute; - } - if (!$attribute instanceof Node\Attribute) { - throw new \LogicException('PHPUnit\\Attribute must be an instance of PhpParser\\Node\\Attribute or PhpParser\\Node\\AttributeGroup'); - } - return new Node\AttributeGroup([$attribute]); + return $this->attributes['endLine'] ?? -1; } /** - * Adds a modifier and returns new modifier bitmask. + * Gets the token offset of the first token that is part of this node. * - * @param int $modifiers Existing modifiers - * @param int $modifier Modifier to set + * The offset is an index into the array returned by Lexer::getTokens(). * - * @return int New modifiers + * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default). + * + * @return int Token start position (or -1 if not available) */ - public static function addModifier(int $modifiers, int $modifier) : int + public function getStartTokenPos() : int { - Stmt\Class_::verifyModifier($modifiers, $modifier); - return $modifiers | $modifier; + return $this->attributes['startTokenPos'] ?? -1; } -} -pAttrGroups($node->attrGroups, \true) . $this->pModifiers($node->flags) . ($node->type ? $this->p($node->type) . ' ' : '') . ($node->byRef ? '&' : '') . ($node->variadic ? '...' : '') . $this->p($node->var) . ($node->default ? ' = ' . $this->p($node->default) : ''); + return $this->attributes['endTokenPos'] ?? -1; } - protected function pArg(Node\Arg $node) + /** + * Gets the file offset of the first character that is part of this node. + * + * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default). + * + * @return int File start position (or -1 if not available) + */ + public function getStartFilePos() : int { - return ($node->name ? $node->name->toString() . ': ' : '') . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); + return $this->attributes['startFilePos'] ?? -1; } - protected function pVariadicPlaceholder(Node\VariadicPlaceholder $node) + /** + * Gets the file offset of the last character that is part of this node. + * + * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default). + * + * @return int File end position (or -1 if not available) + */ + public function getEndFilePos() : int { - return '...'; + return $this->attributes['endFilePos'] ?? -1; } - protected function pConst(Node\Const_ $node) + /** + * Gets all comments directly preceding this node. + * + * The comments are also available through the "comments" attribute. + * + * @return Comment[] + */ + public function getComments() : array { - return $node->name . ' = ' . $this->p($node->value); + return $this->attributes['comments'] ?? []; } - protected function pNullableType(Node\NullableType $node) + /** + * Gets the doc comment of the node. + * + * @return null|Comment\Doc Doc comment object or null + */ + public function getDocComment() { - return '?' . $this->p($node->type); + $comments = $this->getComments(); + for ($i = \count($comments) - 1; $i >= 0; $i--) { + $comment = $comments[$i]; + if ($comment instanceof Comment\Doc) { + return $comment; + } + } + return null; } - protected function pUnionType(Node\UnionType $node) + /** + * Sets the doc comment of the node. + * + * This will either replace an existing doc comment or add it to the comments array. + * + * @param Comment\Doc $docComment Doc comment to set + */ + public function setDocComment(Comment\Doc $docComment) { - return $this->pImplode($node->types, '|'); + $comments = $this->getComments(); + for ($i = \count($comments) - 1; $i >= 0; $i--) { + if ($comments[$i] instanceof Comment\Doc) { + // Replace existing doc comment. + $comments[$i] = $docComment; + $this->setAttribute('comments', $comments); + return; + } + } + // Append new doc comment. + $comments[] = $docComment; + $this->setAttribute('comments', $comments); } - protected function pIntersectionType(Node\IntersectionType $node) + public function setAttribute(string $key, $value) { - return $this->pImplode($node->types, '&'); + $this->attributes[$key] = $value; } - protected function pIdentifier(Node\Identifier $node) + public function hasAttribute(string $key) : bool { - return $node->name; + return \array_key_exists($key, $this->attributes); } - protected function pVarLikeIdentifier(Node\VarLikeIdentifier $node) + public function getAttribute(string $key, $default = null) { - return '$' . $node->name; + if (\array_key_exists($key, $this->attributes)) { + return $this->attributes[$key]; + } + return $default; } - protected function pAttribute(Node\Attribute $node) + public function getAttributes() : array { - return $this->p($node->name) . ($node->args ? '(' . $this->pCommaSeparated($node->args) . ')' : ''); + return $this->attributes; } - protected function pAttributeGroup(Node\AttributeGroup $node) + public function setAttributes(array $attributes) { - return '#[' . $this->pCommaSeparated($node->attrs) . ']'; + $this->attributes = $attributes; } - // Names - protected function pName(Name $node) + /** + * @return array + */ + public function jsonSerialize() : array { - return \implode('\\', $node->parts); + return ['nodeType' => $this->getType()] + \get_object_vars($this); } - protected function pName_FullyQualified(Name\FullyQualified $node) +} +parts); + $this->dumpComments = !empty($options['dumpComments']); + $this->dumpPositions = !empty($options['dumpPositions']); } - protected function pName_Relative(Name\Relative $node) + /** + * Dumps a node or array. + * + * @param array|Node $node Node or array to dump + * @param string|null $code Code corresponding to dumped AST. This only needs to be passed if + * the dumpPositions option is enabled and the dumping of node offsets + * is desired. + * + * @return string Dumped value + */ + public function dump($node, string $code = null) : string { - return 'namespace\\' . \implode('\\', $node->parts); + $this->code = $code; + return $this->dumpRecursive($node); } - // Magic Constants - protected function pScalar_MagicConst_Class(MagicConst\Class_ $node) + protected function dumpRecursive($node) { - return '__CLASS__'; - } - protected function pScalar_MagicConst_Dir(MagicConst\Dir $node) - { - return '__DIR__'; - } - protected function pScalar_MagicConst_File(MagicConst\File $node) - { - return '__FILE__'; - } - protected function pScalar_MagicConst_Function(MagicConst\Function_ $node) - { - return '__FUNCTION__'; - } - protected function pScalar_MagicConst_Line(MagicConst\Line $node) - { - return '__LINE__'; - } - protected function pScalar_MagicConst_Method(MagicConst\Method $node) - { - return '__METHOD__'; - } - protected function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node) - { - return '__NAMESPACE__'; - } - protected function pScalar_MagicConst_Trait(MagicConst\Trait_ $node) - { - return '__TRAIT__'; - } - // Scalars - protected function pScalar_String(Scalar\String_ $node) - { - $kind = $node->getAttribute('kind', Scalar\String_::KIND_SINGLE_QUOTED); - switch ($kind) { - case Scalar\String_::KIND_NOWDOC: - $label = $node->getAttribute('docLabel'); - if ($label && !$this->containsEndLabel($node->value, $label)) { - if ($node->value === '') { - return "<<<'{$label}'\n{$label}" . $this->docStringEndToken; - } - return "<<<'{$label}'\n{$node->value}\n{$label}" . $this->docStringEndToken; - } - /* break missing intentionally */ - case Scalar\String_::KIND_SINGLE_QUOTED: - return $this->pSingleQuotedString($node->value); - case Scalar\String_::KIND_HEREDOC: - $label = $node->getAttribute('docLabel'); - if ($label && !$this->containsEndLabel($node->value, $label)) { - if ($node->value === '') { - return "<<<{$label}\n{$label}" . $this->docStringEndToken; + if ($node instanceof Node) { + $r = $node->getType(); + if ($this->dumpPositions && null !== ($p = $this->dumpPosition($node))) { + $r .= $p; + } + $r .= '('; + foreach ($node->getSubNodeNames() as $key) { + $r .= "\n " . $key . ': '; + $value = $node->{$key}; + if (null === $value) { + $r .= 'null'; + } elseif (\false === $value) { + $r .= 'false'; + } elseif (\true === $value) { + $r .= 'true'; + } elseif (\is_scalar($value)) { + if ('flags' === $key || 'newModifier' === $key) { + $r .= $this->dumpFlags($value); + } elseif ('type' === $key && $node instanceof Include_) { + $r .= $this->dumpIncludeType($value); + } elseif ('type' === $key && ($node instanceof Use_ || $node instanceof UseUse || $node instanceof GroupUse)) { + $r .= $this->dumpUseType($value); + } else { + $r .= $value; } - $escaped = $this->escapeString($node->value, null); - return "<<<{$label}\n" . $escaped . "\n{$label}" . $this->docStringEndToken; + } else { + $r .= \str_replace("\n", "\n ", $this->dumpRecursive($value)); } - /* break missing intentionally */ - case Scalar\String_::KIND_DOUBLE_QUOTED: - return '"' . $this->escapeString($node->value, '"') . '"'; - } - throw new \Exception('Invalid string kind'); - } - protected function pScalar_Encapsed(Scalar\Encapsed $node) - { - if ($node->getAttribute('kind') === Scalar\String_::KIND_HEREDOC) { - $label = $node->getAttribute('docLabel'); - if ($label && !$this->encapsedContainsEndLabel($node->parts, $label)) { - if (\count($node->parts) === 1 && $node->parts[0] instanceof Scalar\EncapsedStringPart && $node->parts[0]->value === '') { - return "<<<{$label}\n{$label}" . $this->docStringEndToken; + } + if ($this->dumpComments && ($comments = $node->getComments())) { + $r .= "\n comments: " . \str_replace("\n", "\n ", $this->dumpRecursive($comments)); + } + } elseif (\is_array($node)) { + $r = 'array('; + foreach ($node as $key => $value) { + $r .= "\n " . $key . ': '; + if (null === $value) { + $r .= 'null'; + } elseif (\false === $value) { + $r .= 'false'; + } elseif (\true === $value) { + $r .= 'true'; + } elseif (\is_scalar($value)) { + $r .= $value; + } else { + $r .= \str_replace("\n", "\n ", $this->dumpRecursive($value)); } - return "<<<{$label}\n" . $this->pEncapsList($node->parts, null) . "\n{$label}" . $this->docStringEndToken; } + } elseif ($node instanceof Comment) { + return $node->getReformattedText(); + } else { + throw new \InvalidArgumentException('Can only dump nodes and arrays.'); } - return '"' . $this->pEncapsList($node->parts, '"') . '"'; + return $r . "\n)"; } - protected function pScalar_LNumber(Scalar\LNumber $node) + protected function dumpFlags($flags) { - if ($node->value === -\PHP_INT_MAX - 1) { - // PHP_INT_MIN cannot be represented as a literal, - // because the sign is not part of the literal - return '(-' . \PHP_INT_MAX . '-1)'; + $strs = []; + if ($flags & Class_::MODIFIER_PUBLIC) { + $strs[] = 'MODIFIER_PUBLIC'; } - $kind = $node->getAttribute('kind', Scalar\LNumber::KIND_DEC); - if (Scalar\LNumber::KIND_DEC === $kind) { - return (string) $node->value; + if ($flags & Class_::MODIFIER_PROTECTED) { + $strs[] = 'MODIFIER_PROTECTED'; } - if ($node->value < 0) { - $sign = '-'; - $str = (string) -$node->value; - } else { - $sign = ''; - $str = (string) $node->value; + if ($flags & Class_::MODIFIER_PRIVATE) { + $strs[] = 'MODIFIER_PRIVATE'; } - switch ($kind) { - case Scalar\LNumber::KIND_BIN: - return $sign . '0b' . \base_convert($str, 10, 2); - case Scalar\LNumber::KIND_OCT: - return $sign . '0' . \base_convert($str, 10, 8); - case Scalar\LNumber::KIND_HEX: - return $sign . '0x' . \base_convert($str, 10, 16); + if ($flags & Class_::MODIFIER_ABSTRACT) { + $strs[] = 'MODIFIER_ABSTRACT'; } - throw new \Exception('Invalid number kind'); - } - protected function pScalar_DNumber(Scalar\DNumber $node) - { - if (!\is_finite($node->value)) { - if ($node->value === \INF) { - return '\\INF'; - } elseif ($node->value === -\INF) { - return '-\\INF'; - } else { - return '\\NAN'; - } + if ($flags & Class_::MODIFIER_STATIC) { + $strs[] = 'MODIFIER_STATIC'; } - // Try to find a short full-precision representation - $stringValue = \sprintf('%.16G', $node->value); - if ($node->value !== (double) $stringValue) { - $stringValue = \sprintf('%.17G', $node->value); + if ($flags & Class_::MODIFIER_FINAL) { + $strs[] = 'MODIFIER_FINAL'; + } + if ($flags & Class_::MODIFIER_READONLY) { + $strs[] = 'MODIFIER_READONLY'; + } + if ($strs) { + return \implode(' | ', $strs) . ' (' . $flags . ')'; + } else { + return $flags; } - // %G is locale dependent and there exists no locale-independent alternative. We don't want - // mess with switching locales here, so let's assume that a comma is the only non-standard - // decimal separator we may encounter... - $stringValue = \str_replace(',', '.', $stringValue); - // ensure that number is really printed as float - return \preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue; - } - protected function pScalar_EncapsedStringPart(Scalar\EncapsedStringPart $node) - { - throw new \LogicException('Cannot directly print EncapsedStringPart'); - } - // Assignments - protected function pExpr_Assign(Expr\Assign $node) - { - return $this->pInfixOp(Expr\Assign::class, $node->var, ' = ', $node->expr); - } - protected function pExpr_AssignRef(Expr\AssignRef $node) - { - return $this->pInfixOp(Expr\AssignRef::class, $node->var, ' =& ', $node->expr); - } - protected function pExpr_AssignOp_Plus(AssignOp\Plus $node) - { - return $this->pInfixOp(AssignOp\Plus::class, $node->var, ' += ', $node->expr); - } - protected function pExpr_AssignOp_Minus(AssignOp\Minus $node) - { - return $this->pInfixOp(AssignOp\Minus::class, $node->var, ' -= ', $node->expr); - } - protected function pExpr_AssignOp_Mul(AssignOp\Mul $node) - { - return $this->pInfixOp(AssignOp\Mul::class, $node->var, ' *= ', $node->expr); - } - protected function pExpr_AssignOp_Div(AssignOp\Div $node) - { - return $this->pInfixOp(AssignOp\Div::class, $node->var, ' /= ', $node->expr); - } - protected function pExpr_AssignOp_Concat(AssignOp\Concat $node) - { - return $this->pInfixOp(AssignOp\Concat::class, $node->var, ' .= ', $node->expr); } - protected function pExpr_AssignOp_Mod(AssignOp\Mod $node) + protected function dumpIncludeType($type) { - return $this->pInfixOp(AssignOp\Mod::class, $node->var, ' %= ', $node->expr); + $map = [Include_::TYPE_INCLUDE => 'TYPE_INCLUDE', Include_::TYPE_INCLUDE_ONCE => 'TYPE_INCLUDE_ONCE', Include_::TYPE_REQUIRE => 'TYPE_REQUIRE', Include_::TYPE_REQUIRE_ONCE => 'TYPE_REQUIRE_ONCE']; + if (!isset($map[$type])) { + return $type; + } + return $map[$type] . ' (' . $type . ')'; } - protected function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node) + protected function dumpUseType($type) { - return $this->pInfixOp(AssignOp\BitwiseAnd::class, $node->var, ' &= ', $node->expr); + $map = [Use_::TYPE_UNKNOWN => 'TYPE_UNKNOWN', Use_::TYPE_NORMAL => 'TYPE_NORMAL', Use_::TYPE_FUNCTION => 'TYPE_FUNCTION', Use_::TYPE_CONSTANT => 'TYPE_CONSTANT']; + if (!isset($map[$type])) { + return $type; + } + return $map[$type] . ' (' . $type . ')'; } - protected function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node) + /** + * Dump node position, if possible. + * + * @param Node $node Node for which to dump position + * + * @return string|null Dump of position, or null if position information not available + */ + protected function dumpPosition(Node $node) { - return $this->pInfixOp(AssignOp\BitwiseOr::class, $node->var, ' |= ', $node->expr); + if (!$node->hasAttribute('startLine') || !$node->hasAttribute('endLine')) { + return null; + } + $start = $node->getStartLine(); + $end = $node->getEndLine(); + if ($node->hasAttribute('startFilePos') && $node->hasAttribute('endFilePos') && null !== $this->code) { + $start .= ':' . $this->toColumn($this->code, $node->getStartFilePos()); + $end .= ':' . $this->toColumn($this->code, $node->getEndFilePos()); + } + return "[{$start} - {$end}]"; } - protected function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node) + // Copied from Error class + private function toColumn($code, $pos) { - return $this->pInfixOp(AssignOp\BitwiseXor::class, $node->var, ' ^= ', $node->expr); + if ($pos > \strlen($code)) { + throw new \RuntimeException('Invalid position information'); + } + $lineStartPos = \strrpos($code, "\n", $pos - \strlen($code)); + if (\false === $lineStartPos) { + $lineStartPos = -1; + } + return $pos - $lineStartPos; } - protected function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node) +} +pInfixOp(AssignOp\ShiftLeft::class, $node->var, ' <<= ', $node->expr); + if (!\is_array($nodes)) { + $nodes = [$nodes]; + } + $visitor = new FindingVisitor($filter); + $traverser = new NodeTraverser(); + $traverser->addVisitor($visitor); + $traverser->traverse($nodes); + return $visitor->getFoundNodes(); } - protected function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node) + /** + * Find all nodes that are instances of a certain class. + * + * @param Node|Node[] $nodes Single node or array of nodes to search in + * @param string $class Class name + * + * @return Node[] Found nodes (all instances of $class) + */ + public function findInstanceOf($nodes, string $class) : array { - return $this->pInfixOp(AssignOp\ShiftRight::class, $node->var, ' >>= ', $node->expr); + return $this->find($nodes, function ($node) use($class) { + return $node instanceof $class; + }); } - protected function pExpr_AssignOp_Pow(AssignOp\Pow $node) + /** + * Find first node satisfying a filter callback. + * + * @param Node|Node[] $nodes Single node or array of nodes to search in + * @param callable $filter Filter callback: function(Node $node) : bool + * + * @return null|Node Found node (or null if none found) + */ + public function findFirst($nodes, callable $filter) { - return $this->pInfixOp(AssignOp\Pow::class, $node->var, ' **= ', $node->expr); + if (!\is_array($nodes)) { + $nodes = [$nodes]; + } + $visitor = new FirstFindingVisitor($filter); + $traverser = new NodeTraverser(); + $traverser->addVisitor($visitor); + $traverser->traverse($nodes); + return $visitor->getFoundNode(); } - protected function pExpr_AssignOp_Coalesce(AssignOp\Coalesce $node) + /** + * Find first node that is an instance of a certain class. + * + * @param Node|Node[] $nodes Single node or array of nodes to search in + * @param string $class Class name + * + * @return null|Node Found node, which is an instance of $class (or null if none found) + */ + public function findFirstInstanceOf($nodes, string $class) { - return $this->pInfixOp(AssignOp\Coalesce::class, $node->var, ' ??= ', $node->expr); + return $this->findFirst($nodes, function ($node) use($class) { + return $node instanceof $class; + }); } - // Binary expressions - protected function pExpr_BinaryOp_Plus(BinaryOp\Plus $node) +} +pInfixOp(BinaryOp\Plus::class, $node->left, ' + ', $node->right); + // for BC } - protected function pExpr_BinaryOp_Minus(BinaryOp\Minus $node) + /** + * Adds a visitor. + * + * @param NodeVisitor $visitor Visitor to add + */ + public function addVisitor(NodeVisitor $visitor) { - return $this->pInfixOp(BinaryOp\Minus::class, $node->left, ' - ', $node->right); + $this->visitors[] = $visitor; } - protected function pExpr_BinaryOp_Mul(BinaryOp\Mul $node) + /** + * Removes an added visitor. + * + * @param NodeVisitor $visitor + */ + public function removeVisitor(NodeVisitor $visitor) { - return $this->pInfixOp(BinaryOp\Mul::class, $node->left, ' * ', $node->right); + foreach ($this->visitors as $index => $storedVisitor) { + if ($storedVisitor === $visitor) { + unset($this->visitors[$index]); + break; + } + } } - protected function pExpr_BinaryOp_Div(BinaryOp\Div $node) + /** + * Traverses an array of nodes using the registered visitors. + * + * @param Node[] $nodes Array of nodes + * + * @return Node[] Traversed array of nodes + */ + public function traverse(array $nodes) : array { - return $this->pInfixOp(BinaryOp\Div::class, $node->left, ' / ', $node->right); + $this->stopTraversal = \false; + foreach ($this->visitors as $visitor) { + if (null !== ($return = $visitor->beforeTraverse($nodes))) { + $nodes = $return; + } + } + $nodes = $this->traverseArray($nodes); + foreach ($this->visitors as $visitor) { + if (null !== ($return = $visitor->afterTraverse($nodes))) { + $nodes = $return; + } + } + return $nodes; } - protected function pExpr_BinaryOp_Concat(BinaryOp\Concat $node) + /** + * Recursively traverse a node. + * + * @param Node $node Node to traverse. + * + * @return Node Result of traversal (may be original node or new one) + */ + protected function traverseNode(Node $node) : Node { - return $this->pInfixOp(BinaryOp\Concat::class, $node->left, ' . ', $node->right); + foreach ($node->getSubNodeNames() as $name) { + $subNode =& $node->{$name}; + if (\is_array($subNode)) { + $subNode = $this->traverseArray($subNode); + if ($this->stopTraversal) { + break; + } + } elseif ($subNode instanceof Node) { + $traverseChildren = \true; + $breakVisitorIndex = null; + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->enterNode($subNode); + if (null !== $return) { + if ($return instanceof Node) { + $this->ensureReplacementReasonable($subNode, $return); + $subNode = $return; + } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { + $traverseChildren = \false; + } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { + $traverseChildren = \false; + $breakVisitorIndex = $visitorIndex; + break; + } elseif (self::STOP_TRAVERSAL === $return) { + $this->stopTraversal = \true; + break 2; + } else { + throw new \LogicException('enterNode() returned invalid value of type ' . \gettype($return)); + } + } + } + if ($traverseChildren) { + $subNode = $this->traverseNode($subNode); + if ($this->stopTraversal) { + break; + } + } + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->leaveNode($subNode); + if (null !== $return) { + if ($return instanceof Node) { + $this->ensureReplacementReasonable($subNode, $return); + $subNode = $return; + } elseif (self::STOP_TRAVERSAL === $return) { + $this->stopTraversal = \true; + break 2; + } elseif (\is_array($return)) { + throw new \LogicException('leaveNode() may only return an array ' . 'if the parent structure is an array'); + } else { + throw new \LogicException('leaveNode() returned invalid value of type ' . \gettype($return)); + } + } + if ($breakVisitorIndex === $visitorIndex) { + break; + } + } + } + } + return $node; } - protected function pExpr_BinaryOp_Mod(BinaryOp\Mod $node) + /** + * Recursively traverse array (usually of nodes). + * + * @param array $nodes Array to traverse + * + * @return array Result of traversal (may be original array or changed one) + */ + protected function traverseArray(array $nodes) : array { - return $this->pInfixOp(BinaryOp\Mod::class, $node->left, ' % ', $node->right); - } - protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node) - { - return $this->pInfixOp(BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right); + $doNodes = []; + foreach ($nodes as $i => &$node) { + if ($node instanceof Node) { + $traverseChildren = \true; + $breakVisitorIndex = null; + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->enterNode($node); + if (null !== $return) { + if ($return instanceof Node) { + $this->ensureReplacementReasonable($node, $return); + $node = $return; + } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { + $traverseChildren = \false; + } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { + $traverseChildren = \false; + $breakVisitorIndex = $visitorIndex; + break; + } elseif (self::STOP_TRAVERSAL === $return) { + $this->stopTraversal = \true; + break 2; + } else { + throw new \LogicException('enterNode() returned invalid value of type ' . \gettype($return)); + } + } + } + if ($traverseChildren) { + $node = $this->traverseNode($node); + if ($this->stopTraversal) { + break; + } + } + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->leaveNode($node); + if (null !== $return) { + if ($return instanceof Node) { + $this->ensureReplacementReasonable($node, $return); + $node = $return; + } elseif (\is_array($return)) { + $doNodes[] = [$i, $return]; + break; + } elseif (self::REMOVE_NODE === $return) { + $doNodes[] = [$i, []]; + break; + } elseif (self::STOP_TRAVERSAL === $return) { + $this->stopTraversal = \true; + break 2; + } elseif (\false === $return) { + throw new \LogicException('bool(false) return from leaveNode() no longer supported. ' . 'Return NodeTraverser::REMOVE_NODE instead'); + } else { + throw new \LogicException('leaveNode() returned invalid value of type ' . \gettype($return)); + } + } + if ($breakVisitorIndex === $visitorIndex) { + break; + } + } + } elseif (\is_array($node)) { + throw new \LogicException('Invalid node structure: Contains nested arrays'); + } + } + if (!empty($doNodes)) { + while (list($i, $replace) = \array_pop($doNodes)) { + \array_splice($nodes, $i, 1, $replace); + } + } + return $nodes; } - protected function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node) + private function ensureReplacementReasonable($old, $new) { - return $this->pInfixOp(BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right); + if ($old instanceof Node\Stmt && $new instanceof Node\Expr) { + throw new \LogicException("Trying to replace statement ({$old->getType()}) " . "with expression ({$new->getType()}). Are you missing a " . "Stmt_Expression wrapper?"); + } + if ($old instanceof Node\Expr && $new instanceof Node\Stmt) { + throw new \LogicException("Trying to replace expression ({$old->getType()}) " . "with statement ({$new->getType()})"); + } } - protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node) +} + $node stays as-is + * * NodeTraverser::DONT_TRAVERSE_CHILDREN + * => Children of $node are not traversed. $node stays as-is + * * NodeTraverser::STOP_TRAVERSAL + * => Traversal is aborted. $node stays as-is + * * otherwise + * => $node is set to the return value + * + * @param Node $node Node + * + * @return null|int|Node Replacement node (or special return value) + */ + public function enterNode(Node $node); + /** + * Called when leaving a node. + * + * Return value semantics: + * * null + * => $node stays as-is + * * NodeTraverser::REMOVE_NODE + * => $node is removed from the parent array + * * NodeTraverser::STOP_TRAVERSAL + * => Traversal is aborted. $node stays as-is + * * array (of Nodes) + * => The return value is merged into the parent array (at the position of the $node) + * * otherwise + * => $node is set to the return value + * + * @param Node $node Node + * + * @return null|int|Node|Node[] Replacement node (or special return value) + */ + public function leaveNode(Node $node); + /** + * Called once after traversal. + * + * Return value semantics: + * * null: $nodes stays as-is + * * otherwise: $nodes is set to the return value + * + * @param Node[] $nodes Array of nodes + * + * @return null|Node[] Array of nodes + */ + public function afterTraverse(array $nodes); +} +pInfixOp(BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right); + $node = clone $origNode; + $node->setAttribute('origNode', $origNode); + return $node; } - protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node) +} +pInfixOp(BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right); + $this->filterCallback = $filterCallback; } - protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node) + /** + * Get found nodes satisfying the filter callback. + * + * Nodes are returned in pre-order. + * + * @return Node[] Found nodes + */ + public function getFoundNodes() : array { - return $this->pInfixOp(BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right); + return $this->foundNodes; } - protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node) + public function beforeTraverse(array $nodes) { - return $this->pInfixOp(BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right); + $this->foundNodes = []; + return null; } - protected function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node) + public function enterNode(Node $node) { - return $this->pInfixOp(BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right); + $filterCallback = $this->filterCallback; + if ($filterCallback($node)) { + $this->foundNodes[] = $node; + } + return null; } - protected function pExpr_BinaryOp_Pow(BinaryOp\Pow $node) +} +pInfixOp(BinaryOp\Pow::class, $node->left, ' ** ', $node->right); + $this->filterCallback = $filterCallback; } - protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node) + /** + * Get found node satisfying the filter callback. + * + * Returns null if no node satisfies the filter callback. + * + * @return null|Node Found node (or null if not found) + */ + public function getFoundNode() { - return $this->pInfixOp(BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right); + return $this->foundNode; } - protected function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node) + public function beforeTraverse(array $nodes) { - return $this->pInfixOp(BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right); + $this->foundNode = null; + return null; } - protected function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node) + public function enterNode(Node $node) { - return $this->pInfixOp(BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right); + $filterCallback = $this->filterCallback; + if ($filterCallback($node)) { + $this->foundNode = $node; + return NodeTraverser::STOP_TRAVERSAL; + } + return null; } - protected function pExpr_BinaryOp_Equal(BinaryOp\Equal $node) +} +pInfixOp(BinaryOp\Equal::class, $node->left, ' == ', $node->right); + $this->nameContext = new NameContext($errorHandler ?? new ErrorHandler\Throwing()); + $this->preserveOriginalNames = $options['preserveOriginalNames'] ?? \false; + $this->replaceNodes = $options['replaceNodes'] ?? \true; } - protected function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node) + /** + * Get name resolution context. + * + * @return NameContext + */ + public function getNameContext() : NameContext { - return $this->pInfixOp(BinaryOp\NotEqual::class, $node->left, ' != ', $node->right); + return $this->nameContext; } - protected function pExpr_BinaryOp_Identical(BinaryOp\Identical $node) + public function beforeTraverse(array $nodes) { - return $this->pInfixOp(BinaryOp\Identical::class, $node->left, ' === ', $node->right); + $this->nameContext->startNamespace(); + return null; } - protected function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node) + public function enterNode(Node $node) { - return $this->pInfixOp(BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right); + if ($node instanceof Stmt\Namespace_) { + $this->nameContext->startNamespace($node->name); + } elseif ($node instanceof Stmt\Use_) { + foreach ($node->uses as $use) { + $this->addAlias($use, $node->type, null); + } + } elseif ($node instanceof Stmt\GroupUse) { + foreach ($node->uses as $use) { + $this->addAlias($use, $node->type, $node->prefix); + } + } elseif ($node instanceof Stmt\Class_) { + if (null !== $node->extends) { + $node->extends = $this->resolveClassName($node->extends); + } + foreach ($node->implements as &$interface) { + $interface = $this->resolveClassName($interface); + } + $this->resolveAttrGroups($node); + if (null !== $node->name) { + $this->addNamespacedName($node); + } + } elseif ($node instanceof Stmt\Interface_) { + foreach ($node->extends as &$interface) { + $interface = $this->resolveClassName($interface); + } + $this->resolveAttrGroups($node); + $this->addNamespacedName($node); + } elseif ($node instanceof Stmt\Enum_) { + foreach ($node->implements as &$interface) { + $interface = $this->resolveClassName($interface); + } + $this->resolveAttrGroups($node); + if (null !== $node->name) { + $this->addNamespacedName($node); + } + } elseif ($node instanceof Stmt\Trait_) { + $this->resolveAttrGroups($node); + $this->addNamespacedName($node); + } elseif ($node instanceof Stmt\Function_) { + $this->resolveSignature($node); + $this->resolveAttrGroups($node); + $this->addNamespacedName($node); + } elseif ($node instanceof Stmt\ClassMethod || $node instanceof Expr\Closure || $node instanceof Expr\ArrowFunction) { + $this->resolveSignature($node); + $this->resolveAttrGroups($node); + } elseif ($node instanceof Stmt\Property) { + if (null !== $node->type) { + $node->type = $this->resolveType($node->type); + } + $this->resolveAttrGroups($node); + } elseif ($node instanceof Stmt\Const_) { + foreach ($node->consts as $const) { + $this->addNamespacedName($const); + } + } else { + if ($node instanceof Stmt\ClassConst) { + $this->resolveAttrGroups($node); + } else { + if ($node instanceof Stmt\EnumCase) { + $this->resolveAttrGroups($node); + } elseif ($node instanceof Expr\StaticCall || $node instanceof Expr\StaticPropertyFetch || $node instanceof Expr\ClassConstFetch || $node instanceof Expr\New_ || $node instanceof Expr\Instanceof_) { + if ($node->class instanceof Name) { + $node->class = $this->resolveClassName($node->class); + } + } elseif ($node instanceof Stmt\Catch_) { + foreach ($node->types as &$type) { + $type = $this->resolveClassName($type); + } + } elseif ($node instanceof Expr\FuncCall) { + if ($node->name instanceof Name) { + $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION); + } + } elseif ($node instanceof Expr\ConstFetch) { + $node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT); + } elseif ($node instanceof Stmt\TraitUse) { + foreach ($node->traits as &$trait) { + $trait = $this->resolveClassName($trait); + } + foreach ($node->adaptations as $adaptation) { + if (null !== $adaptation->trait) { + $adaptation->trait = $this->resolveClassName($adaptation->trait); + } + if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) { + foreach ($adaptation->insteadof as &$insteadof) { + $insteadof = $this->resolveClassName($insteadof); + } + } + } + } + } + } + return null; } - protected function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node) + private function addAlias(Stmt\UseUse $use, $type, Name $prefix = null) { - return $this->pInfixOp(BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right); + // Add prefix for group uses + $name = $prefix ? Name::concat($prefix, $use->name) : $use->name; + // Type is determined either by individual element or whole use declaration + $type |= $use->type; + $this->nameContext->addAlias($name, (string) $use->getAlias(), $type, $use->getAttributes()); } - protected function pExpr_BinaryOp_Greater(BinaryOp\Greater $node) + /** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure $node */ + private function resolveSignature($node) { - return $this->pInfixOp(BinaryOp\Greater::class, $node->left, ' > ', $node->right); + foreach ($node->params as $param) { + $param->type = $this->resolveType($param->type); + $this->resolveAttrGroups($param); + } + $node->returnType = $this->resolveType($node->returnType); } - protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node) + private function resolveType($node) { - return $this->pInfixOp(BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right); + if ($node instanceof Name) { + return $this->resolveClassName($node); + } + if ($node instanceof Node\NullableType) { + $node->type = $this->resolveType($node->type); + return $node; + } + if ($node instanceof Node\UnionType || $node instanceof Node\IntersectionType) { + foreach ($node->types as &$type) { + $type = $this->resolveType($type); + } + return $node; + } + return $node; } - protected function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node) + /** + * Resolve name, according to name resolver options. + * + * @param Name $name Function or constant name to resolve + * @param int $type One of Stmt\Use_::TYPE_* + * + * @return Name Resolved name, or original name with attribute + */ + protected function resolveName(Name $name, int $type) : Name { - return $this->pInfixOp(BinaryOp\Smaller::class, $node->left, ' < ', $node->right); + if (!$this->replaceNodes) { + $resolvedName = $this->nameContext->getResolvedName($name, $type); + if (null !== $resolvedName) { + $name->setAttribute('resolvedName', $resolvedName); + } else { + $name->setAttribute('namespacedName', FullyQualified::concat($this->nameContext->getNamespace(), $name, $name->getAttributes())); + } + return $name; + } + if ($this->preserveOriginalNames) { + // Save the original name + $originalName = $name; + $name = clone $originalName; + $name->setAttribute('originalName', $originalName); + } + $resolvedName = $this->nameContext->getResolvedName($name, $type); + if (null !== $resolvedName) { + return $resolvedName; + } + // unqualified names inside a namespace cannot be resolved at compile-time + // add the namespaced version of the name as an attribute + $name->setAttribute('namespacedName', FullyQualified::concat($this->nameContext->getNamespace(), $name, $name->getAttributes())); + return $name; } - protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node) + protected function resolveClassName(Name $name) { - return $this->pInfixOp(BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right); - } - protected function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node) - { - return $this->pInfixOp(BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right); + return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL); } - protected function pExpr_Instanceof(Expr\Instanceof_ $node) + protected function addNamespacedName(Node $node) { - list($precedence, $associativity) = $this->precedenceMap[Expr\Instanceof_::class]; - return $this->pPrec($node->expr, $precedence, $associativity, -1) . ' instanceof ' . $this->pNewVariable($node->class); + $node->namespacedName = Name::concat($this->nameContext->getNamespace(), (string) $node->name); } - // Unary expressions - protected function pExpr_BooleanNot(Expr\BooleanNot $node) + protected function resolveAttrGroups(Node $node) { - return $this->pPrefixOp(Expr\BooleanNot::class, '!', $node->expr); + foreach ($node->attrGroups as $attrGroup) { + foreach ($attrGroup->attrs as $attr) { + $attr->name = $this->resolveClassName($attr->name); + } + } } - protected function pExpr_BitwiseNot(Expr\BitwiseNot $node) +} +$node->getAttribute('parent'), the previous + * node can be accessed through $node->getAttribute('previous'), + * and the next node can be accessed through $node->getAttribute('next'). + */ +final class NodeConnectingVisitor extends NodeVisitorAbstract +{ + /** + * @var Node[] + */ + private $stack = []; + /** + * @var ?Node + */ + private $previous; + public function beforeTraverse(array $nodes) { - return $this->pPrefixOp(Expr\BitwiseNot::class, '~', $node->expr); + $this->stack = []; + $this->previous = null; } - protected function pExpr_UnaryMinus(Expr\UnaryMinus $node) + public function enterNode(Node $node) { - if ($node->expr instanceof Expr\UnaryMinus || $node->expr instanceof Expr\PreDec) { - // Enforce -(-$expr) instead of --$expr - return '-(' . $this->p($node->expr) . ')'; + if (!empty($this->stack)) { + $node->setAttribute('parent', $this->stack[\count($this->stack) - 1]); } - return $this->pPrefixOp(Expr\UnaryMinus::class, '-', $node->expr); - } - protected function pExpr_UnaryPlus(Expr\UnaryPlus $node) - { - if ($node->expr instanceof Expr\UnaryPlus || $node->expr instanceof Expr\PreInc) { - // Enforce +(+$expr) instead of ++$expr - return '+(' . $this->p($node->expr) . ')'; + if ($this->previous !== null && $this->previous->getAttribute('parent') === $node->getAttribute('parent')) { + $node->setAttribute('previous', $this->previous); + $this->previous->setAttribute('next', $node); } - return $this->pPrefixOp(Expr\UnaryPlus::class, '+', $node->expr); - } - protected function pExpr_PreInc(Expr\PreInc $node) - { - return $this->pPrefixOp(Expr\PreInc::class, '++', $node->var); - } - protected function pExpr_PreDec(Expr\PreDec $node) - { - return $this->pPrefixOp(Expr\PreDec::class, '--', $node->var); - } - protected function pExpr_PostInc(Expr\PostInc $node) - { - return $this->pPostfixOp(Expr\PostInc::class, $node->var, '++'); - } - protected function pExpr_PostDec(Expr\PostDec $node) - { - return $this->pPostfixOp(Expr\PostDec::class, $node->var, '--'); - } - protected function pExpr_ErrorSuppress(Expr\ErrorSuppress $node) - { - return $this->pPrefixOp(Expr\ErrorSuppress::class, '@', $node->expr); - } - protected function pExpr_YieldFrom(Expr\YieldFrom $node) - { - return $this->pPrefixOp(Expr\YieldFrom::class, 'yield from ', $node->expr); + $this->stack[] = $node; } - protected function pExpr_Print(Expr\Print_ $node) + public function leaveNode(Node $node) { - return $this->pPrefixOp(Expr\Print_::class, 'print ', $node->expr); + $this->previous = $node; + \array_pop($this->stack); } - // Casts - protected function pExpr_Cast_Int(Cast\Int_ $node) +} +$node->getAttribute('parent'). + */ +final class ParentConnectingVisitor extends NodeVisitorAbstract +{ + /** + * @var Node[] + */ + private $stack = []; + public function beforeTraverse(array $nodes) { - return $this->pPrefixOp(Cast\Int_::class, '(int) ', $node->expr); + $this->stack = []; } - protected function pExpr_Cast_Double(Cast\Double $node) + public function enterNode(Node $node) { - $kind = $node->getAttribute('kind', Cast\Double::KIND_DOUBLE); - if ($kind === Cast\Double::KIND_DOUBLE) { - $cast = '(double)'; - } elseif ($kind === Cast\Double::KIND_FLOAT) { - $cast = '(float)'; - } elseif ($kind === Cast\Double::KIND_REAL) { - $cast = '(real)'; + if (!empty($this->stack)) { + $node->setAttribute('parent', $this->stack[count($this->stack) - 1]); } - return $this->pPrefixOp(Cast\Double::class, $cast . ' ', $node->expr); - } - protected function pExpr_Cast_String(Cast\String_ $node) - { - return $this->pPrefixOp(Cast\String_::class, '(string) ', $node->expr); - } - protected function pExpr_Cast_Array(Cast\Array_ $node) - { - return $this->pPrefixOp(Cast\Array_::class, '(array) ', $node->expr); - } - protected function pExpr_Cast_Object(Cast\Object_ $node) - { - return $this->pPrefixOp(Cast\Object_::class, '(object) ', $node->expr); - } - protected function pExpr_Cast_Bool(Cast\Bool_ $node) - { - return $this->pPrefixOp(Cast\Bool_::class, '(bool) ', $node->expr); - } - protected function pExpr_Cast_Unset(Cast\Unset_ $node) - { - return $this->pPrefixOp(Cast\Unset_::class, '(unset) ', $node->expr); - } - // Function calls and similar constructs - protected function pExpr_FuncCall(Expr\FuncCall $node) - { - return $this->pCallLhs($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - protected function pExpr_MethodCall(Expr\MethodCall $node) - { - return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node) - { - return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - protected function pExpr_StaticCall(Expr\StaticCall $node) - { - return $this->pDereferenceLhs($node->class) . '::' . ($node->name instanceof Expr ? $node->name instanceof Expr\Variable ? $this->p($node->name) : '{' . $this->p($node->name) . '}' : $node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - protected function pExpr_Empty(Expr\Empty_ $node) - { - return 'empty(' . $this->p($node->expr) . ')'; + $this->stack[] = $node; } - protected function pExpr_Isset(Expr\Isset_ $node) + public function leaveNode(Node $node) { - return 'isset(' . $this->pCommaSeparated($node->vars) . ')'; + array_pop($this->stack); } - protected function pExpr_Eval(Expr\Eval_ $node) +} +p($node->expr) . ')'; + return null; } - protected function pExpr_Include(Expr\Include_ $node) + public function enterNode(Node $node) { - static $map = [Expr\Include_::TYPE_INCLUDE => 'include', Expr\Include_::TYPE_INCLUDE_ONCE => 'include_once', Expr\Include_::TYPE_REQUIRE => 'require', Expr\Include_::TYPE_REQUIRE_ONCE => 'require_once']; - return $map[$node->type] . ' ' . $this->p($node->expr); + return null; } - protected function pExpr_List(Expr\List_ $node) + public function leaveNode(Node $node) { - return 'list(' . $this->pCommaSeparated($node->items) . ')'; + return null; } - // Other - protected function pExpr_Error(Expr\Error $node) + public function afterTraverse(array $nodes) { - throw new \LogicException('Cannot pretty-print AST with Error nodes'); + return null; } - protected function pExpr_Variable(Expr\Variable $node) +} +name instanceof Expr) { - return '${' . $this->p($node->name) . '}'; - } else { - return '$' . $node->name; - } + $this->parsers = $parsers; } - protected function pExpr_Array(Expr\Array_ $node) + public function parse(string $code, ErrorHandler $errorHandler = null) { - $syntax = $node->getAttribute('kind', $this->options['shortArraySyntax'] ? Expr\Array_::KIND_SHORT : Expr\Array_::KIND_LONG); - if ($syntax === Expr\Array_::KIND_SHORT) { - return '[' . $this->pMaybeMultiline($node->items, \true) . ']'; - } else { - return 'array(' . $this->pMaybeMultiline($node->items, \true) . ')'; + if (null === $errorHandler) { + $errorHandler = new ErrorHandler\Throwing(); } - } - protected function pExpr_ArrayItem(Expr\ArrayItem $node) - { - return (null !== $node->key ? $this->p($node->key) . ' => ' : '') . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); - } - protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node) - { - return $this->pDereferenceLhs($node->var) . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']'; - } - protected function pExpr_ConstFetch(Expr\ConstFetch $node) - { - return $this->p($node->name); - } - protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) - { - return $this->pDereferenceLhs($node->class) . '::' . $this->p($node->name); - } - protected function pExpr_PropertyFetch(Expr\PropertyFetch $node) - { - return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name); - } - protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node) - { - return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name); - } - protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) - { - return $this->pDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name); - } - protected function pExpr_ShellExec(Expr\ShellExec $node) - { - return '`' . $this->pEncapsList($node->parts, '`') . '`'; - } - protected function pExpr_Closure(Expr\Closure $node) - { - return $this->pAttrGroups($node->attrGroups, \true) . ($node->static ? 'static ' : '') . 'function ' . ($node->byRef ? '&' : '') . '(' . $this->pCommaSeparated($node->params) . ')' . (!empty($node->uses) ? ' use(' . $this->pCommaSeparated($node->uses) . ')' : '') . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - protected function pExpr_Match(Expr\Match_ $node) - { - return 'match (' . $this->p($node->cond) . ') {' . $this->pCommaSeparatedMultiline($node->arms, \true) . $this->nl . '}'; - } - protected function pMatchArm(Node\MatchArm $node) - { - return ($node->conds ? $this->pCommaSeparated($node->conds) : 'default') . ' => ' . $this->p($node->body); - } - protected function pExpr_ArrowFunction(Expr\ArrowFunction $node) - { - return $this->pAttrGroups($node->attrGroups, \true) . ($node->static ? 'static ' : '') . 'fn' . ($node->byRef ? '&' : '') . '(' . $this->pCommaSeparated($node->params) . ')' . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . ' => ' . $this->p($node->expr); - } - protected function pExpr_ClosureUse(Expr\ClosureUse $node) - { - return ($node->byRef ? '&' : '') . $this->p($node->var); - } - protected function pExpr_New(Expr\New_ $node) - { - if ($node->class instanceof Stmt\Class_) { - $args = $node->args ? '(' . $this->pMaybeMultiline($node->args) . ')' : ''; - return 'new ' . $this->pClassCommon($node->class, $args); + list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code); + if ($firstError === null) { + return $firstStmts; } - return 'new ' . $this->pNewVariable($node->class) . '(' . $this->pMaybeMultiline($node->args) . ')'; - } - protected function pExpr_Clone(Expr\Clone_ $node) - { - return 'clone ' . $this->p($node->expr); - } - protected function pExpr_Ternary(Expr\Ternary $node) - { - // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator. - // this is okay because the part between ? and : never needs parentheses. - return $this->pInfixOp(Expr\Ternary::class, $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else); - } - protected function pExpr_Exit(Expr\Exit_ $node) - { - $kind = $node->getAttribute('kind', Expr\Exit_::KIND_DIE); - return ($kind === Expr\Exit_::KIND_EXIT ? 'exit' : 'die') . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : ''); - } - protected function pExpr_Throw(Expr\Throw_ $node) - { - return 'throw ' . $this->p($node->expr); - } - protected function pExpr_Yield(Expr\Yield_ $node) - { - if ($node->value === null) { - return 'yield'; - } else { - // this is a bit ugly, but currently there is no way to detect whether the parentheses are necessary - return '(yield ' . ($node->key !== null ? $this->p($node->key) . ' => ' : '') . $this->p($node->value) . ')'; + for ($i = 1, $c = \count($this->parsers); $i < $c; ++$i) { + list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code); + if ($error === null) { + return $stmts; + } } + throw $firstError; } - // Declarations - protected function pStmt_Namespace(Stmt\Namespace_ $node) + private function tryParse(Parser $parser, ErrorHandler $errorHandler, $code) { - if ($this->canUseSemicolonNamespaces) { - return 'namespace ' . $this->p($node->name) . ';' . $this->nl . $this->pStmts($node->stmts, \false); - } else { - return 'namespace' . (null !== $node->name ? ' ' . $this->p($node->name) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; + $stmts = null; + $error = null; + try { + $stmts = $parser->parse($code, $errorHandler); + } catch (Error $error) { } + return [$stmts, $error]; } - protected function pStmt_Use(Stmt\Use_ $node) - { - return 'use ' . $this->pUseType($node->type) . $this->pCommaSeparated($node->uses) . ';'; - } - protected function pStmt_GroupUse(Stmt\GroupUse $node) - { - return 'use ' . $this->pUseType($node->type) . $this->pName($node->prefix) . '\\{' . $this->pCommaSeparated($node->uses) . '};'; - } - protected function pStmt_UseUse(Stmt\UseUse $node) - { - return $this->pUseType($node->type) . $this->p($node->name) . (null !== $node->alias ? ' as ' . $node->alias : ''); - } - protected function pUseType($type) - { - return $type === Stmt\Use_::TYPE_FUNCTION ? 'function ' : ($type === Stmt\Use_::TYPE_CONSTANT ? 'const ' : ''); - } - protected function pStmt_Interface(Stmt\Interface_ $node) - { - return $this->pAttrGroups($node->attrGroups) . 'interface ' . $node->name . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - protected function pStmt_Enum(Stmt\Enum_ $node) - { - return $this->pAttrGroups($node->attrGroups) . 'enum ' . $node->name . ($node->scalarType ? " : {$node->scalarType}" : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - protected function pStmt_Class(Stmt\Class_ $node) - { - return $this->pClassCommon($node, ' ' . $node->name); - } - protected function pStmt_Trait(Stmt\Trait_ $node) - { - return $this->pAttrGroups($node->attrGroups) . 'trait ' . $node->name . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - protected function pStmt_EnumCase(Stmt\EnumCase $node) - { - return $this->pAttrGroups($node->attrGroups) . 'case ' . $node->name . ($node->expr ? ' = ' . $this->p($node->expr) : '') . ';'; - } - protected function pStmt_TraitUse(Stmt\TraitUse $node) - { - return 'use ' . $this->pCommaSeparated($node->traits) . (empty($node->adaptations) ? ';' : ' {' . $this->pStmts($node->adaptations) . $this->nl . '}'); - } - protected function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node) - { - return $this->p($node->trait) . '::' . $node->method . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';'; - } - protected function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node) - { - return (null !== $node->trait ? $this->p($node->trait) . '::' : '') . $node->method . ' as' . (null !== $node->newModifier ? ' ' . \rtrim($this->pModifiers($node->newModifier), ' ') : '') . (null !== $node->newName ? ' ' . $node->newName : '') . ';'; - } - protected function pStmt_Property(Stmt\Property $node) - { - return $this->pAttrGroups($node->attrGroups) . (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags)) . ($node->type ? $this->p($node->type) . ' ' : '') . $this->pCommaSeparated($node->props) . ';'; - } - protected function pStmt_PropertyProperty(Stmt\PropertyProperty $node) - { - return '$' . $node->name . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); - } - protected function pStmt_ClassMethod(Stmt\ClassMethod $node) - { - return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pMaybeMultiline($node->params) . ')' . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . (null !== $node->stmts ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); - } - protected function pStmt_ClassConst(Stmt\ClassConst $node) - { - return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'const ' . $this->pCommaSeparated($node->consts) . ';'; - } - protected function pStmt_Function(Stmt\Function_ $node) - { - return $this->pAttrGroups($node->attrGroups) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pCommaSeparated($node->params) . ')' . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - protected function pStmt_Const(Stmt\Const_ $node) - { - return 'const ' . $this->pCommaSeparated($node->consts) . ';'; - } - protected function pStmt_Declare(Stmt\Declare_ $node) - { - return 'declare (' . $this->pCommaSeparated($node->declares) . ')' . (null !== $node->stmts ? ' {' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); - } - protected function pStmt_DeclareDeclare(Stmt\DeclareDeclare $node) - { - return $node->key . '=' . $this->p($node->value); - } - // Control flow - protected function pStmt_If(Stmt\If_ $node) - { - return 'if (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->elseifs ? ' ' . $this->pImplode($node->elseifs, ' ') : '') . (null !== $node->else ? ' ' . $this->p($node->else) : ''); - } - protected function pStmt_ElseIf(Stmt\ElseIf_ $node) - { - return 'elseif (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - protected function pStmt_Else(Stmt\Else_ $node) +} +'", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "';'", "'{'", "'}'", "'('", "')'", "'\$'", "'`'", "']'", "'\"'", "T_READONLY", "T_ENUM", "T_NULLSAFE_OBJECT_OPERATOR", "T_ATTRIBUTE"); + protected $tokenToSymbol = array(0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 56, 163, 168, 160, 55, 168, 168, 158, 159, 53, 50, 8, 51, 52, 54, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 31, 155, 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 70, 168, 162, 36, 168, 161, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 156, 35, 157, 58, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 164, 122, 123, 124, 125, 126, 127, 128, 129, 165, 130, 131, 132, 166, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 167); + protected $action = array(699, 669, 670, 671, 672, 673, 286, 674, 675, 676, 712, 713, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 0, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, 245, 246, 242, 243, 244, -32766, -32766, 677, -32766, 750, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 1224, 245, 246, 1225, 678, 679, 680, 681, 682, 683, 684, -32766, 48, 746, -32766, -32766, -32766, -32766, -32766, -32766, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 715, 738, 716, 717, 718, 719, 707, 708, 709, 737, 710, 711, 696, 697, 698, 700, 701, 702, 740, 741, 742, 743, 744, 745, 703, 704, 705, 706, 736, 727, 725, 726, 722, 723, 751, 714, 720, 721, 728, 729, 731, 730, 732, 733, 55, 56, 425, 57, 58, 724, 735, 734, 1073, 59, 60, -224, 61, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 121, -32767, -32767, -32767, -32767, 29, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 1043, 766, 1071, 767, 580, 62, 63, -32766, -32766, -32766, -32766, 64, 516, 65, 294, 295, 66, 67, 68, 69, 70, 71, 72, 73, 822, 25, 302, 74, 418, 981, 983, 1043, 1181, 1095, 1096, 1073, 748, 754, 1075, 1074, 1076, 469, -32766, -32766, -32766, 337, 823, 54, -32767, -32767, -32767, -32767, 98, 99, 100, 101, 102, 220, 221, 222, 78, 361, 1107, -32766, 341, -32766, -32766, -32766, -32766, -32766, 1107, 492, 949, 950, 951, 948, 947, 946, 207, 477, 478, 949, 950, 951, 948, 947, 946, 1043, 479, 480, 52, 1101, 1102, 1103, 1104, 1098, 1099, 319, 872, 668, 667, 27, -511, 1105, 1100, -32766, 130, 1075, 1074, 1076, 345, 668, 667, 41, 126, 341, 334, 369, 336, 426, -128, -128, -128, 896, 897, 468, 220, 221, 222, 811, 1195, 619, 40, 21, 427, -128, 470, -128, 471, -128, 472, -128, 802, 428, -4, 823, 54, 207, 33, 34, 429, 360, 317, 28, 35, 473, -32766, -32766, -32766, 211, 356, 357, 474, 475, -32766, -32766, -32766, 754, 476, 49, 313, 794, 843, 430, 431, 289, 125, -32766, 813, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, -32767, -32766, -32766, -32766, 769, 103, 104, 105, 327, 307, 825, 633, -128, 1075, 1074, 1076, 221, 222, 927, 748, 1146, 106, -32766, 129, -32766, -32766, -32766, -32766, 426, 823, 54, 902, 873, 302, 468, 75, 207, 359, 811, 668, 667, 40, 21, 427, 754, 470, 754, 471, 423, 472, 1043, 127, 428, 435, 1043, 341, 1043, 33, 34, 429, 360, 1181, 415, 35, 473, 122, 10, 315, 128, 356, 357, 474, 475, -32766, -32766, -32766, 768, 476, 668, 667, 758, 843, 430, 431, 754, 1043, 1147, -32766, -32766, -32766, 754, 419, 342, 1215, -32766, 131, -32766, -32766, -32766, 341, 363, 346, 426, 823, 54, 100, 101, 102, 468, 825, 633, -4, 811, 442, 903, 40, 21, 427, 754, 470, 435, 471, 341, 472, 341, 766, 428, 767, -209, -209, -209, 33, 34, 429, 360, 479, 1196, 35, 473, 345, -32766, -32766, -32766, 356, 357, 474, 475, 220, 221, 222, 421, 476, 32, 297, 794, 843, 430, 431, 754, 754, 435, -32766, 341, -32766, -32766, 9, 300, 51, 207, 249, 324, 753, 120, 220, 221, 222, 426, 30, 247, 941, 422, 424, 468, 825, 633, -209, 811, 1043, 1061, 40, 21, 427, 129, 470, 207, 471, 341, 472, 804, 20, 428, 124, -208, -208, -208, 33, 34, 429, 360, 479, 212, 35, 473, 923, -259, 823, 54, 356, 357, 474, 475, -32766, -32766, -32766, 1043, 476, 213, 806, 794, 843, 430, 431, -32766, -32766, 435, 435, 341, 341, 443, 79, 80, 81, -32766, 668, 667, 636, 344, 808, 668, 667, 239, 240, 241, 123, 214, 538, 250, 825, 633, -208, 36, 251, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 252, 307, 426, 220, 221, 222, 823, 54, 468, -32766, 222, 765, 811, 106, 134, 40, 21, 427, 571, 470, 207, 471, 445, 472, 207, -32766, 428, 896, 897, 207, 307, 33, 34, 429, 245, 246, 637, 35, 473, 452, 22, 809, 922, 356, 357, 457, 588, 135, 374, 595, 596, 476, -228, 759, 639, 938, 653, 926, 661, -86, 823, 54, 314, 644, 647, 821, 133, 836, 43, 106, 603, 44, 45, 46, 47, 748, 50, 53, 132, 426, 302, -32766, 520, 825, 633, 468, -84, 607, 577, 811, 641, 362, 40, 21, 427, -278, 470, 754, 471, 954, 472, 441, 627, 428, 823, 54, 574, 844, 33, 34, 429, 11, 615, 845, 35, 473, 444, 461, 285, -511, 356, 357, 592, -419, 593, 1106, 1153, -410, 476, 368, 838, 38, 658, 426, 645, 795, 1052, 0, 325, 468, 0, -32766, 0, 811, 0, 0, 40, 21, 427, 0, 470, 0, 471, 0, 472, 0, 322, 428, 823, 54, 825, 633, 33, 34, 429, 0, 326, 0, 35, 473, 323, 0, 316, 318, 356, 357, -512, 426, 0, 753, 531, 0, 476, 468, 6, 0, 0, 811, 650, 7, 40, 21, 427, 12, 470, 14, 471, 373, 472, -420, 562, 428, 823, 54, 78, -225, 33, 34, 429, 39, 656, 657, 35, 473, 859, 633, 764, 812, 356, 357, 820, 799, 814, 875, 866, 867, 476, 797, 860, 857, 855, 426, 933, 934, 931, 819, 803, 468, 805, 807, 810, 811, 930, 762, 40, 21, 427, 763, 470, 932, 471, 335, 472, 358, 634, 428, 638, 640, 825, 633, 33, 34, 429, 642, 643, 646, 35, 473, 648, 649, 651, 652, 356, 357, 635, 426, 1221, 1223, 761, 842, 476, 468, 248, 760, 841, 811, 1222, 840, 40, 21, 427, 1057, 470, 830, 471, 1045, 472, 839, 1046, 428, 828, 215, 216, 939, 33, 34, 429, 217, 864, 218, 35, 473, 825, 633, 24, 865, 356, 357, 456, 1220, 1189, 209, 1187, 1172, 476, 1185, 215, 216, 1086, 1095, 1096, 914, 217, 1193, 218, 1183, -224, 1097, 26, 31, 37, 42, 76, 77, 210, 288, 209, 292, 293, 308, 309, 310, 311, 339, 1095, 1096, 825, 633, 355, 291, 416, 1152, 1097, 16, 17, 18, 393, 453, 460, 462, 466, 552, 624, 1048, 1051, 904, 1111, 1047, 1023, 563, 1022, 1088, 0, 0, -429, 558, 1041, 1101, 1102, 1103, 1104, 1098, 1099, 398, 1054, 1053, 1056, 1055, 1070, 1105, 1100, 1186, 1171, 1167, 1184, 1085, 1218, 1112, 1166, 219, 558, 599, 1101, 1102, 1103, 1104, 1098, 1099, 398, 0, 0, 0, 0, 0, 1105, 1100, 0, 0, 0, 0, 0, 0, 0, 0, 219); + protected $actionCheck = array(2, 3, 4, 5, 6, 7, 14, 9, 10, 11, 12, 13, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 0, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 9, 10, 11, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 69, 70, 53, 54, 55, 9, 10, 57, 30, 80, 32, 33, 34, 35, 36, 37, 38, 80, 69, 70, 83, 71, 72, 73, 74, 75, 76, 77, 9, 70, 80, 33, 34, 35, 36, 37, 38, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 153, 133, 134, 135, 136, 137, 138, 139, 140, 141, 3, 4, 5, 6, 7, 147, 148, 149, 80, 12, 13, 159, 15, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 156, 44, 45, 46, 47, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 13, 106, 116, 108, 85, 50, 51, 33, 34, 35, 36, 56, 85, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 1, 70, 71, 72, 73, 59, 60, 13, 82, 78, 79, 80, 80, 82, 152, 153, 154, 86, 9, 10, 11, 8, 1, 2, 44, 45, 46, 47, 48, 49, 50, 51, 52, 9, 10, 11, 156, 106, 143, 30, 160, 32, 33, 34, 35, 36, 143, 116, 116, 117, 118, 119, 120, 121, 30, 124, 125, 116, 117, 118, 119, 120, 121, 13, 133, 134, 70, 136, 137, 138, 139, 140, 141, 142, 31, 37, 38, 8, 132, 148, 149, 116, 156, 152, 153, 154, 160, 37, 38, 158, 8, 160, 161, 8, 163, 74, 75, 76, 77, 134, 135, 80, 9, 10, 11, 84, 1, 80, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 155, 98, 0, 1, 2, 30, 103, 104, 105, 106, 132, 8, 109, 110, 9, 10, 11, 8, 115, 116, 117, 118, 9, 10, 11, 82, 123, 70, 8, 126, 127, 128, 129, 8, 156, 30, 155, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 9, 10, 11, 157, 53, 54, 55, 8, 57, 155, 156, 157, 152, 153, 154, 10, 11, 157, 80, 162, 69, 30, 151, 32, 33, 34, 35, 74, 1, 2, 159, 155, 71, 80, 151, 30, 8, 84, 37, 38, 87, 88, 89, 82, 91, 82, 93, 8, 95, 13, 156, 98, 158, 13, 160, 13, 103, 104, 105, 106, 82, 108, 109, 110, 156, 8, 113, 31, 115, 116, 117, 118, 9, 10, 11, 157, 123, 37, 38, 126, 127, 128, 129, 82, 13, 159, 33, 34, 35, 82, 127, 8, 85, 30, 156, 32, 33, 34, 160, 8, 147, 74, 1, 2, 50, 51, 52, 80, 155, 156, 157, 84, 31, 159, 87, 88, 89, 82, 91, 158, 93, 160, 95, 160, 106, 98, 108, 100, 101, 102, 103, 104, 105, 106, 133, 159, 109, 110, 160, 9, 10, 11, 115, 116, 117, 118, 9, 10, 11, 8, 123, 144, 145, 126, 127, 128, 129, 82, 82, 158, 30, 160, 32, 33, 108, 8, 70, 30, 31, 113, 152, 16, 9, 10, 11, 74, 14, 14, 122, 8, 8, 80, 155, 156, 157, 84, 13, 159, 87, 88, 89, 151, 91, 30, 93, 160, 95, 155, 159, 98, 14, 100, 101, 102, 103, 104, 105, 106, 133, 16, 109, 110, 155, 157, 1, 2, 115, 116, 117, 118, 9, 10, 11, 13, 123, 16, 155, 126, 127, 128, 129, 33, 34, 158, 158, 160, 160, 156, 9, 10, 11, 30, 37, 38, 31, 70, 155, 37, 38, 50, 51, 52, 156, 16, 81, 16, 155, 156, 157, 30, 16, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 16, 57, 74, 9, 10, 11, 1, 2, 80, 116, 11, 155, 84, 69, 156, 87, 88, 89, 160, 91, 30, 93, 132, 95, 30, 33, 98, 134, 135, 30, 57, 103, 104, 105, 69, 70, 31, 109, 110, 75, 76, 155, 155, 115, 116, 75, 76, 101, 102, 111, 112, 123, 159, 155, 156, 155, 156, 155, 156, 31, 1, 2, 31, 31, 31, 31, 31, 38, 70, 69, 77, 70, 70, 70, 70, 80, 70, 70, 70, 74, 71, 85, 85, 155, 156, 80, 97, 96, 100, 84, 31, 106, 87, 88, 89, 82, 91, 82, 93, 82, 95, 89, 92, 98, 1, 2, 90, 127, 103, 104, 105, 97, 94, 127, 109, 110, 97, 97, 97, 132, 115, 116, 100, 146, 113, 143, 143, 146, 123, 106, 151, 155, 157, 74, 31, 157, 162, -1, 114, 80, -1, 116, -1, 84, -1, -1, 87, 88, 89, -1, 91, -1, 93, -1, 95, -1, 130, 98, 1, 2, 155, 156, 103, 104, 105, -1, 130, -1, 109, 110, 131, -1, 132, 132, 115, 116, 132, 74, -1, 152, 150, -1, 123, 80, 146, -1, -1, 84, 31, 146, 87, 88, 89, 146, 91, 146, 93, 146, 95, 146, 150, 98, 1, 2, 156, 159, 103, 104, 105, 155, 155, 155, 109, 110, 155, 156, 155, 155, 115, 116, 155, 155, 155, 155, 155, 155, 123, 155, 155, 155, 155, 74, 155, 155, 155, 155, 155, 80, 155, 155, 155, 84, 155, 155, 87, 88, 89, 155, 91, 155, 93, 156, 95, 156, 156, 98, 156, 156, 155, 156, 103, 104, 105, 156, 156, 156, 109, 110, 156, 156, 156, 156, 115, 116, 156, 74, 157, 157, 157, 157, 123, 80, 31, 157, 157, 84, 157, 157, 87, 88, 89, 157, 91, 157, 93, 157, 95, 157, 157, 98, 157, 50, 51, 157, 103, 104, 105, 56, 157, 58, 109, 110, 155, 156, 158, 157, 115, 116, 157, 157, 157, 70, 157, 157, 123, 157, 50, 51, 157, 78, 79, 157, 56, 157, 58, 157, 159, 86, 158, 158, 158, 158, 158, 158, 158, 158, 70, 158, 158, 158, 158, 158, 158, 158, 78, 79, 155, 156, 158, 160, 158, 163, 86, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, -1, -1, 161, 134, 161, 136, 137, 138, 139, 140, 141, 142, 162, 162, 162, 162, 162, 148, 149, 162, 162, 162, 162, 162, 162, 162, 162, 158, 134, 162, 136, 137, 138, 139, 140, 141, 142, -1, -1, -1, -1, -1, 148, 149, -1, -1, -1, -1, -1, -1, -1, -1, 158); + protected $actionBase = array(0, 227, 326, 400, 474, 233, 132, 132, 752, -2, -2, 138, -2, -2, -2, 663, 761, 815, 761, 586, 717, 859, 859, 859, 244, 256, 256, 256, 413, 583, 583, 880, 546, 169, 415, 444, 409, 200, 200, 200, 200, 137, 137, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 249, 205, 738, 559, 535, 739, 741, 742, 876, 679, 877, 820, 821, 693, 823, 824, 826, 829, 832, 819, 834, 907, 836, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 67, 536, 299, 510, 230, 44, 652, 652, 652, 652, 652, 652, 652, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 378, 584, 584, 584, 657, 909, 648, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 503, -21, -21, 436, 650, 364, 571, 215, 426, 156, 26, 26, 329, 329, 329, 329, 329, 46, 46, 5, 5, 5, 5, 152, 186, 186, 186, 186, 120, 120, 120, 120, 374, 374, 429, 448, 448, 334, 267, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 336, 427, 427, 572, 572, 408, 551, 551, 551, 551, 671, 171, 171, 391, 311, 311, 311, 109, 641, 856, 68, 68, 68, 68, 68, 68, 324, 324, 324, -3, -3, -3, 655, 77, 380, 77, 380, 683, 685, 86, 685, 654, -15, 516, 776, 281, 646, 809, 680, 816, 560, 711, 202, 578, 857, 643, -23, 578, 578, 578, 578, 857, 622, 628, 596, -23, 578, -23, 639, 454, 849, 351, 249, 558, 469, 631, 743, 514, 688, 746, 464, 544, 548, 556, 7, 412, 708, 750, 878, 879, 349, 702, 631, 631, 631, 327, 101, 7, -8, 623, 623, 623, 623, 219, 623, 623, 623, 623, 291, 430, 545, 401, 745, 653, 653, 675, 839, 814, 814, 653, 673, 653, 675, 841, 841, 841, 841, 653, 653, 653, 653, 814, 814, 667, 814, 275, 684, 694, 694, 841, 713, 714, 653, 653, 697, 814, 814, 814, 697, 687, 841, 669, 637, 333, 814, 841, 689, 673, 689, 653, 669, 689, 673, 673, 689, 22, 686, 656, 840, 842, 860, 756, 638, 644, 847, 848, 843, 845, 838, 692, 719, 720, 528, 659, 660, 661, 662, 696, 664, 698, 643, 658, 658, 658, 645, 701, 645, 658, 658, 658, 658, 658, 658, 658, 658, 632, 635, 709, 699, 670, 723, 566, 582, 758, 640, 636, 872, 865, 881, 883, 849, 870, 645, 890, 634, 288, 610, 850, 633, 753, 645, 851, 645, 759, 645, 873, 777, 666, 778, 779, 658, 874, 891, 892, 893, 894, 897, 898, 899, 900, 665, 901, 724, 674, 866, 344, 844, 639, 705, 677, 755, 725, 780, 372, 902, 784, 645, 645, 765, 706, 645, 766, 726, 712, 862, 727, 867, 903, 640, 678, 868, 645, 681, 785, 904, 372, 690, 651, 704, 649, 728, 858, 875, 853, 767, 612, 617, 787, 788, 792, 691, 730, 863, 864, 835, 731, 770, 642, 771, 676, 794, 772, 852, 732, 796, 798, 871, 647, 707, 682, 672, 668, 773, 799, 869, 733, 735, 736, 801, 737, 804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 137, 137, 137, -2, -2, -2, -2, 0, 0, -2, 0, 0, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 602, -21, -21, -21, -21, 602, -21, -21, -21, -21, -21, -21, -21, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, -21, 602, 602, 602, -21, 68, -21, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 602, 0, 0, 602, -21, 602, -21, 602, -21, -21, 602, 602, 602, 602, 602, 602, 602, -21, -21, -21, -21, -21, -21, 0, 324, 324, 324, 324, -21, -21, -21, -21, 68, 68, 147, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 324, 324, -3, -3, 68, 68, 68, 68, 68, 147, 68, 68, -23, 673, 673, 673, 380, 380, 380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380, -23, 0, -23, 0, 68, -23, 673, -23, 380, 673, 673, -23, 814, 604, 604, 604, 604, 372, 7, 0, 0, 673, 673, 0, 0, 0, 0, 0, 673, 0, 0, 0, 0, 0, 0, 814, 0, 653, 0, 0, 0, 0, 658, 288, 0, 677, 456, 0, 0, 0, 0, 0, 0, 677, 456, 530, 530, 0, 665, 658, 658, 658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 372); + protected $actionDefault = array(3, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 540, 540, 495, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 297, 297, 297, 32767, 32767, 32767, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 32767, 32767, 32767, 32767, 32767, 32767, 381, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 387, 545, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 362, 363, 365, 366, 296, 548, 529, 245, 388, 544, 295, 247, 325, 499, 32767, 32767, 32767, 327, 122, 256, 201, 498, 125, 294, 232, 380, 382, 326, 301, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 300, 454, 359, 358, 357, 456, 32767, 455, 492, 492, 495, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 323, 483, 482, 324, 452, 328, 453, 331, 457, 460, 329, 330, 347, 348, 345, 346, 349, 458, 459, 476, 477, 474, 475, 299, 350, 351, 352, 353, 478, 479, 480, 481, 32767, 32767, 280, 539, 539, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 338, 339, 467, 468, 32767, 236, 236, 236, 236, 281, 236, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 333, 334, 332, 462, 463, 461, 428, 32767, 32767, 32767, 430, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 500, 32767, 32767, 32767, 32767, 32767, 513, 417, 171, 32767, 409, 32767, 171, 171, 171, 171, 32767, 220, 222, 167, 32767, 171, 32767, 486, 32767, 32767, 32767, 32767, 32767, 518, 343, 32767, 32767, 116, 32767, 32767, 32767, 555, 32767, 513, 32767, 116, 32767, 32767, 32767, 32767, 356, 335, 336, 337, 32767, 32767, 517, 511, 470, 471, 472, 473, 32767, 464, 465, 466, 469, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 425, 431, 431, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 516, 515, 32767, 410, 494, 186, 184, 184, 32767, 206, 206, 32767, 32767, 188, 487, 506, 32767, 188, 173, 32767, 398, 175, 494, 32767, 32767, 238, 32767, 238, 32767, 398, 238, 32767, 32767, 238, 32767, 411, 435, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 377, 378, 489, 502, 32767, 503, 32767, 409, 341, 342, 344, 320, 32767, 322, 367, 368, 369, 370, 371, 372, 373, 375, 32767, 415, 32767, 418, 32767, 32767, 32767, 255, 32767, 553, 32767, 32767, 304, 553, 32767, 32767, 32767, 547, 32767, 32767, 298, 32767, 32767, 32767, 32767, 251, 32767, 169, 32767, 537, 32767, 554, 32767, 511, 32767, 340, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 512, 32767, 32767, 32767, 32767, 227, 32767, 448, 32767, 116, 32767, 32767, 32767, 187, 32767, 32767, 302, 246, 32767, 32767, 546, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 114, 32767, 170, 32767, 32767, 32767, 189, 32767, 32767, 511, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 293, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 511, 32767, 32767, 231, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 411, 32767, 274, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 127, 127, 3, 127, 127, 258, 3, 258, 127, 258, 258, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 214, 217, 206, 206, 164, 127, 127, 266); + protected $goto = array(166, 140, 140, 140, 166, 187, 168, 144, 147, 141, 142, 143, 149, 163, 163, 163, 163, 144, 144, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 138, 159, 160, 161, 162, 184, 139, 185, 493, 494, 377, 495, 499, 500, 501, 502, 503, 504, 505, 506, 967, 164, 145, 146, 148, 171, 176, 186, 203, 253, 256, 258, 260, 263, 264, 265, 266, 267, 268, 269, 277, 278, 279, 280, 303, 304, 328, 329, 330, 394, 395, 396, 542, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 150, 151, 152, 167, 153, 169, 154, 204, 170, 155, 156, 157, 205, 158, 136, 620, 560, 756, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1108, 628, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 757, 888, 888, 508, 1200, 1200, 400, 606, 508, 536, 536, 568, 532, 534, 534, 496, 498, 524, 540, 569, 572, 583, 590, 852, 852, 852, 852, 847, 853, 174, 585, 519, 600, 601, 177, 178, 179, 401, 402, 403, 404, 173, 202, 206, 208, 257, 259, 261, 262, 270, 271, 272, 273, 274, 275, 281, 282, 283, 284, 305, 306, 331, 332, 333, 406, 407, 408, 409, 175, 180, 254, 255, 181, 182, 183, 497, 497, 785, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 509, 578, 582, 626, 749, 509, 544, 545, 546, 547, 548, 549, 550, 551, 553, 586, 338, 559, 321, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 530, 349, 655, 555, 587, 352, 414, 591, 575, 604, 885, 611, 612, 881, 616, 617, 623, 625, 630, 632, 298, 296, 296, 296, 298, 290, 299, 944, 610, 816, 1170, 613, 436, 436, 375, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 1072, 1084, 1083, 945, 1065, 1072, 895, 895, 895, 895, 1178, 895, 895, 1212, 1212, 1178, 388, 858, 561, 755, 1072, 1072, 1072, 1072, 1072, 1072, 3, 4, 384, 384, 384, 1212, 874, 856, 854, 856, 654, 465, 511, 883, 878, 1089, 541, 384, 537, 384, 567, 384, 1026, 19, 15, 371, 384, 1226, 510, 1204, 1192, 1192, 1192, 510, 906, 372, 522, 533, 554, 912, 514, 1068, 1069, 13, 1065, 378, 912, 1158, 594, 23, 965, 386, 386, 386, 602, 1066, 1169, 1066, 937, 447, 449, 631, 752, 1177, 1067, 1109, 614, 935, 1177, 605, 1197, 391, 1211, 1211, 543, 892, 386, 1194, 1194, 1194, 399, 518, 1016, 901, 389, 771, 529, 752, 340, 752, 1211, 518, 518, 385, 781, 1214, 770, 772, 1063, 910, 774, 1058, 1176, 659, 953, 514, 782, 862, 915, 450, 573, 1155, 0, 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, 528, 0, 0, 0, 0, 513, 0, 528, 0, 350, 351, 0, 609, 512, 515, 438, 439, 1064, 618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 779, 1219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 301); + protected $gotoCheck = array(43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 57, 68, 15, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 126, 9, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 16, 76, 76, 68, 76, 76, 51, 51, 68, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 68, 68, 68, 68, 68, 68, 27, 66, 101, 66, 66, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 117, 117, 29, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 61, 61, 61, 6, 117, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 125, 57, 125, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 32, 71, 32, 32, 69, 69, 69, 32, 40, 40, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 5, 5, 5, 5, 5, 5, 5, 97, 62, 50, 81, 62, 57, 57, 62, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 124, 124, 97, 81, 57, 57, 57, 57, 57, 118, 57, 57, 142, 142, 118, 12, 33, 12, 14, 57, 57, 57, 57, 57, 57, 30, 30, 13, 13, 13, 142, 14, 14, 14, 14, 14, 57, 14, 14, 14, 34, 2, 13, 109, 13, 2, 13, 34, 34, 34, 34, 13, 13, 122, 140, 9, 9, 9, 122, 83, 58, 58, 58, 34, 13, 13, 81, 81, 58, 81, 46, 13, 131, 127, 34, 101, 123, 123, 123, 34, 81, 81, 81, 8, 8, 8, 8, 11, 119, 81, 8, 8, 8, 119, 49, 138, 48, 141, 141, 47, 78, 123, 119, 119, 119, 123, 47, 102, 80, 17, 23, 9, 11, 18, 11, 141, 47, 47, 11, 23, 141, 23, 24, 115, 84, 25, 113, 119, 73, 99, 13, 26, 70, 85, 64, 65, 130, -1, 108, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, 9, -1, 9, -1, 71, 71, -1, 13, 9, 9, 9, 9, 13, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 5); + protected $gotoBase = array(0, 0, -184, 0, 0, 356, 290, 0, 488, 149, 0, 182, 85, 118, 426, 112, 203, 179, 208, 0, 0, 0, 0, 162, 190, 198, 120, 27, 0, 272, -224, 0, -274, 406, 32, 0, 0, 0, 0, 0, 330, 0, 0, -24, 0, 0, 440, 485, 213, 218, 371, -74, 0, 0, 0, 0, 0, 107, 110, 0, 0, -11, -72, 0, 104, 95, -405, 0, -94, 41, 119, -82, 0, 164, 0, 0, -79, 0, 197, 0, 204, 43, 0, 441, 171, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 115, 0, 195, 210, 0, 0, 0, 0, 0, 86, 427, 259, 0, 0, 116, 0, 174, 0, -5, 117, 196, 0, 0, 161, 170, 93, -21, -48, 273, 0, 0, 91, 271, 0, 0, 0, 0, 0, 0, 216, 0, 437, 187, 102, 0, 0); + protected $gotoDefault = array(-32768, 467, 663, 2, 664, 834, 739, 747, 597, 481, 629, 581, 380, 1188, 791, 792, 793, 381, 367, 482, 379, 410, 405, 780, 773, 775, 783, 172, 411, 786, 1, 788, 517, 824, 1017, 364, 796, 365, 589, 798, 526, 800, 801, 137, 382, 383, 527, 483, 390, 576, 815, 276, 387, 817, 366, 818, 827, 370, 464, 454, 459, 556, 608, 432, 446, 570, 564, 535, 1081, 565, 861, 348, 869, 660, 877, 880, 484, 557, 891, 451, 899, 1094, 397, 905, 911, 916, 287, 919, 417, 412, 584, 924, 925, 5, 929, 621, 622, 8, 312, 952, 598, 966, 420, 1036, 1038, 485, 486, 521, 458, 507, 525, 487, 1059, 440, 413, 1062, 488, 489, 433, 434, 1078, 354, 1163, 353, 448, 320, 1150, 579, 1113, 455, 1203, 1159, 347, 490, 491, 376, 1182, 392, 1198, 437, 1205, 1213, 343, 539, 566); + protected $ruleToNonTerminal = array(0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 12, 12, 13, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 18, 18, 19, 19, 21, 21, 17, 17, 22, 22, 23, 23, 24, 24, 25, 25, 20, 20, 26, 28, 28, 29, 30, 30, 32, 31, 31, 31, 31, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 14, 14, 54, 54, 56, 55, 55, 48, 48, 58, 58, 59, 59, 60, 60, 15, 16, 16, 16, 63, 63, 63, 64, 64, 67, 67, 65, 65, 69, 69, 41, 41, 50, 50, 53, 53, 53, 52, 52, 70, 42, 42, 42, 42, 71, 71, 72, 72, 73, 73, 39, 39, 35, 35, 74, 37, 37, 75, 36, 36, 38, 38, 49, 49, 49, 61, 61, 77, 77, 78, 78, 80, 80, 80, 79, 79, 62, 62, 81, 81, 81, 82, 82, 83, 83, 83, 44, 44, 84, 84, 84, 45, 45, 85, 85, 86, 86, 66, 87, 87, 87, 87, 92, 92, 93, 93, 94, 94, 94, 94, 94, 95, 96, 96, 91, 91, 88, 88, 90, 90, 98, 98, 97, 97, 97, 97, 97, 97, 89, 89, 100, 99, 99, 46, 46, 40, 40, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 34, 34, 47, 47, 105, 105, 106, 106, 106, 106, 112, 101, 101, 108, 108, 114, 114, 115, 116, 116, 116, 116, 116, 116, 68, 68, 57, 57, 57, 57, 102, 102, 120, 120, 117, 117, 121, 121, 121, 121, 103, 103, 103, 107, 107, 107, 113, 113, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 27, 27, 27, 27, 27, 27, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 111, 111, 104, 104, 104, 104, 127, 127, 130, 130, 129, 129, 131, 131, 51, 51, 51, 51, 133, 133, 132, 132, 132, 132, 132, 134, 134, 119, 119, 122, 122, 118, 118, 136, 135, 135, 135, 135, 123, 123, 123, 123, 110, 110, 124, 124, 124, 124, 76, 137, 137, 138, 138, 138, 109, 109, 139, 139, 140, 140, 140, 140, 140, 125, 125, 125, 125, 142, 143, 141, 141, 141, 141, 141, 141, 141, 144, 144, 144); + protected $ruleToLength = array(1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 4, 3, 4, 2, 3, 1, 1, 7, 6, 3, 1, 3, 1, 3, 1, 1, 3, 1, 3, 1, 2, 3, 1, 3, 3, 1, 3, 2, 0, 1, 1, 1, 1, 1, 3, 5, 8, 3, 5, 9, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 1, 2, 2, 5, 7, 9, 5, 6, 3, 3, 2, 2, 1, 1, 1, 0, 2, 8, 0, 4, 1, 3, 0, 1, 0, 1, 0, 1, 10, 7, 6, 5, 1, 2, 2, 0, 2, 0, 2, 0, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 1, 4, 0, 2, 3, 0, 2, 4, 0, 2, 0, 3, 1, 2, 1, 1, 0, 1, 3, 4, 6, 1, 1, 1, 0, 1, 0, 2, 2, 3, 3, 1, 3, 1, 2, 2, 3, 1, 1, 2, 4, 3, 1, 1, 3, 2, 0, 1, 3, 3, 9, 3, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 3, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 0, 1, 1, 3, 3, 4, 4, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 5, 4, 3, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 3, 2, 1, 2, 10, 11, 3, 3, 2, 4, 4, 3, 4, 4, 4, 4, 7, 3, 2, 0, 4, 1, 3, 2, 2, 4, 6, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 4, 4, 0, 2, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 3, 1, 4, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 4, 3, 1, 3, 1, 1, 3, 3, 0, 2, 0, 1, 3, 1, 3, 1, 1, 1, 1, 1, 6, 4, 3, 4, 2, 4, 4, 1, 3, 1, 2, 1, 1, 4, 1, 1, 3, 6, 4, 4, 4, 4, 1, 4, 0, 1, 1, 3, 1, 1, 4, 3, 1, 1, 1, 0, 0, 2, 3, 1, 3, 1, 4, 2, 2, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 6, 3, 1, 1, 1); + protected function initReduceCallbacks() { - return 'else {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - protected function pStmt_For(Stmt\For_ $node) - { - return 'for (' . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '') . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '') . $this->pCommaSeparated($node->loop) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - protected function pStmt_Foreach(Stmt\Foreach_ $node) - { - return 'foreach (' . $this->p($node->expr) . ' as ' . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '') . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - protected function pStmt_While(Stmt\While_ $node) - { - return 'while (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - protected function pStmt_Do(Stmt\Do_ $node) - { - return 'do {' . $this->pStmts($node->stmts) . $this->nl . '} while (' . $this->p($node->cond) . ');'; - } - protected function pStmt_Switch(Stmt\Switch_ $node) - { - return 'switch (' . $this->p($node->cond) . ') {' . $this->pStmts($node->cases) . $this->nl . '}'; - } - protected function pStmt_Case(Stmt\Case_ $node) - { - return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':' . $this->pStmts($node->stmts); - } - protected function pStmt_TryCatch(Stmt\TryCatch $node) - { - return 'try {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->catches ? ' ' . $this->pImplode($node->catches, ' ') : '') . ($node->finally !== null ? ' ' . $this->p($node->finally) : ''); - } - protected function pStmt_Catch(Stmt\Catch_ $node) - { - return 'catch (' . $this->pImplode($node->types, '|') . ($node->var !== null ? ' ' . $this->p($node->var) : '') . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - protected function pStmt_Finally(Stmt\Finally_ $node) - { - return 'finally {' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - protected function pStmt_Break(Stmt\Break_ $node) - { - return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; - } - protected function pStmt_Continue(Stmt\Continue_ $node) - { - return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; - } - protected function pStmt_Return(Stmt\Return_ $node) - { - return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';'; - } - protected function pStmt_Throw(Stmt\Throw_ $node) - { - return 'throw ' . $this->p($node->expr) . ';'; - } - protected function pStmt_Label(Stmt\Label $node) - { - return $node->name . ':'; - } - protected function pStmt_Goto(Stmt\Goto_ $node) - { - return 'goto ' . $node->name . ';'; - } - // Other - protected function pStmt_Expression(Stmt\Expression $node) - { - return $this->p($node->expr) . ';'; - } - protected function pStmt_Echo(Stmt\Echo_ $node) - { - return 'echo ' . $this->pCommaSeparated($node->exprs) . ';'; - } - protected function pStmt_Static(Stmt\Static_ $node) - { - return 'static ' . $this->pCommaSeparated($node->vars) . ';'; - } - protected function pStmt_Global(Stmt\Global_ $node) - { - return 'global ' . $this->pCommaSeparated($node->vars) . ';'; - } - protected function pStmt_StaticVar(Stmt\StaticVar $node) - { - return $this->p($node->var) . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); - } - protected function pStmt_Unset(Stmt\Unset_ $node) - { - return 'unset(' . $this->pCommaSeparated($node->vars) . ');'; - } - protected function pStmt_InlineHTML(Stmt\InlineHTML $node) - { - $newline = $node->getAttribute('hasLeadingNewline', \true) ? "\n" : ''; - return '?>' . $newline . $node->value . 'remaining; - } - protected function pStmt_Nop(Stmt\Nop $node) - { - return ''; - } - // Helpers - protected function pClassCommon(Stmt\Class_ $node, $afterClassToken) - { - return $this->pAttrGroups($node->attrGroups, $node->name === null) . $this->pModifiers($node->flags) . 'class' . $afterClassToken . (null !== $node->extends ? ' extends ' . $this->p($node->extends) : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; - } - protected function pObjectProperty($node) - { - if ($node instanceof Expr) { - return '{' . $this->p($node) . '}'; - } else { - return $node; - } - } - protected function pEncapsList(array $encapsList, $quote) - { - $return = ''; - foreach ($encapsList as $element) { - if ($element instanceof Scalar\EncapsedStringPart) { - $return .= $this->escapeString($element->value, $quote); + $this->reduceCallbacks = [0 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 1 => function ($stackPos) { + $this->semValue = $this->handleNamespaces($this->semStack[$stackPos - (1 - 1)]); + }, 2 => function ($stackPos) { + if (\is_array($this->semStack[$stackPos - (2 - 2)])) { + $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); } else { - $return .= '{' . $this->p($element) . '}'; + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; } - } - return $return; - } - protected function pSingleQuotedString(string $string) - { - return '\'' . \addcslashes($string, '\'\\') . '\''; - } - protected function escapeString($string, $quote) - { - if (null === $quote) { - // For doc strings, don't escape newlines - $escaped = \addcslashes($string, "\t\f\v\$\\"); - } else { - $escaped = \addcslashes($string, "\n\r\t\f\v\$" . $quote . "\\"); - } - // Escape control characters and non-UTF-8 characters. - // Regex based on https://stackoverflow.com/a/11709412/385378. - $regex = '/( - [\\x00-\\x08\\x0E-\\x1F] # Control characters - | [\\xC0-\\xC1] # Invalid UTF-8 Bytes - | [\\xF5-\\xFF] # Invalid UTF-8 Bytes - | \\xE0(?=[\\x80-\\x9F]) # Overlong encoding of prior code point - | \\xF0(?=[\\x80-\\x8F]) # Overlong encoding of prior code point - | [\\xC2-\\xDF](?![\\x80-\\xBF]) # Invalid UTF-8 Sequence Start - | [\\xE0-\\xEF](?![\\x80-\\xBF]{2}) # Invalid UTF-8 Sequence Start - | [\\xF0-\\xF4](?![\\x80-\\xBF]{3}) # Invalid UTF-8 Sequence Start - | (?<=[\\x00-\\x7F\\xF5-\\xFF])[\\x80-\\xBF] # Invalid UTF-8 Sequence Middle - | (? $part) { - $atStart = $i === 0; - $atEnd = $i === \count($parts) - 1; - if ($part instanceof Scalar\EncapsedStringPart && $this->containsEndLabel($part->value, $label, $atStart, $atEnd)) { - return \true; + }, 3 => function ($stackPos) { + $this->semValue = array(); + }, 4 => function ($stackPos) { + $startAttributes = $this->lookaheadStartAttributes; + if (isset($startAttributes['comments'])) { + $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); + } else { + $nop = null; } - } - return \false; - } - protected function pDereferenceLhs(Node $node) - { - if (!$this->dereferenceLhsRequiresParens($node)) { - return $this->p($node); - } else { - return '(' . $this->p($node) . ')'; - } - } - protected function pCallLhs(Node $node) - { - if (!$this->callLhsRequiresParens($node)) { - return $this->p($node); - } else { - return '(' . $this->p($node) . ')'; - } - } - protected function pNewVariable(Node $node) - { - // TODO: This is not fully accurate. - return $this->pDereferenceLhs($node); - } - /** - * @param Node[] $nodes - * @return bool - */ - protected function hasNodeWithComments(array $nodes) - { - foreach ($nodes as $node) { - if ($node && $node->getComments()) { - return \true; + if ($nop !== null) { + $this->semStack[$stackPos - (1 - 1)][] = $nop; } - } - return \false; - } - protected function pMaybeMultiline(array $nodes, bool $trailingComma = \false) - { - if (!$this->hasNodeWithComments($nodes)) { - return $this->pCommaSeparated($nodes); - } else { - return $this->pCommaSeparatedMultiline($nodes, $trailingComma) . $this->nl; - } - } - protected function pAttrGroups(array $nodes, bool $inline = \false) : string - { - $result = ''; - $sep = $inline ? ' ' : $this->nl; - foreach ($nodes as $node) { - $result .= $this->p($node) . $sep; - } - return $result; - } -} -attributes = $attributes; - $this->name = $name; - $this->args = $args; - } - public function getSubNodeNames() : array - { - return ['name', 'args']; - } - public function getType() : string - { - return 'Attribute'; - } -} -attributes = $attributes; - $this->name = $name; - $this->value = $value; - $this->byRef = $byRef; - $this->unpack = $unpack; - } - public function getSubNodeNames() : array - { - return ['name', 'value', 'byRef', 'unpack']; - } - public function getType() : string - { - return 'Arg'; - } -} -attributes = $attributes; - $this->types = $types; - } - public function getSubNodeNames() : array - { - return ['types']; - } - public function getType() : string - { - return 'UnionType'; - } -} -attributes = $attributes; - $this->remaining = $remaining; - } - public function getSubNodeNames() : array - { - return ['remaining']; - } - public function getType() : string - { - return 'Stmt_HaltCompiler'; - } -} -attributes = $attributes; - $this->num = $num; - } - public function getSubNodeNames() : array - { - return ['num']; - } - public function getType() : string - { - return 'Stmt_Break'; - } -} - array(): Statements - * 'elseifs' => array(): Elseif clauses - * 'else' => null : Else clause - * @param array $attributes Additional attributes - */ - public function __construct(Node\Expr $cond, array $subNodes = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->cond = $cond; - $this->stmts = $subNodes['stmts'] ?? []; - $this->elseifs = $subNodes['elseifs'] ?? []; - $this->else = $subNodes['else'] ?? null; - } - public function getSubNodeNames() : array - { - return ['cond', 'stmts', 'elseifs', 'else']; - } - public function getType() : string - { - return 'Stmt_If'; - } -} -attributes = $attributes; - $this->cond = $cond; - $this->stmts = $stmts; - } - public function getSubNodeNames() : array - { - return ['cond', 'stmts']; - } - public function getType() : string - { - return 'Stmt_While'; - } -} - false : Whether to return by reference - * 'params' => array(): Parameters - * 'returnType' => null : Return type - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->byRef = $subNodes['byRef'] ?? \false; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - public function getSubNodeNames() : array - { - return ['attrGroups', 'byRef', 'name', 'params', 'returnType', 'stmts']; - } - public function returnsByRef() : bool - { - return $this->byRef; - } - public function getParams() : array - { - return $this->params; - } - public function getReturnType() - { - return $this->returnType; - } - public function getAttrGroups() : array - { - return $this->attrGroups; - } - /** @return Node\Stmt[] */ - public function getStmts() : array - { - return $this->stmts; - } - public function getType() : string - { - return 'Stmt_Function'; - } -} -attributes = $attributes; - $this->cond = $cond; - $this->stmts = $stmts; - } - public function getSubNodeNames() : array - { - return ['cond', 'stmts']; - } - public function getType() : string - { - return 'Stmt_ElseIf'; - } -} - array(): Name of extended interfaces - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->extends = $subNodes['extends'] ?? []; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - public function getSubNodeNames() : array - { - return ['attrGroups', 'name', 'extends', 'stmts']; - } - public function getType() : string - { - return 'Stmt_Interface'; - } -} - 0 : Flags - * 'extends' => null : Name of extended class - * 'implements' => array(): Names of implemented interfaces - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->extends = $subNodes['extends'] ?? null; - $this->implements = $subNodes['implements'] ?? []; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - public function getSubNodeNames() : array - { - return ['attrGroups', 'flags', 'name', 'extends', 'implements', 'stmts']; - } - /** - * Whether the class is explicitly abstract. - * - * @return bool - */ - public function isAbstract() : bool - { - return (bool) ($this->flags & self::MODIFIER_ABSTRACT); - } - /** - * Whether the class is final. - * - * @return bool - */ - public function isFinal() : bool - { - return (bool) ($this->flags & self::MODIFIER_FINAL); - } - /** - * Whether the class is anonymous. - * - * @return bool - */ - public function isAnonymous() : bool - { - return null === $this->name; - } - /** - * @internal - */ - public static function verifyModifier($a, $b) - { - if ($a & self::VISIBILITY_MODIFIER_MASK && $b & self::VISIBILITY_MODIFIER_MASK) { - throw new Error('Multiple access type modifiers are not allowed'); - } - if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { - throw new Error('Multiple abstract modifiers are not allowed'); - } - if ($a & self::MODIFIER_STATIC && $b & self::MODIFIER_STATIC) { - throw new Error('Multiple static modifiers are not allowed'); - } - if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { - throw new Error('Multiple final modifiers are not allowed'); - } - if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { - throw new Error('Multiple readonly modifiers are not allowed'); - } - if ($a & 48 && $b & 48) { - throw new Error('Cannot use the final modifier on an abstract class member'); - } - } - public function getType() : string - { - return 'Stmt_Class'; - } -} -attributes = $attributes; - $this->type = $type; - $this->prefix = $prefix; - $this->uses = $uses; - } - public function getSubNodeNames() : array - { - return ['type', 'prefix', 'uses']; - } - public function getType() : string - { - return 'Stmt_GroupUse'; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Stmt_Throw'; - } -} -attributes = $attributes; - $this->num = $num; - } - public function getSubNodeNames() : array - { - return ['num']; - } - public function getType() : string - { - return 'Stmt_Continue'; - } -} -attributes = $attributes; - $this->stmts = $stmts; - } - public function getSubNodeNames() : array - { - return ['stmts']; - } - public function getType() : string - { - return 'Stmt_Else'; - } -} - array(): Statements - * 'attrGroups' => array(): PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - public function getSubNodeNames() : array - { - return ['attrGroups', 'name', 'stmts']; - } - public function getType() : string - { - return 'Stmt_Trait'; - } -} -attributes = $attributes; - $this->vars = $vars; - } - public function getSubNodeNames() : array - { - return ['vars']; - } - public function getType() : string - { - return 'Stmt_Unset'; - } -} -attributes = $attributes; - $this->exprs = $exprs; - } - public function getSubNodeNames() : array - { - return ['exprs']; - } - public function getType() : string - { - return 'Stmt_Echo'; - } -} -attributes = $attributes; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - public function getSubNodeNames() : array - { - return ['name']; - } - public function getType() : string - { - return 'Stmt_Label'; - } -} -attributes = $attributes; - $this->cond = $cond; - $this->stmts = $stmts; - } - public function getSubNodeNames() : array - { - return ['stmts', 'cond']; - } - public function getType() : string - { - return 'Stmt_Do'; - } -} -value pair node. - * - * @param string|Node\Identifier $key Key - * @param Node\Expr $value Value - * @param array $attributes Additional attributes - */ - public function __construct($key, Node\Expr $value, array $attributes = []) - { - $this->attributes = $attributes; - $this->key = \is_string($key) ? new Node\Identifier($key) : $key; - $this->value = $value; - } - public function getSubNodeNames() : array - { - return ['key', 'value']; - } - public function getType() : string - { - return 'Stmt_DeclareDeclare'; - } -} -attributes = $attributes; - $this->stmts = $stmts; - } - public function getSubNodeNames() : array - { - return ['stmts']; - } - public function getType() : string - { - return 'Stmt_Finally'; - } -} -attributes = $attributes; - $this->trait = $trait; - $this->method = \is_string($method) ? new Node\Identifier($method) : $method; - $this->newModifier = $newModifier; - $this->newName = \is_string($newName) ? new Node\Identifier($newName) : $newName; - } - public function getSubNodeNames() : array - { - return ['trait', 'method', 'newModifier', 'newName']; - } - public function getType() : string - { - return 'Stmt_TraitUseAdaptation_Alias'; - } -} -attributes = $attributes; - $this->trait = $trait; - $this->method = \is_string($method) ? new Node\Identifier($method) : $method; - $this->insteadof = $insteadof; - } - public function getSubNodeNames() : array - { - return ['trait', 'method', 'insteadof']; - } - public function getType() : string - { - return 'Stmt_TraitUseAdaptation_Precedence'; - } -} -attributes = $attributes; - $this->cond = $cond; - $this->cases = $cases; - } - public function getSubNodeNames() : array - { - return ['cond', 'cases']; - } - public function getType() : string - { - return 'Stmt_Switch'; - } -} -attributes = $attributes; - $this->traits = $traits; - $this->adaptations = $adaptations; - } - public function getSubNodeNames() : array - { - return ['traits', 'adaptations']; - } - public function getType() : string - { - return 'Stmt_TraitUse'; - } -} -attributes = $attributes; - $this->value = $value; - } - public function getSubNodeNames() : array - { - return ['value']; - } - public function getType() : string - { - return 'Stmt_InlineHTML'; - } -} -stmts as $stmt) { - if ($stmt instanceof TraitUse) { - $traitUses[] = $stmt; - } - } - return $traitUses; - } - /** - * @return ClassConst[] - */ - public function getConstants() : array - { - $constants = []; - foreach ($this->stmts as $stmt) { - if ($stmt instanceof ClassConst) { - $constants[] = $stmt; - } - } - return $constants; - } - /** - * @return Property[] - */ - public function getProperties() : array - { - $properties = []; - foreach ($this->stmts as $stmt) { - if ($stmt instanceof Property) { - $properties[] = $stmt; - } - } - return $properties; - } - /** - * Gets property with the given name defined directly in this class/interface/trait. - * - * @param string $name Name of the property - * - * @return Property|null Property node or null if the property does not exist - */ - public function getProperty(string $name) - { - foreach ($this->stmts as $stmt) { - if ($stmt instanceof Property) { - foreach ($stmt->props as $prop) { - if ($prop instanceof PropertyProperty && $name === $prop->name->toString()) { - return $stmt; - } - } - } - } - return null; - } - /** - * Gets all methods defined directly in this class/interface/trait - * - * @return ClassMethod[] - */ - public function getMethods() : array - { - $methods = []; - foreach ($this->stmts as $stmt) { - if ($stmt instanceof ClassMethod) { - $methods[] = $stmt; - } - } - return $methods; - } - /** - * Gets method with the given name defined directly in this class/interface/trait. - * - * @param string $name Name of the method (compared case-insensitively) - * - * @return ClassMethod|null Method node or null if the method does not exist - */ - public function getMethod(string $name) - { - $lowerName = \strtolower($name); - foreach ($this->stmts as $stmt) { - if ($stmt instanceof ClassMethod && $lowerName === $stmt->name->toLowerString()) { - return $stmt; - } - } - return null; - } -} -attributes = $attributes; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - public function getSubNodeNames() : array - { - return ['name']; - } - public function getType() : string - { - return 'Stmt_Goto'; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Stmt_Return'; - } -} -attributes = $attributes; - $this->declares = $declares; - $this->stmts = $stmts; - } - public function getSubNodeNames() : array - { - return ['declares', 'stmts']; - } - public function getType() : string - { - return 'Stmt_Declare'; - } -} -attributes = $attributes; - $this->var = $var; - $this->default = $default; - } - public function getSubNodeNames() : array - { - return ['var', 'default']; - } - public function getType() : string - { - return 'Stmt_StaticVar'; - } -} -attributes = $attributes; - $this->cond = $cond; - $this->stmts = $stmts; - } - public function getSubNodeNames() : array - { - return ['cond', 'stmts']; - } - public function getType() : string - { - return 'Stmt_Case'; - } -} -attributes = $attributes; - $this->consts = $consts; - } - public function getSubNodeNames() : array - { - return ['consts']; - } - public function getType() : string - { - return 'Stmt_Const'; - } -} -attributes = $attributes; - $this->vars = $vars; - } - public function getSubNodeNames() : array - { - return ['vars']; - } - public function getType() : string - { - return 'Stmt_Static'; - } -} -attributes = $attributes; - $this->stmts = $stmts; - $this->catches = $catches; - $this->finally = $finally; - } - public function getSubNodeNames() : array - { - return ['stmts', 'catches', 'finally']; - } - public function getType() : string - { - return 'Stmt_TryCatch'; - } -} -name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->expr = $expr; - $this->attrGroups = $attrGroups; - } - public function getSubNodeNames() : array - { - return ['attrGroups', 'name', 'expr']; - } - public function getType() : string - { - return 'Stmt_EnumCase'; - } -} - null : Variable to assign key to - * 'byRef' => false : Whether to assign value by reference - * 'stmts' => array(): Statements - * @param array $attributes Additional attributes - */ - public function __construct(Node\Expr $expr, Node\Expr $valueVar, array $subNodes = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->expr = $expr; - $this->keyVar = $subNodes['keyVar'] ?? null; - $this->byRef = $subNodes['byRef'] ?? \false; - $this->valueVar = $valueVar; - $this->stmts = $subNodes['stmts'] ?? []; - } - public function getSubNodeNames() : array - { - return ['expr', 'keyVar', 'byRef', 'valueVar', 'stmts']; - } - public function getType() : string - { - return 'Stmt_Foreach'; - } -} -attributes = $attributes; - $this->type = $type; - $this->name = $name; - $this->alias = \is_string($alias) ? new Identifier($alias) : $alias; - } - public function getSubNodeNames() : array - { - return ['type', 'name', 'alias']; - } - /** - * Get alias. If not explicitly given this is the last component of the used name. - * - * @return Identifier - */ - public function getAlias() : Identifier - { - if (null !== $this->alias) { - return $this->alias; - } - return new Identifier($this->name->getLast()); - } - public function getType() : string - { - return 'Stmt_UseUse'; - } -} - null : Scalar type - * 'implements' => array() : Names of implemented interfaces - * 'stmts' => array() : Statements - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) - { - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->scalarType = $subNodes['scalarType'] ?? null; - $this->implements = $subNodes['implements'] ?? []; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - parent::__construct($attributes); - } - public function getSubNodeNames() : array - { - return ['attrGroups', 'name', 'scalarType', 'implements', 'stmts']; - } - public function getType() : string - { - return 'Stmt_Enum'; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Stmt_Expression'; - } -} - \true, '__destruct' => \true, '__call' => \true, '__callstatic' => \true, '__get' => \true, '__set' => \true, '__isset' => \true, '__unset' => \true, '__sleep' => \true, '__wakeup' => \true, '__tostring' => \true, '__set_state' => \true, '__clone' => \true, '__invoke' => \true, '__debuginfo' => \true]; - /** - * Constructs a class method node. - * - * @param string|Node\Identifier $name Name - * @param array $subNodes Array of the following optional subnodes: - * 'flags => MODIFIER_PUBLIC: Flags - * 'byRef' => false : Whether to return by reference - * 'params' => array() : Parameters - * 'returnType' => null : Return type - * 'stmts' => array() : Statements - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct($name, array $subNodes = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->flags = $subNodes['flags'] ?? $subNodes['type'] ?? 0; - $this->byRef = $subNodes['byRef'] ?? \false; - $this->name = \is_string($name) ? new Node\Identifier($name) : $name; - $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; - $this->stmts = \array_key_exists('stmts', $subNodes) ? $subNodes['stmts'] : []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - public function getSubNodeNames() : array - { - return ['attrGroups', 'flags', 'byRef', 'name', 'params', 'returnType', 'stmts']; - } - public function returnsByRef() : bool - { - return $this->byRef; - } - public function getParams() : array - { - return $this->params; - } - public function getReturnType() - { - return $this->returnType; - } - public function getStmts() - { - return $this->stmts; - } - public function getAttrGroups() : array - { - return $this->attrGroups; - } - /** - * Whether the method is explicitly or implicitly public. - * - * @return bool - */ - public function isPublic() : bool - { - return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; - } - /** - * Whether the method is protected. - * - * @return bool - */ - public function isProtected() : bool - { - return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); - } - /** - * Whether the method is private. - * - * @return bool - */ - public function isPrivate() : bool - { - return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); - } - /** - * Whether the method is abstract. - * - * @return bool - */ - public function isAbstract() : bool - { - return (bool) ($this->flags & Class_::MODIFIER_ABSTRACT); - } - /** - * Whether the method is final. - * - * @return bool - */ - public function isFinal() : bool - { - return (bool) ($this->flags & Class_::MODIFIER_FINAL); - } - /** - * Whether the method is static. - * - * @return bool - */ - public function isStatic() : bool - { - return (bool) ($this->flags & Class_::MODIFIER_STATIC); - } - /** - * Whether the method is magic. - * - * @return bool - */ - public function isMagic() : bool - { - return isset(self::$magicNames[$this->name->toLowerString()]); - } - public function getType() : string - { - return 'Stmt_ClassMethod'; - } -} -attributes = $attributes; - $this->types = $types; - $this->var = $var; - $this->stmts = $stmts; - } - public function getSubNodeNames() : array - { - return ['types', 'var', 'stmts']; - } - public function getType() : string - { - return 'Stmt_Catch'; - } -} -attributes = $attributes; - $this->vars = $vars; - } - public function getSubNodeNames() : array - { - return ['vars']; - } - public function getType() : string - { - return 'Stmt_Global'; - } -} -attributes = $attributes; - $this->name = \is_string($name) ? new Node\VarLikeIdentifier($name) : $name; - $this->default = $default; - } - public function getSubNodeNames() : array - { - return ['name', 'default']; - } - public function getType() : string - { - return 'Stmt_PropertyProperty'; - } -} - array(): Init expressions - * 'cond' => array(): Loop conditions - * 'loop' => array(): Loop expressions - * 'stmts' => array(): Statements - * @param array $attributes Additional attributes - */ - public function __construct(array $subNodes = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->init = $subNodes['init'] ?? []; - $this->cond = $subNodes['cond'] ?? []; - $this->loop = $subNodes['loop'] ?? []; - $this->stmts = $subNodes['stmts'] ?? []; - } - public function getSubNodeNames() : array - { - return ['init', 'cond', 'loop', 'stmts']; - } - public function getType() : string - { - return 'Stmt_For'; - } -} -attributes = $attributes; - $this->type = $type; - $this->uses = $uses; - } - public function getSubNodeNames() : array - { - return ['type', 'uses']; - } - public function getType() : string - { - return 'Stmt_Use'; - } -} -attributes = $attributes; - $this->name = $name; - $this->stmts = $stmts; - } - public function getSubNodeNames() : array - { - return ['name', 'stmts']; - } - public function getType() : string - { - return 'Stmt_Namespace'; - } -} -attributes = $attributes; - $this->flags = $flags; - $this->consts = $consts; - $this->attrGroups = $attrGroups; - } - public function getSubNodeNames() : array - { - return ['attrGroups', 'flags', 'consts']; - } - /** - * Whether constant is explicitly or implicitly public. - * - * @return bool - */ - public function isPublic() : bool - { - return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; - } - /** - * Whether constant is protected. - * - * @return bool - */ - public function isProtected() : bool - { - return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); - } - /** - * Whether constant is private. - * - * @return bool - */ - public function isPrivate() : bool - { - return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); - } - /** - * Whether constant is final. - * - * @return bool - */ - public function isFinal() : bool - { - return (bool) ($this->flags & Class_::MODIFIER_FINAL); - } - public function getType() : string - { - return 'Stmt_ClassConst'; - } -} -attributes = $attributes; - $this->flags = $flags; - $this->props = $props; - $this->type = \is_string($type) ? new Identifier($type) : $type; - $this->attrGroups = $attrGroups; - } - public function getSubNodeNames() : array - { - return ['attrGroups', 'flags', 'type', 'props']; - } - /** - * Whether the property is explicitly or implicitly public. - * - * @return bool - */ - public function isPublic() : bool - { - return ($this->flags & Class_::MODIFIER_PUBLIC) !== 0 || ($this->flags & Class_::VISIBILITY_MODIFIER_MASK) === 0; - } - /** - * Whether the property is protected. - * - * @return bool - */ - public function isProtected() : bool - { - return (bool) ($this->flags & Class_::MODIFIER_PROTECTED); - } - /** - * Whether the property is private. - * - * @return bool - */ - public function isPrivate() : bool - { - return (bool) ($this->flags & Class_::MODIFIER_PRIVATE); - } - /** - * Whether the property is static. - * - * @return bool - */ - public function isStatic() : bool - { - return (bool) ($this->flags & Class_::MODIFIER_STATIC); - } - /** - * Whether the property is readonly. - * - * @return bool - */ - public function isReadonly() : bool - { - return (bool) ($this->flags & Class_::MODIFIER_READONLY); - } - public function getType() : string - { - return 'Stmt_Property'; - } -} -attributes = $attributes; - $this->var = $var; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - public function getSubNodeNames() : array - { - return ['var', 'name']; - } - public function getType() : string - { - return 'Expr_NullsafePropertyFetch'; - } -} -attributes = $attributes; - $this->key = $key; - $this->value = $value; - $this->byRef = $byRef; - $this->unpack = $unpack; - } - public function getSubNodeNames() : array - { - return ['key', 'value', 'byRef', 'unpack']; - } - public function getType() : string - { - return 'Expr_ArrayItem'; - } -} -attributes = $attributes; - $this->var = $var; - } - public function getSubNodeNames() : array - { - return ['var']; - } - public function getType() : string - { - return 'Expr_PreDec'; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Expr_Clone'; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Expr_UnaryPlus'; - } -} -attributes = $attributes; - $this->var = $var; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['var', 'expr']; - } -} - - */ - public abstract function getRawArgs() : array; - /** - * Returns whether this call expression is actually a first class callable. - */ - public function isFirstClassCallable() : bool - { - foreach ($this->getRawArgs() as $arg) { - if ($arg instanceof VariadicPlaceholder) { - return \true; - } - } - return \false; - } - /** - * Assert that this is not a first-class callable and return only ordinary Args. - * - * @return Arg[] - */ - public function getArgs() : array - { - \assert(!$this->isFirstClassCallable()); - return $this->getRawArgs(); - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Expr_Throw'; - } -} -attributes = $attributes; - $this->key = $key; - $this->value = $value; - } - public function getSubNodeNames() : array - { - return ['key', 'value']; - } - public function getType() : string - { - return 'Expr_Yield'; - } -} -attributes = $attributes; - $this->cond = $cond; - $this->arms = $arms; - } - public function getSubNodeNames() : array - { - return ['cond', 'arms']; - } - public function getType() : string - { - return 'Expr_Match'; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Expr_Print'; - } -} -attributes = $attributes; - $this->name = $name; - } - public function getSubNodeNames() : array - { - return ['name']; - } - public function getType() : string - { - return 'Expr_Variable'; - } -} -attributes = $attributes; - } - public function getSubNodeNames() : array - { - return []; - } - public function getType() : string - { - return 'Expr_Error'; - } -} -attributes = $attributes; - $this->var = $var; - } - public function getSubNodeNames() : array - { - return ['var']; - } - public function getType() : string - { - return 'Expr_PostDec'; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Expr_Eval'; - } -} - Arguments */ - public $args; - /** - * Constructs a function call node. - * - * @param Node\Name|Expr|Node\Stmt\Class_ $class Class name (or class node for anonymous classes) - * @param array $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct($class, array $args = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->class = $class; - $this->args = $args; - } - public function getSubNodeNames() : array - { - return ['class', 'args']; - } - public function getType() : string - { - return 'Expr_New'; - } - public function getRawArgs() : array - { - return $this->args; - } -} - false : Whether the closure is static - * 'byRef' => false : Whether to return by reference - * 'params' => array() : Parameters - * 'returnType' => null : Return type - * 'expr' => Expr : Expression body - * 'attrGroups' => array() : PHP attribute groups - * @param array $attributes Additional attributes - */ - public function __construct(array $subNodes = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->static = $subNodes['static'] ?? \false; - $this->byRef = $subNodes['byRef'] ?? \false; - $this->params = $subNodes['params'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; - $this->expr = $subNodes['expr'] ?? null; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - public function getSubNodeNames() : array - { - return ['attrGroups', 'static', 'byRef', 'params', 'returnType', 'expr']; - } - public function returnsByRef() : bool - { - return $this->byRef; - } - public function getParams() : array - { - return $this->params; - } - public function getReturnType() - { - return $this->returnType; - } - public function getAttrGroups() : array - { - return $this->attrGroups; - } - /** - * @return Node\Stmt\Return_[] - */ - public function getStmts() : array - { - return [new Node\Stmt\Return_($this->expr)]; - } - public function getType() : string - { - return 'Expr_ArrowFunction'; - } -} -'; - } - public function getType() : string - { - return 'Expr_BinaryOp_Spaceship'; - } -} -'; - } - public function getType() : string - { - return 'Expr_BinaryOp_Greater'; - } -} ->'; - } - public function getType() : string - { - return 'Expr_BinaryOp_ShiftRight'; - } -} -='; - } - public function getType() : string - { - return 'Expr_BinaryOp_GreaterOrEqual'; - } -} -attributes = $attributes; - $this->var = $var; - } - public function getSubNodeNames() : array - { - return ['var']; - } - public function getType() : string - { - return 'Expr_PostInc'; - } -} -attributes = $attributes; - $this->cond = $cond; - $this->if = $if; - $this->else = $else; - } - public function getSubNodeNames() : array - { - return ['cond', 'if', 'else']; - } - public function getType() : string - { - return 'Expr_Ternary'; - } -} -attributes = $attributes; - $this->var = $var; - $this->name = \is_string($name) ? new Identifier($name) : $name; - $this->args = $args; - } - public function getSubNodeNames() : array - { - return ['var', 'name', 'args']; - } - public function getType() : string - { - return 'Expr_NullsafeMethodCall'; - } -} -attributes = $attributes; - $this->var = $var; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - public function getSubNodeNames() : array - { - return ['var', 'name']; - } - public function getType() : string - { - return 'Expr_PropertyFetch'; - } -} -attributes = $attributes; - $this->expr = $expr; - $this->class = $class; - } - public function getSubNodeNames() : array - { - return ['expr', 'class']; - } - public function getType() : string - { - return 'Expr_Instanceof'; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Expr_Empty'; - } -} -attributes = $attributes; - $this->var = $var; - $this->dim = $dim; - } - public function getSubNodeNames() : array - { - return ['var', 'dim']; - } - public function getType() : string - { - return 'Expr_ArrayDimFetch'; - } -} -attributes = $attributes; - $this->class = $class; - $this->name = \is_string($name) ? new Identifier($name) : $name; - } - public function getSubNodeNames() : array - { - return ['class', 'name']; - } - public function getType() : string - { - return 'Expr_ClassConstFetch'; - } -} -attributes = $attributes; - $this->name = $name; - } - public function getSubNodeNames() : array - { - return ['name']; - } - public function getType() : string - { - return 'Expr_ConstFetch'; - } -} - Arguments */ - public $args; - /** - * Constructs a static method call node. - * - * @param Node\Name|Expr $class Class name - * @param string|Identifier|Expr $name Method name - * @param array $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct($class, $name, array $args = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->class = $class; - $this->name = \is_string($name) ? new Identifier($name) : $name; - $this->args = $args; - } - public function getSubNodeNames() : array - { - return ['class', 'name', 'args']; - } - public function getType() : string - { - return 'Expr_StaticCall'; - } - public function getRawArgs() : array - { - return $this->args; - } -} - Arguments */ - public $args; - /** - * Constructs a function call node. - * - * @param Node\Name|Expr $name Function name - * @param array $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct($name, array $args = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->name = $name; - $this->args = $args; - } - public function getSubNodeNames() : array - { - return ['name', 'args']; - } - public function getType() : string - { - return 'Expr_FuncCall'; - } - public function getRawArgs() : array - { - return $this->args; - } -} -attributes = $attributes; - $this->items = $items; - } - public function getSubNodeNames() : array - { - return ['items']; - } - public function getType() : string - { - return 'Expr_List'; - } -} -attributes = $attributes; - $this->vars = $vars; - } - public function getSubNodeNames() : array - { - return ['vars']; - } - public function getType() : string - { - return 'Expr_Isset'; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Expr_ErrorSuppress'; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Expr_BooleanNot'; - } -} -attributes = $attributes; - $this->items = $items; - } - public function getSubNodeNames() : array - { - return ['items']; - } - public function getType() : string - { - return 'Expr_Array'; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Expr_UnaryMinus'; - } -} - false : Whether the closure is static - * 'byRef' => false : Whether to return by reference - * 'params' => array(): Parameters - * 'uses' => array(): use()s - * 'returnType' => null : Return type - * 'stmts' => array(): Statements - * 'attrGroups' => array(): PHP attributes groups - * @param array $attributes Additional attributes - */ - public function __construct(array $subNodes = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->static = $subNodes['static'] ?? \false; - $this->byRef = $subNodes['byRef'] ?? \false; - $this->params = $subNodes['params'] ?? []; - $this->uses = $subNodes['uses'] ?? []; - $returnType = $subNodes['returnType'] ?? null; - $this->returnType = \is_string($returnType) ? new Node\Identifier($returnType) : $returnType; - $this->stmts = $subNodes['stmts'] ?? []; - $this->attrGroups = $subNodes['attrGroups'] ?? []; - } - public function getSubNodeNames() : array - { - return ['attrGroups', 'static', 'byRef', 'params', 'uses', 'returnType', 'stmts']; - } - public function returnsByRef() : bool - { - return $this->byRef; - } - public function getParams() : array - { - return $this->params; - } - public function getReturnType() - { - return $this->returnType; - } - /** @return Node\Stmt[] */ - public function getStmts() : array - { - return $this->stmts; - } - public function getAttrGroups() : array - { - return $this->attrGroups; - } - public function getType() : string - { - return 'Expr_Closure'; - } -} -attributes = $attributes; - $this->var = $var; - } - public function getSubNodeNames() : array - { - return ['var']; - } - public function getType() : string - { - return 'Expr_PreInc'; - } -} -attributes = $attributes; - $this->var = $var; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['var', 'expr']; - } - public function getType() : string - { - return 'Expr_Assign'; - } -} -attributes = $attributes; - $this->left = $left; - $this->right = $right; - } - public function getSubNodeNames() : array - { - return ['left', 'right']; - } - /** - * Get the operator sigil for this binary operation. - * - * In the case there are multiple possible sigils for an operator, this method does not - * necessarily return the one used in the parsed code. - * - * @return string - */ - public abstract function getOperatorSigil() : string; -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Expr_YieldFrom'; - } -} -attributes = $attributes; - $this->class = $class; - $this->name = \is_string($name) ? new VarLikeIdentifier($name) : $name; - } - public function getSubNodeNames() : array - { - return ['class', 'name']; - } - public function getType() : string - { - return 'Expr_StaticPropertyFetch'; - } -} -attributes = $attributes; - $this->var = $var; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['var', 'expr']; - } - public function getType() : string - { - return 'Expr_AssignRef'; - } -} - Arguments */ - public $args; - /** - * Constructs a function call node. - * - * @param Expr $var Variable holding object - * @param string|Identifier|Expr $name Method name - * @param array $args Arguments - * @param array $attributes Additional attributes - */ - public function __construct(Expr $var, $name, array $args = [], array $attributes = []) - { - $this->attributes = $attributes; - $this->var = $var; - $this->name = \is_string($name) ? new Identifier($name) : $name; - $this->args = $args; - } - public function getSubNodeNames() : array - { - return ['var', 'name', 'args']; - } - public function getType() : string - { - return 'Expr_MethodCall'; - } - public function getRawArgs() : array - { - return $this->args; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Expr_BitwiseNot'; - } -} -attributes = $attributes; - $this->var = $var; - $this->byRef = $byRef; - } - public function getSubNodeNames() : array - { - return ['var', 'byRef']; - } - public function getType() : string - { - return 'Expr_ClosureUse'; - } -} -attributes = $attributes; - $this->parts = $parts; - } - public function getSubNodeNames() : array - { - return ['parts']; - } - public function getType() : string - { - return 'Expr_ShellExec'; - } -} -attributes = $attributes; - $this->expr = $expr; - } - public function getSubNodeNames() : array - { - return ['expr']; - } - public function getType() : string - { - return 'Expr_Exit'; - } -} -attributes = $attributes; - $this->expr = $expr; - $this->type = $type; - } - public function getSubNodeNames() : array - { - return ['expr', 'type']; - } - public function getType() : string - { - return 'Expr_Include'; - } -} -attributes = $attributes; - $this->type = \is_string($type) ? new Identifier($type) : $type; - } - public function getSubNodeNames() : array - { - return ['type']; - } - public function getType() : string - { - return 'NullableType'; - } -} -attributes = $attributes; - } - public function getSubNodeNames() : array - { - return []; - } - /** - * Get name of magic constant. - * - * @return string Name of magic constant - */ - public abstract function getName() : string; -} -attributes = $attributes; - $this->value = $value; - } - public function getSubNodeNames() : array - { - return ['value']; - } - public function getType() : string - { - return 'Scalar_EncapsedStringPart'; - } -} -attributes = $attributes; - $this->value = $value; - } - public function getSubNodeNames() : array - { - return ['value']; - } - /** - * Constructs an LNumber node from a string number literal. - * - * @param string $str String number literal (decimal, octal, hex or binary) - * @param array $attributes Additional attributes - * @param bool $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5) - * - * @return LNumber The constructed LNumber, including kind attribute - */ - public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = \false) : LNumber - { - $str = \str_replace('_', '', $str); - if ('0' !== $str[0] || '0' === $str) { - $attributes['kind'] = LNumber::KIND_DEC; - return new LNumber((int) $str, $attributes); - } - if ('x' === $str[1] || 'X' === $str[1]) { - $attributes['kind'] = LNumber::KIND_HEX; - return new LNumber(\hexdec($str), $attributes); - } - if ('b' === $str[1] || 'B' === $str[1]) { - $attributes['kind'] = LNumber::KIND_BIN; - return new LNumber(\bindec($str), $attributes); - } - if (!$allowInvalidOctal && \strpbrk($str, '89')) { - throw new Error('Invalid numeric literal', $attributes); - } - // Strip optional explicit octal prefix. - if ('o' === $str[1] || 'O' === $str[1]) { - $str = \substr($str, 2); - } - // use intval instead of octdec to get proper cutting behavior with malformed numbers - $attributes['kind'] = LNumber::KIND_OCT; - return new LNumber(\intval($str, 8), $attributes); - } - public function getType() : string - { - return 'Scalar_LNumber'; - } -} - '\\', '$' => '$', 'n' => "\n", 'r' => "\r", 't' => "\t", 'f' => "\f", 'v' => "\v", 'e' => "\33"]; - /** - * Constructs a string scalar node. - * - * @param string $value Value of the string - * @param array $attributes Additional attributes - */ - public function __construct(string $value, array $attributes = []) - { - $this->attributes = $attributes; - $this->value = $value; - } - public function getSubNodeNames() : array - { - return ['value']; - } - /** - * @internal - * - * Parses a string token. - * - * @param string $str String token content - * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes - * - * @return string The parsed string - */ - public static function parse(string $str, bool $parseUnicodeEscape = \true) : string - { - $bLength = 0; - if ('b' === $str[0] || 'B' === $str[0]) { - $bLength = 1; - } - if ('\'' === $str[$bLength]) { - return \str_replace(['\\\\', '\\\''], ['\\', '\''], \substr($str, $bLength + 1, -1)); - } else { - return self::parseEscapeSequences(\substr($str, $bLength + 1, -1), '"', $parseUnicodeEscape); - } - } - /** - * @internal - * - * Parses escape sequences in strings (all string types apart from single quoted). - * - * @param string $str String without quotes - * @param null|string $quote Quote type - * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes - * - * @return string String with escape sequences parsed - */ - public static function parseEscapeSequences(string $str, $quote, bool $parseUnicodeEscape = \true) : string - { - if (null !== $quote) { - $str = \str_replace('\\' . $quote, $quote, $str); - } - $extra = ''; - if ($parseUnicodeEscape) { - $extra = '|u\\{([0-9a-fA-F]+)\\}'; - } - return \preg_replace_callback('~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}' . $extra . ')~', function ($matches) { - $str = $matches[1]; - if (isset(self::$replacements[$str])) { - return self::$replacements[$str]; - } elseif ('x' === $str[0] || 'X' === $str[0]) { - return \chr(\hexdec(\substr($str, 1))); - } elseif ('u' === $str[0]) { - return self::codePointToUtf8(\hexdec($matches[2])); - } else { - return \chr(\octdec($str)); - } - }, $str); - } - /** - * Converts a Unicode code point to its UTF-8 encoded representation. - * - * @param int $num Code point - * - * @return string UTF-8 representation of code point - */ - private static function codePointToUtf8(int $num) : string - { - if ($num <= 0x7f) { - return \chr($num); - } - if ($num <= 0x7ff) { - return \chr(($num >> 6) + 0xc0) . \chr(($num & 0x3f) + 0x80); - } - if ($num <= 0xffff) { - return \chr(($num >> 12) + 0xe0) . \chr(($num >> 6 & 0x3f) + 0x80) . \chr(($num & 0x3f) + 0x80); - } - if ($num <= 0x1fffff) { - return \chr(($num >> 18) + 0xf0) . \chr(($num >> 12 & 0x3f) + 0x80) . \chr(($num >> 6 & 0x3f) + 0x80) . \chr(($num & 0x3f) + 0x80); - } - throw new Error('Invalid UTF-8 codepoint escape sequence: Codepoint too large'); - } - public function getType() : string - { - return 'Scalar_String'; - } -} -attributes = $attributes; - $this->parts = $parts; - } - public function getSubNodeNames() : array - { - return ['parts']; - } - public function getType() : string - { - return 'Scalar_Encapsed'; - } -} -attributes = $attributes; - $this->value = $value; - } - public function getSubNodeNames() : array - { - return ['value']; - } - /** - * @internal - * - * Parses a DNUMBER token like PHP would. - * - * @param string $str A string number - * - * @return float The parsed number - */ - public static function parse(string $str) : float - { - $str = \str_replace('_', '', $str); - // if string contains any of .eE just cast it to float - if (\false !== \strpbrk($str, '.eE')) { - return (float) $str; - } - // otherwise it's an integer notation that overflowed into a float - // if it starts with 0 it's one of the special integer notations - if ('0' === $str[0]) { - // hex - if ('x' === $str[1] || 'X' === $str[1]) { - return \hexdec($str); - } - // bin - if ('b' === $str[1] || 'B' === $str[1]) { - return \bindec($str); - } - // oct - // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit (8 or 9) - // so that only the digits before that are used - return \octdec(\substr($str, 0, \strcspn($str, '89'))); - } - // dec - return (float) $str; - } - public function getType() : string - { - return 'Scalar_DNumber'; - } -} -attributes = $attributes; - } - public function getType() : string - { - return 'VariadicPlaceholder'; - } - public function getSubNodeNames() : array - { - return []; - } -} - \true, 'parent' => \true, 'static' => \true]; - /** - * Constructs a name node. - * - * @param string|string[]|self $name Name as string, part array or Name instance (copy ctor) - * @param array $attributes Additional attributes - */ - public function __construct($name, array $attributes = []) - { - $this->attributes = $attributes; - $this->parts = self::prepareName($name); - } - public function getSubNodeNames() : array - { - return ['parts']; - } - /** - * Gets the first part of the name, i.e. everything before the first namespace separator. - * - * @return string First part of the name - */ - public function getFirst() : string - { - return $this->parts[0]; - } - /** - * Gets the last part of the name, i.e. everything after the last namespace separator. - * - * @return string Last part of the name - */ - public function getLast() : string - { - return $this->parts[\count($this->parts) - 1]; - } - /** - * Checks whether the name is unqualified. (E.g. Name) - * - * @return bool Whether the name is unqualified - */ - public function isUnqualified() : bool - { - return 1 === \count($this->parts); - } - /** - * Checks whether the name is qualified. (E.g. Name\Name) - * - * @return bool Whether the name is qualified - */ - public function isQualified() : bool - { - return 1 < \count($this->parts); - } - /** - * Checks whether the name is fully qualified. (E.g. \Name) - * - * @return bool Whether the name is fully qualified - */ - public function isFullyQualified() : bool - { - return \false; - } - /** - * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\Name) - * - * @return bool Whether the name is relative - */ - public function isRelative() : bool - { - return \false; - } - /** - * Returns a string representation of the name itself, without taking the name type into - * account (e.g., not including a leading backslash for fully qualified names). - * - * @return string String representation - */ - public function toString() : string - { - return \implode('\\', $this->parts); - } - /** - * Returns a string representation of the name as it would occur in code (e.g., including - * leading backslash for fully qualified names. - * - * @return string String representation - */ - public function toCodeString() : string - { - return $this->toString(); - } - /** - * Returns lowercased string representation of the name, without taking the name type into - * account (e.g., no leading backslash for fully qualified names). - * - * @return string Lowercased string representation - */ - public function toLowerString() : string - { - return \strtolower(\implode('\\', $this->parts)); - } - /** - * Checks whether the identifier is a special class name (self, parent or static). - * - * @return bool Whether identifier is a special class name - */ - public function isSpecialClassName() : bool - { - return \count($this->parts) === 1 && isset(self::$specialClassNames[\strtolower($this->parts[0])]); - } - /** - * Returns a string representation of the name by imploding the namespace parts with the - * namespace separator. - * - * @return string String representation - */ - public function __toString() : string - { - return \implode('\\', $this->parts); - } - /** - * Gets a slice of a name (similar to array_slice). - * - * This method returns a new instance of the same type as the original and with the same - * attributes. - * - * If the slice is empty, null is returned. The null value will be correctly handled in - * concatenations using concat(). - * - * Offset and length have the same meaning as in array_slice(). - * - * @param int $offset Offset to start the slice at (may be negative) - * @param int|null $length Length of the slice (may be negative) - * - * @return static|null Sliced name - */ - public function slice(int $offset, int $length = null) - { - $numParts = \count($this->parts); - $realOffset = $offset < 0 ? $offset + $numParts : $offset; - if ($realOffset < 0 || $realOffset > $numParts) { - throw new \OutOfBoundsException(\sprintf('Offset %d is out of bounds', $offset)); - } - if (null === $length) { - $realLength = $numParts - $realOffset; - } else { - $realLength = $length < 0 ? $length + $numParts - $realOffset : $length; - if ($realLength < 0 || $realLength > $numParts) { - throw new \OutOfBoundsException(\sprintf('Length %d is out of bounds', $length)); - } - } - if ($realLength === 0) { - // Empty slice is represented as null - return null; - } - return new static(\array_slice($this->parts, $realOffset, $realLength), $this->attributes); - } - /** - * Concatenate two names, yielding a new Name instance. - * - * The type of the generated instance depends on which class this method is called on, for - * example Name\FullyQualified::concat() will yield a Name\FullyQualified instance. - * - * If one of the arguments is null, a new instance of the other name will be returned. If both - * arguments are null, null will be returned. As such, writing - * Name::concat($namespace, $shortName) - * where $namespace is a Name node or null will work as expected. - * - * @param string|string[]|self|null $name1 The first name - * @param string|string[]|self|null $name2 The second name - * @param array $attributes Attributes to assign to concatenated name - * - * @return static|null Concatenated name - */ - public static function concat($name1, $name2, array $attributes = []) - { - if (null === $name1 && null === $name2) { - return null; - } elseif (null === $name1) { - return new static(self::prepareName($name2), $attributes); - } elseif (null === $name2) { - return new static(self::prepareName($name1), $attributes); - } else { - return new static(\array_merge(self::prepareName($name1), self::prepareName($name2)), $attributes); - } - } - /** - * Prepares a (string, array or Name node) name for use in name changing methods by converting - * it to an array. - * - * @param string|string[]|self $name Name to prepare - * - * @return string[] Prepared name - */ - private static function prepareName($name) : array - { - if (\is_string($name)) { - if ('' === $name) { - throw new \InvalidArgumentException('Name cannot be empty'); - } - return \explode('\\', $name); - } elseif (\is_array($name)) { - if (empty($name)) { - throw new \InvalidArgumentException('Name cannot be empty'); - } - return $name; - } elseif ($name instanceof self) { - return $name->parts; - } - throw new \InvalidArgumentException('Expected string, array of parts or Name instance'); - } - public function getType() : string - { - return 'Name'; - } -} -attributes = $attributes; - $this->attrs = $attrs; - } - public function getSubNodeNames() : array - { - return ['attrs']; - } - public function getType() : string - { - return 'AttributeGroup'; - } -} -attributes = $attributes; - $this->name = \is_string($name) ? new Identifier($name) : $name; - $this->value = $value; - } - public function getSubNodeNames() : array - { - return ['name', 'value']; - } - public function getType() : string - { - return 'Const'; - } -} -toString(); - } - public function getType() : string - { - return 'Name_Relative'; - } -} -toString(); - } - public function getType() : string - { - return 'Name_FullyQualified'; - } -} - \true, 'parent' => \true, 'static' => \true]; - /** - * Constructs an identifier node. - * - * @param string $name Identifier as string - * @param array $attributes Additional attributes - */ - public function __construct(string $name, array $attributes = []) - { - $this->attributes = $attributes; - $this->name = $name; - } - public function getSubNodeNames() : array - { - return ['name']; - } - /** - * Get identifier as string. - * - * @return string Identifier as string. - */ - public function toString() : string - { - return $this->name; - } - /** - * Get lowercased identifier as string. - * - * @return string Lowercased identifier as string - */ - public function toLowerString() : string - { - return \strtolower($this->name); - } - /** - * Checks whether the identifier is a special class name (self, parent or static). - * - * @return bool Whether identifier is a special class name - */ - public function isSpecialClassName() : bool - { - return isset(self::$specialClassNames[\strtolower($this->name)]); - } - /** - * Get identifier as string. - * - * @return string Identifier as string - */ - public function __toString() : string - { - return $this->name; - } - public function getType() : string - { - return 'Identifier'; - } -} -attributes = $attributes; - $this->type = \is_string($type) ? new Identifier($type) : $type; - $this->byRef = $byRef; - $this->variadic = $variadic; - $this->var = $var; - $this->default = $default; - $this->flags = $flags; - $this->attrGroups = $attrGroups; - } - public function getSubNodeNames() : array - { - return ['attrGroups', 'flags', 'type', 'byRef', 'variadic', 'var', 'default']; - } - public function getType() : string - { - return 'Param'; - } -} -conds = $conds; - $this->body = $body; - $this->attributes = $attributes; - } - public function getSubNodeNames() : array - { - return ['conds', 'body']; - } - public function getType() : string - { - return 'MatchArm'; - } -} -attributes = $attributes; - $this->types = $types; - } - public function getSubNodeNames() : array - { - return ['types']; - } - public function getType() : string - { - return 'IntersectionType'; - } -} -visitors[] = $visitor; - } - /** - * Removes an added visitor. - * - * @param NodeVisitor $visitor - */ - public function removeVisitor(NodeVisitor $visitor) - { - foreach ($this->visitors as $index => $storedVisitor) { - if ($storedVisitor === $visitor) { - unset($this->visitors[$index]); - break; - } - } - } - /** - * Traverses an array of nodes using the registered visitors. - * - * @param Node[] $nodes Array of nodes - * - * @return Node[] Traversed array of nodes - */ - public function traverse(array $nodes) : array - { - $this->stopTraversal = \false; - foreach ($this->visitors as $visitor) { - if (null !== ($return = $visitor->beforeTraverse($nodes))) { - $nodes = $return; - } - } - $nodes = $this->traverseArray($nodes); - foreach ($this->visitors as $visitor) { - if (null !== ($return = $visitor->afterTraverse($nodes))) { - $nodes = $return; - } - } - return $nodes; - } - /** - * Recursively traverse a node. - * - * @param Node $node Node to traverse. - * - * @return Node Result of traversal (may be original node or new one) - */ - protected function traverseNode(Node $node) : Node - { - foreach ($node->getSubNodeNames() as $name) { - $subNode =& $node->{$name}; - if (\is_array($subNode)) { - $subNode = $this->traverseArray($subNode); - if ($this->stopTraversal) { - break; - } - } elseif ($subNode instanceof Node) { - $traverseChildren = \true; - $breakVisitorIndex = null; - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->enterNode($subNode); - if (null !== $return) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($subNode, $return); - $subNode = $return; - } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { - $traverseChildren = \false; - } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { - $traverseChildren = \false; - $breakVisitorIndex = $visitorIndex; - break; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = \true; - break 2; - } else { - throw new \LogicException('enterNode() returned invalid value of type ' . \gettype($return)); - } - } - } - if ($traverseChildren) { - $subNode = $this->traverseNode($subNode); - if ($this->stopTraversal) { - break; - } - } - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->leaveNode($subNode); - if (null !== $return) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($subNode, $return); - $subNode = $return; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = \true; - break 2; - } elseif (\is_array($return)) { - throw new \LogicException('leaveNode() may only return an array ' . 'if the parent structure is an array'); - } else { - throw new \LogicException('leaveNode() returned invalid value of type ' . \gettype($return)); - } - } - if ($breakVisitorIndex === $visitorIndex) { - break; - } - } - } - } - return $node; - } - /** - * Recursively traverse array (usually of nodes). - * - * @param array $nodes Array to traverse - * - * @return array Result of traversal (may be original array or changed one) - */ - protected function traverseArray(array $nodes) : array - { - $doNodes = []; - foreach ($nodes as $i => &$node) { - if ($node instanceof Node) { - $traverseChildren = \true; - $breakVisitorIndex = null; - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->enterNode($node); - if (null !== $return) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($node, $return); - $node = $return; - } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { - $traverseChildren = \false; - } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { - $traverseChildren = \false; - $breakVisitorIndex = $visitorIndex; - break; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = \true; - break 2; - } else { - throw new \LogicException('enterNode() returned invalid value of type ' . \gettype($return)); - } - } - } - if ($traverseChildren) { - $node = $this->traverseNode($node); - if ($this->stopTraversal) { - break; - } - } - foreach ($this->visitors as $visitorIndex => $visitor) { - $return = $visitor->leaveNode($node); - if (null !== $return) { - if ($return instanceof Node) { - $this->ensureReplacementReasonable($node, $return); - $node = $return; - } elseif (\is_array($return)) { - $doNodes[] = [$i, $return]; - break; - } elseif (self::REMOVE_NODE === $return) { - $doNodes[] = [$i, []]; - break; - } elseif (self::STOP_TRAVERSAL === $return) { - $this->stopTraversal = \true; - break 2; - } elseif (\false === $return) { - throw new \LogicException('bool(false) return from leaveNode() no longer supported. ' . 'Return NodeTraverser::REMOVE_NODE instead'); - } else { - throw new \LogicException('leaveNode() returned invalid value of type ' . \gettype($return)); - } - } - if ($breakVisitorIndex === $visitorIndex) { - break; - } - } - } elseif (\is_array($node)) { - throw new \LogicException('Invalid node structure: Contains nested arrays'); - } - } - if (!empty($doNodes)) { - while (list($i, $replace) = \array_pop($doNodes)) { - \array_splice($nodes, $i, 1, $replace); - } - } - return $nodes; - } - private function ensureReplacementReasonable($old, $new) - { - if ($old instanceof Node\Stmt && $new instanceof Node\Expr) { - throw new \LogicException("Trying to replace statement ({$old->getType()}) " . "with expression ({$new->getType()}). Are you missing a " . "Stmt_Expression wrapper?"); - } - if ($old instanceof Node\Expr && $new instanceof Node\Stmt) { - throw new \LogicException("Trying to replace expression ({$old->getType()}) " . "with statement ({$new->getType()})"); - } - } -} - $node stays as-is - * * NodeTraverser::DONT_TRAVERSE_CHILDREN - * => Children of $node are not traversed. $node stays as-is - * * NodeTraverser::STOP_TRAVERSAL - * => Traversal is aborted. $node stays as-is - * * otherwise - * => $node is set to the return value - * - * @param Node $node Node - * - * @return null|int|Node Replacement node (or special return value) - */ - public function enterNode(Node $node); - /** - * Called when leaving a node. - * - * Return value semantics: - * * null - * => $node stays as-is - * * NodeTraverser::REMOVE_NODE - * => $node is removed from the parent array - * * NodeTraverser::STOP_TRAVERSAL - * => Traversal is aborted. $node stays as-is - * * array (of Nodes) - * => The return value is merged into the parent array (at the position of the $node) - * * otherwise - * => $node is set to the return value - * - * @param Node $node Node - * - * @return null|int|Node|Node[] Replacement node (or special return value) - */ - public function leaveNode(Node $node); - /** - * Called once after traversal. - * - * Return value semantics: - * * null: $nodes stays as-is - * * otherwise: $nodes is set to the return value - * - * @param Node[] $nodes Array of nodes - * - * @return null|Node[] Array of nodes - */ - public function afterTraverse(array $nodes); -} -decodeRecursive($value); - } - private function decodeRecursive($value) - { - if (\is_array($value)) { - if (isset($value['nodeType'])) { - if ($value['nodeType'] === 'Comment' || $value['nodeType'] === 'Comment_Doc') { - return $this->decodeComment($value); - } - return $this->decodeNode($value); - } - return $this->decodeArray($value); - } - return $value; - } - private function decodeArray(array $array) : array - { - $decodedArray = []; - foreach ($array as $key => $value) { - $decodedArray[$key] = $this->decodeRecursive($value); - } - return $decodedArray; - } - private function decodeNode(array $value) : Node - { - $nodeType = $value['nodeType']; - if (!\is_string($nodeType)) { - throw new \RuntimeException('Node type must be a string'); - } - $reflectionClass = $this->reflectionClassFromNodeType($nodeType); - /** @var Node $node */ - $node = $reflectionClass->newInstanceWithoutConstructor(); - if (isset($value['attributes'])) { - if (!\is_array($value['attributes'])) { - throw new \RuntimeException('Attributes must be an array'); - } - $node->setAttributes($this->decodeArray($value['attributes'])); - } - foreach ($value as $name => $subNode) { - if ($name === 'nodeType' || $name === 'attributes') { - continue; - } - $node->{$name} = $this->decodeRecursive($subNode); - } - return $node; - } - private function decodeComment(array $value) : Comment - { - $className = $value['nodeType'] === 'Comment' ? Comment::class : Comment\Doc::class; - if (!isset($value['text'])) { - throw new \RuntimeException('Comment must have text'); - } - return new $className($value['text'], $value['line'] ?? -1, $value['filePos'] ?? -1, $value['tokenPos'] ?? -1, $value['endLine'] ?? -1, $value['endFilePos'] ?? -1, $value['endTokenPos'] ?? -1); - } - private function reflectionClassFromNodeType(string $nodeType) : \ReflectionClass - { - if (!isset($this->reflectionClassCache[$nodeType])) { - $className = $this->classNameFromNodeType($nodeType); - $this->reflectionClassCache[$nodeType] = new \ReflectionClass($className); - } - return $this->reflectionClassCache[$nodeType]; - } - private function classNameFromNodeType(string $nodeType) : string - { - $className = 'PhpParser\\Node\\' . \strtr($nodeType, '_', '\\'); - if (\class_exists($className)) { - return $className; - } - $className .= '_'; - if (\class_exists($className)) { - return $className; - } - throw new \RuntimeException("Unknown node type \"{$nodeType}\""); - } -} -attributes = $attributes; - } - /** - * Gets line the node started in (alias of getStartLine). - * - * @return int Start line (or -1 if not available) - */ - public function getLine() : int - { - return $this->attributes['startLine'] ?? -1; - } - /** - * Gets line the node started in. - * - * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default). - * - * @return int Start line (or -1 if not available) - */ - public function getStartLine() : int - { - return $this->attributes['startLine'] ?? -1; - } - /** - * Gets the line the node ended in. - * - * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default). - * - * @return int End line (or -1 if not available) - */ - public function getEndLine() : int - { - return $this->attributes['endLine'] ?? -1; - } - /** - * Gets the token offset of the first token that is part of this node. - * - * The offset is an index into the array returned by Lexer::getTokens(). - * - * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int Token start position (or -1 if not available) - */ - public function getStartTokenPos() : int - { - return $this->attributes['startTokenPos'] ?? -1; - } - /** - * Gets the token offset of the last token that is part of this node. - * - * The offset is an index into the array returned by Lexer::getTokens(). - * - * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int Token end position (or -1 if not available) - */ - public function getEndTokenPos() : int - { - return $this->attributes['endTokenPos'] ?? -1; - } - /** - * Gets the file offset of the first character that is part of this node. - * - * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int File start position (or -1 if not available) - */ - public function getStartFilePos() : int - { - return $this->attributes['startFilePos'] ?? -1; - } - /** - * Gets the file offset of the last character that is part of this node. - * - * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default). - * - * @return int File end position (or -1 if not available) - */ - public function getEndFilePos() : int - { - return $this->attributes['endFilePos'] ?? -1; - } - /** - * Gets all comments directly preceding this node. - * - * The comments are also available through the "comments" attribute. - * - * @return Comment[] - */ - public function getComments() : array - { - return $this->attributes['comments'] ?? []; - } - /** - * Gets the doc comment of the node. - * - * @return null|Comment\Doc Doc comment object or null - */ - public function getDocComment() - { - $comments = $this->getComments(); - for ($i = \count($comments) - 1; $i >= 0; $i--) { - $comment = $comments[$i]; - if ($comment instanceof Comment\Doc) { - return $comment; - } - } - return null; - } - /** - * Sets the doc comment of the node. - * - * This will either replace an existing doc comment or add it to the comments array. - * - * @param Comment\Doc $docComment Doc comment to set - */ - public function setDocComment(Comment\Doc $docComment) - { - $comments = $this->getComments(); - for ($i = \count($comments) - 1; $i >= 0; $i--) { - if ($comments[$i] instanceof Comment\Doc) { - // Replace existing doc comment. - $comments[$i] = $docComment; - $this->setAttribute('comments', $comments); - return; - } - } - // Append new doc comment. - $comments[] = $docComment; - $this->setAttribute('comments', $comments); - } - public function setAttribute(string $key, $value) - { - $this->attributes[$key] = $value; - } - public function hasAttribute(string $key) : bool - { - return \array_key_exists($key, $this->attributes); - } - public function getAttribute(string $key, $default = null) - { - if (\array_key_exists($key, $this->attributes)) { - return $this->attributes[$key]; - } - return $default; - } - public function getAttributes() : array - { - return $this->attributes; - } - public function setAttributes(array $attributes) - { - $this->attributes = $attributes; - } - /** - * @return array - */ - public function jsonSerialize() : array - { - return ['nodeType' => $this->getType()] + \get_object_vars($this); - } -} -defineCompatibilityTokens(); - $this->tokenMap = $this->createTokenMap(); - $this->identifierTokens = $this->createIdentifierTokenMap(); - // map of tokens to drop while lexing (the map is only used for isset lookup, - // that's why the value is simply set to 1; the value is never actually used.) - $this->dropTokens = \array_fill_keys([\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT, \T_BAD_CHARACTER], 1); - $defaultAttributes = ['comments', 'startLine', 'endLine']; - $usedAttributes = \array_fill_keys($options['usedAttributes'] ?? $defaultAttributes, \true); - // Create individual boolean properties to make these checks faster. - $this->attributeStartLineUsed = isset($usedAttributes['startLine']); - $this->attributeEndLineUsed = isset($usedAttributes['endLine']); - $this->attributeStartTokenPosUsed = isset($usedAttributes['startTokenPos']); - $this->attributeEndTokenPosUsed = isset($usedAttributes['endTokenPos']); - $this->attributeStartFilePosUsed = isset($usedAttributes['startFilePos']); - $this->attributeEndFilePosUsed = isset($usedAttributes['endFilePos']); - $this->attributeCommentsUsed = isset($usedAttributes['comments']); - } - /** - * Initializes the lexer for lexing the provided source code. - * - * This function does not throw if lexing errors occur. Instead, errors may be retrieved using - * the getErrors() method. - * - * @param string $code The source code to lex - * @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to - * ErrorHandler\Throwing - */ - public function startLexing(string $code, ErrorHandler $errorHandler = null) - { - if (null === $errorHandler) { - $errorHandler = new ErrorHandler\Throwing(); - } - $this->code = $code; - // keep the code around for __halt_compiler() handling - $this->pos = -1; - $this->line = 1; - $this->filePos = 0; - // If inline HTML occurs without preceding code, treat it as if it had a leading newline. - // This ensures proper composability, because having a newline is the "safe" assumption. - $this->prevCloseTagHasNewline = \true; - $scream = \ini_set('xdebug.scream', '0'); - $this->tokens = @\token_get_all($code); - $this->postprocessTokens($errorHandler); - if (\false !== $scream) { - \ini_set('xdebug.scream', $scream); - } - } - private function handleInvalidCharacterRange($start, $end, $line, ErrorHandler $errorHandler) - { - $tokens = []; - for ($i = $start; $i < $end; $i++) { - $chr = $this->code[$i]; - if ($chr === "\0") { - // PHP cuts error message after null byte, so need special case - $errorMsg = 'Unexpected null byte'; - } else { - $errorMsg = \sprintf('Unexpected character "%s" (ASCII %d)', $chr, \ord($chr)); - } - $tokens[] = [\T_BAD_CHARACTER, $chr, $line]; - $errorHandler->handleError(new Error($errorMsg, ['startLine' => $line, 'endLine' => $line, 'startFilePos' => $i, 'endFilePos' => $i])); - } - return $tokens; - } - /** - * Check whether comment token is unterminated. - * - * @return bool - */ - private function isUnterminatedComment($token) : bool - { - return ($token[0] === \T_COMMENT || $token[0] === \T_DOC_COMMENT) && \substr($token[1], 0, 2) === '/*' && \substr($token[1], -2) !== '*/'; - } - protected function postprocessTokens(ErrorHandler $errorHandler) - { - // PHP's error handling for token_get_all() is rather bad, so if we want detailed - // error information we need to compute it ourselves. Invalid character errors are - // detected by finding "gaps" in the token array. Unterminated comments are detected - // by checking if a trailing comment has a "*/" at the end. - // - // Additionally, we perform a number of canonicalizations here: - // * Use the PHP 8.0 comment format, which does not include trailing whitespace anymore. - // * Use PHP 8.0 T_NAME_* tokens. - // * Use PHP 8.1 T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG and - // T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG tokens used to disambiguate intersection types. - $filePos = 0; - $line = 1; - $numTokens = \count($this->tokens); - for ($i = 0; $i < $numTokens; $i++) { - $token = $this->tokens[$i]; - // Since PHP 7.4 invalid characters are represented by a T_BAD_CHARACTER token. - // In this case we only need to emit an error. - if ($token[0] === \T_BAD_CHARACTER) { - $this->handleInvalidCharacterRange($filePos, $filePos + 1, $line, $errorHandler); - } - if ($token[0] === \T_COMMENT && \substr($token[1], 0, 2) !== '/*' && \preg_match('/(\\r\\n|\\n|\\r)$/D', $token[1], $matches)) { - $trailingNewline = $matches[0]; - $token[1] = \substr($token[1], 0, -\strlen($trailingNewline)); - $this->tokens[$i] = $token; - if (isset($this->tokens[$i + 1]) && $this->tokens[$i + 1][0] === \T_WHITESPACE) { - // Move trailing newline into following T_WHITESPACE token, if it already exists. - $this->tokens[$i + 1][1] = $trailingNewline . $this->tokens[$i + 1][1]; - $this->tokens[$i + 1][2]--; - } else { - // Otherwise, we need to create a new T_WHITESPACE token. - \array_splice($this->tokens, $i + 1, 0, [[\T_WHITESPACE, $trailingNewline, $line]]); - $numTokens++; - } - } - // Emulate PHP 8 T_NAME_* tokens, by combining sequences of T_NS_SEPARATOR and T_STRING - // into a single token. - if (\is_array($token) && ($token[0] === \T_NS_SEPARATOR || isset($this->identifierTokens[$token[0]]))) { - $lastWasSeparator = $token[0] === \T_NS_SEPARATOR; - $text = $token[1]; - for ($j = $i + 1; isset($this->tokens[$j]); $j++) { - if ($lastWasSeparator) { - if (!isset($this->identifierTokens[$this->tokens[$j][0]])) { - break; - } - $lastWasSeparator = \false; - } else { - if ($this->tokens[$j][0] !== \T_NS_SEPARATOR) { - break; - } - $lastWasSeparator = \true; - } - $text .= $this->tokens[$j][1]; - } - if ($lastWasSeparator) { - // Trailing separator is not part of the name. - $j--; - $text = \substr($text, 0, -1); - } - if ($j > $i + 1) { - if ($token[0] === \T_NS_SEPARATOR) { - $type = \T_NAME_FULLY_QUALIFIED; - } else { - if ($token[0] === \T_NAMESPACE) { - $type = \T_NAME_RELATIVE; - } else { - $type = \T_NAME_QUALIFIED; - } - } - $token = [$type, $text, $line]; - \array_splice($this->tokens, $i, $j - $i, [$token]); - $numTokens -= $j - $i - 1; - } - } - if ($token === '&') { - $next = $i + 1; - while (isset($this->tokens[$next]) && $this->tokens[$next][0] === \T_WHITESPACE) { - $next++; - } - $followedByVarOrVarArg = isset($this->tokens[$next]) && ($this->tokens[$next][0] === \T_VARIABLE || $this->tokens[$next][0] === \T_ELLIPSIS); - $this->tokens[$i] = $token = [$followedByVarOrVarArg ? \T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG : \T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG, '&', $line]; - } - $tokenValue = \is_string($token) ? $token : $token[1]; - $tokenLen = \strlen($tokenValue); - if (\substr($this->code, $filePos, $tokenLen) !== $tokenValue) { - // Something is missing, must be an invalid character - $nextFilePos = \strpos($this->code, $tokenValue, $filePos); - $badCharTokens = $this->handleInvalidCharacterRange($filePos, $nextFilePos, $line, $errorHandler); - $filePos = (int) $nextFilePos; - \array_splice($this->tokens, $i, 0, $badCharTokens); - $numTokens += \count($badCharTokens); - $i += \count($badCharTokens); - } - $filePos += $tokenLen; - $line += \substr_count($tokenValue, "\n"); - } - if ($filePos !== \strlen($this->code)) { - if (\substr($this->code, $filePos, 2) === '/*') { - // Unlike PHP, HHVM will drop unterminated comments entirely - $comment = \substr($this->code, $filePos); - $errorHandler->handleError(new Error('Unterminated comment', ['startLine' => $line, 'endLine' => $line + \substr_count($comment, "\n"), 'startFilePos' => $filePos, 'endFilePos' => $filePos + \strlen($comment)])); - // Emulate the PHP behavior - $isDocComment = isset($comment[3]) && $comment[3] === '*'; - $this->tokens[] = [$isDocComment ? \T_DOC_COMMENT : \T_COMMENT, $comment, $line]; - } else { - // Invalid characters at the end of the input - $badCharTokens = $this->handleInvalidCharacterRange($filePos, \strlen($this->code), $line, $errorHandler); - $this->tokens = \array_merge($this->tokens, $badCharTokens); - } - return; - } - if (\count($this->tokens) > 0) { - // Check for unterminated comment - $lastToken = $this->tokens[\count($this->tokens) - 1]; - if ($this->isUnterminatedComment($lastToken)) { - $errorHandler->handleError(new Error('Unterminated comment', ['startLine' => $line - \substr_count($lastToken[1], "\n"), 'endLine' => $line, 'startFilePos' => $filePos - \strlen($lastToken[1]), 'endFilePos' => $filePos])); - } - } - } - /** - * Fetches the next token. - * - * The available attributes are determined by the 'usedAttributes' option, which can - * be specified in the constructor. The following attributes are supported: - * - * * 'comments' => Array of PhpParser\Comment or PhpParser\Comment\Doc instances, - * representing all comments that occurred between the previous - * non-discarded token and the current one. - * * 'startLine' => Line in which the node starts. - * * 'endLine' => Line in which the node ends. - * * 'startTokenPos' => Offset into the token array of the first token in the node. - * * 'endTokenPos' => Offset into the token array of the last token in the node. - * * 'startFilePos' => Offset into the code string of the first character that is part of the node. - * * 'endFilePos' => Offset into the code string of the last character that is part of the node. - * - * @param mixed $value Variable to store token content in - * @param mixed $startAttributes Variable to store start attributes in - * @param mixed $endAttributes Variable to store end attributes in - * - * @return int Token id - */ - public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) : int - { - $startAttributes = []; - $endAttributes = []; - while (1) { - if (isset($this->tokens[++$this->pos])) { - $token = $this->tokens[$this->pos]; - } else { - // EOF token with ID 0 - $token = "\0"; - } - if ($this->attributeStartLineUsed) { - $startAttributes['startLine'] = $this->line; - } - if ($this->attributeStartTokenPosUsed) { - $startAttributes['startTokenPos'] = $this->pos; - } - if ($this->attributeStartFilePosUsed) { - $startAttributes['startFilePos'] = $this->filePos; - } - if (\is_string($token)) { - $value = $token; - if (isset($token[1])) { - // bug in token_get_all - $this->filePos += 2; - $id = \ord('"'); - } else { - $this->filePos += 1; - $id = \ord($token); - } - } elseif (!isset($this->dropTokens[$token[0]])) { - $value = $token[1]; - $id = $this->tokenMap[$token[0]]; - if (\T_CLOSE_TAG === $token[0]) { - $this->prevCloseTagHasNewline = \false !== \strpos($token[1], "\n") || \false !== \strpos($token[1], "\r"); - } elseif (\T_INLINE_HTML === $token[0]) { - $startAttributes['hasLeadingNewline'] = $this->prevCloseTagHasNewline; - } - $this->line += \substr_count($value, "\n"); - $this->filePos += \strlen($value); - } else { - $origLine = $this->line; - $origFilePos = $this->filePos; - $this->line += \substr_count($token[1], "\n"); - $this->filePos += \strlen($token[1]); - if (\T_COMMENT === $token[0] || \T_DOC_COMMENT === $token[0]) { - if ($this->attributeCommentsUsed) { - $comment = \T_DOC_COMMENT === $token[0] ? new Comment\Doc($token[1], $origLine, $origFilePos, $this->pos, $this->line, $this->filePos - 1, $this->pos) : new Comment($token[1], $origLine, $origFilePos, $this->pos, $this->line, $this->filePos - 1, $this->pos); - $startAttributes['comments'][] = $comment; - } - } - continue; - } - if ($this->attributeEndLineUsed) { - $endAttributes['endLine'] = $this->line; - } - if ($this->attributeEndTokenPosUsed) { - $endAttributes['endTokenPos'] = $this->pos; - } - if ($this->attributeEndFilePosUsed) { - $endAttributes['endFilePos'] = $this->filePos - 1; - } - return $id; - } - throw new \RuntimeException('Reached end of lexer loop'); - } - /** - * Returns the token array for current code. - * - * The token array is in the same format as provided by the - * token_get_all() function and does not discard tokens (i.e. - * whitespace and comments are included). The token position - * attributes are against this token array. - * - * @return array Array of tokens in token_get_all() format - */ - public function getTokens() : array - { - return $this->tokens; - } - /** - * Handles __halt_compiler() by returning the text after it. - * - * @return string Remaining text - */ - public function handleHaltCompiler() : string - { - // text after T_HALT_COMPILER, still including (); - $textAfter = \substr($this->code, $this->filePos); - // ensure that it is followed by (); - // this simplifies the situation, by not allowing any comments - // in between of the tokens. - if (!\preg_match('~^\\s*\\(\\s*\\)\\s*(?:;|\\?>\\r?\\n?)~', $textAfter, $matches)) { - throw new Error('__HALT_COMPILER must be followed by "();"'); - } - // prevent the lexer from returning any further tokens - $this->pos = \count($this->tokens); - // return with (); removed - return \substr($textAfter, \strlen($matches[0])); - } - private function defineCompatibilityTokens() - { - static $compatTokensDefined = \false; - if ($compatTokensDefined) { - return; - } - $compatTokens = [ - // PHP 7.4 - 'T_BAD_CHARACTER', - 'T_FN', - 'T_COALESCE_EQUAL', - // PHP 8.0 - 'T_NAME_QUALIFIED', - 'T_NAME_FULLY_QUALIFIED', - 'T_NAME_RELATIVE', - 'T_MATCH', - 'T_NULLSAFE_OBJECT_OPERATOR', - 'T_ATTRIBUTE', - // PHP 8.1 - 'T_ENUM', - 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', - 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', - 'T_READONLY', - ]; - // PHP-Parser might be used together with another library that also emulates some or all - // of these tokens. Perform a sanity-check that all already defined tokens have been - // assigned a unique ID. - $usedTokenIds = []; - foreach ($compatTokens as $token) { - if (\defined($token)) { - $tokenId = \constant($token); - $clashingToken = $usedTokenIds[$tokenId] ?? null; - if ($clashingToken !== null) { - throw new \Error(\sprintf('Token %s has same ID as token %s, ' . 'you may be using a library with broken token emulation', $token, $clashingToken)); - } - $usedTokenIds[$tokenId] = $token; - } - } - // Now define any tokens that have not yet been emulated. Try to assign IDs from -1 - // downwards, but skip any IDs that may already be in use. - $newTokenId = -1; - foreach ($compatTokens as $token) { - if (!\defined($token)) { - while (isset($usedTokenIds[$newTokenId])) { - $newTokenId--; - } - \define($token, $newTokenId); - $newTokenId--; - } - } - $compatTokensDefined = \true; - } - /** - * Creates the token map. - * - * The token map maps the PHP internal token identifiers - * to the identifiers used by the Parser. Additionally it - * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'. - * - * @return array The token map - */ - protected function createTokenMap() : array - { - $tokenMap = []; - // 256 is the minimum possible token number, as everything below - // it is an ASCII value - for ($i = 256; $i < 1000; ++$i) { - if (\T_DOUBLE_COLON === $i) { - // T_DOUBLE_COLON is equivalent to T_PAAMAYIM_NEKUDOTAYIM - $tokenMap[$i] = Tokens::T_PAAMAYIM_NEKUDOTAYIM; - } elseif (\T_OPEN_TAG_WITH_ECHO === $i) { - // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO - $tokenMap[$i] = Tokens::T_ECHO; - } elseif (\T_CLOSE_TAG === $i) { - // T_CLOSE_TAG is equivalent to ';' - $tokenMap[$i] = \ord(';'); - } elseif ('UNKNOWN' !== ($name = \token_name($i))) { - if ('T_HASHBANG' === $name) { - // HHVM uses a special token for #! hashbang lines - $tokenMap[$i] = Tokens::T_INLINE_HTML; - } elseif (\defined($name = Tokens::class . '::' . $name)) { - // Other tokens can be mapped directly - $tokenMap[$i] = \constant($name); - } - } - } - // HHVM uses a special token for numbers that overflow to double - if (\defined('T_ONUMBER')) { - $tokenMap[\T_ONUMBER] = Tokens::T_DNUMBER; - } - // HHVM also has a separate token for the __COMPILER_HALT_OFFSET__ constant - if (\defined('T_COMPILER_HALT_OFFSET')) { - $tokenMap[\T_COMPILER_HALT_OFFSET] = Tokens::T_STRING; - } - // Assign tokens for which we define compatibility constants, as token_name() does not know them. - $tokenMap[\T_FN] = Tokens::T_FN; - $tokenMap[\T_COALESCE_EQUAL] = Tokens::T_COALESCE_EQUAL; - $tokenMap[\T_NAME_QUALIFIED] = Tokens::T_NAME_QUALIFIED; - $tokenMap[\T_NAME_FULLY_QUALIFIED] = Tokens::T_NAME_FULLY_QUALIFIED; - $tokenMap[\T_NAME_RELATIVE] = Tokens::T_NAME_RELATIVE; - $tokenMap[\T_MATCH] = Tokens::T_MATCH; - $tokenMap[\T_NULLSAFE_OBJECT_OPERATOR] = Tokens::T_NULLSAFE_OBJECT_OPERATOR; - $tokenMap[\T_ATTRIBUTE] = Tokens::T_ATTRIBUTE; - $tokenMap[\T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG; - $tokenMap[\T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG] = Tokens::T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG; - $tokenMap[\T_ENUM] = Tokens::T_ENUM; - $tokenMap[\T_READONLY] = Tokens::T_READONLY; - return $tokenMap; - } - private function createIdentifierTokenMap() : array - { - // Based on semi_reserved production. - return \array_fill_keys([\T_STRING, \T_STATIC, \T_ABSTRACT, \T_FINAL, \T_PRIVATE, \T_PROTECTED, \T_PUBLIC, \T_READONLY, \T_INCLUDE, \T_INCLUDE_ONCE, \T_EVAL, \T_REQUIRE, \T_REQUIRE_ONCE, \T_LOGICAL_OR, \T_LOGICAL_XOR, \T_LOGICAL_AND, \T_INSTANCEOF, \T_NEW, \T_CLONE, \T_EXIT, \T_IF, \T_ELSEIF, \T_ELSE, \T_ENDIF, \T_ECHO, \T_DO, \T_WHILE, \T_ENDWHILE, \T_FOR, \T_ENDFOR, \T_FOREACH, \T_ENDFOREACH, \T_DECLARE, \T_ENDDECLARE, \T_AS, \T_TRY, \T_CATCH, \T_FINALLY, \T_THROW, \T_USE, \T_INSTEADOF, \T_GLOBAL, \T_VAR, \T_UNSET, \T_ISSET, \T_EMPTY, \T_CONTINUE, \T_GOTO, \T_FUNCTION, \T_CONST, \T_RETURN, \T_PRINT, \T_YIELD, \T_LIST, \T_SWITCH, \T_ENDSWITCH, \T_CASE, \T_DEFAULT, \T_BREAK, \T_ARRAY, \T_CALLABLE, \T_EXTENDS, \T_IMPLEMENTS, \T_NAMESPACE, \T_TRAIT, \T_INTERFACE, \T_CLASS, \T_CLASS_C, \T_TRAIT_C, \T_FUNC_C, \T_METHOD_C, \T_LINE, \T_FILE, \T_DIR, \T_NS_C, \T_HALT_COMPILER, \T_FN, \T_MATCH], \true); - } -} -'", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_READONLY", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_ENUM", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_NULLSAFE_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "T_ATTRIBUTE", "';'", "']'", "'{'", "'}'", "'('", "')'", "'`'", "'\"'", "'\$'"); - protected $tokenToSymbol = array(0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 56, 166, 168, 167, 55, 168, 168, 163, 164, 53, 50, 8, 51, 52, 54, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 31, 159, 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 70, 168, 160, 36, 168, 165, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 161, 35, 162, 58, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158); - protected $action = array(131, 132, 133, 569, 134, 135, 0, 722, 723, 724, 136, 36, 834, 911, 835, 468, -32766, -32766, -32766, -32767, -32767, -32767, -32767, 100, 101, 102, 103, 104, 1068, 1069, 1070, 1067, 1066, 1065, 1071, 716, 715, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, -32767, 545, 546, -32766, -32766, 725, -32766, -32766, -32766, 998, 999, 806, 922, 446, 447, 448, 369, 370, 2, 266, 137, 395, 729, 730, 731, 732, 413, -32766, 419, -32766, -32766, -32766, -32766, -32766, 990, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 763, 570, 764, 765, 766, 767, 755, 756, 335, 336, 758, 759, 744, 745, 746, 748, 749, 750, 345, 790, 791, 792, 793, 794, 795, 751, 752, 571, 572, 784, 775, 773, 774, 787, 770, 771, 282, 419, 573, 574, 769, 575, 576, 577, 578, 579, 580, 598, -575, 469, 491, 798, 772, 581, 582, -575, 138, -32766, -32766, -32766, 131, 132, 133, 569, 134, 135, 1017, 722, 723, 724, 136, 36, 1060, -32766, -32766, -32766, 1303, 696, -32766, 1304, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 1068, 1069, 1070, 1067, 1066, 1065, 1071, -32766, 716, 715, 371, 370, 1258, -32766, -32766, -32766, -572, 105, 106, 107, 413, 269, 891, -572, 239, 1193, 1192, 1194, 725, -32766, -32766, -32766, 1046, 108, -32766, -32766, -32766, -32766, 986, 985, 984, 987, 266, 137, 395, 729, 730, 731, 732, 12, -32766, 419, -32766, -32766, -32766, -32766, 998, 999, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 763, 570, 764, 765, 766, 767, 755, 756, 335, 336, 758, 759, 744, 745, 746, 748, 749, 750, 345, 790, 791, 792, 793, 794, 795, 751, 752, 571, 572, 784, 775, 773, 774, 787, 770, 771, 881, 320, 573, 574, 769, 575, 576, 577, 578, 579, 580, -32766, 81, 82, 83, -575, 772, 581, 582, -575, 147, 747, 717, 718, 719, 720, 721, 1278, 722, 723, 724, 760, 761, 35, 1277, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 996, 269, 149, -32766, -32766, -32766, 454, 455, 80, 33, -264, -572, 1016, 108, 319, -572, 893, 725, 682, 803, 127, 998, 999, 592, -32766, 1044, -32766, -32766, -32766, 809, 150, 726, 727, 728, 729, 730, 731, 732, -88, 1198, 796, 277, -526, 282, -32766, -32766, -32766, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 763, 786, 764, 765, 766, 767, 755, 756, 757, 785, 758, 759, 744, 745, 746, 748, 749, 750, 789, 790, 791, 792, 793, 794, 795, 751, 752, 753, 754, 784, 775, 773, 774, 787, 770, 771, 143, 804, 762, 768, 769, 776, 777, 779, 778, 780, 781, -314, -526, -526, -193, -192, 772, 783, 782, 48, 49, 50, 500, 51, 52, 238, 807, -526, -86, 53, 54, -111, 55, 996, 252, -32766, -111, 800, -111, -526, 541, -532, -352, 299, -352, 303, -111, -111, -111, -111, -111, -111, -111, -111, 998, 999, 998, 999, 152, -32766, -32766, -32766, 1191, 807, 125, 305, 1293, 56, 57, 102, 103, 104, -111, 58, 1218, 59, 245, 246, 60, 61, 62, 63, 64, 65, 66, 67, -525, 26, 267, 68, 435, 501, -328, 808, -86, 1224, 1225, 502, 1189, 807, 1198, 1230, 292, 1222, 40, 23, 503, 73, 504, 953, 505, 319, 506, 802, 153, 507, 508, 278, 684, 279, 42, 43, 436, 366, 365, 891, 44, 509, 34, 248, -16, -566, 357, 331, 317, -566, 1198, 1193, 1192, 1194, -527, 510, 511, 512, 332, -524, 1274, 47, 716, 715, -525, -525, 333, 513, 514, 807, 1212, 1213, 1214, 1215, 1209, 1210, 291, 359, 283, -525, 284, -314, 1216, 1211, -193, -192, 1193, 1192, 1194, 292, 891, -525, 363, -531, 69, 807, 315, 316, 319, 30, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, -153, -153, -153, 638, 24, -527, -527, 687, 378, 881, -524, -524, 295, 296, 891, -153, 431, -153, 807, -153, -527, -153, 716, 715, 432, -524, 798, 362, -111, 1105, 1107, 364, -527, 433, 891, 139, 434, -524, 954, 126, -524, 319, -111, -111, 688, 813, 380, -529, 11, 834, 154, 835, 867, -111, -111, -111, -111, 46, 292, -32766, 881, 654, 655, 73, 689, 1191, 1045, 319, 708, 148, 398, 156, -32766, -32766, -32766, 31, -32766, -79, -32766, 122, -32766, 716, 715, -32766, 893, 891, 682, -153, -32766, -32766, -32766, 716, 715, 891, -32766, -32766, 123, 881, 128, 73, -32766, 410, 129, 319, -524, -524, 142, 140, -75, -32766, 157, -529, -529, 319, 26, 691, 158, 881, 159, -524, 160, 293, 294, 698, 367, 368, 807, -73, -32766, -72, 1222, -524, 372, 373, 1191, 893, -71, 682, -529, 72, -70, -32766, -32766, -32766, -69, -32766, -68, -32766, 124, -32766, 630, 631, -32766, -67, -66, -47, -51, -32766, -32766, -32766, -18, 146, 270, -32766, -32766, 276, 697, 700, 881, -32766, 410, 890, 893, 145, 682, 281, 881, 907, -32766, 280, 513, 514, 285, 1212, 1213, 1214, 1215, 1209, 1210, 325, 130, 144, 939, 286, 682, 1216, 1211, 108, 269, -32766, 798, 807, -32766, 662, 639, 1191, 657, 71, 675, 1075, 316, 319, -32766, -32766, -32766, 1305, -32766, 300, -32766, 628, -32766, 430, 543, -32766, -32766, 923, 555, 924, -32766, -32766, -32766, 1229, 549, -32766, -32766, -32766, -4, 891, -490, 1191, -32766, 410, 644, 893, 298, 682, -32766, -32766, -32766, -32766, -32766, 893, -32766, 682, -32766, 13, 1231, -32766, 451, 479, 645, 909, -32766, -32766, -32766, -32766, 658, -480, -32766, -32766, 0, 1191, 0, 0, -32766, 410, 0, 297, -32766, -32766, -32766, 304, -32766, -32766, -32766, 0, -32766, 0, 806, -32766, 0, 0, 0, 474, -32766, -32766, -32766, -32766, 0, 7, -32766, -32766, 15, 1191, 561, 596, -32766, 410, 1219, 891, -32766, -32766, -32766, 361, -32766, -32766, -32766, 818, -32766, -267, 881, -32766, 38, 292, 0, 0, -32766, -32766, -32766, 39, 705, 706, -32766, -32766, 872, 963, 940, 947, -32766, 410, 937, 948, 364, 870, 426, 891, 935, -32766, 1049, 290, 1244, 1052, 1053, -111, -111, 1050, 1051, 1057, -560, 1262, 1296, 633, 0, 826, -111, -111, -111, -111, 32, 314, -32766, 360, 683, 686, 690, 692, 1191, 693, 694, 695, 699, 685, 319, -32766, -32766, -32766, 9, -32766, 702, -32766, 868, -32766, 881, 1300, -32766, 893, 1302, 682, -4, -32766, -32766, -32766, 829, 828, 837, -32766, -32766, 916, -242, -242, -242, -32766, 410, 955, 364, 26, 836, 1301, 915, 917, -32766, 914, 1177, 900, 910, -111, -111, 807, 881, 898, 945, 1222, 946, 1299, 1256, 867, -111, -111, -111, -111, 1245, 1263, 1269, 1272, -241, -241, -241, -558, -532, -531, 364, -530, 1, 27, 28, 37, 41, 45, 70, 0, 74, -111, -111, 75, 76, 77, 78, 893, 79, 682, -242, 867, -111, -111, -111, -111, 141, 151, 155, 244, 321, 346, 514, 347, 1212, 1213, 1214, 1215, 1209, 1210, 348, 349, 350, 351, 352, 353, 1216, 1211, 354, 355, 356, 358, 427, 893, -265, 682, -241, -264, 71, 0, 17, 316, 319, 18, 19, 20, 22, 397, 470, 471, 478, 481, 482, 483, 484, 488, 489, 490, 498, 669, 1202, 1145, 1220, 1019, 1018, 1181, -269, -103, 16, 21, 25, 289, 396, 589, 593, 620, 674, 1149, 1197, 1146, 1275, 0, -494, 1162, 0, 1223); - protected $actionCheck = array(2, 3, 4, 5, 6, 7, 0, 9, 10, 11, 12, 13, 106, 1, 108, 31, 9, 10, 11, 44, 45, 46, 47, 48, 49, 50, 51, 52, 116, 117, 118, 119, 120, 121, 122, 37, 38, 30, 116, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 117, 118, 9, 10, 57, 9, 10, 11, 137, 138, 155, 128, 129, 130, 131, 106, 107, 8, 71, 72, 73, 74, 75, 76, 77, 116, 30, 80, 32, 33, 34, 35, 36, 1, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 30, 80, 136, 137, 138, 139, 140, 141, 142, 143, 144, 51, 1, 161, 101, 80, 150, 151, 152, 8, 154, 9, 10, 11, 2, 3, 4, 5, 6, 7, 164, 9, 10, 11, 12, 13, 123, 9, 10, 11, 80, 161, 30, 83, 32, 33, 34, 35, 36, 37, 38, 116, 117, 118, 119, 120, 121, 122, 30, 37, 38, 106, 107, 1, 9, 10, 11, 1, 53, 54, 55, 116, 57, 1, 8, 14, 155, 156, 157, 57, 9, 10, 11, 162, 69, 30, 116, 32, 33, 119, 120, 121, 122, 71, 72, 73, 74, 75, 76, 77, 8, 30, 80, 32, 33, 34, 35, 137, 138, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 84, 70, 136, 137, 138, 139, 140, 141, 142, 143, 144, 9, 9, 10, 11, 160, 150, 151, 152, 164, 154, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11, 12, 13, 30, 8, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 116, 57, 14, 9, 10, 11, 134, 135, 161, 8, 164, 160, 1, 69, 167, 164, 159, 57, 161, 80, 8, 137, 138, 1, 30, 1, 32, 33, 34, 1, 14, 71, 72, 73, 74, 75, 76, 77, 31, 1, 80, 30, 70, 30, 9, 10, 11, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 8, 156, 136, 137, 138, 139, 140, 141, 142, 143, 144, 8, 134, 135, 8, 8, 150, 151, 152, 2, 3, 4, 5, 6, 7, 97, 82, 149, 31, 12, 13, 101, 15, 116, 8, 116, 106, 80, 108, 161, 85, 163, 106, 113, 108, 8, 116, 117, 118, 119, 120, 121, 122, 123, 137, 138, 137, 138, 14, 9, 10, 11, 80, 82, 14, 8, 85, 50, 51, 50, 51, 52, 128, 56, 1, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 70, 70, 71, 72, 73, 74, 162, 159, 97, 78, 79, 80, 116, 82, 1, 146, 158, 86, 87, 88, 89, 163, 91, 31, 93, 167, 95, 156, 14, 98, 99, 35, 161, 37, 103, 104, 105, 106, 107, 1, 109, 110, 147, 148, 31, 160, 115, 116, 8, 164, 1, 155, 156, 157, 70, 124, 125, 126, 8, 70, 1, 70, 37, 38, 134, 135, 8, 136, 137, 82, 139, 140, 141, 142, 143, 144, 145, 8, 35, 149, 37, 164, 151, 152, 164, 164, 155, 156, 157, 158, 1, 161, 8, 163, 163, 82, 165, 166, 167, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 75, 76, 77, 75, 76, 134, 135, 31, 8, 84, 134, 135, 134, 135, 1, 90, 8, 92, 82, 94, 149, 96, 37, 38, 8, 149, 80, 149, 128, 59, 60, 106, 161, 8, 1, 161, 8, 161, 159, 161, 70, 167, 117, 118, 31, 8, 106, 70, 108, 106, 14, 108, 127, 128, 129, 130, 131, 70, 158, 74, 84, 75, 76, 163, 31, 80, 159, 167, 161, 101, 102, 14, 87, 88, 89, 14, 91, 31, 93, 16, 95, 37, 38, 98, 159, 1, 161, 162, 103, 104, 105, 37, 38, 1, 109, 110, 16, 84, 16, 163, 115, 116, 16, 167, 134, 135, 16, 161, 31, 124, 16, 134, 135, 167, 70, 31, 16, 84, 16, 149, 16, 134, 135, 31, 106, 107, 82, 31, 74, 31, 86, 161, 106, 107, 80, 159, 31, 161, 161, 154, 31, 87, 88, 89, 31, 91, 31, 93, 161, 95, 111, 112, 98, 31, 31, 31, 31, 103, 104, 105, 31, 31, 31, 109, 110, 31, 31, 31, 84, 115, 116, 31, 159, 31, 161, 37, 84, 38, 124, 35, 136, 137, 35, 139, 140, 141, 142, 143, 144, 35, 31, 70, 159, 37, 161, 151, 152, 69, 57, 74, 80, 82, 85, 77, 90, 80, 94, 163, 92, 82, 166, 167, 87, 88, 89, 83, 91, 114, 93, 113, 95, 128, 85, 98, 116, 128, 153, 128, 103, 104, 105, 146, 89, 74, 109, 110, 0, 1, 149, 80, 115, 116, 96, 159, 133, 161, 87, 88, 89, 124, 91, 159, 93, 161, 95, 97, 146, 98, 97, 97, 100, 154, 103, 104, 105, 74, 100, 149, 109, 110, -1, 80, -1, -1, 115, 116, -1, 132, 87, 88, 89, 132, 91, 124, 93, -1, 95, -1, 155, 98, -1, -1, -1, 102, 103, 104, 105, 74, -1, 149, 109, 110, 149, 80, 81, 153, 115, 116, 160, 1, 87, 88, 89, 149, 91, 124, 93, 160, 95, 164, 84, 98, 159, 158, -1, -1, 103, 104, 105, 159, 159, 159, 109, 110, 159, 159, 159, 159, 115, 116, 159, 159, 106, 159, 108, 1, 159, 124, 159, 113, 160, 159, 159, 117, 118, 159, 159, 159, 163, 160, 160, 160, -1, 127, 128, 129, 130, 131, 161, 161, 74, 161, 161, 161, 161, 161, 80, 161, 161, 161, 161, 161, 167, 87, 88, 89, 150, 91, 162, 93, 162, 95, 84, 162, 98, 159, 162, 161, 162, 103, 104, 105, 162, 162, 162, 109, 110, 162, 100, 101, 102, 115, 116, 162, 106, 70, 162, 162, 162, 162, 124, 162, 162, 162, 162, 117, 118, 82, 84, 162, 162, 86, 162, 162, 162, 127, 128, 129, 130, 131, 162, 162, 162, 162, 100, 101, 102, 163, 163, 163, 106, 163, 163, 163, 163, 163, 163, 163, 163, -1, 163, 117, 118, 163, 163, 163, 163, 159, 163, 161, 162, 127, 128, 129, 130, 131, 163, 163, 163, 163, 163, 163, 137, 163, 139, 140, 141, 142, 143, 144, 163, 163, 163, 163, 163, 163, 151, 152, 163, 163, 163, 163, 163, 159, 164, 161, 162, 164, 163, -1, 164, 166, 167, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, -1, 165, 165, -1, 166); - protected $actionBase = array(0, -2, 154, 565, 876, 948, 984, 514, 53, 398, 837, 307, 307, 67, 307, 307, 653, 724, 724, 732, 724, 616, 673, 204, 204, 204, 625, 625, 625, 625, 694, 694, 831, 831, 863, 799, 765, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 375, 519, 369, 701, 1017, 1023, 1019, 1024, 1015, 1014, 1018, 1020, 1025, 911, 912, 782, 918, 919, 920, 921, 1021, 841, 1016, 1022, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 290, 491, 44, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 160, 160, 160, 187, 684, 684, 341, 203, 610, 47, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 144, 144, 7, 7, 7, 7, 7, 371, -25, -25, -25, -25, 540, 385, 102, 576, 358, 45, 377, 460, 460, 360, 231, 231, 231, 231, 231, 231, -78, -78, -78, -78, -78, -66, 319, 457, -94, 396, 423, 586, 586, 586, 586, 423, 423, 423, 423, 750, 1029, 423, 423, 423, 511, 516, 516, 518, 147, 147, 147, 516, 583, 777, 422, 583, 422, 194, 92, 748, -40, 87, 412, 748, 617, 627, 198, 143, 773, 658, 773, 1013, 757, 764, 717, 838, 860, 1026, 800, 908, 806, 910, 219, 686, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 855, 552, 1013, 286, 855, 855, 855, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 679, 286, 568, 626, 286, 794, 552, 375, 758, 375, 375, 375, 375, 958, 375, 375, 375, 375, 375, 375, 970, 769, -16, 375, 519, 12, 12, 547, 83, 12, 12, 12, 12, 375, 375, 375, 658, 781, 713, 666, 792, 448, 781, 781, 781, 438, 444, 193, 447, 570, 523, 580, 760, 760, 767, 929, 929, 760, 759, 760, 767, 934, 760, 929, 805, 359, 648, 577, 611, 656, 929, 478, 760, 760, 760, 760, 665, 760, 467, 433, 760, 760, 785, 774, 789, 60, 929, 929, 929, 789, 596, 751, 751, 751, 811, 812, 746, 771, 567, 498, 677, 348, 779, 771, 771, 760, 640, 746, 771, 746, 771, 747, 771, 771, 771, 746, 771, 760, 759, 585, 771, 734, 668, 224, 771, 6, 935, 937, 354, 940, 932, 941, 979, 942, 943, 851, 956, 933, 945, 931, 930, 780, 703, 720, 790, 729, 928, 768, 768, 768, 925, 768, 768, 768, 768, 768, 768, 768, 768, 703, 788, 804, 733, 783, 960, 722, 726, 725, 868, 1027, 1028, 737, 739, 958, 1006, 953, 803, 730, 992, 967, 866, 848, 968, 969, 993, 1007, 1008, 871, 761, 874, 880, 797, 971, 852, 768, 935, 943, 933, 945, 931, 930, 763, 762, 753, 755, 749, 745, 736, 738, 770, 1009, 924, 835, 830, 970, 926, 703, 839, 986, 847, 994, 995, 850, 801, 772, 840, 881, 972, 975, 976, 853, 1010, 810, 989, 795, 996, 802, 882, 997, 998, 999, 1000, 885, 854, 856, 857, 815, 754, 980, 786, 891, 335, 787, 796, 978, 363, 957, 858, 894, 895, 1001, 1002, 1003, 896, 954, 816, 990, 752, 991, 983, 817, 818, 485, 784, 778, 541, 676, 897, 899, 900, 955, 775, 766, 821, 822, 1011, 901, 697, 824, 740, 902, 1005, 742, 744, 756, 859, 793, 743, 798, 977, 776, 827, 907, 829, 832, 833, 1004, 836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 458, 458, 458, 458, 458, 458, 307, 307, 307, 307, 0, 0, 307, 0, 0, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 423, 423, 291, 291, 0, 291, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 291, 291, 291, 291, 291, 291, 291, 805, 147, 147, 147, 147, 423, 423, 423, 423, 423, -88, -88, 147, 147, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 0, 0, 0, 286, 422, 0, 759, 759, 759, 759, 0, 0, 0, 0, 422, 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, 422, 0, 286, 0, 759, 759, 423, 805, 805, 314, 423, 0, 0, 0, 0, 286, 759, 286, 552, 422, 552, 552, 12, 375, 314, 608, 608, 608, 608, 0, 658, 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, 805, 759, 0, 805, 0, 759, 759, 759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 759, 0, 0, 929, 0, 0, 0, 0, 760, 0, 0, 0, 0, 0, 0, 760, 934, 0, 0, 0, 0, 0, 0, 759, 0, 0, 0, 0, 0, 0, 0, 0, 768, 801, 0, 801, 0, 768, 768, 768); - protected $actionDefault = array(3, 32767, 103, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 101, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 578, 578, 578, 578, 32767, 32767, 246, 103, 32767, 32767, 454, 372, 372, 372, 32767, 32767, 522, 522, 522, 522, 522, 522, 32767, 32767, 32767, 32767, 32767, 32767, 454, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 101, 32767, 32767, 32767, 37, 7, 8, 10, 11, 50, 17, 310, 32767, 32767, 32767, 32767, 103, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 571, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 458, 437, 438, 440, 441, 371, 523, 577, 313, 574, 370, 146, 325, 315, 234, 316, 250, 459, 251, 460, 463, 464, 211, 279, 367, 150, 401, 455, 403, 453, 457, 402, 377, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 375, 376, 456, 434, 433, 432, 399, 32767, 32767, 400, 404, 374, 407, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 103, 32767, 405, 406, 423, 424, 421, 422, 425, 32767, 426, 427, 428, 429, 32767, 32767, 302, 32767, 32767, 351, 349, 414, 415, 302, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 516, 431, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 103, 32767, 101, 518, 396, 398, 486, 409, 410, 408, 378, 32767, 493, 32767, 103, 495, 32767, 32767, 32767, 112, 32767, 32767, 32767, 517, 32767, 524, 524, 32767, 479, 101, 194, 32767, 194, 194, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 585, 479, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 32767, 194, 111, 32767, 32767, 32767, 101, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 189, 32767, 260, 262, 103, 539, 194, 32767, 498, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 491, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 479, 419, 139, 32767, 139, 524, 411, 412, 413, 481, 524, 524, 524, 298, 281, 32767, 32767, 32767, 32767, 496, 496, 101, 101, 101, 101, 491, 32767, 32767, 112, 100, 100, 100, 100, 100, 104, 102, 32767, 32767, 32767, 32767, 100, 32767, 102, 102, 32767, 32767, 217, 208, 215, 102, 32767, 543, 544, 215, 102, 219, 219, 219, 239, 239, 470, 304, 102, 100, 102, 102, 196, 304, 304, 32767, 102, 470, 304, 470, 304, 198, 304, 304, 304, 470, 304, 32767, 32767, 102, 304, 210, 100, 100, 304, 32767, 32767, 32767, 481, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 511, 32767, 528, 541, 417, 418, 420, 526, 442, 443, 444, 445, 446, 447, 448, 450, 573, 32767, 485, 32767, 32767, 32767, 32767, 324, 583, 32767, 583, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 584, 32767, 524, 32767, 32767, 32767, 32767, 416, 9, 76, 43, 44, 52, 58, 502, 503, 504, 505, 499, 500, 506, 501, 32767, 32767, 507, 549, 32767, 32767, 525, 576, 32767, 32767, 32767, 32767, 32767, 32767, 139, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 511, 32767, 137, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 524, 32767, 32767, 32767, 300, 301, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 524, 32767, 32767, 32767, 283, 284, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 278, 32767, 32767, 366, 32767, 32767, 32767, 32767, 345, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 152, 152, 3, 3, 327, 152, 152, 152, 327, 152, 327, 327, 327, 152, 152, 152, 152, 152, 152, 272, 184, 254, 257, 239, 239, 152, 337, 152); - protected $goto = array(193, 193, 670, 421, 643, 1022, 1290, 1290, 824, 415, 307, 308, 328, 563, 313, 420, 329, 422, 622, 801, 678, 341, 586, 1290, 825, 164, 164, 164, 164, 217, 194, 190, 190, 174, 176, 212, 190, 190, 190, 190, 190, 191, 191, 191, 191, 191, 191, 185, 186, 187, 188, 189, 214, 212, 215, 521, 522, 411, 523, 525, 526, 527, 528, 529, 530, 531, 532, 1091, 165, 166, 167, 192, 168, 169, 170, 163, 171, 172, 173, 175, 211, 213, 216, 234, 237, 240, 241, 243, 254, 255, 256, 257, 258, 259, 260, 262, 263, 264, 265, 273, 274, 310, 311, 312, 416, 417, 418, 568, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 177, 233, 178, 195, 196, 197, 235, 185, 186, 187, 188, 189, 214, 1091, 198, 179, 180, 181, 199, 195, 182, 236, 200, 198, 162, 201, 202, 183, 203, 204, 205, 184, 206, 207, 208, 209, 210, 322, 322, 322, 322, 827, 608, 608, 858, 547, 538, 1186, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1239, 1239, 462, 1264, 1265, 799, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 387, 538, 547, 556, 557, 394, 566, 588, 602, 603, 832, 938, 880, 875, 876, 889, 14, 833, 877, 830, 878, 879, 831, 453, 453, 884, 883, 885, 1187, 250, 250, 560, 453, 1237, 1237, 815, 1043, 1039, 1040, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 820, 820, 1188, 1247, 1248, 247, 247, 247, 247, 249, 251, 342, 343, 339, 1190, 1190, 997, 1190, 997, 1279, 930, 401, 677, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 1261, 1261, 414, 1261, 597, 1190, 287, 287, 287, 287, 1190, 1190, 1190, 1190, 959, 344, 1190, 1190, 1190, 1271, 1271, 1271, 1271, 606, 640, 344, 344, 1273, 1273, 1273, 1273, 1063, 1064, 637, 896, 651, 652, 653, 897, 344, 344, 383, 344, 486, 1306, 487, 535, 535, 5, 535, 6, 494, 559, 1257, 1140, 540, 524, 524, 344, 318, 302, 642, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 444, 1266, 1267, 618, 619, 932, 932, 932, 932, 820, 428, 444, 926, 933, 330, 533, 533, 533, 533, 1030, 590, 817, 554, 1259, 1259, 1030, 704, 621, 623, 845, 641, 1250, 805, 393, 660, 664, 973, 668, 676, 969, 1183, 553, 842, 823, 1289, 1289, 564, 600, 601, 385, 389, 548, 587, 591, 663, 962, 936, 936, 934, 936, 703, 1289, 537, 971, 966, 438, 901, 1079, 981, 1028, 438, 438, 805, 605, 805, 707, 854, 1292, 978, 463, 539, 551, 1074, 467, 540, 539, 844, 551, 646, 957, 386, 1171, 912, 1032, 838, 1172, 1175, 913, 1176, 943, 567, 456, 457, 458, 0, 850, 0, 1182, 1297, 1298, 253, 253, 0, 399, 400, 0, 0, 0, 649, 0, 650, 423, 403, 404, 405, 840, 661, 0, 423, 0, 406, 0, 0, 848, 337, 1009, 1002, 1006, 1003, 1007, 852, 0, 0, 839, 1185, 495, 0, 0, 0, 0, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 0, 0, 438, 595, 609, 612, 613, 614, 615, 634, 635, 636, 680, 853, 841, 1027, 1031, 585, 1056, 0, 681, 667, 667, 941, 673, 1054, 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, 536, 536, 919, 992, 1000, 1004, 1001, 1005, 0, 0, 931, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 976, 976, 0, 1072, 857); - protected $gotoCheck = array(42, 42, 72, 65, 65, 119, 173, 173, 26, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 7, 9, 93, 122, 173, 27, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 23, 23, 23, 23, 15, 104, 104, 45, 75, 75, 20, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 160, 160, 166, 166, 166, 6, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 15, 49, 15, 15, 15, 15, 75, 15, 15, 15, 15, 15, 15, 141, 141, 64, 15, 64, 20, 5, 5, 162, 141, 161, 161, 20, 15, 15, 15, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 22, 22, 20, 20, 20, 5, 5, 5, 5, 5, 5, 93, 93, 169, 72, 72, 72, 72, 72, 171, 89, 89, 89, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 122, 122, 13, 122, 13, 72, 24, 24, 24, 24, 72, 72, 72, 72, 99, 14, 72, 72, 72, 9, 9, 9, 9, 55, 55, 14, 14, 122, 122, 122, 122, 136, 136, 84, 72, 84, 84, 84, 72, 14, 14, 61, 14, 147, 14, 147, 19, 19, 46, 19, 46, 147, 100, 122, 143, 14, 163, 163, 14, 159, 159, 63, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 19, 168, 168, 83, 83, 19, 19, 19, 19, 22, 109, 19, 19, 19, 29, 103, 103, 103, 103, 122, 103, 18, 48, 122, 122, 122, 48, 48, 48, 39, 48, 14, 12, 28, 48, 48, 48, 48, 48, 48, 152, 9, 37, 25, 172, 172, 2, 2, 9, 58, 58, 58, 58, 58, 14, 25, 25, 25, 25, 25, 25, 172, 25, 25, 25, 23, 17, 17, 106, 121, 23, 23, 12, 17, 12, 95, 41, 172, 17, 149, 9, 9, 139, 82, 14, 9, 17, 9, 17, 17, 9, 78, 78, 124, 17, 78, 78, 78, 78, 92, 9, 9, 9, 9, -1, 9, -1, 17, 9, 9, 5, 5, -1, 80, 80, -1, -1, -1, 80, -1, 80, 113, 80, 80, 80, 35, 80, -1, 113, -1, 80, -1, -1, 9, 80, 113, 113, 113, 113, 113, 35, -1, -1, 35, 14, 9, -1, -1, -1, -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, 23, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 16, 16, 16, 16, 8, 8, -1, 8, 8, 8, 16, 8, 8, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, 24, 24, 87, 87, 87, 87, 87, 87, -1, -1, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 103, -1, 16, 16); - protected $gotoBase = array(0, 0, -285, 0, 0, 225, 173, 10, 524, 7, 0, 0, 95, -47, 5, -174, 87, -33, 71, 61, -212, 0, -76, 157, 284, 392, 4, 20, 56, 77, 0, 0, 0, 0, 0, 118, 0, 63, 0, 65, 0, -2, -1, 0, 0, 155, -378, 0, -308, 186, 0, 0, 0, 0, 0, 266, 0, 0, 359, 0, 0, 282, 0, 103, 204, -235, 0, 0, 0, 0, 0, 0, -6, 0, 0, -167, 0, 0, 45, 170, -11, 0, -27, -110, -376, 0, 0, 276, 0, -32, 0, 0, 19, -448, 0, 30, 0, 0, 0, 262, 292, 0, 0, 342, -73, 0, 62, 0, 0, 88, 0, 0, 0, 206, 0, 0, 0, 0, 0, 3, 0, 59, 15, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 1, 0, 188, 0, 66, 0, 0, 0, -157, 0, 2, 0, 0, 35, 0, 0, 0, 0, 0, 0, 25, -57, -8, 201, 99, 0, 0, -111, 0, -7, 231, 0, 236, 96, -295, 0, 0); - protected $gotoDefault = array(-32768, 499, 711, 4, 712, 905, 788, 797, 583, 515, 679, 338, 610, 412, 1255, 882, 1078, 565, 816, 1199, 1207, 445, 819, 323, 701, 864, 865, 866, 390, 375, 381, 388, 632, 611, 480, 851, 441, 843, 472, 846, 440, 855, 161, 409, 497, 859, 3, 861, 542, 892, 376, 869, 377, 656, 871, 550, 873, 874, 384, 391, 392, 1083, 558, 607, 886, 242, 552, 887, 374, 888, 895, 379, 382, 665, 452, 492, 485, 402, 1058, 594, 629, 449, 466, 617, 616, 604, 465, 424, 407, 928, 473, 450, 942, 340, 950, 709, 1090, 624, 475, 958, 625, 965, 968, 516, 517, 464, 980, 268, 983, 476, 1015, 647, 648, 995, 626, 627, 1013, 459, 584, 1021, 442, 1029, 1243, 443, 1033, 261, 1036, 275, 408, 425, 1041, 1042, 8, 1048, 671, 672, 10, 272, 496, 1073, 666, 439, 1089, 429, 1159, 1161, 544, 477, 1179, 1178, 659, 493, 1184, 1246, 437, 518, 460, 309, 519, 301, 326, 306, 534, 288, 327, 520, 461, 1252, 1260, 324, 29, 1280, 1291, 334, 562, 599); - protected $ruleToNonTerminal = array(0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 21, 21, 22, 23, 23, 24, 24, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 30, 30, 32, 34, 34, 28, 36, 36, 33, 38, 38, 35, 35, 37, 37, 39, 39, 31, 40, 40, 41, 43, 44, 44, 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 25, 25, 68, 68, 71, 71, 70, 69, 69, 62, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 26, 26, 27, 27, 27, 27, 86, 86, 88, 88, 81, 81, 81, 82, 82, 85, 85, 83, 83, 89, 90, 90, 56, 56, 64, 64, 67, 67, 67, 66, 91, 91, 92, 57, 57, 57, 57, 93, 93, 94, 94, 95, 95, 96, 97, 97, 98, 98, 99, 99, 54, 54, 50, 50, 101, 52, 52, 102, 51, 51, 53, 53, 63, 63, 63, 63, 79, 79, 105, 105, 107, 107, 108, 108, 108, 108, 106, 106, 106, 110, 110, 110, 110, 87, 87, 113, 113, 113, 111, 111, 114, 114, 112, 112, 115, 115, 116, 116, 116, 116, 109, 109, 80, 80, 80, 20, 20, 20, 118, 117, 117, 119, 119, 119, 119, 59, 120, 120, 121, 60, 123, 123, 124, 124, 125, 125, 84, 126, 126, 126, 126, 126, 126, 131, 131, 132, 132, 133, 133, 133, 133, 133, 134, 135, 135, 130, 130, 127, 127, 129, 129, 137, 137, 136, 136, 136, 136, 136, 136, 136, 128, 138, 138, 140, 139, 139, 61, 100, 141, 141, 55, 55, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 148, 142, 142, 147, 147, 150, 151, 151, 152, 153, 153, 153, 19, 19, 72, 72, 72, 72, 143, 143, 143, 143, 155, 155, 144, 144, 146, 146, 146, 149, 149, 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 161, 104, 163, 163, 163, 163, 145, 145, 145, 145, 145, 145, 145, 145, 58, 58, 158, 158, 158, 158, 164, 164, 154, 154, 154, 165, 165, 165, 165, 165, 165, 73, 73, 65, 65, 65, 65, 122, 122, 122, 122, 168, 167, 157, 157, 157, 157, 157, 157, 157, 156, 156, 156, 166, 166, 166, 166, 103, 162, 170, 170, 169, 169, 171, 171, 171, 171, 171, 171, 171, 171, 159, 159, 159, 159, 173, 174, 172, 172, 172, 172, 172, 172, 172, 172, 175, 175, 175, 175); - protected $ruleToLength = array(1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 2, 1, 3, 4, 1, 2, 0, 1, 1, 1, 1, 1, 3, 5, 4, 3, 4, 2, 3, 1, 1, 7, 6, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, 3, 1, 2, 2, 3, 1, 3, 2, 3, 1, 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, 2, 1, 1, 1, 0, 2, 1, 3, 8, 0, 4, 2, 1, 3, 0, 1, 0, 1, 0, 1, 3, 1, 8, 9, 8, 7, 6, 8, 0, 2, 0, 2, 1, 2, 2, 0, 2, 0, 2, 0, 2, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 2, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 7, 0, 2, 1, 3, 3, 4, 1, 4, 0, 2, 5, 0, 2, 6, 0, 2, 0, 3, 1, 2, 1, 1, 2, 0, 1, 3, 0, 2, 1, 1, 1, 1, 6, 8, 6, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 1, 2, 1, 1, 0, 1, 0, 2, 2, 2, 4, 3, 1, 1, 3, 1, 2, 2, 3, 2, 3, 1, 1, 2, 3, 1, 1, 3, 2, 0, 1, 5, 5, 10, 3, 5, 1, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 3, 2, 2, 3, 1, 0, 1, 1, 3, 3, 3, 4, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 3, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 2, 1, 2, 4, 2, 2, 8, 9, 8, 9, 9, 10, 9, 10, 8, 3, 2, 0, 4, 2, 1, 3, 2, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 0, 3, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 4, 1, 1, 3, 1, 1, 1, 1, 1, 3, 2, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 4, 4, 1, 4, 4, 0, 1, 1, 1, 3, 3, 1, 4, 2, 2, 1, 3, 1, 4, 4, 3, 3, 3, 3, 1, 3, 1, 1, 3, 1, 1, 4, 1, 1, 1, 3, 1, 1, 2, 1, 3, 4, 3, 2, 0, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 3, 6, 3, 1, 1, 2, 1); - protected function initReduceCallbacks() - { - $this->reduceCallbacks = [0 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 1 => function ($stackPos) { - $this->semValue = $this->handleNamespaces($this->semStack[$stackPos - (1 - 1)]); - }, 2 => function ($stackPos) { - if (\is_array($this->semStack[$stackPos - (2 - 2)])) { - $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); - } else { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - } - }, 3 => function ($stackPos) { - $this->semValue = array(); - }, 4 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; - if (isset($startAttributes['comments'])) { - $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); - } else { - $nop = null; - } - if ($nop !== null) { - $this->semStack[$stackPos - (1 - 1)][] = $nop; - } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 5 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 6 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 7 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 8 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 9 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 10 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 11 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 12 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 13 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 14 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 15 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 16 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 17 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 18 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 19 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 20 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 21 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 22 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 23 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 24 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 25 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 26 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 27 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 28 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 29 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 30 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 31 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 32 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 33 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 34 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 35 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 36 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 37 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 38 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 39 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 40 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 41 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 42 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 43 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 44 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 45 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 46 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 47 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 48 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 49 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 50 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 51 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 52 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 53 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 54 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 55 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 56 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 57 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 58 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 59 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 60 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 61 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 62 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 63 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 64 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 65 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 66 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 67 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 68 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 69 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 70 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 71 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 72 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 73 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 74 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 75 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 76 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 77 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 78 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 79 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 80 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 81 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 82 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 83 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 84 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 85 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 86 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 87 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 88 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 89 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 90 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 91 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 92 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 93 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 94 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 95 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 96 => function ($stackPos) { - $this->semValue = new Name(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 97 => function ($stackPos) { - $this->semValue = new Expr\Variable(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 98 => function ($stackPos) { - /* nothing */ - }, 99 => function ($stackPos) { - /* nothing */ - }, 100 => function ($stackPos) { - /* nothing */ - }, 101 => function ($stackPos) { - $this->emitError(new Error('A trailing comma is not allowed here', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes)); - }, 102 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 103 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 104 => function ($stackPos) { - $this->semValue = new Node\Attribute($this->semStack[$stackPos - (1 - 1)], [], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 105 => function ($stackPos) { - $this->semValue = new Node\Attribute($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 106 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 107 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 108 => function ($stackPos) { - $this->semValue = new Node\AttributeGroup($this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 109 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 110 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 111 => function ($stackPos) { - $this->semValue = []; - }, 112 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 113 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 114 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 115 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 116 => function ($stackPos) { - $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 117 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (3 - 2)], null, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); - $this->checkNamespace($this->semValue); - }, 118 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, 119 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, 120 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (3 - 2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 121 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 122 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 123 => function ($stackPos) { - $this->semValue = new Stmt\Const_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 124 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_FUNCTION; - }, 125 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_CONSTANT; - }, 126 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 6)], $this->semStack[$stackPos - (7 - 2)], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 127 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 128 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 129 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 130 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 131 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 132 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 133 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 134 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 135 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 136 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 137 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); - }, 138 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); - }, 139 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); - }, 140 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); - }, 141 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - $this->semValue->type = Stmt\Use_::TYPE_NORMAL; - }, 142 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue->type = $this->semStack[$stackPos - (2 - 1)]; - }, 143 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 144 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 145 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 146 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 147 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 148 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 149 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 150 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 151 => function ($stackPos) { - if (\is_array($this->semStack[$stackPos - (2 - 2)])) { - $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); - } else { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - } - }, 152 => function ($stackPos) { - $this->semValue = array(); - }, 153 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; - if (isset($startAttributes['comments'])) { - $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); - } else { - $nop = null; - } - if ($nop !== null) { - $this->semStack[$stackPos - (1 - 1)][] = $nop; - } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 154 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 155 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 156 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 157 => function ($stackPos) { - throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 158 => function ($stackPos) { - if ($this->semStack[$stackPos - (3 - 2)]) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - $attrs = $this->startAttributeStack[$stackPos - (3 - 1)]; - $stmts = $this->semValue; - if (!empty($attrs['comments'])) { - $stmts[0]->setAttribute('comments', \array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); - } - } else { - $startAttributes = $this->startAttributeStack[$stackPos - (3 - 1)]; - if (isset($startAttributes['comments'])) { - $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); - } else { - $this->semValue = null; - } - if (null === $this->semValue) { - $this->semValue = array(); - } - } - }, 159 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos - (7 - 3)], ['stmts' => \is_array($this->semStack[$stackPos - (7 - 5)]) ? $this->semStack[$stackPos - (7 - 5)] : array($this->semStack[$stackPos - (7 - 5)]), 'elseifs' => $this->semStack[$stackPos - (7 - 6)], 'else' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 160 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos - (10 - 3)], ['stmts' => $this->semStack[$stackPos - (10 - 6)], 'elseifs' => $this->semStack[$stackPos - (10 - 7)], 'else' => $this->semStack[$stackPos - (10 - 8)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); - }, 161 => function ($stackPos) { - $this->semValue = new Stmt\While_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 162 => function ($stackPos) { - $this->semValue = new Stmt\Do_($this->semStack[$stackPos - (7 - 5)], \is_array($this->semStack[$stackPos - (7 - 2)]) ? $this->semStack[$stackPos - (7 - 2)] : array($this->semStack[$stackPos - (7 - 2)]), $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 163 => function ($stackPos) { - $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos - (9 - 3)], 'cond' => $this->semStack[$stackPos - (9 - 5)], 'loop' => $this->semStack[$stackPos - (9 - 7)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 164 => function ($stackPos) { - $this->semValue = new Stmt\Switch_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 165 => function ($stackPos) { - $this->semValue = new Stmt\Break_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 166 => function ($stackPos) { - $this->semValue = new Stmt\Continue_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 167 => function ($stackPos) { - $this->semValue = new Stmt\Return_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 168 => function ($stackPos) { - $this->semValue = new Stmt\Global_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 169 => function ($stackPos) { - $this->semValue = new Stmt\Static_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 170 => function ($stackPos) { - $this->semValue = new Stmt\Echo_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 171 => function ($stackPos) { - $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 172 => function ($stackPos) { - $e = $this->semStack[$stackPos - (2 - 1)]; - if ($e instanceof Expr\Throw_) { - // For backwards-compatibility reasons, convert throw in statement position into - // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). - $this->semValue = new Stmt\Throw_($e->expr, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - } else { - $this->semValue = new Stmt\Expression($e, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - } - }, 173 => function ($stackPos) { - $this->semValue = new Stmt\Unset_($this->semStack[$stackPos - (5 - 3)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 174 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos - (7 - 5)][1], 'stmts' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 175 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (9 - 3)], $this->semStack[$stackPos - (9 - 7)][0], ['keyVar' => $this->semStack[$stackPos - (9 - 5)], 'byRef' => $this->semStack[$stackPos - (9 - 7)][1], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 176 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (6 - 3)], new Expr\Error($this->startAttributeStack[$stackPos - (6 - 4)] + $this->endAttributeStack[$stackPos - (6 - 4)]), ['stmts' => $this->semStack[$stackPos - (6 - 6)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 177 => function ($stackPos) { - $this->semValue = new Stmt\Declare_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 178 => function ($stackPos) { - $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 5)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - $this->checkTryCatch($this->semValue); - }, 179 => function ($stackPos) { - $this->semValue = new Stmt\Goto_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 180 => function ($stackPos) { - $this->semValue = new Stmt\Label($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 181 => function ($stackPos) { - $this->semValue = array(); - /* means: no statement */ - }, 182 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 183 => function ($stackPos) { - $startAttributes = $this->startAttributeStack[$stackPos - (1 - 1)]; - if (isset($startAttributes['comments'])) { - $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); - } else { - $this->semValue = null; - } - if ($this->semValue === null) { - $this->semValue = array(); - } - /* means: no statement */ - }, 184 => function ($stackPos) { - $this->semValue = array(); - }, 185 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 186 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 187 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 188 => function ($stackPos) { - $this->semValue = new Stmt\Catch_($this->semStack[$stackPos - (8 - 3)], $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 7)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 189 => function ($stackPos) { - $this->semValue = null; - }, 190 => function ($stackPos) { - $this->semValue = new Stmt\Finally_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 191 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 192 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 193 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 194 => function ($stackPos) { - $this->semValue = \false; - }, 195 => function ($stackPos) { - $this->semValue = \true; - }, 196 => function ($stackPos) { - $this->semValue = \false; - }, 197 => function ($stackPos) { - $this->semValue = \true; - }, 198 => function ($stackPos) { - $this->semValue = \false; - }, 199 => function ($stackPos) { - $this->semValue = \true; - }, 200 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 201 => function ($stackPos) { - $this->semValue = []; - }, 202 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos - (8 - 3)], ['byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 5)], 'returnType' => $this->semStack[$stackPos - (8 - 7)], 'stmts' => $this->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 203 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos - (9 - 4)], ['byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 6)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => $this->semStack[$stackPos - (9 - 1)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 204 => function ($stackPos) { - $this->semValue = new Stmt\Class_($this->semStack[$stackPos - (8 - 3)], ['type' => $this->semStack[$stackPos - (8 - 2)], 'extends' => $this->semStack[$stackPos - (8 - 4)], 'implements' => $this->semStack[$stackPos - (8 - 5)], 'stmts' => $this->semStack[$stackPos - (8 - 7)], 'attrGroups' => $this->semStack[$stackPos - (8 - 1)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - $this->checkClass($this->semValue, $stackPos - (8 - 3)); - }, 205 => function ($stackPos) { - $this->semValue = new Stmt\Interface_($this->semStack[$stackPos - (7 - 3)], ['extends' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)], 'attrGroups' => $this->semStack[$stackPos - (7 - 1)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - $this->checkInterface($this->semValue, $stackPos - (7 - 3)); - }, 206 => function ($stackPos) { - $this->semValue = new Stmt\Trait_($this->semStack[$stackPos - (6 - 3)], ['stmts' => $this->semStack[$stackPos - (6 - 5)], 'attrGroups' => $this->semStack[$stackPos - (6 - 1)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 207 => function ($stackPos) { - $this->semValue = new Stmt\Enum_($this->semStack[$stackPos - (8 - 3)], ['scalarType' => $this->semStack[$stackPos - (8 - 4)], 'implements' => $this->semStack[$stackPos - (8 - 5)], 'stmts' => $this->semStack[$stackPos - (8 - 7)], 'attrGroups' => $this->semStack[$stackPos - (8 - 1)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - $this->checkEnum($this->semValue, $stackPos - (8 - 3)); - }, 208 => function ($stackPos) { - $this->semValue = null; - }, 209 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 210 => function ($stackPos) { - $this->semValue = null; - }, 211 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 212 => function ($stackPos) { - $this->semValue = 0; - }, 213 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, 214 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, 215 => function ($stackPos) { - $this->semValue = null; - }, 216 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 217 => function ($stackPos) { - $this->semValue = array(); - }, 218 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 219 => function ($stackPos) { - $this->semValue = array(); - }, 220 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 221 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 222 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 223 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 224 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 225 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 226 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 227 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 228 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 229 => function ($stackPos) { - $this->semValue = null; - }, 230 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 231 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 232 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 233 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 234 => function ($stackPos) { - $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 235 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 236 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 3)]; - }, 237 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 238 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (5 - 3)]; - }, 239 => function ($stackPos) { - $this->semValue = array(); - }, 240 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 241 => function ($stackPos) { - $this->semValue = new Stmt\Case_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 242 => function ($stackPos) { - $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 243 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 244 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 245 => function ($stackPos) { - $this->semValue = new Expr\Match_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 6)], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 246 => function ($stackPos) { - $this->semValue = []; - }, 247 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 248 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 249 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 250 => function ($stackPos) { - $this->semValue = new Node\MatchArm($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 251 => function ($stackPos) { - $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 252 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 253 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 254 => function ($stackPos) { - $this->semValue = array(); - }, 255 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 256 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (5 - 3)], \is_array($this->semStack[$stackPos - (5 - 5)]) ? $this->semStack[$stackPos - (5 - 5)] : array($this->semStack[$stackPos - (5 - 5)]), $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 257 => function ($stackPos) { - $this->semValue = array(); - }, 258 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 259 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 260 => function ($stackPos) { - $this->semValue = null; - }, 261 => function ($stackPos) { - $this->semValue = new Stmt\Else_(\is_array($this->semStack[$stackPos - (2 - 2)]) ? $this->semStack[$stackPos - (2 - 2)] : array($this->semStack[$stackPos - (2 - 2)]), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 262 => function ($stackPos) { - $this->semValue = null; - }, 263 => function ($stackPos) { - $this->semValue = new Stmt\Else_($this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 264 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); - }, 265 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (2 - 2)], \true); - }, 266 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); - }, 267 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); - }, 268 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 269 => function ($stackPos) { - $this->semValue = array(); - }, 270 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 271 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 272 => function ($stackPos) { - $this->semValue = 0; - }, 273 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); - $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; - }, 274 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; - }, 275 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; - }, 276 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; - }, 277 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; - }, 278 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos - (6 - 6)], null, $this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 1)]); - $this->checkParam($this->semValue); - }, 279 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos - (8 - 6)], $this->semStack[$stackPos - (8 - 8)], $this->semStack[$stackPos - (8 - 3)], $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 5)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (8 - 2)], $this->semStack[$stackPos - (8 - 1)]); - $this->checkParam($this->semValue); - }, 280 => function ($stackPos) { - $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes), null, $this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 1)]); - }, 281 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 282 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 283 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 284 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 285 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 286 => function ($stackPos) { - $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 287 => function ($stackPos) { - $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos - (1 - 1)]); - }, 288 => function ($stackPos) { - $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 289 => function ($stackPos) { - $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 290 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); - }, 291 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 292 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); - }, 293 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 294 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); - }, 295 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 296 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); - }, 297 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 298 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 299 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 300 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 301 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 302 => function ($stackPos) { - $this->semValue = null; - }, 303 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 304 => function ($stackPos) { - $this->semValue = null; - }, 305 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 306 => function ($stackPos) { - $this->semValue = null; - }, 307 => function ($stackPos) { - $this->semValue = array(); - }, 308 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 309 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 2)]); - }, 310 => function ($stackPos) { - $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 311 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 312 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 313 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (1 - 1)], \false, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 314 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \true, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 315 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \false, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 316 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (3 - 3)], \false, \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (3 - 1)]); - }, 317 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 318 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 319 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 320 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 321 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 322 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 323 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 324 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 325 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 326 => function ($stackPos) { - if ($this->semStack[$stackPos - (2 - 2)] !== null) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - } - }, 327 => function ($stackPos) { - $this->semValue = array(); - }, 328 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; - if (isset($startAttributes['comments'])) { - $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); - } else { - $nop = null; - } - if ($nop !== null) { - $this->semStack[$stackPos - (1 - 1)][] = $nop; - } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 329 => function ($stackPos) { - $this->semValue = new Stmt\Property($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 1)]); - $this->checkProperty($this->semValue, $stackPos - (5 - 2)); - }, 330 => function ($stackPos) { - $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos - (5 - 4)], $this->semStack[$stackPos - (5 - 2)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (5 - 1)]); - $this->checkClassConst($this->semValue, $stackPos - (5 - 2)); - }, 331 => function ($stackPos) { - $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos - (10 - 5)], ['type' => $this->semStack[$stackPos - (10 - 2)], 'byRef' => $this->semStack[$stackPos - (10 - 4)], 'params' => $this->semStack[$stackPos - (10 - 7)], 'returnType' => $this->semStack[$stackPos - (10 - 9)], 'stmts' => $this->semStack[$stackPos - (10 - 10)], 'attrGroups' => $this->semStack[$stackPos - (10 - 1)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); - $this->checkClassMethod($this->semValue, $stackPos - (10 - 2)); - }, 332 => function ($stackPos) { - $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 333 => function ($stackPos) { - $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->semStack[$stackPos - (5 - 1)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 334 => function ($stackPos) { - $this->semValue = null; - /* will be skipped */ - }, 335 => function ($stackPos) { - $this->semValue = array(); - }, 336 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 337 => function ($stackPos) { - $this->semValue = array(); - }, 338 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 339 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 340 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (5 - 1)][0], $this->semStack[$stackPos - (5 - 1)][1], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 341 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], null, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 342 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 343 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 344 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); - }, 345 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 346 => function ($stackPos) { - $this->semValue = array(null, $this->semStack[$stackPos - (1 - 1)]); - }, 347 => function ($stackPos) { - $this->semValue = null; - }, 348 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 349 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 350 => function ($stackPos) { - $this->semValue = 0; - }, 351 => function ($stackPos) { - $this->semValue = 0; - }, 352 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 353 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 354 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); - $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; - }, 355 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; - }, 356 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; - }, 357 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; - }, 358 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_STATIC; - }, 359 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, 360 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, 361 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; - }, 362 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 363 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 364 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 365 => function ($stackPos) { - $this->semValue = new Node\VarLikeIdentifier(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 366 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 367 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 368 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 369 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 370 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 371 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 372 => function ($stackPos) { - $this->semValue = array(); - }, 373 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 374 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 375 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 376 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 377 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 378 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 379 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 380 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 381 => function ($stackPos) { - $this->semValue = new Expr\Clone_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 382 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 383 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 384 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 385 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 386 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 387 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 388 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 389 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 390 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 391 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 392 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 393 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 394 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 395 => function ($stackPos) { - $this->semValue = new Expr\PostInc($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 396 => function ($stackPos) { - $this->semValue = new Expr\PreInc($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 397 => function ($stackPos) { - $this->semValue = new Expr\PostDec($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 398 => function ($stackPos) { - $this->semValue = new Expr\PreDec($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 399 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 400 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 401 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 402 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 403 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 404 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 405 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 406 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 407 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 408 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 409 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 410 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 411 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 412 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 413 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 414 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 415 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 416 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 417 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 418 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 419 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 420 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 421 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 422 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 423 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 424 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 425 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 426 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 427 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 428 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 429 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 430 => function ($stackPos) { - $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 431 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 432 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 433 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 434 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 435 => function ($stackPos) { - $this->semValue = new Expr\Isset_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 436 => function ($stackPos) { - $this->semValue = new Expr\Empty_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 437 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 438 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 439 => function ($stackPos) { - $this->semValue = new Expr\Eval_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 440 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 441 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 442 => function ($stackPos) { - $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 443 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; - $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos - (2 - 1)]); - $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos - (2 - 2)], $attrs); - }, 444 => function ($stackPos) { - $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 445 => function ($stackPos) { - $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 446 => function ($stackPos) { - $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 447 => function ($stackPos) { - $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 448 => function ($stackPos) { - $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 449 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; - $attrs['kind'] = \strtolower($this->semStack[$stackPos - (2 - 1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $this->semValue = new Expr\Exit_($this->semStack[$stackPos - (2 - 2)], $attrs); - }, 450 => function ($stackPos) { - $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 451 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 452 => function ($stackPos) { - $this->semValue = new Expr\ShellExec($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 453 => function ($stackPos) { - $this->semValue = new Expr\Print_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 454 => function ($stackPos) { - $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 455 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (2 - 2)], null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 456 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 457 => function ($stackPos) { - $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 458 => function ($stackPos) { - $this->semValue = new Expr\Throw_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 459 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => \false, 'byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 4)], 'returnType' => $this->semStack[$stackPos - (8 - 6)], 'expr' => $this->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 460 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => \true, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'returnType' => $this->semStack[$stackPos - (9 - 7)], 'expr' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 461 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 4)], 'uses' => $this->semStack[$stackPos - (8 - 6)], 'returnType' => $this->semStack[$stackPos - (8 - 7)], 'stmts' => $this->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 462 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'uses' => $this->semStack[$stackPos - (9 - 7)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 463 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => \false, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'returnType' => $this->semStack[$stackPos - (9 - 7)], 'expr' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => $this->semStack[$stackPos - (9 - 1)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 464 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => \true, 'byRef' => $this->semStack[$stackPos - (10 - 4)], 'params' => $this->semStack[$stackPos - (10 - 6)], 'returnType' => $this->semStack[$stackPos - (10 - 8)], 'expr' => $this->semStack[$stackPos - (10 - 10)], 'attrGroups' => $this->semStack[$stackPos - (10 - 1)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); - }, 465 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'uses' => $this->semStack[$stackPos - (9 - 7)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => $this->semStack[$stackPos - (9 - 1)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 466 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (10 - 4)], 'params' => $this->semStack[$stackPos - (10 - 6)], 'uses' => $this->semStack[$stackPos - (10 - 8)], 'returnType' => $this->semStack[$stackPos - (10 - 9)], 'stmts' => $this->semStack[$stackPos - (10 - 10)], 'attrGroups' => $this->semStack[$stackPos - (10 - 1)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); - }, 467 => function ($stackPos) { - $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos - (8 - 4)], 'implements' => $this->semStack[$stackPos - (8 - 5)], 'stmts' => $this->semStack[$stackPos - (8 - 7)], 'attrGroups' => $this->semStack[$stackPos - (8 - 1)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes), $this->semStack[$stackPos - (8 - 3)]); - $this->checkClass($this->semValue[0], -1); - }, 468 => function ($stackPos) { - $this->semValue = new Expr\New_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 469 => function ($stackPos) { - list($class, $ctorArgs) = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 470 => function ($stackPos) { - $this->semValue = array(); - }, 471 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 3)]; - }, 472 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 473 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 474 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 475 => function ($stackPos) { - $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos - (2 - 2)], $this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 476 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 477 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 478 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 479 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 480 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 481 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 482 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 483 => function ($stackPos) { - $this->semValue = new Name\FullyQualified(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 484 => function ($stackPos) { - $this->semValue = new Name\Relative(\substr($this->semStack[$stackPos - (1 - 1)], 10), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 485 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 486 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 487 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 488 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->errorState = 2; - }, 489 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 490 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 491 => function ($stackPos) { - $this->semValue = null; - }, 492 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 493 => function ($stackPos) { - $this->semValue = array(); - }, 494 => function ($stackPos) { - $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos - (1 - 1)], '`'), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes)); - }, 495 => function ($stackPos) { - foreach ($this->semStack[$stackPos - (1 - 1)] as $s) { - if ($s instanceof Node\Scalar\EncapsedStringPart) { - $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', \true); - } - } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 496 => function ($stackPos) { - $this->semValue = array(); - }, 497 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 498 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 499 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 500 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 501 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 502 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 503 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 504 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 505 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 506 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 507 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 508 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], new Expr\Error($this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)]), $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->errorState = 2; - }, 509 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; - $attrs['kind'] = Expr\Array_::KIND_SHORT; - $this->semValue = new Expr\Array_($this->semStack[$stackPos - (3 - 2)], $attrs); - }, 510 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes; - $attrs['kind'] = Expr\Array_::KIND_LONG; - $this->semValue = new Expr\Array_($this->semStack[$stackPos - (4 - 3)], $attrs); - }, 511 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 512 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes; - $attrs['kind'] = $this->semStack[$stackPos - (1 - 1)][0] === "'" || $this->semStack[$stackPos - (1 - 1)][1] === "'" && ($this->semStack[$stackPos - (1 - 1)][0] === 'b' || $this->semStack[$stackPos - (1 - 1)][0] === 'B') ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED; - $this->semValue = new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos - (1 - 1)]), $attrs); - }, 513 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; - $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - foreach ($this->semStack[$stackPos - (3 - 2)] as $s) { - if ($s instanceof Node\Scalar\EncapsedStringPart) { - $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', \true); - } - } - $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos - (3 - 2)], $attrs); - }, 514 => function ($stackPos) { - $this->semValue = $this->parseLNumber($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 515 => function ($stackPos) { - $this->semValue = new Scalar\DNumber(Scalar\DNumber::parse($this->semStack[$stackPos - (1 - 1)]), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 516 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 517 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 518 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 519 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true); - }, 520 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos - (2 - 1)], '', $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (2 - 2)] + $this->endAttributeStack[$stackPos - (2 - 2)], \true); - }, 521 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true); - }, 522 => function ($stackPos) { - $this->semValue = null; - }, 523 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 524 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 525 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 526 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 527 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 528 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 529 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 530 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 531 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 532 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 533 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 534 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 535 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 536 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 537 => function ($stackPos) { - $this->semValue = new Expr\MethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 538 => function ($stackPos) { - $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 539 => function ($stackPos) { - $this->semValue = null; - }, 540 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 541 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 542 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 543 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 544 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 545 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 546 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 547 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 548 => function ($stackPos) { - $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - $this->errorState = 2; - }, 549 => function ($stackPos) { - $var = $this->semStack[$stackPos - (1 - 1)]->name; - $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes) : $var; - }, 550 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 551 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 552 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 553 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 554 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 555 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 556 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 557 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 558 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 559 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 560 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 561 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 562 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 563 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 564 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->errorState = 2; - }, 565 => function ($stackPos) { - $this->semValue = new Expr\List_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 566 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - $end = \count($this->semValue) - 1; - if ($this->semValue[$end] === null) { - \array_pop($this->semValue); - } - }, 567 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 568 => function ($stackPos) { - /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ - }, 569 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 570 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 571 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 572 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 573 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 574 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 575 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 1)], \true, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 576 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 577 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 578 => function ($stackPos) { - $this->semValue = null; - }, 579 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 580 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 581 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 582 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); - }, 583 => function ($stackPos) { - $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 584 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 585 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 586 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 587 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 588 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 589 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 590 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 591 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 4)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 592 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 593 => function ($stackPos) { - $this->semValue = new Scalar\String_($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 594 => function ($stackPos) { - $this->semValue = $this->parseNumString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 595 => function ($stackPos) { - $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 596 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }]; - } -} -parsers = $parsers; - } - public function parse(string $code, ErrorHandler $errorHandler = null) - { - if (null === $errorHandler) { - $errorHandler = new ErrorHandler\Throwing(); - } - list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code); - if ($firstError === null) { - return $firstStmts; - } - for ($i = 1, $c = \count($this->parsers); $i < $c; ++$i) { - list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code); - if ($error === null) { - return $stmts; - } - } - throw $firstError; - } - private function tryParse(Parser $parser, ErrorHandler $errorHandler, $code) - { - $stmts = null; - $error = null; - try { - $stmts = $parser->parse($code, $errorHandler); - } catch (Error $error) { - } - return [$stmts, $error]; - } -} -'", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "';'", "'{'", "'}'", "'('", "')'", "'\$'", "'`'", "']'", "'\"'", "T_READONLY", "T_ENUM", "T_NULLSAFE_OBJECT_OPERATOR", "T_ATTRIBUTE"); - protected $tokenToSymbol = array(0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 56, 163, 168, 160, 55, 168, 168, 158, 159, 53, 50, 8, 51, 52, 54, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 31, 155, 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 70, 168, 162, 36, 168, 161, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 156, 35, 157, 58, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 164, 122, 123, 124, 125, 126, 127, 128, 129, 165, 130, 131, 132, 166, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 167); - protected $action = array(699, 669, 670, 671, 672, 673, 286, 674, 675, 676, 712, 713, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 0, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, 245, 246, 242, 243, 244, -32766, -32766, 677, -32766, 750, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 1224, 245, 246, 1225, 678, 679, 680, 681, 682, 683, 684, -32766, 48, 746, -32766, -32766, -32766, -32766, -32766, -32766, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 715, 738, 716, 717, 718, 719, 707, 708, 709, 737, 710, 711, 696, 697, 698, 700, 701, 702, 740, 741, 742, 743, 744, 745, 703, 704, 705, 706, 736, 727, 725, 726, 722, 723, 751, 714, 720, 721, 728, 729, 731, 730, 732, 733, 55, 56, 425, 57, 58, 724, 735, 734, 1073, 59, 60, -224, 61, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 121, -32767, -32767, -32767, -32767, 29, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 1043, 766, 1071, 767, 580, 62, 63, -32766, -32766, -32766, -32766, 64, 516, 65, 294, 295, 66, 67, 68, 69, 70, 71, 72, 73, 822, 25, 302, 74, 418, 981, 983, 1043, 1181, 1095, 1096, 1073, 748, 754, 1075, 1074, 1076, 469, -32766, -32766, -32766, 337, 823, 54, -32767, -32767, -32767, -32767, 98, 99, 100, 101, 102, 220, 221, 222, 78, 361, 1107, -32766, 341, -32766, -32766, -32766, -32766, -32766, 1107, 492, 949, 950, 951, 948, 947, 946, 207, 477, 478, 949, 950, 951, 948, 947, 946, 1043, 479, 480, 52, 1101, 1102, 1103, 1104, 1098, 1099, 319, 872, 668, 667, 27, -511, 1105, 1100, -32766, 130, 1075, 1074, 1076, 345, 668, 667, 41, 126, 341, 334, 369, 336, 426, -128, -128, -128, 896, 897, 468, 220, 221, 222, 811, 1195, 619, 40, 21, 427, -128, 470, -128, 471, -128, 472, -128, 802, 428, -4, 823, 54, 207, 33, 34, 429, 360, 317, 28, 35, 473, -32766, -32766, -32766, 211, 356, 357, 474, 475, -32766, -32766, -32766, 754, 476, 49, 313, 794, 843, 430, 431, 289, 125, -32766, 813, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, -32767, -32766, -32766, -32766, 769, 103, 104, 105, 327, 307, 825, 633, -128, 1075, 1074, 1076, 221, 222, 927, 748, 1146, 106, -32766, 129, -32766, -32766, -32766, -32766, 426, 823, 54, 902, 873, 302, 468, 75, 207, 359, 811, 668, 667, 40, 21, 427, 754, 470, 754, 471, 423, 472, 1043, 127, 428, 435, 1043, 341, 1043, 33, 34, 429, 360, 1181, 415, 35, 473, 122, 10, 315, 128, 356, 357, 474, 475, -32766, -32766, -32766, 768, 476, 668, 667, 758, 843, 430, 431, 754, 1043, 1147, -32766, -32766, -32766, 754, 419, 342, 1215, -32766, 131, -32766, -32766, -32766, 341, 363, 346, 426, 823, 54, 100, 101, 102, 468, 825, 633, -4, 811, 442, 903, 40, 21, 427, 754, 470, 435, 471, 341, 472, 341, 766, 428, 767, -209, -209, -209, 33, 34, 429, 360, 479, 1196, 35, 473, 345, -32766, -32766, -32766, 356, 357, 474, 475, 220, 221, 222, 421, 476, 32, 297, 794, 843, 430, 431, 754, 754, 435, -32766, 341, -32766, -32766, 9, 300, 51, 207, 249, 324, 753, 120, 220, 221, 222, 426, 30, 247, 941, 422, 424, 468, 825, 633, -209, 811, 1043, 1061, 40, 21, 427, 129, 470, 207, 471, 341, 472, 804, 20, 428, 124, -208, -208, -208, 33, 34, 429, 360, 479, 212, 35, 473, 923, -259, 823, 54, 356, 357, 474, 475, -32766, -32766, -32766, 1043, 476, 213, 806, 794, 843, 430, 431, -32766, -32766, 435, 435, 341, 341, 443, 79, 80, 81, -32766, 668, 667, 636, 344, 808, 668, 667, 239, 240, 241, 123, 214, 538, 250, 825, 633, -208, 36, 251, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 252, 307, 426, 220, 221, 222, 823, 54, 468, -32766, 222, 765, 811, 106, 134, 40, 21, 427, 571, 470, 207, 471, 445, 472, 207, -32766, 428, 896, 897, 207, 307, 33, 34, 429, 245, 246, 637, 35, 473, 452, 22, 809, 922, 356, 357, 457, 588, 135, 374, 595, 596, 476, -228, 759, 639, 938, 653, 926, 661, -86, 823, 54, 314, 644, 647, 821, 133, 836, 43, 106, 603, 44, 45, 46, 47, 748, 50, 53, 132, 426, 302, -32766, 520, 825, 633, 468, -84, 607, 577, 811, 641, 362, 40, 21, 427, -278, 470, 754, 471, 954, 472, 441, 627, 428, 823, 54, 574, 844, 33, 34, 429, 11, 615, 845, 35, 473, 444, 461, 285, -511, 356, 357, 592, -419, 593, 1106, 1153, -410, 476, 368, 838, 38, 658, 426, 645, 795, 1052, 0, 325, 468, 0, -32766, 0, 811, 0, 0, 40, 21, 427, 0, 470, 0, 471, 0, 472, 0, 322, 428, 823, 54, 825, 633, 33, 34, 429, 0, 326, 0, 35, 473, 323, 0, 316, 318, 356, 357, -512, 426, 0, 753, 531, 0, 476, 468, 6, 0, 0, 811, 650, 7, 40, 21, 427, 12, 470, 14, 471, 373, 472, -420, 562, 428, 823, 54, 78, -225, 33, 34, 429, 39, 656, 657, 35, 473, 859, 633, 764, 812, 356, 357, 820, 799, 814, 875, 866, 867, 476, 797, 860, 857, 855, 426, 933, 934, 931, 819, 803, 468, 805, 807, 810, 811, 930, 762, 40, 21, 427, 763, 470, 932, 471, 335, 472, 358, 634, 428, 638, 640, 825, 633, 33, 34, 429, 642, 643, 646, 35, 473, 648, 649, 651, 652, 356, 357, 635, 426, 1221, 1223, 761, 842, 476, 468, 248, 760, 841, 811, 1222, 840, 40, 21, 427, 1057, 470, 830, 471, 1045, 472, 839, 1046, 428, 828, 215, 216, 939, 33, 34, 429, 217, 864, 218, 35, 473, 825, 633, 24, 865, 356, 357, 456, 1220, 1189, 209, 1187, 1172, 476, 1185, 215, 216, 1086, 1095, 1096, 914, 217, 1193, 218, 1183, -224, 1097, 26, 31, 37, 42, 76, 77, 210, 288, 209, 292, 293, 308, 309, 310, 311, 339, 1095, 1096, 825, 633, 355, 291, 416, 1152, 1097, 16, 17, 18, 393, 453, 460, 462, 466, 552, 624, 1048, 1051, 904, 1111, 1047, 1023, 563, 1022, 1088, 0, 0, -429, 558, 1041, 1101, 1102, 1103, 1104, 1098, 1099, 398, 1054, 1053, 1056, 1055, 1070, 1105, 1100, 1186, 1171, 1167, 1184, 1085, 1218, 1112, 1166, 219, 558, 599, 1101, 1102, 1103, 1104, 1098, 1099, 398, 0, 0, 0, 0, 0, 1105, 1100, 0, 0, 0, 0, 0, 0, 0, 0, 219); - protected $actionCheck = array(2, 3, 4, 5, 6, 7, 14, 9, 10, 11, 12, 13, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 0, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 9, 10, 11, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 69, 70, 53, 54, 55, 9, 10, 57, 30, 80, 32, 33, 34, 35, 36, 37, 38, 80, 69, 70, 83, 71, 72, 73, 74, 75, 76, 77, 9, 70, 80, 33, 34, 35, 36, 37, 38, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 153, 133, 134, 135, 136, 137, 138, 139, 140, 141, 3, 4, 5, 6, 7, 147, 148, 149, 80, 12, 13, 159, 15, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 156, 44, 45, 46, 47, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 13, 106, 116, 108, 85, 50, 51, 33, 34, 35, 36, 56, 85, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 1, 70, 71, 72, 73, 59, 60, 13, 82, 78, 79, 80, 80, 82, 152, 153, 154, 86, 9, 10, 11, 8, 1, 2, 44, 45, 46, 47, 48, 49, 50, 51, 52, 9, 10, 11, 156, 106, 143, 30, 160, 32, 33, 34, 35, 36, 143, 116, 116, 117, 118, 119, 120, 121, 30, 124, 125, 116, 117, 118, 119, 120, 121, 13, 133, 134, 70, 136, 137, 138, 139, 140, 141, 142, 31, 37, 38, 8, 132, 148, 149, 116, 156, 152, 153, 154, 160, 37, 38, 158, 8, 160, 161, 8, 163, 74, 75, 76, 77, 134, 135, 80, 9, 10, 11, 84, 1, 80, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 155, 98, 0, 1, 2, 30, 103, 104, 105, 106, 132, 8, 109, 110, 9, 10, 11, 8, 115, 116, 117, 118, 9, 10, 11, 82, 123, 70, 8, 126, 127, 128, 129, 8, 156, 30, 155, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 9, 10, 11, 157, 53, 54, 55, 8, 57, 155, 156, 157, 152, 153, 154, 10, 11, 157, 80, 162, 69, 30, 151, 32, 33, 34, 35, 74, 1, 2, 159, 155, 71, 80, 151, 30, 8, 84, 37, 38, 87, 88, 89, 82, 91, 82, 93, 8, 95, 13, 156, 98, 158, 13, 160, 13, 103, 104, 105, 106, 82, 108, 109, 110, 156, 8, 113, 31, 115, 116, 117, 118, 9, 10, 11, 157, 123, 37, 38, 126, 127, 128, 129, 82, 13, 159, 33, 34, 35, 82, 127, 8, 85, 30, 156, 32, 33, 34, 160, 8, 147, 74, 1, 2, 50, 51, 52, 80, 155, 156, 157, 84, 31, 159, 87, 88, 89, 82, 91, 158, 93, 160, 95, 160, 106, 98, 108, 100, 101, 102, 103, 104, 105, 106, 133, 159, 109, 110, 160, 9, 10, 11, 115, 116, 117, 118, 9, 10, 11, 8, 123, 144, 145, 126, 127, 128, 129, 82, 82, 158, 30, 160, 32, 33, 108, 8, 70, 30, 31, 113, 152, 16, 9, 10, 11, 74, 14, 14, 122, 8, 8, 80, 155, 156, 157, 84, 13, 159, 87, 88, 89, 151, 91, 30, 93, 160, 95, 155, 159, 98, 14, 100, 101, 102, 103, 104, 105, 106, 133, 16, 109, 110, 155, 157, 1, 2, 115, 116, 117, 118, 9, 10, 11, 13, 123, 16, 155, 126, 127, 128, 129, 33, 34, 158, 158, 160, 160, 156, 9, 10, 11, 30, 37, 38, 31, 70, 155, 37, 38, 50, 51, 52, 156, 16, 81, 16, 155, 156, 157, 30, 16, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 16, 57, 74, 9, 10, 11, 1, 2, 80, 116, 11, 155, 84, 69, 156, 87, 88, 89, 160, 91, 30, 93, 132, 95, 30, 33, 98, 134, 135, 30, 57, 103, 104, 105, 69, 70, 31, 109, 110, 75, 76, 155, 155, 115, 116, 75, 76, 101, 102, 111, 112, 123, 159, 155, 156, 155, 156, 155, 156, 31, 1, 2, 31, 31, 31, 31, 31, 38, 70, 69, 77, 70, 70, 70, 70, 80, 70, 70, 70, 74, 71, 85, 85, 155, 156, 80, 97, 96, 100, 84, 31, 106, 87, 88, 89, 82, 91, 82, 93, 82, 95, 89, 92, 98, 1, 2, 90, 127, 103, 104, 105, 97, 94, 127, 109, 110, 97, 97, 97, 132, 115, 116, 100, 146, 113, 143, 143, 146, 123, 106, 151, 155, 157, 74, 31, 157, 162, -1, 114, 80, -1, 116, -1, 84, -1, -1, 87, 88, 89, -1, 91, -1, 93, -1, 95, -1, 130, 98, 1, 2, 155, 156, 103, 104, 105, -1, 130, -1, 109, 110, 131, -1, 132, 132, 115, 116, 132, 74, -1, 152, 150, -1, 123, 80, 146, -1, -1, 84, 31, 146, 87, 88, 89, 146, 91, 146, 93, 146, 95, 146, 150, 98, 1, 2, 156, 159, 103, 104, 105, 155, 155, 155, 109, 110, 155, 156, 155, 155, 115, 116, 155, 155, 155, 155, 155, 155, 123, 155, 155, 155, 155, 74, 155, 155, 155, 155, 155, 80, 155, 155, 155, 84, 155, 155, 87, 88, 89, 155, 91, 155, 93, 156, 95, 156, 156, 98, 156, 156, 155, 156, 103, 104, 105, 156, 156, 156, 109, 110, 156, 156, 156, 156, 115, 116, 156, 74, 157, 157, 157, 157, 123, 80, 31, 157, 157, 84, 157, 157, 87, 88, 89, 157, 91, 157, 93, 157, 95, 157, 157, 98, 157, 50, 51, 157, 103, 104, 105, 56, 157, 58, 109, 110, 155, 156, 158, 157, 115, 116, 157, 157, 157, 70, 157, 157, 123, 157, 50, 51, 157, 78, 79, 157, 56, 157, 58, 157, 159, 86, 158, 158, 158, 158, 158, 158, 158, 158, 70, 158, 158, 158, 158, 158, 158, 158, 78, 79, 155, 156, 158, 160, 158, 163, 86, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, -1, -1, 161, 134, 161, 136, 137, 138, 139, 140, 141, 142, 162, 162, 162, 162, 162, 148, 149, 162, 162, 162, 162, 162, 162, 162, 162, 158, 134, 162, 136, 137, 138, 139, 140, 141, 142, -1, -1, -1, -1, -1, 148, 149, -1, -1, -1, -1, -1, -1, -1, -1, 158); - protected $actionBase = array(0, 227, 326, 400, 474, 233, 132, 132, 752, -2, -2, 138, -2, -2, -2, 663, 761, 815, 761, 586, 717, 859, 859, 859, 244, 256, 256, 256, 413, 583, 583, 880, 546, 169, 415, 444, 409, 200, 200, 200, 200, 137, 137, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 249, 205, 738, 559, 535, 739, 741, 742, 876, 679, 877, 820, 821, 693, 823, 824, 826, 829, 832, 819, 834, 907, 836, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 67, 536, 299, 510, 230, 44, 652, 652, 652, 652, 652, 652, 652, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 378, 584, 584, 584, 657, 909, 648, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 503, -21, -21, 436, 650, 364, 571, 215, 426, 156, 26, 26, 329, 329, 329, 329, 329, 46, 46, 5, 5, 5, 5, 152, 186, 186, 186, 186, 120, 120, 120, 120, 374, 374, 429, 448, 448, 334, 267, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 336, 427, 427, 572, 572, 408, 551, 551, 551, 551, 671, 171, 171, 391, 311, 311, 311, 109, 641, 856, 68, 68, 68, 68, 68, 68, 324, 324, 324, -3, -3, -3, 655, 77, 380, 77, 380, 683, 685, 86, 685, 654, -15, 516, 776, 281, 646, 809, 680, 816, 560, 711, 202, 578, 857, 643, -23, 578, 578, 578, 578, 857, 622, 628, 596, -23, 578, -23, 639, 454, 849, 351, 249, 558, 469, 631, 743, 514, 688, 746, 464, 544, 548, 556, 7, 412, 708, 750, 878, 879, 349, 702, 631, 631, 631, 327, 101, 7, -8, 623, 623, 623, 623, 219, 623, 623, 623, 623, 291, 430, 545, 401, 745, 653, 653, 675, 839, 814, 814, 653, 673, 653, 675, 841, 841, 841, 841, 653, 653, 653, 653, 814, 814, 667, 814, 275, 684, 694, 694, 841, 713, 714, 653, 653, 697, 814, 814, 814, 697, 687, 841, 669, 637, 333, 814, 841, 689, 673, 689, 653, 669, 689, 673, 673, 689, 22, 686, 656, 840, 842, 860, 756, 638, 644, 847, 848, 843, 845, 838, 692, 719, 720, 528, 659, 660, 661, 662, 696, 664, 698, 643, 658, 658, 658, 645, 701, 645, 658, 658, 658, 658, 658, 658, 658, 658, 632, 635, 709, 699, 670, 723, 566, 582, 758, 640, 636, 872, 865, 881, 883, 849, 870, 645, 890, 634, 288, 610, 850, 633, 753, 645, 851, 645, 759, 645, 873, 777, 666, 778, 779, 658, 874, 891, 892, 893, 894, 897, 898, 899, 900, 665, 901, 724, 674, 866, 344, 844, 639, 705, 677, 755, 725, 780, 372, 902, 784, 645, 645, 765, 706, 645, 766, 726, 712, 862, 727, 867, 903, 640, 678, 868, 645, 681, 785, 904, 372, 690, 651, 704, 649, 728, 858, 875, 853, 767, 612, 617, 787, 788, 792, 691, 730, 863, 864, 835, 731, 770, 642, 771, 676, 794, 772, 852, 732, 796, 798, 871, 647, 707, 682, 672, 668, 773, 799, 869, 733, 735, 736, 801, 737, 804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 137, 137, 137, -2, -2, -2, -2, 0, 0, -2, 0, 0, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 602, -21, -21, -21, -21, 602, -21, -21, -21, -21, -21, -21, -21, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, -21, 602, 602, 602, -21, 68, -21, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 602, 0, 0, 602, -21, 602, -21, 602, -21, -21, 602, 602, 602, 602, 602, 602, 602, -21, -21, -21, -21, -21, -21, 0, 324, 324, 324, 324, -21, -21, -21, -21, 68, 68, 147, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 324, 324, -3, -3, 68, 68, 68, 68, 68, 147, 68, 68, -23, 673, 673, 673, 380, 380, 380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380, -23, 0, -23, 0, 68, -23, 673, -23, 380, 673, 673, -23, 814, 604, 604, 604, 604, 372, 7, 0, 0, 673, 673, 0, 0, 0, 0, 0, 673, 0, 0, 0, 0, 0, 0, 814, 0, 653, 0, 0, 0, 0, 658, 288, 0, 677, 456, 0, 0, 0, 0, 0, 0, 677, 456, 530, 530, 0, 665, 658, 658, 658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 372); - protected $actionDefault = array(3, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 540, 540, 495, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 297, 297, 297, 32767, 32767, 32767, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 32767, 32767, 32767, 32767, 32767, 32767, 381, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 387, 545, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 362, 363, 365, 366, 296, 548, 529, 245, 388, 544, 295, 247, 325, 499, 32767, 32767, 32767, 327, 122, 256, 201, 498, 125, 294, 232, 380, 382, 326, 301, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 300, 454, 359, 358, 357, 456, 32767, 455, 492, 492, 495, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 323, 483, 482, 324, 452, 328, 453, 331, 457, 460, 329, 330, 347, 348, 345, 346, 349, 458, 459, 476, 477, 474, 475, 299, 350, 351, 352, 353, 478, 479, 480, 481, 32767, 32767, 280, 539, 539, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 338, 339, 467, 468, 32767, 236, 236, 236, 236, 281, 236, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 333, 334, 332, 462, 463, 461, 428, 32767, 32767, 32767, 430, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 500, 32767, 32767, 32767, 32767, 32767, 513, 417, 171, 32767, 409, 32767, 171, 171, 171, 171, 32767, 220, 222, 167, 32767, 171, 32767, 486, 32767, 32767, 32767, 32767, 32767, 518, 343, 32767, 32767, 116, 32767, 32767, 32767, 555, 32767, 513, 32767, 116, 32767, 32767, 32767, 32767, 356, 335, 336, 337, 32767, 32767, 517, 511, 470, 471, 472, 473, 32767, 464, 465, 466, 469, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 425, 431, 431, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 516, 515, 32767, 410, 494, 186, 184, 184, 32767, 206, 206, 32767, 32767, 188, 487, 506, 32767, 188, 173, 32767, 398, 175, 494, 32767, 32767, 238, 32767, 238, 32767, 398, 238, 32767, 32767, 238, 32767, 411, 435, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 377, 378, 489, 502, 32767, 503, 32767, 409, 341, 342, 344, 320, 32767, 322, 367, 368, 369, 370, 371, 372, 373, 375, 32767, 415, 32767, 418, 32767, 32767, 32767, 255, 32767, 553, 32767, 32767, 304, 553, 32767, 32767, 32767, 547, 32767, 32767, 298, 32767, 32767, 32767, 32767, 251, 32767, 169, 32767, 537, 32767, 554, 32767, 511, 32767, 340, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 512, 32767, 32767, 32767, 32767, 227, 32767, 448, 32767, 116, 32767, 32767, 32767, 187, 32767, 32767, 302, 246, 32767, 32767, 546, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 114, 32767, 170, 32767, 32767, 32767, 189, 32767, 32767, 511, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 293, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 511, 32767, 32767, 231, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 411, 32767, 274, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 127, 127, 3, 127, 127, 258, 3, 258, 127, 258, 258, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 214, 217, 206, 206, 164, 127, 127, 266); - protected $goto = array(166, 140, 140, 140, 166, 187, 168, 144, 147, 141, 142, 143, 149, 163, 163, 163, 163, 144, 144, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 138, 159, 160, 161, 162, 184, 139, 185, 493, 494, 377, 495, 499, 500, 501, 502, 503, 504, 505, 506, 967, 164, 145, 146, 148, 171, 176, 186, 203, 253, 256, 258, 260, 263, 264, 265, 266, 267, 268, 269, 277, 278, 279, 280, 303, 304, 328, 329, 330, 394, 395, 396, 542, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 150, 151, 152, 167, 153, 169, 154, 204, 170, 155, 156, 157, 205, 158, 136, 620, 560, 756, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1108, 628, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 757, 888, 888, 508, 1200, 1200, 400, 606, 508, 536, 536, 568, 532, 534, 534, 496, 498, 524, 540, 569, 572, 583, 590, 852, 852, 852, 852, 847, 853, 174, 585, 519, 600, 601, 177, 178, 179, 401, 402, 403, 404, 173, 202, 206, 208, 257, 259, 261, 262, 270, 271, 272, 273, 274, 275, 281, 282, 283, 284, 305, 306, 331, 332, 333, 406, 407, 408, 409, 175, 180, 254, 255, 181, 182, 183, 497, 497, 785, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 509, 578, 582, 626, 749, 509, 544, 545, 546, 547, 548, 549, 550, 551, 553, 586, 338, 559, 321, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 530, 349, 655, 555, 587, 352, 414, 591, 575, 604, 885, 611, 612, 881, 616, 617, 623, 625, 630, 632, 298, 296, 296, 296, 298, 290, 299, 944, 610, 816, 1170, 613, 436, 436, 375, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 1072, 1084, 1083, 945, 1065, 1072, 895, 895, 895, 895, 1178, 895, 895, 1212, 1212, 1178, 388, 858, 561, 755, 1072, 1072, 1072, 1072, 1072, 1072, 3, 4, 384, 384, 384, 1212, 874, 856, 854, 856, 654, 465, 511, 883, 878, 1089, 541, 384, 537, 384, 567, 384, 1026, 19, 15, 371, 384, 1226, 510, 1204, 1192, 1192, 1192, 510, 906, 372, 522, 533, 554, 912, 514, 1068, 1069, 13, 1065, 378, 912, 1158, 594, 23, 965, 386, 386, 386, 602, 1066, 1169, 1066, 937, 447, 449, 631, 752, 1177, 1067, 1109, 614, 935, 1177, 605, 1197, 391, 1211, 1211, 543, 892, 386, 1194, 1194, 1194, 399, 518, 1016, 901, 389, 771, 529, 752, 340, 752, 1211, 518, 518, 385, 781, 1214, 770, 772, 1063, 910, 774, 1058, 1176, 659, 953, 514, 782, 862, 915, 450, 573, 1155, 0, 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, 528, 0, 0, 0, 0, 513, 0, 528, 0, 350, 351, 0, 609, 512, 515, 438, 439, 1064, 618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 779, 1219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 301); - protected $gotoCheck = array(43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 57, 68, 15, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 126, 9, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 16, 76, 76, 68, 76, 76, 51, 51, 68, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 68, 68, 68, 68, 68, 68, 27, 66, 101, 66, 66, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 117, 117, 29, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 61, 61, 61, 6, 117, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 125, 57, 125, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 32, 71, 32, 32, 69, 69, 69, 32, 40, 40, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 5, 5, 5, 5, 5, 5, 5, 97, 62, 50, 81, 62, 57, 57, 62, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 124, 124, 97, 81, 57, 57, 57, 57, 57, 118, 57, 57, 142, 142, 118, 12, 33, 12, 14, 57, 57, 57, 57, 57, 57, 30, 30, 13, 13, 13, 142, 14, 14, 14, 14, 14, 57, 14, 14, 14, 34, 2, 13, 109, 13, 2, 13, 34, 34, 34, 34, 13, 13, 122, 140, 9, 9, 9, 122, 83, 58, 58, 58, 34, 13, 13, 81, 81, 58, 81, 46, 13, 131, 127, 34, 101, 123, 123, 123, 34, 81, 81, 81, 8, 8, 8, 8, 11, 119, 81, 8, 8, 8, 119, 49, 138, 48, 141, 141, 47, 78, 123, 119, 119, 119, 123, 47, 102, 80, 17, 23, 9, 11, 18, 11, 141, 47, 47, 11, 23, 141, 23, 24, 115, 84, 25, 113, 119, 73, 99, 13, 26, 70, 85, 64, 65, 130, -1, 108, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, 9, -1, 9, -1, 71, 71, -1, 13, 9, 9, 9, 9, 13, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 5); - protected $gotoBase = array(0, 0, -184, 0, 0, 356, 290, 0, 488, 149, 0, 182, 85, 118, 426, 112, 203, 179, 208, 0, 0, 0, 0, 162, 190, 198, 120, 27, 0, 272, -224, 0, -274, 406, 32, 0, 0, 0, 0, 0, 330, 0, 0, -24, 0, 0, 440, 485, 213, 218, 371, -74, 0, 0, 0, 0, 0, 107, 110, 0, 0, -11, -72, 0, 104, 95, -405, 0, -94, 41, 119, -82, 0, 164, 0, 0, -79, 0, 197, 0, 204, 43, 0, 441, 171, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 115, 0, 195, 210, 0, 0, 0, 0, 0, 86, 427, 259, 0, 0, 116, 0, 174, 0, -5, 117, 196, 0, 0, 161, 170, 93, -21, -48, 273, 0, 0, 91, 271, 0, 0, 0, 0, 0, 0, 216, 0, 437, 187, 102, 0, 0); - protected $gotoDefault = array(-32768, 467, 663, 2, 664, 834, 739, 747, 597, 481, 629, 581, 380, 1188, 791, 792, 793, 381, 367, 482, 379, 410, 405, 780, 773, 775, 783, 172, 411, 786, 1, 788, 517, 824, 1017, 364, 796, 365, 589, 798, 526, 800, 801, 137, 382, 383, 527, 483, 390, 576, 815, 276, 387, 817, 366, 818, 827, 370, 464, 454, 459, 556, 608, 432, 446, 570, 564, 535, 1081, 565, 861, 348, 869, 660, 877, 880, 484, 557, 891, 451, 899, 1094, 397, 905, 911, 916, 287, 919, 417, 412, 584, 924, 925, 5, 929, 621, 622, 8, 312, 952, 598, 966, 420, 1036, 1038, 485, 486, 521, 458, 507, 525, 487, 1059, 440, 413, 1062, 488, 489, 433, 434, 1078, 354, 1163, 353, 448, 320, 1150, 579, 1113, 455, 1203, 1159, 347, 490, 491, 376, 1182, 392, 1198, 437, 1205, 1213, 343, 539, 566); - protected $ruleToNonTerminal = array(0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 12, 12, 13, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 18, 18, 19, 19, 21, 21, 17, 17, 22, 22, 23, 23, 24, 24, 25, 25, 20, 20, 26, 28, 28, 29, 30, 30, 32, 31, 31, 31, 31, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 14, 14, 54, 54, 56, 55, 55, 48, 48, 58, 58, 59, 59, 60, 60, 15, 16, 16, 16, 63, 63, 63, 64, 64, 67, 67, 65, 65, 69, 69, 41, 41, 50, 50, 53, 53, 53, 52, 52, 70, 42, 42, 42, 42, 71, 71, 72, 72, 73, 73, 39, 39, 35, 35, 74, 37, 37, 75, 36, 36, 38, 38, 49, 49, 49, 61, 61, 77, 77, 78, 78, 80, 80, 80, 79, 79, 62, 62, 81, 81, 81, 82, 82, 83, 83, 83, 44, 44, 84, 84, 84, 45, 45, 85, 85, 86, 86, 66, 87, 87, 87, 87, 92, 92, 93, 93, 94, 94, 94, 94, 94, 95, 96, 96, 91, 91, 88, 88, 90, 90, 98, 98, 97, 97, 97, 97, 97, 97, 89, 89, 100, 99, 99, 46, 46, 40, 40, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 34, 34, 47, 47, 105, 105, 106, 106, 106, 106, 112, 101, 101, 108, 108, 114, 114, 115, 116, 116, 116, 116, 116, 116, 68, 68, 57, 57, 57, 57, 102, 102, 120, 120, 117, 117, 121, 121, 121, 121, 103, 103, 103, 107, 107, 107, 113, 113, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 27, 27, 27, 27, 27, 27, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 111, 111, 104, 104, 104, 104, 127, 127, 130, 130, 129, 129, 131, 131, 51, 51, 51, 51, 133, 133, 132, 132, 132, 132, 132, 134, 134, 119, 119, 122, 122, 118, 118, 136, 135, 135, 135, 135, 123, 123, 123, 123, 110, 110, 124, 124, 124, 124, 76, 137, 137, 138, 138, 138, 109, 109, 139, 139, 140, 140, 140, 140, 140, 125, 125, 125, 125, 142, 143, 141, 141, 141, 141, 141, 141, 141, 144, 144, 144); - protected $ruleToLength = array(1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 4, 3, 4, 2, 3, 1, 1, 7, 6, 3, 1, 3, 1, 3, 1, 1, 3, 1, 3, 1, 2, 3, 1, 3, 3, 1, 3, 2, 0, 1, 1, 1, 1, 1, 3, 5, 8, 3, 5, 9, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 1, 2, 2, 5, 7, 9, 5, 6, 3, 3, 2, 2, 1, 1, 1, 0, 2, 8, 0, 4, 1, 3, 0, 1, 0, 1, 0, 1, 10, 7, 6, 5, 1, 2, 2, 0, 2, 0, 2, 0, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 1, 4, 0, 2, 3, 0, 2, 4, 0, 2, 0, 3, 1, 2, 1, 1, 0, 1, 3, 4, 6, 1, 1, 1, 0, 1, 0, 2, 2, 3, 3, 1, 3, 1, 2, 2, 3, 1, 1, 2, 4, 3, 1, 1, 3, 2, 0, 1, 3, 3, 9, 3, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 3, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 0, 1, 1, 3, 3, 4, 4, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 5, 4, 3, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 3, 2, 1, 2, 10, 11, 3, 3, 2, 4, 4, 3, 4, 4, 4, 4, 7, 3, 2, 0, 4, 1, 3, 2, 2, 4, 6, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 4, 4, 0, 2, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 3, 1, 4, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 4, 3, 1, 3, 1, 1, 3, 3, 0, 2, 0, 1, 3, 1, 3, 1, 1, 1, 1, 1, 6, 4, 3, 4, 2, 4, 4, 1, 3, 1, 2, 1, 1, 4, 1, 1, 3, 6, 4, 4, 4, 4, 1, 4, 0, 1, 1, 3, 1, 1, 4, 3, 1, 1, 1, 0, 0, 2, 3, 1, 3, 1, 4, 2, 2, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 6, 3, 1, 1, 1); - protected function initReduceCallbacks() - { - $this->reduceCallbacks = [0 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 1 => function ($stackPos) { - $this->semValue = $this->handleNamespaces($this->semStack[$stackPos - (1 - 1)]); - }, 2 => function ($stackPos) { - if (\is_array($this->semStack[$stackPos - (2 - 2)])) { - $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); - } else { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - } - }, 3 => function ($stackPos) { - $this->semValue = array(); - }, 4 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; - if (isset($startAttributes['comments'])) { - $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); - } else { - $nop = null; - } - if ($nop !== null) { - $this->semStack[$stackPos - (1 - 1)][] = $nop; - } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 5 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 6 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 7 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 8 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 9 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 10 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 11 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 12 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 13 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 14 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 15 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 16 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 17 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 18 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 19 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 20 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 21 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 22 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 23 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 24 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 25 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 26 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 27 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 28 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 29 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 30 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 31 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 32 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 33 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 34 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 35 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 36 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 37 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 38 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 39 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 40 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 41 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 42 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 43 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 44 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 45 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 46 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 47 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 48 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 49 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 50 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 51 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 52 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 53 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 54 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 55 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 56 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 57 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 58 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 59 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 60 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 61 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 62 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 63 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 64 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 65 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 66 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 67 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 68 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 69 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 70 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 71 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 72 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 73 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 74 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 75 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 76 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 77 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 78 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 79 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 80 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 81 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 82 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 83 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 84 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 85 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 86 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 87 => function ($stackPos) { - $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 88 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 89 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 90 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 91 => function ($stackPos) { - $this->semValue = new Name(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 92 => function ($stackPos) { - $this->semValue = new Expr\Variable(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 93 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 94 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 95 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 96 => function ($stackPos) { - $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 97 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (3 - 2)], null, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); - $this->checkNamespace($this->semValue); - }, 98 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, 99 => function ($stackPos) { - $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); - $this->checkNamespace($this->semValue); - }, 100 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (3 - 2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 101 => function ($stackPos) { - $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 102 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 103 => function ($stackPos) { - $this->semValue = new Stmt\Const_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 104 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_FUNCTION; - }, 105 => function ($stackPos) { - $this->semValue = Stmt\Use_::TYPE_CONSTANT; - }, 106 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 6)], $this->semStack[$stackPos - (7 - 2)], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 107 => function ($stackPos) { - $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 108 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 109 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 110 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 111 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 112 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 113 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 114 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); - }, 115 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); - }, 116 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); - }, 117 => function ($stackPos) { - $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); - }, 118 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - $this->semValue->type = Stmt\Use_::TYPE_NORMAL; - }, 119 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue->type = $this->semStack[$stackPos - (2 - 1)]; - }, 120 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 121 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 122 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 123 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 124 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 125 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 126 => function ($stackPos) { - if (\is_array($this->semStack[$stackPos - (2 - 2)])) { - $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); - } else { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - } - }, 127 => function ($stackPos) { - $this->semValue = array(); - }, 128 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; - if (isset($startAttributes['comments'])) { - $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); - } else { - $nop = null; - } - if ($nop !== null) { - $this->semStack[$stackPos - (1 - 1)][] = $nop; - } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 129 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 130 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 131 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 132 => function ($stackPos) { - throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 133 => function ($stackPos) { - if ($this->semStack[$stackPos - (3 - 2)]) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - $attrs = $this->startAttributeStack[$stackPos - (3 - 1)]; - $stmts = $this->semValue; - if (!empty($attrs['comments'])) { - $stmts[0]->setAttribute('comments', \array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); - } - } else { - $startAttributes = $this->startAttributeStack[$stackPos - (3 - 1)]; - if (isset($startAttributes['comments'])) { - $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); - } else { - $this->semValue = null; - } - if (null === $this->semValue) { - $this->semValue = array(); - } - } - }, 134 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos - (5 - 2)], ['stmts' => \is_array($this->semStack[$stackPos - (5 - 3)]) ? $this->semStack[$stackPos - (5 - 3)] : array($this->semStack[$stackPos - (5 - 3)]), 'elseifs' => $this->semStack[$stackPos - (5 - 4)], 'else' => $this->semStack[$stackPos - (5 - 5)]], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 135 => function ($stackPos) { - $this->semValue = new Stmt\If_($this->semStack[$stackPos - (8 - 2)], ['stmts' => $this->semStack[$stackPos - (8 - 4)], 'elseifs' => $this->semStack[$stackPos - (8 - 5)], 'else' => $this->semStack[$stackPos - (8 - 6)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 136 => function ($stackPos) { - $this->semValue = new Stmt\While_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 137 => function ($stackPos) { - $this->semValue = new Stmt\Do_($this->semStack[$stackPos - (5 - 4)], \is_array($this->semStack[$stackPos - (5 - 2)]) ? $this->semStack[$stackPos - (5 - 2)] : array($this->semStack[$stackPos - (5 - 2)]), $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 138 => function ($stackPos) { - $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos - (9 - 3)], 'cond' => $this->semStack[$stackPos - (9 - 5)], 'loop' => $this->semStack[$stackPos - (9 - 7)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 139 => function ($stackPos) { - $this->semValue = new Stmt\Switch_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 140 => function ($stackPos) { - $this->semValue = new Stmt\Break_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 141 => function ($stackPos) { - $this->semValue = new Stmt\Break_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 142 => function ($stackPos) { - $this->semValue = new Stmt\Continue_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 143 => function ($stackPos) { - $this->semValue = new Stmt\Continue_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 144 => function ($stackPos) { - $this->semValue = new Stmt\Return_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 145 => function ($stackPos) { - $this->semValue = new Stmt\Return_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 146 => function ($stackPos) { - $this->semValue = new Stmt\Global_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 147 => function ($stackPos) { - $this->semValue = new Stmt\Static_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 148 => function ($stackPos) { - $this->semValue = new Stmt\Echo_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 149 => function ($stackPos) { - $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 150 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 151 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 152 => function ($stackPos) { - $this->semValue = new Stmt\Unset_($this->semStack[$stackPos - (5 - 3)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 153 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos - (7 - 5)][1], 'stmts' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - }, 154 => function ($stackPos) { - $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (9 - 3)], $this->semStack[$stackPos - (9 - 7)][0], ['keyVar' => $this->semStack[$stackPos - (9 - 5)], 'byRef' => $this->semStack[$stackPos - (9 - 7)][1], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - }, 155 => function ($stackPos) { - $this->semValue = new Stmt\Declare_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 156 => function ($stackPos) { - $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 5)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - $this->checkTryCatch($this->semValue); - }, 157 => function ($stackPos) { - $this->semValue = new Stmt\Throw_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 158 => function ($stackPos) { - $this->semValue = new Stmt\Goto_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 159 => function ($stackPos) { - $this->semValue = new Stmt\Label($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 160 => function ($stackPos) { - $this->semValue = new Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 161 => function ($stackPos) { - $this->semValue = array(); - /* means: no statement */ - }, 162 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 163 => function ($stackPos) { - $startAttributes = $this->startAttributeStack[$stackPos - (1 - 1)]; - if (isset($startAttributes['comments'])) { - $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); - } else { - $this->semValue = null; - } - if ($this->semValue === null) { - $this->semValue = array(); - } - /* means: no statement */ - }, 164 => function ($stackPos) { - $this->semValue = array(); - }, 165 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 166 => function ($stackPos) { - $this->semValue = new Stmt\Catch_(array($this->semStack[$stackPos - (8 - 3)]), $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 7)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); - }, 167 => function ($stackPos) { - $this->semValue = null; - }, 168 => function ($stackPos) { - $this->semValue = new Stmt\Finally_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 169 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 170 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 171 => function ($stackPos) { - $this->semValue = \false; - }, 172 => function ($stackPos) { - $this->semValue = \true; - }, 173 => function ($stackPos) { - $this->semValue = \false; - }, 174 => function ($stackPos) { - $this->semValue = \true; - }, 175 => function ($stackPos) { - $this->semValue = \false; - }, 176 => function ($stackPos) { - $this->semValue = \true; - }, 177 => function ($stackPos) { - $this->semValue = new Stmt\Function_($this->semStack[$stackPos - (10 - 3)], ['byRef' => $this->semStack[$stackPos - (10 - 2)], 'params' => $this->semStack[$stackPos - (10 - 5)], 'returnType' => $this->semStack[$stackPos - (10 - 7)], 'stmts' => $this->semStack[$stackPos - (10 - 9)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); - }, 178 => function ($stackPos) { - $this->semValue = new Stmt\Class_($this->semStack[$stackPos - (7 - 2)], ['type' => $this->semStack[$stackPos - (7 - 1)], 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); - $this->checkClass($this->semValue, $stackPos - (7 - 2)); - }, 179 => function ($stackPos) { - $this->semValue = new Stmt\Interface_($this->semStack[$stackPos - (6 - 2)], ['extends' => $this->semStack[$stackPos - (6 - 3)], 'stmts' => $this->semStack[$stackPos - (6 - 5)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - $this->checkInterface($this->semValue, $stackPos - (6 - 2)); - }, 180 => function ($stackPos) { - $this->semValue = new Stmt\Trait_($this->semStack[$stackPos - (5 - 2)], ['stmts' => $this->semStack[$stackPos - (5 - 4)]], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 181 => function ($stackPos) { - $this->semValue = 0; - }, 182 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, 183 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, 184 => function ($stackPos) { - $this->semValue = null; - }, 185 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 186 => function ($stackPos) { - $this->semValue = array(); - }, 187 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 188 => function ($stackPos) { - $this->semValue = array(); - }, 189 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 190 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 191 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 192 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 193 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 194 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 195 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 196 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 197 => function ($stackPos) { - $this->semValue = null; - }, 198 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 199 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 200 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 201 => function ($stackPos) { - $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 202 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 203 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 3)]; - }, 204 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 205 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (5 - 3)]; - }, 206 => function ($stackPos) { - $this->semValue = array(); - }, 207 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 208 => function ($stackPos) { - $this->semValue = new Stmt\Case_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 209 => function ($stackPos) { - $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 210 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 211 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 212 => function ($stackPos) { - $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); - }, 213 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 2)]; - }, 214 => function ($stackPos) { - $this->semValue = array(); - }, 215 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 216 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (3 - 2)], \is_array($this->semStack[$stackPos - (3 - 3)]) ? $this->semStack[$stackPos - (3 - 3)] : array($this->semStack[$stackPos - (3 - 3)]), $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 217 => function ($stackPos) { - $this->semValue = array(); - }, 218 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 219 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 220 => function ($stackPos) { - $this->semValue = null; - }, 221 => function ($stackPos) { - $this->semValue = new Stmt\Else_(\is_array($this->semStack[$stackPos - (2 - 2)]) ? $this->semStack[$stackPos - (2 - 2)] : array($this->semStack[$stackPos - (2 - 2)]), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 222 => function ($stackPos) { - $this->semValue = null; - }, 223 => function ($stackPos) { - $this->semValue = new Stmt\Else_($this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 224 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); - }, 225 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (2 - 2)], \true); - }, 226 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); - }, 227 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 228 => function ($stackPos) { - $this->semValue = array(); - }, 229 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 230 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 231 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos - (4 - 4)], null, $this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - $this->checkParam($this->semValue); - }, 232 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 6)], $this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 3)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - $this->checkParam($this->semValue); - }, 233 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 234 => function ($stackPos) { - $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 235 => function ($stackPos) { - $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 236 => function ($stackPos) { - $this->semValue = null; - }, 237 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 238 => function ($stackPos) { - $this->semValue = null; - }, 239 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 2)]; - }, 240 => function ($stackPos) { - $this->semValue = array(); - }, 241 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 242 => function ($stackPos) { - $this->semValue = array(new Node\Arg($this->semStack[$stackPos - (3 - 2)], \false, \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes)); - }, 243 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 244 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 245 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (1 - 1)], \false, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 246 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \true, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 247 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \false, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 248 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 249 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 250 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 251 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 252 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 253 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 254 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 255 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 256 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 257 => function ($stackPos) { - if ($this->semStack[$stackPos - (2 - 2)] !== null) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - } - }, 258 => function ($stackPos) { - $this->semValue = array(); - }, 259 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; - if (isset($startAttributes['comments'])) { - $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); - } else { - $nop = null; - } - if ($nop !== null) { - $this->semStack[$stackPos - (1 - 1)][] = $nop; - } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 260 => function ($stackPos) { - $this->semValue = new Stmt\Property($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - $this->checkProperty($this->semValue, $stackPos - (3 - 1)); - }, 261 => function ($stackPos) { - $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos - (3 - 2)], 0, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 262 => function ($stackPos) { - $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos - (9 - 4)], ['type' => $this->semStack[$stackPos - (9 - 1)], 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 6)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); - $this->checkClassMethod($this->semValue, $stackPos - (9 - 1)); - }, 263 => function ($stackPos) { - $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 264 => function ($stackPos) { - $this->semValue = array(); - }, 265 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 266 => function ($stackPos) { - $this->semValue = array(); - }, 267 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 268 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 269 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (5 - 1)][0], $this->semStack[$stackPos - (5 - 1)][1], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 270 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], null, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 271 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 272 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 273 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); - }, 274 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 275 => function ($stackPos) { - $this->semValue = array(null, $this->semStack[$stackPos - (1 - 1)]); - }, 276 => function ($stackPos) { - $this->semValue = null; - }, 277 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 278 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 279 => function ($stackPos) { - $this->semValue = 0; - }, 280 => function ($stackPos) { - $this->semValue = 0; - }, 281 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 282 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 283 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); - $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; - }, 284 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; - }, 285 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; - }, 286 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; - }, 287 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_STATIC; - }, 288 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; - }, 289 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; - }, 290 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 291 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 292 => function ($stackPos) { - $this->semValue = new Node\VarLikeIdentifier(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 293 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 294 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 295 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 296 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 297 => function ($stackPos) { - $this->semValue = array(); - }, 298 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 299 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 300 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 301 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 302 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 303 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 304 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 305 => function ($stackPos) { - $this->semValue = new Expr\Clone_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 306 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 307 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 308 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 309 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 310 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 311 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 312 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 313 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 314 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 315 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 316 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 317 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 318 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 319 => function ($stackPos) { - $this->semValue = new Expr\PostInc($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 320 => function ($stackPos) { - $this->semValue = new Expr\PreInc($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 321 => function ($stackPos) { - $this->semValue = new Expr\PostDec($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 322 => function ($stackPos) { - $this->semValue = new Expr\PreDec($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 323 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 324 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 325 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 326 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 327 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 328 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 329 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 330 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 331 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 332 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 333 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 334 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 335 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 336 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 337 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 338 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 339 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 340 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 341 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 342 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 343 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 344 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 345 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 346 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 347 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 348 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 349 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 350 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 351 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 352 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 353 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 354 => function ($stackPos) { - $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 355 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 356 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 357 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 358 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 359 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 360 => function ($stackPos) { - $this->semValue = new Expr\Isset_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 361 => function ($stackPos) { - $this->semValue = new Expr\Empty_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 362 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 363 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 364 => function ($stackPos) { - $this->semValue = new Expr\Eval_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 365 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 366 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 367 => function ($stackPos) { - $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 368 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; - $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos - (2 - 1)]); - $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos - (2 - 2)], $attrs); - }, 369 => function ($stackPos) { - $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 370 => function ($stackPos) { - $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 371 => function ($stackPos) { - $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 372 => function ($stackPos) { - $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 373 => function ($stackPos) { - $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 374 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; - $attrs['kind'] = \strtolower($this->semStack[$stackPos - (2 - 1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; - $this->semValue = new Expr\Exit_($this->semStack[$stackPos - (2 - 2)], $attrs); - }, 375 => function ($stackPos) { - $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 376 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 377 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 378 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 379 => function ($stackPos) { - $this->semValue = new Expr\ShellExec($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 380 => function ($stackPos) { - $this->semValue = new Expr\Print_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 381 => function ($stackPos) { - $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 382 => function ($stackPos) { - $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 383 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (10 - 2)], 'params' => $this->semStack[$stackPos - (10 - 4)], 'uses' => $this->semStack[$stackPos - (10 - 6)], 'returnType' => $this->semStack[$stackPos - (10 - 7)], 'stmts' => $this->semStack[$stackPos - (10 - 9)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); - }, 384 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (11 - 3)], 'params' => $this->semStack[$stackPos - (11 - 5)], 'uses' => $this->semStack[$stackPos - (11 - 7)], 'returnType' => $this->semStack[$stackPos - (11 - 8)], 'stmts' => $this->semStack[$stackPos - (11 - 10)]], $this->startAttributeStack[$stackPos - (11 - 1)] + $this->endAttributes); - }, 385 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 386 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 387 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (2 - 2)], null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 388 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 389 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes; - $attrs['kind'] = Expr\Array_::KIND_LONG; - $this->semValue = new Expr\Array_($this->semStack[$stackPos - (4 - 3)], $attrs); - }, 390 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; - $attrs['kind'] = Expr\Array_::KIND_SHORT; - $this->semValue = new Expr\Array_($this->semStack[$stackPos - (3 - 2)], $attrs); - }, 391 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 392 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes; - $attrs['kind'] = $this->semStack[$stackPos - (4 - 1)][0] === "'" || $this->semStack[$stackPos - (4 - 1)][1] === "'" && ($this->semStack[$stackPos - (4 - 1)][0] === 'b' || $this->semStack[$stackPos - (4 - 1)][0] === 'B') ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED; - $this->semValue = new Expr\ArrayDimFetch(new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos - (4 - 1)]), $attrs), $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 393 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 394 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 395 => function ($stackPos) { - $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes), $this->semStack[$stackPos - (7 - 2)]); - $this->checkClass($this->semValue[0], -1); - }, 396 => function ($stackPos) { - $this->semValue = new Expr\New_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 397 => function ($stackPos) { - list($class, $ctorArgs) = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 398 => function ($stackPos) { - $this->semValue = array(); - }, 399 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (4 - 3)]; - }, 400 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 401 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 402 => function ($stackPos) { - $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos - (2 - 2)], $this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 403 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 404 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 405 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 406 => function ($stackPos) { - $this->semValue = $this->fixupPhp5StaticPropCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 407 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 408 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 409 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 410 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 411 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 412 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 413 => function ($stackPos) { - $this->semValue = new Name\FullyQualified(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 414 => function ($stackPos) { - $this->semValue = new Name\Relative(\substr($this->semStack[$stackPos - (1 - 1)], 10), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 415 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 416 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 417 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 418 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 419 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 420 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 421 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 422 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 423 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 424 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 425 => function ($stackPos) { - $this->semValue = null; - }, 426 => function ($stackPos) { - $this->semValue = null; - }, 427 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 428 => function ($stackPos) { - $this->semValue = array(); - }, 429 => function ($stackPos) { - $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos - (1 - 1)], '`', \false), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes)); - }, 430 => function ($stackPos) { - foreach ($this->semStack[$stackPos - (1 - 1)] as $s) { - if ($s instanceof Node\Scalar\EncapsedStringPart) { - $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', \false); - } - } - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 431 => function ($stackPos) { - $this->semValue = array(); - }, 432 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 433 => function ($stackPos) { - $this->semValue = $this->parseLNumber($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes, \true); - }, 434 => function ($stackPos) { - $this->semValue = new Scalar\DNumber(Scalar\DNumber::parse($this->semStack[$stackPos - (1 - 1)]), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 435 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes; - $attrs['kind'] = $this->semStack[$stackPos - (1 - 1)][0] === "'" || $this->semStack[$stackPos - (1 - 1)][1] === "'" && ($this->semStack[$stackPos - (1 - 1)][0] === 'b' || $this->semStack[$stackPos - (1 - 1)][0] === 'B') ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED; - $this->semValue = new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos - (1 - 1)], \false), $attrs); - }, 436 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 437 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 438 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 439 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 440 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 441 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 442 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 443 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 444 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \false); - }, 445 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos - (2 - 1)], '', $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (2 - 2)] + $this->endAttributeStack[$stackPos - (2 - 2)], \false); - }, 446 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 447 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 448 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 449 => function ($stackPos) { - $this->semValue = new Expr\Array_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 450 => function ($stackPos) { - $this->semValue = new Expr\Array_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 451 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 452 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 453 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 454 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 455 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 456 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 457 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 458 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 459 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 460 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 461 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 462 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 463 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 464 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 465 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 466 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 467 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 468 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 469 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 470 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 471 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 472 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 473 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 474 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 475 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 476 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 477 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 478 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 479 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 480 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 481 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 482 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); - }, 483 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 484 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 485 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 486 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 487 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 488 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 489 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 490 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; - $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - foreach ($this->semStack[$stackPos - (3 - 2)] as $s) { - if ($s instanceof Node\Scalar\EncapsedStringPart) { - $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', \true); - } - } - $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos - (3 - 2)], $attrs); - }, 491 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true); - }, 492 => function ($stackPos) { - $this->semValue = array(); - }, 493 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 494 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 495 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, 496 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 497 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 498 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 499 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 500 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 501 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 502 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 503 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 504 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 505 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 506 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 507 => function ($stackPos) { - $this->semValue = new Expr\MethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 508 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 509 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 510 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 511 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 512 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 513 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 514 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 515 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 516 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 517 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 518 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 519 => function ($stackPos) { - $var = \substr($this->semStack[$stackPos - (1 - 1)], 1); - $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes) : $var; - }, 520 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 521 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 522 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 523 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 524 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 525 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 526 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 527 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 528 => function ($stackPos) { - $this->semValue = null; - }, 529 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 530 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 531 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 532 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 533 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - $this->errorState = 2; - }, 534 => function ($stackPos) { - $this->semValue = new Expr\List_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 535 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 536 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 537 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 538 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 539 => function ($stackPos) { - $this->semValue = null; - }, 540 => function ($stackPos) { - $this->semValue = array(); - }, 541 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 542 => function ($stackPos) { - $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; - $this->semValue = $this->semStack[$stackPos - (3 - 1)]; - }, 543 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 544 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 545 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 546 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 1)], \true, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 547 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 548 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); - }, 549 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 550 => function ($stackPos) { - $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; - $this->semValue = $this->semStack[$stackPos - (2 - 1)]; - }, 551 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); - }, 552 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); - }, 553 => function ($stackPos) { - $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 554 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 555 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }, 556 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); - }, 557 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 558 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 559 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); - }, 560 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 4)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); - }, 561 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (3 - 2)]; - }, 562 => function ($stackPos) { - $this->semValue = new Scalar\String_($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 563 => function ($stackPos) { - $this->semValue = $this->parseNumString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); - }, 564 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos - (1 - 1)]; - }]; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Timer; - -use function array_pop; -use function hrtime; -final class Timer -{ - /** - * @psalm-var list - */ - private $startTimes = []; - public function start() : void - { - $this->startTimes[] = (float) hrtime(\true); - } - /** - * @throws NoActiveTimerException - */ - public function stop() : Duration - { - if (empty($this->startTimes)) { - throw new NoActiveTimerException('Timer::start() has to be called before Timer::stop()'); - } - return Duration::fromNanoseconds((float) hrtime(\true) - array_pop($this->startTimes)); - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Timer; - -use function is_float; -use function memory_get_peak_usage; -use function microtime; -use function sprintf; -final class ResourceUsageFormatter -{ - /** - * @psalm-var array - */ - private const SIZES = ['GB' => 1073741824, 'MB' => 1048576, 'KB' => 1024]; - public function resourceUsage(Duration $duration) : string - { - return sprintf('Time: %s, Memory: %s', $duration->asString(), $this->bytesToString(memory_get_peak_usage(\true))); - } - /** - * @throws TimeSinceStartOfRequestNotAvailableException - */ - public function resourceUsageSinceStartOfRequest() : string - { - if (!isset($_SERVER['REQUEST_TIME_FLOAT'])) { - throw new TimeSinceStartOfRequestNotAvailableException('Cannot determine time at which the request started because $_SERVER[\'REQUEST_TIME_FLOAT\'] is not available'); - } - if (!is_float($_SERVER['REQUEST_TIME_FLOAT'])) { - throw new TimeSinceStartOfRequestNotAvailableException('Cannot determine time at which the request started because $_SERVER[\'REQUEST_TIME_FLOAT\'] is not of type float'); - } - return $this->resourceUsage(Duration::fromMicroseconds(1000000 * (microtime(\true) - $_SERVER['REQUEST_TIME_FLOAT']))); - } - private function bytesToString(int $bytes) : string - { - foreach (self::SIZES as $unit => $value) { - if ($bytes >= $value) { - return sprintf('%.2f %s', $bytes >= 1024 ? $bytes / $value : $bytes, $unit); - } - } - // @codeCoverageIgnoreStart - return $bytes . ' byte' . ($bytes !== 1 ? 's' : ''); - // @codeCoverageIgnoreEnd - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Timer; - -use function floor; -use function sprintf; -/** - * @psalm-immutable - */ -final class Duration -{ - /** - * @var float - */ - private $nanoseconds; - /** - * @var int - */ - private $hours; - /** - * @var int - */ - private $minutes; - /** - * @var int - */ - private $seconds; - /** - * @var int - */ - private $milliseconds; - public static function fromMicroseconds(float $microseconds) : self - { - return new self($microseconds * 1000); - } - public static function fromNanoseconds(float $nanoseconds) : self - { - return new self($nanoseconds); - } - private function __construct(float $nanoseconds) - { - $this->nanoseconds = $nanoseconds; - $timeInMilliseconds = $nanoseconds / 1000000; - $hours = floor($timeInMilliseconds / 60 / 60 / 1000); - $hoursInMilliseconds = $hours * 60 * 60 * 1000; - $minutes = floor($timeInMilliseconds / 60 / 1000) % 60; - $minutesInMilliseconds = $minutes * 60 * 1000; - $seconds = floor(($timeInMilliseconds - $hoursInMilliseconds - $minutesInMilliseconds) / 1000); - $secondsInMilliseconds = $seconds * 1000; - $milliseconds = $timeInMilliseconds - $hoursInMilliseconds - $minutesInMilliseconds - $secondsInMilliseconds; - $this->hours = (int) $hours; - $this->minutes = $minutes; - $this->seconds = (int) $seconds; - $this->milliseconds = (int) $milliseconds; - } - public function asNanoseconds() : float - { - return $this->nanoseconds; - } - public function asMicroseconds() : float - { - return $this->nanoseconds / 1000; - } - public function asMilliseconds() : float - { - return $this->nanoseconds / 1000000; - } - public function asSeconds() : float - { - return $this->nanoseconds / 1000000000; - } - public function asString() : string - { - $result = ''; - if ($this->hours > 0) { - $result = sprintf('%02d', $this->hours) . ':'; - } - $result .= sprintf('%02d', $this->minutes) . ':'; - $result .= sprintf('%02d', $this->seconds); - if ($this->milliseconds > 0) { - $result .= '.' . sprintf('%03d', $this->milliseconds); - } - return $result; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Timer; - -use LogicException; -final class NoActiveTimerException extends LogicException implements Exception -{ -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Timer; - -use RuntimeException; -final class TimeSinceStartOfRequestNotAvailableException extends RuntimeException implements Exception -{ -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Timer; - -use Throwable; -interface Exception extends Throwable -{ -} -phpunit/php-timer - -Copyright (c) 2010-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\GlobalState; - -use function array_keys; -use function array_merge; -use function array_reverse; -use function func_get_args; -use function get_declared_classes; -use function get_declared_interfaces; -use function get_declared_traits; -use function get_defined_constants; -use function get_defined_functions; -use function get_included_files; -use function in_array; -use function ini_get_all; -use function is_array; -use function is_object; -use function is_resource; -use function is_scalar; -use function serialize; -use function unserialize; -use ReflectionClass; -use PHPUnit\SebastianBergmann\ObjectReflector\ObjectReflector; -use PHPUnit\SebastianBergmann\RecursionContext\Context; -use Throwable; -/** - * A snapshot of global state. - */ -class Snapshot -{ - /** - * @var ExcludeList - */ - private $excludeList; - /** - * @var array - */ - private $globalVariables = []; - /** - * @var array - */ - private $superGlobalArrays = []; - /** - * @var array - */ - private $superGlobalVariables = []; - /** - * @var array - */ - private $staticAttributes = []; - /** - * @var array - */ - private $iniSettings = []; - /** - * @var array - */ - private $includedFiles = []; - /** - * @var array - */ - private $constants = []; - /** - * @var array - */ - private $functions = []; - /** - * @var array - */ - private $interfaces = []; - /** - * @var array - */ - private $classes = []; - /** - * @var array - */ - private $traits = []; - /** - * Creates a snapshot of the current global state. - */ - public function __construct(ExcludeList $excludeList = null, bool $includeGlobalVariables = \true, bool $includeStaticAttributes = \true, bool $includeConstants = \true, bool $includeFunctions = \true, bool $includeClasses = \true, bool $includeInterfaces = \true, bool $includeTraits = \true, bool $includeIniSettings = \true, bool $includeIncludedFiles = \true) - { - $this->excludeList = $excludeList ?: new ExcludeList(); - if ($includeConstants) { - $this->snapshotConstants(); - } - if ($includeFunctions) { - $this->snapshotFunctions(); - } - if ($includeClasses || $includeStaticAttributes) { - $this->snapshotClasses(); - } - if ($includeInterfaces) { - $this->snapshotInterfaces(); - } - if ($includeGlobalVariables) { - $this->setupSuperGlobalArrays(); - $this->snapshotGlobals(); - } - if ($includeStaticAttributes) { - $this->snapshotStaticAttributes(); - } - if ($includeIniSettings) { - $this->iniSettings = ini_get_all(null, \false); - } - if ($includeIncludedFiles) { - $this->includedFiles = get_included_files(); - } - $this->traits = get_declared_traits(); - } - public function excludeList() : ExcludeList - { - return $this->excludeList; - } - public function globalVariables() : array - { - return $this->globalVariables; - } - public function superGlobalVariables() : array - { - return $this->superGlobalVariables; - } - public function superGlobalArrays() : array - { - return $this->superGlobalArrays; - } - public function staticAttributes() : array - { - return $this->staticAttributes; - } - public function iniSettings() : array - { - return $this->iniSettings; - } - public function includedFiles() : array - { - return $this->includedFiles; - } - public function constants() : array - { - return $this->constants; - } - public function functions() : array - { - return $this->functions; - } - public function interfaces() : array - { - return $this->interfaces; - } - public function classes() : array - { - return $this->classes; - } - public function traits() : array - { - return $this->traits; - } - /** - * Creates a snapshot user-defined constants. - */ - private function snapshotConstants() : void - { - $constants = get_defined_constants(\true); - if (isset($constants['user'])) { - $this->constants = $constants['user']; - } - } - /** - * Creates a snapshot user-defined functions. - */ - private function snapshotFunctions() : void - { - $functions = get_defined_functions(); - $this->functions = $functions['user']; - } - /** - * Creates a snapshot user-defined classes. - */ - private function snapshotClasses() : void - { - foreach (array_reverse(get_declared_classes()) as $className) { - $class = new ReflectionClass($className); - if (!$class->isUserDefined()) { - break; - } - $this->classes[] = $className; - } - $this->classes = array_reverse($this->classes); - } - /** - * Creates a snapshot user-defined interfaces. - */ - private function snapshotInterfaces() : void - { - foreach (array_reverse(get_declared_interfaces()) as $interfaceName) { - $class = new ReflectionClass($interfaceName); - if (!$class->isUserDefined()) { - break; - } - $this->interfaces[] = $interfaceName; - } - $this->interfaces = array_reverse($this->interfaces); - } - /** - * Creates a snapshot of all global and super-global variables. - */ - private function snapshotGlobals() : void - { - $superGlobalArrays = $this->superGlobalArrays(); - foreach ($superGlobalArrays as $superGlobalArray) { - $this->snapshotSuperGlobalArray($superGlobalArray); - } - foreach (array_keys($GLOBALS) as $key) { - if ($key !== 'GLOBALS' && !in_array($key, $superGlobalArrays, \true) && $this->canBeSerialized($GLOBALS[$key]) && !$this->excludeList->isGlobalVariableExcluded($key)) { - /* @noinspection UnserializeExploitsInspection */ - $this->globalVariables[$key] = unserialize(serialize($GLOBALS[$key])); - } - } - } - /** - * Creates a snapshot a super-global variable array. - */ - private function snapshotSuperGlobalArray(string $superGlobalArray) : void - { - $this->superGlobalVariables[$superGlobalArray] = []; - if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray])) { - foreach ($GLOBALS[$superGlobalArray] as $key => $value) { - /* @noinspection UnserializeExploitsInspection */ - $this->superGlobalVariables[$superGlobalArray][$key] = unserialize(serialize($value)); - } - } - } - /** - * Creates a snapshot of all static attributes in user-defined classes. - */ - private function snapshotStaticAttributes() : void - { - foreach ($this->classes as $className) { - $class = new ReflectionClass($className); - $snapshot = []; - foreach ($class->getProperties() as $attribute) { - if ($attribute->isStatic()) { - $name = $attribute->getName(); - if ($this->excludeList->isStaticAttributeExcluded($className, $name)) { - continue; - } - $attribute->setAccessible(\true); - $value = $attribute->getValue(); - if ($this->canBeSerialized($value)) { - /* @noinspection UnserializeExploitsInspection */ - $snapshot[$name] = unserialize(serialize($value)); - } - } - } - if (!empty($snapshot)) { - $this->staticAttributes[$className] = $snapshot; - } - } - } - /** - * Returns a list of all super-global variable arrays. - */ - private function setupSuperGlobalArrays() : void - { - $this->superGlobalArrays = ['_ENV', '_POST', '_GET', '_COOKIE', '_SERVER', '_FILES', '_REQUEST']; - } - private function canBeSerialized($variable) : bool - { - if (is_scalar($variable) || $variable === null) { - return \true; - } - if (is_resource($variable)) { - return \false; - } - foreach ($this->enumerateObjectsAndResources($variable) as $value) { - if (is_resource($value)) { - return \false; - } - if (is_object($value)) { - $class = new ReflectionClass($value); - if ($class->isAnonymous()) { - return \false; - } - try { - @serialize($value); - } catch (Throwable $t) { - return \false; - } - } - } - return \true; - } - private function enumerateObjectsAndResources($variable) : array - { - if (isset(func_get_args()[1])) { - $processed = func_get_args()[1]; - } else { - $processed = new Context(); - } - $result = []; - if ($processed->contains($variable)) { - return $result; - } - $array = $variable; - $processed->add($variable); - if (is_array($variable)) { - foreach ($array as $element) { - if (!is_array($element) && !is_object($element) && !is_resource($element)) { - continue; - } - if (!is_resource($element)) { - /** @noinspection SlowArrayOperationsInLoopInspection */ - $result = array_merge($result, $this->enumerateObjectsAndResources($element, $processed)); - } else { - $result[] = $element; - } - } - } else { - $result[] = $variable; - foreach ((new ObjectReflector())->getAttributes($variable) as $value) { - if (!is_array($value) && !is_object($value) && !is_resource($value)) { - continue; - } - if (!is_resource($value)) { - /** @noinspection SlowArrayOperationsInLoopInspection */ - $result = array_merge($result, $this->enumerateObjectsAndResources($value, $processed)); - } else { - $result[] = $value; - } - } - } - return $result; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\GlobalState; - -use const PHP_EOL; -use function is_array; -use function is_scalar; -use function serialize; -use function sprintf; -use function var_export; -/** - * Exports parts of a Snapshot as PHP code. - */ -final class CodeExporter -{ - public function constants(Snapshot $snapshot) : string - { - $result = ''; - foreach ($snapshot->constants() as $name => $value) { - $result .= sprintf('if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", $name, $name, $this->exportVariable($value)); - } - return $result; - } - public function globalVariables(Snapshot $snapshot) : string - { - $result = <<<'EOT' -call_user_func( - function () - { - foreach (array_keys($GLOBALS) as $key) { - unset($GLOBALS[$key]); - } - } -); - - -EOT; - foreach ($snapshot->globalVariables() as $name => $value) { - $result .= sprintf('$GLOBALS[%s] = %s;' . \PHP_EOL, $this->exportVariable($name), $this->exportVariable($value)); - } - return $result; - } - public function iniSettings(Snapshot $snapshot) : string - { - $result = ''; - foreach ($snapshot->iniSettings() as $key => $value) { - $result .= sprintf('@ini_set(%s, %s);' . "\n", $this->exportVariable($key), $this->exportVariable($value)); - } - return $result; - } - private function exportVariable($variable) : string - { - if (is_scalar($variable) || null === $variable || is_array($variable) && $this->arrayOnlyContainsScalars($variable)) { - return var_export($variable, \true); - } - return 'unserialize(' . var_export(serialize($variable), \true) . ')'; - } - private function arrayOnlyContainsScalars(array $array) : bool - { - $result = \true; - foreach ($array as $element) { - if (is_array($element)) { - $result = $this->arrayOnlyContainsScalars($element); - } elseif (!is_scalar($element) && null !== $element) { - $result = \false; - } - if ($result === \false) { - break; - } - } - return $result; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\GlobalState; - -use function array_diff; -use function array_key_exists; -use function array_keys; -use function array_merge; -use function function_exists; -use function get_defined_functions; -use function in_array; -use function is_array; -use ReflectionClass; -use ReflectionProperty; -/** - * Restorer of snapshots of global state. - */ -class Restorer -{ - /** - * Deletes function definitions that are not defined in a snapshot. - * - * @throws RuntimeException when the uopz_delete() function is not available - * - * @see https://github.com/krakjoe/uopz - */ - public function restoreFunctions(Snapshot $snapshot) : void - { - if (!function_exists('PHPUnit\\uopz_delete')) { - throw new RuntimeException('The uopz_delete() function is required for this operation'); - } - $functions = get_defined_functions(); - foreach (array_diff($functions['user'], $snapshot->functions()) as $function) { - uopz_delete($function); - } - } - /** - * Restores all global and super-global variables from a snapshot. - */ - public function restoreGlobalVariables(Snapshot $snapshot) : void - { - $superGlobalArrays = $snapshot->superGlobalArrays(); - foreach ($superGlobalArrays as $superGlobalArray) { - $this->restoreSuperGlobalArray($snapshot, $superGlobalArray); - } - $globalVariables = $snapshot->globalVariables(); - foreach (array_keys($GLOBALS) as $key) { - if ($key !== 'GLOBALS' && !in_array($key, $superGlobalArrays, \true) && !$snapshot->excludeList()->isGlobalVariableExcluded($key)) { - if (array_key_exists($key, $globalVariables)) { - $GLOBALS[$key] = $globalVariables[$key]; - } else { - unset($GLOBALS[$key]); - } - } - } - } - /** - * Restores all static attributes in user-defined classes from this snapshot. - */ - public function restoreStaticAttributes(Snapshot $snapshot) : void - { - $current = new Snapshot($snapshot->excludeList(), \false, \false, \false, \false, \true, \false, \false, \false, \false); - $newClasses = array_diff($current->classes(), $snapshot->classes()); - unset($current); - foreach ($snapshot->staticAttributes() as $className => $staticAttributes) { - foreach ($staticAttributes as $name => $value) { - $reflector = new ReflectionProperty($className, $name); - $reflector->setAccessible(\true); - $reflector->setValue($value); - } - } - foreach ($newClasses as $className) { - $class = new ReflectionClass($className); - $defaults = $class->getDefaultProperties(); - foreach ($class->getProperties() as $attribute) { - if (!$attribute->isStatic()) { - continue; - } - $name = $attribute->getName(); - if ($snapshot->excludeList()->isStaticAttributeExcluded($className, $name)) { - continue; - } - if (!isset($defaults[$name])) { - continue; - } - $attribute->setAccessible(\true); - $attribute->setValue($defaults[$name]); - } - } - } - /** - * Restores a super-global variable array from this snapshot. - */ - private function restoreSuperGlobalArray(Snapshot $snapshot, string $superGlobalArray) : void - { - $superGlobalVariables = $snapshot->superGlobalVariables(); - if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray]) && isset($superGlobalVariables[$superGlobalArray])) { - $keys = array_keys(array_merge($GLOBALS[$superGlobalArray], $superGlobalVariables[$superGlobalArray])); - foreach ($keys as $key) { - if (isset($superGlobalVariables[$superGlobalArray][$key])) { - $GLOBALS[$superGlobalArray][$key] = $superGlobalVariables[$superGlobalArray][$key]; - } else { - unset($GLOBALS[$superGlobalArray][$key]); - } - } - } - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\GlobalState; - -final class RuntimeException extends \RuntimeException implements Exception -{ -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\GlobalState; - -use Throwable; -interface Exception extends Throwable -{ -} -sebastian/global-state - -Copyright (c) 2001-2021, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\GlobalState; - -use function in_array; -use function strpos; -use ReflectionClass; -final class ExcludeList -{ - /** - * @var array - */ - private $globalVariables = []; - /** - * @var string[] - */ - private $classes = []; - /** - * @var string[] - */ - private $classNamePrefixes = []; - /** - * @var string[] - */ - private $parentClasses = []; - /** - * @var string[] - */ - private $interfaces = []; - /** - * @var array - */ - private $staticAttributes = []; - public function addGlobalVariable(string $variableName) : void - { - $this->globalVariables[$variableName] = \true; - } - public function addClass(string $className) : void - { - $this->classes[] = $className; - } - public function addSubclassesOf(string $className) : void - { - $this->parentClasses[] = $className; - } - public function addImplementorsOf(string $interfaceName) : void - { - $this->interfaces[] = $interfaceName; - } - public function addClassNamePrefix(string $classNamePrefix) : void - { - $this->classNamePrefixes[] = $classNamePrefix; - } - public function addStaticAttribute(string $className, string $attributeName) : void - { - if (!isset($this->staticAttributes[$className])) { - $this->staticAttributes[$className] = []; - } - $this->staticAttributes[$className][$attributeName] = \true; - } - public function isGlobalVariableExcluded(string $variableName) : bool - { - return isset($this->globalVariables[$variableName]); - } - public function isStaticAttributeExcluded(string $className, string $attributeName) : bool - { - if (in_array($className, $this->classes, \true)) { - return \true; - } - foreach ($this->classNamePrefixes as $prefix) { - if (strpos($className, $prefix) === 0) { - return \true; - } - } - $class = new ReflectionClass($className); - foreach ($this->parentClasses as $type) { - if ($class->isSubclassOf($type)) { - return \true; - } - } - foreach ($this->interfaces as $type) { - if ($class->implementsInterface($type)) { - return \true; - } - } - if (isset($this->staticAttributes[$className][$attributeName])) { - return \true; - } - return \false; - } -} -property = $property; - } - /** - * Matches a property by its name. - * - * {@inheritdoc} - */ - public function matches($object, $property) - { - return $property == $this->property; - } -} -class = $class; - $this->property = $property; - } - /** - * Matches a specific property of a specific class. - * - * {@inheritdoc} - */ - public function matches($object, $property) - { - return $object instanceof $this->class && $property == $this->property; - } -} -propertyType = $propertyType; - } - /** - * {@inheritdoc} - */ - public function matches($object, $property) - { - try { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - } catch (ReflectionException $exception) { - return \false; - } - $reflectionProperty->setAccessible(\true); - // Uninitialized properties (for PHP >7.4) - if (\method_exists($reflectionProperty, 'isInitialized') && !$reflectionProperty->isInitialized($object)) { - // null instanceof $this->propertyType - return \false; - } - return $reflectionProperty->getValue($object) instanceof $this->propertyType; - } -} -copy($value); - } -} -callback = $callable; - } - /** - * Replaces the object property by the result of the callback called with the object property. - * - * {@inheritdoc} - */ - public function apply($object, $property, $objectCopier) - { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - $reflectionProperty->setAccessible(\true); - $value = \call_user_func($this->callback, $reflectionProperty->getValue($object)); - $reflectionProperty->setValue($object, $value); - } -} -setAccessible(\true); - $reflectionProperty->setValue($object, null); - } -} -setAccessible(\true); - $oldCollection = $reflectionProperty->getValue($object); - $newCollection = $oldCollection->map(function ($item) use($objectCopier) { - return $objectCopier($item); - }); - $reflectionProperty->setValue($object, $newCollection); - } -} -setAccessible(\true); - $reflectionProperty->setValue($object, new ArrayCollection()); - } -} -__load(); - } -} -type = $type; - } - /** - * @param mixed $element - * - * @return boolean - */ - public function matches($element) - { - return \is_object($element) ? \is_a($element, $this->type) : \gettype($element) === $this->type; - } -} -callback = $callable; - } - /** - * {@inheritdoc} - */ - public function apply($element) - { - return \call_user_func($this->callback, $element); - } -} -copier = $copier; - } - /** - * {@inheritdoc} - */ - public function apply($arrayObject) - { - $clone = clone $arrayObject; - foreach ($arrayObject->getArrayCopy() as $k => $v) { - $clone->offsetSet($k, $this->copier->copy($v)); - } - return $clone; - } -} -copier = $copier; - } - /** - * {@inheritdoc} - */ - public function apply($element) - { - $newElement = clone $element; - $copy = $this->createCopyClosure(); - return $copy($newElement); - } - private function createCopyClosure() - { - $copier = $this->copier; - $copy = function (SplDoublyLinkedList $list) use($copier) { - // Replace each element in the list with a deep copy of itself - for ($i = 1; $i <= $list->count(); $i++) { - $copy = $copier->recursiveCopy($list->shift()); - $list->push($copy); - } - return $list; - }; - return Closure::bind($copy, null, DeepCopy::class); - } -} - $propertyValue) { - $copy->{$propertyName} = $propertyValue; - } - return $copy; - } -} -getProperties() does not return private properties from ancestor classes. - * - * @author muratyaman@gmail.com - * @see http://php.net/manual/en/reflectionclass.getproperties.php - * - * @param ReflectionClass $ref - * - * @return ReflectionProperty[] - */ - public static function getProperties(ReflectionClass $ref) - { - $props = $ref->getProperties(); - $propsArr = array(); - foreach ($props as $prop) { - $propertyName = $prop->getName(); - $propsArr[$propertyName] = $prop; - } - if ($parentClass = $ref->getParentClass()) { - $parentPropsArr = self::getProperties($parentClass); - foreach ($propsArr as $key => $property) { - $parentPropsArr[$key] = $property; - } - return $parentPropsArr; - } - return $propsArr; - } - /** - * Retrieves property by name from object and all its ancestors. - * - * @param object|string $object - * @param string $name - * - * @throws PropertyException - * @throws ReflectionException - * - * @return ReflectionProperty - */ - public static function getProperty($object, $name) - { - $reflection = \is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object); - if ($reflection->hasProperty($name)) { - return $reflection->getProperty($name); - } - if ($parentClass = $reflection->getParentClass()) { - return self::getProperty($parentClass->getName(), $name); - } - throw new PropertyException(\sprintf('The class "%s" doesn\'t have a property with the given name: "%s".', \is_object($object) ? \get_class($object) : $object, $name)); - } -} - Filter, 'matcher' => Matcher] pairs. - */ - private $filters = []; - /** - * Type Filters to apply. - * - * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. - */ - private $typeFilters = []; - /** - * @var bool - */ - private $skipUncloneable = \false; - /** - * @var bool - */ - private $useCloneMethod; - /** - * @param bool $useCloneMethod If set to true, when an object implements the __clone() function, it will be used - * instead of the regular deep cloning. - */ - public function __construct($useCloneMethod = \false) - { - $this->useCloneMethod = $useCloneMethod; - $this->addTypeFilter(new ArrayObjectFilter($this), new TypeMatcher(ArrayObject::class)); - $this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class)); - $this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class)); - } - /** - * If enabled, will not throw an exception when coming across an uncloneable property. - * - * @param $skipUncloneable - * - * @return $this - */ - public function skipUncloneable($skipUncloneable = \true) - { - $this->skipUncloneable = $skipUncloneable; - return $this; - } - /** - * Deep copies the given object. - * - * @param mixed $object - * - * @return mixed - */ - public function copy($object) - { - $this->hashMap = []; - return $this->recursiveCopy($object); - } - public function addFilter(Filter $filter, Matcher $matcher) - { - $this->filters[] = ['matcher' => $matcher, 'filter' => $filter]; - } - public function prependFilter(Filter $filter, Matcher $matcher) - { - \array_unshift($this->filters, ['matcher' => $matcher, 'filter' => $filter]); - } - public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher) - { - $this->typeFilters[] = ['matcher' => $matcher, 'filter' => $filter]; - } - private function recursiveCopy($var) - { - // Matches Type Filter - if ($filter = $this->getFirstMatchedTypeFilter($this->typeFilters, $var)) { - return $filter->apply($var); - } - // Resource - if (\is_resource($var)) { - return $var; - } - // Array - if (\is_array($var)) { - return $this->copyArray($var); - } - // Scalar - if (!\is_object($var)) { - return $var; - } - // Object - return $this->copyObject($var); - } - /** - * Copy an array - * @param array $array - * @return array - */ - private function copyArray(array $array) - { - foreach ($array as $key => $value) { - $array[$key] = $this->recursiveCopy($value); - } - return $array; - } - /** - * Copies an object. - * - * @param object $object - * - * @throws CloneException - * - * @return object - */ - private function copyObject($object) - { - $objectHash = \spl_object_hash($object); - if (isset($this->hashMap[$objectHash])) { - return $this->hashMap[$objectHash]; - } - $reflectedObject = new ReflectionObject($object); - $isCloneable = $reflectedObject->isCloneable(); - if (\false === $isCloneable) { - if ($this->skipUncloneable) { - $this->hashMap[$objectHash] = $object; - return $object; - } - throw new CloneException(\sprintf('The class "%s" is not cloneable.', $reflectedObject->getName())); - } - $newObject = clone $object; - $this->hashMap[$objectHash] = $newObject; - if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) { - return $newObject; - } - if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) { - return $newObject; - } - foreach (ReflectionHelper::getProperties($reflectedObject) as $property) { - $this->copyObjectProperty($newObject, $property); - } - return $newObject; - } - private function copyObjectProperty($object, ReflectionProperty $property) - { - // Ignore static properties - if ($property->isStatic()) { - return; - } - // Apply the filters - foreach ($this->filters as $item) { - /** @var Matcher $matcher */ - $matcher = $item['matcher']; - /** @var Filter $filter */ - $filter = $item['filter']; - if ($matcher->matches($object, $property->getName())) { - $filter->apply($object, $property->getName(), function ($object) { - return $this->recursiveCopy($object); - }); - // If a filter matches, we stop processing this property - return; - } - } - $property->setAccessible(\true); - // Ignore uninitialized properties (for PHP >7.4) - if (\method_exists($property, 'isInitialized') && !$property->isInitialized($object)) { - return; - } - $propertyValue = $property->getValue($object); - // Copy the property - $property->setValue($object, $this->recursiveCopy($propertyValue)); - } - /** - * Returns first filter that matches variable, `null` if no such filter found. - * - * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and - * 'matcher' with value of type {@see TypeMatcher} - * @param mixed $var - * - * @return TypeFilter|null - */ - private function getFirstMatchedTypeFilter(array $filterRecords, $var) - { - $matched = $this->first($filterRecords, function (array $record) use($var) { - /* @var TypeMatcher $matcher */ - $matcher = $record['matcher']; - return $matcher->matches($var); - }); - return isset($matched) ? $matched['filter'] : null; - } - /** - * Returns first element that matches predicate, `null` if no such element found. - * - * @param array $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs. - * @param callable $predicate Predicate arguments are: element. - * - * @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher' - * with value of type {@see TypeMatcher} or `null`. - */ - private function first(array $elements, callable $predicate) - { - foreach ($elements as $element) { - if (\call_user_func($predicate, $element)) { - return $element; - } - } - return null; - } -} -The MIT License (MIT) - -Copyright (c) 2013 My C-Sense - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -final class UnknownType extends Type -{ - public function isAssignable(Type $other) : bool - { - return \true; - } - public function name() : string - { - return 'unknown type'; - } - public function asString() : string - { - return ''; - } - /** - * @deprecated - * - * @codeCoverageIgnore - */ - public function getReturnTypeDeclaration() : string - { - return ''; - } - public function allowsNull() : bool - { - return \true; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -final class GenericObjectType extends Type -{ - /** - * @var bool - */ - private $allowsNull; - public function __construct(bool $nullable) - { - $this->allowsNull = $nullable; - } - public function isAssignable(Type $other) : bool - { - if ($this->allowsNull && $other instanceof NullType) { - return \true; - } - if (!$other instanceof ObjectType) { - return \false; - } - return \true; - } - public function name() : string - { - return 'object'; - } - public function allowsNull() : bool - { - return $this->allowsNull; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -use function count; -use function implode; -use function sort; -final class UnionType extends Type -{ - /** - * @psalm-var list - */ - private $types; - /** - * @throws RuntimeException - */ - public function __construct(Type ...$types) - { - $this->ensureMinimumOfTwoTypes(...$types); - $this->ensureOnlyValidTypes(...$types); - $this->types = $types; - } - public function isAssignable(Type $other) : bool - { - foreach ($this->types as $type) { - if ($type->isAssignable($other)) { - return \true; - } - } - return \false; - } - public function asString() : string - { - return $this->name(); - } - /** - * @deprecated - * - * @codeCoverageIgnore - */ - public function getReturnTypeDeclaration() : string - { - return ': ' . $this->name(); - } - public function name() : string - { - $types = []; - foreach ($this->types as $type) { - $types[] = $type->name(); - } - sort($types); - return implode('|', $types); - } - public function allowsNull() : bool - { - foreach ($this->types as $type) { - if ($type instanceof NullType) { - return \true; - } - } - return \false; - } - /** - * @throws RuntimeException - */ - private function ensureMinimumOfTwoTypes(Type ...$types) : void - { - if (count($types) < 2) { - throw new RuntimeException('A union type must be composed of at least two types'); - } - } - /** - * @throws RuntimeException - */ - private function ensureOnlyValidTypes(Type ...$types) : void - { - foreach ($types as $type) { - if ($type instanceof UnknownType) { - throw new RuntimeException('A union type must not be composed of an unknown type'); - } - if ($type instanceof VoidType) { - throw new RuntimeException('A union type must not be composed of a void type'); - } - } - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -final class MixedType extends Type -{ - public function isAssignable(Type $other) : bool - { - return !$other instanceof VoidType; - } - public function asString() : string - { - return 'mixed'; - } - public function name() : string - { - return 'mixed'; - } - public function allowsNull() : bool - { - return \true; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -use function assert; -use function class_exists; -use function count; -use function explode; -use function function_exists; -use function is_array; -use function is_object; -use function is_string; -use function strpos; -use Closure; -use ReflectionClass; -use ReflectionException; -use ReflectionObject; -final class CallableType extends Type -{ - /** - * @var bool - */ - private $allowsNull; - public function __construct(bool $nullable) - { - $this->allowsNull = $nullable; - } - /** - * @throws RuntimeException - */ - public function isAssignable(Type $other) : bool - { - if ($this->allowsNull && $other instanceof NullType) { - return \true; - } - if ($other instanceof self) { - return \true; - } - if ($other instanceof ObjectType) { - if ($this->isClosure($other)) { - return \true; - } - if ($this->hasInvokeMethod($other)) { - return \true; - } - } - if ($other instanceof SimpleType) { - if ($this->isFunction($other)) { - return \true; - } - if ($this->isClassCallback($other)) { - return \true; - } - if ($this->isObjectCallback($other)) { - return \true; - } - } - return \false; - } - public function name() : string - { - return 'callable'; - } - public function allowsNull() : bool - { - return $this->allowsNull; - } - private function isClosure(ObjectType $type) : bool - { - return !$type->className()->isNamespaced() && $type->className()->simpleName() === Closure::class; - } - /** - * @throws RuntimeException - */ - private function hasInvokeMethod(ObjectType $type) : bool - { - $className = $type->className()->qualifiedName(); - assert(class_exists($className)); - try { - $class = new ReflectionClass($className); - // @codeCoverageIgnoreStart - } catch (ReflectionException $e) { - throw new RuntimeException($e->getMessage(), (int) $e->getCode(), $e); - // @codeCoverageIgnoreEnd - } - if ($class->hasMethod('__invoke')) { - return \true; - } - return \false; - } - private function isFunction(SimpleType $type) : bool - { - if (!is_string($type->value())) { - return \false; - } - return function_exists($type->value()); - } - private function isObjectCallback(SimpleType $type) : bool - { - if (!is_array($type->value())) { - return \false; - } - if (count($type->value()) !== 2) { - return \false; - } - if (!is_object($type->value()[0]) || !is_string($type->value()[1])) { - return \false; - } - [$object, $methodName] = $type->value(); - return (new ReflectionObject($object))->hasMethod($methodName); - } - private function isClassCallback(SimpleType $type) : bool - { - if (!is_string($type->value()) && !is_array($type->value())) { - return \false; - } - if (is_string($type->value())) { - if (strpos($type->value(), '::') === \false) { - return \false; - } - [$className, $methodName] = explode('::', $type->value()); - } - if (is_array($type->value())) { - if (count($type->value()) !== 2) { - return \false; - } - if (!is_string($type->value()[0]) || !is_string($type->value()[1])) { - return \false; - } - [$className, $methodName] = $type->value(); - } - assert(isset($className) && is_string($className) && class_exists($className)); - assert(isset($methodName) && is_string($methodName)); - try { - $class = new ReflectionClass($className); - if ($class->hasMethod($methodName)) { - $method = $class->getMethod($methodName); - return $method->isPublic() && $method->isStatic(); - } - // @codeCoverageIgnoreStart - } catch (ReflectionException $e) { - throw new RuntimeException($e->getMessage(), (int) $e->getCode(), $e); - // @codeCoverageIgnoreEnd - } - return \false; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -final class VoidType extends Type -{ - public function isAssignable(Type $other) : bool - { - return $other instanceof self; - } - public function name() : string - { - return 'void'; - } - public function allowsNull() : bool - { - return \false; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -final class NullType extends Type -{ - public function isAssignable(Type $other) : bool - { - return !$other instanceof VoidType; - } - public function name() : string - { - return 'null'; - } - public function asString() : string - { - return 'null'; - } - /** - * @deprecated - * - * @codeCoverageIgnore - */ - public function getReturnTypeDeclaration() : string - { - return ''; - } - public function allowsNull() : bool - { - return \true; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -use function is_subclass_of; -use function strcasecmp; -final class ObjectType extends Type -{ - /** - * @var TypeName - */ - private $className; - /** - * @var bool - */ - private $allowsNull; - public function __construct(TypeName $className, bool $allowsNull) - { - $this->className = $className; - $this->allowsNull = $allowsNull; - } - public function isAssignable(Type $other) : bool - { - if ($this->allowsNull && $other instanceof NullType) { - return \true; - } - if ($other instanceof self) { - if (0 === strcasecmp($this->className->qualifiedName(), $other->className->qualifiedName())) { - return \true; - } - if (is_subclass_of($other->className->qualifiedName(), $this->className->qualifiedName(), \true)) { - return \true; - } - } - return \false; - } - public function name() : string - { - return $this->className->qualifiedName(); - } - public function allowsNull() : bool - { - return $this->allowsNull; - } - public function className() : TypeName - { - return $this->className; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -use function strtolower; -final class SimpleType extends Type -{ - /** - * @var string - */ - private $name; - /** - * @var bool - */ - private $allowsNull; - /** - * @var mixed - */ - private $value; - public function __construct(string $name, bool $nullable, $value = null) - { - $this->name = $this->normalize($name); - $this->allowsNull = $nullable; - $this->value = $value; - } - public function isAssignable(Type $other) : bool - { - if ($this->allowsNull && $other instanceof NullType) { - return \true; - } - if ($this->name === 'bool' && $other->name() === 'false') { - return \true; - } - if ($other instanceof self) { - return $this->name === $other->name; - } - return \false; - } - public function name() : string - { - return $this->name; - } - public function allowsNull() : bool - { - return $this->allowsNull; - } - public function value() - { - return $this->value; - } - private function normalize(string $name) : string - { - $name = strtolower($name); - switch ($name) { - case 'boolean': - return 'bool'; - case 'real': - case 'double': - return 'float'; - case 'integer': - return 'int'; - case '[]': - return 'array'; - default: - return $name; - } - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -use function array_pop; -use function explode; -use function implode; -use function substr; -use ReflectionClass; -final class TypeName -{ - /** - * @var ?string - */ - private $namespaceName; - /** - * @var string - */ - private $simpleName; - public static function fromQualifiedName(string $fullClassName) : self - { - if ($fullClassName[0] === '\\') { - $fullClassName = substr($fullClassName, 1); - } - $classNameParts = explode('\\', $fullClassName); - $simpleName = array_pop($classNameParts); - $namespaceName = implode('\\', $classNameParts); - return new self($namespaceName, $simpleName); - } - public static function fromReflection(ReflectionClass $type) : self - { - return new self($type->getNamespaceName(), $type->getShortName()); - } - public function __construct(?string $namespaceName, string $simpleName) - { - if ($namespaceName === '') { - $namespaceName = null; - } - $this->namespaceName = $namespaceName; - $this->simpleName = $simpleName; - } - public function namespaceName() : ?string - { - return $this->namespaceName; - } - public function simpleName() : string - { - return $this->simpleName; - } - public function qualifiedName() : string - { - return $this->namespaceName === null ? $this->simpleName : $this->namespaceName . '\\' . $this->simpleName; - } - /** - * @deprecated Use namespaceName() instead - * - * @codeCoverageIgnore - */ - public function getNamespaceName() : ?string - { - return $this->namespaceName(); - } - /** - * @deprecated Use simpleName() instead - * - * @codeCoverageIgnore - */ - public function getSimpleName() : string - { - return $this->simpleName(); - } - /** - * @deprecated Use qualifiedName() instead - * - * @codeCoverageIgnore - */ - public function getQualifiedName() : string - { - return $this->qualifiedName(); - } - public function isNamespaced() : bool - { - return $this->namespaceName !== null; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -final class StaticType extends Type -{ - /** - * @var TypeName - */ - private $className; - /** - * @var bool - */ - private $allowsNull; - public function __construct(TypeName $className, bool $allowsNull) - { - $this->className = $className; - $this->allowsNull = $allowsNull; - } - public function isAssignable(Type $other) : bool - { - if ($this->allowsNull && $other instanceof NullType) { - return \true; - } - if (!$other instanceof ObjectType) { - return \false; - } - if (0 === \strcasecmp($this->className->qualifiedName(), $other->className()->qualifiedName())) { - return \true; - } - if (\is_subclass_of($other->className()->qualifiedName(), $this->className->qualifiedName(), \true)) { - return \true; - } - return \false; - } - public function name() : string - { - return 'static'; - } - public function allowsNull() : bool - { - return $this->allowsNull; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -final class FalseType extends Type -{ - public function isAssignable(Type $other) : bool - { - if ($other instanceof self) { - return \true; - } - return $other instanceof SimpleType && $other->name() === 'bool' && $other->value() === \false; - } - public function name() : string - { - return 'false'; - } - public function allowsNull() : bool - { - return \false; - } - /** - * @deprecated - * - * @codeCoverageIgnore - * - * @throws LogicException - */ - public function getReturnTypeDeclaration() : string - { - throw new LogicException(); - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -use function assert; -use function sprintf; -use ReflectionMethod; -use ReflectionNamedType; -use ReflectionType; -use ReflectionUnionType; -final class ReflectionMapper -{ - public function fromMethodReturnType(ReflectionMethod $method) : Type - { - if (!$this->reflectionMethodHasReturnType($method)) { - return new UnknownType(); - } - $returnType = $this->reflectionMethodGetReturnType($method); - assert($returnType instanceof ReflectionNamedType || $returnType instanceof ReflectionUnionType); - if ($returnType instanceof ReflectionNamedType) { - if ($returnType->getName() === 'self') { - return ObjectType::fromName($method->getDeclaringClass()->getName(), $returnType->allowsNull()); - } - if ($returnType->getName() === 'static') { - return new StaticType(TypeName::fromReflection($method->getDeclaringClass()), $returnType->allowsNull()); - } - if ($returnType->getName() === 'mixed') { - return new MixedType(); - } - if ($returnType->getName() === 'parent') { - $parentClass = $method->getDeclaringClass()->getParentClass(); - // @codeCoverageIgnoreStart - if ($parentClass === \false) { - throw new RuntimeException(sprintf('%s::%s() has a "parent" return type declaration but %s does not have a parent class', $method->getDeclaringClass()->getName(), $method->getName(), $method->getDeclaringClass()->getName())); - } - // @codeCoverageIgnoreEnd - return ObjectType::fromName($parentClass->getName(), $returnType->allowsNull()); - } - return Type::fromName($returnType->getName(), $returnType->allowsNull()); - } - assert($returnType instanceof ReflectionUnionType); - $types = []; - foreach ($returnType->getTypes() as $type) { - assert($type instanceof ReflectionNamedType); - if ($type->getName() === 'self') { - $types[] = ObjectType::fromName($method->getDeclaringClass()->getName(), \false); - } else { - $types[] = Type::fromName($type->getName(), \false); - } - } - return new UnionType(...$types); - } - private function reflectionMethodHasReturnType(ReflectionMethod $method) : bool - { - if ($method->hasReturnType()) { - return \true; - } - if (!\method_exists($method, 'hasTentativeReturnType')) { - return \false; - } - return $method->hasTentativeReturnType(); - } - private function reflectionMethodGetReturnType(ReflectionMethod $method) : ?ReflectionType - { - if ($method->hasReturnType()) { - return $method->getReturnType(); - } - if (!\method_exists($method, 'getTentativeReturnType')) { - return null; - } - return $method->getTentativeReturnType(); - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -use function assert; -use function class_exists; -use function is_iterable; -use ReflectionClass; -use ReflectionException; -final class IterableType extends Type -{ - /** - * @var bool - */ - private $allowsNull; - public function __construct(bool $nullable) - { - $this->allowsNull = $nullable; - } - /** - * @throws RuntimeException - */ - public function isAssignable(Type $other) : bool - { - if ($this->allowsNull && $other instanceof NullType) { - return \true; - } - if ($other instanceof self) { - return \true; - } - if ($other instanceof SimpleType) { - return is_iterable($other->value()); - } - if ($other instanceof ObjectType) { - $className = $other->className()->qualifiedName(); - assert(class_exists($className)); - try { - return (new ReflectionClass($className))->isIterable(); - // @codeCoverageIgnoreStart - } catch (ReflectionException $e) { - throw new RuntimeException($e->getMessage(), (int) $e->getCode(), $e); - // @codeCoverageIgnoreEnd - } - } - return \false; - } - public function name() : string - { - return 'iterable'; - } - public function allowsNull() : bool - { - return $this->allowsNull; - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -use function get_class; -use function gettype; -use function strtolower; -abstract class Type -{ - public static function fromValue($value, bool $allowsNull) : self - { - if ($value === \false) { - return new FalseType(); - } - $typeName = gettype($value); - if ($typeName === 'object') { - return new ObjectType(TypeName::fromQualifiedName(get_class($value)), $allowsNull); - } - $type = self::fromName($typeName, $allowsNull); - if ($type instanceof SimpleType) { - $type = new SimpleType($typeName, $allowsNull, $value); - } - return $type; - } - public static function fromName(string $typeName, bool $allowsNull) : self - { - switch (strtolower($typeName)) { - case 'callable': - return new CallableType($allowsNull); - case 'false': - return new FalseType(); - case 'iterable': - return new IterableType($allowsNull); - case 'null': - return new NullType(); - case 'object': - return new GenericObjectType($allowsNull); - case 'unknown type': - return new UnknownType(); - case 'void': - return new VoidType(); - case 'array': - case 'bool': - case 'boolean': - case 'double': - case 'float': - case 'int': - case 'integer': - case 'real': - case 'resource': - case 'resource (closed)': - case 'string': - return new SimpleType($typeName, $allowsNull); - default: - return new ObjectType(TypeName::fromQualifiedName($typeName), $allowsNull); - } - } - public function asString() : string - { - return ($this->allowsNull() ? '?' : '') . $this->name(); - } - /** - * @deprecated - * - * @codeCoverageIgnore - */ - public function getReturnTypeDeclaration() : string - { - return ': ' . $this->asString(); - } - public abstract function isAssignable(Type $other) : bool; - public abstract function name() : string; - public abstract function allowsNull() : bool; -} -sebastian/type - -Copyright (c) 2019-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -final class RuntimeException extends \RuntimeException implements Exception -{ -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -final class LogicException extends \LogicException implements Exception -{ -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Type; - -use Throwable; -interface Exception extends Throwable -{ -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann; - -final class Version -{ - /** - * @var string - */ - private $path; - /** - * @var string - */ - private $release; - /** - * @var string - */ - private $version; - public function __construct(string $release, string $path) - { - $this->release = $release; - $this->path = $path; - } - public function getVersion() : string - { - if ($this->version === null) { - if (\substr_count($this->release, '.') + 1 === 3) { - $this->version = $this->release; - } else { - $this->version = $this->release . '-dev'; - } - $git = $this->getGitInformation($this->path); - if ($git) { - if (\substr_count($this->release, '.') + 1 === 3) { - $this->version = $git; - } else { - $git = \explode('-', $git); - $this->version = $this->release . '-' . \end($git); - } - } - } - return $this->version; - } - /** - * @return bool|string - */ - private function getGitInformation(string $path) - { - if (!\is_dir($path . \DIRECTORY_SEPARATOR . '.git')) { - return \false; - } - $process = \proc_open('git describe --tags', [1 => ['pipe', 'w'], 2 => ['pipe', 'w']], $pipes, $path); - if (!\is_resource($process)) { - return \false; - } - $result = \trim(\stream_get_contents($pipes[1])); - \fclose($pipes[1]); - \fclose($pipes[2]); - $returnCode = \proc_close($process); - if ($returnCode !== 0) { - return \false; - } - return $result; - } -} -Version - -Copyright (c) 2013-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 8.5 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 9.2 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 5 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 6 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 7 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 8 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 9 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 10 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 11 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 12 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 13 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 14 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 15 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 16 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 17 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 18 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 19 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 20 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 21 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 22 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 23 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 24 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 25 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 26 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 27 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 28 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 29 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 30 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 31 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 32 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 33 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 34 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 35 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 36 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 37 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 38 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 39 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 40 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 41 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 42 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 43 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 44 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 45 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 46 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 47 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 48 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 49 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 50 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 51 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 52 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 53 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 54 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 55 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 56 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 57 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 58 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 59 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 60 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 61 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 62 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 63 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 64 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 65 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 66 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 67 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 68 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 69 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 70 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 71 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 72 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 73 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 74 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 75 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 76 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 77 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 78 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 79 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 80 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 81 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 82 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 83 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 84 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 85 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 86 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 87 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 88 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 89 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 90 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 91 => function ($stackPos) { + $this->semValue = new Name(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 92 => function ($stackPos) { + $this->semValue = new Expr\Variable(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 93 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 94 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 95 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 96 => function ($stackPos) { + $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 97 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (3 - 2)], null, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); + $this->checkNamespace($this->semValue); + }, 98 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($this->semValue); + }, 99 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($this->semValue); + }, 100 => function ($stackPos) { + $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (3 - 2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 101 => function ($stackPos) { + $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 102 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 103 => function ($stackPos) { + $this->semValue = new Stmt\Const_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 104 => function ($stackPos) { + $this->semValue = Stmt\Use_::TYPE_FUNCTION; + }, 105 => function ($stackPos) { + $this->semValue = Stmt\Use_::TYPE_CONSTANT; + }, 106 => function ($stackPos) { + $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 6)], $this->semStack[$stackPos - (7 - 2)], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); + }, 107 => function ($stackPos) { + $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + }, 108 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 109 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 110 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 111 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 112 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 113 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 114 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); + }, 115 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); + }, 116 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); + }, 117 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); + }, 118 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + $this->semValue->type = Stmt\Use_::TYPE_NORMAL; + }, 119 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue->type = $this->semStack[$stackPos - (2 - 1)]; + }, 120 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 121 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 122 => function ($stackPos) { + $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 123 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 124 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 125 => function ($stackPos) { + $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 126 => function ($stackPos) { + if (\is_array($this->semStack[$stackPos - (2 - 2)])) { + $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); + } else { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + } + }, 127 => function ($stackPos) { + $this->semValue = array(); + }, 128 => function ($stackPos) { + $startAttributes = $this->lookaheadStartAttributes; + if (isset($startAttributes['comments'])) { + $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); + } else { + $nop = null; + } + if ($nop !== null) { + $this->semStack[$stackPos - (1 - 1)][] = $nop; + } + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 129 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 130 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 131 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 132 => function ($stackPos) { + throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 133 => function ($stackPos) { + if ($this->semStack[$stackPos - (3 - 2)]) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + $attrs = $this->startAttributeStack[$stackPos - (3 - 1)]; + $stmts = $this->semValue; + if (!empty($attrs['comments'])) { + $stmts[0]->setAttribute('comments', \array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); + } + } else { + $startAttributes = $this->startAttributeStack[$stackPos - (3 - 1)]; + if (isset($startAttributes['comments'])) { + $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); + } else { + $this->semValue = null; + } + if (null === $this->semValue) { + $this->semValue = array(); + } + } + }, 134 => function ($stackPos) { + $this->semValue = new Stmt\If_($this->semStack[$stackPos - (5 - 2)], ['stmts' => \is_array($this->semStack[$stackPos - (5 - 3)]) ? $this->semStack[$stackPos - (5 - 3)] : array($this->semStack[$stackPos - (5 - 3)]), 'elseifs' => $this->semStack[$stackPos - (5 - 4)], 'else' => $this->semStack[$stackPos - (5 - 5)]], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 135 => function ($stackPos) { + $this->semValue = new Stmt\If_($this->semStack[$stackPos - (8 - 2)], ['stmts' => $this->semStack[$stackPos - (8 - 4)], 'elseifs' => $this->semStack[$stackPos - (8 - 5)], 'else' => $this->semStack[$stackPos - (8 - 6)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); + }, 136 => function ($stackPos) { + $this->semValue = new Stmt\While_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 137 => function ($stackPos) { + $this->semValue = new Stmt\Do_($this->semStack[$stackPos - (5 - 4)], \is_array($this->semStack[$stackPos - (5 - 2)]) ? $this->semStack[$stackPos - (5 - 2)] : array($this->semStack[$stackPos - (5 - 2)]), $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 138 => function ($stackPos) { + $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos - (9 - 3)], 'cond' => $this->semStack[$stackPos - (9 - 5)], 'loop' => $this->semStack[$stackPos - (9 - 7)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); + }, 139 => function ($stackPos) { + $this->semValue = new Stmt\Switch_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 140 => function ($stackPos) { + $this->semValue = new Stmt\Break_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 141 => function ($stackPos) { + $this->semValue = new Stmt\Break_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 142 => function ($stackPos) { + $this->semValue = new Stmt\Continue_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 143 => function ($stackPos) { + $this->semValue = new Stmt\Continue_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 144 => function ($stackPos) { + $this->semValue = new Stmt\Return_(null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 145 => function ($stackPos) { + $this->semValue = new Stmt\Return_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 146 => function ($stackPos) { + $this->semValue = new Stmt\Global_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 147 => function ($stackPos) { + $this->semValue = new Stmt\Static_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 148 => function ($stackPos) { + $this->semValue = new Stmt\Echo_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 149 => function ($stackPos) { + $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 150 => function ($stackPos) { + $this->semValue = new Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 151 => function ($stackPos) { + $this->semValue = new Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 152 => function ($stackPos) { + $this->semValue = new Stmt\Unset_($this->semStack[$stackPos - (5 - 3)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 153 => function ($stackPos) { + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos - (7 - 5)][1], 'stmts' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); + }, 154 => function ($stackPos) { + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (9 - 3)], $this->semStack[$stackPos - (9 - 7)][0], ['keyVar' => $this->semStack[$stackPos - (9 - 5)], 'byRef' => $this->semStack[$stackPos - (9 - 7)][1], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); + }, 155 => function ($stackPos) { + $this->semValue = new Stmt\Declare_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 156 => function ($stackPos) { + $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 5)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + $this->checkTryCatch($this->semValue); + }, 157 => function ($stackPos) { + $this->semValue = new Stmt\Throw_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 158 => function ($stackPos) { + $this->semValue = new Stmt\Goto_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 159 => function ($stackPos) { + $this->semValue = new Stmt\Label($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 160 => function ($stackPos) { + $this->semValue = new Stmt\Expression($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 161 => function ($stackPos) { + $this->semValue = array(); + /* means: no statement */ + }, 162 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 163 => function ($stackPos) { + $startAttributes = $this->startAttributeStack[$stackPos - (1 - 1)]; + if (isset($startAttributes['comments'])) { + $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); + } else { + $this->semValue = null; + } + if ($this->semValue === null) { + $this->semValue = array(); + } + /* means: no statement */ + }, 164 => function ($stackPos) { + $this->semValue = array(); + }, 165 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 166 => function ($stackPos) { + $this->semValue = new Stmt\Catch_(array($this->semStack[$stackPos - (8 - 3)]), $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 7)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); + }, 167 => function ($stackPos) { + $this->semValue = null; + }, 168 => function ($stackPos) { + $this->semValue = new Stmt\Finally_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 169 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 170 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 171 => function ($stackPos) { + $this->semValue = \false; + }, 172 => function ($stackPos) { + $this->semValue = \true; + }, 173 => function ($stackPos) { + $this->semValue = \false; + }, 174 => function ($stackPos) { + $this->semValue = \true; + }, 175 => function ($stackPos) { + $this->semValue = \false; + }, 176 => function ($stackPos) { + $this->semValue = \true; + }, 177 => function ($stackPos) { + $this->semValue = new Stmt\Function_($this->semStack[$stackPos - (10 - 3)], ['byRef' => $this->semStack[$stackPos - (10 - 2)], 'params' => $this->semStack[$stackPos - (10 - 5)], 'returnType' => $this->semStack[$stackPos - (10 - 7)], 'stmts' => $this->semStack[$stackPos - (10 - 9)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); + }, 178 => function ($stackPos) { + $this->semValue = new Stmt\Class_($this->semStack[$stackPos - (7 - 2)], ['type' => $this->semStack[$stackPos - (7 - 1)], 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); + $this->checkClass($this->semValue, $stackPos - (7 - 2)); + }, 179 => function ($stackPos) { + $this->semValue = new Stmt\Interface_($this->semStack[$stackPos - (6 - 2)], ['extends' => $this->semStack[$stackPos - (6 - 3)], 'stmts' => $this->semStack[$stackPos - (6 - 5)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + $this->checkInterface($this->semValue, $stackPos - (6 - 2)); + }, 180 => function ($stackPos) { + $this->semValue = new Stmt\Trait_($this->semStack[$stackPos - (5 - 2)], ['stmts' => $this->semStack[$stackPos - (5 - 4)]], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 181 => function ($stackPos) { + $this->semValue = 0; + }, 182 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + }, 183 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_FINAL; + }, 184 => function ($stackPos) { + $this->semValue = null; + }, 185 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 2)]; + }, 186 => function ($stackPos) { + $this->semValue = array(); + }, 187 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 2)]; + }, 188 => function ($stackPos) { + $this->semValue = array(); + }, 189 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 2)]; + }, 190 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 191 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 192 => function ($stackPos) { + $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); + }, 193 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 2)]; + }, 194 => function ($stackPos) { + $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); + }, 195 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 2)]; + }, 196 => function ($stackPos) { + $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); + }, 197 => function ($stackPos) { + $this->semValue = null; + }, 198 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 2)]; + }, 199 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 200 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 201 => function ($stackPos) { + $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 202 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 203 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 3)]; + }, 204 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 2)]; + }, 205 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (5 - 3)]; + }, 206 => function ($stackPos) { + $this->semValue = array(); + }, 207 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 208 => function ($stackPos) { + $this->semValue = new Stmt\Case_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 209 => function ($stackPos) { + $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 210 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 211 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 212 => function ($stackPos) { + $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); + }, 213 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 2)]; + }, 214 => function ($stackPos) { + $this->semValue = array(); + }, 215 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 216 => function ($stackPos) { + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (3 - 2)], \is_array($this->semStack[$stackPos - (3 - 3)]) ? $this->semStack[$stackPos - (3 - 3)] : array($this->semStack[$stackPos - (3 - 3)]), $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 217 => function ($stackPos) { + $this->semValue = array(); + }, 218 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 219 => function ($stackPos) { + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 220 => function ($stackPos) { + $this->semValue = null; + }, 221 => function ($stackPos) { + $this->semValue = new Stmt\Else_(\is_array($this->semStack[$stackPos - (2 - 2)]) ? $this->semStack[$stackPos - (2 - 2)] : array($this->semStack[$stackPos - (2 - 2)]), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 222 => function ($stackPos) { + $this->semValue = null; + }, 223 => function ($stackPos) { + $this->semValue = new Stmt\Else_($this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 224 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); + }, 225 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (2 - 2)], \true); + }, 226 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); + }, 227 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 228 => function ($stackPos) { + $this->semValue = array(); + }, 229 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 230 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 231 => function ($stackPos) { + $this->semValue = new Node\Param($this->semStack[$stackPos - (4 - 4)], null, $this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + $this->checkParam($this->semValue); + }, 232 => function ($stackPos) { + $this->semValue = new Node\Param($this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 6)], $this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 3)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + $this->checkParam($this->semValue); + }, 233 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 234 => function ($stackPos) { + $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 235 => function ($stackPos) { + $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 236 => function ($stackPos) { + $this->semValue = null; + }, 237 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 238 => function ($stackPos) { + $this->semValue = null; + }, 239 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 2)]; + }, 240 => function ($stackPos) { + $this->semValue = array(); + }, 241 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 242 => function ($stackPos) { + $this->semValue = array(new Node\Arg($this->semStack[$stackPos - (3 - 2)], \false, \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes)); + }, 243 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 244 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 245 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos - (1 - 1)], \false, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 246 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \true, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 247 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \false, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 248 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 249 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 250 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 251 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 252 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 253 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 254 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 255 => function ($stackPos) { + $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 256 => function ($stackPos) { + $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 257 => function ($stackPos) { + if ($this->semStack[$stackPos - (2 - 2)] !== null) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + } + }, 258 => function ($stackPos) { + $this->semValue = array(); + }, 259 => function ($stackPos) { + $startAttributes = $this->lookaheadStartAttributes; + if (isset($startAttributes['comments'])) { + $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); + } else { + $nop = null; + } + if ($nop !== null) { + $this->semStack[$stackPos - (1 - 1)][] = $nop; + } + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 260 => function ($stackPos) { + $this->semValue = new Stmt\Property($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + $this->checkProperty($this->semValue, $stackPos - (3 - 1)); + }, 261 => function ($stackPos) { + $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos - (3 - 2)], 0, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 262 => function ($stackPos) { + $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos - (9 - 4)], ['type' => $this->semStack[$stackPos - (9 - 1)], 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 6)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); + $this->checkClassMethod($this->semValue, $stackPos - (9 - 1)); + }, 263 => function ($stackPos) { + $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 264 => function ($stackPos) { + $this->semValue = array(); + }, 265 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 266 => function ($stackPos) { + $this->semValue = array(); + }, 267 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 268 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 269 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (5 - 1)][0], $this->semStack[$stackPos - (5 - 1)][1], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 270 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], null, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 271 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 272 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 273 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); + }, 274 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 275 => function ($stackPos) { + $this->semValue = array(null, $this->semStack[$stackPos - (1 - 1)]); + }, 276 => function ($stackPos) { + $this->semValue = null; + }, 277 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 278 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 279 => function ($stackPos) { + $this->semValue = 0; + }, 280 => function ($stackPos) { + $this->semValue = 0; + }, 281 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 282 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 283 => function ($stackPos) { + $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); + $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; + }, 284 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; + }, 285 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; + }, 286 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; + }, 287 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_STATIC; + }, 288 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + }, 289 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_FINAL; + }, 290 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 291 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 292 => function ($stackPos) { + $this->semValue = new Node\VarLikeIdentifier(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 293 => function ($stackPos) { + $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 294 => function ($stackPos) { + $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 295 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 296 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 297 => function ($stackPos) { + $this->semValue = array(); + }, 298 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 299 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 300 => function ($stackPos) { + $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 301 => function ($stackPos) { + $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 302 => function ($stackPos) { + $this->semValue = new Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 303 => function ($stackPos) { + $this->semValue = new Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 304 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 305 => function ($stackPos) { + $this->semValue = new Expr\Clone_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 306 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 307 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 308 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 309 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 310 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 311 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 312 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 313 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 314 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 315 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 316 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 317 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 318 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 319 => function ($stackPos) { + $this->semValue = new Expr\PostInc($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 320 => function ($stackPos) { + $this->semValue = new Expr\PreInc($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 321 => function ($stackPos) { + $this->semValue = new Expr\PostDec($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 322 => function ($stackPos) { + $this->semValue = new Expr\PreDec($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 323 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 324 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 325 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 326 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 327 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 328 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 329 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 330 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 331 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 332 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 333 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 334 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 335 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 336 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 337 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 338 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 339 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 340 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 341 => function ($stackPos) { + $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 342 => function ($stackPos) { + $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 343 => function ($stackPos) { + $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 344 => function ($stackPos) { + $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 345 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 346 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 347 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 348 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 349 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 350 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 351 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 352 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 353 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 354 => function ($stackPos) { + $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 355 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 356 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 357 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 358 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 359 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 360 => function ($stackPos) { + $this->semValue = new Expr\Isset_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 361 => function ($stackPos) { + $this->semValue = new Expr\Empty_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 362 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 363 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 364 => function ($stackPos) { + $this->semValue = new Expr\Eval_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 365 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 366 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 367 => function ($stackPos) { + $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 368 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; + $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos - (2 - 1)]); + $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos - (2 - 2)], $attrs); + }, 369 => function ($stackPos) { + $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 370 => function ($stackPos) { + $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 371 => function ($stackPos) { + $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 372 => function ($stackPos) { + $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 373 => function ($stackPos) { + $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 374 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; + $attrs['kind'] = \strtolower($this->semStack[$stackPos - (2 - 1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; + $this->semValue = new Expr\Exit_($this->semStack[$stackPos - (2 - 2)], $attrs); + }, 375 => function ($stackPos) { + $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 376 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 377 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 378 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 379 => function ($stackPos) { + $this->semValue = new Expr\ShellExec($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 380 => function ($stackPos) { + $this->semValue = new Expr\Print_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 381 => function ($stackPos) { + $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 382 => function ($stackPos) { + $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 383 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (10 - 2)], 'params' => $this->semStack[$stackPos - (10 - 4)], 'uses' => $this->semStack[$stackPos - (10 - 6)], 'returnType' => $this->semStack[$stackPos - (10 - 7)], 'stmts' => $this->semStack[$stackPos - (10 - 9)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); + }, 384 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (11 - 3)], 'params' => $this->semStack[$stackPos - (11 - 5)], 'uses' => $this->semStack[$stackPos - (11 - 7)], 'returnType' => $this->semStack[$stackPos - (11 - 8)], 'stmts' => $this->semStack[$stackPos - (11 - 10)]], $this->startAttributeStack[$stackPos - (11 - 1)] + $this->endAttributes); + }, 385 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 386 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 387 => function ($stackPos) { + $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (2 - 2)], null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 388 => function ($stackPos) { + $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 389 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes; + $attrs['kind'] = Expr\Array_::KIND_LONG; + $this->semValue = new Expr\Array_($this->semStack[$stackPos - (4 - 3)], $attrs); + }, 390 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; + $attrs['kind'] = Expr\Array_::KIND_SHORT; + $this->semValue = new Expr\Array_($this->semStack[$stackPos - (3 - 2)], $attrs); + }, 391 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 392 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch(Scalar\String_::fromString($this->semStack[$stackPos - (4 - 1)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes), $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 393 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 394 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 395 => function ($stackPos) { + $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos - (7 - 3)], 'implements' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes), $this->semStack[$stackPos - (7 - 2)]); + $this->checkClass($this->semValue[0], -1); + }, 396 => function ($stackPos) { + $this->semValue = new Expr\New_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 397 => function ($stackPos) { + list($class, $ctorArgs) = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 398 => function ($stackPos) { + $this->semValue = array(); + }, 399 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 3)]; + }, 400 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 401 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 402 => function ($stackPos) { + $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos - (2 - 2)], $this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 403 => function ($stackPos) { + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 404 => function ($stackPos) { + $this->semValue = new Expr\StaticCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 405 => function ($stackPos) { + $this->semValue = new Expr\StaticCall($this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + }, 406 => function ($stackPos) { + $this->semValue = $this->fixupPhp5StaticPropCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 407 => function ($stackPos) { + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 408 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 409 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 410 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 411 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 412 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 413 => function ($stackPos) { + $this->semValue = new Name\FullyQualified(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 414 => function ($stackPos) { + $this->semValue = new Name\Relative(\substr($this->semStack[$stackPos - (1 - 1)], 10), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 415 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 416 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 417 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 418 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 419 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 420 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 421 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 422 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 423 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 424 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 425 => function ($stackPos) { + $this->semValue = null; + }, 426 => function ($stackPos) { + $this->semValue = null; + }, 427 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 428 => function ($stackPos) { + $this->semValue = array(); + }, 429 => function ($stackPos) { + $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos - (1 - 1)], '`', \false), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes)); + }, 430 => function ($stackPos) { + foreach ($this->semStack[$stackPos - (1 - 1)] as $s) { + if ($s instanceof Node\Scalar\EncapsedStringPart) { + $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', \false); + } + } + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 431 => function ($stackPos) { + $this->semValue = array(); + }, 432 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 433 => function ($stackPos) { + $this->semValue = $this->parseLNumber($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes, \true); + }, 434 => function ($stackPos) { + $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 435 => function ($stackPos) { + $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes, \false); + }, 436 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 437 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 438 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 439 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 440 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 441 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 442 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 443 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 444 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \false); + }, 445 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos - (2 - 1)], '', $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (2 - 2)] + $this->endAttributeStack[$stackPos - (2 - 2)], \false); + }, 446 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 447 => function ($stackPos) { + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 448 => function ($stackPos) { + $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 449 => function ($stackPos) { + $this->semValue = new Expr\Array_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 450 => function ($stackPos) { + $this->semValue = new Expr\Array_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 451 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 452 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 453 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 454 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 455 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 456 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 457 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 458 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 459 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 460 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 461 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 462 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 463 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 464 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 465 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 466 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 467 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 468 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 469 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 470 => function ($stackPos) { + $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 471 => function ($stackPos) { + $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 472 => function ($stackPos) { + $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 473 => function ($stackPos) { + $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 474 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 475 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 476 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 477 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 478 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 479 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 480 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 481 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 482 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 483 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 484 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 485 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 486 => function ($stackPos) { + $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 487 => function ($stackPos) { + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 488 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 489 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 490 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; + $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; + foreach ($this->semStack[$stackPos - (3 - 2)] as $s) { + if ($s instanceof Node\Scalar\EncapsedStringPart) { + $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', \true); + } + } + $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos - (3 - 2)], $attrs); + }, 491 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true); + }, 492 => function ($stackPos) { + $this->semValue = array(); + }, 493 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 494 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 495 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 496 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 497 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 498 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 499 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 500 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 501 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 502 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 503 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 504 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + }, 505 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 506 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 507 => function ($stackPos) { + $this->semValue = new Expr\MethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 508 => function ($stackPos) { + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 509 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 510 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 511 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 512 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 513 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 514 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 515 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 516 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 517 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 518 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 519 => function ($stackPos) { + $var = \substr($this->semStack[$stackPos - (1 - 1)], 1); + $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes) : $var; + }, 520 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 521 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (6 - 1)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + }, 522 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 523 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 524 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 525 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 526 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 527 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 528 => function ($stackPos) { + $this->semValue = null; + }, 529 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 530 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 531 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 532 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 533 => function ($stackPos) { + $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + $this->errorState = 2; + }, 534 => function ($stackPos) { + $this->semValue = new Expr\List_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 535 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 536 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 537 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 538 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 539 => function ($stackPos) { + $this->semValue = null; + }, 540 => function ($stackPos) { + $this->semValue = array(); + }, 541 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 542 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 543 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 544 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 545 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 546 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 1)], \true, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 547 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 548 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 549 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 550 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 551 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 552 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); + }, 553 => function ($stackPos) { + $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 554 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 555 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 556 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 557 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 558 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 559 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 560 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 4)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + }, 561 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 562 => function ($stackPos) { + $this->semValue = new Scalar\String_($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 563 => function ($stackPos) { + $this->semValue = $this->parseNumString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 564 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }]; + } +} +'", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", "T_UNSET_CAST", "'@'", "T_POW", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING", "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_MATCH", "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", "T_FUNCTION", "T_FN", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_FINALLY", "T_USE", "T_INSTEADOF", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC", "T_READONLY", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", "T_HALT_COMPILER", "T_CLASS", "T_TRAIT", "T_INTERFACE", "T_ENUM", "T_EXTENDS", "T_IMPLEMENTS", "T_OBJECT_OPERATOR", "T_NULLSAFE_OBJECT_OPERATOR", "T_LIST", "T_ARRAY", "T_CALLABLE", "T_CLASS_C", "T_TRAIT_C", "T_METHOD_C", "T_FUNC_C", "T_LINE", "T_FILE", "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_ELLIPSIS", "T_NAME_FULLY_QUALIFIED", "T_NAME_QUALIFIED", "T_NAME_RELATIVE", "T_ATTRIBUTE", "';'", "']'", "'{'", "'}'", "'('", "')'", "'`'", "'\"'", "'\$'"); + protected $tokenToSymbol = array(0, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 56, 166, 168, 167, 55, 168, 168, 163, 164, 53, 50, 8, 51, 52, 54, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 31, 159, 44, 16, 46, 30, 68, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 70, 168, 160, 36, 168, 165, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 161, 35, 162, 58, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 57, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158); + protected $action = array(132, 133, 134, 570, 135, 136, 0, 729, 730, 731, 137, 37, 929, 450, 451, 452, -32766, -32766, -32766, -32767, -32767, -32767, -32767, 101, 102, 103, 104, 105, 1085, 1086, 1087, 1084, 1083, 1082, 1088, 723, 722, -32766, 1275, -32766, -32766, -32766, -32766, -32766, -32766, -32766, -32767, -32767, -32767, -32767, -32767, 373, 374, 918, 2, 732, -32766, -32766, -32766, 1001, 472, 417, 150, -32766, -32766, -32766, 375, 374, 12, 267, 138, 399, 736, 737, 738, 739, 417, -32766, 423, -32766, -32766, -32766, -32766, -32766, -32766, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 770, 571, 771, 772, 773, 774, 762, 763, 339, 340, 765, 766, 751, 752, 753, 755, 756, 757, 349, 797, 798, 799, 800, 801, 802, 758, 759, 572, 573, 791, 782, 780, 781, 794, 777, 778, 323, 423, 574, 575, 776, 576, 577, 578, 579, 580, 581, -324, -585, 810, 34, 805, 779, 582, 583, -585, 139, -32766, -32766, -32766, 132, 133, 134, 570, 135, 136, 1034, 729, 730, 731, 137, 37, -32766, -32766, -32766, 544, 814, 126, -32766, 1310, -32766, -32766, -32766, -32766, -32766, -32766, -32766, 1085, 1086, 1087, 1084, 1083, 1082, 1088, 473, 723, 722, -32766, -32766, -32766, 458, 459, 81, -32766, -32766, -32766, -193, -192, 322, 898, 240, 599, 1210, 1209, 1211, 732, 816, 703, -32766, 1063, -32766, -32766, -32766, -32766, -32766, 811, -32766, -32766, -32766, 267, 138, 399, 736, 737, 738, 739, 1247, 1295, 423, 694, 1320, 35, 249, 1321, 1294, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 770, 571, 771, 772, 773, 774, 762, 763, 339, 340, 765, 766, 751, 752, 753, 755, 756, 757, 349, 797, 798, 799, 800, 801, 802, 758, 759, 572, 573, 791, 782, 780, 781, 794, 777, 778, 888, 593, 574, 575, 776, 576, 577, 578, 579, 580, 581, -324, 82, 83, 84, -585, 779, 582, 583, -585, 148, 754, 724, 725, 726, 727, 728, -582, 729, 730, 731, 767, 768, 36, -582, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, -362, 271, -362, -32766, -32766, -32766, 106, 107, 108, -268, 271, -193, -192, 109, 933, 934, 900, 732, 689, 935, 14, 288, 109, 815, -32766, 1061, -32766, -32766, 964, -86, 288, 733, 734, 735, 736, 737, 738, 739, 239, 384, 803, 11, 1077, -539, -32766, -32766, -32766, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 770, 793, 771, 772, 773, 774, 762, 763, 764, 792, 765, 766, 751, 752, 753, 755, 756, 757, 796, 797, 798, 799, 800, 801, 802, 758, 759, 760, 761, 791, 782, 780, 781, 794, 777, 778, 128, -86, 769, 775, 776, 783, 784, 786, 785, 787, 788, -576, 144, -539, -539, -576, 779, 790, 789, 49, 50, 51, 503, 52, 53, 997, 996, 995, 998, 54, 55, -111, 56, -582, 1033, 1010, -111, -582, -111, 1291, -539, -32766, -32766, 302, 1010, 1010, -111, -111, -111, -111, -111, -111, -111, -111, 1208, 841, 898, 842, 253, 807, 287, 306, 965, 284, 898, 723, 722, 57, 58, 287, 287, 1007, -536, 59, 308, 60, 246, 247, 61, 62, 63, 64, 65, 66, 67, 68, 695, 27, 269, 69, 439, 504, -338, 1010, 696, 1241, 1242, 505, 898, 814, 640, 25, 898, 1239, 41, 24, 506, 320, 507, 1235, 508, 1009, 509, 149, 402, 510, 511, 841, 805, 842, 43, 44, 440, 370, 369, 898, 45, 512, 698, 1210, 1209, 1211, 361, 335, 1215, 809, -536, -536, 336, 888, 691, 513, 514, 515, 1215, 1007, 1062, 888, 715, 1007, 337, -536, 363, 516, 517, 705, 1229, 1230, 1231, 1232, 1226, 1227, 294, -536, -16, -542, 813, 1010, 1233, 1228, 367, 1010, 1210, 1209, 1211, 295, -153, -153, -153, 382, 70, 888, 318, 319, 322, 888, 659, 660, -535, 1206, 814, -153, 279, -153, 435, -153, 279, -153, 436, 141, 103, 104, 105, 632, 633, 322, 437, 368, 888, -32766, -32766, 371, 372, 438, 900, 814, 689, 820, -111, -111, 376, 377, 950, -111, 689, 814, -88, 151, 874, -111, -111, -111, -111, 31, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 723, 722, 1206, 153, 154, -535, -535, 155, 898, 900, 157, 689, 1206, 900, -111, 689, -153, 32, 123, 898, -535, 124, 140, -32766, -537, 129, 130, 143, 322, 1122, 1124, 158, -535, -32766, -541, -534, 900, -32766, 689, 159, -534, 723, 722, 1208, 295, 160, 161, -79, -75, 74, -32766, -32766, -32766, 322, -32766, -73, -32766, -298, -32766, 74, -294, -32766, -72, 322, -71, -70, -32766, -32766, -32766, -69, -68, -67, -32766, -32766, 27, -66, -47, 1215, -32766, 414, -18, 147, 275, 270, 281, 704, 814, -32766, -537, -537, 1239, 888, 707, 897, 146, 276, 48, -4, 898, -534, -534, 282, 888, -537, -534, -534, 283, -246, -246, -246, 329, 285, 271, 368, -534, -537, 286, 73, 289, -534, 1206, 47, 723, 722, -111, -111, -534, 290, 109, -111, 914, -534, 550, 669, 874, -111, -111, -111, -111, 145, 516, 517, -32766, 1229, 1230, 1231, 1232, 1226, 1227, 814, 805, 1322, 662, 300, 1092, 1233, 1228, 682, 814, -32766, 298, 299, 546, 641, 647, 1208, 900, 72, 689, -246, 319, 322, -32766, -32766, -32766, 366, -32766, 900, -32766, 689, -32766, 888, 646, -32766, 13, 296, 297, 127, -32766, -32766, -32766, 455, 1206, -51, -32766, -32766, 483, 630, 663, 556, -32766, 414, 303, 368, -111, 430, 434, 39, 930, -32766, 293, 0, 125, -32766, -111, -111, 301, 0, 0, -111, 1010, 307, 0, 0, 833, -111, -111, -111, -111, 0, -32766, 131, 0, 0, 295, 0, -32766, 1246, 0, 74, 0, 1248, 1208, 322, 0, -500, 0, 9, 0, -32766, -32766, -32766, -490, -32766, 7, -32766, 900, -32766, 689, -4, -32766, 16, 365, 597, 813, -32766, -32766, -32766, 916, 295, 709, -32766, -32766, 1240, -32766, 40, 712, -32766, 414, 713, 1208, 879, 898, 974, 951, 958, -32766, -32766, -32766, -32766, 948, -32766, 959, -32766, 877, -32766, 946, 1066, -32766, 1069, 1070, 1067, 1068, -32766, -32766, -32766, -32766, 1074, 33, -32766, -32766, 1236, 1208, 825, 1261, -32766, 414, 1279, 1313, -32766, -32766, -32766, 317, -32766, -32766, -32766, 635, -32766, 364, 690, -32766, 693, 697, 699, 478, -32766, -32766, -32766, -32766, 700, 701, -32766, -32766, 702, 1208, 562, 706, -32766, 414, 692, -570, -32766, -32766, -32766, 875, -32766, -32766, -32766, 1317, -32766, 1319, 836, -32766, 835, 844, 888, 923, -32766, -32766, -32766, 966, 843, 1318, -32766, -32766, 922, 924, 921, 1194, -32766, 414, -245, -245, -245, 907, 917, 905, 368, -32766, 956, 957, 1316, 1273, 1262, 0, 1280, 1286, 1289, -111, -111, -568, 27, -542, -111, -541, -540, 1, 28, 874, -111, -111, -111, -111, 814, 29, -32766, 38, 1239, 42, 46, 71, 1208, 75, 76, 77, 78, 79, 0, -32766, -32766, -32766, 80, -32766, 142, -32766, 152, -32766, 156, 245, -32766, 900, 324, 689, -245, -32766, -32766, -32766, 1206, 350, 351, -32766, -32766, 352, 353, 354, 355, -32766, 414, 356, 357, 358, 359, 360, 362, 431, -32766, -271, -269, 517, -268, 1229, 1230, 1231, 1232, 1226, 1227, 18, 19, 20, 21, 23, 401, 1233, 1228, 474, 475, 482, 485, 486, 487, 488, 492, 493, 494, 72, -504, 501, 319, 322, 676, 1219, 1162, 1237, 1036, 1035, 0, 1016, 1198, 1012, -273, -103, 17, 22, 26, 292, 400, 590, 594, 621, 681, 1166, 1214, 1163, 1292, 0, 1179, 0, 0, 322); + protected $actionCheck = array(2, 3, 4, 5, 6, 7, 0, 9, 10, 11, 12, 13, 128, 129, 130, 131, 9, 10, 11, 44, 45, 46, 47, 48, 49, 50, 51, 52, 116, 117, 118, 119, 120, 121, 122, 37, 38, 30, 1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 106, 107, 1, 8, 57, 9, 10, 11, 1, 31, 116, 14, 9, 10, 11, 106, 107, 8, 71, 72, 73, 74, 75, 76, 77, 116, 30, 80, 32, 33, 34, 35, 36, 30, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 70, 80, 136, 137, 138, 139, 140, 141, 142, 143, 144, 8, 1, 80, 8, 80, 150, 151, 152, 8, 154, 9, 10, 11, 2, 3, 4, 5, 6, 7, 164, 9, 10, 11, 12, 13, 9, 10, 11, 85, 82, 14, 30, 85, 32, 33, 34, 35, 36, 37, 38, 116, 117, 118, 119, 120, 121, 122, 161, 37, 38, 9, 10, 11, 134, 135, 161, 9, 10, 11, 8, 8, 167, 1, 14, 51, 155, 156, 157, 57, 1, 161, 30, 162, 32, 33, 34, 35, 30, 156, 32, 33, 34, 71, 72, 73, 74, 75, 76, 77, 146, 1, 80, 31, 80, 147, 148, 83, 8, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 84, 1, 136, 137, 138, 139, 140, 141, 142, 143, 144, 164, 9, 10, 11, 160, 150, 151, 152, 164, 154, 2, 3, 4, 5, 6, 7, 1, 9, 10, 11, 12, 13, 30, 8, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 106, 57, 108, 9, 10, 11, 53, 54, 55, 164, 57, 164, 164, 69, 117, 118, 159, 57, 161, 122, 101, 30, 69, 159, 30, 1, 32, 33, 31, 31, 30, 71, 72, 73, 74, 75, 76, 77, 97, 106, 80, 108, 123, 70, 9, 10, 11, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 8, 97, 136, 137, 138, 139, 140, 141, 142, 143, 144, 160, 8, 134, 135, 164, 150, 151, 152, 2, 3, 4, 5, 6, 7, 119, 120, 121, 122, 12, 13, 101, 15, 160, 1, 138, 106, 164, 108, 1, 161, 9, 10, 113, 138, 138, 116, 117, 118, 119, 120, 121, 122, 123, 80, 106, 1, 108, 8, 80, 163, 8, 159, 30, 1, 37, 38, 50, 51, 163, 163, 116, 70, 56, 8, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 31, 70, 71, 72, 73, 74, 162, 138, 31, 78, 79, 80, 1, 82, 75, 76, 1, 86, 87, 88, 89, 8, 91, 1, 93, 137, 95, 101, 102, 98, 99, 106, 80, 108, 103, 104, 105, 106, 107, 1, 109, 110, 31, 155, 156, 157, 115, 116, 1, 156, 134, 135, 8, 84, 161, 124, 125, 126, 1, 116, 159, 84, 161, 116, 8, 149, 8, 136, 137, 31, 139, 140, 141, 142, 143, 144, 145, 161, 31, 163, 155, 138, 151, 152, 8, 138, 155, 156, 157, 158, 75, 76, 77, 8, 163, 84, 165, 166, 167, 84, 75, 76, 70, 116, 82, 90, 163, 92, 8, 94, 163, 96, 8, 161, 50, 51, 52, 111, 112, 167, 8, 106, 84, 9, 137, 106, 107, 8, 159, 82, 161, 8, 117, 118, 106, 107, 159, 122, 161, 82, 31, 14, 127, 128, 129, 130, 131, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 37, 38, 116, 14, 14, 134, 135, 14, 1, 159, 14, 161, 116, 159, 128, 161, 162, 14, 16, 1, 149, 16, 161, 137, 70, 16, 16, 16, 167, 59, 60, 16, 161, 137, 163, 70, 159, 74, 161, 16, 70, 37, 38, 80, 158, 16, 16, 31, 31, 163, 87, 88, 89, 167, 91, 31, 93, 35, 95, 163, 35, 98, 31, 167, 31, 31, 103, 104, 105, 31, 31, 31, 109, 110, 70, 31, 31, 1, 115, 116, 31, 31, 35, 31, 31, 31, 82, 124, 134, 135, 86, 84, 31, 31, 31, 35, 70, 0, 1, 134, 135, 35, 84, 149, 134, 135, 35, 100, 101, 102, 35, 37, 57, 106, 149, 161, 37, 154, 37, 149, 116, 70, 37, 38, 117, 118, 161, 37, 69, 122, 38, 161, 89, 77, 127, 128, 129, 130, 131, 70, 136, 137, 85, 139, 140, 141, 142, 143, 144, 82, 80, 83, 94, 132, 82, 151, 152, 92, 82, 74, 134, 135, 85, 90, 100, 80, 159, 163, 161, 162, 166, 167, 87, 88, 89, 149, 91, 159, 93, 161, 95, 84, 96, 98, 97, 134, 135, 161, 103, 104, 105, 97, 116, 31, 109, 110, 97, 113, 100, 153, 115, 116, 114, 106, 128, 108, 128, 159, 128, 124, 113, -1, 161, 137, 117, 118, 133, -1, -1, 122, 138, 132, -1, -1, 127, 128, 129, 130, 131, -1, 137, 31, -1, -1, 158, -1, 74, 146, -1, 163, -1, 146, 80, 167, -1, 149, -1, 150, -1, 87, 88, 89, 149, 91, 149, 93, 159, 95, 161, 162, 98, 149, 149, 153, 155, 103, 104, 105, 154, 158, 162, 109, 110, 166, 74, 159, 159, 115, 116, 159, 80, 159, 1, 159, 159, 159, 124, 87, 88, 89, 159, 91, 159, 93, 159, 95, 159, 159, 98, 159, 159, 159, 159, 103, 104, 105, 74, 159, 161, 109, 110, 160, 80, 160, 160, 115, 116, 160, 160, 87, 88, 89, 161, 91, 124, 93, 160, 95, 161, 161, 98, 161, 161, 161, 102, 103, 104, 105, 74, 161, 161, 109, 110, 161, 80, 81, 161, 115, 116, 161, 163, 87, 88, 89, 162, 91, 124, 93, 162, 95, 162, 162, 98, 162, 162, 84, 162, 103, 104, 105, 162, 162, 162, 109, 110, 162, 162, 162, 162, 115, 116, 100, 101, 102, 162, 162, 162, 106, 124, 162, 162, 162, 162, 162, -1, 162, 162, 162, 117, 118, 163, 70, 163, 122, 163, 163, 163, 163, 127, 128, 129, 130, 131, 82, 163, 74, 163, 86, 163, 163, 163, 80, 163, 163, 163, 163, 163, -1, 87, 88, 89, 163, 91, 163, 93, 163, 95, 163, 163, 98, 159, 163, 161, 162, 103, 104, 105, 116, 163, 163, 109, 110, 163, 163, 163, 163, 115, 116, 163, 163, 163, 163, 163, 163, 163, 124, 164, 164, 137, 164, 139, 140, 141, 142, 143, 144, 164, 164, 164, 164, 164, 164, 151, 152, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 163, 165, 164, 166, 167, 164, 164, 164, 164, 164, 164, -1, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, -1, 165, -1, -1, 167); + protected $actionBase = array(0, -2, 154, 542, 785, 695, 969, 549, 53, 420, 831, 307, 307, 67, 307, 307, 307, 496, 538, 538, 565, 538, 204, 504, 706, 706, 706, 651, 651, 651, 651, 773, 773, 920, 920, 952, 888, 850, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 211, 344, 288, 691, 1038, 1044, 1040, 1045, 1036, 1035, 1039, 1041, 1046, 917, 918, 751, 919, 921, 922, 923, 1042, 854, 1037, 1043, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 641, 159, 473, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 54, 54, 54, 341, 692, 692, 190, 184, 658, 47, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 144, 144, 7, 7, 7, 7, 7, 371, -25, -25, -25, -25, 574, 347, 764, 474, 584, 266, 241, 338, 470, 470, 591, 591, 396, -116, 396, 348, 348, 396, 396, 396, 770, 770, 770, 770, 443, 559, 452, 86, 514, 479, 479, 479, 479, 514, 514, 514, 514, 783, 795, 514, 514, 514, 642, 653, 653, 714, 300, 300, 300, 653, 390, 765, 90, 390, 90, 37, 156, 781, -55, -40, 292, 768, 781, 320, 739, 314, 143, 797, 546, 797, 1034, 745, 733, 705, 836, 876, 1047, 752, 915, 786, 916, 62, 704, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1049, 469, 1034, 65, 1049, 1049, 1049, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 533, 65, 466, 552, 65, 763, 469, 211, 791, 211, 211, 211, 211, 973, 211, 211, 211, 211, 211, 211, 980, 737, 29, 211, 344, 52, 52, 428, 58, 52, 52, 52, 52, 211, 211, 211, 546, 743, 734, 555, 798, 195, 743, 743, 743, 345, 135, 192, 194, 710, 713, 280, 758, 758, 760, 931, 931, 758, 755, 758, 760, 944, 758, 931, 799, 433, 627, 571, 603, 631, 931, 494, 758, 758, 758, 758, 639, 758, 491, 445, 758, 758, 709, 741, 777, 46, 931, 931, 931, 777, 585, 771, 771, 771, 805, 808, 772, 740, 540, 507, 650, 138, 780, 740, 740, 758, 612, 772, 740, 772, 740, 802, 740, 740, 740, 772, 740, 755, 583, 740, 703, 646, 60, 740, 6, 945, 947, 636, 948, 941, 949, 989, 950, 951, 856, 963, 943, 956, 939, 932, 750, 690, 693, 793, 784, 930, 747, 747, 747, 927, 747, 747, 747, 747, 747, 747, 747, 747, 690, 839, 801, 766, 731, 974, 697, 698, 779, 880, 1018, 1048, 973, 1024, 958, 736, 699, 1004, 977, 796, 849, 978, 979, 1005, 1025, 1026, 884, 757, 886, 887, 841, 983, 858, 747, 945, 951, 943, 956, 939, 932, 732, 728, 726, 727, 722, 721, 712, 719, 738, 1027, 925, 875, 842, 980, 929, 690, 845, 1000, 835, 1008, 1009, 855, 782, 756, 846, 889, 984, 985, 986, 859, 1028, 804, 1001, 990, 1010, 787, 890, 1011, 1012, 1013, 1014, 892, 860, 866, 867, 810, 761, 991, 774, 896, 48, 754, 759, 778, 988, 654, 966, 870, 897, 898, 1015, 1016, 1017, 901, 960, 812, 1002, 746, 1003, 993, 813, 814, 677, 769, 1030, 735, 748, 767, 678, 681, 902, 903, 904, 962, 742, 744, 819, 821, 1031, 762, 1032, 910, 684, 823, 711, 911, 1023, 717, 718, 753, 873, 800, 776, 775, 987, 749, 825, 912, 826, 828, 829, 1020, 830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 458, 458, 458, 458, 458, 458, 307, 307, 307, 307, 0, 0, 307, 0, 0, 0, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 415, 415, 291, 291, 0, 291, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 291, 291, 291, 291, 291, 291, 291, 799, 300, 300, 300, 300, 415, 415, 415, 415, 415, -88, -88, 415, 415, 415, 300, 300, 415, 244, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 0, 0, 65, 90, 415, 755, 755, 755, 755, 415, 415, 415, 415, 90, 90, 415, 415, 415, 0, 0, 0, 0, 0, 0, 0, 0, 65, 90, 0, 65, 0, 755, 755, 415, 799, 799, 232, 244, 415, 0, 0, 0, 0, 65, 755, 65, 469, 90, 469, 469, 52, 211, 232, 453, 453, 453, 453, 0, 546, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 755, 0, 799, 0, 755, 755, 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 755, 0, 0, 931, 0, 0, 0, 0, 758, 0, 0, 0, 0, 0, 0, 758, 944, 0, 0, 0, 0, 0, 0, 755, 0, 0, 0, 0, 0, 0, 0, 0, 747, 782, 0, 782, 0, 747, 747, 747, 0, 0, 0, 0, 769, 762); + protected $actionDefault = array(3, 32767, 103, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 101, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 588, 588, 588, 588, 32767, 32767, 250, 103, 32767, 32767, 464, 382, 382, 382, 32767, 32767, 532, 532, 532, 532, 532, 532, 32767, 32767, 32767, 32767, 32767, 32767, 464, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 101, 32767, 32767, 32767, 37, 7, 8, 10, 11, 50, 17, 320, 32767, 32767, 32767, 32767, 103, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 581, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 468, 447, 448, 450, 451, 381, 533, 587, 323, 584, 380, 146, 335, 325, 238, 326, 254, 469, 255, 470, 473, 474, 211, 283, 377, 150, 411, 465, 413, 463, 467, 412, 387, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 385, 386, 466, 444, 443, 442, 409, 32767, 32767, 410, 414, 384, 417, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 103, 32767, 415, 416, 433, 434, 431, 432, 435, 32767, 436, 437, 438, 439, 32767, 312, 32767, 32767, 32767, 361, 359, 312, 32767, 32767, 424, 425, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 526, 441, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 103, 32767, 101, 528, 406, 408, 496, 419, 420, 418, 388, 32767, 503, 32767, 103, 505, 32767, 32767, 32767, 112, 32767, 32767, 32767, 32767, 527, 32767, 534, 534, 32767, 489, 101, 194, 32767, 194, 194, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 595, 489, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 32767, 194, 111, 32767, 32767, 32767, 101, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 189, 32767, 264, 266, 103, 549, 194, 32767, 508, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 501, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 489, 429, 139, 32767, 139, 534, 421, 422, 423, 491, 534, 534, 534, 308, 285, 32767, 32767, 32767, 32767, 506, 506, 101, 101, 101, 101, 501, 32767, 32767, 112, 100, 100, 100, 100, 100, 104, 102, 32767, 32767, 32767, 32767, 100, 32767, 102, 102, 32767, 32767, 221, 208, 219, 102, 32767, 553, 554, 219, 102, 223, 223, 223, 243, 243, 480, 314, 102, 100, 102, 102, 196, 314, 314, 32767, 102, 480, 314, 480, 314, 198, 314, 314, 314, 480, 314, 32767, 102, 314, 210, 100, 100, 314, 32767, 32767, 32767, 491, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 521, 32767, 538, 551, 427, 428, 430, 536, 452, 453, 454, 455, 456, 457, 458, 460, 583, 32767, 495, 32767, 32767, 32767, 32767, 334, 593, 32767, 593, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 594, 32767, 534, 32767, 32767, 32767, 32767, 426, 9, 76, 43, 44, 52, 58, 512, 513, 514, 515, 509, 510, 516, 511, 32767, 32767, 517, 559, 32767, 32767, 535, 586, 32767, 32767, 32767, 32767, 32767, 32767, 139, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 521, 32767, 137, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 534, 32767, 32767, 32767, 32767, 310, 307, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 534, 32767, 32767, 32767, 32767, 32767, 287, 32767, 304, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 282, 32767, 32767, 376, 32767, 32767, 32767, 32767, 355, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 152, 152, 3, 3, 337, 152, 152, 152, 337, 152, 337, 337, 337, 152, 152, 152, 152, 152, 152, 276, 184, 258, 261, 243, 243, 152, 347, 152); + protected $goto = array(194, 194, 677, 466, 1281, 1282, 345, 428, 325, 325, 325, 325, 536, 536, 536, 536, 665, 591, 926, 1039, 685, 1003, 1019, 1020, 1080, 1081, 165, 165, 165, 165, 218, 195, 191, 191, 175, 177, 213, 191, 191, 191, 191, 191, 192, 192, 192, 192, 192, 192, 186, 187, 188, 189, 190, 215, 213, 216, 524, 525, 415, 526, 528, 529, 530, 531, 532, 533, 534, 535, 1108, 166, 167, 168, 193, 169, 170, 171, 164, 172, 173, 174, 176, 212, 214, 217, 235, 238, 241, 242, 244, 255, 256, 257, 258, 259, 260, 261, 263, 264, 265, 266, 277, 278, 313, 314, 315, 420, 421, 422, 569, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 178, 234, 179, 196, 197, 198, 236, 186, 187, 188, 189, 190, 215, 1108, 199, 180, 181, 182, 200, 196, 183, 237, 201, 199, 163, 202, 203, 184, 204, 205, 206, 185, 207, 208, 209, 210, 211, 834, 587, 425, 645, 548, 541, 830, 831, 419, 310, 311, 332, 564, 316, 424, 333, 426, 623, 832, 973, 947, 947, 945, 947, 710, 808, 540, 982, 977, 827, 827, 607, 642, 391, 541, 548, 557, 558, 398, 567, 589, 603, 604, 839, 865, 887, 882, 883, 896, 15, 840, 884, 837, 885, 886, 838, 457, 457, 639, 890, 656, 657, 658, 987, 987, 457, 609, 609, 806, 1060, 1056, 1057, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1256, 1256, 346, 347, 812, 949, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1014, 1013, 1207, 1008, 1207, 1008, 1207, 561, 442, 1008, 1008, 1008, 343, 442, 1008, 442, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 251, 251, 1296, 812, 1207, 812, 1307, 1307, 970, 1207, 1207, 1207, 1207, 1017, 1018, 1207, 1207, 1207, 1288, 1288, 1288, 1288, 827, 1307, 321, 305, 248, 248, 248, 248, 250, 252, 387, 903, 1254, 1254, 619, 620, 904, 1203, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 527, 527, 280, 280, 280, 280, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 941, 405, 684, 560, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 348, 644, 442, 389, 393, 549, 588, 592, 847, 1157, 348, 348, 538, 1204, 538, 891, 538, 892, 432, 418, 822, 598, 666, 859, 348, 348, 846, 348, 5, 1323, 6, 824, 554, 1283, 1284, 650, 1205, 1264, 1265, 602, 448, 543, 565, 601, 348, 943, 943, 943, 943, 334, 932, 448, 937, 944, 403, 404, 1278, 852, 1278, 654, 1278, 655, 397, 407, 408, 409, 1200, 668, 849, 1045, 410, 542, 552, 992, 341, 490, 542, 491, 552, 714, 467, 390, 861, 497, 1049, 1290, 1290, 1290, 1290, 1267, 954, 568, 460, 461, 462, 1091, 857, 471, 0, 1314, 1315, 555, 0, 0, 0, 711, 622, 624, 0, 643, 0, 1274, 670, 667, 671, 984, 675, 683, 980, 0, 0, 0, 0, 0, 855, 596, 610, 613, 614, 615, 616, 636, 637, 638, 687, 860, 848, 1044, 1048, 908, 1096, 0, 543, 0, 0, 952, 606, 1306, 1306, 0, 1047, 989, 0, 0, 1276, 1276, 1047, 254, 254, 851, 0, 648, 968, 427, 1306, 0, 0, 845, 942, 427, 0, 0, 0, 0, 0, 0, 0, 1015, 1015, 1199, 0, 1309, 649, 1026, 1022, 1023, 0, 0, 0, 0, 1089, 864, 0, 0, 0, 586, 1073, 0, 688, 674, 674, 1202, 498, 680, 1071, 1188, 919, 0, 0, 1189, 1192, 920, 1193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 539, 0, 539); + protected $gotoCheck = array(42, 42, 72, 172, 172, 172, 95, 87, 23, 23, 23, 23, 105, 105, 105, 105, 87, 105, 87, 125, 9, 87, 87, 87, 142, 142, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 15, 128, 65, 65, 75, 75, 25, 26, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 27, 25, 25, 25, 25, 25, 25, 7, 25, 25, 25, 22, 22, 55, 55, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 15, 45, 15, 15, 15, 15, 75, 15, 15, 15, 15, 15, 15, 147, 147, 84, 15, 84, 84, 84, 105, 105, 147, 106, 106, 6, 15, 15, 15, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 166, 166, 95, 95, 12, 49, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 116, 116, 72, 72, 72, 72, 72, 168, 23, 72, 72, 72, 175, 23, 72, 23, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 5, 5, 177, 12, 72, 12, 179, 179, 101, 72, 72, 72, 72, 117, 117, 72, 72, 72, 9, 9, 9, 9, 22, 179, 165, 165, 5, 5, 5, 5, 5, 5, 61, 72, 167, 167, 83, 83, 72, 20, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 169, 169, 24, 24, 24, 24, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 91, 91, 91, 102, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 14, 63, 23, 58, 58, 58, 58, 58, 35, 149, 14, 14, 19, 20, 19, 64, 19, 64, 111, 13, 20, 13, 114, 35, 14, 14, 35, 14, 46, 14, 46, 18, 9, 174, 174, 118, 20, 20, 20, 9, 19, 14, 2, 2, 14, 19, 19, 19, 19, 29, 90, 19, 19, 19, 80, 80, 128, 39, 128, 80, 128, 80, 28, 80, 80, 80, 158, 80, 37, 127, 80, 9, 9, 108, 80, 153, 9, 153, 9, 97, 155, 9, 41, 153, 130, 128, 128, 128, 128, 14, 94, 9, 9, 9, 9, 145, 9, 82, -1, 9, 9, 48, -1, -1, -1, 48, 48, 48, -1, 48, -1, 128, 14, 48, 48, 48, 48, 48, 48, -1, -1, -1, -1, -1, 9, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 16, 16, 16, 16, 17, 17, -1, 14, -1, -1, 16, 17, 178, 178, -1, 128, 17, -1, -1, 128, 128, 128, 5, 5, 17, -1, 17, 17, 115, 178, -1, -1, 17, 16, 115, -1, -1, -1, -1, -1, -1, -1, 115, 115, 17, -1, 178, 115, 115, 115, 115, -1, -1, -1, -1, 16, 16, -1, -1, -1, 8, 8, -1, 8, 8, 8, 14, 8, 8, 8, 78, 78, -1, -1, 78, 78, 78, 78, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, 24, -1, 24); + protected $gotoBase = array(0, 0, -283, 0, 0, 284, 216, 177, 554, 7, 0, 0, -46, 51, 72, -181, 57, 49, 91, 111, -62, 0, -135, 5, 334, 163, 164, 175, 94, 122, 0, 0, 0, 0, 0, 10, 0, 98, 0, 103, 0, 13, -1, 0, 0, 193, -320, 0, -223, 225, 0, 0, 0, 0, 0, 153, 0, 0, 325, 0, 0, 276, 0, 127, 362, -76, 0, 0, 0, 0, 0, 0, -6, 0, 0, -174, 0, 0, 168, 140, -61, 0, -4, -149, -478, 0, 0, -263, 0, 0, 88, 50, 0, 0, 19, -467, 0, 43, 0, 0, 0, 259, 312, 0, 0, -15, -12, 0, 76, 0, 0, 110, 0, 0, 109, 261, -16, 16, 114, 0, 0, 0, 0, 0, 0, 17, 0, 68, 155, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -248, 0, 0, 23, 0, 184, 0, 104, 0, 0, 0, -44, 0, 12, 0, 0, 70, 0, 0, 0, 0, 0, 0, -9, 4, 80, 238, 96, 0, 0, -294, 0, 34, 242, 0, 257, 209, -13, 0, 0); + protected $gotoDefault = array(-32768, 502, 718, 4, 719, 912, 795, 804, 584, 518, 686, 342, 611, 416, 1272, 889, 1095, 566, 823, 1216, 1224, 449, 826, 326, 708, 871, 872, 873, 394, 379, 385, 392, 634, 612, 484, 858, 445, 850, 476, 853, 444, 862, 162, 413, 500, 866, 3, 868, 545, 899, 380, 876, 381, 661, 878, 551, 880, 881, 388, 395, 396, 1100, 559, 608, 893, 243, 553, 894, 378, 895, 902, 383, 386, 672, 456, 495, 489, 406, 1075, 595, 631, 453, 470, 618, 617, 605, 469, 1011, 411, 328, 931, 939, 477, 454, 953, 344, 961, 716, 1107, 625, 479, 969, 626, 976, 979, 519, 520, 468, 991, 268, 994, 480, 1032, 651, 1005, 1006, 652, 627, 1028, 628, 653, 629, 1030, 463, 585, 1038, 446, 1046, 1260, 447, 1050, 262, 1053, 274, 412, 429, 1058, 1059, 8, 1065, 678, 679, 10, 273, 499, 1090, 673, 443, 1106, 433, 1176, 1178, 547, 481, 1196, 1195, 664, 496, 1201, 1263, 441, 521, 464, 312, 522, 304, 330, 309, 537, 291, 331, 523, 465, 1269, 1277, 327, 30, 1297, 1308, 338, 563, 600); + protected $ruleToNonTerminal = array(0, 1, 3, 3, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10, 11, 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 21, 21, 22, 23, 23, 24, 24, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 29, 30, 30, 32, 34, 34, 28, 36, 36, 33, 38, 38, 35, 35, 37, 37, 39, 39, 31, 40, 40, 41, 43, 44, 44, 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 25, 25, 68, 68, 71, 71, 70, 69, 69, 62, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 26, 26, 27, 27, 27, 27, 86, 86, 88, 88, 81, 81, 89, 89, 90, 90, 90, 82, 82, 85, 85, 83, 83, 91, 92, 92, 56, 56, 64, 64, 67, 67, 67, 66, 93, 93, 94, 57, 57, 57, 57, 95, 95, 96, 96, 97, 97, 98, 99, 99, 100, 100, 101, 101, 54, 54, 50, 50, 103, 52, 52, 104, 51, 51, 53, 53, 63, 63, 63, 63, 79, 79, 107, 107, 109, 109, 110, 110, 110, 110, 108, 108, 108, 112, 112, 112, 112, 87, 87, 115, 115, 115, 116, 116, 113, 113, 117, 117, 119, 119, 120, 120, 114, 121, 121, 118, 122, 122, 122, 122, 111, 111, 80, 80, 80, 20, 20, 20, 124, 123, 123, 125, 125, 125, 125, 59, 126, 126, 127, 60, 129, 129, 130, 130, 131, 131, 84, 132, 132, 132, 132, 132, 132, 137, 137, 138, 138, 139, 139, 139, 139, 139, 140, 141, 141, 136, 136, 133, 133, 135, 135, 143, 143, 142, 142, 142, 142, 142, 142, 142, 134, 144, 144, 146, 145, 145, 61, 102, 147, 147, 55, 55, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 154, 148, 148, 153, 153, 156, 157, 157, 158, 159, 159, 159, 19, 19, 72, 72, 72, 72, 149, 149, 149, 149, 161, 161, 150, 150, 152, 152, 152, 155, 155, 166, 166, 166, 166, 166, 166, 166, 166, 166, 167, 167, 106, 169, 169, 169, 169, 151, 151, 151, 151, 151, 151, 151, 151, 58, 58, 164, 164, 164, 164, 170, 170, 160, 160, 160, 171, 171, 171, 171, 171, 171, 73, 73, 65, 65, 65, 65, 128, 128, 128, 128, 174, 173, 163, 163, 163, 163, 163, 163, 163, 162, 162, 162, 172, 172, 172, 172, 105, 168, 176, 176, 175, 175, 177, 177, 177, 177, 177, 177, 177, 177, 165, 165, 165, 165, 179, 180, 178, 178, 178, 178, 178, 178, 178, 178, 181, 181, 181, 181); + protected $ruleToLength = array(1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 2, 1, 3, 4, 1, 2, 0, 1, 1, 1, 1, 1, 3, 5, 4, 3, 4, 2, 3, 1, 1, 7, 6, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, 3, 1, 2, 2, 3, 1, 3, 2, 3, 1, 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, 2, 1, 1, 1, 0, 2, 1, 3, 8, 0, 4, 2, 1, 3, 0, 1, 0, 1, 0, 1, 3, 1, 8, 9, 8, 7, 6, 8, 0, 2, 0, 2, 1, 2, 1, 2, 1, 1, 1, 0, 2, 0, 2, 0, 2, 2, 1, 3, 1, 4, 1, 4, 1, 1, 4, 2, 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, 1, 1, 7, 0, 2, 1, 3, 3, 4, 1, 4, 0, 2, 5, 0, 2, 6, 0, 2, 0, 3, 1, 2, 1, 1, 2, 0, 1, 3, 0, 2, 1, 1, 1, 1, 6, 8, 6, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 1, 1, 2, 1, 1, 0, 1, 0, 2, 2, 2, 4, 3, 1, 1, 3, 1, 2, 2, 3, 2, 3, 1, 1, 2, 3, 1, 1, 3, 2, 0, 1, 5, 5, 10, 3, 5, 1, 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 3, 2, 2, 3, 1, 0, 1, 1, 3, 3, 3, 4, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 3, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 2, 1, 2, 4, 2, 2, 8, 9, 8, 9, 9, 10, 9, 10, 8, 3, 2, 0, 4, 2, 1, 3, 2, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 0, 3, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 4, 1, 1, 3, 1, 1, 1, 1, 1, 3, 2, 3, 0, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 4, 4, 1, 4, 4, 0, 1, 1, 1, 3, 3, 1, 4, 2, 2, 1, 3, 1, 4, 4, 3, 3, 3, 3, 1, 3, 1, 1, 3, 1, 1, 4, 1, 1, 1, 3, 1, 1, 2, 1, 3, 4, 3, 2, 0, 2, 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, 3, 6, 3, 1, 1, 2, 1); + protected function initReduceCallbacks() + { + $this->reduceCallbacks = [0 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 1 => function ($stackPos) { + $this->semValue = $this->handleNamespaces($this->semStack[$stackPos - (1 - 1)]); + }, 2 => function ($stackPos) { + if (\is_array($this->semStack[$stackPos - (2 - 2)])) { + $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); + } else { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + } + }, 3 => function ($stackPos) { + $this->semValue = array(); + }, 4 => function ($stackPos) { + $startAttributes = $this->lookaheadStartAttributes; + if (isset($startAttributes['comments'])) { + $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); + } else { + $nop = null; + } + if ($nop !== null) { + $this->semStack[$stackPos - (1 - 1)][] = $nop; + } + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 5 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 6 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 7 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 8 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 9 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 10 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 11 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 12 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 13 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 14 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 15 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 16 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 17 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 18 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 19 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 20 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 21 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 22 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 23 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 24 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 25 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 26 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 27 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 28 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 29 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 30 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 31 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 32 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 33 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 34 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 35 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 36 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 37 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 38 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 39 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 40 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 41 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 42 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 43 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 44 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 45 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 46 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 47 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 48 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 49 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 50 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 51 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 52 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 53 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 54 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 55 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 56 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 57 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 58 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 59 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 60 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 61 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 62 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 63 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 64 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 65 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 66 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 67 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 68 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 69 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 70 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 71 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 72 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 73 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 74 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 75 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 76 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 77 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 78 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 79 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 80 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 81 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 82 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 83 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 84 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 85 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 86 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 87 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 88 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 89 => function ($stackPos) { + $this->semValue = new Node\Identifier($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 90 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 91 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 92 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 93 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 94 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 95 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 96 => function ($stackPos) { + $this->semValue = new Name(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 97 => function ($stackPos) { + $this->semValue = new Expr\Variable(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 98 => function ($stackPos) { + /* nothing */ + }, 99 => function ($stackPos) { + /* nothing */ + }, 100 => function ($stackPos) { + /* nothing */ + }, 101 => function ($stackPos) { + $this->emitError(new Error('A trailing comma is not allowed here', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes)); + }, 102 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 103 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 104 => function ($stackPos) { + $this->semValue = new Node\Attribute($this->semStack[$stackPos - (1 - 1)], [], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 105 => function ($stackPos) { + $this->semValue = new Node\Attribute($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 106 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 107 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 108 => function ($stackPos) { + $this->semValue = new Node\AttributeGroup($this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 109 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 110 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 111 => function ($stackPos) { + $this->semValue = []; + }, 112 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 113 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 114 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 115 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 116 => function ($stackPos) { + $this->semValue = new Stmt\HaltCompiler($this->lexer->handleHaltCompiler(), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 117 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (3 - 2)], null, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_SEMICOLON); + $this->checkNamespace($this->semValue); + }, 118 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($this->semValue); + }, 119 => function ($stackPos) { + $this->semValue = new Stmt\Namespace_(null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + $this->semValue->setAttribute('kind', Stmt\Namespace_::KIND_BRACED); + $this->checkNamespace($this->semValue); + }, 120 => function ($stackPos) { + $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (3 - 2)], Stmt\Use_::TYPE_NORMAL, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 121 => function ($stackPos) { + $this->semValue = new Stmt\Use_($this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 122 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 123 => function ($stackPos) { + $this->semValue = new Stmt\Const_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 124 => function ($stackPos) { + $this->semValue = Stmt\Use_::TYPE_FUNCTION; + }, 125 => function ($stackPos) { + $this->semValue = Stmt\Use_::TYPE_CONSTANT; + }, 126 => function ($stackPos) { + $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 6)], $this->semStack[$stackPos - (7 - 2)], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); + }, 127 => function ($stackPos) { + $this->semValue = new Stmt\GroupUse($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 5)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + }, 128 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 129 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 130 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 131 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 132 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 133 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 134 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 135 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 136 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 137 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); + }, 138 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); + }, 139 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (1 - 1)], null, Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + $this->checkUseUse($this->semValue, $stackPos - (1 - 1)); + }, 140 => function ($stackPos) { + $this->semValue = new Stmt\UseUse($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], Stmt\Use_::TYPE_UNKNOWN, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + $this->checkUseUse($this->semValue, $stackPos - (3 - 3)); + }, 141 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + $this->semValue->type = Stmt\Use_::TYPE_NORMAL; + }, 142 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue->type = $this->semStack[$stackPos - (2 - 1)]; + }, 143 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 144 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 145 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 146 => function ($stackPos) { + $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 147 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 148 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 149 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 150 => function ($stackPos) { + $this->semValue = new Node\Const_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 151 => function ($stackPos) { + if (\is_array($this->semStack[$stackPos - (2 - 2)])) { + $this->semValue = \array_merge($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); + } else { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + } + }, 152 => function ($stackPos) { + $this->semValue = array(); + }, 153 => function ($stackPos) { + $startAttributes = $this->lookaheadStartAttributes; + if (isset($startAttributes['comments'])) { + $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); + } else { + $nop = null; + } + if ($nop !== null) { + $this->semStack[$stackPos - (1 - 1)][] = $nop; + } + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 154 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 155 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 156 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 157 => function ($stackPos) { + throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 158 => function ($stackPos) { + if ($this->semStack[$stackPos - (3 - 2)]) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + $attrs = $this->startAttributeStack[$stackPos - (3 - 1)]; + $stmts = $this->semValue; + if (!empty($attrs['comments'])) { + $stmts[0]->setAttribute('comments', \array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); + } + } else { + $startAttributes = $this->startAttributeStack[$stackPos - (3 - 1)]; + if (isset($startAttributes['comments'])) { + $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); + } else { + $this->semValue = null; + } + if (null === $this->semValue) { + $this->semValue = array(); + } + } + }, 159 => function ($stackPos) { + $this->semValue = new Stmt\If_($this->semStack[$stackPos - (7 - 3)], ['stmts' => \is_array($this->semStack[$stackPos - (7 - 5)]) ? $this->semStack[$stackPos - (7 - 5)] : array($this->semStack[$stackPos - (7 - 5)]), 'elseifs' => $this->semStack[$stackPos - (7 - 6)], 'else' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); + }, 160 => function ($stackPos) { + $this->semValue = new Stmt\If_($this->semStack[$stackPos - (10 - 3)], ['stmts' => $this->semStack[$stackPos - (10 - 6)], 'elseifs' => $this->semStack[$stackPos - (10 - 7)], 'else' => $this->semStack[$stackPos - (10 - 8)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); + }, 161 => function ($stackPos) { + $this->semValue = new Stmt\While_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 162 => function ($stackPos) { + $this->semValue = new Stmt\Do_($this->semStack[$stackPos - (7 - 5)], \is_array($this->semStack[$stackPos - (7 - 2)]) ? $this->semStack[$stackPos - (7 - 2)] : array($this->semStack[$stackPos - (7 - 2)]), $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); + }, 163 => function ($stackPos) { + $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos - (9 - 3)], 'cond' => $this->semStack[$stackPos - (9 - 5)], 'loop' => $this->semStack[$stackPos - (9 - 7)], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); + }, 164 => function ($stackPos) { + $this->semValue = new Stmt\Switch_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 165 => function ($stackPos) { + $this->semValue = new Stmt\Break_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 166 => function ($stackPos) { + $this->semValue = new Stmt\Continue_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 167 => function ($stackPos) { + $this->semValue = new Stmt\Return_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 168 => function ($stackPos) { + $this->semValue = new Stmt\Global_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 169 => function ($stackPos) { + $this->semValue = new Stmt\Static_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 170 => function ($stackPos) { + $this->semValue = new Stmt\Echo_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 171 => function ($stackPos) { + $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 172 => function ($stackPos) { + $e = $this->semStack[$stackPos - (2 - 1)]; + if ($e instanceof Expr\Throw_) { + // For backwards-compatibility reasons, convert throw in statement position into + // Stmt\Throw_ rather than Stmt\Expression(Expr\Throw_). + $this->semValue = new Stmt\Throw_($e->expr, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + } else { + $this->semValue = new Stmt\Expression($e, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + } + }, 173 => function ($stackPos) { + $this->semValue = new Stmt\Unset_($this->semStack[$stackPos - (5 - 3)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 174 => function ($stackPos) { + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos - (7 - 5)][1], 'stmts' => $this->semStack[$stackPos - (7 - 7)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); + }, 175 => function ($stackPos) { + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (9 - 3)], $this->semStack[$stackPos - (9 - 7)][0], ['keyVar' => $this->semStack[$stackPos - (9 - 5)], 'byRef' => $this->semStack[$stackPos - (9 - 7)][1], 'stmts' => $this->semStack[$stackPos - (9 - 9)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); + }, 176 => function ($stackPos) { + $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos - (6 - 3)], new Expr\Error($this->startAttributeStack[$stackPos - (6 - 4)] + $this->endAttributeStack[$stackPos - (6 - 4)]), ['stmts' => $this->semStack[$stackPos - (6 - 6)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + }, 177 => function ($stackPos) { + $this->semValue = new Stmt\Declare_($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 178 => function ($stackPos) { + $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 5)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + $this->checkTryCatch($this->semValue); + }, 179 => function ($stackPos) { + $this->semValue = new Stmt\Goto_($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 180 => function ($stackPos) { + $this->semValue = new Stmt\Label($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 181 => function ($stackPos) { + $this->semValue = array(); + /* means: no statement */ + }, 182 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 183 => function ($stackPos) { + $startAttributes = $this->startAttributeStack[$stackPos - (1 - 1)]; + if (isset($startAttributes['comments'])) { + $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); + } else { + $this->semValue = null; + } + if ($this->semValue === null) { + $this->semValue = array(); + } + /* means: no statement */ + }, 184 => function ($stackPos) { + $this->semValue = array(); + }, 185 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 186 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 187 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 188 => function ($stackPos) { + $this->semValue = new Stmt\Catch_($this->semStack[$stackPos - (8 - 3)], $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 7)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); + }, 189 => function ($stackPos) { + $this->semValue = null; + }, 190 => function ($stackPos) { + $this->semValue = new Stmt\Finally_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 191 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 192 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 193 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 194 => function ($stackPos) { + $this->semValue = \false; + }, 195 => function ($stackPos) { + $this->semValue = \true; + }, 196 => function ($stackPos) { + $this->semValue = \false; + }, 197 => function ($stackPos) { + $this->semValue = \true; + }, 198 => function ($stackPos) { + $this->semValue = \false; + }, 199 => function ($stackPos) { + $this->semValue = \true; + }, 200 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 201 => function ($stackPos) { + $this->semValue = []; + }, 202 => function ($stackPos) { + $this->semValue = new Stmt\Function_($this->semStack[$stackPos - (8 - 3)], ['byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 5)], 'returnType' => $this->semStack[$stackPos - (8 - 7)], 'stmts' => $this->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); + }, 203 => function ($stackPos) { + $this->semValue = new Stmt\Function_($this->semStack[$stackPos - (9 - 4)], ['byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 6)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => $this->semStack[$stackPos - (9 - 1)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); + }, 204 => function ($stackPos) { + $this->semValue = new Stmt\Class_($this->semStack[$stackPos - (8 - 3)], ['type' => $this->semStack[$stackPos - (8 - 2)], 'extends' => $this->semStack[$stackPos - (8 - 4)], 'implements' => $this->semStack[$stackPos - (8 - 5)], 'stmts' => $this->semStack[$stackPos - (8 - 7)], 'attrGroups' => $this->semStack[$stackPos - (8 - 1)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); + $this->checkClass($this->semValue, $stackPos - (8 - 3)); + }, 205 => function ($stackPos) { + $this->semValue = new Stmt\Interface_($this->semStack[$stackPos - (7 - 3)], ['extends' => $this->semStack[$stackPos - (7 - 4)], 'stmts' => $this->semStack[$stackPos - (7 - 6)], 'attrGroups' => $this->semStack[$stackPos - (7 - 1)]], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); + $this->checkInterface($this->semValue, $stackPos - (7 - 3)); + }, 206 => function ($stackPos) { + $this->semValue = new Stmt\Trait_($this->semStack[$stackPos - (6 - 3)], ['stmts' => $this->semStack[$stackPos - (6 - 5)], 'attrGroups' => $this->semStack[$stackPos - (6 - 1)]], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + }, 207 => function ($stackPos) { + $this->semValue = new Stmt\Enum_($this->semStack[$stackPos - (8 - 3)], ['scalarType' => $this->semStack[$stackPos - (8 - 4)], 'implements' => $this->semStack[$stackPos - (8 - 5)], 'stmts' => $this->semStack[$stackPos - (8 - 7)], 'attrGroups' => $this->semStack[$stackPos - (8 - 1)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); + $this->checkEnum($this->semValue, $stackPos - (8 - 3)); + }, 208 => function ($stackPos) { + $this->semValue = null; + }, 209 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 2)]; + }, 210 => function ($stackPos) { + $this->semValue = null; + }, 211 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 2)]; + }, 212 => function ($stackPos) { + $this->semValue = 0; + }, 213 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 214 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 215 => function ($stackPos) { + $this->checkClassModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); + $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; + }, 216 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + }, 217 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_FINAL; + }, 218 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_READONLY; + }, 219 => function ($stackPos) { + $this->semValue = null; + }, 220 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 2)]; + }, 221 => function ($stackPos) { + $this->semValue = array(); + }, 222 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 2)]; + }, 223 => function ($stackPos) { + $this->semValue = array(); + }, 224 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 2)]; + }, 225 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 226 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 227 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 228 => function ($stackPos) { + $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); + }, 229 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 2)]; + }, 230 => function ($stackPos) { + $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); + }, 231 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 2)]; + }, 232 => function ($stackPos) { + $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); + }, 233 => function ($stackPos) { + $this->semValue = null; + }, 234 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 2)]; + }, 235 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 236 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 237 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 238 => function ($stackPos) { + $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 239 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 240 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 3)]; + }, 241 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 2)]; + }, 242 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (5 - 3)]; + }, 243 => function ($stackPos) { + $this->semValue = array(); + }, 244 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 245 => function ($stackPos) { + $this->semValue = new Stmt\Case_($this->semStack[$stackPos - (4 - 2)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 246 => function ($stackPos) { + $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 247 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 248 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 249 => function ($stackPos) { + $this->semValue = new Expr\Match_($this->semStack[$stackPos - (7 - 3)], $this->semStack[$stackPos - (7 - 6)], $this->startAttributeStack[$stackPos - (7 - 1)] + $this->endAttributes); + }, 250 => function ($stackPos) { + $this->semValue = []; + }, 251 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 252 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 253 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 254 => function ($stackPos) { + $this->semValue = new Node\MatchArm($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 255 => function ($stackPos) { + $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 256 => function ($stackPos) { + $this->semValue = \is_array($this->semStack[$stackPos - (1 - 1)]) ? $this->semStack[$stackPos - (1 - 1)] : array($this->semStack[$stackPos - (1 - 1)]); + }, 257 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 2)]; + }, 258 => function ($stackPos) { + $this->semValue = array(); + }, 259 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 260 => function ($stackPos) { + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (5 - 3)], \is_array($this->semStack[$stackPos - (5 - 5)]) ? $this->semStack[$stackPos - (5 - 5)] : array($this->semStack[$stackPos - (5 - 5)]), $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 261 => function ($stackPos) { + $this->semValue = array(); + }, 262 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 263 => function ($stackPos) { + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 6)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + }, 264 => function ($stackPos) { + $this->semValue = null; + }, 265 => function ($stackPos) { + $this->semValue = new Stmt\Else_(\is_array($this->semStack[$stackPos - (2 - 2)]) ? $this->semStack[$stackPos - (2 - 2)] : array($this->semStack[$stackPos - (2 - 2)]), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 266 => function ($stackPos) { + $this->semValue = null; + }, 267 => function ($stackPos) { + $this->semValue = new Stmt\Else_($this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 268 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); + }, 269 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (2 - 2)], \true); + }, 270 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); + }, 271 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)], \false); + }, 272 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 273 => function ($stackPos) { + $this->semValue = array(); + }, 274 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 275 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 276 => function ($stackPos) { + $this->semValue = 0; + }, 277 => function ($stackPos) { + $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); + $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; + }, 278 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; + }, 279 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; + }, 280 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; + }, 281 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_READONLY; + }, 282 => function ($stackPos) { + $this->semValue = new Node\Param($this->semStack[$stackPos - (6 - 6)], null, $this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 1)]); + $this->checkParam($this->semValue); + }, 283 => function ($stackPos) { + $this->semValue = new Node\Param($this->semStack[$stackPos - (8 - 6)], $this->semStack[$stackPos - (8 - 8)], $this->semStack[$stackPos - (8 - 3)], $this->semStack[$stackPos - (8 - 4)], $this->semStack[$stackPos - (8 - 5)], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (8 - 2)], $this->semStack[$stackPos - (8 - 1)]); + $this->checkParam($this->semValue); + }, 284 => function ($stackPos) { + $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes), null, $this->semStack[$stackPos - (6 - 3)], $this->semStack[$stackPos - (6 - 4)], $this->semStack[$stackPos - (6 - 5)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 1)]); + }, 285 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 286 => function ($stackPos) { + $this->semValue = new Node\NullableType($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 287 => function ($stackPos) { + $this->semValue = new Node\UnionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 288 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 289 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 290 => function ($stackPos) { + $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 291 => function ($stackPos) { + $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos - (1 - 1)]); + }, 292 => function ($stackPos) { + $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 293 => function ($stackPos) { + $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 294 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 295 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 296 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); + }, 297 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 298 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 299 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 300 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); + }, 301 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 302 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); + }, 303 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 304 => function ($stackPos) { + $this->semValue = new Node\IntersectionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 305 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); + }, 306 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 307 => function ($stackPos) { + $this->semValue = new Node\IntersectionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 308 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 309 => function ($stackPos) { + $this->semValue = new Node\NullableType($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 310 => function ($stackPos) { + $this->semValue = new Node\UnionType($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 311 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 312 => function ($stackPos) { + $this->semValue = null; + }, 313 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 314 => function ($stackPos) { + $this->semValue = null; + }, 315 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 2)]; + }, 316 => function ($stackPos) { + $this->semValue = null; + }, 317 => function ($stackPos) { + $this->semValue = array(); + }, 318 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 2)]; + }, 319 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (3 - 2)]); + }, 320 => function ($stackPos) { + $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 321 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 322 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 323 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos - (1 - 1)], \false, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 324 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \true, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 325 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos - (2 - 2)], \false, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 326 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos - (3 - 3)], \false, \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (3 - 1)]); + }, 327 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 328 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 329 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 330 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 331 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 332 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 333 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 334 => function ($stackPos) { + $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 335 => function ($stackPos) { + $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 336 => function ($stackPos) { + if ($this->semStack[$stackPos - (2 - 2)] !== null) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + } + }, 337 => function ($stackPos) { + $this->semValue = array(); + }, 338 => function ($stackPos) { + $startAttributes = $this->lookaheadStartAttributes; + if (isset($startAttributes['comments'])) { + $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); + } else { + $nop = null; + } + if ($nop !== null) { + $this->semStack[$stackPos - (1 - 1)][] = $nop; + } + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 339 => function ($stackPos) { + $this->semValue = new Stmt\Property($this->semStack[$stackPos - (5 - 2)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 1)]); + $this->checkProperty($this->semValue, $stackPos - (5 - 2)); + }, 340 => function ($stackPos) { + $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos - (5 - 4)], $this->semStack[$stackPos - (5 - 2)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes, $this->semStack[$stackPos - (5 - 1)]); + $this->checkClassConst($this->semValue, $stackPos - (5 - 2)); + }, 341 => function ($stackPos) { + $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos - (10 - 5)], ['type' => $this->semStack[$stackPos - (10 - 2)], 'byRef' => $this->semStack[$stackPos - (10 - 4)], 'params' => $this->semStack[$stackPos - (10 - 7)], 'returnType' => $this->semStack[$stackPos - (10 - 9)], 'stmts' => $this->semStack[$stackPos - (10 - 10)], 'attrGroups' => $this->semStack[$stackPos - (10 - 1)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); + $this->checkClassMethod($this->semValue, $stackPos - (10 - 2)); + }, 342 => function ($stackPos) { + $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 343 => function ($stackPos) { + $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->semStack[$stackPos - (5 - 1)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 344 => function ($stackPos) { + $this->semValue = null; + /* will be skipped */ + }, 345 => function ($stackPos) { + $this->semValue = array(); + }, 346 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 347 => function ($stackPos) { + $this->semValue = array(); + }, 348 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 349 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 350 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (5 - 1)][0], $this->semStack[$stackPos - (5 - 1)][1], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 4)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 351 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], $this->semStack[$stackPos - (4 - 3)], null, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 352 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 353 => function ($stackPos) { + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos - (4 - 1)][0], $this->semStack[$stackPos - (4 - 1)][1], null, $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 354 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)]); + }, 355 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 356 => function ($stackPos) { + $this->semValue = array(null, $this->semStack[$stackPos - (1 - 1)]); + }, 357 => function ($stackPos) { + $this->semValue = null; + }, 358 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 359 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 360 => function ($stackPos) { + $this->semValue = 0; + }, 361 => function ($stackPos) { + $this->semValue = 0; + }, 362 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 363 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 364 => function ($stackPos) { + $this->checkModifier($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $stackPos - (2 - 2)); + $this->semValue = $this->semStack[$stackPos - (2 - 1)] | $this->semStack[$stackPos - (2 - 2)]; + }, 365 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; + }, 366 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; + }, 367 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; + }, 368 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_STATIC; + }, 369 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + }, 370 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_FINAL; + }, 371 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_READONLY; + }, 372 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 373 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 374 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 375 => function ($stackPos) { + $this->semValue = new Node\VarLikeIdentifier(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 376 => function ($stackPos) { + $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (1 - 1)], null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 377 => function ($stackPos) { + $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 378 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 379 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 380 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 381 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 382 => function ($stackPos) { + $this->semValue = array(); + }, 383 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 384 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 385 => function ($stackPos) { + $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 386 => function ($stackPos) { + $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 387 => function ($stackPos) { + $this->semValue = new Expr\Assign($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 388 => function ($stackPos) { + $this->semValue = new Expr\AssignRef($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 389 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 390 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 391 => function ($stackPos) { + $this->semValue = new Expr\Clone_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 392 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 393 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 394 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 395 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 396 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 397 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 398 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 399 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 400 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 401 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 402 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 403 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 404 => function ($stackPos) { + $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 405 => function ($stackPos) { + $this->semValue = new Expr\PostInc($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 406 => function ($stackPos) { + $this->semValue = new Expr\PreInc($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 407 => function ($stackPos) { + $this->semValue = new Expr\PostDec($this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 408 => function ($stackPos) { + $this->semValue = new Expr\PreDec($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 409 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 410 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 411 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 412 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 413 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 414 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 415 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 416 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 417 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 418 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 419 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 420 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 421 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 422 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 423 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 424 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 425 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 426 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 427 => function ($stackPos) { + $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 428 => function ($stackPos) { + $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 429 => function ($stackPos) { + $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 430 => function ($stackPos) { + $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 431 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 432 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 433 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 434 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 435 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 436 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 437 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 438 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 439 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 440 => function ($stackPos) { + $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 441 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 442 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (5 - 1)], $this->semStack[$stackPos - (5 - 3)], $this->semStack[$stackPos - (5 - 5)], $this->startAttributeStack[$stackPos - (5 - 1)] + $this->endAttributes); + }, 443 => function ($stackPos) { + $this->semValue = new Expr\Ternary($this->semStack[$stackPos - (4 - 1)], null, $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 444 => function ($stackPos) { + $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 445 => function ($stackPos) { + $this->semValue = new Expr\Isset_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 446 => function ($stackPos) { + $this->semValue = new Expr\Empty_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 447 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 448 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 449 => function ($stackPos) { + $this->semValue = new Expr\Eval_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 450 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 451 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos - (2 - 2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 452 => function ($stackPos) { + $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 453 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; + $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos - (2 - 1)]); + $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos - (2 - 2)], $attrs); + }, 454 => function ($stackPos) { + $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 455 => function ($stackPos) { + $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 456 => function ($stackPos) { + $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 457 => function ($stackPos) { + $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 458 => function ($stackPos) { + $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 459 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes; + $attrs['kind'] = \strtolower($this->semStack[$stackPos - (2 - 1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; + $this->semValue = new Expr\Exit_($this->semStack[$stackPos - (2 - 2)], $attrs); + }, 460 => function ($stackPos) { + $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 461 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 462 => function ($stackPos) { + $this->semValue = new Expr\ShellExec($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 463 => function ($stackPos) { + $this->semValue = new Expr\Print_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 464 => function ($stackPos) { + $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 465 => function ($stackPos) { + $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (2 - 2)], null, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 466 => function ($stackPos) { + $this->semValue = new Expr\Yield_($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 2)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 467 => function ($stackPos) { + $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 468 => function ($stackPos) { + $this->semValue = new Expr\Throw_($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 469 => function ($stackPos) { + $this->semValue = new Expr\ArrowFunction(['static' => \false, 'byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 4)], 'returnType' => $this->semStack[$stackPos - (8 - 6)], 'expr' => $this->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); + }, 470 => function ($stackPos) { + $this->semValue = new Expr\ArrowFunction(['static' => \true, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'returnType' => $this->semStack[$stackPos - (9 - 7)], 'expr' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); + }, 471 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (8 - 2)], 'params' => $this->semStack[$stackPos - (8 - 4)], 'uses' => $this->semStack[$stackPos - (8 - 6)], 'returnType' => $this->semStack[$stackPos - (8 - 7)], 'stmts' => $this->semStack[$stackPos - (8 - 8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes); + }, 472 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'uses' => $this->semStack[$stackPos - (9 - 7)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); + }, 473 => function ($stackPos) { + $this->semValue = new Expr\ArrowFunction(['static' => \false, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'returnType' => $this->semStack[$stackPos - (9 - 7)], 'expr' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => $this->semStack[$stackPos - (9 - 1)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); + }, 474 => function ($stackPos) { + $this->semValue = new Expr\ArrowFunction(['static' => \true, 'byRef' => $this->semStack[$stackPos - (10 - 4)], 'params' => $this->semStack[$stackPos - (10 - 6)], 'returnType' => $this->semStack[$stackPos - (10 - 8)], 'expr' => $this->semStack[$stackPos - (10 - 10)], 'attrGroups' => $this->semStack[$stackPos - (10 - 1)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); + }, 475 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => \false, 'byRef' => $this->semStack[$stackPos - (9 - 3)], 'params' => $this->semStack[$stackPos - (9 - 5)], 'uses' => $this->semStack[$stackPos - (9 - 7)], 'returnType' => $this->semStack[$stackPos - (9 - 8)], 'stmts' => $this->semStack[$stackPos - (9 - 9)], 'attrGroups' => $this->semStack[$stackPos - (9 - 1)]], $this->startAttributeStack[$stackPos - (9 - 1)] + $this->endAttributes); + }, 476 => function ($stackPos) { + $this->semValue = new Expr\Closure(['static' => \true, 'byRef' => $this->semStack[$stackPos - (10 - 4)], 'params' => $this->semStack[$stackPos - (10 - 6)], 'uses' => $this->semStack[$stackPos - (10 - 8)], 'returnType' => $this->semStack[$stackPos - (10 - 9)], 'stmts' => $this->semStack[$stackPos - (10 - 10)], 'attrGroups' => $this->semStack[$stackPos - (10 - 1)]], $this->startAttributeStack[$stackPos - (10 - 1)] + $this->endAttributes); + }, 477 => function ($stackPos) { + $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos - (8 - 4)], 'implements' => $this->semStack[$stackPos - (8 - 5)], 'stmts' => $this->semStack[$stackPos - (8 - 7)], 'attrGroups' => $this->semStack[$stackPos - (8 - 1)]], $this->startAttributeStack[$stackPos - (8 - 1)] + $this->endAttributes), $this->semStack[$stackPos - (8 - 3)]); + $this->checkClass($this->semValue[0], -1); + }, 478 => function ($stackPos) { + $this->semValue = new Expr\New_($this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 479 => function ($stackPos) { + list($class, $ctorArgs) = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 480 => function ($stackPos) { + $this->semValue = array(); + }, 481 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (4 - 3)]; + }, 482 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 483 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 484 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 485 => function ($stackPos) { + $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos - (2 - 2)], $this->semStack[$stackPos - (2 - 1)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 486 => function ($stackPos) { + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 487 => function ($stackPos) { + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 488 => function ($stackPos) { + $this->semValue = new Expr\StaticCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 489 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 490 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 491 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 492 => function ($stackPos) { + $this->semValue = new Name($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 493 => function ($stackPos) { + $this->semValue = new Name\FullyQualified(\substr($this->semStack[$stackPos - (1 - 1)], 1), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 494 => function ($stackPos) { + $this->semValue = new Name\Relative(\substr($this->semStack[$stackPos - (1 - 1)], 10), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 495 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 496 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 497 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 498 => function ($stackPos) { + $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + $this->errorState = 2; + }, 499 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 500 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 501 => function ($stackPos) { + $this->semValue = null; + }, 502 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 503 => function ($stackPos) { + $this->semValue = array(); + }, 504 => function ($stackPos) { + $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos - (1 - 1)], '`'), $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes)); + }, 505 => function ($stackPos) { + foreach ($this->semStack[$stackPos - (1 - 1)] as $s) { + if ($s instanceof Node\Scalar\EncapsedStringPart) { + $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', \true); + } + } + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 506 => function ($stackPos) { + $this->semValue = array(); + }, 507 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 508 => function ($stackPos) { + $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 509 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 510 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 511 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 512 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 513 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 514 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 515 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 516 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 517 => function ($stackPos) { + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 518 => function ($stackPos) { + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos - (3 - 1)], new Expr\Error($this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)]), $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + $this->errorState = 2; + }, 519 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; + $attrs['kind'] = Expr\Array_::KIND_SHORT; + $this->semValue = new Expr\Array_($this->semStack[$stackPos - (3 - 2)], $attrs); + }, 520 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes; + $attrs['kind'] = Expr\Array_::KIND_LONG; + $this->semValue = new Expr\Array_($this->semStack[$stackPos - (4 - 3)], $attrs); + }, 521 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 522 => function ($stackPos) { + $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 523 => function ($stackPos) { + $attrs = $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes; + $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; + foreach ($this->semStack[$stackPos - (3 - 2)] as $s) { + if ($s instanceof Node\Scalar\EncapsedStringPart) { + $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', \true); + } + } + $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos - (3 - 2)], $attrs); + }, 524 => function ($stackPos) { + $this->semValue = $this->parseLNumber($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 525 => function ($stackPos) { + $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 526 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 527 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 528 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 529 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true); + }, 530 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos - (2 - 1)], '', $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (2 - 2)] + $this->endAttributeStack[$stackPos - (2 - 2)], \true); + }, 531 => function ($stackPos) { + $this->semValue = $this->parseDocString($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 2)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes, $this->startAttributeStack[$stackPos - (3 - 3)] + $this->endAttributeStack[$stackPos - (3 - 3)], \true); + }, 532 => function ($stackPos) { + $this->semValue = null; + }, 533 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 534 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 535 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 536 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 537 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 538 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 539 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 540 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 541 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 542 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 543 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 544 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 545 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 546 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 547 => function ($stackPos) { + $this->semValue = new Expr\MethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 548 => function ($stackPos) { + $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->semStack[$stackPos - (4 - 4)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 549 => function ($stackPos) { + $this->semValue = null; + }, 550 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 551 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 552 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 553 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 554 => function ($stackPos) { + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 555 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 556 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 557 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 558 => function ($stackPos) { + $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes), $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + $this->errorState = 2; + }, 559 => function ($stackPos) { + $var = $this->semStack[$stackPos - (1 - 1)]->name; + $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes) : $var; + }, 560 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 561 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 562 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 563 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 564 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 565 => function ($stackPos) { + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 566 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 567 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 568 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 569 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 570 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 571 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 572 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 573 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 574 => function ($stackPos) { + $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + $this->errorState = 2; + }, 575 => function ($stackPos) { + $this->semValue = new Expr\List_($this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 576 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + $end = \count($this->semValue) - 1; + if ($this->semValue[$end] === null) { + \array_pop($this->semValue); + } + }, 577 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, 578 => function ($stackPos) { + /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ + }, 579 => function ($stackPos) { + $this->semStack[$stackPos - (3 - 1)][] = $this->semStack[$stackPos - (3 - 3)]; + $this->semValue = $this->semStack[$stackPos - (3 - 1)]; + }, 580 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 581 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 582 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 583 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (1 - 1)], null, \false, $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 584 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 585 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (4 - 4)], $this->semStack[$stackPos - (4 - 1)], \true, $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 586 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (3 - 3)], $this->semStack[$stackPos - (3 - 1)], \false, $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 587 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos - (2 - 2)], null, \false, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes, \true, $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 588 => function ($stackPos) { + $this->semValue = null; + }, 589 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 590 => function ($stackPos) { + $this->semStack[$stackPos - (2 - 1)][] = $this->semStack[$stackPos - (2 - 2)]; + $this->semValue = $this->semStack[$stackPos - (2 - 1)]; + }, 591 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (1 - 1)]); + }, 592 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos - (2 - 1)], $this->semStack[$stackPos - (2 - 2)]); + }, 593 => function ($stackPos) { + $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 594 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 595 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }, 596 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (4 - 1)], $this->semStack[$stackPos - (4 - 3)], $this->startAttributeStack[$stackPos - (4 - 1)] + $this->endAttributes); + }, 597 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 598 => function ($stackPos) { + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos - (3 - 1)], $this->semStack[$stackPos - (3 - 3)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 599 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 600 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos - (3 - 2)], $this->startAttributeStack[$stackPos - (3 - 1)] + $this->endAttributes); + }, 601 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos - (6 - 2)], $this->semStack[$stackPos - (6 - 4)], $this->startAttributeStack[$stackPos - (6 - 1)] + $this->endAttributes); + }, 602 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (3 - 2)]; + }, 603 => function ($stackPos) { + $this->semValue = new Scalar\String_($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 604 => function ($stackPos) { + $this->semValue = $this->parseNumString($this->semStack[$stackPos - (1 - 1)], $this->startAttributeStack[$stackPos - (1 - 1)] + $this->endAttributes); + }, 605 => function ($stackPos) { + $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos - (2 - 2)], $this->startAttributeStack[$stackPos - (2 - 1)] + $this->endAttributes); + }, 606 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos - (1 - 1)]; + }]; + } +} +lexer = $lexer; + if (isset($options['throwOnError'])) { + throw new \LogicException('"throwOnError" is no longer supported, use "errorHandler" instead'); + } + $this->initReduceCallbacks(); + } + /** + * Parses PHP code into a node tree. + * + * If a non-throwing error handler is used, the parser will continue parsing after an error + * occurred and attempt to build a partial AST. + * + * @param string $code The source code to parse + * @param ErrorHandler|null $errorHandler Error handler to use for lexer/parser errors, defaults + * to ErrorHandler\Throwing. + * + * @return Node\Stmt[]|null Array of statements (or null non-throwing error handler is used and + * the parser was unable to recover from an error). + */ + public function parse(string $code, ErrorHandler $errorHandler = null) + { + $this->errorHandler = $errorHandler ?: new ErrorHandler\Throwing(); + $this->lexer->startLexing($code, $this->errorHandler); + $result = $this->doParse(); + // Clear out some of the interior state, so we don't hold onto unnecessary + // memory between uses of the parser + $this->startAttributeStack = []; + $this->endAttributeStack = []; + $this->semStack = []; + $this->semValue = null; + return $result; + } + protected function doParse() + { + // We start off with no lookahead-token + $symbol = self::SYMBOL_NONE; + // The attributes for a node are taken from the first and last token of the node. + // From the first token only the startAttributes are taken and from the last only + // the endAttributes. Both are merged using the array union operator (+). + $startAttributes = []; + $endAttributes = []; + $this->endAttributes = $endAttributes; + // Keep stack of start and end attributes + $this->startAttributeStack = []; + $this->endAttributeStack = [$endAttributes]; + // Start off in the initial state and keep a stack of previous states + $state = 0; + $stateStack = [$state]; + // Semantic value stack (contains values of tokens and semantic action results) + $this->semStack = []; + // Current position in the stack(s) + $stackPos = 0; + $this->errorState = 0; + for (;;) { + //$this->traceNewState($state, $symbol); + if ($this->actionBase[$state] === 0) { + $rule = $this->actionDefault[$state]; + } else { + if ($symbol === self::SYMBOL_NONE) { + // Fetch the next token id from the lexer and fetch additional info by-ref. + // The end attributes are fetched into a temporary variable and only set once the token is really + // shifted (not during read). Otherwise you would sometimes get off-by-one errors, when a rule is + // reduced after a token was read but not yet shifted. + $tokenId = $this->lexer->getNextToken($tokenValue, $startAttributes, $endAttributes); + // map the lexer token id to the internally used symbols + $symbol = $tokenId >= 0 && $tokenId < $this->tokenToSymbolMapSize ? $this->tokenToSymbol[$tokenId] : $this->invalidSymbol; + if ($symbol === $this->invalidSymbol) { + throw new \RangeException(\sprintf('The lexer returned an invalid token (id=%d, value=%s)', $tokenId, $tokenValue)); + } + // Allow productions to access the start attributes of the lookahead token. + $this->lookaheadStartAttributes = $startAttributes; + //$this->traceRead($symbol); + } + $idx = $this->actionBase[$state] + $symbol; + if (($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol) && ($action = $this->action[$idx]) !== $this->defaultAction) { + /* + * >= numNonLeafStates: shift and reduce + * > 0: shift + * = 0: accept + * < 0: reduce + * = -YYUNEXPECTED: error + */ + if ($action > 0) { + /* shift */ + //$this->traceShift($symbol); + ++$stackPos; + $stateStack[$stackPos] = $state = $action; + $this->semStack[$stackPos] = $tokenValue; + $this->startAttributeStack[$stackPos] = $startAttributes; + $this->endAttributeStack[$stackPos] = $endAttributes; + $this->endAttributes = $endAttributes; + $symbol = self::SYMBOL_NONE; + if ($this->errorState) { + --$this->errorState; + } + if ($action < $this->numNonLeafStates) { + continue; + } + /* $yyn >= numNonLeafStates means shift-and-reduce */ + $rule = $action - $this->numNonLeafStates; + } else { + $rule = -$action; + } + } else { + $rule = $this->actionDefault[$state]; + } + } + for (;;) { + if ($rule === 0) { + /* accept */ + //$this->traceAccept(); + return $this->semValue; + } elseif ($rule !== $this->unexpectedTokenRule) { + /* reduce */ + //$this->traceReduce($rule); + try { + $this->reduceCallbacks[$rule]($stackPos); + } catch (Error $e) { + if (-1 === $e->getStartLine() && isset($startAttributes['startLine'])) { + $e->setStartLine($startAttributes['startLine']); + } + $this->emitError($e); + // Can't recover from this type of error + return null; + } + /* Goto - shift nonterminal */ + $lastEndAttributes = $this->endAttributeStack[$stackPos]; + $ruleLength = $this->ruleToLength[$rule]; + $stackPos -= $ruleLength; + $nonTerminal = $this->ruleToNonTerminal[$rule]; + $idx = $this->gotoBase[$nonTerminal] + $stateStack[$stackPos]; + if ($idx >= 0 && $idx < $this->gotoTableSize && $this->gotoCheck[$idx] === $nonTerminal) { + $state = $this->goto[$idx]; + } else { + $state = $this->gotoDefault[$nonTerminal]; + } + ++$stackPos; + $stateStack[$stackPos] = $state; + $this->semStack[$stackPos] = $this->semValue; + $this->endAttributeStack[$stackPos] = $lastEndAttributes; + if ($ruleLength === 0) { + // Empty productions use the start attributes of the lookahead token. + $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; + } + } else { + /* error */ + switch ($this->errorState) { + case 0: + $msg = $this->getErrorMessage($symbol, $state); + $this->emitError(new Error($msg, $startAttributes + $endAttributes)); + // Break missing intentionally + case 1: + case 2: + $this->errorState = 3; + // Pop until error-expecting state uncovered + while (!(($idx = $this->actionBase[$state] + $this->errorSymbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $this->errorSymbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $this->errorSymbol) || ($action = $this->action[$idx]) === $this->defaultAction) { + // Not totally sure about this + if ($stackPos <= 0) { + // Could not recover from error + return null; + } + $state = $stateStack[--$stackPos]; + //$this->tracePop($state); + } + //$this->traceShift($this->errorSymbol); + ++$stackPos; + $stateStack[$stackPos] = $state = $action; + // We treat the error symbol as being empty, so we reset the end attributes + // to the end attributes of the last non-error symbol + $this->startAttributeStack[$stackPos] = $this->lookaheadStartAttributes; + $this->endAttributeStack[$stackPos] = $this->endAttributeStack[$stackPos - 1]; + $this->endAttributes = $this->endAttributeStack[$stackPos - 1]; + break; + case 3: + if ($symbol === 0) { + // Reached EOF without recovering from error + return null; + } + //$this->traceDiscard($symbol); + $symbol = self::SYMBOL_NONE; + break 2; + } + } + if ($state < $this->numNonLeafStates) { + break; + } + /* >= numNonLeafStates means shift-and-reduce */ + $rule = $state - $this->numNonLeafStates; + } + } + throw new \RuntimeException('Reached end of parser loop'); + } + protected function emitError(Error $error) + { + $this->errorHandler->handleError($error); + } + /** + * Format error message including expected tokens. + * + * @param int $symbol Unexpected symbol + * @param int $state State at time of error + * + * @return string Formatted error message + */ + protected function getErrorMessage(int $symbol, int $state) : string + { + $expectedString = ''; + if ($expected = $this->getExpectedTokens($state)) { + $expectedString = ', expecting ' . \implode(' or ', $expected); + } + return 'Syntax error, unexpected ' . $this->symbolToName[$symbol] . $expectedString; + } + /** + * Get limited number of expected tokens in given state. + * + * @param int $state State + * + * @return string[] Expected tokens. If too many, an empty array is returned. + */ + protected function getExpectedTokens(int $state) : array + { + $expected = []; + $base = $this->actionBase[$state]; + foreach ($this->symbolToName as $symbol => $name) { + $idx = $base + $symbol; + if ($idx >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol || $state < $this->YY2TBLSTATE && ($idx = $this->actionBase[$state + $this->numNonLeafStates] + $symbol) >= 0 && $idx < $this->actionTableSize && $this->actionCheck[$idx] === $symbol) { + if ($this->action[$idx] !== $this->unexpectedTokenRule && $this->action[$idx] !== $this->defaultAction && $symbol !== $this->errorSymbol) { + if (\count($expected) === 4) { + /* Too many expected tokens */ + return []; + } + $expected[] = $name; + } + } + } + return $expected; + } + /* + * Tracing functions used for debugging the parser. + */ + /* + protected function traceNewState($state, $symbol) { + echo '% State ' . $state + . ', Lookahead ' . ($symbol == self::SYMBOL_NONE ? '--none--' : $this->symbolToName[$symbol]) . "\n"; + } + + protected function traceRead($symbol) { + echo '% Reading ' . $this->symbolToName[$symbol] . "\n"; + } + + protected function traceShift($symbol) { + echo '% Shift ' . $this->symbolToName[$symbol] . "\n"; + } + + protected function traceAccept() { + echo "% Accepted.\n"; + } + + protected function traceReduce($n) { + echo '% Reduce by (' . $n . ') ' . $this->productions[$n] . "\n"; + } + + protected function tracePop($state) { + echo '% Recovering, uncovered state ' . $state . "\n"; + } + + protected function traceDiscard($symbol) { + echo '% Discard ' . $this->symbolToName[$symbol] . "\n"; + } + */ + /* + * Helper functions invoked by semantic actions + */ + /** + * Moves statements of semicolon-style namespaces into $ns->stmts and checks various error conditions. + * + * @param Node\Stmt[] $stmts + * @return Node\Stmt[] + */ + protected function handleNamespaces(array $stmts) : array + { + $hasErrored = \false; + $style = $this->getNamespacingStyle($stmts); + if (null === $style) { + // not namespaced, nothing to do + return $stmts; + } elseif ('brace' === $style) { + // For braced namespaces we only have to check that there are no invalid statements between the namespaces + $afterFirstNamespace = \false; + foreach ($stmts as $stmt) { + if ($stmt instanceof Node\Stmt\Namespace_) { + $afterFirstNamespace = \true; + } elseif (!$stmt instanceof Node\Stmt\HaltCompiler && !$stmt instanceof Node\Stmt\Nop && $afterFirstNamespace && !$hasErrored) { + $this->emitError(new Error('No code may exist outside of namespace {}', $stmt->getAttributes())); + $hasErrored = \true; + // Avoid one error for every statement + } + } + return $stmts; + } else { + // For semicolon namespaces we have to move the statements after a namespace declaration into ->stmts + $resultStmts = []; + $targetStmts =& $resultStmts; + $lastNs = null; + foreach ($stmts as $stmt) { + if ($stmt instanceof Node\Stmt\Namespace_) { + if ($lastNs !== null) { + $this->fixupNamespaceAttributes($lastNs); + } + if ($stmt->stmts === null) { + $stmt->stmts = []; + $targetStmts =& $stmt->stmts; + $resultStmts[] = $stmt; + } else { + // This handles the invalid case of mixed style namespaces + $resultStmts[] = $stmt; + $targetStmts =& $resultStmts; + } + $lastNs = $stmt; + } elseif ($stmt instanceof Node\Stmt\HaltCompiler) { + // __halt_compiler() is not moved into the namespace + $resultStmts[] = $stmt; + } else { + $targetStmts[] = $stmt; + } + } + if ($lastNs !== null) { + $this->fixupNamespaceAttributes($lastNs); + } + return $resultStmts; + } + } + private function fixupNamespaceAttributes(Node\Stmt\Namespace_ $stmt) + { + // We moved the statements into the namespace node, as such the end of the namespace node + // needs to be extended to the end of the statements. + if (empty($stmt->stmts)) { + return; + } + // We only move the builtin end attributes here. This is the best we can do with the + // knowledge we have. + $endAttributes = ['endLine', 'endFilePos', 'endTokenPos']; + $lastStmt = $stmt->stmts[\count($stmt->stmts) - 1]; + foreach ($endAttributes as $endAttribute) { + if ($lastStmt->hasAttribute($endAttribute)) { + $stmt->setAttribute($endAttribute, $lastStmt->getAttribute($endAttribute)); + } + } + } + /** + * Determine namespacing style (semicolon or brace) + * + * @param Node[] $stmts Top-level statements. + * + * @return null|string One of "semicolon", "brace" or null (no namespaces) + */ + private function getNamespacingStyle(array $stmts) + { + $style = null; + $hasNotAllowedStmts = \false; + foreach ($stmts as $i => $stmt) { + if ($stmt instanceof Node\Stmt\Namespace_) { + $currentStyle = null === $stmt->stmts ? 'semicolon' : 'brace'; + if (null === $style) { + $style = $currentStyle; + if ($hasNotAllowedStmts) { + $this->emitError(new Error('Namespace declaration statement has to be the very first statement in the script', $stmt->getLine())); + } + } elseif ($style !== $currentStyle) { + $this->emitError(new Error('Cannot mix bracketed namespace declarations with unbracketed namespace declarations', $stmt->getLine())); + // Treat like semicolon style for namespace normalization + return 'semicolon'; + } + continue; + } + /* declare(), __halt_compiler() and nops can be used before a namespace declaration */ + if ($stmt instanceof Node\Stmt\Declare_ || $stmt instanceof Node\Stmt\HaltCompiler || $stmt instanceof Node\Stmt\Nop) { + continue; + } + /* There may be a hashbang line at the very start of the file */ + if ($i === 0 && $stmt instanceof Node\Stmt\InlineHTML && \preg_match('/\\A#!.*\\r?\\n\\z/', $stmt->value)) { + continue; + } + /* Everything else if forbidden before namespace declarations */ + $hasNotAllowedStmts = \true; + } + return $style; + } + /** + * Fix up parsing of static property calls in PHP 5. + * + * In PHP 5 A::$b[c][d] and A::$b[c][d]() have very different interpretation. The former is + * interpreted as (A::$b)[c][d], while the latter is the same as A::{$b[c][d]}(). We parse the + * latter as the former initially and this method fixes the AST into the correct form when we + * encounter the "()". + * + * @param Node\Expr\StaticPropertyFetch|Node\Expr\ArrayDimFetch $prop + * @param Node\Arg[] $args + * @param array $attributes + * + * @return Expr\StaticCall + */ + protected function fixupPhp5StaticPropCall($prop, array $args, array $attributes) : Expr\StaticCall + { + if ($prop instanceof Node\Expr\StaticPropertyFetch) { + $name = $prop->name instanceof VarLikeIdentifier ? $prop->name->toString() : $prop->name; + $var = new Expr\Variable($name, $prop->name->getAttributes()); + return new Expr\StaticCall($prop->class, $var, $args, $attributes); + } elseif ($prop instanceof Node\Expr\ArrayDimFetch) { + $tmp = $prop; + while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { + $tmp = $tmp->var; + } + /** @var Expr\StaticPropertyFetch $staticProp */ + $staticProp = $tmp->var; + // Set start attributes to attributes of innermost node + $tmp = $prop; + $this->fixupStartAttributes($tmp, $staticProp->name); + while ($tmp->var instanceof Node\Expr\ArrayDimFetch) { + $tmp = $tmp->var; + $this->fixupStartAttributes($tmp, $staticProp->name); + } + $name = $staticProp->name instanceof VarLikeIdentifier ? $staticProp->name->toString() : $staticProp->name; + $tmp->var = new Expr\Variable($name, $staticProp->name->getAttributes()); + return new Expr\StaticCall($staticProp->class, $prop, $args, $attributes); + } else { + throw new \Exception(); + } + } + protected function fixupStartAttributes(Node $to, Node $from) + { + $startAttributes = ['startLine', 'startFilePos', 'startTokenPos']; + foreach ($startAttributes as $startAttribute) { + if ($from->hasAttribute($startAttribute)) { + $to->setAttribute($startAttribute, $from->getAttribute($startAttribute)); + } + } + } + protected function handleBuiltinTypes(Name $name) + { + $builtinTypes = ['bool' => \true, 'int' => \true, 'float' => \true, 'string' => \true, 'iterable' => \true, 'void' => \true, 'object' => \true, 'null' => \true, 'false' => \true, 'mixed' => \true, 'never' => \true, 'true' => \true]; + if (!$name->isUnqualified()) { + return $name; + } + $lowerName = $name->toLowerString(); + if (!isset($builtinTypes[$lowerName])) { + return $name; + } + return new Node\Identifier($lowerName, $name->getAttributes()); + } + /** + * Get combined start and end attributes at a stack location + * + * @param int $pos Stack location + * + * @return array Combined start and end attributes + */ + protected function getAttributesAt(int $pos) : array + { + return $this->startAttributeStack[$pos] + $this->endAttributeStack[$pos]; + } + protected function getFloatCastKind(string $cast) : int + { + $cast = \strtolower($cast); + if (\strpos($cast, 'float') !== \false) { + return Double::KIND_FLOAT; + } + if (\strpos($cast, 'real') !== \false) { + return Double::KIND_REAL; + } + return Double::KIND_DOUBLE; + } + protected function parseLNumber($str, $attributes, $allowInvalidOctal = \false) + { + try { + return LNumber::fromString($str, $attributes, $allowInvalidOctal); + } catch (Error $error) { + $this->emitError($error); + // Use dummy value + return new LNumber(0, $attributes); + } + } + /** + * Parse a T_NUM_STRING token into either an integer or string node. + * + * @param string $str Number string + * @param array $attributes Attributes + * + * @return LNumber|String_ Integer or string node. + */ + protected function parseNumString(string $str, array $attributes) + { + if (!\preg_match('/^(?:0|-?[1-9][0-9]*)$/', $str)) { + return new String_($str, $attributes); + } + $num = +$str; + if (!\is_int($num)) { + return new String_($str, $attributes); + } + return new LNumber($num, $attributes); + } + protected function stripIndentation(string $string, int $indentLen, string $indentChar, bool $newlineAtStart, bool $newlineAtEnd, array $attributes) + { + if ($indentLen === 0) { + return $string; + } + $start = $newlineAtStart ? '(?:(?<=\\n)|\\A)' : '(?<=\\n)'; + $end = $newlineAtEnd ? '(?:(?=[\\r\\n])|\\z)' : '(?=[\\r\\n])'; + $regex = '/' . $start . '([ \\t]*)(' . $end . ')?/'; + return \preg_replace_callback($regex, function ($matches) use($indentLen, $indentChar, $attributes) { + $prefix = \substr($matches[1], 0, $indentLen); + if (\false !== \strpos($prefix, $indentChar === " " ? "\t" : " ")) { + $this->emitError(new Error('Invalid indentation - tabs and spaces cannot be mixed', $attributes)); + } elseif (\strlen($prefix) < $indentLen && !isset($matches[2])) { + $this->emitError(new Error('Invalid body indentation level ' . '(expecting an indentation level of at least ' . $indentLen . ')', $attributes)); + } + return \substr($matches[0], \strlen($prefix)); + }, $string); + } + protected function parseDocString(string $startToken, $contents, string $endToken, array $attributes, array $endTokenAttributes, bool $parseUnicodeEscape) + { + $kind = \strpos($startToken, "'") === \false ? String_::KIND_HEREDOC : String_::KIND_NOWDOC; + $regex = '/\\A[bB]?<<<[ \\t]*[\'"]?([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)[\'"]?(?:\\r\\n|\\n|\\r)\\z/'; + $result = \preg_match($regex, $startToken, $matches); + \assert($result === 1); + $label = $matches[1]; + $result = \preg_match('/\\A[ \\t]*/', $endToken, $matches); + \assert($result === 1); + $indentation = $matches[0]; + $attributes['kind'] = $kind; + $attributes['docLabel'] = $label; + $attributes['docIndentation'] = $indentation; + $indentHasSpaces = \false !== \strpos($indentation, " "); + $indentHasTabs = \false !== \strpos($indentation, "\t"); + if ($indentHasSpaces && $indentHasTabs) { + $this->emitError(new Error('Invalid indentation - tabs and spaces cannot be mixed', $endTokenAttributes)); + // Proceed processing as if this doc string is not indented + $indentation = ''; + } + $indentLen = \strlen($indentation); + $indentChar = $indentHasSpaces ? " " : "\t"; + if (\is_string($contents)) { + if ($contents === '') { + return new String_('', $attributes); + } + $contents = $this->stripIndentation($contents, $indentLen, $indentChar, \true, \true, $attributes); + $contents = \preg_replace('~(\\r\\n|\\n|\\r)\\z~', '', $contents); + if ($kind === String_::KIND_HEREDOC) { + $contents = String_::parseEscapeSequences($contents, null, $parseUnicodeEscape); + } + return new String_($contents, $attributes); + } else { + \assert(\count($contents) > 0); + if (!$contents[0] instanceof Node\Scalar\EncapsedStringPart) { + // If there is no leading encapsed string part, pretend there is an empty one + $this->stripIndentation('', $indentLen, $indentChar, \true, \false, $contents[0]->getAttributes()); + } + $newContents = []; + foreach ($contents as $i => $part) { + if ($part instanceof Node\Scalar\EncapsedStringPart) { + $isLast = $i === \count($contents) - 1; + $part->value = $this->stripIndentation($part->value, $indentLen, $indentChar, $i === 0, $isLast, $part->getAttributes()); + $part->value = String_::parseEscapeSequences($part->value, null, $parseUnicodeEscape); + if ($isLast) { + $part->value = \preg_replace('~(\\r\\n|\\n|\\r)\\z~', '', $part->value); + } + if ('' === $part->value) { + continue; + } + } + $newContents[] = $part; + } + return new Encapsed($newContents, $attributes); + } + } + /** + * Create attributes for a zero-length common-capturing nop. + * + * @param Comment[] $comments + * @return array + */ + protected function createCommentNopAttributes(array $comments) + { + $comment = $comments[\count($comments) - 1]; + $commentEndLine = $comment->getEndLine(); + $commentEndFilePos = $comment->getEndFilePos(); + $commentEndTokenPos = $comment->getEndTokenPos(); + $attributes = ['comments' => $comments]; + if (-1 !== $commentEndLine) { + $attributes['startLine'] = $commentEndLine; + $attributes['endLine'] = $commentEndLine; + } + if (-1 !== $commentEndFilePos) { + $attributes['startFilePos'] = $commentEndFilePos + 1; + $attributes['endFilePos'] = $commentEndFilePos; + } + if (-1 !== $commentEndTokenPos) { + $attributes['startTokenPos'] = $commentEndTokenPos + 1; + $attributes['endTokenPos'] = $commentEndTokenPos; + } + return $attributes; + } + protected function checkClassModifier($a, $b, $modifierPos) + { + try { + Class_::verifyClassModifier($a, $b); + } catch (Error $error) { + $error->setAttributes($this->getAttributesAt($modifierPos)); + $this->emitError($error); + } + } + protected function checkModifier($a, $b, $modifierPos) + { + // Jumping through some hoops here because verifyModifier() is also used elsewhere + try { + Class_::verifyModifier($a, $b); + } catch (Error $error) { + $error->setAttributes($this->getAttributesAt($modifierPos)); + $this->emitError($error); + } + } + protected function checkParam(Param $node) + { + if ($node->variadic && null !== $node->default) { + $this->emitError(new Error('Variadic parameter cannot have a default value', $node->default->getAttributes())); + } + } + protected function checkTryCatch(TryCatch $node) + { + if (empty($node->catches) && null === $node->finally) { + $this->emitError(new Error('Cannot use try without catch or finally', $node->getAttributes())); + } + } + protected function checkNamespace(Namespace_ $node) + { + if (null !== $node->stmts) { + foreach ($node->stmts as $stmt) { + if ($stmt instanceof Namespace_) { + $this->emitError(new Error('Namespace declarations cannot be nested', $stmt->getAttributes())); + } + } + } + } + private function checkClassName($name, $namePos) + { + if (null !== $name && $name->isSpecialClassName()) { + $this->emitError(new Error(\sprintf('Cannot use \'%s\' as class name as it is reserved', $name), $this->getAttributesAt($namePos))); + } + } + private function checkImplementedInterfaces(array $interfaces) + { + foreach ($interfaces as $interface) { + if ($interface->isSpecialClassName()) { + $this->emitError(new Error(\sprintf('Cannot use \'%s\' as interface name as it is reserved', $interface), $interface->getAttributes())); + } + } + } + protected function checkClass(Class_ $node, $namePos) + { + $this->checkClassName($node->name, $namePos); + if ($node->extends && $node->extends->isSpecialClassName()) { + $this->emitError(new Error(\sprintf('Cannot use \'%s\' as class name as it is reserved', $node->extends), $node->extends->getAttributes())); + } + $this->checkImplementedInterfaces($node->implements); + } + protected function checkInterface(Interface_ $node, $namePos) + { + $this->checkClassName($node->name, $namePos); + $this->checkImplementedInterfaces($node->extends); + } + protected function checkEnum(Enum_ $node, $namePos) + { + $this->checkClassName($node->name, $namePos); + $this->checkImplementedInterfaces($node->implements); + } + protected function checkClassMethod(ClassMethod $node, $modifierPos) + { + if ($node->flags & Class_::MODIFIER_STATIC) { + switch ($node->name->toLowerString()) { + case '__construct': + $this->emitError(new Error(\sprintf('Constructor %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); + break; + case '__destruct': + $this->emitError(new Error(\sprintf('Destructor %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); + break; + case '__clone': + $this->emitError(new Error(\sprintf('Clone method %s() cannot be static', $node->name), $this->getAttributesAt($modifierPos))); + break; + } + } + if ($node->flags & Class_::MODIFIER_READONLY) { + $this->emitError(new Error(\sprintf('Method %s() cannot be readonly', $node->name), $this->getAttributesAt($modifierPos))); + } + } + protected function checkClassConst(ClassConst $node, $modifierPos) + { + if ($node->flags & Class_::MODIFIER_STATIC) { + $this->emitError(new Error("Cannot use 'static' as constant modifier", $this->getAttributesAt($modifierPos))); + } + if ($node->flags & Class_::MODIFIER_ABSTRACT) { + $this->emitError(new Error("Cannot use 'abstract' as constant modifier", $this->getAttributesAt($modifierPos))); + } + if ($node->flags & Class_::MODIFIER_READONLY) { + $this->emitError(new Error("Cannot use 'readonly' as constant modifier", $this->getAttributesAt($modifierPos))); + } + } + protected function checkProperty(Property $node, $modifierPos) + { + if ($node->flags & Class_::MODIFIER_ABSTRACT) { + $this->emitError(new Error('Properties cannot be declared abstract', $this->getAttributesAt($modifierPos))); + } + if ($node->flags & Class_::MODIFIER_FINAL) { + $this->emitError(new Error('Properties cannot be declared final', $this->getAttributesAt($modifierPos))); + } + } + protected function checkUseUse(UseUse $node, $namePos) + { + if ($node->alias && $node->alias->isSpecialClassName()) { + $this->emitError(new Error(\sprintf('Cannot use %s as %s because \'%2$s\' is a special class name', $node->name, $node->alias), $this->getAttributesAt($namePos))); + } + } +} +pAttrGroups($node->attrGroups, \true) . $this->pModifiers($node->flags) . ($node->type ? $this->p($node->type) . ' ' : '') . ($node->byRef ? '&' : '') . ($node->variadic ? '...' : '') . $this->p($node->var) . ($node->default ? ' = ' . $this->p($node->default) : ''); + } + protected function pArg(Node\Arg $node) + { + return ($node->name ? $node->name->toString() . ': ' : '') . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); + } + protected function pVariadicPlaceholder(Node\VariadicPlaceholder $node) + { + return '...'; + } + protected function pConst(Node\Const_ $node) + { + return $node->name . ' = ' . $this->p($node->value); + } + protected function pNullableType(Node\NullableType $node) + { + return '?' . $this->p($node->type); + } + protected function pUnionType(Node\UnionType $node) + { + $types = []; + foreach ($node->types as $typeNode) { + if ($typeNode instanceof Node\IntersectionType) { + $types[] = '(' . $this->p($typeNode) . ')'; + continue; + } + $types[] = $this->p($typeNode); + } + return \implode('|', $types); + } + protected function pIntersectionType(Node\IntersectionType $node) + { + return $this->pImplode($node->types, '&'); + } + protected function pIdentifier(Node\Identifier $node) + { + return $node->name; + } + protected function pVarLikeIdentifier(Node\VarLikeIdentifier $node) + { + return '$' . $node->name; + } + protected function pAttribute(Node\Attribute $node) + { + return $this->p($node->name) . ($node->args ? '(' . $this->pCommaSeparated($node->args) . ')' : ''); + } + protected function pAttributeGroup(Node\AttributeGroup $node) + { + return '#[' . $this->pCommaSeparated($node->attrs) . ']'; + } + // Names + protected function pName(Name $node) + { + return \implode('\\', $node->parts); + } + protected function pName_FullyQualified(Name\FullyQualified $node) + { + return '\\' . \implode('\\', $node->parts); + } + protected function pName_Relative(Name\Relative $node) + { + return 'namespace\\' . \implode('\\', $node->parts); + } + // Magic Constants + protected function pScalar_MagicConst_Class(MagicConst\Class_ $node) + { + return '__CLASS__'; + } + protected function pScalar_MagicConst_Dir(MagicConst\Dir $node) + { + return '__DIR__'; + } + protected function pScalar_MagicConst_File(MagicConst\File $node) + { + return '__FILE__'; + } + protected function pScalar_MagicConst_Function(MagicConst\Function_ $node) + { + return '__FUNCTION__'; + } + protected function pScalar_MagicConst_Line(MagicConst\Line $node) + { + return '__LINE__'; + } + protected function pScalar_MagicConst_Method(MagicConst\Method $node) + { + return '__METHOD__'; + } + protected function pScalar_MagicConst_Namespace(MagicConst\Namespace_ $node) + { + return '__NAMESPACE__'; + } + protected function pScalar_MagicConst_Trait(MagicConst\Trait_ $node) + { + return '__TRAIT__'; + } + // Scalars + protected function pScalar_String(Scalar\String_ $node) + { + $kind = $node->getAttribute('kind', Scalar\String_::KIND_SINGLE_QUOTED); + switch ($kind) { + case Scalar\String_::KIND_NOWDOC: + $label = $node->getAttribute('docLabel'); + if ($label && !$this->containsEndLabel($node->value, $label)) { + if ($node->value === '') { + return "<<<'{$label}'\n{$label}" . $this->docStringEndToken; + } + return "<<<'{$label}'\n{$node->value}\n{$label}" . $this->docStringEndToken; + } + /* break missing intentionally */ + case Scalar\String_::KIND_SINGLE_QUOTED: + return $this->pSingleQuotedString($node->value); + case Scalar\String_::KIND_HEREDOC: + $label = $node->getAttribute('docLabel'); + if ($label && !$this->containsEndLabel($node->value, $label)) { + if ($node->value === '') { + return "<<<{$label}\n{$label}" . $this->docStringEndToken; + } + $escaped = $this->escapeString($node->value, null); + return "<<<{$label}\n" . $escaped . "\n{$label}" . $this->docStringEndToken; + } + /* break missing intentionally */ + case Scalar\String_::KIND_DOUBLE_QUOTED: + return '"' . $this->escapeString($node->value, '"') . '"'; + } + throw new \Exception('Invalid string kind'); + } + protected function pScalar_Encapsed(Scalar\Encapsed $node) + { + if ($node->getAttribute('kind') === Scalar\String_::KIND_HEREDOC) { + $label = $node->getAttribute('docLabel'); + if ($label && !$this->encapsedContainsEndLabel($node->parts, $label)) { + if (\count($node->parts) === 1 && $node->parts[0] instanceof Scalar\EncapsedStringPart && $node->parts[0]->value === '') { + return "<<<{$label}\n{$label}" . $this->docStringEndToken; + } + return "<<<{$label}\n" . $this->pEncapsList($node->parts, null) . "\n{$label}" . $this->docStringEndToken; + } + } + return '"' . $this->pEncapsList($node->parts, '"') . '"'; + } + protected function pScalar_LNumber(Scalar\LNumber $node) + { + if ($node->value === -\PHP_INT_MAX - 1) { + // PHP_INT_MIN cannot be represented as a literal, + // because the sign is not part of the literal + return '(-' . \PHP_INT_MAX . '-1)'; + } + $kind = $node->getAttribute('kind', Scalar\LNumber::KIND_DEC); + if (Scalar\LNumber::KIND_DEC === $kind) { + return (string) $node->value; + } + if ($node->value < 0) { + $sign = '-'; + $str = (string) -$node->value; + } else { + $sign = ''; + $str = (string) $node->value; + } + switch ($kind) { + case Scalar\LNumber::KIND_BIN: + return $sign . '0b' . \base_convert($str, 10, 2); + case Scalar\LNumber::KIND_OCT: + return $sign . '0' . \base_convert($str, 10, 8); + case Scalar\LNumber::KIND_HEX: + return $sign . '0x' . \base_convert($str, 10, 16); + } + throw new \Exception('Invalid number kind'); + } + protected function pScalar_DNumber(Scalar\DNumber $node) + { + if (!\is_finite($node->value)) { + if ($node->value === \INF) { + return '\\INF'; + } elseif ($node->value === -\INF) { + return '-\\INF'; + } else { + return '\\NAN'; + } + } + // Try to find a short full-precision representation + $stringValue = \sprintf('%.16G', $node->value); + if ($node->value !== (double) $stringValue) { + $stringValue = \sprintf('%.17G', $node->value); + } + // %G is locale dependent and there exists no locale-independent alternative. We don't want + // mess with switching locales here, so let's assume that a comma is the only non-standard + // decimal separator we may encounter... + $stringValue = \str_replace(',', '.', $stringValue); + // ensure that number is really printed as float + return \preg_match('/^-?[0-9]+$/', $stringValue) ? $stringValue . '.0' : $stringValue; + } + protected function pScalar_EncapsedStringPart(Scalar\EncapsedStringPart $node) + { + throw new \LogicException('Cannot directly print EncapsedStringPart'); + } + // Assignments + protected function pExpr_Assign(Expr\Assign $node) + { + return $this->pInfixOp(Expr\Assign::class, $node->var, ' = ', $node->expr); + } + protected function pExpr_AssignRef(Expr\AssignRef $node) + { + return $this->pInfixOp(Expr\AssignRef::class, $node->var, ' =& ', $node->expr); + } + protected function pExpr_AssignOp_Plus(AssignOp\Plus $node) + { + return $this->pInfixOp(AssignOp\Plus::class, $node->var, ' += ', $node->expr); + } + protected function pExpr_AssignOp_Minus(AssignOp\Minus $node) + { + return $this->pInfixOp(AssignOp\Minus::class, $node->var, ' -= ', $node->expr); + } + protected function pExpr_AssignOp_Mul(AssignOp\Mul $node) + { + return $this->pInfixOp(AssignOp\Mul::class, $node->var, ' *= ', $node->expr); + } + protected function pExpr_AssignOp_Div(AssignOp\Div $node) + { + return $this->pInfixOp(AssignOp\Div::class, $node->var, ' /= ', $node->expr); + } + protected function pExpr_AssignOp_Concat(AssignOp\Concat $node) + { + return $this->pInfixOp(AssignOp\Concat::class, $node->var, ' .= ', $node->expr); + } + protected function pExpr_AssignOp_Mod(AssignOp\Mod $node) + { + return $this->pInfixOp(AssignOp\Mod::class, $node->var, ' %= ', $node->expr); + } + protected function pExpr_AssignOp_BitwiseAnd(AssignOp\BitwiseAnd $node) + { + return $this->pInfixOp(AssignOp\BitwiseAnd::class, $node->var, ' &= ', $node->expr); + } + protected function pExpr_AssignOp_BitwiseOr(AssignOp\BitwiseOr $node) + { + return $this->pInfixOp(AssignOp\BitwiseOr::class, $node->var, ' |= ', $node->expr); + } + protected function pExpr_AssignOp_BitwiseXor(AssignOp\BitwiseXor $node) + { + return $this->pInfixOp(AssignOp\BitwiseXor::class, $node->var, ' ^= ', $node->expr); + } + protected function pExpr_AssignOp_ShiftLeft(AssignOp\ShiftLeft $node) + { + return $this->pInfixOp(AssignOp\ShiftLeft::class, $node->var, ' <<= ', $node->expr); + } + protected function pExpr_AssignOp_ShiftRight(AssignOp\ShiftRight $node) + { + return $this->pInfixOp(AssignOp\ShiftRight::class, $node->var, ' >>= ', $node->expr); + } + protected function pExpr_AssignOp_Pow(AssignOp\Pow $node) + { + return $this->pInfixOp(AssignOp\Pow::class, $node->var, ' **= ', $node->expr); + } + protected function pExpr_AssignOp_Coalesce(AssignOp\Coalesce $node) + { + return $this->pInfixOp(AssignOp\Coalesce::class, $node->var, ' ??= ', $node->expr); + } + // Binary expressions + protected function pExpr_BinaryOp_Plus(BinaryOp\Plus $node) + { + return $this->pInfixOp(BinaryOp\Plus::class, $node->left, ' + ', $node->right); + } + protected function pExpr_BinaryOp_Minus(BinaryOp\Minus $node) + { + return $this->pInfixOp(BinaryOp\Minus::class, $node->left, ' - ', $node->right); + } + protected function pExpr_BinaryOp_Mul(BinaryOp\Mul $node) + { + return $this->pInfixOp(BinaryOp\Mul::class, $node->left, ' * ', $node->right); + } + protected function pExpr_BinaryOp_Div(BinaryOp\Div $node) + { + return $this->pInfixOp(BinaryOp\Div::class, $node->left, ' / ', $node->right); + } + protected function pExpr_BinaryOp_Concat(BinaryOp\Concat $node) + { + return $this->pInfixOp(BinaryOp\Concat::class, $node->left, ' . ', $node->right); + } + protected function pExpr_BinaryOp_Mod(BinaryOp\Mod $node) + { + return $this->pInfixOp(BinaryOp\Mod::class, $node->left, ' % ', $node->right); + } + protected function pExpr_BinaryOp_BooleanAnd(BinaryOp\BooleanAnd $node) + { + return $this->pInfixOp(BinaryOp\BooleanAnd::class, $node->left, ' && ', $node->right); + } + protected function pExpr_BinaryOp_BooleanOr(BinaryOp\BooleanOr $node) + { + return $this->pInfixOp(BinaryOp\BooleanOr::class, $node->left, ' || ', $node->right); + } + protected function pExpr_BinaryOp_BitwiseAnd(BinaryOp\BitwiseAnd $node) + { + return $this->pInfixOp(BinaryOp\BitwiseAnd::class, $node->left, ' & ', $node->right); + } + protected function pExpr_BinaryOp_BitwiseOr(BinaryOp\BitwiseOr $node) + { + return $this->pInfixOp(BinaryOp\BitwiseOr::class, $node->left, ' | ', $node->right); + } + protected function pExpr_BinaryOp_BitwiseXor(BinaryOp\BitwiseXor $node) + { + return $this->pInfixOp(BinaryOp\BitwiseXor::class, $node->left, ' ^ ', $node->right); + } + protected function pExpr_BinaryOp_ShiftLeft(BinaryOp\ShiftLeft $node) + { + return $this->pInfixOp(BinaryOp\ShiftLeft::class, $node->left, ' << ', $node->right); + } + protected function pExpr_BinaryOp_ShiftRight(BinaryOp\ShiftRight $node) + { + return $this->pInfixOp(BinaryOp\ShiftRight::class, $node->left, ' >> ', $node->right); + } + protected function pExpr_BinaryOp_Pow(BinaryOp\Pow $node) + { + return $this->pInfixOp(BinaryOp\Pow::class, $node->left, ' ** ', $node->right); + } + protected function pExpr_BinaryOp_LogicalAnd(BinaryOp\LogicalAnd $node) + { + return $this->pInfixOp(BinaryOp\LogicalAnd::class, $node->left, ' and ', $node->right); + } + protected function pExpr_BinaryOp_LogicalOr(BinaryOp\LogicalOr $node) + { + return $this->pInfixOp(BinaryOp\LogicalOr::class, $node->left, ' or ', $node->right); + } + protected function pExpr_BinaryOp_LogicalXor(BinaryOp\LogicalXor $node) + { + return $this->pInfixOp(BinaryOp\LogicalXor::class, $node->left, ' xor ', $node->right); + } + protected function pExpr_BinaryOp_Equal(BinaryOp\Equal $node) + { + return $this->pInfixOp(BinaryOp\Equal::class, $node->left, ' == ', $node->right); + } + protected function pExpr_BinaryOp_NotEqual(BinaryOp\NotEqual $node) + { + return $this->pInfixOp(BinaryOp\NotEqual::class, $node->left, ' != ', $node->right); + } + protected function pExpr_BinaryOp_Identical(BinaryOp\Identical $node) + { + return $this->pInfixOp(BinaryOp\Identical::class, $node->left, ' === ', $node->right); + } + protected function pExpr_BinaryOp_NotIdentical(BinaryOp\NotIdentical $node) + { + return $this->pInfixOp(BinaryOp\NotIdentical::class, $node->left, ' !== ', $node->right); + } + protected function pExpr_BinaryOp_Spaceship(BinaryOp\Spaceship $node) + { + return $this->pInfixOp(BinaryOp\Spaceship::class, $node->left, ' <=> ', $node->right); + } + protected function pExpr_BinaryOp_Greater(BinaryOp\Greater $node) + { + return $this->pInfixOp(BinaryOp\Greater::class, $node->left, ' > ', $node->right); + } + protected function pExpr_BinaryOp_GreaterOrEqual(BinaryOp\GreaterOrEqual $node) + { + return $this->pInfixOp(BinaryOp\GreaterOrEqual::class, $node->left, ' >= ', $node->right); + } + protected function pExpr_BinaryOp_Smaller(BinaryOp\Smaller $node) + { + return $this->pInfixOp(BinaryOp\Smaller::class, $node->left, ' < ', $node->right); + } + protected function pExpr_BinaryOp_SmallerOrEqual(BinaryOp\SmallerOrEqual $node) + { + return $this->pInfixOp(BinaryOp\SmallerOrEqual::class, $node->left, ' <= ', $node->right); + } + protected function pExpr_BinaryOp_Coalesce(BinaryOp\Coalesce $node) + { + return $this->pInfixOp(BinaryOp\Coalesce::class, $node->left, ' ?? ', $node->right); + } + protected function pExpr_Instanceof(Expr\Instanceof_ $node) + { + list($precedence, $associativity) = $this->precedenceMap[Expr\Instanceof_::class]; + return $this->pPrec($node->expr, $precedence, $associativity, -1) . ' instanceof ' . $this->pNewVariable($node->class); + } + // Unary expressions + protected function pExpr_BooleanNot(Expr\BooleanNot $node) + { + return $this->pPrefixOp(Expr\BooleanNot::class, '!', $node->expr); + } + protected function pExpr_BitwiseNot(Expr\BitwiseNot $node) + { + return $this->pPrefixOp(Expr\BitwiseNot::class, '~', $node->expr); + } + protected function pExpr_UnaryMinus(Expr\UnaryMinus $node) + { + if ($node->expr instanceof Expr\UnaryMinus || $node->expr instanceof Expr\PreDec) { + // Enforce -(-$expr) instead of --$expr + return '-(' . $this->p($node->expr) . ')'; + } + return $this->pPrefixOp(Expr\UnaryMinus::class, '-', $node->expr); + } + protected function pExpr_UnaryPlus(Expr\UnaryPlus $node) + { + if ($node->expr instanceof Expr\UnaryPlus || $node->expr instanceof Expr\PreInc) { + // Enforce +(+$expr) instead of ++$expr + return '+(' . $this->p($node->expr) . ')'; + } + return $this->pPrefixOp(Expr\UnaryPlus::class, '+', $node->expr); + } + protected function pExpr_PreInc(Expr\PreInc $node) + { + return $this->pPrefixOp(Expr\PreInc::class, '++', $node->var); + } + protected function pExpr_PreDec(Expr\PreDec $node) + { + return $this->pPrefixOp(Expr\PreDec::class, '--', $node->var); + } + protected function pExpr_PostInc(Expr\PostInc $node) + { + return $this->pPostfixOp(Expr\PostInc::class, $node->var, '++'); + } + protected function pExpr_PostDec(Expr\PostDec $node) + { + return $this->pPostfixOp(Expr\PostDec::class, $node->var, '--'); + } + protected function pExpr_ErrorSuppress(Expr\ErrorSuppress $node) + { + return $this->pPrefixOp(Expr\ErrorSuppress::class, '@', $node->expr); + } + protected function pExpr_YieldFrom(Expr\YieldFrom $node) + { + return $this->pPrefixOp(Expr\YieldFrom::class, 'yield from ', $node->expr); + } + protected function pExpr_Print(Expr\Print_ $node) + { + return $this->pPrefixOp(Expr\Print_::class, 'print ', $node->expr); + } + // Casts + protected function pExpr_Cast_Int(Cast\Int_ $node) + { + return $this->pPrefixOp(Cast\Int_::class, '(int) ', $node->expr); + } + protected function pExpr_Cast_Double(Cast\Double $node) + { + $kind = $node->getAttribute('kind', Cast\Double::KIND_DOUBLE); + if ($kind === Cast\Double::KIND_DOUBLE) { + $cast = '(double)'; + } elseif ($kind === Cast\Double::KIND_FLOAT) { + $cast = '(float)'; + } elseif ($kind === Cast\Double::KIND_REAL) { + $cast = '(real)'; + } + return $this->pPrefixOp(Cast\Double::class, $cast . ' ', $node->expr); + } + protected function pExpr_Cast_String(Cast\String_ $node) + { + return $this->pPrefixOp(Cast\String_::class, '(string) ', $node->expr); + } + protected function pExpr_Cast_Array(Cast\Array_ $node) + { + return $this->pPrefixOp(Cast\Array_::class, '(array) ', $node->expr); + } + protected function pExpr_Cast_Object(Cast\Object_ $node) + { + return $this->pPrefixOp(Cast\Object_::class, '(object) ', $node->expr); + } + protected function pExpr_Cast_Bool(Cast\Bool_ $node) + { + return $this->pPrefixOp(Cast\Bool_::class, '(bool) ', $node->expr); + } + protected function pExpr_Cast_Unset(Cast\Unset_ $node) + { + return $this->pPrefixOp(Cast\Unset_::class, '(unset) ', $node->expr); + } + // Function calls and similar constructs + protected function pExpr_FuncCall(Expr\FuncCall $node) + { + return $this->pCallLhs($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; + } + protected function pExpr_MethodCall(Expr\MethodCall $node) + { + return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; + } + protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node) + { + return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; + } + protected function pExpr_StaticCall(Expr\StaticCall $node) + { + return $this->pDereferenceLhs($node->class) . '::' . ($node->name instanceof Expr ? $node->name instanceof Expr\Variable ? $this->p($node->name) : '{' . $this->p($node->name) . '}' : $node->name) . '(' . $this->pMaybeMultiline($node->args) . ')'; + } + protected function pExpr_Empty(Expr\Empty_ $node) + { + return 'empty(' . $this->p($node->expr) . ')'; + } + protected function pExpr_Isset(Expr\Isset_ $node) + { + return 'isset(' . $this->pCommaSeparated($node->vars) . ')'; + } + protected function pExpr_Eval(Expr\Eval_ $node) + { + return 'eval(' . $this->p($node->expr) . ')'; + } + protected function pExpr_Include(Expr\Include_ $node) + { + static $map = [Expr\Include_::TYPE_INCLUDE => 'include', Expr\Include_::TYPE_INCLUDE_ONCE => 'include_once', Expr\Include_::TYPE_REQUIRE => 'require', Expr\Include_::TYPE_REQUIRE_ONCE => 'require_once']; + return $map[$node->type] . ' ' . $this->p($node->expr); + } + protected function pExpr_List(Expr\List_ $node) + { + return 'list(' . $this->pCommaSeparated($node->items) . ')'; + } + // Other + protected function pExpr_Error(Expr\Error $node) + { + throw new \LogicException('Cannot pretty-print AST with Error nodes'); + } + protected function pExpr_Variable(Expr\Variable $node) + { + if ($node->name instanceof Expr) { + return '${' . $this->p($node->name) . '}'; + } else { + return '$' . $node->name; + } + } + protected function pExpr_Array(Expr\Array_ $node) + { + $syntax = $node->getAttribute('kind', $this->options['shortArraySyntax'] ? Expr\Array_::KIND_SHORT : Expr\Array_::KIND_LONG); + if ($syntax === Expr\Array_::KIND_SHORT) { + return '[' . $this->pMaybeMultiline($node->items, \true) . ']'; + } else { + return 'array(' . $this->pMaybeMultiline($node->items, \true) . ')'; + } + } + protected function pExpr_ArrayItem(Expr\ArrayItem $node) + { + return (null !== $node->key ? $this->p($node->key) . ' => ' : '') . ($node->byRef ? '&' : '') . ($node->unpack ? '...' : '') . $this->p($node->value); + } + protected function pExpr_ArrayDimFetch(Expr\ArrayDimFetch $node) + { + return $this->pDereferenceLhs($node->var) . '[' . (null !== $node->dim ? $this->p($node->dim) : '') . ']'; + } + protected function pExpr_ConstFetch(Expr\ConstFetch $node) + { + return $this->p($node->name); + } + protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) + { + return $this->pDereferenceLhs($node->class) . '::' . $this->p($node->name); + } + protected function pExpr_PropertyFetch(Expr\PropertyFetch $node) + { + return $this->pDereferenceLhs($node->var) . '->' . $this->pObjectProperty($node->name); + } + protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node) + { + return $this->pDereferenceLhs($node->var) . '?->' . $this->pObjectProperty($node->name); + } + protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) + { + return $this->pDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name); + } + protected function pExpr_ShellExec(Expr\ShellExec $node) + { + return '`' . $this->pEncapsList($node->parts, '`') . '`'; + } + protected function pExpr_Closure(Expr\Closure $node) + { + return $this->pAttrGroups($node->attrGroups, \true) . ($node->static ? 'static ' : '') . 'function ' . ($node->byRef ? '&' : '') . '(' . $this->pCommaSeparated($node->params) . ')' . (!empty($node->uses) ? ' use(' . $this->pCommaSeparated($node->uses) . ')' : '') . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + protected function pExpr_Match(Expr\Match_ $node) + { + return 'match (' . $this->p($node->cond) . ') {' . $this->pCommaSeparatedMultiline($node->arms, \true) . $this->nl . '}'; + } + protected function pMatchArm(Node\MatchArm $node) + { + return ($node->conds ? $this->pCommaSeparated($node->conds) : 'default') . ' => ' . $this->p($node->body); + } + protected function pExpr_ArrowFunction(Expr\ArrowFunction $node) + { + return $this->pAttrGroups($node->attrGroups, \true) . ($node->static ? 'static ' : '') . 'fn' . ($node->byRef ? '&' : '') . '(' . $this->pCommaSeparated($node->params) . ')' . (null !== $node->returnType ? ': ' . $this->p($node->returnType) : '') . ' => ' . $this->p($node->expr); + } + protected function pExpr_ClosureUse(Expr\ClosureUse $node) + { + return ($node->byRef ? '&' : '') . $this->p($node->var); + } + protected function pExpr_New(Expr\New_ $node) + { + if ($node->class instanceof Stmt\Class_) { + $args = $node->args ? '(' . $this->pMaybeMultiline($node->args) . ')' : ''; + return 'new ' . $this->pClassCommon($node->class, $args); + } + return 'new ' . $this->pNewVariable($node->class) . '(' . $this->pMaybeMultiline($node->args) . ')'; + } + protected function pExpr_Clone(Expr\Clone_ $node) + { + return 'clone ' . $this->p($node->expr); + } + protected function pExpr_Ternary(Expr\Ternary $node) + { + // a bit of cheating: we treat the ternary as a binary op where the ?...: part is the operator. + // this is okay because the part between ? and : never needs parentheses. + return $this->pInfixOp(Expr\Ternary::class, $node->cond, ' ?' . (null !== $node->if ? ' ' . $this->p($node->if) . ' ' : '') . ': ', $node->else); + } + protected function pExpr_Exit(Expr\Exit_ $node) + { + $kind = $node->getAttribute('kind', Expr\Exit_::KIND_DIE); + return ($kind === Expr\Exit_::KIND_EXIT ? 'exit' : 'die') . (null !== $node->expr ? '(' . $this->p($node->expr) . ')' : ''); + } + protected function pExpr_Throw(Expr\Throw_ $node) + { + return 'throw ' . $this->p($node->expr); + } + protected function pExpr_Yield(Expr\Yield_ $node) + { + if ($node->value === null) { + return 'yield'; + } else { + // this is a bit ugly, but currently there is no way to detect whether the parentheses are necessary + return '(yield ' . ($node->key !== null ? $this->p($node->key) . ' => ' : '') . $this->p($node->value) . ')'; + } + } + // Declarations + protected function pStmt_Namespace(Stmt\Namespace_ $node) + { + if ($this->canUseSemicolonNamespaces) { + return 'namespace ' . $this->p($node->name) . ';' . $this->nl . $this->pStmts($node->stmts, \false); + } else { + return 'namespace' . (null !== $node->name ? ' ' . $this->p($node->name) : '') . ' {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + } + protected function pStmt_Use(Stmt\Use_ $node) + { + return 'use ' . $this->pUseType($node->type) . $this->pCommaSeparated($node->uses) . ';'; + } + protected function pStmt_GroupUse(Stmt\GroupUse $node) + { + return 'use ' . $this->pUseType($node->type) . $this->pName($node->prefix) . '\\{' . $this->pCommaSeparated($node->uses) . '};'; + } + protected function pStmt_UseUse(Stmt\UseUse $node) + { + return $this->pUseType($node->type) . $this->p($node->name) . (null !== $node->alias ? ' as ' . $node->alias : ''); + } + protected function pUseType($type) + { + return $type === Stmt\Use_::TYPE_FUNCTION ? 'function ' : ($type === Stmt\Use_::TYPE_CONSTANT ? 'const ' : ''); + } + protected function pStmt_Interface(Stmt\Interface_ $node) + { + return $this->pAttrGroups($node->attrGroups) . 'interface ' . $node->name . (!empty($node->extends) ? ' extends ' . $this->pCommaSeparated($node->extends) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + protected function pStmt_Enum(Stmt\Enum_ $node) + { + return $this->pAttrGroups($node->attrGroups) . 'enum ' . $node->name . ($node->scalarType ? " : {$node->scalarType}" : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + protected function pStmt_Class(Stmt\Class_ $node) + { + return $this->pClassCommon($node, ' ' . $node->name); + } + protected function pStmt_Trait(Stmt\Trait_ $node) + { + return $this->pAttrGroups($node->attrGroups) . 'trait ' . $node->name . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + protected function pStmt_EnumCase(Stmt\EnumCase $node) + { + return $this->pAttrGroups($node->attrGroups) . 'case ' . $node->name . ($node->expr ? ' = ' . $this->p($node->expr) : '') . ';'; + } + protected function pStmt_TraitUse(Stmt\TraitUse $node) + { + return 'use ' . $this->pCommaSeparated($node->traits) . (empty($node->adaptations) ? ';' : ' {' . $this->pStmts($node->adaptations) . $this->nl . '}'); + } + protected function pStmt_TraitUseAdaptation_Precedence(Stmt\TraitUseAdaptation\Precedence $node) + { + return $this->p($node->trait) . '::' . $node->method . ' insteadof ' . $this->pCommaSeparated($node->insteadof) . ';'; + } + protected function pStmt_TraitUseAdaptation_Alias(Stmt\TraitUseAdaptation\Alias $node) + { + return (null !== $node->trait ? $this->p($node->trait) . '::' : '') . $node->method . ' as' . (null !== $node->newModifier ? ' ' . \rtrim($this->pModifiers($node->newModifier), ' ') : '') . (null !== $node->newName ? ' ' . $node->newName : '') . ';'; + } + protected function pStmt_Property(Stmt\Property $node) + { + return $this->pAttrGroups($node->attrGroups) . (0 === $node->flags ? 'var ' : $this->pModifiers($node->flags)) . ($node->type ? $this->p($node->type) . ' ' : '') . $this->pCommaSeparated($node->props) . ';'; + } + protected function pStmt_PropertyProperty(Stmt\PropertyProperty $node) + { + return '$' . $node->name . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); + } + protected function pStmt_ClassMethod(Stmt\ClassMethod $node) + { + return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pMaybeMultiline($node->params) . ')' . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . (null !== $node->stmts ? $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); + } + protected function pStmt_ClassConst(Stmt\ClassConst $node) + { + return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) . 'const ' . $this->pCommaSeparated($node->consts) . ';'; + } + protected function pStmt_Function(Stmt\Function_ $node) + { + return $this->pAttrGroups($node->attrGroups) . 'function ' . ($node->byRef ? '&' : '') . $node->name . '(' . $this->pCommaSeparated($node->params) . ')' . (null !== $node->returnType ? ' : ' . $this->p($node->returnType) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + protected function pStmt_Const(Stmt\Const_ $node) + { + return 'const ' . $this->pCommaSeparated($node->consts) . ';'; + } + protected function pStmt_Declare(Stmt\Declare_ $node) + { + return 'declare (' . $this->pCommaSeparated($node->declares) . ')' . (null !== $node->stmts ? ' {' . $this->pStmts($node->stmts) . $this->nl . '}' : ';'); + } + protected function pStmt_DeclareDeclare(Stmt\DeclareDeclare $node) + { + return $node->key . '=' . $this->p($node->value); + } + // Control flow + protected function pStmt_If(Stmt\If_ $node) + { + return 'if (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->elseifs ? ' ' . $this->pImplode($node->elseifs, ' ') : '') . (null !== $node->else ? ' ' . $this->p($node->else) : ''); + } + protected function pStmt_ElseIf(Stmt\ElseIf_ $node) + { + return 'elseif (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + protected function pStmt_Else(Stmt\Else_ $node) + { + return 'else {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + protected function pStmt_For(Stmt\For_ $node) + { + return 'for (' . $this->pCommaSeparated($node->init) . ';' . (!empty($node->cond) ? ' ' : '') . $this->pCommaSeparated($node->cond) . ';' . (!empty($node->loop) ? ' ' : '') . $this->pCommaSeparated($node->loop) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + protected function pStmt_Foreach(Stmt\Foreach_ $node) + { + return 'foreach (' . $this->p($node->expr) . ' as ' . (null !== $node->keyVar ? $this->p($node->keyVar) . ' => ' : '') . ($node->byRef ? '&' : '') . $this->p($node->valueVar) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + protected function pStmt_While(Stmt\While_ $node) + { + return 'while (' . $this->p($node->cond) . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + protected function pStmt_Do(Stmt\Do_ $node) + { + return 'do {' . $this->pStmts($node->stmts) . $this->nl . '} while (' . $this->p($node->cond) . ');'; + } + protected function pStmt_Switch(Stmt\Switch_ $node) + { + return 'switch (' . $this->p($node->cond) . ') {' . $this->pStmts($node->cases) . $this->nl . '}'; + } + protected function pStmt_Case(Stmt\Case_ $node) + { + return (null !== $node->cond ? 'case ' . $this->p($node->cond) : 'default') . ':' . $this->pStmts($node->stmts); + } + protected function pStmt_TryCatch(Stmt\TryCatch $node) + { + return 'try {' . $this->pStmts($node->stmts) . $this->nl . '}' . ($node->catches ? ' ' . $this->pImplode($node->catches, ' ') : '') . ($node->finally !== null ? ' ' . $this->p($node->finally) : ''); + } + protected function pStmt_Catch(Stmt\Catch_ $node) + { + return 'catch (' . $this->pImplode($node->types, '|') . ($node->var !== null ? ' ' . $this->p($node->var) : '') . ') {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + protected function pStmt_Finally(Stmt\Finally_ $node) + { + return 'finally {' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + protected function pStmt_Break(Stmt\Break_ $node) + { + return 'break' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; + } + protected function pStmt_Continue(Stmt\Continue_ $node) + { + return 'continue' . ($node->num !== null ? ' ' . $this->p($node->num) : '') . ';'; + } + protected function pStmt_Return(Stmt\Return_ $node) + { + return 'return' . (null !== $node->expr ? ' ' . $this->p($node->expr) : '') . ';'; + } + protected function pStmt_Throw(Stmt\Throw_ $node) + { + return 'throw ' . $this->p($node->expr) . ';'; + } + protected function pStmt_Label(Stmt\Label $node) + { + return $node->name . ':'; + } + protected function pStmt_Goto(Stmt\Goto_ $node) + { + return 'goto ' . $node->name . ';'; + } + // Other + protected function pStmt_Expression(Stmt\Expression $node) + { + return $this->p($node->expr) . ';'; + } + protected function pStmt_Echo(Stmt\Echo_ $node) + { + return 'echo ' . $this->pCommaSeparated($node->exprs) . ';'; + } + protected function pStmt_Static(Stmt\Static_ $node) + { + return 'static ' . $this->pCommaSeparated($node->vars) . ';'; + } + protected function pStmt_Global(Stmt\Global_ $node) + { + return 'global ' . $this->pCommaSeparated($node->vars) . ';'; + } + protected function pStmt_StaticVar(Stmt\StaticVar $node) + { + return $this->p($node->var) . (null !== $node->default ? ' = ' . $this->p($node->default) : ''); + } + protected function pStmt_Unset(Stmt\Unset_ $node) + { + return 'unset(' . $this->pCommaSeparated($node->vars) . ');'; + } + protected function pStmt_InlineHTML(Stmt\InlineHTML $node) + { + $newline = $node->getAttribute('hasLeadingNewline', \true) ? "\n" : ''; + return '?>' . $newline . $node->value . 'remaining; + } + protected function pStmt_Nop(Stmt\Nop $node) + { + return ''; + } + // Helpers + protected function pClassCommon(Stmt\Class_ $node, $afterClassToken) + { + return $this->pAttrGroups($node->attrGroups, $node->name === null) . $this->pModifiers($node->flags) . 'class' . $afterClassToken . (null !== $node->extends ? ' extends ' . $this->p($node->extends) : '') . (!empty($node->implements) ? ' implements ' . $this->pCommaSeparated($node->implements) : '') . $this->nl . '{' . $this->pStmts($node->stmts) . $this->nl . '}'; + } + protected function pObjectProperty($node) + { + if ($node instanceof Expr) { + return '{' . $this->p($node) . '}'; + } else { + return $node; + } + } + protected function pEncapsList(array $encapsList, $quote) + { + $return = ''; + foreach ($encapsList as $element) { + if ($element instanceof Scalar\EncapsedStringPart) { + $return .= $this->escapeString($element->value, $quote); + } else { + $return .= '{' . $this->p($element) . '}'; + } + } + return $return; + } + protected function pSingleQuotedString(string $string) + { + return '\'' . \addcslashes($string, '\'\\') . '\''; + } + protected function escapeString($string, $quote) + { + if (null === $quote) { + // For doc strings, don't escape newlines + $escaped = \addcslashes($string, "\t\f\v\$\\"); + } else { + $escaped = \addcslashes($string, "\n\r\t\f\v\$" . $quote . "\\"); + } + // Escape control characters and non-UTF-8 characters. + // Regex based on https://stackoverflow.com/a/11709412/385378. + $regex = '/( + [\\x00-\\x08\\x0E-\\x1F] # Control characters + | [\\xC0-\\xC1] # Invalid UTF-8 Bytes + | [\\xF5-\\xFF] # Invalid UTF-8 Bytes + | \\xE0(?=[\\x80-\\x9F]) # Overlong encoding of prior code point + | \\xF0(?=[\\x80-\\x8F]) # Overlong encoding of prior code point + | [\\xC2-\\xDF](?![\\x80-\\xBF]) # Invalid UTF-8 Sequence Start + | [\\xE0-\\xEF](?![\\x80-\\xBF]{2}) # Invalid UTF-8 Sequence Start + | [\\xF0-\\xF4](?![\\x80-\\xBF]{3}) # Invalid UTF-8 Sequence Start + | (?<=[\\x00-\\x7F\\xF5-\\xFF])[\\x80-\\xBF] # Invalid UTF-8 Sequence Middle + | (? $part) { + $atStart = $i === 0; + $atEnd = $i === \count($parts) - 1; + if ($part instanceof Scalar\EncapsedStringPart && $this->containsEndLabel($part->value, $label, $atStart, $atEnd)) { + return \true; + } + } + return \false; + } + protected function pDereferenceLhs(Node $node) + { + if (!$this->dereferenceLhsRequiresParens($node)) { + return $this->p($node); + } else { + return '(' . $this->p($node) . ')'; + } + } + protected function pCallLhs(Node $node) + { + if (!$this->callLhsRequiresParens($node)) { + return $this->p($node); + } else { + return '(' . $this->p($node) . ')'; + } + } + protected function pNewVariable(Node $node) + { + // TODO: This is not fully accurate. + return $this->pDereferenceLhs($node); + } + /** + * @param Node[] $nodes + * @return bool + */ + protected function hasNodeWithComments(array $nodes) + { + foreach ($nodes as $node) { + if ($node && $node->getComments()) { + return \true; + } + } + return \false; + } + protected function pMaybeMultiline(array $nodes, bool $trailingComma = \false) + { + if (!$this->hasNodeWithComments($nodes)) { + return $this->pCommaSeparated($nodes); + } else { + return $this->pCommaSeparatedMultiline($nodes, $trailingComma) . $this->nl; + } + } + protected function pAttrGroups(array $nodes, bool $inline = \false) : string + { + $result = ''; + $sep = $inline ? ' ' : $this->nl; + foreach ($nodes as $node) { + $result .= $this->p($node) . $sep; + } + return $result; + } +} + [0, 1], + Expr\BitwiseNot::class => [10, 1], + Expr\PreInc::class => [10, 1], + Expr\PreDec::class => [10, 1], + Expr\PostInc::class => [10, -1], + Expr\PostDec::class => [10, -1], + Expr\UnaryPlus::class => [10, 1], + Expr\UnaryMinus::class => [10, 1], + Cast\Int_::class => [10, 1], + Cast\Double::class => [10, 1], + Cast\String_::class => [10, 1], + Cast\Array_::class => [10, 1], + Cast\Object_::class => [10, 1], + Cast\Bool_::class => [10, 1], + Cast\Unset_::class => [10, 1], + Expr\ErrorSuppress::class => [10, 1], + Expr\Instanceof_::class => [20, 0], + Expr\BooleanNot::class => [30, 1], + BinaryOp\Mul::class => [40, -1], + BinaryOp\Div::class => [40, -1], + BinaryOp\Mod::class => [40, -1], + BinaryOp\Plus::class => [50, -1], + BinaryOp\Minus::class => [50, -1], + BinaryOp\Concat::class => [50, -1], + BinaryOp\ShiftLeft::class => [60, -1], + BinaryOp\ShiftRight::class => [60, -1], + BinaryOp\Smaller::class => [70, 0], + BinaryOp\SmallerOrEqual::class => [70, 0], + BinaryOp\Greater::class => [70, 0], + BinaryOp\GreaterOrEqual::class => [70, 0], + BinaryOp\Equal::class => [80, 0], + BinaryOp\NotEqual::class => [80, 0], + BinaryOp\Identical::class => [80, 0], + BinaryOp\NotIdentical::class => [80, 0], + BinaryOp\Spaceship::class => [80, 0], + BinaryOp\BitwiseAnd::class => [90, -1], + BinaryOp\BitwiseXor::class => [100, -1], + BinaryOp\BitwiseOr::class => [110, -1], + BinaryOp\BooleanAnd::class => [120, -1], + BinaryOp\BooleanOr::class => [130, -1], + BinaryOp\Coalesce::class => [140, 1], + Expr\Ternary::class => [150, 0], + // parser uses %left for assignments, but they really behave as %right + Expr\Assign::class => [160, 1], + Expr\AssignRef::class => [160, 1], + AssignOp\Plus::class => [160, 1], + AssignOp\Minus::class => [160, 1], + AssignOp\Mul::class => [160, 1], + AssignOp\Div::class => [160, 1], + AssignOp\Concat::class => [160, 1], + AssignOp\Mod::class => [160, 1], + AssignOp\BitwiseAnd::class => [160, 1], + AssignOp\BitwiseOr::class => [160, 1], + AssignOp\BitwiseXor::class => [160, 1], + AssignOp\ShiftLeft::class => [160, 1], + AssignOp\ShiftRight::class => [160, 1], + AssignOp\Pow::class => [160, 1], + AssignOp\Coalesce::class => [160, 1], + Expr\YieldFrom::class => [165, 1], + Expr\Print_::class => [168, 1], + BinaryOp\LogicalAnd::class => [170, -1], + BinaryOp\LogicalXor::class => [180, -1], + BinaryOp\LogicalOr::class => [190, -1], + Expr\Include_::class => [200, -1], + ]; + /** @var int Current indentation level. */ + protected $indentLevel; + /** @var string Newline including current indentation. */ + protected $nl; + /** @var string Token placed at end of doc string to ensure it is followed by a newline. */ + protected $docStringEndToken; + /** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) */ + protected $canUseSemicolonNamespaces; + /** @var array Pretty printer options */ + protected $options; + /** @var TokenStream Original tokens for use in format-preserving pretty print */ + protected $origTokens; + /** @var Internal\Differ Differ for node lists */ + protected $nodeListDiffer; + /** @var bool[] Map determining whether a certain character is a label character */ + protected $labelCharMap; + /** + * @var int[][] Map from token classes and subnode names to FIXUP_* constants. This is used + * during format-preserving prints to place additional parens/braces if necessary. + */ + protected $fixupMap; + /** + * @var int[][] Map from "{$node->getType()}->{$subNode}" to ['left' => $l, 'right' => $r], + * where $l and $r specify the token type that needs to be stripped when removing + * this node. + */ + protected $removalMap; + /** + * @var mixed[] Map from "{$node->getType()}->{$subNode}" to [$find, $beforeToken, $extraLeft, $extraRight]. + * $find is an optional token after which the insertion occurs. $extraLeft/Right + * are optionally added before/after the main insertions. + */ + protected $insertionMap; + /** + * @var string[] Map From "{$node->getType()}->{$subNode}" to string that should be inserted + * between elements of this list subnode. + */ + protected $listInsertionMap; + protected $emptyListInsertionMap; + /** @var int[] Map from "{$node->getType()}->{$subNode}" to token before which the modifiers + * should be reprinted. */ + protected $modifierChangeMap; + /** + * Creates a pretty printer instance using the given options. + * + * Supported options: + * * bool $shortArraySyntax = false: Whether to use [] instead of array() as the default array + * syntax, if the node does not specify a format. + * + * @param array $options Dictionary of formatting options + */ + public function __construct(array $options = []) + { + $this->docStringEndToken = '_DOC_STRING_END_' . \mt_rand(); + $defaultOptions = ['shortArraySyntax' => \false]; + $this->options = $options + $defaultOptions; + } + /** + * Reset pretty printing state. + */ + protected function resetState() + { + $this->indentLevel = 0; + $this->nl = "\n"; + $this->origTokens = null; + } + /** + * Set indentation level + * + * @param int $level Level in number of spaces + */ + protected function setIndentLevel(int $level) + { + $this->indentLevel = $level; + $this->nl = "\n" . \str_repeat(' ', $level); + } + /** + * Increase indentation level. + */ + protected function indent() + { + $this->indentLevel += 4; + $this->nl .= ' '; + } + /** + * Decrease indentation level. + */ + protected function outdent() + { + \assert($this->indentLevel >= 4); + $this->indentLevel -= 4; + $this->nl = "\n" . \str_repeat(' ', $this->indentLevel); + } + /** + * Pretty prints an array of statements. + * + * @param Node[] $stmts Array of statements + * + * @return string Pretty printed statements + */ + public function prettyPrint(array $stmts) : string + { + $this->resetState(); + $this->preprocessNodes($stmts); + return \ltrim($this->handleMagicTokens($this->pStmts($stmts, \false))); + } + /** + * Pretty prints an expression. + * + * @param Expr $node Expression node + * + * @return string Pretty printed node + */ + public function prettyPrintExpr(Expr $node) : string + { + $this->resetState(); + return $this->handleMagicTokens($this->p($node)); + } + /** + * Pretty prints a file of statements (includes the opening prettyPrint($stmts); + if ($stmts[0] instanceof Stmt\InlineHTML) { + $p = \preg_replace('/^<\\?php\\s+\\?>\\n?/', '', $p); + } + if ($stmts[\count($stmts) - 1] instanceof Stmt\InlineHTML) { + $p = \preg_replace('/<\\?php$/', '', \rtrim($p)); + } + return $p; + } + /** + * Preprocesses the top-level nodes to initialize pretty printer state. + * + * @param Node[] $nodes Array of nodes + */ + protected function preprocessNodes(array $nodes) + { + /* We can use semicolon-namespaces unless there is a global namespace declaration */ + $this->canUseSemicolonNamespaces = \true; + foreach ($nodes as $node) { + if ($node instanceof Stmt\Namespace_ && null === $node->name) { + $this->canUseSemicolonNamespaces = \false; + break; + } + } + } + /** + * Handles (and removes) no-indent and doc-string-end tokens. + * + * @param string $str + * @return string + */ + protected function handleMagicTokens(string $str) : string + { + // Replace doc-string-end tokens with nothing or a newline + $str = \str_replace($this->docStringEndToken . ";\n", ";\n", $str); + $str = \str_replace($this->docStringEndToken, "\n", $str); + return $str; + } + /** + * Pretty prints an array of nodes (statements) and indents them optionally. + * + * @param Node[] $nodes Array of nodes + * @param bool $indent Whether to indent the printed nodes + * + * @return string Pretty printed statements + */ + protected function pStmts(array $nodes, bool $indent = \true) : string + { + if ($indent) { + $this->indent(); + } + $result = ''; + foreach ($nodes as $node) { + $comments = $node->getComments(); + if ($comments) { + $result .= $this->nl . $this->pComments($comments); + if ($node instanceof Stmt\Nop) { + continue; + } + } + $result .= $this->nl . $this->p($node); + } + if ($indent) { + $this->outdent(); + } + return $result; + } + /** + * Pretty-print an infix operation while taking precedence into account. + * + * @param string $class Node class of operator + * @param Node $leftNode Left-hand side node + * @param string $operatorString String representation of the operator + * @param Node $rightNode Right-hand side node + * + * @return string Pretty printed infix operation + */ + protected function pInfixOp(string $class, Node $leftNode, string $operatorString, Node $rightNode) : string + { + list($precedence, $associativity) = $this->precedenceMap[$class]; + return $this->pPrec($leftNode, $precedence, $associativity, -1) . $operatorString . $this->pPrec($rightNode, $precedence, $associativity, 1); + } + /** + * Pretty-print a prefix operation while taking precedence into account. + * + * @param string $class Node class of operator + * @param string $operatorString String representation of the operator + * @param Node $node Node + * + * @return string Pretty printed prefix operation + */ + protected function pPrefixOp(string $class, string $operatorString, Node $node) : string + { + list($precedence, $associativity) = $this->precedenceMap[$class]; + return $operatorString . $this->pPrec($node, $precedence, $associativity, 1); + } + /** + * Pretty-print a postfix operation while taking precedence into account. + * + * @param string $class Node class of operator + * @param string $operatorString String representation of the operator + * @param Node $node Node + * + * @return string Pretty printed postfix operation + */ + protected function pPostfixOp(string $class, Node $node, string $operatorString) : string + { + list($precedence, $associativity) = $this->precedenceMap[$class]; + return $this->pPrec($node, $precedence, $associativity, -1) . $operatorString; + } + /** + * Prints an expression node with the least amount of parentheses necessary to preserve the meaning. + * + * @param Node $node Node to pretty print + * @param int $parentPrecedence Precedence of the parent operator + * @param int $parentAssociativity Associativity of parent operator + * (-1 is left, 0 is nonassoc, 1 is right) + * @param int $childPosition Position of the node relative to the operator + * (-1 is left, 1 is right) + * + * @return string The pretty printed node + */ + protected function pPrec(Node $node, int $parentPrecedence, int $parentAssociativity, int $childPosition) : string + { + $class = \get_class($node); + if (isset($this->precedenceMap[$class])) { + $childPrecedence = $this->precedenceMap[$class][0]; + if ($childPrecedence > $parentPrecedence || $parentPrecedence === $childPrecedence && $parentAssociativity !== $childPosition) { + return '(' . $this->p($node) . ')'; + } + } + return $this->p($node); + } + /** + * Pretty prints an array of nodes and implodes the printed values. + * + * @param Node[] $nodes Array of Nodes to be printed + * @param string $glue Character to implode with + * + * @return string Imploded pretty printed nodes + */ + protected function pImplode(array $nodes, string $glue = '') : string + { + $pNodes = []; + foreach ($nodes as $node) { + if (null === $node) { + $pNodes[] = ''; + } else { + $pNodes[] = $this->p($node); + } + } + return \implode($glue, $pNodes); + } + /** + * Pretty prints an array of nodes and implodes the printed values with commas. + * + * @param Node[] $nodes Array of Nodes to be printed + * + * @return string Comma separated pretty printed nodes + */ + protected function pCommaSeparated(array $nodes) : string + { + return $this->pImplode($nodes, ', '); + } + /** + * Pretty prints a comma-separated list of nodes in multiline style, including comments. + * + * The result includes a leading newline and one level of indentation (same as pStmts). + * + * @param Node[] $nodes Array of Nodes to be printed + * @param bool $trailingComma Whether to use a trailing comma + * + * @return string Comma separated pretty printed nodes in multiline style + */ + protected function pCommaSeparatedMultiline(array $nodes, bool $trailingComma) : string + { + $this->indent(); + $result = ''; + $lastIdx = \count($nodes) - 1; + foreach ($nodes as $idx => $node) { + if ($node !== null) { + $comments = $node->getComments(); + if ($comments) { + $result .= $this->nl . $this->pComments($comments); + } + $result .= $this->nl . $this->p($node); + } else { + $result .= $this->nl; + } + if ($trailingComma || $idx !== $lastIdx) { + $result .= ','; + } + } + $this->outdent(); + return $result; + } + /** + * Prints reformatted text of the passed comments. + * + * @param Comment[] $comments List of comments + * + * @return string Reformatted text of comments + */ + protected function pComments(array $comments) : string + { + $formattedComments = []; + foreach ($comments as $comment) { + $formattedComments[] = \str_replace("\n", $this->nl, $comment->getReformattedText()); + } + return \implode($this->nl, $formattedComments); + } + /** + * Perform a format-preserving pretty print of an AST. + * + * The format preservation is best effort. For some changes to the AST the formatting will not + * be preserved (at least not locally). + * + * In order to use this method a number of prerequisites must be satisfied: + * * The startTokenPos and endTokenPos attributes in the lexer must be enabled. + * * The CloningVisitor must be run on the AST prior to modification. + * * The original tokens must be provided, using the getTokens() method on the lexer. + * + * @param Node[] $stmts Modified AST with links to original AST + * @param Node[] $origStmts Original AST with token offset information + * @param array $origTokens Tokens of the original code + * + * @return string + */ + public function printFormatPreserving(array $stmts, array $origStmts, array $origTokens) : string + { + $this->initializeNodeListDiffer(); + $this->initializeLabelCharMap(); + $this->initializeFixupMap(); + $this->initializeRemovalMap(); + $this->initializeInsertionMap(); + $this->initializeListInsertionMap(); + $this->initializeEmptyListInsertionMap(); + $this->initializeModifierChangeMap(); + $this->resetState(); + $this->origTokens = new TokenStream($origTokens); + $this->preprocessNodes($stmts); + $pos = 0; + $result = $this->pArray($stmts, $origStmts, $pos, 0, 'File', 'stmts', null); + if (null !== $result) { + $result .= $this->origTokens->getTokenCode($pos, \count($origTokens), 0); + } else { + // Fallback + // TODO Add pStmts($stmts, \false); + } + return \ltrim($this->handleMagicTokens($result)); + } + protected function pFallback(Node $node) + { + return $this->{'p' . $node->getType()}($node); + } + /** + * Pretty prints a node. + * + * This method also handles formatting preservation for nodes. + * + * @param Node $node Node to be pretty printed + * @param bool $parentFormatPreserved Whether parent node has preserved formatting + * + * @return string Pretty printed node + */ + protected function p(Node $node, $parentFormatPreserved = \false) : string + { + // No orig tokens means this is a normal pretty print without preservation of formatting + if (!$this->origTokens) { + return $this->{'p' . $node->getType()}($node); + } + /** @var Node $origNode */ + $origNode = $node->getAttribute('origNode'); + if (null === $origNode) { + return $this->pFallback($node); + } + $class = \get_class($node); + \assert($class === \get_class($origNode)); + $startPos = $origNode->getStartTokenPos(); + $endPos = $origNode->getEndTokenPos(); + \assert($startPos >= 0 && $endPos >= 0); + $fallbackNode = $node; + if ($node instanceof Expr\New_ && $node->class instanceof Stmt\Class_) { + // Normalize node structure of anonymous classes + $node = PrintableNewAnonClassNode::fromNewNode($node); + $origNode = PrintableNewAnonClassNode::fromNewNode($origNode); + } + // InlineHTML node does not contain closing and opening PHP tags. If the parent formatting + // is not preserved, then we need to use the fallback code to make sure the tags are + // printed. + if ($node instanceof Stmt\InlineHTML && !$parentFormatPreserved) { + return $this->pFallback($fallbackNode); + } + $indentAdjustment = $this->indentLevel - $this->origTokens->getIndentationBefore($startPos); + $type = $node->getType(); + $fixupInfo = $this->fixupMap[$class] ?? null; + $result = ''; + $pos = $startPos; + foreach ($node->getSubNodeNames() as $subNodeName) { + $subNode = $node->{$subNodeName}; + $origSubNode = $origNode->{$subNodeName}; + if (!$subNode instanceof Node && $subNode !== null || !$origSubNode instanceof Node && $origSubNode !== null) { + if ($subNode === $origSubNode) { + // Unchanged, can reuse old code + continue; + } + if (\is_array($subNode) && \is_array($origSubNode)) { + // Array subnode changed, we might be able to reconstruct it + $listResult = $this->pArray($subNode, $origSubNode, $pos, $indentAdjustment, $type, $subNodeName, $fixupInfo[$subNodeName] ?? null); + if (null === $listResult) { + return $this->pFallback($fallbackNode); + } + $result .= $listResult; + continue; + } + if (\is_int($subNode) && \is_int($origSubNode)) { + // Check if this is a modifier change + $key = $type . '->' . $subNodeName; + if (!isset($this->modifierChangeMap[$key])) { + return $this->pFallback($fallbackNode); + } + $findToken = $this->modifierChangeMap[$key]; + $result .= $this->pModifiers($subNode); + $pos = $this->origTokens->findRight($pos, $findToken); + continue; + } + // If a non-node, non-array subnode changed, we don't be able to do a partial + // reconstructions, as we don't have enough offset information. Pretty print the + // whole node instead. + return $this->pFallback($fallbackNode); + } + $extraLeft = ''; + $extraRight = ''; + if ($origSubNode !== null) { + $subStartPos = $origSubNode->getStartTokenPos(); + $subEndPos = $origSubNode->getEndTokenPos(); + \assert($subStartPos >= 0 && $subEndPos >= 0); + } else { + if ($subNode === null) { + // Both null, nothing to do + continue; + } + // A node has been inserted, check if we have insertion information for it + $key = $type . '->' . $subNodeName; + if (!isset($this->insertionMap[$key])) { + return $this->pFallback($fallbackNode); + } + list($findToken, $beforeToken, $extraLeft, $extraRight) = $this->insertionMap[$key]; + if (null !== $findToken) { + $subStartPos = $this->origTokens->findRight($pos, $findToken) + (int) (!$beforeToken); + } else { + $subStartPos = $pos; + } + if (null === $extraLeft && null !== $extraRight) { + // If inserting on the right only, skipping whitespace looks better + $subStartPos = $this->origTokens->skipRightWhitespace($subStartPos); + } + $subEndPos = $subStartPos - 1; + } + if (null === $subNode) { + // A node has been removed, check if we have removal information for it + $key = $type . '->' . $subNodeName; + if (!isset($this->removalMap[$key])) { + return $this->pFallback($fallbackNode); + } + // Adjust positions to account for additional tokens that must be skipped + $removalInfo = $this->removalMap[$key]; + if (isset($removalInfo['left'])) { + $subStartPos = $this->origTokens->skipLeft($subStartPos - 1, $removalInfo['left']) + 1; + } + if (isset($removalInfo['right'])) { + $subEndPos = $this->origTokens->skipRight($subEndPos + 1, $removalInfo['right']) - 1; + } + } + $result .= $this->origTokens->getTokenCode($pos, $subStartPos, $indentAdjustment); + if (null !== $subNode) { + $result .= $extraLeft; + $origIndentLevel = $this->indentLevel; + $this->setIndentLevel($this->origTokens->getIndentationBefore($subStartPos) + $indentAdjustment); + // If it's the same node that was previously in this position, it certainly doesn't + // need fixup. It's important to check this here, because our fixup checks are more + // conservative than strictly necessary. + if (isset($fixupInfo[$subNodeName]) && $subNode->getAttribute('origNode') !== $origSubNode) { + $fixup = $fixupInfo[$subNodeName]; + $res = $this->pFixup($fixup, $subNode, $class, $subStartPos, $subEndPos); + } else { + $res = $this->p($subNode, \true); + } + $this->safeAppend($result, $res); + $this->setIndentLevel($origIndentLevel); + $result .= $extraRight; + } + $pos = $subEndPos + 1; + } + $result .= $this->origTokens->getTokenCode($pos, $endPos + 1, $indentAdjustment); + return $result; + } + /** + * Perform a format-preserving pretty print of an array. + * + * @param array $nodes New nodes + * @param array $origNodes Original nodes + * @param int $pos Current token position (updated by reference) + * @param int $indentAdjustment Adjustment for indentation + * @param string $parentNodeType Type of the containing node. + * @param string $subNodeName Name of array subnode. + * @param null|int $fixup Fixup information for array item nodes + * + * @return null|string Result of pretty print or null if cannot preserve formatting + */ + protected function pArray(array $nodes, array $origNodes, int &$pos, int $indentAdjustment, string $parentNodeType, string $subNodeName, $fixup) + { + $diff = $this->nodeListDiffer->diffWithReplacements($origNodes, $nodes); + $mapKey = $parentNodeType . '->' . $subNodeName; + $insertStr = $this->listInsertionMap[$mapKey] ?? null; + $isStmtList = $subNodeName === 'stmts'; + $beforeFirstKeepOrReplace = \true; + $skipRemovedNode = \false; + $delayedAdd = []; + $lastElemIndentLevel = $this->indentLevel; + $insertNewline = \false; + if ($insertStr === "\n") { + $insertStr = ''; + $insertNewline = \true; + } + if ($isStmtList && \count($origNodes) === 1 && \count($nodes) !== 1) { + $startPos = $origNodes[0]->getStartTokenPos(); + $endPos = $origNodes[0]->getEndTokenPos(); + \assert($startPos >= 0 && $endPos >= 0); + if (!$this->origTokens->haveBraces($startPos, $endPos)) { + // This was a single statement without braces, but either additional statements + // have been added, or the single statement has been removed. This requires the + // addition of braces. For now fall back. + // TODO: Try to preserve formatting + return null; + } + } + $result = ''; + foreach ($diff as $i => $diffElem) { + $diffType = $diffElem->type; + /** @var Node|null $arrItem */ + $arrItem = $diffElem->new; + /** @var Node|null $origArrItem */ + $origArrItem = $diffElem->old; + if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { + $beforeFirstKeepOrReplace = \false; + if ($origArrItem === null || $arrItem === null) { + // We can only handle the case where both are null + if ($origArrItem === $arrItem) { + continue; + } + return null; + } + if (!$arrItem instanceof Node || !$origArrItem instanceof Node) { + // We can only deal with nodes. This can occur for Names, which use string arrays. + return null; + } + $itemStartPos = $origArrItem->getStartTokenPos(); + $itemEndPos = $origArrItem->getEndTokenPos(); + \assert($itemStartPos >= 0 && $itemEndPos >= 0 && $itemStartPos >= $pos); + $origIndentLevel = $this->indentLevel; + $lastElemIndentLevel = $this->origTokens->getIndentationBefore($itemStartPos) + $indentAdjustment; + $this->setIndentLevel($lastElemIndentLevel); + $comments = $arrItem->getComments(); + $origComments = $origArrItem->getComments(); + $commentStartPos = $origComments ? $origComments[0]->getStartTokenPos() : $itemStartPos; + \assert($commentStartPos >= 0); + if ($commentStartPos < $pos) { + // Comments may be assigned to multiple nodes if they start at the same position. + // Make sure we don't try to print them multiple times. + $commentStartPos = $itemStartPos; + } + if ($skipRemovedNode) { + if ($isStmtList && $this->origTokens->haveBracesInRange($pos, $itemStartPos)) { + // We'd remove the brace of a code block. + // TODO: Preserve formatting. + $this->setIndentLevel($origIndentLevel); + return null; + } + } else { + $result .= $this->origTokens->getTokenCode($pos, $commentStartPos, $indentAdjustment); + } + if (!empty($delayedAdd)) { + /** @var Node $delayedAddNode */ + foreach ($delayedAdd as $delayedAddNode) { + if ($insertNewline) { + $delayedAddComments = $delayedAddNode->getComments(); + if ($delayedAddComments) { + $result .= $this->pComments($delayedAddComments) . $this->nl; + } + } + $this->safeAppend($result, $this->p($delayedAddNode, \true)); + if ($insertNewline) { + $result .= $insertStr . $this->nl; + } else { + $result .= $insertStr; + } + } + $delayedAdd = []; + } + if ($comments !== $origComments) { + if ($comments) { + $result .= $this->pComments($comments) . $this->nl; + } + } else { + $result .= $this->origTokens->getTokenCode($commentStartPos, $itemStartPos, $indentAdjustment); + } + // If we had to remove anything, we have done so now. + $skipRemovedNode = \false; + } elseif ($diffType === DiffElem::TYPE_ADD) { + if (null === $insertStr) { + // We don't have insertion information for this list type + return null; + } + // We go multiline if the original code was multiline, + // or if it's an array item with a comment above it. + if ($insertStr === ', ' && ($this->isMultiline($origNodes) || $arrItem->getComments())) { + $insertStr = ','; + $insertNewline = \true; + } + if ($beforeFirstKeepOrReplace) { + // Will be inserted at the next "replace" or "keep" element + $delayedAdd[] = $arrItem; + continue; + } + $itemStartPos = $pos; + $itemEndPos = $pos - 1; + $origIndentLevel = $this->indentLevel; + $this->setIndentLevel($lastElemIndentLevel); + if ($insertNewline) { + $result .= $insertStr . $this->nl; + $comments = $arrItem->getComments(); + if ($comments) { + $result .= $this->pComments($comments) . $this->nl; + } + } else { + $result .= $insertStr; + } + } elseif ($diffType === DiffElem::TYPE_REMOVE) { + if (!$origArrItem instanceof Node) { + // We only support removal for nodes + return null; + } + $itemStartPos = $origArrItem->getStartTokenPos(); + $itemEndPos = $origArrItem->getEndTokenPos(); + \assert($itemStartPos >= 0 && $itemEndPos >= 0); + // Consider comments part of the node. + $origComments = $origArrItem->getComments(); + if ($origComments) { + $itemStartPos = $origComments[0]->getStartTokenPos(); + } + if ($i === 0) { + // If we're removing from the start, keep the tokens before the node and drop those after it, + // instead of the other way around. + $result .= $this->origTokens->getTokenCode($pos, $itemStartPos, $indentAdjustment); + $skipRemovedNode = \true; + } else { + if ($isStmtList && $this->origTokens->haveBracesInRange($pos, $itemStartPos)) { + // We'd remove the brace of a code block. + // TODO: Preserve formatting. + return null; + } + } + $pos = $itemEndPos + 1; + continue; + } else { + throw new \Exception("Shouldn't happen"); + } + if (null !== $fixup && $arrItem->getAttribute('origNode') !== $origArrItem) { + $res = $this->pFixup($fixup, $arrItem, null, $itemStartPos, $itemEndPos); + } else { + $res = $this->p($arrItem, \true); + } + $this->safeAppend($result, $res); + $this->setIndentLevel($origIndentLevel); + $pos = $itemEndPos + 1; + } + if ($skipRemovedNode) { + // TODO: Support removing single node. + return null; + } + if (!empty($delayedAdd)) { + if (!isset($this->emptyListInsertionMap[$mapKey])) { + return null; + } + list($findToken, $extraLeft, $extraRight) = $this->emptyListInsertionMap[$mapKey]; + if (null !== $findToken) { + $insertPos = $this->origTokens->findRight($pos, $findToken) + 1; + $result .= $this->origTokens->getTokenCode($pos, $insertPos, $indentAdjustment); + $pos = $insertPos; + } + $first = \true; + $result .= $extraLeft; + foreach ($delayedAdd as $delayedAddNode) { + if (!$first) { + $result .= $insertStr; + if ($insertNewline) { + $result .= $this->nl; + } + } + $result .= $this->p($delayedAddNode, \true); + $first = \false; + } + $result .= $extraRight === "\n" ? $this->nl : $extraRight; + } + return $result; + } + /** + * Print node with fixups. + * + * Fixups here refer to the addition of extra parentheses, braces or other characters, that + * are required to preserve program semantics in a certain context (e.g. to maintain precedence + * or because only certain expressions are allowed in certain places). + * + * @param int $fixup Fixup type + * @param Node $subNode Subnode to print + * @param string|null $parentClass Class of parent node + * @param int $subStartPos Original start pos of subnode + * @param int $subEndPos Original end pos of subnode + * + * @return string Result of fixed-up print of subnode + */ + protected function pFixup(int $fixup, Node $subNode, $parentClass, int $subStartPos, int $subEndPos) : string + { + switch ($fixup) { + case self::FIXUP_PREC_LEFT: + case self::FIXUP_PREC_RIGHT: + if (!$this->origTokens->haveParens($subStartPos, $subEndPos)) { + list($precedence, $associativity) = $this->precedenceMap[$parentClass]; + return $this->pPrec($subNode, $precedence, $associativity, $fixup === self::FIXUP_PREC_LEFT ? -1 : 1); + } + break; + case self::FIXUP_CALL_LHS: + if ($this->callLhsRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos)) { + return '(' . $this->p($subNode) . ')'; + } + break; + case self::FIXUP_DEREF_LHS: + if ($this->dereferenceLhsRequiresParens($subNode) && !$this->origTokens->haveParens($subStartPos, $subEndPos)) { + return '(' . $this->p($subNode) . ')'; + } + break; + case self::FIXUP_BRACED_NAME: + case self::FIXUP_VAR_BRACED_NAME: + if ($subNode instanceof Expr && !$this->origTokens->haveBraces($subStartPos, $subEndPos)) { + return ($fixup === self::FIXUP_VAR_BRACED_NAME ? '$' : '') . '{' . $this->p($subNode) . '}'; + } + break; + case self::FIXUP_ENCAPSED: + if (!$subNode instanceof Scalar\EncapsedStringPart && !$this->origTokens->haveBraces($subStartPos, $subEndPos)) { + return '{' . $this->p($subNode) . '}'; + } + break; + default: + throw new \Exception('Cannot happen'); + } + // Nothing special to do + return $this->p($subNode); + } + /** + * Appends to a string, ensuring whitespace between label characters. + * + * Example: "echo" and "$x" result in "echo$x", but "echo" and "x" result in "echo x". + * Without safeAppend the result would be "echox", which does not preserve semantics. + * + * @param string $str + * @param string $append + */ + protected function safeAppend(string &$str, string $append) + { + if ($str === "") { + $str = $append; + return; + } + if ($append === "") { + return; + } + if (!$this->labelCharMap[$append[0]] || !$this->labelCharMap[$str[\strlen($str) - 1]]) { + $str .= $append; + } else { + $str .= " " . $append; + } + } + /** + * Determines whether the LHS of a call must be wrapped in parenthesis. + * + * @param Node $node LHS of a call + * + * @return bool Whether parentheses are required + */ + protected function callLhsRequiresParens(Node $node) : bool + { + return !($node instanceof Node\Name || $node instanceof Expr\Variable || $node instanceof Expr\ArrayDimFetch || $node instanceof Expr\FuncCall || $node instanceof Expr\MethodCall || $node instanceof Expr\NullsafeMethodCall || $node instanceof Expr\StaticCall || $node instanceof Expr\Array_); + } + /** + * Determines whether the LHS of a dereferencing operation must be wrapped in parenthesis. + * + * @param Node $node LHS of dereferencing operation + * + * @return bool Whether parentheses are required + */ + protected function dereferenceLhsRequiresParens(Node $node) : bool + { + return !($node instanceof Expr\Variable || $node instanceof Node\Name || $node instanceof Expr\ArrayDimFetch || $node instanceof Expr\PropertyFetch || $node instanceof Expr\NullsafePropertyFetch || $node instanceof Expr\StaticPropertyFetch || $node instanceof Expr\FuncCall || $node instanceof Expr\MethodCall || $node instanceof Expr\NullsafeMethodCall || $node instanceof Expr\StaticCall || $node instanceof Expr\Array_ || $node instanceof Scalar\String_ || $node instanceof Expr\ConstFetch || $node instanceof Expr\ClassConstFetch); + } + /** + * Print modifiers, including trailing whitespace. + * + * @param int $modifiers Modifier mask to print + * + * @return string Printed modifiers + */ + protected function pModifiers(int $modifiers) + { + return ($modifiers & Stmt\Class_::MODIFIER_PUBLIC ? 'public ' : '') . ($modifiers & Stmt\Class_::MODIFIER_PROTECTED ? 'protected ' : '') . ($modifiers & Stmt\Class_::MODIFIER_PRIVATE ? 'private ' : '') . ($modifiers & Stmt\Class_::MODIFIER_STATIC ? 'static ' : '') . ($modifiers & Stmt\Class_::MODIFIER_ABSTRACT ? 'abstract ' : '') . ($modifiers & Stmt\Class_::MODIFIER_FINAL ? 'final ' : '') . ($modifiers & Stmt\Class_::MODIFIER_READONLY ? 'readonly ' : ''); + } + /** + * Determine whether a list of nodes uses multiline formatting. + * + * @param (Node|null)[] $nodes Node list + * + * @return bool Whether multiline formatting is used + */ + protected function isMultiline(array $nodes) : bool + { + if (\count($nodes) < 2) { + return \false; + } + $pos = -1; + foreach ($nodes as $node) { + if (null === $node) { + continue; + } + $endPos = $node->getEndTokenPos() + 1; + if ($pos >= 0) { + $text = $this->origTokens->getTokenCode($pos, $endPos, 0); + if (\false === \strpos($text, "\n")) { + // We require that a newline is present between *every* item. If the formatting + // is inconsistent, with only some items having newlines, we don't consider it + // as multiline + return \false; + } + } + $pos = $endPos; + } + return \true; + } + /** + * Lazily initializes label char map. + * + * The label char map determines whether a certain character may occur in a label. + */ + protected function initializeLabelCharMap() + { + if ($this->labelCharMap) { + return; + } + $this->labelCharMap = []; + for ($i = 0; $i < 256; $i++) { + // Since PHP 7.1 The lower range is 0x80. However, we also want to support code for + // older versions. + $chr = \chr($i); + $this->labelCharMap[$chr] = $i >= 0x7f || \ctype_alnum($chr); + } + } + /** + * Lazily initializes node list differ. + * + * The node list differ is used to determine differences between two array subnodes. + */ + protected function initializeNodeListDiffer() + { + if ($this->nodeListDiffer) { + return; + } + $this->nodeListDiffer = new Internal\Differ(function ($a, $b) { + if ($a instanceof Node && $b instanceof Node) { + return $a === $b->getAttribute('origNode'); + } + // Can happen for array destructuring + return $a === null && $b === null; + }); + } + /** + * Lazily initializes fixup map. + * + * The fixup map is used to determine whether a certain subnode of a certain node may require + * some kind of "fixup" operation, e.g. the addition of parenthesis or braces. + */ + protected function initializeFixupMap() + { + if ($this->fixupMap) { + return; + } + $this->fixupMap = [ + Expr\PreInc::class => ['var' => self::FIXUP_PREC_RIGHT], + Expr\PreDec::class => ['var' => self::FIXUP_PREC_RIGHT], + Expr\PostInc::class => ['var' => self::FIXUP_PREC_LEFT], + Expr\PostDec::class => ['var' => self::FIXUP_PREC_LEFT], + Expr\Instanceof_::class => ['expr' => self::FIXUP_PREC_LEFT, 'class' => self::FIXUP_PREC_RIGHT], + Expr\Ternary::class => ['cond' => self::FIXUP_PREC_LEFT, 'else' => self::FIXUP_PREC_RIGHT], + Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS], + Expr\StaticCall::class => ['class' => self::FIXUP_DEREF_LHS], + Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS], + Expr\ClassConstFetch::class => ['var' => self::FIXUP_DEREF_LHS], + Expr\New_::class => ['class' => self::FIXUP_DEREF_LHS], + // TODO: FIXUP_NEW_VARIABLE + Expr\MethodCall::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], + Expr\NullsafeMethodCall::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], + Expr\StaticPropertyFetch::class => ['class' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_VAR_BRACED_NAME], + Expr\PropertyFetch::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], + Expr\NullsafePropertyFetch::class => ['var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME], + Scalar\Encapsed::class => ['parts' => self::FIXUP_ENCAPSED], + ]; + $binaryOps = [BinaryOp\Pow::class, BinaryOp\Mul::class, BinaryOp\Div::class, BinaryOp\Mod::class, BinaryOp\Plus::class, BinaryOp\Minus::class, BinaryOp\Concat::class, BinaryOp\ShiftLeft::class, BinaryOp\ShiftRight::class, BinaryOp\Smaller::class, BinaryOp\SmallerOrEqual::class, BinaryOp\Greater::class, BinaryOp\GreaterOrEqual::class, BinaryOp\Equal::class, BinaryOp\NotEqual::class, BinaryOp\Identical::class, BinaryOp\NotIdentical::class, BinaryOp\Spaceship::class, BinaryOp\BitwiseAnd::class, BinaryOp\BitwiseXor::class, BinaryOp\BitwiseOr::class, BinaryOp\BooleanAnd::class, BinaryOp\BooleanOr::class, BinaryOp\Coalesce::class, BinaryOp\LogicalAnd::class, BinaryOp\LogicalXor::class, BinaryOp\LogicalOr::class]; + foreach ($binaryOps as $binaryOp) { + $this->fixupMap[$binaryOp] = ['left' => self::FIXUP_PREC_LEFT, 'right' => self::FIXUP_PREC_RIGHT]; + } + $assignOps = [Expr\Assign::class, Expr\AssignRef::class, AssignOp\Plus::class, AssignOp\Minus::class, AssignOp\Mul::class, AssignOp\Div::class, AssignOp\Concat::class, AssignOp\Mod::class, AssignOp\BitwiseAnd::class, AssignOp\BitwiseOr::class, AssignOp\BitwiseXor::class, AssignOp\ShiftLeft::class, AssignOp\ShiftRight::class, AssignOp\Pow::class, AssignOp\Coalesce::class]; + foreach ($assignOps as $assignOp) { + $this->fixupMap[$assignOp] = ['var' => self::FIXUP_PREC_LEFT, 'expr' => self::FIXUP_PREC_RIGHT]; + } + $prefixOps = [Expr\BitwiseNot::class, Expr\BooleanNot::class, Expr\UnaryPlus::class, Expr\UnaryMinus::class, Cast\Int_::class, Cast\Double::class, Cast\String_::class, Cast\Array_::class, Cast\Object_::class, Cast\Bool_::class, Cast\Unset_::class, Expr\ErrorSuppress::class, Expr\YieldFrom::class, Expr\Print_::class, Expr\Include_::class]; + foreach ($prefixOps as $prefixOp) { + $this->fixupMap[$prefixOp] = ['expr' => self::FIXUP_PREC_RIGHT]; + } + } + /** + * Lazily initializes the removal map. + * + * The removal map is used to determine which additional tokens should be removed when a + * certain node is replaced by null. + */ + protected function initializeRemovalMap() + { + if ($this->removalMap) { + return; + } + $stripBoth = ['left' => \T_WHITESPACE, 'right' => \T_WHITESPACE]; + $stripLeft = ['left' => \T_WHITESPACE]; + $stripRight = ['right' => \T_WHITESPACE]; + $stripDoubleArrow = ['right' => \T_DOUBLE_ARROW]; + $stripColon = ['left' => ':']; + $stripEquals = ['left' => '=']; + $this->removalMap = ['Expr_ArrayDimFetch->dim' => $stripBoth, 'Expr_ArrayItem->key' => $stripDoubleArrow, 'Expr_ArrowFunction->returnType' => $stripColon, 'Expr_Closure->returnType' => $stripColon, 'Expr_Exit->expr' => $stripBoth, 'Expr_Ternary->if' => $stripBoth, 'Expr_Yield->key' => $stripDoubleArrow, 'Expr_Yield->value' => $stripBoth, 'Param->type' => $stripRight, 'Param->default' => $stripEquals, 'Stmt_Break->num' => $stripBoth, 'Stmt_Catch->var' => $stripLeft, 'Stmt_ClassMethod->returnType' => $stripColon, 'Stmt_Class->extends' => ['left' => \T_EXTENDS], 'Stmt_Enum->scalarType' => $stripColon, 'Stmt_EnumCase->expr' => $stripEquals, 'Expr_PrintableNewAnonClass->extends' => ['left' => \T_EXTENDS], 'Stmt_Continue->num' => $stripBoth, 'Stmt_Foreach->keyVar' => $stripDoubleArrow, 'Stmt_Function->returnType' => $stripColon, 'Stmt_If->else' => $stripLeft, 'Stmt_Namespace->name' => $stripLeft, 'Stmt_Property->type' => $stripRight, 'Stmt_PropertyProperty->default' => $stripEquals, 'Stmt_Return->expr' => $stripBoth, 'Stmt_StaticVar->default' => $stripEquals, 'Stmt_TraitUseAdaptation_Alias->newName' => $stripLeft, 'Stmt_TryCatch->finally' => $stripLeft]; + } + protected function initializeInsertionMap() + { + if ($this->insertionMap) { + return; + } + // TODO: "yield" where both key and value are inserted doesn't work + // [$find, $beforeToken, $extraLeft, $extraRight] + $this->insertionMap = [ + 'Expr_ArrayDimFetch->dim' => ['[', \false, null, null], + 'Expr_ArrayItem->key' => [null, \false, null, ' => '], + 'Expr_ArrowFunction->returnType' => [')', \false, ' : ', null], + 'Expr_Closure->returnType' => [')', \false, ' : ', null], + 'Expr_Ternary->if' => ['?', \false, ' ', ' '], + 'Expr_Yield->key' => [\T_YIELD, \false, null, ' => '], + 'Expr_Yield->value' => [\T_YIELD, \false, ' ', null], + 'Param->type' => [null, \false, null, ' '], + 'Param->default' => [null, \false, ' = ', null], + 'Stmt_Break->num' => [\T_BREAK, \false, ' ', null], + 'Stmt_Catch->var' => [null, \false, ' ', null], + 'Stmt_ClassMethod->returnType' => [')', \false, ' : ', null], + 'Stmt_Class->extends' => [null, \false, ' extends ', null], + 'Stmt_Enum->scalarType' => [null, \false, ' : ', null], + 'Stmt_EnumCase->expr' => [null, \false, ' = ', null], + 'Expr_PrintableNewAnonClass->extends' => [null, ' extends ', null], + 'Stmt_Continue->num' => [\T_CONTINUE, \false, ' ', null], + 'Stmt_Foreach->keyVar' => [\T_AS, \false, null, ' => '], + 'Stmt_Function->returnType' => [')', \false, ' : ', null], + 'Stmt_If->else' => [null, \false, ' ', null], + 'Stmt_Namespace->name' => [\T_NAMESPACE, \false, ' ', null], + 'Stmt_Property->type' => [\T_VARIABLE, \true, null, ' '], + 'Stmt_PropertyProperty->default' => [null, \false, ' = ', null], + 'Stmt_Return->expr' => [\T_RETURN, \false, ' ', null], + 'Stmt_StaticVar->default' => [null, \false, ' = ', null], + //'Stmt_TraitUseAdaptation_Alias->newName' => [T_AS, false, ' ', null], // TODO + 'Stmt_TryCatch->finally' => [null, \false, ' ', null], + ]; + } + protected function initializeListInsertionMap() + { + if ($this->listInsertionMap) { + return; + } + $this->listInsertionMap = [ + // special + //'Expr_ShellExec->parts' => '', // TODO These need to be treated more carefully + //'Scalar_Encapsed->parts' => '', + 'Stmt_Catch->types' => '|', + 'UnionType->types' => '|', + 'IntersectionType->types' => '&', + 'Stmt_If->elseifs' => ' ', + 'Stmt_TryCatch->catches' => ' ', + // comma-separated lists + 'Expr_Array->items' => ', ', + 'Expr_ArrowFunction->params' => ', ', + 'Expr_Closure->params' => ', ', + 'Expr_Closure->uses' => ', ', + 'Expr_FuncCall->args' => ', ', + 'Expr_Isset->vars' => ', ', + 'Expr_List->items' => ', ', + 'Expr_MethodCall->args' => ', ', + 'Expr_NullsafeMethodCall->args' => ', ', + 'Expr_New->args' => ', ', + 'Expr_PrintableNewAnonClass->args' => ', ', + 'Expr_StaticCall->args' => ', ', + 'Stmt_ClassConst->consts' => ', ', + 'Stmt_ClassMethod->params' => ', ', + 'Stmt_Class->implements' => ', ', + 'Stmt_Enum->implements' => ', ', + 'Expr_PrintableNewAnonClass->implements' => ', ', + 'Stmt_Const->consts' => ', ', + 'Stmt_Declare->declares' => ', ', + 'Stmt_Echo->exprs' => ', ', + 'Stmt_For->init' => ', ', + 'Stmt_For->cond' => ', ', + 'Stmt_For->loop' => ', ', + 'Stmt_Function->params' => ', ', + 'Stmt_Global->vars' => ', ', + 'Stmt_GroupUse->uses' => ', ', + 'Stmt_Interface->extends' => ', ', + 'Stmt_Match->arms' => ', ', + 'Stmt_Property->props' => ', ', + 'Stmt_StaticVar->vars' => ', ', + 'Stmt_TraitUse->traits' => ', ', + 'Stmt_TraitUseAdaptation_Precedence->insteadof' => ', ', + 'Stmt_Unset->vars' => ', ', + 'Stmt_Use->uses' => ', ', + 'MatchArm->conds' => ', ', + 'AttributeGroup->attrs' => ', ', + // statement lists + 'Expr_Closure->stmts' => "\n", + 'Stmt_Case->stmts' => "\n", + 'Stmt_Catch->stmts' => "\n", + 'Stmt_Class->stmts' => "\n", + 'Stmt_Enum->stmts' => "\n", + 'Expr_PrintableNewAnonClass->stmts' => "\n", + 'Stmt_Interface->stmts' => "\n", + 'Stmt_Trait->stmts' => "\n", + 'Stmt_ClassMethod->stmts' => "\n", + 'Stmt_Declare->stmts' => "\n", + 'Stmt_Do->stmts' => "\n", + 'Stmt_ElseIf->stmts' => "\n", + 'Stmt_Else->stmts' => "\n", + 'Stmt_Finally->stmts' => "\n", + 'Stmt_Foreach->stmts' => "\n", + 'Stmt_For->stmts' => "\n", + 'Stmt_Function->stmts' => "\n", + 'Stmt_If->stmts' => "\n", + 'Stmt_Namespace->stmts' => "\n", + 'Stmt_Class->attrGroups' => "\n", + 'Stmt_Enum->attrGroups' => "\n", + 'Stmt_EnumCase->attrGroups' => "\n", + 'Stmt_Interface->attrGroups' => "\n", + 'Stmt_Trait->attrGroups' => "\n", + 'Stmt_Function->attrGroups' => "\n", + 'Stmt_ClassMethod->attrGroups' => "\n", + 'Stmt_ClassConst->attrGroups' => "\n", + 'Stmt_Property->attrGroups' => "\n", + 'Expr_PrintableNewAnonClass->attrGroups' => ' ', + 'Expr_Closure->attrGroups' => ' ', + 'Expr_ArrowFunction->attrGroups' => ' ', + 'Param->attrGroups' => ' ', + 'Stmt_Switch->cases' => "\n", + 'Stmt_TraitUse->adaptations' => "\n", + 'Stmt_TryCatch->stmts' => "\n", + 'Stmt_While->stmts' => "\n", + // dummy for top-level context + 'File->stmts' => "\n", + ]; + } + protected function initializeEmptyListInsertionMap() + { + if ($this->emptyListInsertionMap) { + return; + } + // TODO Insertion into empty statement lists. + // [$find, $extraLeft, $extraRight] + $this->emptyListInsertionMap = ['Expr_ArrowFunction->params' => ['(', '', ''], 'Expr_Closure->uses' => [')', ' use(', ')'], 'Expr_Closure->params' => ['(', '', ''], 'Expr_FuncCall->args' => ['(', '', ''], 'Expr_MethodCall->args' => ['(', '', ''], 'Expr_NullsafeMethodCall->args' => ['(', '', ''], 'Expr_New->args' => ['(', '', ''], 'Expr_PrintableNewAnonClass->args' => ['(', '', ''], 'Expr_PrintableNewAnonClass->implements' => [null, ' implements ', ''], 'Expr_StaticCall->args' => ['(', '', ''], 'Stmt_Class->implements' => [null, ' implements ', ''], 'Stmt_Enum->implements' => [null, ' implements ', ''], 'Stmt_ClassMethod->params' => ['(', '', ''], 'Stmt_Interface->extends' => [null, ' extends ', ''], 'Stmt_Function->params' => ['(', '', ''], 'Stmt_Interface->attrGroups' => [null, '', "\n"], 'Stmt_Class->attrGroups' => [null, '', "\n"], 'Stmt_ClassConst->attrGroups' => [null, '', "\n"], 'Stmt_ClassMethod->attrGroups' => [null, '', "\n"], 'Stmt_Function->attrGroups' => [null, '', "\n"], 'Stmt_Property->attrGroups' => [null, '', "\n"], 'Stmt_Trait->attrGroups' => [null, '', "\n"], 'Expr_ArrowFunction->attrGroups' => [null, '', ' '], 'Expr_Closure->attrGroups' => [null, '', ' '], 'Expr_PrintableNewAnonClass->attrGroups' => [\T_NEW, ' ', '']]; + } + protected function initializeModifierChangeMap() + { + if ($this->modifierChangeMap) { + return; + } + $this->modifierChangeMap = ['Stmt_ClassConst->flags' => \T_CONST, 'Stmt_ClassMethod->flags' => \T_FUNCTION, 'Stmt_Class->flags' => \T_CLASS, 'Stmt_Property->flags' => \T_VARIABLE, 'Param->flags' => \T_VARIABLE]; + // List of integer subnodes that are not modifiers: + // Expr_Include->type + // Stmt_GroupUse->type + // Stmt_Use->type + // Stmt_UseUse->type + } +} +Object Enumerator + +Copyright (c) 2016-2020, Sebastian Bergmann . +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Sebastian Bergmann nor the names of his + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +Object Reflector + +Copyright (c) 2017-2020, Sebastian Bergmann . +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Sebastian Bergmann nor the names of his + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +Phar.io - Manifest + +Copyright (c) 2016-2019 Arne Blankerts , Sebastian Heuer , Sebastian Bergmann , and contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of Arne Blankerts nor the names of contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +use PHPUnit\PharIo\Version\Exception as VersionException; +use PHPUnit\PharIo\Version\Version; +use PHPUnit\PharIo\Version\VersionConstraintParser; +class ManifestDocumentMapper +{ + public function map(ManifestDocument $document) : Manifest + { + try { + $contains = $document->getContainsElement(); + $type = $this->mapType($contains); + $copyright = $this->mapCopyright($document->getCopyrightElement()); + $requirements = $this->mapRequirements($document->getRequiresElement()); + $bundledComponents = $this->mapBundledComponents($document); + return new Manifest(new ApplicationName($contains->getName()), new Version($contains->getVersion()), $type, $copyright, $requirements, $bundledComponents); + } catch (VersionException $e) { + throw new ManifestDocumentMapperException($e->getMessage(), (int) $e->getCode(), $e); + } catch (Exception $e) { + throw new ManifestDocumentMapperException($e->getMessage(), (int) $e->getCode(), $e); + } + } + private function mapType(ContainsElement $contains) : Type + { + switch ($contains->getType()) { + case 'application': + return Type::application(); + case 'library': + return Type::library(); + case 'extension': + return $this->mapExtension($contains->getExtensionElement()); + } + throw new ManifestDocumentMapperException(\sprintf('Unsupported type %s', $contains->getType())); + } + private function mapCopyright(CopyrightElement $copyright) : CopyrightInformation + { + $authors = new AuthorCollection(); + foreach ($copyright->getAuthorElements() as $authorElement) { + $authors->add(new Author($authorElement->getName(), new Email($authorElement->getEmail()))); + } + $licenseElement = $copyright->getLicenseElement(); + $license = new License($licenseElement->getType(), new Url($licenseElement->getUrl())); + return new CopyrightInformation($authors, $license); + } + private function mapRequirements(RequiresElement $requires) : RequirementCollection + { + $collection = new RequirementCollection(); + $phpElement = $requires->getPHPElement(); + $parser = new VersionConstraintParser(); + try { + $versionConstraint = $parser->parse($phpElement->getVersion()); + } catch (VersionException $e) { + throw new ManifestDocumentMapperException(\sprintf('Unsupported version constraint - %s', $e->getMessage()), (int) $e->getCode(), $e); + } + $collection->add(new PhpVersionRequirement($versionConstraint)); + if (!$phpElement->hasExtElements()) { + return $collection; + } + foreach ($phpElement->getExtElements() as $extElement) { + $collection->add(new PhpExtensionRequirement($extElement->getName())); + } + return $collection; + } + private function mapBundledComponents(ManifestDocument $document) : BundledComponentCollection + { + $collection = new BundledComponentCollection(); + if (!$document->hasBundlesElement()) { + return $collection; + } + foreach ($document->getBundlesElement()->getComponentElements() as $componentElement) { + $collection->add(new BundledComponent($componentElement->getName(), new Version($componentElement->getVersion()))); + } + return $collection; + } + private function mapExtension(ExtensionElement $extension) : Extension + { + try { + $versionConstraint = (new VersionConstraintParser())->parse($extension->getCompatible()); + return Type::extension(new ApplicationName($extension->getFor()), $versionConstraint); + } catch (VersionException $e) { + throw new ManifestDocumentMapperException(\sprintf('Unsupported version constraint - %s', $e->getMessage()), (int) $e->getCode(), $e); + } + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class ManifestLoader +{ + public static function fromFile(string $filename) : Manifest + { + try { + return (new ManifestDocumentMapper())->map(ManifestDocument::fromFile($filename)); + } catch (Exception $e) { + throw new ManifestLoaderException(\sprintf('Loading %s failed.', $filename), (int) $e->getCode(), $e); + } + } + public static function fromPhar(string $filename) : Manifest + { + return self::fromFile('phar://' . $filename . '/manifest.xml'); + } + public static function fromString(string $manifest) : Manifest + { + try { + return (new ManifestDocumentMapper())->map(ManifestDocument::fromString($manifest)); + } catch (Exception $e) { + throw new ManifestLoaderException('Processing string failed', (int) $e->getCode(), $e); + } + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +use PHPUnit\PharIo\Version\AnyVersionConstraint; +use PHPUnit\PharIo\Version\Version; +use PHPUnit\PharIo\Version\VersionConstraint; +use XMLWriter; +/** @psalm-suppress MissingConstructor */ +class ManifestSerializer +{ + /** @var XMLWriter */ + private $xmlWriter; + public function serializeToFile(Manifest $manifest, string $filename) : void + { + \file_put_contents($filename, $this->serializeToString($manifest)); + } + public function serializeToString(Manifest $manifest) : string + { + $this->startDocument(); + $this->addContains($manifest->getName(), $manifest->getVersion(), $manifest->getType()); + $this->addCopyright($manifest->getCopyrightInformation()); + $this->addRequirements($manifest->getRequirements()); + $this->addBundles($manifest->getBundledComponents()); + return $this->finishDocument(); + } + private function startDocument() : void + { + $xmlWriter = new XMLWriter(); + $xmlWriter->openMemory(); + $xmlWriter->setIndent(\true); + $xmlWriter->setIndentString(\str_repeat(' ', 4)); + $xmlWriter->startDocument('1.0', 'UTF-8'); + $xmlWriter->startElement('phar'); + $xmlWriter->writeAttribute('xmlns', 'https://phar.io/xml/manifest/1.0'); + $this->xmlWriter = $xmlWriter; + } + private function finishDocument() : string + { + $this->xmlWriter->endElement(); + $this->xmlWriter->endDocument(); + return $this->xmlWriter->outputMemory(); + } + private function addContains(ApplicationName $name, Version $version, Type $type) : void + { + $this->xmlWriter->startElement('contains'); + $this->xmlWriter->writeAttribute('name', $name->asString()); + $this->xmlWriter->writeAttribute('version', $version->getVersionString()); + switch (\true) { + case $type->isApplication(): + $this->xmlWriter->writeAttribute('type', 'application'); + break; + case $type->isLibrary(): + $this->xmlWriter->writeAttribute('type', 'library'); + break; + case $type->isExtension(): + $this->xmlWriter->writeAttribute('type', 'extension'); + /* @var $type Extension */ + $this->addExtension($type->getApplicationName(), $type->getVersionConstraint()); + break; + default: + $this->xmlWriter->writeAttribute('type', 'custom'); + } + $this->xmlWriter->endElement(); + } + private function addCopyright(CopyrightInformation $copyrightInformation) : void + { + $this->xmlWriter->startElement('copyright'); + foreach ($copyrightInformation->getAuthors() as $author) { + $this->xmlWriter->startElement('author'); + $this->xmlWriter->writeAttribute('name', $author->getName()); + $this->xmlWriter->writeAttribute('email', $author->getEmail()->asString()); + $this->xmlWriter->endElement(); + } + $license = $copyrightInformation->getLicense(); + $this->xmlWriter->startElement('license'); + $this->xmlWriter->writeAttribute('type', $license->getName()); + $this->xmlWriter->writeAttribute('url', $license->getUrl()->asString()); + $this->xmlWriter->endElement(); + $this->xmlWriter->endElement(); + } + private function addRequirements(RequirementCollection $requirementCollection) : void + { + $phpRequirement = new AnyVersionConstraint(); + $extensions = []; + foreach ($requirementCollection as $requirement) { + if ($requirement instanceof PhpVersionRequirement) { + $phpRequirement = $requirement->getVersionConstraint(); + continue; + } + if ($requirement instanceof PhpExtensionRequirement) { + $extensions[] = $requirement->asString(); + } + } + $this->xmlWriter->startElement('requires'); + $this->xmlWriter->startElement('php'); + $this->xmlWriter->writeAttribute('version', $phpRequirement->asString()); + foreach ($extensions as $extension) { + $this->xmlWriter->startElement('ext'); + $this->xmlWriter->writeAttribute('name', $extension); + $this->xmlWriter->endElement(); + } + $this->xmlWriter->endElement(); + $this->xmlWriter->endElement(); + } + private function addBundles(BundledComponentCollection $bundledComponentCollection) : void + { + if (\count($bundledComponentCollection) === 0) { + return; + } + $this->xmlWriter->startElement('bundles'); + foreach ($bundledComponentCollection as $bundledComponent) { + $this->xmlWriter->startElement('component'); + $this->xmlWriter->writeAttribute('name', $bundledComponent->getName()); + $this->xmlWriter->writeAttribute('version', $bundledComponent->getVersion()->getVersionString()); + $this->xmlWriter->endElement(); + } + $this->xmlWriter->endElement(); + } + private function addExtension(ApplicationName $applicationName, VersionConstraint $versionConstraint) : void + { + $this->xmlWriter->startElement('extension'); + $this->xmlWriter->writeAttribute('for', $applicationName->asString()); + $this->xmlWriter->writeAttribute('compatible', $versionConstraint->asString()); + $this->xmlWriter->endElement(); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class ElementCollectionException extends \InvalidArgumentException implements Exception +{ +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +interface Exception extends \Throwable +{ +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class InvalidApplicationNameException extends \InvalidArgumentException implements Exception +{ + public const InvalidFormat = 2; +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class InvalidEmailException extends \InvalidArgumentException implements Exception +{ +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class InvalidUrlException extends \InvalidArgumentException implements Exception +{ +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +use LibXMLError; +class ManifestDocumentLoadingException extends \Exception implements Exception +{ + /** @var LibXMLError[] */ + private $libxmlErrors; + /** + * ManifestDocumentLoadingException constructor. + * + * @param LibXMLError[] $libxmlErrors + */ + public function __construct(array $libxmlErrors) + { + $this->libxmlErrors = $libxmlErrors; + $first = $this->libxmlErrors[0]; + parent::__construct(\sprintf('%s (Line: %d / Column: %d / File: %s)', $first->message, $first->line, $first->column, $first->file), $first->code); + } + /** + * @return LibXMLError[] + */ + public function getLibxmlErrors() : array + { + return $this->libxmlErrors; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class Application extends Type +{ + public function isApplication() : bool + { + return \true; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class ApplicationName +{ + /** @var string */ + private $name; + public function __construct(string $name) + { + $this->ensureValidFormat($name); + $this->name = $name; + } + public function asString() : string + { + return $this->name; + } + public function isEqual(ApplicationName $name) : bool + { + return $this->name === $name->name; + } + private function ensureValidFormat(string $name) : void + { + if (!\preg_match('#\\w/\\w#', $name)) { + throw new InvalidApplicationNameException(\sprintf('Format of name "%s" is not valid - expected: vendor/packagename', $name), InvalidApplicationNameException::InvalidFormat); + } + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class Author +{ + /** @var string */ + private $name; + /** @var Email */ + private $email; + public function __construct(string $name, Email $email) + { + $this->name = $name; + $this->email = $email; + } + public function asString() : string + { + return \sprintf('%s <%s>', $this->name, $this->email->asString()); + } + public function getName() : string + { + return $this->name; + } + public function getEmail() : Email + { + return $this->email; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class AuthorCollection implements \Countable, \IteratorAggregate +{ + /** @var Author[] */ + private $authors = []; + public function add(Author $author) : void + { + $this->authors[] = $author; + } + /** + * @return Author[] + */ + public function getAuthors() : array + { + return $this->authors; + } + public function count() : int + { + return \count($this->authors); + } + public function getIterator() : AuthorCollectionIterator + { + return new AuthorCollectionIterator($this); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class AuthorCollectionIterator implements \Iterator +{ + /** @var Author[] */ + private $authors; + /** @var int */ + private $position = 0; + public function __construct(AuthorCollection $authors) + { + $this->authors = $authors->getAuthors(); + } + public function rewind() : void + { + $this->position = 0; + } + public function valid() : bool + { + return $this->position < \count($this->authors); + } + public function key() : int + { + return $this->position; + } + public function current() : Author + { + return $this->authors[$this->position]; + } + public function next() : void + { + $this->position++; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +use PHPUnit\PharIo\Version\Version; +class BundledComponent +{ + /** @var string */ + private $name; + /** @var Version */ + private $version; + public function __construct(string $name, Version $version) + { + $this->name = $name; + $this->version = $version; + } + public function getName() : string + { + return $this->name; + } + public function getVersion() : Version + { + return $this->version; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class BundledComponentCollection implements \Countable, \IteratorAggregate +{ + /** @var BundledComponent[] */ + private $bundledComponents = []; + public function add(BundledComponent $bundledComponent) : void + { + $this->bundledComponents[] = $bundledComponent; + } + /** + * @return BundledComponent[] + */ + public function getBundledComponents() : array + { + return $this->bundledComponents; + } + public function count() : int + { + return \count($this->bundledComponents); + } + public function getIterator() : BundledComponentCollectionIterator + { + return new BundledComponentCollectionIterator($this); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class BundledComponentCollectionIterator implements \Iterator +{ + /** @var BundledComponent[] */ + private $bundledComponents; + /** @var int */ + private $position = 0; + public function __construct(BundledComponentCollection $bundledComponents) + { + $this->bundledComponents = $bundledComponents->getBundledComponents(); + } + public function rewind() : void + { + $this->position = 0; + } + public function valid() : bool + { + return $this->position < \count($this->bundledComponents); + } + public function key() : int + { + return $this->position; + } + public function current() : BundledComponent + { + return $this->bundledComponents[$this->position]; + } + public function next() : void + { + $this->position++; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class CopyrightInformation +{ + /** @var AuthorCollection */ + private $authors; + /** @var License */ + private $license; + public function __construct(AuthorCollection $authors, License $license) + { + $this->authors = $authors; + $this->license = $license; + } + public function getAuthors() : AuthorCollection + { + return $this->authors; + } + public function getLicense() : License + { + return $this->license; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class Email +{ + /** @var string */ + private $email; + public function __construct(string $email) + { + $this->ensureEmailIsValid($email); + $this->email = $email; + } + public function asString() : string + { + return $this->email; + } + private function ensureEmailIsValid(string $url) : void + { + if (\filter_var($url, \FILTER_VALIDATE_EMAIL) === \false) { + throw new InvalidEmailException(); + } + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +use PHPUnit\PharIo\Version\Version; +use PHPUnit\PharIo\Version\VersionConstraint; +class Extension extends Type +{ + /** @var ApplicationName */ + private $application; + /** @var VersionConstraint */ + private $versionConstraint; + public function __construct(ApplicationName $application, VersionConstraint $versionConstraint) + { + $this->application = $application; + $this->versionConstraint = $versionConstraint; + } + public function getApplicationName() : ApplicationName + { + return $this->application; + } + public function getVersionConstraint() : VersionConstraint + { + return $this->versionConstraint; + } + public function isExtension() : bool + { + return \true; + } + public function isExtensionFor(ApplicationName $name) : bool + { + return $this->application->isEqual($name); + } + public function isCompatibleWith(ApplicationName $name, Version $version) : bool + { + return $this->isExtensionFor($name) && $this->versionConstraint->complies($version); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class Library extends Type +{ + public function isLibrary() : bool + { + return \true; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class License +{ + /** @var string */ + private $name; + /** @var Url */ + private $url; + public function __construct(string $name, Url $url) + { + $this->name = $name; + $this->url = $url; + } + public function getName() : string + { + return $this->name; + } + public function getUrl() : Url + { + return $this->url; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +use PHPUnit\PharIo\Version\Version; +class Manifest +{ + /** @var ApplicationName */ + private $name; + /** @var Version */ + private $version; + /** @var Type */ + private $type; + /** @var CopyrightInformation */ + private $copyrightInformation; + /** @var RequirementCollection */ + private $requirements; + /** @var BundledComponentCollection */ + private $bundledComponents; + public function __construct(ApplicationName $name, Version $version, Type $type, CopyrightInformation $copyrightInformation, RequirementCollection $requirements, BundledComponentCollection $bundledComponents) + { + $this->name = $name; + $this->version = $version; + $this->type = $type; + $this->copyrightInformation = $copyrightInformation; + $this->requirements = $requirements; + $this->bundledComponents = $bundledComponents; + } + public function getName() : ApplicationName + { + return $this->name; + } + public function getVersion() : Version + { + return $this->version; + } + public function getType() : Type + { + return $this->type; + } + public function getCopyrightInformation() : CopyrightInformation + { + return $this->copyrightInformation; + } + public function getRequirements() : RequirementCollection + { + return $this->requirements; + } + public function getBundledComponents() : BundledComponentCollection + { + return $this->bundledComponents; + } + public function isApplication() : bool + { + return $this->type->isApplication(); + } + public function isLibrary() : bool + { + return $this->type->isLibrary(); + } + public function isExtension() : bool + { + return $this->type->isExtension(); + } + public function isExtensionFor(ApplicationName $application, Version $version = null) : bool + { + if (!$this->isExtension()) { + return \false; + } + /** @var Extension $type */ + $type = $this->type; + if ($version !== null) { + return $type->isCompatibleWith($application, $version); + } + return $type->isExtensionFor($application); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class PhpExtensionRequirement implements Requirement +{ + /** @var string */ + private $extension; + public function __construct(string $extension) + { + $this->extension = $extension; + } + public function asString() : string + { + return $this->extension; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +use PHPUnit\PharIo\Version\VersionConstraint; +class PhpVersionRequirement implements Requirement +{ + /** @var VersionConstraint */ + private $versionConstraint; + public function __construct(VersionConstraint $versionConstraint) + { + $this->versionConstraint = $versionConstraint; + } + public function getVersionConstraint() : VersionConstraint + { + return $this->versionConstraint; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +interface Requirement +{ +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class RequirementCollection implements \Countable, \IteratorAggregate +{ + /** @var Requirement[] */ + private $requirements = []; + public function add(Requirement $requirement) : void + { + $this->requirements[] = $requirement; + } + /** + * @return Requirement[] + */ + public function getRequirements() : array + { + return $this->requirements; + } + public function count() : int + { + return \count($this->requirements); + } + public function getIterator() : RequirementCollectionIterator + { + return new RequirementCollectionIterator($this); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class RequirementCollectionIterator implements \Iterator +{ + /** @var Requirement[] */ + private $requirements; + /** @var int */ + private $position = 0; + public function __construct(RequirementCollection $requirements) + { + $this->requirements = $requirements->getRequirements(); + } + public function rewind() : void + { + $this->position = 0; + } + public function valid() : bool + { + return $this->position < \count($this->requirements); + } + public function key() : int + { + return $this->position; + } + public function current() : Requirement + { + return $this->requirements[$this->position]; + } + public function next() : void + { + $this->position++; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +use PHPUnit\PharIo\Version\VersionConstraint; +abstract class Type +{ + public static function application() : Application + { + return new Application(); + } + public static function library() : Library + { + return new Library(); + } + public static function extension(ApplicationName $application, VersionConstraint $versionConstraint) : Extension + { + return new Extension($application, $versionConstraint); + } + /** @psalm-assert-if-true Application $this */ + public function isApplication() : bool + { + return \false; + } + /** @psalm-assert-if-true Library $this */ + public function isLibrary() : bool + { + return \false; + } + /** @psalm-assert-if-true Extension $this */ + public function isExtension() : bool + { + return \false; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class Url +{ + /** @var string */ + private $url; + public function __construct(string $url) + { + $this->ensureUrlIsValid($url); + $this->url = $url; + } + public function asString() : string + { + return $this->url; + } + /** + * @param string $url + * + * @throws InvalidUrlException + */ + private function ensureUrlIsValid($url) : void + { + if (\filter_var($url, \FILTER_VALIDATE_URL) === \false) { + throw new InvalidUrlException(); + } + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class AuthorElement extends ManifestElement +{ + public function getName() : string + { + return $this->getAttributeValue('name'); + } + public function getEmail() : string + { + return $this->getAttributeValue('email'); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class AuthorElementCollection extends ElementCollection +{ + public function current() : AuthorElement + { + return new AuthorElement($this->getCurrentElement()); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class BundlesElement extends ManifestElement +{ + public function getComponentElements() : ComponentElementCollection + { + return new ComponentElementCollection($this->getChildrenByName('component')); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class ComponentElement extends ManifestElement +{ + public function getName() : string + { + return $this->getAttributeValue('name'); + } + public function getVersion() : string + { + return $this->getAttributeValue('version'); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class ComponentElementCollection extends ElementCollection +{ + public function current() : ComponentElement + { + return new ComponentElement($this->getCurrentElement()); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class ContainsElement extends ManifestElement +{ + public function getName() : string + { + return $this->getAttributeValue('name'); + } + public function getVersion() : string + { + return $this->getAttributeValue('version'); + } + public function getType() : string + { + return $this->getAttributeValue('type'); + } + public function getExtensionElement() : ExtensionElement + { + return new ExtensionElement($this->getChildByName('extension')); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class CopyrightElement extends ManifestElement +{ + public function getAuthorElements() : AuthorElementCollection + { + return new AuthorElementCollection($this->getChildrenByName('author')); + } + public function getLicenseElement() : LicenseElement + { + return new LicenseElement($this->getChildByName('license')); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +use DOMElement; +use DOMNodeList; +abstract class ElementCollection implements \Iterator +{ + /** @var DOMElement[] */ + private $nodes = []; + /** @var int */ + private $position; + public function __construct(DOMNodeList $nodeList) + { + $this->position = 0; + $this->importNodes($nodeList); + } + #[\ReturnTypeWillChange] + public abstract function current(); + public function next() : void + { + $this->position++; + } + public function key() : int + { + return $this->position; + } + public function valid() : bool + { + return $this->position < \count($this->nodes); + } + public function rewind() : void + { + $this->position = 0; + } + protected function getCurrentElement() : DOMElement + { + return $this->nodes[$this->position]; + } + private function importNodes(DOMNodeList $nodeList) : void + { + foreach ($nodeList as $node) { + if (!$node instanceof DOMElement) { + throw new ElementCollectionException(\sprintf('\\DOMElement expected, got \\%s', \get_class($node))); + } + $this->nodes[] = $node; + } + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class ExtElement extends ManifestElement +{ + public function getName() : string + { + return $this->getAttributeValue('name'); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class ExtElementCollection extends ElementCollection +{ + public function current() : ExtElement + { + return new ExtElement($this->getCurrentElement()); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class ExtensionElement extends ManifestElement +{ + public function getFor() : string + { + return $this->getAttributeValue('for'); + } + public function getCompatible() : string + { + return $this->getAttributeValue('compatible'); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class LicenseElement extends ManifestElement +{ + public function getType() : string + { + return $this->getAttributeValue('type'); + } + public function getUrl() : string + { + return $this->getAttributeValue('url'); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +use DOMDocument; +use DOMElement; +class ManifestDocument +{ + public const XMLNS = 'https://phar.io/xml/manifest/1.0'; + /** @var DOMDocument */ + private $dom; + public static function fromFile(string $filename) : ManifestDocument + { + if (!\file_exists($filename)) { + throw new ManifestDocumentException(\sprintf('File "%s" not found', $filename)); + } + return self::fromString(\file_get_contents($filename)); + } + public static function fromString(string $xmlString) : ManifestDocument + { + $prev = \libxml_use_internal_errors(\true); + \libxml_clear_errors(); + $dom = new DOMDocument(); + $dom->loadXML($xmlString); + $errors = \libxml_get_errors(); + \libxml_use_internal_errors($prev); + if (\count($errors) !== 0) { + throw new ManifestDocumentLoadingException($errors); + } + return new self($dom); + } + private function __construct(DOMDocument $dom) + { + $this->ensureCorrectDocumentType($dom); + $this->dom = $dom; + } + public function getContainsElement() : ContainsElement + { + return new ContainsElement($this->fetchElementByName('contains')); + } + public function getCopyrightElement() : CopyrightElement + { + return new CopyrightElement($this->fetchElementByName('copyright')); + } + public function getRequiresElement() : RequiresElement + { + return new RequiresElement($this->fetchElementByName('requires')); + } + public function hasBundlesElement() : bool + { + return $this->dom->getElementsByTagNameNS(self::XMLNS, 'bundles')->length === 1; + } + public function getBundlesElement() : BundlesElement + { + return new BundlesElement($this->fetchElementByName('bundles')); + } + private function ensureCorrectDocumentType(DOMDocument $dom) : void + { + $root = $dom->documentElement; + if ($root->localName !== 'phar' || $root->namespaceURI !== self::XMLNS) { + throw new ManifestDocumentException('Not a phar.io manifest document'); + } + } + private function fetchElementByName(string $elementName) : DOMElement + { + $element = $this->dom->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); + if (!$element instanceof DOMElement) { + throw new ManifestDocumentException(\sprintf('Element %s missing', $elementName)); + } + return $element; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +use DOMElement; +use DOMNodeList; +class ManifestElement +{ + public const XMLNS = 'https://phar.io/xml/manifest/1.0'; + /** @var DOMElement */ + private $element; + public function __construct(DOMElement $element) + { + $this->element = $element; + } + protected function getAttributeValue(string $name) : string + { + if (!$this->element->hasAttribute($name)) { + throw new ManifestElementException(\sprintf('Attribute %s not set on element %s', $name, $this->element->localName)); + } + return $this->element->getAttribute($name); + } + protected function getChildByName(string $elementName) : DOMElement + { + $element = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); + if (!$element instanceof DOMElement) { + throw new ManifestElementException(\sprintf('Element %s missing', $elementName)); + } + return $element; + } + protected function getChildrenByName(string $elementName) : DOMNodeList + { + $elementList = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName); + if ($elementList->length === 0) { + throw new ManifestElementException(\sprintf('Element(s) %s missing', $elementName)); + } + return $elementList; + } + protected function hasChild(string $elementName) : bool + { + return $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->length !== 0; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class PhpElement extends ManifestElement +{ + public function getVersion() : string + { + return $this->getAttributeValue('version'); + } + public function hasExtElements() : bool + { + return $this->hasChild('ext'); + } + public function getExtElements() : ExtElementCollection + { + return new ExtElementCollection($this->getChildrenByName('ext')); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Manifest; + +class RequiresElement extends ManifestElement +{ + public function getPHPElement() : PhpElement + { + return new PhpElement($this->getChildByName('php')); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +class BuildMetaData +{ + /** @var string */ + private $value; + public function __construct(string $value) + { + $this->value = $value; + } + public function asString() : string + { + return $this->value; + } + public function equals(BuildMetaData $other) : bool + { + return $this->asString() === $other->asString(); + } +} +Copyright (c) 2016-2017 Arne Blankerts , Sebastian Heuer and contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + 0, 'a' => 1, 'alpha' => 1, 'b' => 2, 'beta' => 2, 'rc' => 3, 'p' => 4, 'pl' => 4, 'patch' => 4]; + /** @var string */ + private $value; + /** @var int */ + private $valueScore; + /** @var int */ + private $number = 0; + /** @var string */ + private $full; + /** + * @throws InvalidPreReleaseSuffixException + */ + public function __construct(string $value) + { + $this->parseValue($value); + } + public function asString() : string + { + return $this->full; + } + public function getValue() : string + { + return $this->value; + } + public function getNumber() : ?int + { + return $this->number; + } + public function isGreaterThan(PreReleaseSuffix $suffix) : bool + { + if ($this->valueScore > $suffix->valueScore) { + return \true; + } + if ($this->valueScore < $suffix->valueScore) { + return \false; + } + return $this->getNumber() > $suffix->getNumber(); + } + private function mapValueToScore(string $value) : int + { + $value = \strtolower($value); + return self::valueScoreMap[$value]; + } + private function parseValue(string $value) : void + { + $regex = '/-?((dev|beta|b|rc|alpha|a|patch|p|pl)\\.?(\\d*)).*$/i'; + if (\preg_match($regex, $value, $matches) !== 1) { + throw new InvalidPreReleaseSuffixException(\sprintf('Invalid label %s', $value)); + } + $this->full = $matches[1]; + $this->value = $matches[2]; + if ($matches[3] !== '') { + $this->number = (int) $matches[3]; + } + $this->valueScore = $this->mapValueToScore($matches[2]); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +class Version +{ + /** @var string */ + private $originalVersionString; + /** @var VersionNumber */ + private $major; + /** @var VersionNumber */ + private $minor; + /** @var VersionNumber */ + private $patch; + /** @var null|PreReleaseSuffix */ + private $preReleaseSuffix; + /** @var null|BuildMetaData */ + private $buildMetadata; + public function __construct(string $versionString) + { + $this->ensureVersionStringIsValid($versionString); + $this->originalVersionString = $versionString; + } + /** + * @throws NoPreReleaseSuffixException + */ + public function getPreReleaseSuffix() : PreReleaseSuffix + { + if ($this->preReleaseSuffix === null) { + throw new NoPreReleaseSuffixException('No pre-release suffix set'); + } + return $this->preReleaseSuffix; + } + public function getOriginalString() : string + { + return $this->originalVersionString; + } + public function getVersionString() : string + { + $str = \sprintf('%d.%d.%d', $this->getMajor()->getValue() ?? 0, $this->getMinor()->getValue() ?? 0, $this->getPatch()->getValue() ?? 0); + if (!$this->hasPreReleaseSuffix()) { + return $str; + } + return $str . '-' . $this->getPreReleaseSuffix()->asString(); + } + public function hasPreReleaseSuffix() : bool + { + return $this->preReleaseSuffix !== null; + } + public function equals(Version $other) : bool + { + if ($this->getVersionString() !== $other->getVersionString()) { + return \false; + } + if ($this->hasBuildMetaData() !== $other->hasBuildMetaData()) { + return \false; + } + if ($this->hasBuildMetaData() && $other->hasBuildMetaData() && !$this->getBuildMetaData()->equals($other->getBuildMetaData())) { + return \false; + } + return \true; + } + public function isGreaterThan(Version $version) : bool + { + if ($version->getMajor()->getValue() > $this->getMajor()->getValue()) { + return \false; + } + if ($version->getMajor()->getValue() < $this->getMajor()->getValue()) { + return \true; + } + if ($version->getMinor()->getValue() > $this->getMinor()->getValue()) { + return \false; + } + if ($version->getMinor()->getValue() < $this->getMinor()->getValue()) { + return \true; + } + if ($version->getPatch()->getValue() > $this->getPatch()->getValue()) { + return \false; + } + if ($version->getPatch()->getValue() < $this->getPatch()->getValue()) { + return \true; + } + if (!$version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { + return \false; + } + if ($version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { + return \true; + } + if (!$version->hasPreReleaseSuffix() && $this->hasPreReleaseSuffix()) { + return \false; + } + return $this->getPreReleaseSuffix()->isGreaterThan($version->getPreReleaseSuffix()); + } + public function getMajor() : VersionNumber + { + return $this->major; + } + public function getMinor() : VersionNumber + { + return $this->minor; + } + public function getPatch() : VersionNumber + { + return $this->patch; + } + /** + * @psalm-assert-if-true BuildMetaData $this->buildMetadata + * @psalm-assert-if-true BuildMetaData $this->getBuildMetaData() + */ + public function hasBuildMetaData() : bool + { + return $this->buildMetadata !== null; + } + /** + * @throws NoBuildMetaDataException + */ + public function getBuildMetaData() : BuildMetaData + { + if (!$this->hasBuildMetaData()) { + throw new NoBuildMetaDataException('No build metadata set'); + } + return $this->buildMetadata; + } + /** + * @param string[] $matches + * + * @throws InvalidPreReleaseSuffixException + */ + private function parseVersion(array $matches) : void + { + $this->major = new VersionNumber((int) $matches['Major']); + $this->minor = new VersionNumber((int) $matches['Minor']); + $this->patch = isset($matches['Patch']) ? new VersionNumber((int) $matches['Patch']) : new VersionNumber(0); + if (isset($matches['PreReleaseSuffix']) && $matches['PreReleaseSuffix'] !== '') { + $this->preReleaseSuffix = new PreReleaseSuffix($matches['PreReleaseSuffix']); + } + if (isset($matches['BuildMetadata'])) { + $this->buildMetadata = new BuildMetaData($matches['BuildMetadata']); + } + } + /** + * @param string $version + * + * @throws InvalidVersionException + */ + private function ensureVersionStringIsValid($version) : void + { + $regex = '/^v? + (?P0|[1-9]\\d*) + \\. + (?P0|[1-9]\\d*) + (\\. + (?P0|[1-9]\\d*) + )? + (?: + - + (?(?:(dev|beta|b|rc|alpha|a|patch|p|pl)\\.?\\d*)) + )? + (?: + \\+ + (?P[0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-@]+)*) + )? + $/xi'; + if (\preg_match($regex, $version, $matches) !== 1) { + throw new InvalidVersionException(\sprintf("Version string '%s' does not follow SemVer semantics", $version)); + } + $this->parseVersion($matches); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +class VersionConstraintParser +{ + /** + * @throws UnsupportedVersionConstraintException + */ + public function parse(string $value) : VersionConstraint + { + if (\strpos($value, '|') !== \false) { + return $this->handleOrGroup($value); + } + if (!\preg_match('/^[\\^~*]?v?[\\d.*]+(?:-.*)?$/i', $value)) { + throw new UnsupportedVersionConstraintException(\sprintf('Version constraint %s is not supported.', $value)); + } + switch ($value[0]) { + case '~': + return $this->handleTildeOperator($value); + case '^': + return $this->handleCaretOperator($value); + } + $constraint = new VersionConstraintValue($value); + if ($constraint->getMajor()->isAny()) { + return new AnyVersionConstraint(); + } + if ($constraint->getMinor()->isAny()) { + return new SpecificMajorVersionConstraint($constraint->getVersionString(), $constraint->getMajor()->getValue() ?? 0); + } + if ($constraint->getPatch()->isAny()) { + return new SpecificMajorAndMinorVersionConstraint($constraint->getVersionString(), $constraint->getMajor()->getValue() ?? 0, $constraint->getMinor()->getValue() ?? 0); + } + return new ExactVersionConstraint($constraint->getVersionString()); + } + private function handleOrGroup(string $value) : OrVersionConstraintGroup + { + $constraints = []; + foreach (\preg_split('{\\s*\\|\\|?\\s*}', \trim($value)) as $groupSegment) { + $constraints[] = $this->parse(\trim($groupSegment)); + } + return new OrVersionConstraintGroup($value, $constraints); + } + private function handleTildeOperator(string $value) : AndVersionConstraintGroup + { + $constraintValue = new VersionConstraintValue(\substr($value, 1)); + if ($constraintValue->getPatch()->isAny()) { + return $this->handleCaretOperator($value); + } + $constraints = [new GreaterThanOrEqualToVersionConstraint($value, new Version(\substr($value, 1))), new SpecificMajorAndMinorVersionConstraint($value, $constraintValue->getMajor()->getValue() ?? 0, $constraintValue->getMinor()->getValue() ?? 0)]; + return new AndVersionConstraintGroup($value, $constraints); + } + private function handleCaretOperator(string $value) : AndVersionConstraintGroup + { + $constraintValue = new VersionConstraintValue(\substr($value, 1)); + $constraints = [new GreaterThanOrEqualToVersionConstraint($value, new Version(\substr($value, 1)))]; + if ($constraintValue->getMajor()->getValue() === 0) { + $constraints[] = new SpecificMajorAndMinorVersionConstraint($value, $constraintValue->getMajor()->getValue() ?? 0, $constraintValue->getMinor()->getValue() ?? 0); + } else { + $constraints[] = new SpecificMajorVersionConstraint($value, $constraintValue->getMajor()->getValue() ?? 0); + } + return new AndVersionConstraintGroup($value, $constraints); + } +} +versionString = $versionString; + $this->parseVersion($versionString); + } + public function getLabel() : string + { + return $this->label; + } + public function getBuildMetaData() : string + { + return $this->buildMetaData; + } + public function getVersionString() : string + { + return $this->versionString; + } + public function getMajor() : VersionNumber + { + return $this->major; + } + public function getMinor() : VersionNumber + { + return $this->minor; + } + public function getPatch() : VersionNumber + { + return $this->patch; + } + private function parseVersion(string $versionString) : void + { + $this->extractBuildMetaData($versionString); + $this->extractLabel($versionString); + $this->stripPotentialVPrefix($versionString); + $versionSegments = \explode('.', $versionString); + $this->major = new VersionNumber(\is_numeric($versionSegments[0]) ? (int) $versionSegments[0] : null); + $minorValue = isset($versionSegments[1]) && \is_numeric($versionSegments[1]) ? (int) $versionSegments[1] : null; + $patchValue = isset($versionSegments[2]) && \is_numeric($versionSegments[2]) ? (int) $versionSegments[2] : null; + $this->minor = new VersionNumber($minorValue); + $this->patch = new VersionNumber($patchValue); + } + private function extractBuildMetaData(string &$versionString) : void + { + if (\preg_match('/\\+(.*)/', $versionString, $matches) === 1) { + $this->buildMetaData = $matches[1]; + $versionString = \str_replace($matches[0], '', $versionString); + } + } + private function extractLabel(string &$versionString) : void + { + if (\preg_match('/-(.*)/', $versionString, $matches) === 1) { + $this->label = $matches[1]; + $versionString = \str_replace($matches[0], '', $versionString); + } + } + private function stripPotentialVPrefix(string &$versionString) : void + { + if ($versionString[0] !== 'v') { + return; + } + $versionString = \substr($versionString, 1); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +class VersionNumber +{ + /** @var ?int */ + private $value; + public function __construct(?int $value) + { + $this->value = $value; + } + public function isAny() : bool + { + return $this->value === null; + } + public function getValue() : ?int + { + return $this->value; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +abstract class AbstractVersionConstraint implements VersionConstraint +{ + /** @var string */ + private $originalValue; + public function __construct(string $originalValue) + { + $this->originalValue = $originalValue; + } + public function asString() : string + { + return $this->originalValue; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +class AndVersionConstraintGroup extends AbstractVersionConstraint +{ + /** @var VersionConstraint[] */ + private $constraints = []; + /** + * @param VersionConstraint[] $constraints + */ + public function __construct(string $originalValue, array $constraints) + { + parent::__construct($originalValue); + $this->constraints = $constraints; + } + public function complies(Version $version) : bool + { + foreach ($this->constraints as $constraint) { + if (!$constraint->complies($version)) { + return \false; + } + } + return \true; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +class AnyVersionConstraint implements VersionConstraint +{ + public function complies(Version $version) : bool + { + return \true; + } + public function asString() : string + { + return '*'; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +class ExactVersionConstraint extends AbstractVersionConstraint +{ + public function complies(Version $version) : bool + { + $other = $version->getVersionString(); + if ($version->hasBuildMetaData()) { + $other .= '+' . $version->getBuildMetaData()->asString(); + } + return $this->asString() === $other; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +class GreaterThanOrEqualToVersionConstraint extends AbstractVersionConstraint +{ + /** @var Version */ + private $minimalVersion; + public function __construct(string $originalValue, Version $minimalVersion) + { + parent::__construct($originalValue); + $this->minimalVersion = $minimalVersion; + } + public function complies(Version $version) : bool + { + return $version->getVersionString() === $this->minimalVersion->getVersionString() || $version->isGreaterThan($this->minimalVersion); + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +class OrVersionConstraintGroup extends AbstractVersionConstraint +{ + /** @var VersionConstraint[] */ + private $constraints = []; + /** + * @param string $originalValue + * @param VersionConstraint[] $constraints + */ + public function __construct($originalValue, array $constraints) + { + parent::__construct($originalValue); + $this->constraints = $constraints; + } + public function complies(Version $version) : bool + { + foreach ($this->constraints as $constraint) { + if ($constraint->complies($version)) { + return \true; + } + } + return \false; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +class SpecificMajorAndMinorVersionConstraint extends AbstractVersionConstraint +{ + /** @var int */ + private $major; + /** @var int */ + private $minor; + public function __construct(string $originalValue, int $major, int $minor) + { + parent::__construct($originalValue); + $this->major = $major; + $this->minor = $minor; + } + public function complies(Version $version) : bool + { + if ($version->getMajor()->getValue() !== $this->major) { + return \false; + } + return $version->getMinor()->getValue() === $this->minor; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +class SpecificMajorVersionConstraint extends AbstractVersionConstraint +{ + /** @var int */ + private $major; + public function __construct(string $originalValue, int $major) + { + parent::__construct($originalValue); + $this->major = $major; + } + public function complies(Version $version) : bool + { + return $version->getMajor()->getValue() === $this->major; + } +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +interface VersionConstraint +{ + public function complies(Version $version) : bool; + public function asString() : string; +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +use Throwable; +interface Exception extends Throwable +{ +} +, Sebastian Heuer , Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\PharIo\Version; + +final class UnsupportedVersionConstraintException extends \RuntimeException implements Exception +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use function array_diff; +use function array_diff_key; +use function array_flip; +use function array_keys; +use function array_merge; +use function array_unique; +use function array_values; +use function count; +use function explode; +use function get_class; +use function is_array; +use function sort; +use PHPUnit\Framework\TestCase; +use PHPUnit\Runner\PhptTestCase; +use PHPUnit\Util\Test; +use ReflectionClass; +use PHPUnit\SebastianBergmann\CodeCoverage\Driver\Driver; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\Builder; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\Directory; +use PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis\CachingFileAnalyser; +use PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser; +use PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis\ParsingFileAnalyser; +use PHPUnit\SebastianBergmann\CodeUnitReverseLookup\Wizard; +/** + * Provides collection functionality for PHP code coverage information. + */ +final class CodeCoverage +{ + private const UNCOVERED_FILES = 'UNCOVERED_FILES'; + /** + * @var Driver + */ + private $driver; + /** + * @var Filter + */ + private $filter; + /** + * @var Wizard + */ + private $wizard; + /** + * @var bool + */ + private $checkForUnintentionallyCoveredCode = \false; + /** + * @var bool + */ + private $includeUncoveredFiles = \true; + /** + * @var bool + */ + private $processUncoveredFiles = \false; + /** + * @var bool + */ + private $ignoreDeprecatedCode = \false; + /** + * @var null|PhptTestCase|string|TestCase + */ + private $currentId; + /** + * Code coverage data. + * + * @var ProcessedCodeCoverageData + */ + private $data; + /** + * @var bool + */ + private $useAnnotationsForIgnoringCode = \true; + /** + * Test data. + * + * @var array + */ + private $tests = []; + /** + * @psalm-var list + */ + private $parentClassesExcludedFromUnintentionallyCoveredCodeCheck = []; + /** + * @var ?FileAnalyser + */ + private $analyser; + /** + * @var ?string + */ + private $cacheDirectory; + public function __construct(Driver $driver, Filter $filter) + { + $this->driver = $driver; + $this->filter = $filter; + $this->data = new ProcessedCodeCoverageData(); + $this->wizard = new Wizard(); + } + /** + * Returns the code coverage information as a graph of node objects. + */ + public function getReport() : Directory + { + return (new Builder($this->analyser()))->build($this); + } + /** + * Clears collected code coverage data. + */ + public function clear() : void + { + $this->currentId = null; + $this->data = new ProcessedCodeCoverageData(); + $this->tests = []; + } + /** + * Returns the filter object used. + */ + public function filter() : Filter + { + return $this->filter; + } + /** + * Returns the collected code coverage data. + */ + public function getData(bool $raw = \false) : ProcessedCodeCoverageData + { + if (!$raw) { + if ($this->processUncoveredFiles) { + $this->processUncoveredFilesFromFilter(); + } elseif ($this->includeUncoveredFiles) { + $this->addUncoveredFilesFromFilter(); + } + } + return $this->data; + } + /** + * Sets the coverage data. + */ + public function setData(ProcessedCodeCoverageData $data) : void + { + $this->data = $data; + } + /** + * Returns the test data. + */ + public function getTests() : array + { + return $this->tests; + } + /** + * Sets the test data. + */ + public function setTests(array $tests) : void + { + $this->tests = $tests; + } + /** + * Start collection of code coverage information. + * + * @param PhptTestCase|string|TestCase $id + */ + public function start($id, bool $clear = \false) : void + { + if ($clear) { + $this->clear(); + } + $this->currentId = $id; + $this->driver->start(); + } + /** + * Stop collection of code coverage information. + * + * @param array|false $linesToBeCovered + */ + public function stop(bool $append = \true, $linesToBeCovered = [], array $linesToBeUsed = []) : RawCodeCoverageData + { + if (!is_array($linesToBeCovered) && $linesToBeCovered !== \false) { + throw new InvalidArgumentException('$linesToBeCovered must be an array or false'); + } + $data = $this->driver->stop(); + $this->append($data, null, $append, $linesToBeCovered, $linesToBeUsed); + $this->currentId = null; + return $data; + } + /** + * Appends code coverage data. + * + * @param PhptTestCase|string|TestCase $id + * @param array|false $linesToBeCovered + * + * @throws ReflectionException + * @throws TestIdMissingException + * @throws UnintentionallyCoveredCodeException + */ + public function append(RawCodeCoverageData $rawData, $id = null, bool $append = \true, $linesToBeCovered = [], array $linesToBeUsed = []) : void + { + if ($id === null) { + $id = $this->currentId; + } + if ($id === null) { + throw new TestIdMissingException(); + } + $this->applyFilter($rawData); + $this->applyExecutableLinesFilter($rawData); + if ($this->useAnnotationsForIgnoringCode) { + $this->applyIgnoredLinesFilter($rawData); + } + $this->data->initializeUnseenData($rawData); + if (!$append) { + return; + } + if ($id !== self::UNCOVERED_FILES) { + $this->applyCoversAnnotationFilter($rawData, $linesToBeCovered, $linesToBeUsed); + if (empty($rawData->lineCoverage())) { + return; + } + $size = 'unknown'; + $status = -1; + $fromTestcase = \false; + if ($id instanceof TestCase) { + $fromTestcase = \true; + $_size = $id->getSize(); + if ($_size === Test::SMALL) { + $size = 'small'; + } elseif ($_size === Test::MEDIUM) { + $size = 'medium'; + } elseif ($_size === Test::LARGE) { + $size = 'large'; + } + $status = $id->getStatus(); + $id = get_class($id) . '::' . $id->getName(); + } elseif ($id instanceof PhptTestCase) { + $fromTestcase = \true; + $size = 'large'; + $id = $id->getName(); + } + $this->tests[$id] = ['size' => $size, 'status' => $status, 'fromTestcase' => $fromTestcase]; + $this->data->markCodeAsExecutedByTestCase($id, $rawData); + } + } + /** + * Merges the data from another instance. + */ + public function merge(self $that) : void + { + $this->filter->includeFiles($that->filter()->files()); + $this->data->merge($that->data); + $this->tests = array_merge($this->tests, $that->getTests()); + } + public function enableCheckForUnintentionallyCoveredCode() : void + { + $this->checkForUnintentionallyCoveredCode = \true; + } + public function disableCheckForUnintentionallyCoveredCode() : void + { + $this->checkForUnintentionallyCoveredCode = \false; + } + public function includeUncoveredFiles() : void + { + $this->includeUncoveredFiles = \true; + } + public function excludeUncoveredFiles() : void + { + $this->includeUncoveredFiles = \false; + } + public function processUncoveredFiles() : void + { + $this->processUncoveredFiles = \true; + } + public function doNotProcessUncoveredFiles() : void + { + $this->processUncoveredFiles = \false; + } + public function enableAnnotationsForIgnoringCode() : void + { + $this->useAnnotationsForIgnoringCode = \true; + } + public function disableAnnotationsForIgnoringCode() : void + { + $this->useAnnotationsForIgnoringCode = \false; + } + public function ignoreDeprecatedCode() : void + { + $this->ignoreDeprecatedCode = \true; + } + public function doNotIgnoreDeprecatedCode() : void + { + $this->ignoreDeprecatedCode = \false; + } + /** + * @psalm-assert-if-true !null $this->cacheDirectory + */ + public function cachesStaticAnalysis() : bool + { + return $this->cacheDirectory !== null; + } + public function cacheStaticAnalysis(string $directory) : void + { + $this->cacheDirectory = $directory; + } + public function doNotCacheStaticAnalysis() : void + { + $this->cacheDirectory = null; + } + /** + * @throws StaticAnalysisCacheNotConfiguredException + */ + public function cacheDirectory() : string + { + if (!$this->cachesStaticAnalysis()) { + throw new StaticAnalysisCacheNotConfiguredException('The static analysis cache is not configured'); + } + return $this->cacheDirectory; + } + /** + * @psalm-param class-string $className + */ + public function excludeSubclassesOfThisClassFromUnintentionallyCoveredCodeCheck(string $className) : void + { + $this->parentClassesExcludedFromUnintentionallyCoveredCodeCheck[] = $className; + } + public function enableBranchAndPathCoverage() : void + { + $this->driver->enableBranchAndPathCoverage(); + } + public function disableBranchAndPathCoverage() : void + { + $this->driver->disableBranchAndPathCoverage(); + } + public function collectsBranchAndPathCoverage() : bool + { + return $this->driver->collectsBranchAndPathCoverage(); + } + public function detectsDeadCode() : bool + { + return $this->driver->detectsDeadCode(); + } + /** + * Applies the @covers annotation filtering. + * + * @param array|false $linesToBeCovered + * + * @throws ReflectionException + * @throws UnintentionallyCoveredCodeException + */ + private function applyCoversAnnotationFilter(RawCodeCoverageData $rawData, $linesToBeCovered, array $linesToBeUsed) : void + { + if ($linesToBeCovered === \false) { + $rawData->clear(); + return; + } + if (empty($linesToBeCovered)) { + return; + } + if ($this->checkForUnintentionallyCoveredCode && (!$this->currentId instanceof TestCase || !$this->currentId->isMedium() && !$this->currentId->isLarge())) { + $this->performUnintentionallyCoveredCodeCheck($rawData, $linesToBeCovered, $linesToBeUsed); + } + $rawLineData = $rawData->lineCoverage(); + $filesWithNoCoverage = array_diff_key($rawLineData, $linesToBeCovered); + foreach (array_keys($filesWithNoCoverage) as $fileWithNoCoverage) { + $rawData->removeCoverageDataForFile($fileWithNoCoverage); + } + if (is_array($linesToBeCovered)) { + foreach ($linesToBeCovered as $fileToBeCovered => $includedLines) { + $rawData->keepLineCoverageDataOnlyForLines($fileToBeCovered, $includedLines); + $rawData->keepFunctionCoverageDataOnlyForLines($fileToBeCovered, $includedLines); + } + } + } + private function applyFilter(RawCodeCoverageData $data) : void + { + if ($this->filter->isEmpty()) { + return; + } + foreach (array_keys($data->lineCoverage()) as $filename) { + if ($this->filter->isExcluded($filename)) { + $data->removeCoverageDataForFile($filename); + } + } + } + private function applyExecutableLinesFilter(RawCodeCoverageData $data) : void + { + foreach (array_keys($data->lineCoverage()) as $filename) { + if (!$this->filter->isFile($filename)) { + continue; + } + $data->keepLineCoverageDataOnlyForLines($filename, $this->analyser()->executableLinesIn($filename)); + } + } + private function applyIgnoredLinesFilter(RawCodeCoverageData $data) : void + { + foreach (array_keys($data->lineCoverage()) as $filename) { + if (!$this->filter->isFile($filename)) { + continue; + } + $data->removeCoverageDataForLines($filename, $this->analyser()->ignoredLinesFor($filename)); + } + } + /** + * @throws UnintentionallyCoveredCodeException + */ + private function addUncoveredFilesFromFilter() : void + { + $uncoveredFiles = array_diff($this->filter->files(), $this->data->coveredFiles()); + foreach ($uncoveredFiles as $uncoveredFile) { + if ($this->filter->isFile($uncoveredFile)) { + $this->append(RawCodeCoverageData::fromUncoveredFile($uncoveredFile, $this->analyser()), self::UNCOVERED_FILES); + } + } + } + /** + * @throws UnintentionallyCoveredCodeException + */ + private function processUncoveredFilesFromFilter() : void + { + $uncoveredFiles = array_diff($this->filter->files(), $this->data->coveredFiles()); + $this->driver->start(); + foreach ($uncoveredFiles as $uncoveredFile) { + if ($this->filter->isFile($uncoveredFile)) { + include_once $uncoveredFile; + } + } + $this->append($this->driver->stop(), self::UNCOVERED_FILES); + } + /** + * @throws ReflectionException + * @throws UnintentionallyCoveredCodeException + */ + private function performUnintentionallyCoveredCodeCheck(RawCodeCoverageData $data, array $linesToBeCovered, array $linesToBeUsed) : void + { + $allowedLines = $this->getAllowedLines($linesToBeCovered, $linesToBeUsed); + $unintentionallyCoveredUnits = []; + foreach ($data->lineCoverage() as $file => $_data) { + foreach ($_data as $line => $flag) { + if ($flag === 1 && !isset($allowedLines[$file][$line])) { + $unintentionallyCoveredUnits[] = $this->wizard->lookup($file, $line); + } + } + } + $unintentionallyCoveredUnits = $this->processUnintentionallyCoveredUnits($unintentionallyCoveredUnits); + if (!empty($unintentionallyCoveredUnits)) { + throw new UnintentionallyCoveredCodeException($unintentionallyCoveredUnits); + } + } + private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed) : array + { + $allowedLines = []; + foreach (array_keys($linesToBeCovered) as $file) { + if (!isset($allowedLines[$file])) { + $allowedLines[$file] = []; + } + $allowedLines[$file] = array_merge($allowedLines[$file], $linesToBeCovered[$file]); + } + foreach (array_keys($linesToBeUsed) as $file) { + if (!isset($allowedLines[$file])) { + $allowedLines[$file] = []; + } + $allowedLines[$file] = array_merge($allowedLines[$file], $linesToBeUsed[$file]); + } + foreach (array_keys($allowedLines) as $file) { + $allowedLines[$file] = array_flip(array_unique($allowedLines[$file])); + } + return $allowedLines; + } + /** + * @throws ReflectionException + */ + private function processUnintentionallyCoveredUnits(array $unintentionallyCoveredUnits) : array + { + $unintentionallyCoveredUnits = array_unique($unintentionallyCoveredUnits); + sort($unintentionallyCoveredUnits); + foreach (array_keys($unintentionallyCoveredUnits) as $k => $v) { + $unit = explode('::', $unintentionallyCoveredUnits[$k]); + if (count($unit) !== 2) { + continue; + } + try { + $class = new ReflectionClass($unit[0]); + foreach ($this->parentClassesExcludedFromUnintentionallyCoveredCodeCheck as $parentClass) { + if ($class->isSubclassOf($parentClass)) { + unset($unintentionallyCoveredUnits[$k]); + break; + } + } + } catch (\ReflectionException $e) { + throw new ReflectionException($e->getMessage(), (int) $e->getCode(), $e); + } + } + return array_values($unintentionallyCoveredUnits); + } + private function analyser() : FileAnalyser + { + if ($this->analyser !== null) { + return $this->analyser; + } + $this->analyser = new ParsingFileAnalyser($this->useAnnotationsForIgnoringCode, $this->ignoreDeprecatedCode); + if ($this->cachesStaticAnalysis()) { + $this->analyser = new CachingFileAnalyser($this->cacheDirectory, $this->analyser); + } + return $this->analyser; + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use function sprintf; +use PHPUnit\SebastianBergmann\CodeCoverage\BranchAndPathCoverageNotSupportedException; +use PHPUnit\SebastianBergmann\CodeCoverage\DeadCodeDetectionNotSupportedException; +use PHPUnit\SebastianBergmann\CodeCoverage\Filter; +use PHPUnit\SebastianBergmann\CodeCoverage\NoCodeCoverageDriverAvailableException; +use PHPUnit\SebastianBergmann\CodeCoverage\NoCodeCoverageDriverWithPathCoverageSupportAvailableException; +use PHPUnit\SebastianBergmann\CodeCoverage\RawCodeCoverageData; +/** + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + */ +abstract class Driver +{ + /** + * @var int + * + * @see http://xdebug.org/docs/code_coverage + */ + public const LINE_NOT_EXECUTABLE = -2; + /** + * @var int + * + * @see http://xdebug.org/docs/code_coverage + */ + public const LINE_NOT_EXECUTED = -1; + /** + * @var int + * + * @see http://xdebug.org/docs/code_coverage + */ + public const LINE_EXECUTED = 1; + /** + * @var int + * + * @see http://xdebug.org/docs/code_coverage + */ + public const BRANCH_NOT_HIT = 0; + /** + * @var int + * + * @see http://xdebug.org/docs/code_coverage + */ + public const BRANCH_HIT = 1; + /** + * @var bool + */ + private $collectBranchAndPathCoverage = \false; + /** + * @var bool + */ + private $detectDeadCode = \false; + /** + * @throws NoCodeCoverageDriverAvailableException + * @throws PcovNotAvailableException + * @throws PhpdbgNotAvailableException + * @throws Xdebug2NotEnabledException + * @throws Xdebug3NotEnabledException + * @throws XdebugNotAvailableException + * + * @deprecated Use DriverSelector::forLineCoverage() instead + */ + public static function forLineCoverage(Filter $filter) : self + { + return (new Selector())->forLineCoverage($filter); + } + /** + * @throws NoCodeCoverageDriverWithPathCoverageSupportAvailableException + * @throws Xdebug2NotEnabledException + * @throws Xdebug3NotEnabledException + * @throws XdebugNotAvailableException + * + * @deprecated Use DriverSelector::forLineAndPathCoverage() instead + */ + public static function forLineAndPathCoverage(Filter $filter) : self + { + return (new Selector())->forLineAndPathCoverage($filter); + } + public function canCollectBranchAndPathCoverage() : bool + { + return \false; + } + public function collectsBranchAndPathCoverage() : bool + { + return $this->collectBranchAndPathCoverage; + } + /** + * @throws BranchAndPathCoverageNotSupportedException + */ + public function enableBranchAndPathCoverage() : void + { + if (!$this->canCollectBranchAndPathCoverage()) { + throw new BranchAndPathCoverageNotSupportedException(sprintf('%s does not support branch and path coverage', $this->nameAndVersion())); + } + $this->collectBranchAndPathCoverage = \true; + } + public function disableBranchAndPathCoverage() : void + { + $this->collectBranchAndPathCoverage = \false; + } + public function canDetectDeadCode() : bool + { + return \false; + } + public function detectsDeadCode() : bool + { + return $this->detectDeadCode; + } + /** + * @throws DeadCodeDetectionNotSupportedException + */ + public function enableDeadCodeDetection() : void + { + if (!$this->canDetectDeadCode()) { + throw new DeadCodeDetectionNotSupportedException(sprintf('%s does not support dead code detection', $this->nameAndVersion())); + } + $this->detectDeadCode = \true; + } + public function disableDeadCodeDetection() : void + { + $this->detectDeadCode = \false; + } + public abstract function nameAndVersion() : string; + public abstract function start() : void; + public abstract function stop() : RawCodeCoverageData; +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use const pcov\inclusive; +use function array_intersect; +use function extension_loaded; +use function pcov\clear; +use function pcov\collect; +use function pcov\start; +use function pcov\stop; +use function pcov\waiting; +use function phpversion; +use PHPUnit\SebastianBergmann\CodeCoverage\Filter; +use PHPUnit\SebastianBergmann\CodeCoverage\RawCodeCoverageData; +/** + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + */ +final class PcovDriver extends Driver +{ + /** + * @var Filter + */ + private $filter; + /** + * @throws PcovNotAvailableException + */ + public function __construct(Filter $filter) + { + if (!extension_loaded('pcov')) { + throw new PcovNotAvailableException(); + } + $this->filter = $filter; + } + public function start() : void + { + start(); + } + public function stop() : RawCodeCoverageData + { + stop(); + $filesToCollectCoverageFor = waiting(); + $collected = []; + if ($filesToCollectCoverageFor) { + if (!$this->filter->isEmpty()) { + $filesToCollectCoverageFor = array_intersect($filesToCollectCoverageFor, $this->filter->files()); + } + $collected = collect(inclusive, $filesToCollectCoverageFor); + clear(); + } + return RawCodeCoverageData::fromXdebugWithoutPathCoverage($collected); + } + public function nameAndVersion() : string + { + return 'PCOV ' . phpversion('pcov'); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use const PHP_SAPI; +use const PHP_VERSION; +use function array_diff; +use function array_keys; +use function array_merge; +use function get_included_files; +use function phpdbg_end_oplog; +use function phpdbg_get_executable; +use function phpdbg_start_oplog; +use PHPUnit\SebastianBergmann\CodeCoverage\RawCodeCoverageData; +/** + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + */ +final class PhpdbgDriver extends Driver +{ + /** + * @throws PhpdbgNotAvailableException + */ + public function __construct() + { + if (PHP_SAPI !== 'phpdbg') { + throw new PhpdbgNotAvailableException(); + } + } + public function start() : void + { + phpdbg_start_oplog(); + } + public function stop() : RawCodeCoverageData + { + static $fetchedLines = []; + $dbgData = phpdbg_end_oplog(); + if ($fetchedLines === []) { + $sourceLines = phpdbg_get_executable(); + } else { + $newFiles = array_diff(get_included_files(), array_keys($fetchedLines)); + $sourceLines = []; + if ($newFiles) { + $sourceLines = phpdbg_get_executable(['files' => $newFiles]); + } + } + foreach ($sourceLines as $file => $lines) { + foreach ($lines as $lineNo => $numExecuted) { + $sourceLines[$file][$lineNo] = self::LINE_NOT_EXECUTED; + } + } + $fetchedLines = array_merge($fetchedLines, $sourceLines); + return RawCodeCoverageData::fromXdebugWithoutPathCoverage($this->detectExecutedLines($fetchedLines, $dbgData)); + } + public function nameAndVersion() : string + { + return 'PHPDBG ' . PHP_VERSION; + } + private function detectExecutedLines(array $sourceLines, array $dbgData) : array + { + foreach ($dbgData as $file => $coveredLines) { + foreach ($coveredLines as $lineNo => $numExecuted) { + // phpdbg also reports $lineNo=0 when e.g. exceptions get thrown. + // make sure we only mark lines executed which are actually executable. + if (isset($sourceLines[$file][$lineNo])) { + $sourceLines[$file][$lineNo] = self::LINE_EXECUTED; + } + } + } + return $sourceLines; + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use function phpversion; +use function version_compare; +use PHPUnit\SebastianBergmann\CodeCoverage\Filter; +use PHPUnit\SebastianBergmann\CodeCoverage\NoCodeCoverageDriverAvailableException; +use PHPUnit\SebastianBergmann\CodeCoverage\NoCodeCoverageDriverWithPathCoverageSupportAvailableException; +use PHPUnit\SebastianBergmann\Environment\Runtime; +final class Selector +{ + /** + * @throws NoCodeCoverageDriverAvailableException + * @throws PcovNotAvailableException + * @throws PhpdbgNotAvailableException + * @throws Xdebug2NotEnabledException + * @throws Xdebug3NotEnabledException + * @throws XdebugNotAvailableException + */ + public function forLineCoverage(Filter $filter) : Driver + { + $runtime = new Runtime(); + if ($runtime->hasPHPDBGCodeCoverage()) { + return new PhpdbgDriver(); + } + if ($runtime->hasPCOV()) { + return new PcovDriver($filter); + } + if ($runtime->hasXdebug()) { + if (version_compare(phpversion('xdebug'), '3', '>=')) { + $driver = new Xdebug3Driver($filter); + } else { + $driver = new Xdebug2Driver($filter); + } + $driver->enableDeadCodeDetection(); + return $driver; + } + throw new NoCodeCoverageDriverAvailableException(); + } + /** + * @throws NoCodeCoverageDriverWithPathCoverageSupportAvailableException + * @throws Xdebug2NotEnabledException + * @throws Xdebug3NotEnabledException + * @throws XdebugNotAvailableException + */ + public function forLineAndPathCoverage(Filter $filter) : Driver + { + if ((new Runtime())->hasXdebug()) { + if (version_compare(phpversion('xdebug'), '3', '>=')) { + $driver = new Xdebug3Driver($filter); + } else { + $driver = new Xdebug2Driver($filter); + } + $driver->enableDeadCodeDetection(); + $driver->enableBranchAndPathCoverage(); + return $driver; + } + throw new NoCodeCoverageDriverWithPathCoverageSupportAvailableException(); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use const XDEBUG_CC_BRANCH_CHECK; +use const XDEBUG_CC_DEAD_CODE; +use const XDEBUG_CC_UNUSED; +use const XDEBUG_FILTER_CODE_COVERAGE; +use const XDEBUG_PATH_INCLUDE; +use const XDEBUG_PATH_WHITELIST; +use function defined; +use function extension_loaded; +use function ini_get; +use function phpversion; +use function sprintf; +use function version_compare; +use function xdebug_get_code_coverage; +use function xdebug_set_filter; +use function xdebug_start_code_coverage; +use function xdebug_stop_code_coverage; +use PHPUnit\SebastianBergmann\CodeCoverage\Filter; +use PHPUnit\SebastianBergmann\CodeCoverage\RawCodeCoverageData; +/** + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + */ +final class Xdebug2Driver extends Driver +{ + /** + * @var bool + */ + private $pathCoverageIsMixedCoverage; + /** + * @throws WrongXdebugVersionException + * @throws Xdebug2NotEnabledException + * @throws XdebugNotAvailableException + */ + public function __construct(Filter $filter) + { + if (!extension_loaded('xdebug')) { + throw new XdebugNotAvailableException(); + } + if (version_compare(phpversion('xdebug'), '3', '>=')) { + throw new WrongXdebugVersionException(sprintf('This driver requires Xdebug 2 but version %s is loaded', phpversion('xdebug'))); + } + if (!ini_get('xdebug.coverage_enable')) { + throw new Xdebug2NotEnabledException(); + } + if (!$filter->isEmpty()) { + if (defined('XDEBUG_PATH_WHITELIST')) { + $listType = XDEBUG_PATH_WHITELIST; + } else { + $listType = XDEBUG_PATH_INCLUDE; + } + xdebug_set_filter(XDEBUG_FILTER_CODE_COVERAGE, $listType, $filter->files()); + } + $this->pathCoverageIsMixedCoverage = version_compare(phpversion('xdebug'), '2.9.6', '<'); + } + public function canCollectBranchAndPathCoverage() : bool + { + return \true; + } + public function canDetectDeadCode() : bool + { + return \true; + } + public function start() : void + { + $flags = XDEBUG_CC_UNUSED; + if ($this->detectsDeadCode() || $this->collectsBranchAndPathCoverage()) { + $flags |= XDEBUG_CC_DEAD_CODE; + } + if ($this->collectsBranchAndPathCoverage()) { + $flags |= XDEBUG_CC_BRANCH_CHECK; + } + xdebug_start_code_coverage($flags); + } + public function stop() : RawCodeCoverageData + { + $data = xdebug_get_code_coverage(); + xdebug_stop_code_coverage(); + if ($this->collectsBranchAndPathCoverage()) { + if ($this->pathCoverageIsMixedCoverage) { + return RawCodeCoverageData::fromXdebugWithMixedCoverage($data); + } + return RawCodeCoverageData::fromXdebugWithPathCoverage($data); + } + return RawCodeCoverageData::fromXdebugWithoutPathCoverage($data); + } + public function nameAndVersion() : string + { + return 'Xdebug ' . phpversion('xdebug'); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use const XDEBUG_CC_BRANCH_CHECK; +use const XDEBUG_CC_DEAD_CODE; +use const XDEBUG_CC_UNUSED; +use const XDEBUG_FILTER_CODE_COVERAGE; +use const XDEBUG_PATH_INCLUDE; +use function explode; +use function extension_loaded; +use function getenv; +use function in_array; +use function ini_get; +use function phpversion; +use function sprintf; +use function version_compare; +use function xdebug_get_code_coverage; +use function xdebug_set_filter; +use function xdebug_start_code_coverage; +use function xdebug_stop_code_coverage; +use PHPUnit\SebastianBergmann\CodeCoverage\Filter; +use PHPUnit\SebastianBergmann\CodeCoverage\RawCodeCoverageData; +/** + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + */ +final class Xdebug3Driver extends Driver +{ + /** + * @throws WrongXdebugVersionException + * @throws Xdebug3NotEnabledException + * @throws XdebugNotAvailableException + */ + public function __construct(Filter $filter) + { + if (!extension_loaded('xdebug')) { + throw new XdebugNotAvailableException(); + } + if (version_compare(phpversion('xdebug'), '3', '<')) { + throw new WrongXdebugVersionException(sprintf('This driver requires Xdebug 3 but version %s is loaded', phpversion('xdebug'))); + } + $mode = getenv('XDEBUG_MODE'); + if ($mode === \false || $mode === '') { + $mode = ini_get('xdebug.mode'); + } + if ($mode === \false || !in_array('coverage', explode(',', $mode), \true)) { + throw new Xdebug3NotEnabledException(); + } + if (!$filter->isEmpty()) { + xdebug_set_filter(XDEBUG_FILTER_CODE_COVERAGE, XDEBUG_PATH_INCLUDE, $filter->files()); + } + } + public function canCollectBranchAndPathCoverage() : bool + { + return \true; + } + public function canDetectDeadCode() : bool + { + return \true; + } + public function start() : void + { + $flags = XDEBUG_CC_UNUSED; + if ($this->detectsDeadCode() || $this->collectsBranchAndPathCoverage()) { + $flags |= XDEBUG_CC_DEAD_CODE; + } + if ($this->collectsBranchAndPathCoverage()) { + $flags |= XDEBUG_CC_BRANCH_CHECK; + } + xdebug_start_code_coverage($flags); + } + public function stop() : RawCodeCoverageData + { + $data = xdebug_get_code_coverage(); + xdebug_stop_code_coverage(); + if ($this->collectsBranchAndPathCoverage()) { + return RawCodeCoverageData::fromXdebugWithPathCoverage($data); + } + return RawCodeCoverageData::fromXdebugWithoutPathCoverage($data); + } + public function nameAndVersion() : string + { + return 'Xdebug ' . phpversion('xdebug'); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use RuntimeException; +final class BranchAndPathCoverageNotSupportedException extends RuntimeException implements Exception +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use RuntimeException; +final class DeadCodeDetectionNotSupportedException extends RuntimeException implements Exception +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Util; + +use RuntimeException; +use PHPUnit\SebastianBergmann\CodeCoverage\Exception; +final class DirectoryCouldNotBeCreatedException extends RuntimeException implements Exception +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use Throwable; +interface Exception extends Throwable +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +final class InvalidArgumentException extends \InvalidArgumentException implements Exception +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use RuntimeException; +final class NoCodeCoverageDriverAvailableException extends RuntimeException implements Exception +{ + public function __construct() + { + parent::__construct('No code coverage driver available'); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use RuntimeException; +final class NoCodeCoverageDriverWithPathCoverageSupportAvailableException extends RuntimeException implements Exception +{ + public function __construct() + { + parent::__construct('No code coverage driver with path coverage support available'); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use RuntimeException; +final class ParserException extends RuntimeException implements Exception +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use function sprintf; +use RuntimeException; +use PHPUnit\SebastianBergmann\CodeCoverage\Exception; +final class PathExistsButIsNotDirectoryException extends RuntimeException implements Exception +{ + public function __construct(string $path) + { + parent::__construct(sprintf('"%s" exists but is not a directory', $path)); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use RuntimeException; +use PHPUnit\SebastianBergmann\CodeCoverage\Exception; +final class PcovNotAvailableException extends RuntimeException implements Exception +{ + public function __construct() + { + parent::__construct('The PCOV extension is not available'); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use RuntimeException; +use PHPUnit\SebastianBergmann\CodeCoverage\Exception; +final class PhpdbgNotAvailableException extends RuntimeException implements Exception +{ + public function __construct() + { + parent::__construct('The PHPDBG SAPI is not available'); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use RuntimeException; +final class ReflectionException extends RuntimeException implements Exception +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use RuntimeException; +final class ReportAlreadyFinalizedException extends RuntimeException implements Exception +{ + public function __construct() + { + parent::__construct('The code coverage report has already been finalized'); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use RuntimeException; +final class StaticAnalysisCacheNotConfiguredException extends RuntimeException implements Exception +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use RuntimeException; +final class TestIdMissingException extends RuntimeException implements Exception +{ + public function __construct() + { + parent::__construct('Test ID is missing'); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use RuntimeException; +final class UnintentionallyCoveredCodeException extends RuntimeException implements Exception +{ + /** + * @var array + */ + private $unintentionallyCoveredUnits; + public function __construct(array $unintentionallyCoveredUnits) + { + $this->unintentionallyCoveredUnits = $unintentionallyCoveredUnits; + parent::__construct($this->toString()); + } + public function getUnintentionallyCoveredUnits() : array + { + return $this->unintentionallyCoveredUnits; + } + private function toString() : string + { + $message = ''; + foreach ($this->unintentionallyCoveredUnits as $unit) { + $message .= '- ' . $unit . "\n"; + } + return $message; + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use function sprintf; +use RuntimeException; +use PHPUnit\SebastianBergmann\CodeCoverage\Exception; +final class WriteOperationFailedException extends RuntimeException implements Exception +{ + public function __construct(string $path) + { + parent::__construct(sprintf('Cannot write to "%s"', $path)); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use RuntimeException; +use PHPUnit\SebastianBergmann\CodeCoverage\Exception; +final class WrongXdebugVersionException extends RuntimeException implements Exception +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use RuntimeException; +use PHPUnit\SebastianBergmann\CodeCoverage\Exception; +final class Xdebug2NotEnabledException extends RuntimeException implements Exception +{ + public function __construct() + { + parent::__construct('xdebug.coverage_enable=On has to be set'); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use RuntimeException; +use PHPUnit\SebastianBergmann\CodeCoverage\Exception; +final class Xdebug3NotEnabledException extends RuntimeException implements Exception +{ + public function __construct() + { + parent::__construct('XDEBUG_MODE=coverage or xdebug.mode=coverage has to be set'); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; + +use RuntimeException; +use PHPUnit\SebastianBergmann\CodeCoverage\Exception; +final class XdebugNotAvailableException extends RuntimeException implements Exception +{ + public function __construct() + { + parent::__construct('The Xdebug extension is not available'); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use RuntimeException; +final class XmlException extends RuntimeException implements Exception +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage; + +use function array_keys; +use function is_file; +use function realpath; +use function strpos; +use PHPUnit\SebastianBergmann\FileIterator\Facade as FileIteratorFacade; +final class Filter +{ + /** + * @psalm-var array + */ + private $files = []; + /** + * @psalm-var array + */ + private $isFileCache = []; + public function includeDirectory(string $directory, string $suffix = '.php', string $prefix = '') : void + { + foreach ((new FileIteratorFacade())->getFilesAsArray($directory, $suffix, $prefix) as $file) { + $this->includeFile($file); + } + } + /** + * @psalm-param list $files + */ + public function includeFiles(array $filenames) : void + { + foreach ($filenames as $filename) { + $this->includeFile($filename); + } + } + public function includeFile(string $filename) : void + { + $filename = realpath($filename); + if (!$filename) { + return; + } + $this->files[$filename] = \true; + } + public function excludeDirectory(string $directory, string $suffix = '.php', string $prefix = '') : void + { + foreach ((new FileIteratorFacade())->getFilesAsArray($directory, $suffix, $prefix) as $file) { + $this->excludeFile($file); + } + } + public function excludeFile(string $filename) : void + { + $filename = realpath($filename); + if (!$filename || !isset($this->files[$filename])) { + return; + } + unset($this->files[$filename]); + } + public function isFile(string $filename) : bool + { + if (isset($this->isFileCache[$filename])) { + return $this->isFileCache[$filename]; + } + if ($filename === '-' || strpos($filename, 'vfs://') === 0 || strpos($filename, 'xdebug://debug-eval') !== \false || strpos($filename, 'eval()\'d code') !== \false || strpos($filename, 'runtime-created function') !== \false || strpos($filename, 'runkit created function') !== \false || strpos($filename, 'assert code') !== \false || strpos($filename, 'regexp code') !== \false || strpos($filename, 'Standard input code') !== \false) { + $isFile = \false; + } else { + $isFile = is_file($filename); + } + $this->isFileCache[$filename] = $isFile; + return $isFile; + } + public function isExcluded(string $filename) : bool + { + return !isset($this->files[$filename]) || !$this->isFile($filename); + } + /** + * @psalm-return list + */ + public function files() : array + { + return array_keys($this->files); + } + public function isEmpty() : bool + { + return empty($this->files); + } +} +php-code-coverage + +Copyright (c) 2009-2022, Sebastian Bergmann . +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Sebastian Bergmann nor the names of his + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Node; + +use const DIRECTORY_SEPARATOR; +use function array_merge; +use function str_replace; +use function substr; +use Countable; +use PHPUnit\SebastianBergmann\CodeCoverage\Util\Percentage; /** - * This file is part of phpDocumentor. + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + */ +abstract class AbstractNode implements Countable +{ + /** + * @var string + */ + private $name; + /** + * @var string + */ + private $pathAsString; + /** + * @var array + */ + private $pathAsArray; + /** + * @var AbstractNode + */ + private $parent; + /** + * @var string + */ + private $id; + public function __construct(string $name, self $parent = null) + { + if (substr($name, -1) === DIRECTORY_SEPARATOR) { + $name = substr($name, 0, -1); + } + $this->name = $name; + $this->parent = $parent; + } + public function name() : string + { + return $this->name; + } + public function id() : string + { + if ($this->id === null) { + $parent = $this->parent(); + if ($parent === null) { + $this->id = 'index'; + } else { + $parentId = $parent->id(); + if ($parentId === 'index') { + $this->id = str_replace(':', '_', $this->name); + } else { + $this->id = $parentId . '/' . $this->name; + } + } + } + return $this->id; + } + public function pathAsString() : string + { + if ($this->pathAsString === null) { + if ($this->parent === null) { + $this->pathAsString = $this->name; + } else { + $this->pathAsString = $this->parent->pathAsString() . DIRECTORY_SEPARATOR . $this->name; + } + } + return $this->pathAsString; + } + public function pathAsArray() : array + { + if ($this->pathAsArray === null) { + if ($this->parent === null) { + $this->pathAsArray = []; + } else { + $this->pathAsArray = $this->parent->pathAsArray(); + } + $this->pathAsArray[] = $this; + } + return $this->pathAsArray; + } + public function parent() : ?self + { + return $this->parent; + } + public function percentageOfTestedClasses() : Percentage + { + return Percentage::fromFractionAndTotal($this->numberOfTestedClasses(), $this->numberOfClasses()); + } + public function percentageOfTestedTraits() : Percentage + { + return Percentage::fromFractionAndTotal($this->numberOfTestedTraits(), $this->numberOfTraits()); + } + public function percentageOfTestedClassesAndTraits() : Percentage + { + return Percentage::fromFractionAndTotal($this->numberOfTestedClassesAndTraits(), $this->numberOfClassesAndTraits()); + } + public function percentageOfTestedFunctions() : Percentage + { + return Percentage::fromFractionAndTotal($this->numberOfTestedFunctions(), $this->numberOfFunctions()); + } + public function percentageOfTestedMethods() : Percentage + { + return Percentage::fromFractionAndTotal($this->numberOfTestedMethods(), $this->numberOfMethods()); + } + public function percentageOfTestedFunctionsAndMethods() : Percentage + { + return Percentage::fromFractionAndTotal($this->numberOfTestedFunctionsAndMethods(), $this->numberOfFunctionsAndMethods()); + } + public function percentageOfExecutedLines() : Percentage + { + return Percentage::fromFractionAndTotal($this->numberOfExecutedLines(), $this->numberOfExecutableLines()); + } + public function percentageOfExecutedBranches() : Percentage + { + return Percentage::fromFractionAndTotal($this->numberOfExecutedBranches(), $this->numberOfExecutableBranches()); + } + public function percentageOfExecutedPaths() : Percentage + { + return Percentage::fromFractionAndTotal($this->numberOfExecutedPaths(), $this->numberOfExecutablePaths()); + } + public function numberOfClassesAndTraits() : int + { + return $this->numberOfClasses() + $this->numberOfTraits(); + } + public function numberOfTestedClassesAndTraits() : int + { + return $this->numberOfTestedClasses() + $this->numberOfTestedTraits(); + } + public function classesAndTraits() : array + { + return array_merge($this->classes(), $this->traits()); + } + public function numberOfFunctionsAndMethods() : int + { + return $this->numberOfFunctions() + $this->numberOfMethods(); + } + public function numberOfTestedFunctionsAndMethods() : int + { + return $this->numberOfTestedFunctions() + $this->numberOfTestedMethods(); + } + public abstract function classes() : array; + public abstract function traits() : array; + public abstract function functions() : array; + /** + * @psalm-return array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} + */ + public abstract function linesOfCode() : array; + public abstract function numberOfExecutableLines() : int; + public abstract function numberOfExecutedLines() : int; + public abstract function numberOfExecutableBranches() : int; + public abstract function numberOfExecutedBranches() : int; + public abstract function numberOfExecutablePaths() : int; + public abstract function numberOfExecutedPaths() : int; + public abstract function numberOfClasses() : int; + public abstract function numberOfTestedClasses() : int; + public abstract function numberOfTraits() : int; + public abstract function numberOfTestedTraits() : int; + public abstract function numberOfMethods() : int; + public abstract function numberOfTestedMethods() : int; + public abstract function numberOfFunctions() : int; + public abstract function numberOfTestedFunctions() : int; +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Node; + +use const DIRECTORY_SEPARATOR; +use function array_shift; +use function basename; +use function count; +use function dirname; +use function explode; +use function implode; +use function is_file; +use function str_replace; +use function strpos; +use function substr; +use PHPUnit\SebastianBergmann\CodeCoverage\CodeCoverage; +use PHPUnit\SebastianBergmann\CodeCoverage\ProcessedCodeCoverageData; +use PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser; +/** + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + */ +final class Builder +{ + /** + * @var FileAnalyser + */ + private $analyser; + public function __construct(FileAnalyser $analyser) + { + $this->analyser = $analyser; + } + public function build(CodeCoverage $coverage) : Directory + { + $data = clone $coverage->getData(); + // clone because path munging is destructive to the original data + $commonPath = $this->reducePaths($data); + $root = new Directory($commonPath, null); + $this->addItems($root, $this->buildDirectoryStructure($data), $coverage->getTests()); + return $root; + } + private function addItems(Directory $root, array $items, array $tests) : void + { + foreach ($items as $key => $value) { + $key = (string) $key; + if (substr($key, -2) === '/f') { + $key = substr($key, 0, -2); + $filename = $root->pathAsString() . DIRECTORY_SEPARATOR . $key; + if (is_file($filename)) { + $root->addFile(new File($key, $root, $value['lineCoverage'], $value['functionCoverage'], $tests, $this->analyser->classesIn($filename), $this->analyser->traitsIn($filename), $this->analyser->functionsIn($filename), $this->analyser->linesOfCodeFor($filename))); + } + } else { + $child = $root->addDirectory($key); + $this->addItems($child, $value, $tests); + } + } + } + /** + * Builds an array representation of the directory structure. + * + * For instance, + * + * + * Array + * ( + * [Money.php] => Array + * ( + * ... + * ) + * + * [MoneyBag.php] => Array + * ( + * ... + * ) + * ) + * + * + * is transformed into + * + * + * Array + * ( + * [.] => Array + * ( + * [Money.php] => Array + * ( + * ... + * ) + * + * [MoneyBag.php] => Array + * ( + * ... + * ) + * ) + * ) + * + */ + private function buildDirectoryStructure(ProcessedCodeCoverageData $data) : array + { + $result = []; + foreach ($data->coveredFiles() as $originalPath) { + $path = explode(DIRECTORY_SEPARATOR, $originalPath); + $pointer =& $result; + $max = count($path); + for ($i = 0; $i < $max; $i++) { + $type = ''; + if ($i === $max - 1) { + $type = '/f'; + } + $pointer =& $pointer[$path[$i] . $type]; + } + $pointer = ['lineCoverage' => $data->lineCoverage()[$originalPath] ?? [], 'functionCoverage' => $data->functionCoverage()[$originalPath] ?? []]; + } + return $result; + } + /** + * Reduces the paths by cutting the longest common start path. + * + * For instance, + * + * + * Array + * ( + * [/home/sb/Money/Money.php] => Array + * ( + * ... + * ) + * + * [/home/sb/Money/MoneyBag.php] => Array + * ( + * ... + * ) + * ) + * + * + * is reduced to + * + * + * Array + * ( + * [Money.php] => Array + * ( + * ... + * ) + * + * [MoneyBag.php] => Array + * ( + * ... + * ) + * ) + * + */ + private function reducePaths(ProcessedCodeCoverageData $coverage) : string + { + if (empty($coverage->coveredFiles())) { + return '.'; + } + $commonPath = ''; + $paths = $coverage->coveredFiles(); + if (count($paths) === 1) { + $commonPath = dirname($paths[0]) . DIRECTORY_SEPARATOR; + $coverage->renameFile($paths[0], basename($paths[0])); + return $commonPath; + } + $max = count($paths); + for ($i = 0; $i < $max; $i++) { + // strip phar:// prefixes + if (strpos($paths[$i], 'phar://') === 0) { + $paths[$i] = substr($paths[$i], 7); + $paths[$i] = str_replace('/', DIRECTORY_SEPARATOR, $paths[$i]); + } + $paths[$i] = explode(DIRECTORY_SEPARATOR, $paths[$i]); + if (empty($paths[$i][0])) { + $paths[$i][0] = DIRECTORY_SEPARATOR; + } + } + $done = \false; + $max = count($paths); + while (!$done) { + for ($i = 0; $i < $max - 1; $i++) { + if (!isset($paths[$i][0]) || !isset($paths[$i + 1][0]) || $paths[$i][0] !== $paths[$i + 1][0]) { + $done = \true; + break; + } + } + if (!$done) { + $commonPath .= $paths[0][0]; + if ($paths[0][0] !== DIRECTORY_SEPARATOR) { + $commonPath .= DIRECTORY_SEPARATOR; + } + for ($i = 0; $i < $max; $i++) { + array_shift($paths[$i]); + } + } + } + $original = $coverage->coveredFiles(); + $max = count($original); + for ($i = 0; $i < $max; $i++) { + $coverage->renameFile($original[$i], implode(DIRECTORY_SEPARATOR, $paths[$i])); + } + return substr($commonPath, 0, -1); + } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Node; + +use function sprintf; +/** + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + */ +final class CrapIndex +{ + /** + * @var int + */ + private $cyclomaticComplexity; + /** + * @var float + */ + private $codeCoverage; + public function __construct(int $cyclomaticComplexity, float $codeCoverage) + { + $this->cyclomaticComplexity = $cyclomaticComplexity; + $this->codeCoverage = $codeCoverage; + } + public function asString() : string + { + if ($this->codeCoverage === 0.0) { + return (string) ($this->cyclomaticComplexity ** 2 + $this->cyclomaticComplexity); + } + if ($this->codeCoverage >= 95) { + return (string) $this->cyclomaticComplexity; + } + return sprintf('%01.2F', $this->cyclomaticComplexity ** 2 * (1 - $this->codeCoverage / 100) ** 3 + $this->cyclomaticComplexity); + } +} + * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\DocBlock; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Node; -use InvalidArgumentException; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Author; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Covers; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Deprecated; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Generic; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\InvalidTag; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Link as LinkTag; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Method; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Param; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Property; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\PropertyRead; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Return_; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\See as SeeTag; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Since; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Source; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Throws; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Uses; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Var_; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Version; -use PHPUnit\phpDocumentor\Reflection\FqsenResolver; -use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; -use ReflectionMethod; -use ReflectionNamedType; -use ReflectionParameter; -use PHPUnit\Webmozart\Assert\Assert; use function array_merge; -use function array_slice; -use function call_user_func_array; use function count; -use function get_class; -use function preg_match; -use function strpos; -use function trim; +use IteratorAggregate; +use RecursiveIteratorIterator; /** - * Creates a Tag object given the contents of a tag. - * - * This Factory is capable of determining the appropriate class for a tag and instantiate it using its `create` - * factory method. The `create` factory method of a Tag can have a variable number of arguments; this way you can - * pass the dependencies that you need to construct a tag object. - * - * > Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise - * > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to - * > verify that a dependency is actually passed. - * - * This Factory also features a Service Locator component that is used to pass the right dependencies to the - * `create` method of a tag; each dependency should be registered as a service or as a parameter. - * - * When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass - * the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface. + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class StandardTagFactory implements TagFactory +final class Directory extends AbstractNode implements IteratorAggregate { - /** PCRE regular expression matching a tag name. */ - public const REGEX_TAGNAME = '[\\w\\-\\_\\\\:]+'; /** - * @var array> An array with a tag as a key, and an - * FQCN to a class that handles it as an array value. + * @var AbstractNode[] */ - private $tagHandlerMappings = [ - 'author' => Author::class, - 'covers' => Covers::class, - 'deprecated' => Deprecated::class, - // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example', - 'link' => LinkTag::class, - 'method' => Method::class, - 'param' => Param::class, - 'property-read' => PropertyRead::class, - 'property' => Property::class, - 'property-write' => PropertyWrite::class, - 'return' => Return_::class, - 'see' => SeeTag::class, - 'since' => Since::class, - 'source' => Source::class, - 'throw' => Throws::class, - 'throws' => Throws::class, - 'uses' => Uses::class, - 'var' => Var_::class, - 'version' => Version::class, - ]; + private $children = []; /** - * @var array> An array with a anotation s a key, and an - * FQCN to a class that handles it as an array value. + * @var Directory[] */ - private $annotationMappings = []; + private $directories = []; /** - * @var ReflectionParameter[][] a lazy-loading cache containing parameters - * for each tagHandler that has been used. + * @var File[] */ - private $tagHandlerParameterCache = []; - /** @var FqsenResolver */ - private $fqsenResolver; + private $files = []; /** - * @var mixed[] an array representing a simple Service Locator where we can store parameters and - * services that can be inserted into the Factory Methods of Tag Handlers. + * @var array */ - private $serviceLocator = []; + private $classes; /** - * Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers. - * - * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property - * is used. - * - * @see self::registerTagHandler() to add a new tag handler to the existing default list. - * - * @param array> $tagHandlers + * @var array */ - public function __construct(FqsenResolver $fqsenResolver, ?array $tagHandlers = null) + private $traits; + /** + * @var array + */ + private $functions; + /** + * @psalm-var null|array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} + */ + private $linesOfCode; + /** + * @var int + */ + private $numFiles = -1; + /** + * @var int + */ + private $numExecutableLines = -1; + /** + * @var int + */ + private $numExecutedLines = -1; + /** + * @var int + */ + private $numExecutableBranches = -1; + /** + * @var int + */ + private $numExecutedBranches = -1; + /** + * @var int + */ + private $numExecutablePaths = -1; + /** + * @var int + */ + private $numExecutedPaths = -1; + /** + * @var int + */ + private $numClasses = -1; + /** + * @var int + */ + private $numTestedClasses = -1; + /** + * @var int + */ + private $numTraits = -1; + /** + * @var int + */ + private $numTestedTraits = -1; + /** + * @var int + */ + private $numMethods = -1; + /** + * @var int + */ + private $numTestedMethods = -1; + /** + * @var int + */ + private $numFunctions = -1; + /** + * @var int + */ + private $numTestedFunctions = -1; + public function count() : int { - $this->fqsenResolver = $fqsenResolver; - if ($tagHandlers !== null) { - $this->tagHandlerMappings = $tagHandlers; + if ($this->numFiles === -1) { + $this->numFiles = 0; + foreach ($this->children as $child) { + $this->numFiles += count($child); + } } - $this->addService($fqsenResolver, FqsenResolver::class); + return $this->numFiles; } - public function create(string $tagLine, ?TypeContext $context = null) : Tag + public function getIterator() : RecursiveIteratorIterator { - if (!$context) { - $context = new TypeContext(''); - } - [$tagName, $tagBody] = $this->extractTagParts($tagLine); - return $this->createTag(trim($tagBody), $tagName, $context); + return new RecursiveIteratorIterator(new Iterator($this), RecursiveIteratorIterator::SELF_FIRST); } - /** - * @param mixed $value - */ - public function addParameter(string $name, $value) : void + public function addDirectory(string $name) : self { - $this->serviceLocator[$name] = $value; + $directory = new self($name, $this); + $this->children[] = $directory; + $this->directories[] =& $this->children[count($this->children) - 1]; + return $directory; } - public function addService(object $service, ?string $alias = null) : void + public function addFile(File $file) : void { - $this->serviceLocator[$alias ?: get_class($service)] = $service; + $this->children[] = $file; + $this->files[] =& $this->children[count($this->children) - 1]; + $this->numExecutableLines = -1; + $this->numExecutedLines = -1; } - public function registerTagHandler(string $tagName, string $handler) : void + public function directories() : array { - Assert::stringNotEmpty($tagName); - Assert::classExists($handler); - Assert::implementsInterface($handler, Tag::class); - if (strpos($tagName, '\\') && $tagName[0] !== '\\') { - throw new InvalidArgumentException('A namespaced tag must have a leading backslash as it must be fully qualified'); + return $this->directories; + } + public function files() : array + { + return $this->files; + } + public function children() : array + { + return $this->children; + } + public function classes() : array + { + if ($this->classes === null) { + $this->classes = []; + foreach ($this->children as $child) { + $this->classes = array_merge($this->classes, $child->classes()); + } } - $this->tagHandlerMappings[$tagName] = $handler; + return $this->classes; } - /** - * Extracts all components for a tag. - * - * @return string[] - */ - private function extractTagParts(string $tagLine) : array + public function traits() : array { - $matches = []; - if (!preg_match('/^@(' . self::REGEX_TAGNAME . ')((?:[\\s\\(\\{])\\s*([^\\s].*)|$)/us', $tagLine, $matches)) { - throw new InvalidArgumentException('The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors'); + if ($this->traits === null) { + $this->traits = []; + foreach ($this->children as $child) { + $this->traits = array_merge($this->traits, $child->traits()); + } } - if (count($matches) < 3) { - $matches[] = ''; + return $this->traits; + } + public function functions() : array + { + if ($this->functions === null) { + $this->functions = []; + foreach ($this->children as $child) { + $this->functions = array_merge($this->functions, $child->functions()); + } } - return array_slice($matches, 1); + return $this->functions; } /** - * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the - * body was invalid. + * @psalm-return array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} */ - private function createTag(string $body, string $name, TypeContext $context) : Tag + public function linesOfCode() : array { - $handlerClassName = $this->findHandlerClassName($name, $context); - $arguments = $this->getArgumentsForParametersFromWiring($this->fetchParametersForHandlerFactoryMethod($handlerClassName), $this->getServiceLocatorWithDynamicParameters($context, $name, $body)); - try { - $callable = [$handlerClassName, 'create']; - Assert::isCallable($callable); - /** @phpstan-var callable(string): ?Tag $callable */ - $tag = call_user_func_array($callable, $arguments); - return $tag ?? InvalidTag::create($body, $name); - } catch (InvalidArgumentException $e) { - return InvalidTag::create($body, $name)->withError($e); + if ($this->linesOfCode === null) { + $this->linesOfCode = ['linesOfCode' => 0, 'commentLinesOfCode' => 0, 'nonCommentLinesOfCode' => 0]; + foreach ($this->children as $child) { + $childLinesOfCode = $child->linesOfCode(); + $this->linesOfCode['linesOfCode'] += $childLinesOfCode['linesOfCode']; + $this->linesOfCode['commentLinesOfCode'] += $childLinesOfCode['commentLinesOfCode']; + $this->linesOfCode['nonCommentLinesOfCode'] += $childLinesOfCode['nonCommentLinesOfCode']; + } } + return $this->linesOfCode; } - /** - * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`). - * - * @return class-string - */ - private function findHandlerClassName(string $tagName, TypeContext $context) : string + public function numberOfExecutableLines() : int { - $handlerClassName = Generic::class; - if (isset($this->tagHandlerMappings[$tagName])) { - $handlerClassName = $this->tagHandlerMappings[$tagName]; - } elseif ($this->isAnnotation($tagName)) { - // TODO: Annotation support is planned for a later stage and as such is disabled for now - $tagName = (string) $this->fqsenResolver->resolve($tagName, $context); - if (isset($this->annotationMappings[$tagName])) { - $handlerClassName = $this->annotationMappings[$tagName]; + if ($this->numExecutableLines === -1) { + $this->numExecutableLines = 0; + foreach ($this->children as $child) { + $this->numExecutableLines += $child->numberOfExecutableLines(); } } - return $handlerClassName; + return $this->numExecutableLines; } - /** - * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters. - * - * @param ReflectionParameter[] $parameters - * @param mixed[] $locator - * - * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters - * is provided with this method. - */ - private function getArgumentsForParametersFromWiring(array $parameters, array $locator) : array + public function numberOfExecutedLines() : int { - $arguments = []; - foreach ($parameters as $parameter) { - $type = $parameter->getType(); - $typeHint = null; - if ($type instanceof ReflectionNamedType) { - $typeHint = $type->getName(); - if ($typeHint === 'self') { - $declaringClass = $parameter->getDeclaringClass(); - if ($declaringClass !== null) { - $typeHint = $declaringClass->getName(); - } - } + if ($this->numExecutedLines === -1) { + $this->numExecutedLines = 0; + foreach ($this->children as $child) { + $this->numExecutedLines += $child->numberOfExecutedLines(); } - if (isset($locator[$typeHint])) { - $arguments[] = $locator[$typeHint]; - continue; + } + return $this->numExecutedLines; + } + public function numberOfExecutableBranches() : int + { + if ($this->numExecutableBranches === -1) { + $this->numExecutableBranches = 0; + foreach ($this->children as $child) { + $this->numExecutableBranches += $child->numberOfExecutableBranches(); } - $parameterName = $parameter->getName(); - if (isset($locator[$parameterName])) { - $arguments[] = $locator[$parameterName]; - continue; + } + return $this->numExecutableBranches; + } + public function numberOfExecutedBranches() : int + { + if ($this->numExecutedBranches === -1) { + $this->numExecutedBranches = 0; + foreach ($this->children as $child) { + $this->numExecutedBranches += $child->numberOfExecutedBranches(); } - $arguments[] = null; } - return $arguments; + return $this->numExecutedBranches; } - /** - * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given - * tag handler class name. - * - * @param class-string $handlerClassName - * - * @return ReflectionParameter[] - */ - private function fetchParametersForHandlerFactoryMethod(string $handlerClassName) : array + public function numberOfExecutablePaths() : int { - if (!isset($this->tagHandlerParameterCache[$handlerClassName])) { - $methodReflection = new ReflectionMethod($handlerClassName, 'create'); - $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters(); + if ($this->numExecutablePaths === -1) { + $this->numExecutablePaths = 0; + foreach ($this->children as $child) { + $this->numExecutablePaths += $child->numberOfExecutablePaths(); + } } - return $this->tagHandlerParameterCache[$handlerClassName]; + return $this->numExecutablePaths; } - /** - * Returns a copy of this class' Service Locator with added dynamic parameters, - * such as the tag's name, body and Context. - * - * @param TypeContext $context The Context (namespace and aliasses) that may be - * passed and is used to resolve FQSENs. - * @param string $tagName The name of the tag that may be - * passed onto the factory method of the Tag class. - * @param string $tagBody The body of the tag that may be - * passed onto the factory method of the Tag class. - * - * @return mixed[] - */ - private function getServiceLocatorWithDynamicParameters(TypeContext $context, string $tagName, string $tagBody) : array + public function numberOfExecutedPaths() : int { - return array_merge($this->serviceLocator, ['name' => $tagName, 'body' => $tagBody, TypeContext::class => $context]); + if ($this->numExecutedPaths === -1) { + $this->numExecutedPaths = 0; + foreach ($this->children as $child) { + $this->numExecutedPaths += $child->numberOfExecutedPaths(); + } + } + return $this->numExecutedPaths; } - /** - * Returns whether the given tag belongs to an annotation. - * - * @todo this method should be populated once we implement Annotation notation support. - */ - private function isAnnotation(string $tagContent) : bool + public function numberOfClasses() : int { - // 1. Contains a namespace separator - // 2. Contains parenthesis - // 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part - // of the annotation class name matches the found tag name - return \false; + if ($this->numClasses === -1) { + $this->numClasses = 0; + foreach ($this->children as $child) { + $this->numClasses += $child->numberOfClasses(); + } + } + return $this->numClasses; } -} -indent = $indent; - $this->indentString = $indentString; - $this->isFirstLineIndented = $indentFirstLine; - $this->lineLength = $lineLength; - $this->tagFormatter = $tagFormatter ?: new PassthroughFormatter(); + if ($this->numTestedClasses === -1) { + $this->numTestedClasses = 0; + foreach ($this->children as $child) { + $this->numTestedClasses += $child->numberOfTestedClasses(); + } + } + return $this->numTestedClasses; } - /** - * Generate a DocBlock comment. - * - * @param DocBlock $docblock The DocBlock to serialize. - * - * @return string The serialized doc block. - */ - public function getDocComment(DocBlock $docblock) : string + public function numberOfTraits() : int { - $indent = str_repeat($this->indentString, $this->indent); - $firstIndent = $this->isFirstLineIndented ? $indent : ''; - // 3 === strlen(' * ') - $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null; - $text = $this->removeTrailingSpaces($indent, $this->addAsterisksForEachLine($indent, $this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength))); - $comment = $firstIndent . "/**\n"; - if ($text) { - $comment .= $indent . ' * ' . $text . "\n"; - $comment .= $indent . " *\n"; + if ($this->numTraits === -1) { + $this->numTraits = 0; + foreach ($this->children as $child) { + $this->numTraits += $child->numberOfTraits(); + } + } + return $this->numTraits; + } + public function numberOfTestedTraits() : int + { + if ($this->numTestedTraits === -1) { + $this->numTestedTraits = 0; + foreach ($this->children as $child) { + $this->numTestedTraits += $child->numberOfTestedTraits(); + } } - $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment); - return $comment . $indent . ' */'; + return $this->numTestedTraits; } - private function removeTrailingSpaces(string $indent, string $text) : string + public function numberOfMethods() : int { - return str_replace(sprintf("\n%s * \n", $indent), sprintf("\n%s *\n", $indent), $text); + if ($this->numMethods === -1) { + $this->numMethods = 0; + foreach ($this->children as $child) { + $this->numMethods += $child->numberOfMethods(); + } + } + return $this->numMethods; } - private function addAsterisksForEachLine(string $indent, string $text) : string + public function numberOfTestedMethods() : int { - return str_replace("\n", sprintf("\n%s * ", $indent), $text); + if ($this->numTestedMethods === -1) { + $this->numTestedMethods = 0; + foreach ($this->children as $child) { + $this->numTestedMethods += $child->numberOfTestedMethods(); + } + } + return $this->numTestedMethods; } - private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, ?int $wrapLength) : string + public function numberOfFunctions() : int { - $text = $docblock->getSummary() . ((string) $docblock->getDescription() ? "\n\n" . $docblock->getDescription() : ''); - if ($wrapLength !== null) { - $text = wordwrap($text, $wrapLength); - return $text; + if ($this->numFunctions === -1) { + $this->numFunctions = 0; + foreach ($this->children as $child) { + $this->numFunctions += $child->numberOfFunctions(); + } } - return $text; + return $this->numFunctions; } - private function addTagBlock(DocBlock $docblock, ?int $wrapLength, string $indent, string $comment) : string + public function numberOfTestedFunctions() : int { - foreach ($docblock->getTags() as $tag) { - $tagText = $this->tagFormatter->format($tag); - if ($wrapLength !== null) { - $tagText = wordwrap($tagText, $wrapLength); + if ($this->numTestedFunctions === -1) { + $this->numTestedFunctions = 0; + foreach ($this->children as $child) { + $this->numTestedFunctions += $child->numberOfTestedFunctions(); } - $tagText = str_replace("\n", sprintf("\n%s * ", $indent), $tagText); - $comment .= sprintf("%s * %s\n", $indent, $tagText); } - return $comment; + return $this->numTestedFunctions; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\DocBlock; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Node; -use InvalidArgumentException; -use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; -interface TagFactory +use function array_filter; +use function count; +use function range; +/** + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + */ +final class File extends AbstractNode { /** - * Adds a parameter to the service locator that can be injected in a tag's factory method. - * - * When calling a tag's "create" method we always check the signature for dependencies to inject. One way is to - * typehint a parameter in the signature so that we can use that interface or class name to inject a dependency - * (see {@see addService()} for more information on that). - * - * Another way is to check the name of the argument against the names in the Service Locator. With this method - * you can add a variable that will be inserted when a tag's create method is not typehinted and has a matching - * name. - * - * Be aware that there are two reserved names: - * - * - name, representing the name of the tag. - * - body, representing the complete body of the tag. - * - * These parameters are injected at the last moment and will override any existing parameter with those names. - * - * @param mixed $value + * @var array */ - public function addParameter(string $name, $value) : void; + private $lineCoverageData; /** - * Factory method responsible for instantiating the correct sub type. - * - * @param string $tagLine The text for this tag, including description. - * - * @return Tag A new tag object. - * - * @throws InvalidArgumentException If an invalid tag line was presented. + * @var array */ - public function create(string $tagLine, ?TypeContext $context = null) : Tag; + private $functionCoverageData; /** - * Registers a service with the Service Locator using the FQCN of the class or the alias, if provided. - * - * When calling a tag's "create" method we always check the signature for dependencies to inject. If a parameter - * has a typehint then the ServiceLocator is queried to see if a Service is registered for that typehint. - * - * Because interfaces are regularly used as type-hints this method provides an alias parameter; if the FQCN of the - * interface is passed as alias then every time that interface is requested the provided service will be returned. + * @var array */ - public function addService(object $service) : void; + private $testData; /** - * Registers a handler for tags. - * - * If you want to use your own tags then you can use this method to instruct the TagFactory - * to register the name of a tag with the FQCN of a 'Tag Handler'. The Tag handler should implement - * the {@see Tag} interface (and thus the create method). - * - * @param string $tagName Name of tag to register a handler for. When registering a namespaced - * tag, the full name, along with a prefixing slash MUST be provided. - * @param class-string $handler FQCN of handler. - * - * @throws InvalidArgumentException If the tag name is not a string. - * @throws InvalidArgumentException If the tag name is namespaced (contains backslashes) but - * does not start with a backslash. - * @throws InvalidArgumentException If the handler is not a string. - * @throws InvalidArgumentException If the handler is not an existing class. - * @throws InvalidArgumentException If the handler does not implement the {@see Tag} interface. + * @var int */ - public function registerTagHandler(string $tagName, string $handler) : void; -} -refers = $refers; - $this->description = $description; - } - public static function create(string $body, ?FqsenResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::notNull($descriptionFactory); - $parts = Utils::pregSplit('/\\s+/Su', $body, 2); - $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; - // https://tools.ietf.org/html/rfc2396#section-3 - if (preg_match('/\\w:\\/\\/\\w/i', $parts[0])) { - return new static(new Url($parts[0]), $description); - } - return new static(new FqsenRef(self::resolveFqsen($parts[0], $typeResolver, $context)), $description); - } - private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen - { - Assert::notNull($fqsenResolver); - $fqsenParts = explode('::', $parts); - $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); - if (!array_key_exists(1, $fqsenParts)) { - return $resolved; - } - return new Fqsen($resolved . '::' . $fqsenParts[1]); - } + private $numExecutedLines = 0; /** - * Returns the ref of this tag. + * @var int */ - public function getReference() : Reference - { - return $this->refers; - } + private $numExecutableBranches = 0; /** - * Returns a string representation of this tag. + * @var int */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $refers = (string) $this->refers; - return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); - } -} -validateTagName($name); - $this->name = $name; - $this->description = $description; - } + private $numExecutablePaths = 0; /** - * Creates a new tag that represents any unknown tag type. - * - * @return static + * @var int */ - public static function create(string $body, string $name = '', ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::stringNotEmpty($name); - Assert::notNull($descriptionFactory); - $description = $body !== '' ? $descriptionFactory->create($body, $context) : null; - return new static($name, $description); - } + private $numExecutedPaths = 0; /** - * Returns the tag as a serialized string + * @var array */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - return $description; - } + private $classes = []; /** - * Validates if the tag name matches the expected format, otherwise throws an exception. + * @var array */ - private function validateTagName(string $name) : void + private $traits = []; + /** + * @var array + */ + private $functions = []; + /** + * @psalm-var array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} + */ + private $linesOfCode; + /** + * @var int + */ + private $numClasses; + /** + * @var int + */ + private $numTestedClasses = 0; + /** + * @var int + */ + private $numTraits; + /** + * @var int + */ + private $numTestedTraits = 0; + /** + * @var int + */ + private $numMethods; + /** + * @var int + */ + private $numTestedMethods; + /** + * @var int + */ + private $numTestedFunctions; + /** + * @var array + */ + private $codeUnitsByLine = []; + /** + * @psalm-param array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} $linesOfCode + */ + public function __construct(string $name, AbstractNode $parent, array $lineCoverageData, array $functionCoverageData, array $testData, array $classes, array $traits, array $functions, array $linesOfCode) { - if (!preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { - throw new InvalidArgumentException('The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, ' . 'hyphens and backslashes.'); - } + parent::__construct($name, $parent); + $this->lineCoverageData = $lineCoverageData; + $this->functionCoverageData = $functionCoverageData; + $this->testData = $testData; + $this->linesOfCode = $linesOfCode; + $this->calculateStatistics($classes, $traits, $functions); } -} -name = $name; - $this->body = $body; + return 1; } - public function getException() : ?Throwable + public function lineCoverageData() : array { - return $this->throwable; + return $this->lineCoverageData; } - public function getName() : string + public function functionCoverageData() : array { - return $this->name; + return $this->functionCoverageData; } - public static function create(string $body, string $name = '') : self + public function testData() : array { - return new self($name, $body); + return $this->testData; } - public function withError(Throwable $exception) : self + public function classes() : array { - $this->flattenExceptionBacktrace($exception); - $tag = new self($this->name, $this->body); - $tag->throwable = $exception; - return $tag; + return $this->classes; } - /** - * Removes all complex types from backtrace - * - * Not all objects are serializable. So we need to remove them from the - * stored exception to be sure that we do not break existing library usage. - */ - private function flattenExceptionBacktrace(Throwable $exception) : void + public function traits() : array { - $traceProperty = (new ReflectionClass(Exception::class))->getProperty('trace'); - $traceProperty->setAccessible(\true); - do { - $trace = $exception->getTrace(); - if (isset($trace[0]['args'])) { - $trace = array_map(function (array $call) : array { - $call['args'] = array_map([$this, 'flattenArguments'], $call['args']); - return $call; - }, $trace); - } - $traceProperty->setValue($exception, $trace); - $exception = $exception->getPrevious(); - } while ($exception !== null); - $traceProperty->setAccessible(\false); + return $this->traits; } - /** - * @param mixed $value - * - * @return mixed - * - * @throws ReflectionException - */ - private function flattenArguments($value) + public function functions() : array { - if ($value instanceof Closure) { - $closureReflection = new ReflectionFunction($value); - $value = sprintf('(Closure at %s:%s)', $closureReflection->getFileName(), $closureReflection->getStartLine()); - } elseif (is_object($value)) { - $value = sprintf('object(%s)', get_class($value)); - } elseif (is_resource($value)) { - $value = sprintf('resource(%s)', get_resource_type($value)); - } elseif (is_array($value)) { - $value = array_map([$this, 'flattenArguments'], $value); - } - return $value; + return $this->functions; } - public function render(?Formatter $formatter = null) : string + /** + * @psalm-return array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} + */ + public function linesOfCode() : array { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - return $formatter->format($this); + return $this->linesOfCode; } - public function __toString() : string + public function numberOfExecutableLines() : int { - return $this->body; + return $this->numExecutableLines; } -} -startingLine = (int) $startingLine; - $this->lineCount = $lineCount !== null ? (int) $lineCount : null; - $this->description = $description; + return $this->numExecutedLines; } - public static function create(string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self + public function numberOfExecutableBranches() : int { - Assert::stringNotEmpty($body); - Assert::notNull($descriptionFactory); - $startingLine = 1; - $lineCount = null; - $description = null; - // Starting line / Number of lines / Description - if (preg_match('/^([1-9]\\d*)\\s*(?:((?1))\\s+)?(.*)$/sux', $body, $matches)) { - $startingLine = (int) $matches[1]; - if (isset($matches[2]) && $matches[2] !== '') { - $lineCount = (int) $matches[2]; - } - $description = $matches[3]; - } - return new static($startingLine, $lineCount, $descriptionFactory->create($description ?? '', $context)); + return $this->numExecutableBranches; } - /** - * Gets the starting line. - * - * @return int The starting line, relative to the structural element's - * location. - */ - public function getStartingLine() : int + public function numberOfExecutedBranches() : int { - return $this->startingLine; + return $this->numExecutedBranches; } - /** - * Returns the number of lines. - * - * @return int|null The number of lines, relative to the starting line. NULL - * means "to the end". - */ - public function getLineCount() : ?int + public function numberOfExecutablePaths() : int { - return $this->lineCount; + return $this->numExecutablePaths; } - public function __toString() : string + public function numberOfExecutedPaths() : int { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - $startingLine = (string) $this->startingLine; - $lineCount = $this->lineCount !== null ? '' . $this->lineCount : ''; - return $startingLine . ($lineCount !== '' ? ($startingLine || $startingLine === '0' ? ' ' : '') . $lineCount : '') . ($description !== '' ? ($startingLine || $startingLine === '0' || $lineCount !== '' ? ' ' : '') . $description : ''); + return $this->numExecutedPaths; } -} - - * @var array> - */ - private $arguments; - /** @var bool */ - private $isStatic; - /** @var Type */ - private $returnType; - /** - * @param array> $arguments - * - * @phpstan-param array $arguments - */ - public function __construct(string $methodName, array $arguments = [], ?Type $returnType = null, bool $static = \false, ?Description $description = null) + public function numberOfClasses() : int { - Assert::stringNotEmpty($methodName); - if ($returnType === null) { - $returnType = new Void_(); + if ($this->numClasses === null) { + $this->numClasses = 0; + foreach ($this->classes as $class) { + foreach ($class['methods'] as $method) { + if ($method['executableLines'] > 0) { + $this->numClasses++; + continue 2; + } + } + } } - $this->methodName = $methodName; - $this->arguments = $this->filterArguments($arguments); - $this->returnType = $returnType; - $this->isStatic = $static; - $this->description = $description; + return $this->numClasses; } - public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : ?self + public function numberOfTestedClasses() : int { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - // 1. none or more whitespace - // 2. optionally the keyword "static" followed by whitespace - // 3. optionally a word with underscores followed by whitespace : as - // type for the return value - // 4. then optionally a word with underscores followed by () and - // whitespace : as method name as used by phpDocumentor - // 5. then a word with underscores, followed by ( and any character - // until a ) and whitespace : as method name with signature - // 6. any remaining text : as description - if (!preg_match('/^ - # Static keyword - # Declares a static method ONLY if type is also present - (?: - (static) - \\s+ - )? - # Return type - (?: - ( - (?:[\\w\\|_\\\\]*\\$this[\\w\\|_\\\\]*) - | - (?: - (?:[\\w\\|_\\\\]+) - # array notation - (?:\\[\\])* - )*+ - ) - \\s+ - )? - # Method name - ([\\w_]+) - # Arguments - (?: - \\(([^\\)]*)\\) - )? - \\s* - # Description - (.*) - $/sux', $body, $matches)) { - return null; - } - [, $static, $returnType, $methodName, $argumentLines, $description] = $matches; - $static = $static === 'static'; - if ($returnType === '') { - $returnType = 'void'; - } - $returnType = $typeResolver->resolve($returnType, $context); - $description = $descriptionFactory->create($description, $context); - /** @phpstan-var array $arguments */ - $arguments = []; - if ($argumentLines !== '') { - $argumentsExploded = explode(',', $argumentLines); - foreach ($argumentsExploded as $argument) { - $argument = explode(' ', self::stripRestArg(trim($argument)), 2); - if (strpos($argument[0], '$') === 0) { - $argumentName = substr($argument[0], 1); - $argumentType = new Mixed_(); - } else { - $argumentType = $typeResolver->resolve($argument[0], $context); - $argumentName = ''; - if (isset($argument[1])) { - $argument[1] = self::stripRestArg($argument[1]); - $argumentName = substr($argument[1], 1); + return $this->numTestedClasses; + } + public function numberOfTraits() : int + { + if ($this->numTraits === null) { + $this->numTraits = 0; + foreach ($this->traits as $trait) { + foreach ($trait['methods'] as $method) { + if ($method['executableLines'] > 0) { + $this->numTraits++; + continue 2; } } - $arguments[] = ['name' => $argumentName, 'type' => $argumentType]; } } - return new static($methodName, $arguments, $returnType, $static, $description); + return $this->numTraits; } - /** - * Retrieves the method name. - */ - public function getMethodName() : string + public function numberOfTestedTraits() : int { - return $this->methodName; + return $this->numTestedTraits; } - /** - * @return array> - * - * @phpstan-return array - */ - public function getArguments() : array + public function numberOfMethods() : int { - return $this->arguments; + if ($this->numMethods === null) { + $this->numMethods = 0; + foreach ($this->classes as $class) { + foreach ($class['methods'] as $method) { + if ($method['executableLines'] > 0) { + $this->numMethods++; + } + } + } + foreach ($this->traits as $trait) { + foreach ($trait['methods'] as $method) { + if ($method['executableLines'] > 0) { + $this->numMethods++; + } + } + } + } + return $this->numMethods; } - /** - * Checks whether the method tag describes a static method or not. - * - * @return bool TRUE if the method declaration is for a static method, FALSE otherwise. - */ - public function isStatic() : bool + public function numberOfTestedMethods() : int { - return $this->isStatic; + if ($this->numTestedMethods === null) { + $this->numTestedMethods = 0; + foreach ($this->classes as $class) { + foreach ($class['methods'] as $method) { + if ($method['executableLines'] > 0 && $method['coverage'] === 100) { + $this->numTestedMethods++; + } + } + } + foreach ($this->traits as $trait) { + foreach ($trait['methods'] as $method) { + if ($method['executableLines'] > 0 && $method['coverage'] === 100) { + $this->numTestedMethods++; + } + } + } + } + return $this->numTestedMethods; } - public function getReturnType() : Type + public function numberOfFunctions() : int { - return $this->returnType; + return count($this->functions); } - public function __toString() : string + public function numberOfTestedFunctions() : int { - $arguments = []; - foreach ($this->arguments as $argument) { - $arguments[] = $argument['type'] . ' $' . $argument['name']; - } - $argumentStr = '(' . implode(', ', $arguments) . ')'; - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; + if ($this->numTestedFunctions === null) { + $this->numTestedFunctions = 0; + foreach ($this->functions as $function) { + if ($function['executableLines'] > 0 && $function['coverage'] === 100) { + $this->numTestedFunctions++; + } + } } - $static = $this->isStatic ? 'static' : ''; - $returnType = (string) $this->returnType; - $methodName = (string) $this->methodName; - return $static . ($returnType !== '' ? ($static !== '' ? ' ' : '') . $returnType : '') . ($methodName !== '' ? ($static !== '' || $returnType !== '' ? ' ' : '') . $methodName : '') . $argumentStr . ($description !== '' ? ' ' . $description : ''); + return $this->numTestedFunctions; } - /** - * @param mixed[][]|string[] $arguments - * - * @return mixed[][] - * - * @phpstan-param array $arguments - * @phpstan-return array - */ - private function filterArguments(array $arguments = []) : array + private function calculateStatistics(array $classes, array $traits, array $functions) : void { - $result = []; - foreach ($arguments as $argument) { - if (is_string($argument)) { - $argument = ['name' => $argument]; + foreach (range(1, $this->linesOfCode['linesOfCode']) as $lineNumber) { + $this->codeUnitsByLine[$lineNumber] = []; + } + $this->processClasses($classes); + $this->processTraits($traits); + $this->processFunctions($functions); + foreach (range(1, $this->linesOfCode['linesOfCode']) as $lineNumber) { + if (isset($this->lineCoverageData[$lineNumber])) { + foreach ($this->codeUnitsByLine[$lineNumber] as &$codeUnit) { + $codeUnit['executableLines']++; + } + unset($codeUnit); + $this->numExecutableLines++; + if (count($this->lineCoverageData[$lineNumber]) > 0) { + foreach ($this->codeUnitsByLine[$lineNumber] as &$codeUnit) { + $codeUnit['executedLines']++; + } + unset($codeUnit); + $this->numExecutedLines++; + } } - if (!isset($argument['type'])) { - $argument['type'] = new Mixed_(); + } + foreach ($this->traits as &$trait) { + foreach ($trait['methods'] as &$method) { + $methodLineCoverage = $method['executableLines'] ? $method['executedLines'] / $method['executableLines'] * 100 : 100; + $methodBranchCoverage = $method['executableBranches'] ? $method['executedBranches'] / $method['executableBranches'] * 100 : 0; + $methodPathCoverage = $method['executablePaths'] ? $method['executedPaths'] / $method['executablePaths'] * 100 : 0; + $method['coverage'] = $methodBranchCoverage ?: $methodLineCoverage; + $method['crap'] = (new CrapIndex($method['ccn'], $methodPathCoverage ?: $methodLineCoverage))->asString(); + $trait['ccn'] += $method['ccn']; } - $keys = array_keys($argument); - sort($keys); - if ($keys !== ['name', 'type']) { - throw new InvalidArgumentException('Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, \true)); + unset($method); + $traitLineCoverage = $trait['executableLines'] ? $trait['executedLines'] / $trait['executableLines'] * 100 : 100; + $traitBranchCoverage = $trait['executableBranches'] ? $trait['executedBranches'] / $trait['executableBranches'] * 100 : 0; + $traitPathCoverage = $trait['executablePaths'] ? $trait['executedPaths'] / $trait['executablePaths'] * 100 : 0; + $trait['coverage'] = $traitBranchCoverage ?: $traitLineCoverage; + $trait['crap'] = (new CrapIndex($trait['ccn'], $traitPathCoverage ?: $traitLineCoverage))->asString(); + if ($trait['executableLines'] > 0 && $trait['coverage'] === 100) { + $this->numTestedClasses++; } - $result[] = $argument; } - return $result; - } - private static function stripRestArg(string $argument) : string - { - if (strpos($argument, '...') === 0) { - $argument = trim(substr($argument, 3)); + unset($trait); + foreach ($this->classes as &$class) { + foreach ($class['methods'] as &$method) { + $methodLineCoverage = $method['executableLines'] ? $method['executedLines'] / $method['executableLines'] * 100 : 100; + $methodBranchCoverage = $method['executableBranches'] ? $method['executedBranches'] / $method['executableBranches'] * 100 : 0; + $methodPathCoverage = $method['executablePaths'] ? $method['executedPaths'] / $method['executablePaths'] * 100 : 0; + $method['coverage'] = $methodBranchCoverage ?: $methodLineCoverage; + $method['crap'] = (new CrapIndex($method['ccn'], $methodPathCoverage ?: $methodLineCoverage))->asString(); + $class['ccn'] += $method['ccn']; + } + unset($method); + $classLineCoverage = $class['executableLines'] ? $class['executedLines'] / $class['executableLines'] * 100 : 100; + $classBranchCoverage = $class['executableBranches'] ? $class['executedBranches'] / $class['executableBranches'] * 100 : 0; + $classPathCoverage = $class['executablePaths'] ? $class['executedPaths'] / $class['executablePaths'] * 100 : 0; + $class['coverage'] = $classBranchCoverage ?: $classLineCoverage; + $class['crap'] = (new CrapIndex($class['ccn'], $classPathCoverage ?: $classLineCoverage))->asString(); + if ($class['executableLines'] > 0 && $class['coverage'] === 100) { + $this->numTestedClasses++; + } + } + unset($class); + foreach ($this->functions as &$function) { + $functionLineCoverage = $function['executableLines'] ? $function['executedLines'] / $function['executableLines'] * 100 : 100; + $functionBranchCoverage = $function['executableBranches'] ? $function['executedBranches'] / $function['executableBranches'] * 100 : 0; + $functionPathCoverage = $function['executablePaths'] ? $function['executedPaths'] / $function['executablePaths'] * 100 : 0; + $function['coverage'] = $functionBranchCoverage ?: $functionLineCoverage; + $function['crap'] = (new CrapIndex($function['ccn'], $functionPathCoverage ?: $functionLineCoverage))->asString(); + if ($function['coverage'] === 100) { + $this->numTestedFunctions++; + } } - return $argument; } -} -uri = $uri; + $link = $this->id() . '.html#'; + foreach ($classes as $className => $class) { + $this->classes[$className] = ['className' => $className, 'namespace' => $class['namespace'], 'methods' => [], 'startLine' => $class['startLine'], 'executableLines' => 0, 'executedLines' => 0, 'executableBranches' => 0, 'executedBranches' => 0, 'executablePaths' => 0, 'executedPaths' => 0, 'ccn' => 0, 'coverage' => 0, 'crap' => 0, 'link' => $link . $class['startLine']]; + foreach ($class['methods'] as $methodName => $method) { + $methodData = $this->newMethod($className, $methodName, $method, $link); + $this->classes[$className]['methods'][$methodName] = $methodData; + $this->classes[$className]['executableBranches'] += $methodData['executableBranches']; + $this->classes[$className]['executedBranches'] += $methodData['executedBranches']; + $this->classes[$className]['executablePaths'] += $methodData['executablePaths']; + $this->classes[$className]['executedPaths'] += $methodData['executedPaths']; + $this->numExecutableBranches += $methodData['executableBranches']; + $this->numExecutedBranches += $methodData['executedBranches']; + $this->numExecutablePaths += $methodData['executablePaths']; + $this->numExecutedPaths += $methodData['executedPaths']; + foreach (range($method['startLine'], $method['endLine']) as $lineNumber) { + $this->codeUnitsByLine[$lineNumber] = [&$this->classes[$className], &$this->classes[$className]['methods'][$methodName]]; + } + } + } } - public function __toString() : string + private function processTraits(array $traits) : void { - return $this->uri; + $link = $this->id() . '.html#'; + foreach ($traits as $traitName => $trait) { + $this->traits[$traitName] = ['traitName' => $traitName, 'namespace' => $trait['namespace'], 'methods' => [], 'startLine' => $trait['startLine'], 'executableLines' => 0, 'executedLines' => 0, 'executableBranches' => 0, 'executedBranches' => 0, 'executablePaths' => 0, 'executedPaths' => 0, 'ccn' => 0, 'coverage' => 0, 'crap' => 0, 'link' => $link . $trait['startLine']]; + foreach ($trait['methods'] as $methodName => $method) { + $methodData = $this->newMethod($traitName, $methodName, $method, $link); + $this->traits[$traitName]['methods'][$methodName] = $methodData; + $this->traits[$traitName]['executableBranches'] += $methodData['executableBranches']; + $this->traits[$traitName]['executedBranches'] += $methodData['executedBranches']; + $this->traits[$traitName]['executablePaths'] += $methodData['executablePaths']; + $this->traits[$traitName]['executedPaths'] += $methodData['executedPaths']; + $this->numExecutableBranches += $methodData['executableBranches']; + $this->numExecutedBranches += $methodData['executedBranches']; + $this->numExecutablePaths += $methodData['executablePaths']; + $this->numExecutedPaths += $methodData['executedPaths']; + foreach (range($method['startLine'], $method['endLine']) as $lineNumber) { + $this->codeUnitsByLine[$lineNumber] = [&$this->traits[$traitName], &$this->traits[$traitName]['methods'][$methodName]]; + } + } + } } -} -fqsen = $fqsen; + $link = $this->id() . '.html#'; + foreach ($functions as $functionName => $function) { + $this->functions[$functionName] = ['functionName' => $functionName, 'namespace' => $function['namespace'], 'signature' => $function['signature'], 'startLine' => $function['startLine'], 'endLine' => $function['endLine'], 'executableLines' => 0, 'executedLines' => 0, 'executableBranches' => 0, 'executedBranches' => 0, 'executablePaths' => 0, 'executedPaths' => 0, 'ccn' => $function['ccn'], 'coverage' => 0, 'crap' => 0, 'link' => $link . $function['startLine']]; + foreach (range($function['startLine'], $function['endLine']) as $lineNumber) { + $this->codeUnitsByLine[$lineNumber] = [&$this->functions[$functionName]]; + } + if (isset($this->functionCoverageData[$functionName]['branches'])) { + $this->functions[$functionName]['executableBranches'] = count($this->functionCoverageData[$functionName]['branches']); + $this->functions[$functionName]['executedBranches'] = count(array_filter($this->functionCoverageData[$functionName]['branches'], static function (array $branch) { + return (bool) $branch['hit']; + })); + } + if (isset($this->functionCoverageData[$functionName]['paths'])) { + $this->functions[$functionName]['executablePaths'] = count($this->functionCoverageData[$functionName]['paths']); + $this->functions[$functionName]['executedPaths'] = count(array_filter($this->functionCoverageData[$functionName]['paths'], static function (array $path) { + return (bool) $path['hit']; + })); + } + $this->numExecutableBranches += $this->functions[$functionName]['executableBranches']; + $this->numExecutedBranches += $this->functions[$functionName]['executedBranches']; + $this->numExecutablePaths += $this->functions[$functionName]['executablePaths']; + $this->numExecutedPaths += $this->functions[$functionName]['executedPaths']; + } } - /** - * @return string string representation of the referenced fqsen - */ - public function __toString() : string + private function newMethod(string $className, string $methodName, array $method, string $link) : array { - return (string) $this->fqsen; + $methodData = ['methodName' => $methodName, 'visibility' => $method['visibility'], 'signature' => $method['signature'], 'startLine' => $method['startLine'], 'endLine' => $method['endLine'], 'executableLines' => 0, 'executedLines' => 0, 'executableBranches' => 0, 'executedBranches' => 0, 'executablePaths' => 0, 'executedPaths' => 0, 'ccn' => $method['ccn'], 'coverage' => 0, 'crap' => 0, 'link' => $link . $method['startLine']]; + $key = $className . '->' . $methodName; + if (isset($this->functionCoverageData[$key]['branches'])) { + $methodData['executableBranches'] = count($this->functionCoverageData[$key]['branches']); + $methodData['executedBranches'] = count(array_filter($this->functionCoverageData[$key]['branches'], static function (array $branch) { + return (bool) $branch['hit']; + })); + } + if (isset($this->functionCoverageData[$key]['paths'])) { + $methodData['executablePaths'] = count($this->functionCoverageData[$key]['paths']); + $methodData['executedPaths'] = count(array_filter($this->functionCoverageData[$key]['paths'], static function (array $path) { + return (bool) $path['hit']; + })); + } + return $methodData; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Node; -use PHPUnit\phpDocumentor\Reflection\DocBlock; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use function count; +use RecursiveIterator; /** - * Parses a tag definition for a DocBlock. + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -abstract class BaseTag implements DocBlock\Tag +final class Iterator implements RecursiveIterator { - /** @var string Name of the tag */ - protected $name = ''; - /** @var Description|null Description of the tag. */ - protected $description; /** - * Gets the name of this tag. - * - * @return string The name of this tag. + * @var int */ - public function getName() : string + private $position; + /** + * @var AbstractNode[] + */ + private $nodes; + public function __construct(Directory $node) { - return $this->name; + $this->nodes = $node->children(); } - public function getDescription() : ?Description + /** + * Rewinds the Iterator to the first element. + */ + public function rewind() : void { - return $this->description; + $this->position = 0; } - public function render(?Formatter $formatter = null) : string + /** + * Checks if there is a current element after calls to rewind() or next(). + */ + public function valid() : bool { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - return $formatter->format($this); + return $this->position < count($this->nodes); + } + /** + * Returns the key of the current element. + */ + public function key() : int + { + return $this->position; + } + /** + * Returns the current element. + */ + public function current() : ?AbstractNode + { + return $this->valid() ? $this->nodes[$this->position] : null; + } + /** + * Moves forward to next element. + */ + public function next() : void + { + $this->position++; + } + /** + * Returns the sub iterator for the current element. + */ + public function getChildren() : self + { + return new self($this->nodes[$this->position]); + } + /** + * Checks whether the current element has children. + */ + public function hasChildren() : bool + { + return $this->nodes[$this->position] instanceof Directory; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; +namespace PHPUnit\SebastianBergmann\CodeCoverage; -use InvalidArgumentException; -use function filter_var; -use function preg_match; -use function trim; -use const FILTER_VALIDATE_EMAIL; +use function array_key_exists; +use function array_keys; +use function array_merge; +use function array_unique; +use function count; +use function is_array; +use function ksort; +use PHPUnit\SebastianBergmann\CodeCoverage\Driver\Driver; /** - * Reflection class for an {@}author tag in a Docblock. + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Author extends BaseTag implements Factory\StaticMethod +final class ProcessedCodeCoverageData { - /** @var string register that this is the author tag. */ - protected $name = 'author'; - /** @var string The name of the author */ - private $authorName; - /** @var string The email of the author */ - private $authorEmail; /** - * Initializes this tag with the author name and e-mail. + * Line coverage data. + * An array of filenames, each having an array of linenumbers, each executable line having an array of testcase ids. + * + * @var array */ - public function __construct(string $authorName, string $authorEmail) - { - if ($authorEmail && !filter_var($authorEmail, \FILTER_VALIDATE_EMAIL)) { - throw new InvalidArgumentException('The author tag does not have a valid e-mail address'); - } - $this->authorName = $authorName; - $this->authorEmail = $authorEmail; - } + private $lineCoverage = []; /** - * Gets the author's name. + * Function coverage data. + * Maintains base format of raw data (@see https://xdebug.org/docs/code_coverage), but each 'hit' entry is an array + * of testcase ids. * - * @return string The author's name. + * @var array */ - public function getAuthorName() : string + private $functionCoverage = []; + public function initializeUnseenData(RawCodeCoverageData $rawData) : void { - return $this->authorName; + foreach ($rawData->lineCoverage() as $file => $lines) { + if (!isset($this->lineCoverage[$file])) { + $this->lineCoverage[$file] = []; + foreach ($lines as $k => $v) { + $this->lineCoverage[$file][$k] = $v === Driver::LINE_NOT_EXECUTABLE ? null : []; + } + } + } + foreach ($rawData->functionCoverage() as $file => $functions) { + foreach ($functions as $functionName => $functionData) { + if (isset($this->functionCoverage[$file][$functionName])) { + $this->initPreviouslySeenFunction($file, $functionName, $functionData); + } else { + $this->initPreviouslyUnseenFunction($file, $functionName, $functionData); + } + } + } + } + public function markCodeAsExecutedByTestCase(string $testCaseId, RawCodeCoverageData $executedCode) : void + { + foreach ($executedCode->lineCoverage() as $file => $lines) { + foreach ($lines as $k => $v) { + if ($v === Driver::LINE_EXECUTED) { + $this->lineCoverage[$file][$k][] = $testCaseId; + } + } + } + foreach ($executedCode->functionCoverage() as $file => $functions) { + foreach ($functions as $functionName => $functionData) { + foreach ($functionData['branches'] as $branchId => $branchData) { + if ($branchData['hit'] === Driver::BRANCH_HIT) { + $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'][] = $testCaseId; + } + } + foreach ($functionData['paths'] as $pathId => $pathData) { + if ($pathData['hit'] === Driver::BRANCH_HIT) { + $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'][] = $testCaseId; + } + } + } + } + } + public function setLineCoverage(array $lineCoverage) : void + { + $this->lineCoverage = $lineCoverage; + } + public function lineCoverage() : array + { + ksort($this->lineCoverage); + return $this->lineCoverage; + } + public function setFunctionCoverage(array $functionCoverage) : void + { + $this->functionCoverage = $functionCoverage; + } + public function functionCoverage() : array + { + ksort($this->functionCoverage); + return $this->functionCoverage; + } + public function coveredFiles() : array + { + ksort($this->lineCoverage); + return array_keys($this->lineCoverage); + } + public function renameFile(string $oldFile, string $newFile) : void + { + $this->lineCoverage[$newFile] = $this->lineCoverage[$oldFile]; + if (isset($this->functionCoverage[$oldFile])) { + $this->functionCoverage[$newFile] = $this->functionCoverage[$oldFile]; + } + unset($this->lineCoverage[$oldFile], $this->functionCoverage[$oldFile]); + } + public function merge(self $newData) : void + { + foreach ($newData->lineCoverage as $file => $lines) { + if (!isset($this->lineCoverage[$file])) { + $this->lineCoverage[$file] = $lines; + continue; + } + // we should compare the lines if any of two contains data + $compareLineNumbers = array_unique(array_merge(array_keys($this->lineCoverage[$file]), array_keys($newData->lineCoverage[$file]))); + foreach ($compareLineNumbers as $line) { + $thatPriority = $this->priorityForLine($newData->lineCoverage[$file], $line); + $thisPriority = $this->priorityForLine($this->lineCoverage[$file], $line); + if ($thatPriority > $thisPriority) { + $this->lineCoverage[$file][$line] = $newData->lineCoverage[$file][$line]; + } elseif ($thatPriority === $thisPriority && is_array($this->lineCoverage[$file][$line])) { + $this->lineCoverage[$file][$line] = array_unique(array_merge($this->lineCoverage[$file][$line], $newData->lineCoverage[$file][$line])); + } + } + } + foreach ($newData->functionCoverage as $file => $functions) { + if (!isset($this->functionCoverage[$file])) { + $this->functionCoverage[$file] = $functions; + continue; + } + foreach ($functions as $functionName => $functionData) { + if (isset($this->functionCoverage[$file][$functionName])) { + $this->initPreviouslySeenFunction($file, $functionName, $functionData); + } else { + $this->initPreviouslyUnseenFunction($file, $functionName, $functionData); + } + foreach ($functionData['branches'] as $branchId => $branchData) { + $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'] = array_unique(array_merge($this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'], $branchData['hit'])); + } + foreach ($functionData['paths'] as $pathId => $pathData) { + $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'] = array_unique(array_merge($this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'], $pathData['hit'])); + } + } + } } /** - * Returns the author's email. + * Determine the priority for a line. * - * @return string The author's email. + * 1 = the line is not set + * 2 = the line has not been tested + * 3 = the line is dead code + * 4 = the line has been tested + * + * During a merge, a higher number is better. */ - public function getEmail() : string + private function priorityForLine(array $data, int $line) : int { - return $this->authorEmail; + if (!array_key_exists($line, $data)) { + return 1; + } + if (is_array($data[$line]) && count($data[$line]) === 0) { + return 2; + } + if ($data[$line] === null) { + return 3; + } + return 4; } /** - * Returns this tag in string form. + * For a function we have never seen before, copy all data over and simply init the 'hit' array. */ - public function __toString() : string + private function initPreviouslyUnseenFunction(string $file, string $functionName, array $functionData) : void { - if ($this->authorEmail) { - $authorEmail = '<' . $this->authorEmail . '>'; - } else { - $authorEmail = ''; + $this->functionCoverage[$file][$functionName] = $functionData; + foreach (array_keys($functionData['branches']) as $branchId) { + $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'] = []; + } + foreach (array_keys($functionData['paths']) as $pathId) { + $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'] = []; } - $authorName = (string) $this->authorName; - return $authorName . ($authorEmail !== '' ? ($authorName !== '' ? ' ' : '') . $authorEmail : ''); } /** - * Attempts to create a new Author object based on †he tag body. + * For a function we have seen before, only copy over and init the 'hit' array for any unseen branches and paths. + * Techniques such as mocking and where the contents of a file are different vary during tests (e.g. compiling + * containers) mean that the functions inside a file cannot be relied upon to be static. */ - public static function create(string $body) : ?self + private function initPreviouslySeenFunction(string $file, string $functionName, array $functionData) : void { - $splitTagContent = preg_match('/^([^\\<]*)(?:\\<([^\\>]*)\\>)?$/u', $body, $matches); - if (!$splitTagContent) { - return null; + foreach ($functionData['branches'] as $branchId => $branchData) { + if (!isset($this->functionCoverage[$file][$functionName]['branches'][$branchId])) { + $this->functionCoverage[$file][$functionName]['branches'][$branchId] = $branchData; + $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'] = []; + } + } + foreach ($functionData['paths'] as $pathId => $pathData) { + if (!isset($this->functionCoverage[$file][$functionName]['paths'][$pathId])) { + $this->functionCoverage[$file][$functionName]['paths'][$pathId] = $pathData; + $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'] = []; + } } - $authorName = trim($matches[1]); - $email = isset($matches[2]) ? trim($matches[2]) : ''; - return new static($authorName, $email); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; +namespace PHPUnit\SebastianBergmann\CodeCoverage; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; -use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; -use PHPUnit\Webmozart\Assert\Assert; -use function preg_match; +use function array_diff; +use function array_diff_key; +use function array_flip; +use function array_intersect; +use function array_intersect_key; +use function count; +use function in_array; +use function range; +use PHPUnit\SebastianBergmann\CodeCoverage\Driver\Driver; +use PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser; /** - * Reflection class for a {@}since tag in a Docblock. + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Since extends BaseTag implements Factory\StaticMethod +final class RawCodeCoverageData { - /** @var string */ - protected $name = 'since'; /** - * PCRE regular expression matching a version vector. - * Assumes the "x" modifier. + * @var array> */ - public const REGEX_VECTOR = '(?: - # Normal release vectors. - \\d\\S* - | - # VCS version vectors. Per PHPCS, they are expected to - # follow the form of the VCS name, followed by ":", followed - # by the version vector itself. - # By convention, popular VCSes like CVS, SVN and GIT use "$" - # around the actual version vector. - [^\\s\\:]+\\:\\s*\\$[^\\$]+\\$ - )'; - /** @var string|null The version vector. */ - private $version; - public function __construct(?string $version = null, ?Description $description = null) + private static $emptyLineCache = []; + /** + * @var array + * + * @see https://xdebug.org/docs/code_coverage for format + */ + private $lineCoverage; + /** + * @var array + * + * @see https://xdebug.org/docs/code_coverage for format + */ + private $functionCoverage; + public static function fromXdebugWithoutPathCoverage(array $rawCoverage) : self { - Assert::nullOrNotEmpty($version); - $this->version = $version; - $this->description = $description; + return new self($rawCoverage, []); } - public static function create(?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : ?self + public static function fromXdebugWithPathCoverage(array $rawCoverage) : self { - if (empty($body)) { - return new static(); + $lineCoverage = []; + $functionCoverage = []; + foreach ($rawCoverage as $file => $fileCoverageData) { + $lineCoverage[$file] = $fileCoverageData['lines']; + $functionCoverage[$file] = $fileCoverageData['functions']; } - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\\s*(.+)?$/sux', $body, $matches)) { - return null; + return new self($lineCoverage, $functionCoverage); + } + public static function fromXdebugWithMixedCoverage(array $rawCoverage) : self + { + $lineCoverage = []; + $functionCoverage = []; + foreach ($rawCoverage as $file => $fileCoverageData) { + if (!isset($fileCoverageData['functions'])) { + // Current file does not have functions, so line coverage + // is stored in $fileCoverageData, not in $fileCoverageData['lines'] + $lineCoverage[$file] = $fileCoverageData; + continue; + } + $lineCoverage[$file] = $fileCoverageData['lines']; + $functionCoverage[$file] = $fileCoverageData['functions']; } - Assert::notNull($descriptionFactory); - return new static($matches[1], $descriptionFactory->create($matches[2] ?? '', $context)); + return new self($lineCoverage, $functionCoverage); + } + public static function fromUncoveredFile(string $filename, FileAnalyser $analyser) : self + { + $lineCoverage = []; + foreach ($analyser->executableLinesIn($filename) as $line) { + $lineCoverage[$line] = Driver::LINE_NOT_EXECUTED; + } + return new self([$filename => $lineCoverage], []); + } + private function __construct(array $lineCoverage, array $functionCoverage) + { + $this->lineCoverage = $lineCoverage; + $this->functionCoverage = $functionCoverage; + $this->skipEmptyLines(); + } + public function clear() : void + { + $this->lineCoverage = $this->functionCoverage = []; + } + public function lineCoverage() : array + { + return $this->lineCoverage; + } + public function functionCoverage() : array + { + return $this->functionCoverage; + } + public function removeCoverageDataForFile(string $filename) : void + { + unset($this->lineCoverage[$filename], $this->functionCoverage[$filename]); } /** - * Gets the version section of the tag. + * @param int[] $lines */ - public function getVersion() : ?string + public function keepLineCoverageDataOnlyForLines(string $filename, array $lines) : void { - return $this->version; + if (!isset($this->lineCoverage[$filename])) { + return; + } + $this->lineCoverage[$filename] = array_intersect_key($this->lineCoverage[$filename], array_flip($lines)); + } + /** + * @param int[] $lines + */ + public function keepFunctionCoverageDataOnlyForLines(string $filename, array $lines) : void + { + if (!isset($this->functionCoverage[$filename])) { + return; + } + foreach ($this->functionCoverage[$filename] as $functionName => $functionData) { + foreach ($functionData['branches'] as $branchId => $branch) { + if (count(array_diff(range($branch['line_start'], $branch['line_end']), $lines)) > 0) { + unset($this->functionCoverage[$filename][$functionName]['branches'][$branchId]); + foreach ($functionData['paths'] as $pathId => $path) { + if (in_array($branchId, $path['path'], \true)) { + unset($this->functionCoverage[$filename][$functionName]['paths'][$pathId]); + } + } + } + } + } + } + /** + * @param int[] $lines + */ + public function removeCoverageDataForLines(string $filename, array $lines) : void + { + if (empty($lines)) { + return; + } + if (!isset($this->lineCoverage[$filename])) { + return; + } + $this->lineCoverage[$filename] = array_diff_key($this->lineCoverage[$filename], array_flip($lines)); + if (isset($this->functionCoverage[$filename])) { + foreach ($this->functionCoverage[$filename] as $functionName => $functionData) { + foreach ($functionData['branches'] as $branchId => $branch) { + if (count(array_intersect($lines, range($branch['line_start'], $branch['line_end']))) > 0) { + unset($this->functionCoverage[$filename][$functionName]['branches'][$branchId]); + foreach ($functionData['paths'] as $pathId => $path) { + if (in_array($branchId, $path['path'], \true)) { + unset($this->functionCoverage[$filename][$functionName]['paths'][$pathId]); + } + } + } + } + } + } } /** - * Returns a string representation for this tag. + * At the end of a file, the PHP interpreter always sees an implicit return. Where this occurs in a file that has + * e.g. a class definition, that line cannot be invoked from a test and results in confusing coverage. This engine + * implementation detail therefore needs to be masked which is done here by simply ensuring that all empty lines + * are skipped over for coverage purposes. + * + * @see https://github.com/sebastianbergmann/php-code-coverage/issues/799 */ - public function __toString() : string + private function skipEmptyLines() : void { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; + foreach ($this->lineCoverage as $filename => $coverage) { + foreach ($this->getEmptyLinesForFile($filename) as $emptyLine) { + unset($this->lineCoverage[$filename][$emptyLine]); + } } - $version = (string) $this->version; - return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } -} -getName() . ' ' . $tag); + if (!isset(self::$emptyLineCache[$filename])) { + self::$emptyLineCache[$filename] = []; + if (\is_file($filename)) { + $sourceLines = \explode("\n", \file_get_contents($filename)); + foreach ($sourceLines as $line => $source) { + if (\trim($source) === '') { + self::$emptyLineCache[$filename][] = $line + 1; + } + } + } + } + return self::$emptyLineCache[$filename]; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Formatter; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tag; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Formatter; +use function count; +use function dirname; +use function file_put_contents; +use function is_string; +use function ksort; use function max; -use function str_repeat; -use function strlen; -class AlignFormatter implements Formatter +use function range; +use function time; +use DOMDocument; +use PHPUnit\SebastianBergmann\CodeCoverage\CodeCoverage; +use PHPUnit\SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\File; +use PHPUnit\SebastianBergmann\CodeCoverage\Util\Filesystem; +final class Clover { - /** @var int The maximum tag name length. */ - protected $maxLen = 0; /** - * @param Tag[] $tags All tags that should later be aligned with the formatter. + * @throws WriteOperationFailedException */ - public function __construct(array $tags) + public function process(CodeCoverage $coverage, ?string $target = null, ?string $name = null) : string { - foreach ($tags as $tag) { - $this->maxLen = max($this->maxLen, strlen($tag->getName())); + $time = (string) time(); + $xmlDocument = new DOMDocument('1.0', 'UTF-8'); + $xmlDocument->formatOutput = \true; + $xmlCoverage = $xmlDocument->createElement('coverage'); + $xmlCoverage->setAttribute('generated', $time); + $xmlDocument->appendChild($xmlCoverage); + $xmlProject = $xmlDocument->createElement('project'); + $xmlProject->setAttribute('timestamp', $time); + if (is_string($name)) { + $xmlProject->setAttribute('name', $name); } - } - /** - * Formats the given tag to return a simple plain text version. - */ - public function format(Tag $tag) : string - { - return '@' . $tag->getName() . str_repeat(' ', $this->maxLen - strlen($tag->getName()) + 1) . $tag; + $xmlCoverage->appendChild($xmlProject); + $packages = []; + $report = $coverage->getReport(); + foreach ($report as $item) { + if (!$item instanceof File) { + continue; + } + /* @var File $item */ + $xmlFile = $xmlDocument->createElement('file'); + $xmlFile->setAttribute('name', $item->pathAsString()); + $classes = $item->classesAndTraits(); + $coverageData = $item->lineCoverageData(); + $lines = []; + $namespace = 'global'; + foreach ($classes as $className => $class) { + $classStatements = 0; + $coveredClassStatements = 0; + $coveredMethods = 0; + $classMethods = 0; + foreach ($class['methods'] as $methodName => $method) { + if ($method['executableLines'] == 0) { + continue; + } + $classMethods++; + $classStatements += $method['executableLines']; + $coveredClassStatements += $method['executedLines']; + if ($method['coverage'] == 100) { + $coveredMethods++; + } + $methodCount = 0; + foreach (range($method['startLine'], $method['endLine']) as $line) { + if (isset($coverageData[$line]) && $coverageData[$line] !== null) { + $methodCount = max($methodCount, count($coverageData[$line])); + } + } + $lines[$method['startLine']] = ['ccn' => $method['ccn'], 'count' => $methodCount, 'crap' => $method['crap'], 'type' => 'method', 'visibility' => $method['visibility'], 'name' => $methodName]; + } + if (!empty($class['package']['namespace'])) { + $namespace = $class['package']['namespace']; + } + $xmlClass = $xmlDocument->createElement('class'); + $xmlClass->setAttribute('name', $className); + $xmlClass->setAttribute('namespace', $namespace); + if (!empty($class['package']['fullPackage'])) { + $xmlClass->setAttribute('fullPackage', $class['package']['fullPackage']); + } + if (!empty($class['package']['category'])) { + $xmlClass->setAttribute('category', $class['package']['category']); + } + if (!empty($class['package']['package'])) { + $xmlClass->setAttribute('package', $class['package']['package']); + } + if (!empty($class['package']['subpackage'])) { + $xmlClass->setAttribute('subpackage', $class['package']['subpackage']); + } + $xmlFile->appendChild($xmlClass); + $xmlMetrics = $xmlDocument->createElement('metrics'); + $xmlMetrics->setAttribute('complexity', (string) $class['ccn']); + $xmlMetrics->setAttribute('methods', (string) $classMethods); + $xmlMetrics->setAttribute('coveredmethods', (string) $coveredMethods); + $xmlMetrics->setAttribute('conditionals', (string) $class['executableBranches']); + $xmlMetrics->setAttribute('coveredconditionals', (string) $class['executedBranches']); + $xmlMetrics->setAttribute('statements', (string) $classStatements); + $xmlMetrics->setAttribute('coveredstatements', (string) $coveredClassStatements); + $xmlMetrics->setAttribute('elements', (string) ($classMethods + $classStatements + $class['executableBranches'])); + $xmlMetrics->setAttribute('coveredelements', (string) ($coveredMethods + $coveredClassStatements + $class['executedBranches'])); + $xmlClass->appendChild($xmlMetrics); + } + foreach ($coverageData as $line => $data) { + if ($data === null || isset($lines[$line])) { + continue; + } + $lines[$line] = ['count' => count($data), 'type' => 'stmt']; + } + ksort($lines); + foreach ($lines as $line => $data) { + $xmlLine = $xmlDocument->createElement('line'); + $xmlLine->setAttribute('num', (string) $line); + $xmlLine->setAttribute('type', $data['type']); + if (isset($data['name'])) { + $xmlLine->setAttribute('name', $data['name']); + } + if (isset($data['visibility'])) { + $xmlLine->setAttribute('visibility', $data['visibility']); + } + if (isset($data['ccn'])) { + $xmlLine->setAttribute('complexity', (string) $data['ccn']); + } + if (isset($data['crap'])) { + $xmlLine->setAttribute('crap', (string) $data['crap']); + } + $xmlLine->setAttribute('count', (string) $data['count']); + $xmlFile->appendChild($xmlLine); + } + $linesOfCode = $item->linesOfCode(); + $xmlMetrics = $xmlDocument->createElement('metrics'); + $xmlMetrics->setAttribute('loc', (string) $linesOfCode['linesOfCode']); + $xmlMetrics->setAttribute('ncloc', (string) $linesOfCode['nonCommentLinesOfCode']); + $xmlMetrics->setAttribute('classes', (string) $item->numberOfClassesAndTraits()); + $xmlMetrics->setAttribute('methods', (string) $item->numberOfMethods()); + $xmlMetrics->setAttribute('coveredmethods', (string) $item->numberOfTestedMethods()); + $xmlMetrics->setAttribute('conditionals', (string) $item->numberOfExecutableBranches()); + $xmlMetrics->setAttribute('coveredconditionals', (string) $item->numberOfExecutedBranches()); + $xmlMetrics->setAttribute('statements', (string) $item->numberOfExecutableLines()); + $xmlMetrics->setAttribute('coveredstatements', (string) $item->numberOfExecutedLines()); + $xmlMetrics->setAttribute('elements', (string) ($item->numberOfMethods() + $item->numberOfExecutableLines() + $item->numberOfExecutableBranches())); + $xmlMetrics->setAttribute('coveredelements', (string) ($item->numberOfTestedMethods() + $item->numberOfExecutedLines() + $item->numberOfExecutedBranches())); + $xmlFile->appendChild($xmlMetrics); + if ($namespace === 'global') { + $xmlProject->appendChild($xmlFile); + } else { + if (!isset($packages[$namespace])) { + $packages[$namespace] = $xmlDocument->createElement('package'); + $packages[$namespace]->setAttribute('name', $namespace); + $xmlProject->appendChild($packages[$namespace]); + } + $packages[$namespace]->appendChild($xmlFile); + } + } + $linesOfCode = $report->linesOfCode(); + $xmlMetrics = $xmlDocument->createElement('metrics'); + $xmlMetrics->setAttribute('files', (string) count($report)); + $xmlMetrics->setAttribute('loc', (string) $linesOfCode['linesOfCode']); + $xmlMetrics->setAttribute('ncloc', (string) $linesOfCode['nonCommentLinesOfCode']); + $xmlMetrics->setAttribute('classes', (string) $report->numberOfClassesAndTraits()); + $xmlMetrics->setAttribute('methods', (string) $report->numberOfMethods()); + $xmlMetrics->setAttribute('coveredmethods', (string) $report->numberOfTestedMethods()); + $xmlMetrics->setAttribute('conditionals', (string) $report->numberOfExecutableBranches()); + $xmlMetrics->setAttribute('coveredconditionals', (string) $report->numberOfExecutedBranches()); + $xmlMetrics->setAttribute('statements', (string) $report->numberOfExecutableLines()); + $xmlMetrics->setAttribute('coveredstatements', (string) $report->numberOfExecutedLines()); + $xmlMetrics->setAttribute('elements', (string) ($report->numberOfMethods() + $report->numberOfExecutableLines() + $report->numberOfExecutableBranches())); + $xmlMetrics->setAttribute('coveredelements', (string) ($report->numberOfTestedMethods() + $report->numberOfExecutedLines() + $report->numberOfExecutedBranches())); + $xmlProject->appendChild($xmlMetrics); + $buffer = $xmlDocument->saveXML(); + if ($target !== null) { + Filesystem::createDirectory(dirname($target)); + if (@file_put_contents($target, $buffer) === \false) { + throw new WriteOperationFailedException($target); + } + } + return $buffer; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; -use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use PHPUnit\phpDocumentor\Reflection\Type; -use PHPUnit\phpDocumentor\Reflection\TypeResolver; -use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; -use PHPUnit\phpDocumentor\Reflection\Utils; -use PHPUnit\Webmozart\Assert\Assert; -use function array_shift; -use function array_unshift; -use function implode; -use function strpos; -use function substr; -use const PREG_SPLIT_DELIM_CAPTURE; -/** - * Reflection class for a {@}property-read tag in a Docblock. - */ -final class PropertyRead extends TagWithType implements Factory\StaticMethod +use function count; +use function dirname; +use function file_put_contents; +use function range; +use function time; +use DOMImplementation; +use PHPUnit\SebastianBergmann\CodeCoverage\CodeCoverage; +use PHPUnit\SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\File; +use PHPUnit\SebastianBergmann\CodeCoverage\Util\Filesystem; +final class Cobertura { - /** @var string|null */ - protected $variableName; - public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) - { - Assert::string($variableName); - $this->name = 'property-read'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, \PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - Assert::notNull($variableName); - $variableName = substr($variableName, 1); - } - $description = $descriptionFactory->create(implode('', $parts), $context); - return new static($variableName, $type, $description); - } - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } /** - * Returns a string representation for this tag. + * @throws WriteOperationFailedException */ - public function __toString() : string + public function process(CodeCoverage $coverage, ?string $target = null) : string { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; + $time = (string) time(); + $report = $coverage->getReport(); + $implementation = new DOMImplementation(); + $documentType = $implementation->createDocumentType('coverage', '', 'http://cobertura.sourceforge.net/xml/coverage-04.dtd'); + $document = $implementation->createDocument('', '', $documentType); + $document->xmlVersion = '1.0'; + $document->encoding = 'UTF-8'; + $document->formatOutput = \true; + $coverageElement = $document->createElement('coverage'); + $linesValid = $report->numberOfExecutableLines(); + $linesCovered = $report->numberOfExecutedLines(); + $lineRate = $linesValid === 0 ? 0 : $linesCovered / $linesValid; + $coverageElement->setAttribute('line-rate', (string) $lineRate); + $branchesValid = $report->numberOfExecutableBranches(); + $branchesCovered = $report->numberOfExecutedBranches(); + $branchRate = $branchesValid === 0 ? 0 : $branchesCovered / $branchesValid; + $coverageElement->setAttribute('branch-rate', (string) $branchRate); + $coverageElement->setAttribute('lines-covered', (string) $report->numberOfExecutedLines()); + $coverageElement->setAttribute('lines-valid', (string) $report->numberOfExecutableLines()); + $coverageElement->setAttribute('branches-covered', (string) $report->numberOfExecutedBranches()); + $coverageElement->setAttribute('branches-valid', (string) $report->numberOfExecutableBranches()); + $coverageElement->setAttribute('complexity', ''); + $coverageElement->setAttribute('version', '0.4'); + $coverageElement->setAttribute('timestamp', $time); + $document->appendChild($coverageElement); + $sourcesElement = $document->createElement('sources'); + $coverageElement->appendChild($sourcesElement); + $sourceElement = $document->createElement('source', $report->pathAsString()); + $sourcesElement->appendChild($sourceElement); + $packagesElement = $document->createElement('packages'); + $coverageElement->appendChild($packagesElement); + $complexity = 0; + foreach ($report as $item) { + if (!$item instanceof File) { + continue; + } + $packageElement = $document->createElement('package'); + $packageComplexity = 0; + $packageElement->setAttribute('name', \str_replace($report->pathAsString() . \DIRECTORY_SEPARATOR, '', $item->pathAsString())); + $linesValid = $item->numberOfExecutableLines(); + $linesCovered = $item->numberOfExecutedLines(); + $lineRate = $linesValid === 0 ? 0 : $linesCovered / $linesValid; + $packageElement->setAttribute('line-rate', (string) $lineRate); + $branchesValid = $item->numberOfExecutableBranches(); + $branchesCovered = $item->numberOfExecutedBranches(); + $branchRate = $branchesValid === 0 ? 0 : $branchesCovered / $branchesValid; + $packageElement->setAttribute('branch-rate', (string) $branchRate); + $packageElement->setAttribute('complexity', ''); + $packagesElement->appendChild($packageElement); + $classesElement = $document->createElement('classes'); + $packageElement->appendChild($classesElement); + $classes = $item->classesAndTraits(); + $coverageData = $item->lineCoverageData(); + foreach ($classes as $className => $class) { + $complexity += $class['ccn']; + $packageComplexity += $class['ccn']; + if (!empty($class['package']['namespace'])) { + $className = $class['package']['namespace'] . '\\' . $className; + } + $linesValid = $class['executableLines']; + $linesCovered = $class['executedLines']; + $lineRate = $linesValid === 0 ? 0 : $linesCovered / $linesValid; + $branchesValid = $class['executableBranches']; + $branchesCovered = $class['executedBranches']; + $branchRate = $branchesValid === 0 ? 0 : $branchesCovered / $branchesValid; + $classElement = $document->createElement('class'); + $classElement->setAttribute('name', $className); + $classElement->setAttribute('filename', \str_replace($report->pathAsString() . \DIRECTORY_SEPARATOR, '', $item->pathAsString())); + $classElement->setAttribute('line-rate', (string) $lineRate); + $classElement->setAttribute('branch-rate', (string) $branchRate); + $classElement->setAttribute('complexity', (string) $class['ccn']); + $classesElement->appendChild($classElement); + $methodsElement = $document->createElement('methods'); + $classElement->appendChild($methodsElement); + $classLinesElement = $document->createElement('lines'); + $classElement->appendChild($classLinesElement); + foreach ($class['methods'] as $methodName => $method) { + if ($method['executableLines'] === 0) { + continue; + } + \preg_match("/\\((.*?)\\)/", $method['signature'], $signature); + $linesValid = $method['executableLines']; + $linesCovered = $method['executedLines']; + $lineRate = $linesValid === 0 ? 0 : $linesCovered / $linesValid; + $branchesValid = $method['executableBranches']; + $branchesCovered = $method['executedBranches']; + $branchRate = $branchesValid === 0 ? 0 : $branchesCovered / $branchesValid; + $methodElement = $document->createElement('method'); + $methodElement->setAttribute('name', $methodName); + $methodElement->setAttribute('signature', $signature[1]); + $methodElement->setAttribute('line-rate', (string) $lineRate); + $methodElement->setAttribute('branch-rate', (string) $branchRate); + $methodElement->setAttribute('complexity', (string) $method['ccn']); + $methodLinesElement = $document->createElement('lines'); + $methodElement->appendChild($methodLinesElement); + foreach (range($method['startLine'], $method['endLine']) as $line) { + if (!isset($coverageData[$line]) || $coverageData[$line] === null) { + continue; + } + $methodLineElement = $document->createElement('line'); + $methodLineElement->setAttribute('number', (string) $line); + $methodLineElement->setAttribute('hits', (string) count($coverageData[$line])); + $methodLinesElement->appendChild($methodLineElement); + $classLineElement = $methodLineElement->cloneNode(); + $classLinesElement->appendChild($classLineElement); + } + $methodsElement->appendChild($methodElement); + } + } + if ($report->numberOfFunctions() === 0) { + $packageElement->setAttribute('complexity', (string) $packageComplexity); + continue; + } + $functionsComplexity = 0; + $functionsLinesValid = 0; + $functionsLinesCovered = 0; + $functionsBranchesValid = 0; + $functionsBranchesCovered = 0; + $classElement = $document->createElement('class'); + $classElement->setAttribute('name', \basename($item->pathAsString())); + $classElement->setAttribute('filename', \str_replace($report->pathAsString() . \DIRECTORY_SEPARATOR, '', $item->pathAsString())); + $methodsElement = $document->createElement('methods'); + $classElement->appendChild($methodsElement); + $classLinesElement = $document->createElement('lines'); + $classElement->appendChild($classLinesElement); + $functions = $report->functions(); + foreach ($functions as $functionName => $function) { + if ($function['executableLines'] === 0) { + continue; + } + $complexity += $function['ccn']; + $packageComplexity += $function['ccn']; + $functionsComplexity += $function['ccn']; + $linesValid = $function['executableLines']; + $linesCovered = $function['executedLines']; + $lineRate = $linesValid === 0 ? 0 : $linesCovered / $linesValid; + $functionsLinesValid += $linesValid; + $functionsLinesCovered += $linesCovered; + $branchesValid = $function['executableBranches']; + $branchesCovered = $function['executedBranches']; + $branchRate = $branchesValid === 0 ? 0 : $branchesCovered / $branchesValid; + $functionsBranchesValid += $branchesValid; + $functionsBranchesCovered += $branchesValid; + $methodElement = $document->createElement('method'); + $methodElement->setAttribute('name', $functionName); + $methodElement->setAttribute('signature', $function['signature']); + $methodElement->setAttribute('line-rate', (string) $lineRate); + $methodElement->setAttribute('branch-rate', (string) $branchRate); + $methodElement->setAttribute('complexity', (string) $function['ccn']); + $methodLinesElement = $document->createElement('lines'); + $methodElement->appendChild($methodLinesElement); + foreach (range($function['startLine'], $function['endLine']) as $line) { + if (!isset($coverageData[$line]) || $coverageData[$line] === null) { + continue; + } + $methodLineElement = $document->createElement('line'); + $methodLineElement->setAttribute('number', (string) $line); + $methodLineElement->setAttribute('hits', (string) count($coverageData[$line])); + $methodLinesElement->appendChild($methodLineElement); + $classLineElement = $methodLineElement->cloneNode(); + $classLinesElement->appendChild($classLineElement); + } + $methodsElement->appendChild($methodElement); + } + $packageElement->setAttribute('complexity', (string) $packageComplexity); + if ($functionsLinesValid === 0) { + continue; + } + $lineRate = $functionsLinesCovered / $functionsLinesValid; + $branchRate = $functionsBranchesValid === 0 ? 0 : $functionsBranchesCovered / $functionsBranchesValid; + $classElement->setAttribute('line-rate', (string) $lineRate); + $classElement->setAttribute('branch-rate', (string) $branchRate); + $classElement->setAttribute('complexity', (string) $functionsComplexity); + $classesElement->appendChild($classElement); } - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; + $coverageElement->setAttribute('complexity', (string) $complexity); + $buffer = $document->saveXML(); + if ($target !== null) { + Filesystem::createDirectory(dirname($target)); + if (@file_put_contents($target, $buffer) === \false) { + throw new WriteOperationFailedException($target); + } } - $type = (string) $this->type; - return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); + return $buffer; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report; -use PHPUnit\phpDocumentor\Reflection\Type; -use function in_array; -use function strlen; -use function substr; -use function trim; -abstract class TagWithType extends BaseTag +use function date; +use function dirname; +use function file_put_contents; +use function htmlspecialchars; +use function is_string; +use function round; +use DOMDocument; +use PHPUnit\SebastianBergmann\CodeCoverage\CodeCoverage; +use PHPUnit\SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\File; +use PHPUnit\SebastianBergmann\CodeCoverage\Util\Filesystem; +final class Crap4j { - /** @var ?Type */ - protected $type; /** - * Returns the type section of the variable. + * @var int */ - public function getType() : ?Type + private $threshold; + public function __construct(int $threshold = 30) { - return $this->type; + $this->threshold = $threshold; } /** - * @return string[] + * @throws WriteOperationFailedException */ - protected static function extractTypeFromBody(string $body) : array + public function process(CodeCoverage $coverage, ?string $target = null, ?string $name = null) : string { - $type = ''; - $nestingLevel = 0; - for ($i = 0, $iMax = strlen($body); $i < $iMax; $i++) { - $character = $body[$i]; - if ($nestingLevel === 0 && trim($character) === '') { - break; - } - $type .= $character; - if (in_array($character, ['<', '(', '[', '{'])) { - $nestingLevel++; + $document = new DOMDocument('1.0', 'UTF-8'); + $document->formatOutput = \true; + $root = $document->createElement('crap_result'); + $document->appendChild($root); + $project = $document->createElement('project', is_string($name) ? $name : ''); + $root->appendChild($project); + $root->appendChild($document->createElement('timestamp', date('Y-m-d H:i:s'))); + $stats = $document->createElement('stats'); + $methodsNode = $document->createElement('methods'); + $report = $coverage->getReport(); + unset($coverage); + $fullMethodCount = 0; + $fullCrapMethodCount = 0; + $fullCrapLoad = 0; + $fullCrap = 0; + foreach ($report as $item) { + $namespace = 'global'; + if (!$item instanceof File) { continue; } - if (in_array($character, ['>', ')', ']', '}'])) { - $nestingLevel--; - continue; + $file = $document->createElement('file'); + $file->setAttribute('name', $item->pathAsString()); + $classes = $item->classesAndTraits(); + foreach ($classes as $className => $class) { + foreach ($class['methods'] as $methodName => $method) { + $crapLoad = $this->crapLoad((float) $method['crap'], $method['ccn'], $method['coverage']); + $fullCrap += $method['crap']; + $fullCrapLoad += $crapLoad; + $fullMethodCount++; + if ($method['crap'] >= $this->threshold) { + $fullCrapMethodCount++; + } + $methodNode = $document->createElement('method'); + if (!empty($class['namespace'])) { + $namespace = $class['namespace']; + } + $methodNode->appendChild($document->createElement('package', $namespace)); + $methodNode->appendChild($document->createElement('className', $className)); + $methodNode->appendChild($document->createElement('methodName', $methodName)); + $methodNode->appendChild($document->createElement('methodSignature', htmlspecialchars($method['signature']))); + $methodNode->appendChild($document->createElement('fullMethod', htmlspecialchars($method['signature']))); + $methodNode->appendChild($document->createElement('crap', (string) $this->roundValue((float) $method['crap']))); + $methodNode->appendChild($document->createElement('complexity', (string) $method['ccn'])); + $methodNode->appendChild($document->createElement('coverage', (string) $this->roundValue($method['coverage']))); + $methodNode->appendChild($document->createElement('crapLoad', (string) round($crapLoad))); + $methodsNode->appendChild($methodNode); + } } } - $description = trim(substr($body, strlen($type))); - return [$type, $description]; + $stats->appendChild($document->createElement('name', 'Method Crap Stats')); + $stats->appendChild($document->createElement('methodCount', (string) $fullMethodCount)); + $stats->appendChild($document->createElement('crapMethodCount', (string) $fullCrapMethodCount)); + $stats->appendChild($document->createElement('crapLoad', (string) round($fullCrapLoad))); + $stats->appendChild($document->createElement('totalCrap', (string) $fullCrap)); + $crapMethodPercent = 0; + if ($fullMethodCount > 0) { + $crapMethodPercent = $this->roundValue(100 * $fullCrapMethodCount / $fullMethodCount); + } + $stats->appendChild($document->createElement('crapMethodPercent', (string) $crapMethodPercent)); + $root->appendChild($stats); + $root->appendChild($methodsNode); + $buffer = $document->saveXML(); + if ($target !== null) { + Filesystem::createDirectory(dirname($target)); + if (@file_put_contents($target, $buffer) === \false) { + throw new WriteOperationFailedException($target); + } + } + return $buffer; + } + private function crapLoad(float $crapValue, int $cyclomaticComplexity, float $coveragePercent) : float + { + $crapLoad = 0; + if ($crapValue >= $this->threshold) { + $crapLoad += $cyclomaticComplexity * (1.0 - $coveragePercent / 100); + $crapLoad += $cyclomaticComplexity / $this->threshold; + } + return $crapLoad; + } + private function roundValue(float $value) : float + { + return round($value, 2); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Html; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; -use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use PHPUnit\phpDocumentor\Reflection\Type; -use PHPUnit\phpDocumentor\Reflection\TypeResolver; -use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; -use PHPUnit\phpDocumentor\Reflection\Utils; -use PHPUnit\Webmozart\Assert\Assert; -use function array_shift; -use function array_unshift; -use function implode; -use function strpos; +use const DIRECTORY_SEPARATOR; +use function copy; +use function date; +use function dirname; use function substr; -use const PREG_SPLIT_DELIM_CAPTURE; -/** - * Reflection class for a {@}property-write tag in a Docblock. - */ -final class PropertyWrite extends TagWithType implements Factory\StaticMethod +use PHPUnit\SebastianBergmann\CodeCoverage\CodeCoverage; +use PHPUnit\SebastianBergmann\CodeCoverage\InvalidArgumentException; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; +use PHPUnit\SebastianBergmann\CodeCoverage\Util\Filesystem; +final class Facade { - /** @var string */ - protected $variableName; - public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) + /** + * @var string + */ + private $templatePath; + /** + * @var string + */ + private $generator; + /** + * @var int + */ + private $lowUpperBound; + /** + * @var int + */ + private $highLowerBound; + public function __construct(int $lowUpperBound = 50, int $highLowerBound = 90, string $generator = '') { - Assert::string($variableName); - $this->name = 'property-write'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; + if ($lowUpperBound > $highLowerBound) { + throw new InvalidArgumentException('$lowUpperBound must not be larger than $highLowerBound'); + } + $this->generator = $generator; + $this->highLowerBound = $highLowerBound; + $this->lowUpperBound = $lowUpperBound; + $this->templatePath = __DIR__ . '/Renderer/Template/'; } - public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self + public function process(CodeCoverage $coverage, string $target) : void { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, \PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); + $target = $this->directory($target); + $report = $coverage->getReport(); + $date = date('D M j G:i:s T Y'); + $dashboard = new Dashboard($this->templatePath, $this->generator, $date, $this->lowUpperBound, $this->highLowerBound, $coverage->collectsBranchAndPathCoverage()); + $directory = new Directory($this->templatePath, $this->generator, $date, $this->lowUpperBound, $this->highLowerBound, $coverage->collectsBranchAndPathCoverage()); + $file = new File($this->templatePath, $this->generator, $date, $this->lowUpperBound, $this->highLowerBound, $coverage->collectsBranchAndPathCoverage()); + $directory->render($report, $target . 'index.html'); + $dashboard->render($report, $target . 'dashboard.html'); + foreach ($report as $node) { + $id = $node->id(); + if ($node instanceof DirectoryNode) { + Filesystem::createDirectory($target . $id); + $directory->render($node, $target . $id . '/index.html'); + $dashboard->render($node, $target . $id . '/dashboard.html'); + } else { + $dir = dirname($target . $id); + Filesystem::createDirectory($dir); + $file->render($node, $target . $id); } - Assert::notNull($variableName); - $variableName = substr($variableName, 1); } - $description = $descriptionFactory->create(implode('', $parts), $context); - return new static($variableName, $type, $description); + $this->copyFiles($target); } - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string + private function copyFiles(string $target) : void { - return $this->variableName; + $dir = $this->directory($target . '_css'); + copy($this->templatePath . 'css/bootstrap.min.css', $dir . 'bootstrap.min.css'); + copy($this->templatePath . 'css/nv.d3.min.css', $dir . 'nv.d3.min.css'); + copy($this->templatePath . 'css/style.css', $dir . 'style.css'); + copy($this->templatePath . 'css/custom.css', $dir . 'custom.css'); + copy($this->templatePath . 'css/octicons.css', $dir . 'octicons.css'); + $dir = $this->directory($target . '_icons'); + copy($this->templatePath . 'icons/file-code.svg', $dir . 'file-code.svg'); + copy($this->templatePath . 'icons/file-directory.svg', $dir . 'file-directory.svg'); + $dir = $this->directory($target . '_js'); + copy($this->templatePath . 'js/bootstrap.min.js', $dir . 'bootstrap.min.js'); + copy($this->templatePath . 'js/popper.min.js', $dir . 'popper.min.js'); + copy($this->templatePath . 'js/d3.min.js', $dir . 'd3.min.js'); + copy($this->templatePath . 'js/jquery.min.js', $dir . 'jquery.min.js'); + copy($this->templatePath . 'js/nv.d3.min.js', $dir . 'nv.d3.min.js'); + copy($this->templatePath . 'js/file.js', $dir . 'file.js'); } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string + private function directory(string $directory) : string { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; + if (substr($directory, -1, 1) != DIRECTORY_SEPARATOR) { + $directory .= DIRECTORY_SEPARATOR; } - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; - } - $type = (string) $this->type; - return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); + Filesystem::createDirectory($directory); + return $directory; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Html; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; -use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; -use PHPUnit\Webmozart\Assert\Assert; -use function preg_match; +use function array_pop; +use function count; +use function sprintf; +use function str_repeat; +use function substr_count; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\AbstractNode; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\File as FileNode; +use PHPUnit\SebastianBergmann\CodeCoverage\Version; +use PHPUnit\SebastianBergmann\Environment\Runtime; +use PHPUnit\SebastianBergmann\Template\Template; /** - * Reflection class for a {@}version tag in a Docblock. + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Version extends BaseTag implements Factory\StaticMethod +abstract class Renderer { - /** @var string */ - protected $name = 'version'; /** - * PCRE regular expression matching a version vector. - * Assumes the "x" modifier. + * @var string */ - public const REGEX_VECTOR = '(?: - # Normal release vectors. - \\d\\S* - | - # VCS version vectors. Per PHPCS, they are expected to - # follow the form of the VCS name, followed by ":", followed - # by the version vector itself. - # By convention, popular VCSes like CVS, SVN and GIT use "$" - # around the actual version vector. - [^\\s\\:]+\\:\\s*\\$[^\\$]+\\$ - )'; - /** @var string|null The version vector. */ - private $version; - public function __construct(?string $version = null, ?Description $description = null) + protected $templatePath; + /** + * @var string + */ + protected $generator; + /** + * @var string + */ + protected $date; + /** + * @var int + */ + protected $lowUpperBound; + /** + * @var int + */ + protected $highLowerBound; + /** + * @var bool + */ + protected $hasBranchCoverage; + /** + * @var string + */ + protected $version; + public function __construct(string $templatePath, string $generator, string $date, int $lowUpperBound, int $highLowerBound, bool $hasBranchCoverage) { - Assert::nullOrStringNotEmpty($version); - $this->version = $version; - $this->description = $description; + $this->templatePath = $templatePath; + $this->generator = $generator; + $this->date = $date; + $this->lowUpperBound = $lowUpperBound; + $this->highLowerBound = $highLowerBound; + $this->version = Version::id(); + $this->hasBranchCoverage = $hasBranchCoverage; } - public static function create(?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : ?self + protected function renderItemTemplate(Template $template, array $data) : string { - if (empty($body)) { - return new static(); + $numSeparator = ' / '; + if (isset($data['numClasses']) && $data['numClasses'] > 0) { + $classesLevel = $this->colorLevel($data['testedClassesPercent']); + $classesNumber = $data['numTestedClasses'] . $numSeparator . $data['numClasses']; + $classesBar = $this->coverageBar($data['testedClassesPercent']); + } else { + $classesLevel = ''; + $classesNumber = '0' . $numSeparator . '0'; + $classesBar = ''; + $data['testedClassesPercentAsString'] = 'n/a'; } - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\\s*(.+)?$/sux', $body, $matches)) { - return null; + if ($data['numMethods'] > 0) { + $methodsLevel = $this->colorLevel($data['testedMethodsPercent']); + $methodsNumber = $data['numTestedMethods'] . $numSeparator . $data['numMethods']; + $methodsBar = $this->coverageBar($data['testedMethodsPercent']); + } else { + $methodsLevel = ''; + $methodsNumber = '0' . $numSeparator . '0'; + $methodsBar = ''; + $data['testedMethodsPercentAsString'] = 'n/a'; } - $description = null; - if ($descriptionFactory !== null) { - $description = $descriptionFactory->create($matches[2] ?? '', $context); + if ($data['numExecutableLines'] > 0) { + $linesLevel = $this->colorLevel($data['linesExecutedPercent']); + $linesNumber = $data['numExecutedLines'] . $numSeparator . $data['numExecutableLines']; + $linesBar = $this->coverageBar($data['linesExecutedPercent']); + } else { + $linesLevel = ''; + $linesNumber = '0' . $numSeparator . '0'; + $linesBar = ''; + $data['linesExecutedPercentAsString'] = 'n/a'; } - return new static($matches[1], $description); + if ($data['numExecutablePaths'] > 0) { + $pathsLevel = $this->colorLevel($data['pathsExecutedPercent']); + $pathsNumber = $data['numExecutedPaths'] . $numSeparator . $data['numExecutablePaths']; + $pathsBar = $this->coverageBar($data['pathsExecutedPercent']); + } else { + $pathsLevel = ''; + $pathsNumber = '0' . $numSeparator . '0'; + $pathsBar = ''; + $data['pathsExecutedPercentAsString'] = 'n/a'; + } + if ($data['numExecutableBranches'] > 0) { + $branchesLevel = $this->colorLevel($data['branchesExecutedPercent']); + $branchesNumber = $data['numExecutedBranches'] . $numSeparator . $data['numExecutableBranches']; + $branchesBar = $this->coverageBar($data['branchesExecutedPercent']); + } else { + $branchesLevel = ''; + $branchesNumber = '0' . $numSeparator . '0'; + $branchesBar = ''; + $data['branchesExecutedPercentAsString'] = 'n/a'; + } + $template->setVar(['icon' => $data['icon'] ?? '', 'crap' => $data['crap'] ?? '', 'name' => $data['name'], 'lines_bar' => $linesBar, 'lines_executed_percent' => $data['linesExecutedPercentAsString'], 'lines_level' => $linesLevel, 'lines_number' => $linesNumber, 'paths_bar' => $pathsBar, 'paths_executed_percent' => $data['pathsExecutedPercentAsString'], 'paths_level' => $pathsLevel, 'paths_number' => $pathsNumber, 'branches_bar' => $branchesBar, 'branches_executed_percent' => $data['branchesExecutedPercentAsString'], 'branches_level' => $branchesLevel, 'branches_number' => $branchesNumber, 'methods_bar' => $methodsBar, 'methods_tested_percent' => $data['testedMethodsPercentAsString'], 'methods_level' => $methodsLevel, 'methods_number' => $methodsNumber, 'classes_bar' => $classesBar, 'classes_tested_percent' => $data['testedClassesPercentAsString'] ?? '', 'classes_level' => $classesLevel, 'classes_number' => $classesNumber]); + return $template->render(); } - /** - * Gets the version section of the tag. - */ - public function getVersion() : ?string + protected function setCommonTemplateVariables(Template $template, AbstractNode $node) : void { - return $this->version; + $template->setVar(['id' => $node->id(), 'full_path' => $node->pathAsString(), 'path_to_root' => $this->pathToRoot($node), 'breadcrumbs' => $this->breadcrumbs($node), 'date' => $this->date, 'version' => $this->version, 'runtime' => $this->runtimeString(), 'generator' => $this->generator, 'low_upper_bound' => $this->lowUpperBound, 'high_lower_bound' => $this->highLowerBound]); } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string + protected function breadcrumbs(AbstractNode $node) : string + { + $breadcrumbs = ''; + $path = $node->pathAsArray(); + $pathToRoot = []; + $max = count($path); + if ($node instanceof FileNode) { + $max--; + } + for ($i = 0; $i < $max; $i++) { + $pathToRoot[] = str_repeat('../', $i); + } + foreach ($path as $step) { + if ($step !== $node) { + $breadcrumbs .= $this->inactiveBreadcrumb($step, array_pop($pathToRoot)); + } else { + $breadcrumbs .= $this->activeBreadcrumb($step); + } + } + return $breadcrumbs; + } + protected function activeBreadcrumb(AbstractNode $node) : string + { + $buffer = sprintf(' ' . "\n", $node->name()); + if ($node instanceof DirectoryNode) { + $buffer .= ' ' . "\n"; + } + return $buffer; + } + protected function inactiveBreadcrumb(AbstractNode $node, string $pathToRoot) : string + { + return sprintf(' ' . "\n", $pathToRoot, $node->name()); + } + protected function pathToRoot(AbstractNode $node) : string + { + $id = $node->id(); + $depth = substr_count($id, '/'); + if ($id !== 'index' && $node instanceof DirectoryNode) { + $depth++; + } + return str_repeat('../', $depth); + } + protected function coverageBar(float $percent) : string + { + $level = $this->colorLevel($percent); + $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'coverage_bar_branch.html' : 'coverage_bar.html'); + $template = new Template($templateName, '{{', '}}'); + $template->setVar(['level' => $level, 'percent' => sprintf('%.2F', $percent)]); + return $template->render(); + } + protected function colorLevel(float $percent) : string { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; + if ($percent <= $this->lowUpperBound) { + return 'danger'; } - $version = (string) $this->version; - return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); + if ($percent > $this->lowUpperBound && $percent < $this->highLowerBound) { + return 'warning'; + } + return 'success'; + } + private function runtimeString() : string + { + $runtime = new Runtime(); + return sprintf('%s %s', $runtime->getVendorUrl(), $runtime->getName(), $runtime->getVersion()); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Html; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; -use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; -use PHPUnit\Webmozart\Assert\Assert; -use function preg_match; +use function array_values; +use function arsort; +use function asort; +use function count; +use function explode; +use function floor; +use function json_encode; +use function sprintf; +use function str_replace; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\AbstractNode; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; +use PHPUnit\SebastianBergmann\Template\Template; /** - * Reflection class for a {@}deprecated tag in a Docblock. + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Deprecated extends BaseTag implements Factory\StaticMethod +final class Dashboard extends Renderer { - /** @var string */ - protected $name = 'deprecated'; + public function render(DirectoryNode $node, string $file) : void + { + $classes = $node->classesAndTraits(); + $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'dashboard_branch.html' : 'dashboard.html'); + $template = new Template($templateName, '{{', '}}'); + $this->setCommonTemplateVariables($template, $node); + $baseLink = $node->id() . '/'; + $complexity = $this->complexity($classes, $baseLink); + $coverageDistribution = $this->coverageDistribution($classes); + $insufficientCoverage = $this->insufficientCoverage($classes, $baseLink); + $projectRisks = $this->projectRisks($classes, $baseLink); + $template->setVar(['insufficient_coverage_classes' => $insufficientCoverage['class'], 'insufficient_coverage_methods' => $insufficientCoverage['method'], 'project_risks_classes' => $projectRisks['class'], 'project_risks_methods' => $projectRisks['method'], 'complexity_class' => $complexity['class'], 'complexity_method' => $complexity['method'], 'class_coverage_distribution' => $coverageDistribution['class'], 'method_coverage_distribution' => $coverageDistribution['method']]); + $template->renderTo($file); + } + protected function activeBreadcrumb(AbstractNode $node) : string + { + return sprintf(' ' . "\n" . ' ' . "\n", $node->name()); + } /** - * PCRE regular expression matching a version vector. - * Assumes the "x" modifier. + * Returns the data for the Class/Method Complexity charts. */ - public const REGEX_VECTOR = '(?: - # Normal release vectors. - \\d\\S* - | - # VCS version vectors. Per PHPCS, they are expected to - # follow the form of the VCS name, followed by ":", followed - # by the version vector itself. - # By convention, popular VCSes like CVS, SVN and GIT use "$" - # around the actual version vector. - [^\\s\\:]+\\:\\s*\\$[^\\$]+\\$ - )'; - /** @var string|null The version vector. */ - private $version; - public function __construct(?string $version = null, ?Description $description = null) + private function complexity(array $classes, string $baseLink) : array { - Assert::nullOrNotEmpty($version); - $this->version = $version; - $this->description = $description; + $result = ['class' => [], 'method' => []]; + foreach ($classes as $className => $class) { + foreach ($class['methods'] as $methodName => $method) { + if ($className !== '*') { + $methodName = $className . '::' . $methodName; + } + $result['method'][] = [$method['coverage'], $method['ccn'], sprintf('%s', str_replace($baseLink, '', $method['link']), $methodName)]; + } + $result['class'][] = [$class['coverage'], $class['ccn'], sprintf('%s', str_replace($baseLink, '', $class['link']), $className)]; + } + return ['class' => json_encode($result['class']), 'method' => json_encode($result['method'])]; } /** - * @return static + * Returns the data for the Class / Method Coverage Distribution chart. */ - public static function create(?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self + private function coverageDistribution(array $classes) : array { - if (empty($body)) { - return new static(); - } - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\\s*(.+)?$/sux', $body, $matches)) { - return new static(null, $descriptionFactory !== null ? $descriptionFactory->create($body, $context) : null); + $result = ['class' => ['0%' => 0, '0-10%' => 0, '10-20%' => 0, '20-30%' => 0, '30-40%' => 0, '40-50%' => 0, '50-60%' => 0, '60-70%' => 0, '70-80%' => 0, '80-90%' => 0, '90-100%' => 0, '100%' => 0], 'method' => ['0%' => 0, '0-10%' => 0, '10-20%' => 0, '20-30%' => 0, '30-40%' => 0, '40-50%' => 0, '50-60%' => 0, '60-70%' => 0, '70-80%' => 0, '80-90%' => 0, '90-100%' => 0, '100%' => 0]]; + foreach ($classes as $class) { + foreach ($class['methods'] as $methodName => $method) { + if ($method['coverage'] === 0) { + $result['method']['0%']++; + } elseif ($method['coverage'] === 100) { + $result['method']['100%']++; + } else { + $key = floor($method['coverage'] / 10) * 10; + $key = $key . '-' . ($key + 10) . '%'; + $result['method'][$key]++; + } + } + if ($class['coverage'] === 0) { + $result['class']['0%']++; + } elseif ($class['coverage'] === 100) { + $result['class']['100%']++; + } else { + $key = floor($class['coverage'] / 10) * 10; + $key = $key . '-' . ($key + 10) . '%'; + $result['class'][$key]++; + } } - Assert::notNull($descriptionFactory); - return new static($matches[1], $descriptionFactory->create($matches[2] ?? '', $context)); + return ['class' => json_encode(array_values($result['class'])), 'method' => json_encode(array_values($result['method']))]; } /** - * Gets the version section of the tag. + * Returns the classes / methods with insufficient coverage. */ - public function getVersion() : ?string + private function insufficientCoverage(array $classes, string $baseLink) : array { - return $this->version; + $leastTestedClasses = []; + $leastTestedMethods = []; + $result = ['class' => '', 'method' => '']; + foreach ($classes as $className => $class) { + foreach ($class['methods'] as $methodName => $method) { + if ($method['coverage'] < $this->highLowerBound) { + $key = $methodName; + if ($className !== '*') { + $key = $className . '::' . $methodName; + } + $leastTestedMethods[$key] = $method['coverage']; + } + } + if ($class['coverage'] < $this->highLowerBound) { + $leastTestedClasses[$className] = $class['coverage']; + } + } + asort($leastTestedClasses); + asort($leastTestedMethods); + foreach ($leastTestedClasses as $className => $coverage) { + $result['class'] .= sprintf(' %s%d%%' . "\n", str_replace($baseLink, '', $classes[$className]['link']), $className, $coverage); + } + foreach ($leastTestedMethods as $methodName => $coverage) { + [$class, $method] = explode('::', $methodName); + $result['method'] .= sprintf(' %s%d%%' . "\n", str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), $methodName, $method, $coverage); + } + return $result; } /** - * Returns a string representation for this tag. + * Returns the project risks according to the CRAP index. */ - public function __toString() : string + private function projectRisks(array $classes, string $baseLink) : array { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; + $classRisks = []; + $methodRisks = []; + $result = ['class' => '', 'method' => '']; + foreach ($classes as $className => $class) { + foreach ($class['methods'] as $methodName => $method) { + if ($method['coverage'] < $this->highLowerBound && $method['ccn'] > 1) { + $key = $methodName; + if ($className !== '*') { + $key = $className . '::' . $methodName; + } + $methodRisks[$key] = $method['crap']; + } + } + if ($class['coverage'] < $this->highLowerBound && $class['ccn'] > count($class['methods'])) { + $classRisks[$className] = $class['crap']; + } } - $version = (string) $this->version; - return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); + arsort($classRisks); + arsort($methodRisks); + foreach ($classRisks as $className => $crap) { + $result['class'] .= sprintf(' %s%d' . "\n", str_replace($baseLink, '', $classes[$className]['link']), $className, $crap); + } + foreach ($methodRisks as $methodName => $crap) { + [$class, $method] = explode('::', $methodName); + $result['method'] .= sprintf(' %s%d' . "\n", str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), $methodName, $method, $crap); + } + return $result; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Html; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; -use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; -use PHPUnit\phpDocumentor\Reflection\Utils; -use PHPUnit\Webmozart\Assert\Assert; +use function count; +use function sprintf; +use function str_repeat; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\AbstractNode as Node; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; +use PHPUnit\SebastianBergmann\Template\Template; /** - * Reflection class for a {@}link tag in a Docblock. + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Link extends BaseTag implements Factory\StaticMethod +final class Directory extends Renderer { - /** @var string */ - protected $name = 'link'; - /** @var string */ - private $link; - /** - * Initializes a link to a URL. - */ - public function __construct(string $link, ?Description $description = null) - { - $this->link = $link; - $this->description = $description; - } - public static function create(string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::notNull($descriptionFactory); - $parts = Utils::pregSplit('/\\s+/Su', $body, 2); - $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; - return new static($parts[0], $description); - } - /** - * Gets the link - */ - public function getLink() : string + public function render(DirectoryNode $node, string $file) : void { - return $this->link; + $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'directory_branch.html' : 'directory.html'); + $template = new Template($templateName, '{{', '}}'); + $this->setCommonTemplateVariables($template, $node); + $items = $this->renderItem($node, \true); + foreach ($node->directories() as $item) { + $items .= $this->renderItem($item); + } + foreach ($node->files() as $item) { + $items .= $this->renderItem($item); + } + $template->setVar(['id' => $node->id(), 'items' => $items]); + $template->renderTo($file); } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string + private function renderItem(Node $node, bool $total = \false) : string { - if ($this->description) { - $description = $this->description->render(); + $data = ['numClasses' => $node->numberOfClassesAndTraits(), 'numTestedClasses' => $node->numberOfTestedClassesAndTraits(), 'numMethods' => $node->numberOfFunctionsAndMethods(), 'numTestedMethods' => $node->numberOfTestedFunctionsAndMethods(), 'linesExecutedPercent' => $node->percentageOfExecutedLines()->asFloat(), 'linesExecutedPercentAsString' => $node->percentageOfExecutedLines()->asString(), 'numExecutedLines' => $node->numberOfExecutedLines(), 'numExecutableLines' => $node->numberOfExecutableLines(), 'branchesExecutedPercent' => $node->percentageOfExecutedBranches()->asFloat(), 'branchesExecutedPercentAsString' => $node->percentageOfExecutedBranches()->asString(), 'numExecutedBranches' => $node->numberOfExecutedBranches(), 'numExecutableBranches' => $node->numberOfExecutableBranches(), 'pathsExecutedPercent' => $node->percentageOfExecutedPaths()->asFloat(), 'pathsExecutedPercentAsString' => $node->percentageOfExecutedPaths()->asString(), 'numExecutedPaths' => $node->numberOfExecutedPaths(), 'numExecutablePaths' => $node->numberOfExecutablePaths(), 'testedMethodsPercent' => $node->percentageOfTestedFunctionsAndMethods()->asFloat(), 'testedMethodsPercentAsString' => $node->percentageOfTestedFunctionsAndMethods()->asString(), 'testedClassesPercent' => $node->percentageOfTestedClassesAndTraits()->asFloat(), 'testedClassesPercentAsString' => $node->percentageOfTestedClassesAndTraits()->asString()]; + if ($total) { + $data['name'] = 'Total'; } else { - $description = ''; + $up = str_repeat('../', count($node->pathAsArray()) - 2); + $data['icon'] = sprintf('', $up); + if ($node instanceof DirectoryNode) { + $data['name'] = sprintf('%s', $node->name(), $node->name()); + $data['icon'] = sprintf('', $up); + } elseif ($this->hasBranchCoverage) { + $data['name'] = sprintf('%s [line] [branch] [path]', $node->name(), $node->name(), $node->name(), $node->name()); + } else { + $data['name'] = sprintf('%s', $node->name(), $node->name()); + } } - $link = (string) $this->link; - return $link . ($description !== '' ? ($link !== '' ? ' ' : '') . $description : ''); + $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'directory_item_branch.html' : 'directory_item.html'); + return $this->renderItemTemplate(new Template($templateName, '{{', '}}'), $data); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Html; -use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; -use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; -use PHPUnit\phpDocumentor\Reflection\Type; -use PHPUnit\phpDocumentor\Reflection\TypeResolver; -use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; -use PHPUnit\phpDocumentor\Reflection\Utils; -use PHPUnit\Webmozart\Assert\Assert; -use function array_shift; -use function array_unshift; -use function implode; -use function strpos; +use const ENT_COMPAT; +use const ENT_HTML401; +use const ENT_SUBSTITUTE; +use const T_ABSTRACT; +use const T_ARRAY; +use const T_AS; +use const T_BREAK; +use const T_CALLABLE; +use const T_CASE; +use const T_CATCH; +use const T_CLASS; +use const T_CLONE; +use const T_COMMENT; +use const T_CONST; +use const T_CONTINUE; +use const T_DECLARE; +use const T_DEFAULT; +use const T_DO; +use const T_DOC_COMMENT; +use const T_ECHO; +use const T_ELSE; +use const T_ELSEIF; +use const T_EMPTY; +use const T_ENDDECLARE; +use const T_ENDFOR; +use const T_ENDFOREACH; +use const T_ENDIF; +use const T_ENDSWITCH; +use const T_ENDWHILE; +use const T_EVAL; +use const T_EXIT; +use const T_EXTENDS; +use const T_FINAL; +use const T_FINALLY; +use const T_FOR; +use const T_FOREACH; +use const T_FUNCTION; +use const T_GLOBAL; +use const T_GOTO; +use const T_HALT_COMPILER; +use const T_IF; +use const T_IMPLEMENTS; +use const T_INCLUDE; +use const T_INCLUDE_ONCE; +use const T_INLINE_HTML; +use const T_INSTANCEOF; +use const T_INSTEADOF; +use const T_INTERFACE; +use const T_ISSET; +use const T_LIST; +use const T_NAMESPACE; +use const T_NEW; +use const T_PRINT; +use const T_PRIVATE; +use const T_PROTECTED; +use const T_PUBLIC; +use const T_REQUIRE; +use const T_REQUIRE_ONCE; +use const T_RETURN; +use const T_STATIC; +use const T_SWITCH; +use const T_THROW; +use const T_TRAIT; +use const T_TRY; +use const T_UNSET; +use const T_USE; +use const T_VAR; +use const T_WHILE; +use const T_YIELD; +use const T_YIELD_FROM; +use function array_key_exists; +use function array_pop; +use function array_unique; +use function constant; +use function count; +use function defined; +use function explode; +use function file_get_contents; +use function htmlspecialchars; +use function is_string; +use function sprintf; +use function str_replace; use function substr; -use const PREG_SPLIT_DELIM_CAPTURE; +use function token_get_all; +use function trim; +use PHPUnit\Runner\BaseTestRunner; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\File as FileNode; +use PHPUnit\SebastianBergmann\CodeCoverage\Util\Percentage; +use PHPUnit\SebastianBergmann\Template\Template; /** - * Reflection class for a {@}var tag in a Docblock. + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Var_ extends TagWithType implements Factory\StaticMethod +final class File extends Renderer { - /** @var string|null */ - protected $variableName = ''; - public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) - { - Assert::string($variableName); - $this->name = 'var'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self - { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - [$firstPart, $body] = self::extractTypeFromBody($body); - $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, \PREG_SPLIT_DELIM_CAPTURE); - $type = null; - $variableName = ''; - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - Assert::notNull($variableName); - $variableName = substr($variableName, 1); - } - $description = $descriptionFactory->create(implode('', $parts), $context); - return new static($variableName, $type, $description); - } /** - * Returns the variable's name. + * @psalm-var array */ - public function getVariableName() : ?string - { - return $this->variableName; - } + private static $keywordTokens = []; /** - * Returns a string representation for this tag. + * @var array */ - public function __toString() : string + private static $formattedSourceCache = []; + /** + * @var int + */ + private $htmlSpecialCharsFlags = ENT_COMPAT | ENT_HTML401 | ENT_SUBSTITUTE; + public function render(FileNode $node, string $file) : void { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; + $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'file_branch.html' : 'file.html'); + $template = new Template($templateName, '{{', '}}'); + $this->setCommonTemplateVariables($template, $node); + $template->setVar(['items' => $this->renderItems($node), 'lines' => $this->renderSourceWithLineCoverage($node), 'legend' => '

ExecutedNot ExecutedDead Code

', 'structure' => '']); + $template->renderTo($file . '.html'); + if ($this->hasBranchCoverage) { + $template->setVar(['items' => $this->renderItems($node), 'lines' => $this->renderSourceWithBranchCoverage($node), 'legend' => '

Fully coveredPartially coveredNot covered

', 'structure' => $this->renderBranchStructure($node)]); + $template->renderTo($file . '_branch.html'); + $template->setVar(['items' => $this->renderItems($node), 'lines' => $this->renderSourceWithPathCoverage($node), 'legend' => '

Fully coveredPartially coveredNot covered

', 'structure' => $this->renderPathStructure($node)]); + $template->renderTo($file . '_path.html'); } - $type = (string) $this->type; - return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } -} -templatePath . ($this->hasBranchCoverage ? 'file_item_branch.html' : 'file_item.html'); + $template = new Template($templateName, '{{', '}}'); + $methodTemplateName = $this->templatePath . ($this->hasBranchCoverage ? 'method_item_branch.html' : 'method_item.html'); + $methodItemTemplate = new Template($methodTemplateName, '{{', '}}'); + $items = $this->renderItemTemplate($template, ['name' => 'Total', 'numClasses' => $node->numberOfClassesAndTraits(), 'numTestedClasses' => $node->numberOfTestedClassesAndTraits(), 'numMethods' => $node->numberOfFunctionsAndMethods(), 'numTestedMethods' => $node->numberOfTestedFunctionsAndMethods(), 'linesExecutedPercent' => $node->percentageOfExecutedLines()->asFloat(), 'linesExecutedPercentAsString' => $node->percentageOfExecutedLines()->asString(), 'numExecutedLines' => $node->numberOfExecutedLines(), 'numExecutableLines' => $node->numberOfExecutableLines(), 'branchesExecutedPercent' => $node->percentageOfExecutedBranches()->asFloat(), 'branchesExecutedPercentAsString' => $node->percentageOfExecutedBranches()->asString(), 'numExecutedBranches' => $node->numberOfExecutedBranches(), 'numExecutableBranches' => $node->numberOfExecutableBranches(), 'pathsExecutedPercent' => $node->percentageOfExecutedPaths()->asFloat(), 'pathsExecutedPercentAsString' => $node->percentageOfExecutedPaths()->asString(), 'numExecutedPaths' => $node->numberOfExecutedPaths(), 'numExecutablePaths' => $node->numberOfExecutablePaths(), 'testedMethodsPercent' => $node->percentageOfTestedFunctionsAndMethods()->asFloat(), 'testedMethodsPercentAsString' => $node->percentageOfTestedFunctionsAndMethods()->asString(), 'testedClassesPercent' => $node->percentageOfTestedClassesAndTraits()->asFloat(), 'testedClassesPercentAsString' => $node->percentageOfTestedClassesAndTraits()->asString(), 'crap' => 'CRAP']); + $items .= $this->renderFunctionItems($node->functions(), $methodItemTemplate); + $items .= $this->renderTraitOrClassItems($node->traits(), $template, $methodItemTemplate); + $items .= $this->renderTraitOrClassItems($node->classes(), $template, $methodItemTemplate); + return $items; + } + private function renderTraitOrClassItems(array $items, Template $template, Template $methodItemTemplate) : string { - $this->name = 'return'; - $this->type = $type; - $this->description = $description; + $buffer = ''; + if (empty($items)) { + return $buffer; + } + foreach ($items as $name => $item) { + $numMethods = 0; + $numTestedMethods = 0; + foreach ($item['methods'] as $method) { + if ($method['executableLines'] > 0) { + $numMethods++; + if ($method['executedLines'] === $method['executableLines']) { + $numTestedMethods++; + } + } + } + if ($item['executableLines'] > 0) { + $numClasses = 1; + $numTestedClasses = $numTestedMethods === $numMethods ? 1 : 0; + $linesExecutedPercentAsString = Percentage::fromFractionAndTotal($item['executedLines'], $item['executableLines'])->asString(); + $branchesExecutedPercentAsString = Percentage::fromFractionAndTotal($item['executedBranches'], $item['executableBranches'])->asString(); + $pathsExecutedPercentAsString = Percentage::fromFractionAndTotal($item['executedPaths'], $item['executablePaths'])->asString(); + } else { + $numClasses = 0; + $numTestedClasses = 0; + $linesExecutedPercentAsString = 'n/a'; + $branchesExecutedPercentAsString = 'n/a'; + $pathsExecutedPercentAsString = 'n/a'; + } + $testedMethodsPercentage = Percentage::fromFractionAndTotal($numTestedMethods, $numMethods); + $testedClassesPercentage = Percentage::fromFractionAndTotal($numTestedMethods === $numMethods ? 1 : 0, 1); + $buffer .= $this->renderItemTemplate($template, ['name' => $this->abbreviateClassName($name), 'numClasses' => $numClasses, 'numTestedClasses' => $numTestedClasses, 'numMethods' => $numMethods, 'numTestedMethods' => $numTestedMethods, 'linesExecutedPercent' => Percentage::fromFractionAndTotal($item['executedLines'], $item['executableLines'])->asFloat(), 'linesExecutedPercentAsString' => $linesExecutedPercentAsString, 'numExecutedLines' => $item['executedLines'], 'numExecutableLines' => $item['executableLines'], 'branchesExecutedPercent' => Percentage::fromFractionAndTotal($item['executedBranches'], $item['executableBranches'])->asFloat(), 'branchesExecutedPercentAsString' => $branchesExecutedPercentAsString, 'numExecutedBranches' => $item['executedBranches'], 'numExecutableBranches' => $item['executableBranches'], 'pathsExecutedPercent' => Percentage::fromFractionAndTotal($item['executedPaths'], $item['executablePaths'])->asFloat(), 'pathsExecutedPercentAsString' => $pathsExecutedPercentAsString, 'numExecutedPaths' => $item['executedPaths'], 'numExecutablePaths' => $item['executablePaths'], 'testedMethodsPercent' => $testedMethodsPercentage->asFloat(), 'testedMethodsPercentAsString' => $testedMethodsPercentage->asString(), 'testedClassesPercent' => $testedClassesPercentage->asFloat(), 'testedClassesPercentAsString' => $testedClassesPercentage->asString(), 'crap' => $item['crap']]); + foreach ($item['methods'] as $method) { + $buffer .= $this->renderFunctionOrMethodItem($methodItemTemplate, $method, ' '); + } + } + return $buffer; } - public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self + private function renderFunctionItems(array $functions, Template $template) : string { - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - [$type, $description] = self::extractTypeFromBody($body); - $type = $typeResolver->resolve($type, $context); - $description = $descriptionFactory->create($description, $context); - return new static($type, $description); + if (empty($functions)) { + return ''; + } + $buffer = ''; + foreach ($functions as $function) { + $buffer .= $this->renderFunctionOrMethodItem($template, $function); + } + return $buffer; } - public function __toString() : string + private function renderFunctionOrMethodItem(Template $template, array $item, string $indent = '') : string { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; + $numMethods = 0; + $numTestedMethods = 0; + if ($item['executableLines'] > 0) { + $numMethods = 1; + if ($item['executedLines'] === $item['executableLines']) { + $numTestedMethods = 1; + } } - $type = $this->type ? '' . $this->type : 'mixed'; - return $type . ($description !== '' ? ($type !== '' ? ' ' : '') . $description : ''); + $executedLinesPercentage = Percentage::fromFractionAndTotal($item['executedLines'], $item['executableLines']); + $executedBranchesPercentage = Percentage::fromFractionAndTotal($item['executedBranches'], $item['executableBranches']); + $executedPathsPercentage = Percentage::fromFractionAndTotal($item['executedPaths'], $item['executablePaths']); + $testedMethodsPercentage = Percentage::fromFractionAndTotal($numTestedMethods, 1); + return $this->renderItemTemplate($template, ['name' => sprintf('%s%s', $indent, $item['startLine'], htmlspecialchars($item['signature'], $this->htmlSpecialCharsFlags), $item['functionName'] ?? $item['methodName']), 'numMethods' => $numMethods, 'numTestedMethods' => $numTestedMethods, 'linesExecutedPercent' => $executedLinesPercentage->asFloat(), 'linesExecutedPercentAsString' => $executedLinesPercentage->asString(), 'numExecutedLines' => $item['executedLines'], 'numExecutableLines' => $item['executableLines'], 'branchesExecutedPercent' => $executedBranchesPercentage->asFloat(), 'branchesExecutedPercentAsString' => $executedBranchesPercentage->asString(), 'numExecutedBranches' => $item['executedBranches'], 'numExecutableBranches' => $item['executableBranches'], 'pathsExecutedPercent' => $executedPathsPercentage->asFloat(), 'pathsExecutedPercentAsString' => $executedPathsPercentage->asString(), 'numExecutedPaths' => $item['executedPaths'], 'numExecutablePaths' => $item['executablePaths'], 'testedMethodsPercent' => $testedMethodsPercentage->asFloat(), 'testedMethodsPercentAsString' => $testedMethodsPercentage->asString(), 'crap' => $item['crap']]); } -} -refers = $refers; - $this->description = $description; + $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); + $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); + $coverageData = $node->lineCoverageData(); + $testData = $node->testData(); + $codeLines = $this->loadFile($node->pathAsString()); + $lines = ''; + $i = 1; + foreach ($codeLines as $line) { + $trClass = ''; + $popoverContent = ''; + $popoverTitle = ''; + if (array_key_exists($i, $coverageData)) { + $numTests = $coverageData[$i] ? count($coverageData[$i]) : 0; + if ($coverageData[$i] === null) { + $trClass = 'warning'; + } elseif ($numTests === 0) { + $trClass = 'danger'; + } else { + if ($numTests > 1) { + $popoverTitle = $numTests . ' tests cover line ' . $i; + } else { + $popoverTitle = '1 test covers line ' . $i; + } + $lineCss = 'covered-by-large-tests'; + $popoverContent = '
    '; + foreach ($coverageData[$i] as $test) { + if ($lineCss === 'covered-by-large-tests' && $testData[$test]['size'] === 'medium') { + $lineCss = 'covered-by-medium-tests'; + } elseif ($testData[$test]['size'] === 'small') { + $lineCss = 'covered-by-small-tests'; + } + $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); + } + $popoverContent .= '
'; + $trClass = $lineCss . ' popin'; + } + } + $popover = ''; + if (!empty($popoverTitle)) { + $popover = sprintf(' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags)); + } + $lines .= $this->renderLine($singleLineTemplate, $i, $line, $trClass, $popover); + $i++; + } + $linesTemplate->setVar(['lines' => $lines]); + return $linesTemplate->render(); } - public static function create(string $body, ?DescriptionFactory $descriptionFactory = null, ?FqsenResolver $resolver = null, ?TypeContext $context = null) : self + private function renderSourceWithBranchCoverage(FileNode $node) : string { - Assert::stringNotEmpty($body); - Assert::notNull($descriptionFactory); - Assert::notNull($resolver); - $parts = Utils::pregSplit('/\\s+/Su', $body, 2); - return new static(self::resolveFqsen($parts[0], $resolver, $context), $descriptionFactory->create($parts[1] ?? '', $context)); + $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); + $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); + $functionCoverageData = $node->functionCoverageData(); + $testData = $node->testData(); + $codeLines = $this->loadFile($node->pathAsString()); + $lineData = []; + /** @var int $line */ + foreach (\array_keys($codeLines) as $line) { + $lineData[$line + 1] = ['includedInBranches' => 0, 'includedInHitBranches' => 0, 'tests' => []]; + } + foreach ($functionCoverageData as $method) { + foreach ($method['branches'] as $branch) { + foreach (\range($branch['line_start'], $branch['line_end']) as $line) { + if (!isset($lineData[$line])) { + // blank line at end of file is sometimes included here + continue; + } + $lineData[$line]['includedInBranches']++; + if ($branch['hit']) { + $lineData[$line]['includedInHitBranches']++; + $lineData[$line]['tests'] = array_unique(\array_merge($lineData[$line]['tests'], $branch['hit'])); + } + } + } + } + $lines = ''; + $i = 1; + /** @var string $line */ + foreach ($codeLines as $line) { + $trClass = ''; + $popover = ''; + if ($lineData[$i]['includedInBranches'] > 0) { + $lineCss = 'success'; + if ($lineData[$i]['includedInHitBranches'] === 0) { + $lineCss = 'danger'; + } elseif ($lineData[$i]['includedInHitBranches'] !== $lineData[$i]['includedInBranches']) { + $lineCss = 'warning'; + } + $popoverContent = '
    '; + if (count($lineData[$i]['tests']) === 1) { + $popoverTitle = '1 test covers line ' . $i; + } else { + $popoverTitle = count($lineData[$i]['tests']) . ' tests cover line ' . $i; + } + $popoverTitle .= '. These are covering ' . $lineData[$i]['includedInHitBranches'] . ' out of the ' . $lineData[$i]['includedInBranches'] . ' code branches.'; + foreach ($lineData[$i]['tests'] as $test) { + $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); + } + $popoverContent .= '
'; + $trClass = $lineCss . ' popin'; + $popover = sprintf(' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags)); + } + $lines .= $this->renderLine($singleLineTemplate, $i, $line, $trClass, $popover); + $i++; + } + $linesTemplate->setVar(['lines' => $lines]); + return $linesTemplate->render(); } - private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen + private function renderSourceWithPathCoverage(FileNode $node) : string { - Assert::notNull($fqsenResolver); - $fqsenParts = explode('::', $parts); - $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); - if (!array_key_exists(1, $fqsenParts)) { - return $resolved; + $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); + $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); + $functionCoverageData = $node->functionCoverageData(); + $testData = $node->testData(); + $codeLines = $this->loadFile($node->pathAsString()); + $lineData = []; + /** @var int $line */ + foreach (\array_keys($codeLines) as $line) { + $lineData[$line + 1] = ['includedInPaths' => [], 'includedInHitPaths' => [], 'tests' => []]; } - return new Fqsen($resolved . '::' . $fqsenParts[1]); + foreach ($functionCoverageData as $method) { + foreach ($method['paths'] as $pathId => $path) { + foreach ($path['path'] as $branchTaken) { + foreach (\range($method['branches'][$branchTaken]['line_start'], $method['branches'][$branchTaken]['line_end']) as $line) { + if (!isset($lineData[$line])) { + continue; + } + $lineData[$line]['includedInPaths'][] = $pathId; + if ($path['hit']) { + $lineData[$line]['includedInHitPaths'][] = $pathId; + $lineData[$line]['tests'] = array_unique(\array_merge($lineData[$line]['tests'], $path['hit'])); + } + } + } + } + } + $lines = ''; + $i = 1; + /** @var string $line */ + foreach ($codeLines as $line) { + $trClass = ''; + $popover = ''; + $includedInPathsCount = count(array_unique($lineData[$i]['includedInPaths'])); + $includedInHitPathsCount = count(array_unique($lineData[$i]['includedInHitPaths'])); + if ($includedInPathsCount > 0) { + $lineCss = 'success'; + if ($includedInHitPathsCount === 0) { + $lineCss = 'danger'; + } elseif ($includedInHitPathsCount !== $includedInPathsCount) { + $lineCss = 'warning'; + } + $popoverContent = '
    '; + if (count($lineData[$i]['tests']) === 1) { + $popoverTitle = '1 test covers line ' . $i; + } else { + $popoverTitle = count($lineData[$i]['tests']) . ' tests cover line ' . $i; + } + $popoverTitle .= '. These are covering ' . $includedInHitPathsCount . ' out of the ' . $includedInPathsCount . ' code paths.'; + foreach ($lineData[$i]['tests'] as $test) { + $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); + } + $popoverContent .= '
'; + $trClass = $lineCss . ' popin'; + $popover = sprintf(' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags)); + } + $lines .= $this->renderLine($singleLineTemplate, $i, $line, $trClass, $popover); + $i++; + } + $linesTemplate->setVar(['lines' => $lines]); + return $linesTemplate->render(); } - /** - * Returns the structural element this tag refers to. - */ - public function getReference() : Fqsen + private function renderBranchStructure(FileNode $node) : string { - return $this->refers; + $branchesTemplate = new Template($this->templatePath . 'branches.html.dist', '{{', '}}'); + $coverageData = $node->functionCoverageData(); + $testData = $node->testData(); + $codeLines = $this->loadFile($node->pathAsString()); + $branches = ''; + \ksort($coverageData); + foreach ($coverageData as $methodName => $methodData) { + if (!$methodData['branches']) { + continue; + } + $branchStructure = ''; + foreach ($methodData['branches'] as $branch) { + $branchStructure .= $this->renderBranchLines($branch, $codeLines, $testData); + } + if ($branchStructure !== '') { + // don't show empty branches + $branches .= '
' . $this->abbreviateMethodName($methodName) . '
' . "\n"; + $branches .= $branchStructure; + } + } + $branchesTemplate->setVar(['branches' => $branches]); + return $branchesTemplate->render(); } - /** - * Returns a string representation of this tag. - */ - public function __toString() : string + private function renderBranchLines(array $branch, array $codeLines, array $testData) : string { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; + $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); + $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); + $lines = ''; + $branchLines = \range($branch['line_start'], $branch['line_end']); + \sort($branchLines); + // sometimes end_line < start_line + /** @var int $line */ + foreach ($branchLines as $line) { + if (!isset($codeLines[$line])) { + // blank line at end of file is sometimes included here + continue; + } + $popoverContent = ''; + $popoverTitle = ''; + $numTests = count($branch['hit']); + if ($numTests === 0) { + $trClass = 'danger'; + } else { + $lineCss = 'covered-by-large-tests'; + $popoverContent = '
    '; + if ($numTests > 1) { + $popoverTitle = $numTests . ' tests cover this branch'; + } else { + $popoverTitle = '1 test covers this branch'; + } + foreach ($branch['hit'] as $test) { + if ($lineCss === 'covered-by-large-tests' && $testData[$test]['size'] === 'medium') { + $lineCss = 'covered-by-medium-tests'; + } elseif ($testData[$test]['size'] === 'small') { + $lineCss = 'covered-by-small-tests'; + } + $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); + } + $trClass = $lineCss . ' popin'; + } + $popover = ''; + if (!empty($popoverTitle)) { + $popover = sprintf(' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags)); + } + $lines .= $this->renderLine($singleLineTemplate, $line, $codeLines[$line - 1], $trClass, $popover); } - $refers = (string) $this->refers; - return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); + if ($lines === '') { + return ''; + } + $linesTemplate->setVar(['lines' => $lines]); + return $linesTemplate->render(); } -} -filePath = $filePath; - $this->startingLine = $startingLine; - $this->lineCount = $lineCount; - if ($content !== null) { - $this->content = trim($content); + $pathsTemplate = new Template($this->templatePath . 'paths.html.dist', '{{', '}}'); + $coverageData = $node->functionCoverageData(); + $testData = $node->testData(); + $codeLines = $this->loadFile($node->pathAsString()); + $paths = ''; + \ksort($coverageData); + foreach ($coverageData as $methodName => $methodData) { + if (!$methodData['paths']) { + continue; + } + $pathStructure = ''; + if (count($methodData['paths']) > 100) { + $pathStructure .= '

    ' . count($methodData['paths']) . ' is too many paths to sensibly render, consider refactoring your code to bring this number down.

    '; + continue; + } + foreach ($methodData['paths'] as $path) { + $pathStructure .= $this->renderPathLines($path, $methodData['branches'], $codeLines, $testData); + } + if ($pathStructure !== '') { + $paths .= '
    ' . $this->abbreviateMethodName($methodName) . '
    ' . "\n"; + $paths .= $pathStructure; + } } - $this->isURI = $isURI; + $pathsTemplate->setVar(['paths' => $paths]); + return $pathsTemplate->render(); } - public function getContent() : string + private function renderPathLines(array $path, array $branches, array $codeLines, array $testData) : string { - if ($this->content === null || $this->content === '') { - $filePath = $this->filePath; - if ($this->isURI) { - $filePath = $this->isUriRelative($this->filePath) ? str_replace('%2F', '/', rawurlencode($this->filePath)) : $this->filePath; + $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); + $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); + $lines = ''; + $first = \true; + foreach ($path['path'] as $branchId) { + if ($first) { + $first = \false; + } else { + $lines .= '  ' . "\n"; + } + $branchLines = \range($branches[$branchId]['line_start'], $branches[$branchId]['line_end']); + \sort($branchLines); + // sometimes end_line < start_line + /** @var int $line */ + foreach ($branchLines as $line) { + if (!isset($codeLines[$line])) { + // blank line at end of file is sometimes included here + continue; + } + $popoverContent = ''; + $popoverTitle = ''; + $numTests = count($path['hit']); + if ($numTests === 0) { + $trClass = 'danger'; + } else { + $lineCss = 'covered-by-large-tests'; + $popoverContent = '
      '; + if ($numTests > 1) { + $popoverTitle = $numTests . ' tests cover this path'; + } else { + $popoverTitle = '1 test covers this path'; + } + foreach ($path['hit'] as $test) { + if ($lineCss === 'covered-by-large-tests' && $testData[$test]['size'] === 'medium') { + $lineCss = 'covered-by-medium-tests'; + } elseif ($testData[$test]['size'] === 'small') { + $lineCss = 'covered-by-small-tests'; + } + $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); + } + $trClass = $lineCss . ' popin'; + } + $popover = ''; + if (!empty($popoverTitle)) { + $popover = sprintf(' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags)); + } + $lines .= $this->renderLine($singleLineTemplate, $line, $codeLines[$line - 1], $trClass, $popover); } - return trim($filePath); } - return $this->content; + if ($lines === '') { + return ''; + } + $linesTemplate->setVar(['lines' => $lines]); + return $linesTemplate->render(); } - public function getDescription() : ?string + private function renderLine(Template $template, int $lineNumber, string $lineContent, string $class, string $popover) : string { - return $this->content; + $template->setVar(['lineNumber' => $lineNumber, 'lineContent' => $lineContent, 'class' => $class, 'popover' => $popover]); + return $template->render(); } - public static function create(string $body) : ?Tag + private function loadFile(string $file) : array { - // File component: File path in quotes or File URI / Source information - if (!preg_match('/^\\s*(?:(\\"[^\\"]+\\")|(\\S+))(?:\\s+(.*))?$/sux', $body, $matches)) { - return null; - } - $filePath = null; - $fileUri = null; - if ($matches[1] !== '') { - $filePath = $matches[1]; - } else { - $fileUri = $matches[2]; + if (isset(self::$formattedSourceCache[$file])) { + return self::$formattedSourceCache[$file]; } - $startingLine = 1; - $lineCount = 0; - $description = null; - if (array_key_exists(3, $matches)) { - $description = $matches[3]; - // Starting line / Number of lines / Description - if (preg_match('/^([1-9]\\d*)(?:\\s+((?1))\\s*)?(.*)$/sux', $matches[3], $contentMatches)) { - $startingLine = (int) $contentMatches[1]; - if (isset($contentMatches[2])) { - $lineCount = (int) $contentMatches[2]; + $buffer = file_get_contents($file); + $tokens = token_get_all($buffer); + $result = ['']; + $i = 0; + $stringFlag = \false; + $fileEndsWithNewLine = substr($buffer, -1) === "\n"; + unset($buffer); + foreach ($tokens as $j => $token) { + if (is_string($token)) { + if ($token === '"' && $tokens[$j - 1] !== '\\') { + $result[$i] .= sprintf('%s', htmlspecialchars($token, $this->htmlSpecialCharsFlags)); + $stringFlag = !$stringFlag; + } else { + $result[$i] .= sprintf('%s', htmlspecialchars($token, $this->htmlSpecialCharsFlags)); } - if (array_key_exists(3, $contentMatches)) { - $description = $contentMatches[3]; + continue; + } + [$token, $value] = $token; + $value = str_replace(["\t", ' '], ['    ', ' '], htmlspecialchars($value, $this->htmlSpecialCharsFlags)); + if ($value === "\n") { + $result[++$i] = ''; + } else { + $lines = explode("\n", $value); + foreach ($lines as $jj => $line) { + $line = trim($line); + if ($line !== '') { + if ($stringFlag) { + $colour = 'string'; + } else { + $colour = 'default'; + if ($this->isInlineHtml($token)) { + $colour = 'html'; + } elseif ($this->isComment($token)) { + $colour = 'comment'; + } elseif ($this->isKeyword($token)) { + $colour = 'keyword'; + } + } + $result[$i] .= sprintf('%s', $colour, $line); + } + if (isset($lines[$jj + 1])) { + $result[++$i] = ''; + } } } } - return new static($filePath ?? $fileUri ?? '', $fileUri !== null, $startingLine, $lineCount, $description); + if ($fileEndsWithNewLine) { + unset($result[count($result) - 1]); + } + self::$formattedSourceCache[$file] = $result; + return $result; } - /** - * Returns the file path. - * - * @return string Path to a file to use as an example. - * May also be an absolute URI. - */ - public function getFilePath() : string + private function abbreviateClassName(string $className) : string { - return trim($this->filePath, '"'); + $tmp = explode('\\', $className); + if (count($tmp) > 1) { + $className = sprintf('%s', $className, array_pop($tmp)); + } + return $className; } - /** - * Returns a string representation for this tag. - */ - public function __toString() : string + private function abbreviateMethodName(string $methodName) : string { - $filePath = (string) $this->filePath; - $isDefaultLine = $this->startingLine === 1 && $this->lineCount === 0; - $startingLine = !$isDefaultLine ? (string) $this->startingLine : ''; - $lineCount = !$isDefaultLine ? (string) $this->lineCount : ''; - $content = (string) $this->content; - return $filePath . ($startingLine !== '' ? ($filePath !== '' ? ' ' : '') . $startingLine : '') . ($lineCount !== '' ? ($filePath !== '' || $startingLine !== '' ? ' ' : '') . $lineCount : '') . ($content !== '' ? ($filePath !== '' || $startingLine !== '' || $lineCount !== '' ? ' ' : '') . $content : ''); + $parts = explode('->', $methodName); + if (count($parts) === 2) { + return $this->abbreviateClassName($parts[0]) . '->' . $parts[1]; + } + return $methodName; } - /** - * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute). - */ - private function isUriRelative(string $uri) : bool + private function createPopoverContentForTest(string $test, array $testData) : string { - return strpos($uri, ':') === \false; + $testCSS = ''; + if ($testData['fromTestcase']) { + switch ($testData['status']) { + case BaseTestRunner::STATUS_PASSED: + switch ($testData['size']) { + case 'small': + $testCSS = ' class="covered-by-small-tests"'; + break; + case 'medium': + $testCSS = ' class="covered-by-medium-tests"'; + break; + default: + $testCSS = ' class="covered-by-large-tests"'; + break; + } + break; + case BaseTestRunner::STATUS_SKIPPED: + case BaseTestRunner::STATUS_INCOMPLETE: + case BaseTestRunner::STATUS_RISKY: + case BaseTestRunner::STATUS_WARNING: + $testCSS = ' class="warning"'; + break; + case BaseTestRunner::STATUS_FAILURE: + case BaseTestRunner::STATUS_ERROR: + $testCSS = ' class="danger"'; + break; + } + } + return sprintf('%s', $testCSS, htmlspecialchars($test, $this->htmlSpecialCharsFlags)); } - public function getStartingLine() : int + private function isComment(int $token) : bool { - return $this->startingLine; + return $token === T_COMMENT || $token === T_DOC_COMMENT; } - public function getLineCount() : int + private function isInlineHtml(int $token) : bool { - return $this->lineCount; + return $token === T_INLINE_HTML; } - public function getName() : string + private function isKeyword(int $token) : bool { - return 'example'; + return isset(self::keywordTokens()[$token]); } - public function render(?Formatter $formatter = null) : string + /** + * @psalm-return array + */ + private static function keywordTokens() : array { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); + if (self::$keywordTokens !== []) { + return self::$keywordTokens; } - return $formatter->format($this); + self::$keywordTokens = [T_ABSTRACT => \true, T_ARRAY => \true, T_AS => \true, T_BREAK => \true, T_CALLABLE => \true, T_CASE => \true, T_CATCH => \true, T_CLASS => \true, T_CLONE => \true, T_CONST => \true, T_CONTINUE => \true, T_DECLARE => \true, T_DEFAULT => \true, T_DO => \true, T_ECHO => \true, T_ELSE => \true, T_ELSEIF => \true, T_EMPTY => \true, T_ENDDECLARE => \true, T_ENDFOR => \true, T_ENDFOREACH => \true, T_ENDIF => \true, T_ENDSWITCH => \true, T_ENDWHILE => \true, T_EVAL => \true, T_EXIT => \true, T_EXTENDS => \true, T_FINAL => \true, T_FINALLY => \true, T_FOR => \true, T_FOREACH => \true, T_FUNCTION => \true, T_GLOBAL => \true, T_GOTO => \true, T_HALT_COMPILER => \true, T_IF => \true, T_IMPLEMENTS => \true, T_INCLUDE => \true, T_INCLUDE_ONCE => \true, T_INSTANCEOF => \true, T_INSTEADOF => \true, T_INTERFACE => \true, T_ISSET => \true, T_LIST => \true, T_NAMESPACE => \true, T_NEW => \true, T_PRINT => \true, T_PRIVATE => \true, T_PROTECTED => \true, T_PUBLIC => \true, T_REQUIRE => \true, T_REQUIRE_ONCE => \true, T_RETURN => \true, T_STATIC => \true, T_SWITCH => \true, T_THROW => \true, T_TRAIT => \true, T_TRY => \true, T_UNSET => \true, T_USE => \true, T_VAR => \true, T_WHILE => \true, T_YIELD => \true, T_YIELD_FROM => \true]; + if (defined('T_FN')) { + self::$keywordTokens[constant('T_FN')] = \true; + } + if (defined('T_MATCH')) { + self::$keywordTokens[constant('T_MATCH')] = \true; + } + if (defined('T_ENUM')) { + self::$keywordTokens[constant('T_ENUM')] = \true; + } + if (defined('T_READONLY')) { + self::$keywordTokens[constant('T_READONLY')] = \true; + } + return self::$keywordTokens; } } - +

      Branches

      +

      + Below are the source code lines that represent each code branch as identified by Xdebug. Please note a branch is not + necessarily coterminous with a line, a line may contain multiple branches and therefore show up more than once. + Please also be aware that some branches may be implicit rather than explicit, e.g. an if statement + always has an else as part of its logical flow even if you didn't write one. +

      +{{branches}} +
      +
      + {{percent}}% covered ({{level}}) +
      +
      +
      +
      + {{percent}}% covered ({{level}}) +
      +
      +/*! + * Bootstrap v4.6.1 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem)!important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:3rem!important;background-position:right 1.5rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem)!important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item,.nav-fill>.nav-link{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{-ms-flex-preferred-size:350px;flex-basis:350px;max-width:350px;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */.nvd3 .nv-axis{pointer-events:none;opacity:1}.nvd3 .nv-axis path{fill:none;stroke:#000;stroke-opacity:.75;shape-rendering:crispEdges}.nvd3 .nv-axis path.domain{stroke-opacity:.75}.nvd3 .nv-axis.nv-x path.domain{stroke-opacity:0}.nvd3 .nv-axis line{fill:none;stroke:#e5e5e5;shape-rendering:crispEdges}.nvd3 .nv-axis .zero line,.nvd3 .nv-axis line.zero{stroke-opacity:.75}.nvd3 .nv-axis .nv-axisMaxMin text{font-weight:700}.nvd3 .x .nv-axis .nv-axisMaxMin text,.nvd3 .x2 .nv-axis .nv-axisMaxMin text,.nvd3 .x3 .nv-axis .nv-axisMaxMin text{text-anchor:middle}.nvd3 .nv-axis.nv-disabled{opacity:0}.nvd3 .nv-bars rect{fill-opacity:.75;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-bars rect.hover{fill-opacity:1}.nvd3 .nv-bars .hover rect{fill:#add8e6}.nvd3 .nv-bars text{fill:rgba(0,0,0,0)}.nvd3 .nv-bars .hover text{fill:rgba(0,0,0,1)}.nvd3 .nv-multibar .nv-groups rect,.nvd3 .nv-multibarHorizontal .nv-groups rect,.nvd3 .nv-discretebar .nv-groups rect{stroke-opacity:0;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-multibar .nv-groups rect:hover,.nvd3 .nv-multibarHorizontal .nv-groups rect:hover,.nvd3 .nv-candlestickBar .nv-ticks rect:hover,.nvd3 .nv-discretebar .nv-groups rect:hover{fill-opacity:1}.nvd3 .nv-discretebar .nv-groups text,.nvd3 .nv-multibarHorizontal .nv-groups text{font-weight:700;fill:rgba(0,0,0,1);stroke:rgba(0,0,0,0)}.nvd3 .nv-boxplot circle{fill-opacity:.5}.nvd3 .nv-boxplot circle:hover{fill-opacity:1}.nvd3 .nv-boxplot rect:hover{fill-opacity:1}.nvd3 line.nv-boxplot-median{stroke:#000}.nv-boxplot-tick:hover{stroke-width:2.5px}.nvd3.nv-bullet{font:10px sans-serif}.nvd3.nv-bullet .nv-measure{fill-opacity:.8}.nvd3.nv-bullet .nv-measure:hover{fill-opacity:1}.nvd3.nv-bullet .nv-marker{stroke:#000;stroke-width:2px}.nvd3.nv-bullet .nv-markerTriangle{stroke:#000;fill:#fff;stroke-width:1.5px}.nvd3.nv-bullet .nv-tick line{stroke:#666;stroke-width:.5px}.nvd3.nv-bullet .nv-range.nv-s0{fill:#eee}.nvd3.nv-bullet .nv-range.nv-s1{fill:#ddd}.nvd3.nv-bullet .nv-range.nv-s2{fill:#ccc}.nvd3.nv-bullet .nv-title{font-size:14px;font-weight:700}.nvd3.nv-bullet .nv-subtitle{fill:#999}.nvd3.nv-bullet .nv-range{fill:#bababa;fill-opacity:.4}.nvd3.nv-bullet .nv-range:hover{fill-opacity:.7}.nvd3.nv-candlestickBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.positive rect{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.negative rect{stroke:#d62728;fill:#d62728}.with-transitions .nv-candlestickBar .nv-ticks .nv-tick{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-candlestickBar .nv-ticks line{stroke:#333}.nvd3 .nv-legend .nv-disabled rect{}.nvd3 .nv-check-box .nv-box{fill-opacity:0;stroke-width:2}.nvd3 .nv-check-box .nv-check{fill-opacity:0;stroke-width:4}.nvd3 .nv-series.nv-disabled .nv-check-box .nv-check{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-controlsWrap .nv-legend .nv-check-box .nv-check{opacity:0}.nvd3.nv-linePlusBar .nv-bar rect{fill-opacity:.75}.nvd3.nv-linePlusBar .nv-bar rect:hover{fill-opacity:1}.nvd3 .nv-groups path.nv-line{fill:none}.nvd3 .nv-groups path.nv-area{stroke:none}.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point{fill-opacity:0;stroke-opacity:0}.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point{fill-opacity:.5!important;stroke-opacity:.5!important}.with-transitions .nvd3 .nv-groups .nv-point{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-scatter .nv-groups .nv-point.hover,.nvd3 .nv-groups .nv-point.hover{stroke-width:7px;fill-opacity:.95!important;stroke-opacity:.95!important}.nvd3 .nv-point-paths path{stroke:#aaa;stroke-opacity:0;fill:#eee;fill-opacity:0}.nvd3 .nv-indexLine{cursor:ew-resize}svg.nvd3-svg{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-ms-user-select:none;-moz-user-select:none;user-select:none;display:block;width:100%;height:100%}.nvtooltip.with-3d-shadow,.with-3d-shadow .nvtooltip{-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nvd3 text{font:400 12px Arial}.nvd3 .title{font:700 14px Arial}.nvd3 .nv-background{fill:#fff;fill-opacity:0}.nvd3.nv-noData{font-size:18px;font-weight:700}.nv-brush .extent{fill-opacity:.125;shape-rendering:crispEdges}.nv-brush .resize path{fill:#eee;stroke:#666}.nvd3 .nv-legend .nv-series{cursor:pointer}.nvd3 .nv-legend .nv-disabled circle{fill-opacity:0}.nvd3 .nv-brush .extent{fill-opacity:0!important}.nvd3 .nv-brushBackground rect{stroke:#000;stroke-width:.4;fill:#fff;fill-opacity:.7}.nvd3.nv-ohlcBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.positive{stroke:#2ca02c}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.negative{stroke:#d62728}.nvd3 .background path{fill:none;stroke:#EEE;stroke-opacity:.4;shape-rendering:crispEdges}.nvd3 .foreground path{fill:none;stroke-opacity:.7}.nvd3 .nv-parallelCoordinates-brush .extent{fill:#fff;fill-opacity:.6;stroke:gray;shape-rendering:crispEdges}.nvd3 .nv-parallelCoordinates .hover{fill-opacity:1;stroke-width:3px}.nvd3 .missingValuesline line{fill:none;stroke:#000;stroke-width:1;stroke-opacity:1;stroke-dasharray:5,5}.nvd3.nv-pie path{stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-pie .nv-pie-title{font-size:24px;fill:rgba(19,196,249,.59)}.nvd3.nv-pie .nv-slice text{stroke:#000;stroke-width:0}.nvd3.nv-pie path{stroke:#fff;stroke-width:1px;stroke-opacity:1}.nvd3.nv-pie .hover path{fill-opacity:.7}.nvd3.nv-pie .nv-label{pointer-events:none}.nvd3.nv-pie .nv-label rect{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-groups .nv-point.hover{stroke-width:20px;stroke-opacity:.5}.nvd3 .nv-scatter .nv-point.hover{fill-opacity:1}.nv-noninteractive{pointer-events:none}.nv-distx,.nv-disty{pointer-events:none}.nvd3.nv-sparkline path{fill:none}.nvd3.nv-sparklineplus g.nv-hoverValue{pointer-events:none}.nvd3.nv-sparklineplus .nv-hoverValue line{stroke:#333;stroke-width:1.5px}.nvd3.nv-sparklineplus,.nvd3.nv-sparklineplus g{pointer-events:all}.nvd3 .nv-hoverArea{fill-opacity:0;stroke-opacity:0}.nvd3.nv-sparklineplus .nv-xValue,.nvd3.nv-sparklineplus .nv-yValue{stroke-width:0;font-size:.9em;font-weight:400}.nvd3.nv-sparklineplus .nv-yValue{stroke:#f66}.nvd3.nv-sparklineplus .nv-maxValue{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-sparklineplus .nv-minValue{stroke:#d62728;fill:#d62728}.nvd3.nv-sparklineplus .nv-currentValue{font-weight:700;font-size:1.1em}.nvd3.nv-stackedarea path.nv-area{fill-opacity:.7;stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-stackedarea path.nv-area.hover{fill-opacity:.9}.nvd3.nv-stackedarea .nv-groups .nv-point{stroke-opacity:0;fill-opacity:0}.nvtooltip{position:absolute;background-color:rgba(255,255,255,1);color:rgba(0,0,0,1);padding:1px;border:1px solid rgba(0,0,0,.2);z-index:10000;display:block;font-family:Arial;font-size:13px;text-align:left;pointer-events:none;white-space:nowrap;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.nvtooltip{background:rgba(255,255,255,.8);border:1px solid rgba(0,0,0,.5);border-radius:4px}.nvtooltip.with-transitions,.with-transitions .nvtooltip{transition:opacity 50ms linear;-moz-transition:opacity 50ms linear;-webkit-transition:opacity 50ms linear;transition-delay:200ms;-moz-transition-delay:200ms;-webkit-transition-delay:200ms}.nvtooltip.x-nvtooltip,.nvtooltip.y-nvtooltip{padding:8px}.nvtooltip h3{margin:0;padding:4px 14px;line-height:18px;font-weight:400;background-color:rgba(247,247,247,.75);color:rgba(0,0,0,1);text-align:center;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.nvtooltip p{margin:0;padding:5px 14px;text-align:center}.nvtooltip span{display:inline-block;margin:2px 0}.nvtooltip table{margin:6px;border-spacing:0}.nvtooltip table td{padding:2px 9px 2px 0;vertical-align:middle}.nvtooltip table td.key{font-weight:400}.nvtooltip table td.value{text-align:right;font-weight:700}.nvtooltip table tr.highlight td{padding:1px 9px 1px 0;border-bottom-style:solid;border-bottom-width:1px;border-top-style:solid;border-top-width:1px}.nvtooltip table td.legend-color-guide div{width:8px;height:8px;vertical-align:middle}.nvtooltip table td.legend-color-guide div{width:12px;height:12px;border:1px solid #999}.nvtooltip .footer{padding:3px;text-align:center}.nvtooltip-pending-removal{pointer-events:none;display:none}.nvd3 .nv-interactiveGuideLine{pointer-events:none}.nvd3 line.nv-guideline{stroke:#ccc}.octicon { + display: inline-block; + vertical-align: text-top; + fill: currentColor; +} +body { + padding-top: 10px; +} + +.popover { + max-width: none; +} + +.octicon { + margin-right:.25em; +} + +.table-bordered>thead>tr>td { + border-bottom-width: 1px; +} + +.table tbody>tr>td, .table thead>tr>td { + padding-top: 3px; + padding-bottom: 3px; +} + +.table-condensed tbody>tr>td { + padding-top: 0; + padding-bottom: 0; +} + +.table .progress { + margin-bottom: inherit; +} + +.table-borderless th, .table-borderless td { + border: 0 !important; +} + +.table tbody tr.covered-by-large-tests, li.covered-by-large-tests, tr.success, td.success, li.success, span.success { + background-color: #dff0d8; +} + +.table tbody tr.covered-by-medium-tests, li.covered-by-medium-tests { + background-color: #c3e3b5; +} + +.table tbody tr.covered-by-small-tests, li.covered-by-small-tests { + background-color: #99cb84; +} + +.table tbody tr.danger, .table tbody td.danger, li.danger, span.danger { + background-color: #f2dede; +} + +.table tbody tr.warning, .table tbody td.warning, li.warning, span.warning { + background-color: #fcf8e3; +} + +.table tbody td.info { + background-color: #d9edf7; +} + +td.big { + width: 117px; +} + +td.small { +} + +td.codeLine { + font-family: "Source Code Pro", "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + white-space: pre-wrap; +} + +td span.comment { + color: #888a85; +} + +td span.default { + color: #2e3436; +} + +td span.html { + color: #888a85; +} + +td span.keyword { + color: #2e3436; + font-weight: bold; +} + +pre span.string { + color: #2e3436; +} + +span.success, span.warning, span.danger { + margin-right: 2px; + padding-left: 10px; + padding-right: 10px; + text-align: center; +} + +#toplink { + position: fixed; + left: 5px; + bottom: 5px; + outline: 0; +} + +svg text { + font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; + color: #666; + fill: #666; +} + +.scrollbox { + height:245px; + overflow-x:hidden; + overflow-y:scroll; +} + +table + .structure-heading { + border-top: 1px solid lightgrey; + padding-top: 0.5em; +} + + + + + Dashboard for {{full_path}} + + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +

      Classes

      +
      +
      +
      +
      +

      Coverage Distribution

      +
      + +
      +
      +
      +

      Complexity

      +
      + +
      +
      +
      +
      +
      +

      Insufficient Coverage

      +
      + + + + + + + + +{{insufficient_coverage_classes}} + +
      ClassCoverage
      +
      +
      +
      +

      Project Risks

      +
      + + + + + + + + +{{project_risks_classes}} + +
      ClassCRAP
      +
      +
      +
      +
      +
      +

      Methods

      +
      +
      +
      +
      +

      Coverage Distribution

      +
      + +
      +
      +
      +

      Complexity

      +
      + +
      +
      +
      +
      +
      +

      Insufficient Coverage

      +
      + + + + + + + + +{{insufficient_coverage_methods}} + +
      MethodCoverage
      +
      +
      +
      +

      Project Risks

      +
      + + + + + + + + +{{project_risks_methods}} + +
      MethodCRAP
      +
      +
      +
      + +
      + + + + + + + + + + + Dashboard for {{full_path}} + + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +

      Classes

      +
      +
      +
      +
      +

      Coverage Distribution

      +
      + +
      +
      +
      +

      Complexity

      +
      + +
      +
      +
      +
      +
      +

      Insufficient Coverage

      +
      + + + + + + + + +{{insufficient_coverage_classes}} + +
      ClassCoverage
      +
      +
      +
      +

      Project Risks

      +
      + + + + + + + + +{{project_risks_classes}} + +
      ClassCRAP
      +
      +
      +
      +
      +
      +

      Methods

      +
      +
      +
      +
      +

      Coverage Distribution

      +
      + +
      +
      +
      +

      Complexity

      +
      + +
      +
      +
      +
      +
      +

      Insufficient Coverage

      +
      + + + + + + + + +{{insufficient_coverage_methods}} + +
      MethodCoverage
      +
      +
      +
      +

      Project Risks

      +
      + + + + + + + + +{{project_risks_methods}} + +
      MethodCRAP
      +
      +
      +
      + +
      + + + + + + + + + + + Code Coverage for {{full_path}} + + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + +{{items}} + +
       
      Code Coverage
       
      Lines
      Functions and Methods
      Classes and Traits
      +
      +
      +
      +

      Legend

      +

      + Low: 0% to {{low_upper_bound}}% + Medium: {{low_upper_bound}}% to {{high_lower_bound}}% + High: {{high_lower_bound}}% to 100% +

      +

      + Generated by php-code-coverage {{version}} using {{runtime}}{{generator}} at {{date}}. +

      +
      +
      + + + + + + + Code Coverage for {{full_path}} + + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + +{{items}} + +
       
      Code Coverage
       
      Lines
      Branches
      Paths
      Functions and Methods
      Classes and Traits
      +
      +
      +
      +

      Legend

      +

      + Low: 0% to {{low_upper_bound}}% + Medium: {{low_upper_bound}}% to {{high_lower_bound}}% + High: {{high_lower_bound}}% to 100% +

      +

      + Generated by php-code-coverage {{version}} using {{runtime}}{{generator}} at {{date}}. +

      +
      +
      + + + + {{icon}}{{name}} + {{lines_bar}} +
      {{lines_executed_percent}}
      +
      {{lines_number}}
      + {{methods_bar}} +
      {{methods_tested_percent}}
      +
      {{methods_number}}
      + {{classes_bar}} +
      {{classes_tested_percent}}
      +
      {{classes_number}}
      + + + + {{icon}}{{name}} + {{lines_bar}} +
      {{lines_executed_percent}}
      +
      {{lines_number}}
      + {{branches_bar}} +
      {{branches_executed_percent}}
      +
      {{branches_number}}
      + {{paths_bar}} +
      {{paths_executed_percent}}
      +
      {{paths_number}}
      + {{methods_bar}} +
      {{methods_tested_percent}}
      +
      {{methods_number}}
      + {{classes_bar}} +
      {{classes_tested_percent}}
      +
      {{classes_number}}
      + + + + + + + Code Coverage for {{full_path}} + + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + +{{items}} + +
       
      Code Coverage
       
      Lines
      Functions and Methods
      Classes and Traits
      +
      +{{lines}} +{{structure}} + +
      + + + + + + + + + + + Code Coverage for {{full_path}} + + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + +{{items}} + +
       
      Code Coverage
       
      Lines
      Branches
      Paths
      Functions and Methods
      Classes and Traits
      +
      +{{lines}} +{{structure}} + +
      + + + + + + + + {{name}} + {{lines_bar}} +
      {{lines_executed_percent}}
      +
      {{lines_number}}
      + {{methods_bar}} +
      {{methods_tested_percent}}
      +
      {{methods_number}}
      + {{crap}} + {{classes_bar}} +
      {{classes_tested_percent}}
      +
      {{classes_number}}
      + -use PHPUnit\phpDocumentor\Reflection\Exception\PcreException; -use function preg_last_error; -use function preg_split as php_preg_split; -abstract class Utils -{ - /** - * Wrapper function for phps preg_split - * - * This function is inspired by {@link https://github.com/thecodingmachine/safe/blob/master/generated/pcre.php}. But - * since this library is all about performance we decided to strip everything we don't need. Reducing the amount - * of files that have to be loaded, ect. - * - * @param string $pattern The pattern to search for, as a string. - * @param string $subject The input string. - * @param int|null $limit If specified, then only substrings up to limit are returned with the - * rest of the string being placed in the last substring. A limit of -1 or 0 means "no limit". - * @param int $flags flags can be any combination of the following flags (combined with the | bitwise operator): - * *PREG_SPLIT_NO_EMPTY* - * If this flag is set, only non-empty pieces will be returned by preg_split(). - * *PREG_SPLIT_DELIM_CAPTURE* - * If this flag is set, parenthesized expression in the delimiter pattern will be captured - * and returned as well. - * *PREG_SPLIT_OFFSET_CAPTURE* - * If this flag is set, for every occurring match the appendant string offset will also be returned. - * Note that this changes the return value in an array where every element is an array consisting of the - * matched string at offset 0 and its string offset into subject at offset 1. - * - * @return string[] Returns an array containing substrings of subject split along boundaries matched by pattern - * - * @throws PcreException - */ - public static function pregSplit(string $pattern, string $subject, ?int $limit = -1, int $flags = 0) : array - { - $parts = php_preg_split($pattern, $subject, $limit, $flags); - if ($parts === \false) { - throw PcreException::createFromPhpError(preg_last_error()); - } - return $parts; - } -} - + {{name}} + {{lines_bar}} +
      {{lines_executed_percent}}
      +
      {{lines_number}}
      + {{branches_bar}} +
      {{branches_executed_percent}}
      +
      {{branches_number}}
      + {{paths_bar}} +
      {{paths_executed_percent}}
      +
      {{paths_number}}
      + {{methods_bar}} +
      {{methods_tested_percent}}
      +
      {{methods_number}}
      + {{crap}} + {{classes_bar}} +
      {{classes_tested_percent}}
      +
      {{classes_number}}
      + -declare (strict_types=1); -namespace PHPUnit\phpDocumentor\Reflection\Exception; +/*! + * Bootstrap v4.6.1 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap={},t.jQuery,t.Popper)}(this,(function(t,e,n){"use strict";function i(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var o=i(e),a=i(n);function s(t,e){for(var n=0;n=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};d.jQueryDetection(),o.default.fn.emulateTransitionEnd=function(t){var e=this,n=!1;return o.default(this).one(d.TRANSITION_END,(function(){n=!0})),setTimeout((function(){n||d.triggerTransitionEnd(e)}),t),this},o.default.event.special[d.TRANSITION_END]={bindType:f,delegateType:f,handle:function(t){if(o.default(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var c="bs.alert",h=o.default.fn.alert,g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.default.removeData(this._element,c),this._element=null},e._getRootElement=function(t){var e=d.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=o.default(t).closest(".alert")[0]),n},e._triggerCloseEvent=function(t){var e=o.default.Event("close.bs.alert");return o.default(t).trigger(e),e},e._removeElement=function(t){var e=this;if(o.default(t).removeClass("show"),o.default(t).hasClass("fade")){var n=d.getTransitionDurationFromElement(t);o.default(t).one(d.TRANSITION_END,(function(n){return e._destroyElement(t,n)})).emulateTransitionEnd(n)}else this._destroyElement(t)},e._destroyElement=function(t){o.default(t).detach().trigger("closed.bs.alert").remove()},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(c);i||(i=new t(this),n.data(c,i)),"close"===e&&i[e](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}}]),t}();o.default(document).on("click.bs.alert.data-api",'[data-dismiss="alert"]',g._handleDismiss(new g)),o.default.fn.alert=g._jQueryInterface,o.default.fn.alert.Constructor=g,o.default.fn.alert.noConflict=function(){return o.default.fn.alert=h,g._jQueryInterface};var m="bs.button",p=o.default.fn.button,_="active",v='[data-toggle^="button"]',y='input:not([type="hidden"])',b=".btn",E=function(){function t(t){this._element=t,this.shouldAvoidTriggerChange=!1}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=o.default(this._element).closest('[data-toggle="buttons"]')[0];if(n){var i=this._element.querySelector(y);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(_))t=!1;else{var a=n.querySelector(".active");a&&o.default(a).removeClass(_)}t&&("checkbox"!==i.type&&"radio"!==i.type||(i.checked=!this._element.classList.contains(_)),this.shouldAvoidTriggerChange||o.default(i).trigger("change")),i.focus(),e=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(_)),t&&o.default(this._element).toggleClass(_))},e.dispose=function(){o.default.removeData(this._element,m),this._element=null},t._jQueryInterface=function(e,n){return this.each((function(){var i=o.default(this),a=i.data(m);a||(a=new t(this),i.data(m,a)),a.shouldAvoidTriggerChange=n,"toggle"===e&&a[e]()}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}}]),t}();o.default(document).on("click.bs.button.data-api",v,(function(t){var e=t.target,n=e;if(o.default(e).hasClass("btn")||(e=o.default(e).closest(b)[0]),!e||e.hasAttribute("disabled")||e.classList.contains("disabled"))t.preventDefault();else{var i=e.querySelector(y);if(i&&(i.hasAttribute("disabled")||i.classList.contains("disabled")))return void t.preventDefault();"INPUT"!==n.tagName&&"LABEL"===e.tagName||E._jQueryInterface.call(o.default(e),"toggle","INPUT"===n.tagName)}})).on("focus.bs.button.data-api blur.bs.button.data-api",v,(function(t){var e=o.default(t.target).closest(b)[0];o.default(e).toggleClass("focus",/^focus(in)?$/.test(t.type))})),o.default(window).on("load.bs.button.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-toggle="buttons"] .btn')),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var e=t.prototype;return e.next=function(){this._isSliding||this._slide(N)},e.nextWhenVisible=function(){var t=o.default(this._element);!document.hidden&&t.is(":visible")&&"hidden"!==t.css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide(D)},e.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(".carousel-item-next, .carousel-item-prev")&&(d.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(t){var e=this;this._activeElement=this._element.querySelector(I);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)o.default(this._element).one(A,(function(){return e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var i=t>n?N:D;this._slide(i,this._items[t])}},e.dispose=function(){o.default(this._element).off(".bs.carousel"),o.default.removeData(this._element,w),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(t){return t=r({},k,t),d.typeCheckConfig(T,t,O),t},e._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},e._addEventListeners=function(){var t=this;this._config.keyboard&&o.default(this._element).on("keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&o.default(this._element).on("mouseenter.bs.carousel",(function(e){return t.pause(e)})).on("mouseleave.bs.carousel",(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},e._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var e=function(e){t._pointerEvent&&j[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},n=function(e){t._pointerEvent&&j[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};o.default(this._element.querySelectorAll(".carousel-item img")).on("dragstart.bs.carousel",(function(t){return t.preventDefault()})),this._pointerEvent?(o.default(this._element).on("pointerdown.bs.carousel",(function(t){return e(t)})),o.default(this._element).on("pointerup.bs.carousel",(function(t){return n(t)})),this._element.classList.add("pointer-event")):(o.default(this._element).on("touchstart.bs.carousel",(function(t){return e(t)})),o.default(this._element).on("touchmove.bs.carousel",(function(e){return function(e){t.touchDeltaX=e.originalEvent.touches&&e.originalEvent.touches.length>1?0:e.originalEvent.touches[0].clientX-t.touchStartX}(e)})),o.default(this._element).on("touchend.bs.carousel",(function(t){return n(t)})))}},e._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},e._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(".carousel-item")):[],this._items.indexOf(t)},e._getItemByDirection=function(t,e){var n=t===N,i=t===D,o=this._getItemIndex(e),a=this._items.length-1;if((i&&0===o||n&&o===a)&&!this._config.wrap)return e;var s=(o+(t===D?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},e._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(I)),a=o.default.Event("slide.bs.carousel",{relatedTarget:t,direction:e,from:i,to:n});return o.default(this._element).trigger(a),a},e._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(".active"));o.default(e).removeClass(S);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&o.default(n).addClass(S)}},e._updateInterval=function(){var t=this._activeElement||this._element.querySelector(I);if(t){var e=parseInt(t.getAttribute("data-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}},e._slide=function(t,e){var n,i,a,s=this,l=this._element.querySelector(I),r=this._getItemIndex(l),u=e||l&&this._getItemByDirection(t,l),f=this._getItemIndex(u),c=Boolean(this._interval);if(t===N?(n="carousel-item-left",i="carousel-item-next",a="left"):(n="carousel-item-right",i="carousel-item-prev",a="right"),u&&o.default(u).hasClass(S))this._isSliding=!1;else if(!this._triggerSlideEvent(u,a).isDefaultPrevented()&&l&&u){this._isSliding=!0,c&&this.pause(),this._setActiveIndicatorElement(u),this._activeElement=u;var h=o.default.Event(A,{relatedTarget:u,direction:a,from:r,to:f});if(o.default(this._element).hasClass("slide")){o.default(u).addClass(i),d.reflow(u),o.default(l).addClass(n),o.default(u).addClass(n);var g=d.getTransitionDurationFromElement(l);o.default(l).one(d.TRANSITION_END,(function(){o.default(u).removeClass(n+" "+i).addClass(S),o.default(l).removeClass("active "+i+" "+n),s._isSliding=!1,setTimeout((function(){return o.default(s._element).trigger(h)}),0)})).emulateTransitionEnd(g)}else o.default(l).removeClass(S),o.default(u).addClass(S),this._isSliding=!1,o.default(this._element).trigger(h);c&&this.cycle()}},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this).data(w),i=r({},k,o.default(this).data());"object"==typeof e&&(i=r({},i,e));var a="string"==typeof e?e:i.slide;if(n||(n=new t(this,i),o.default(this).data(w,n)),"number"==typeof e)n.to(e);else if("string"==typeof a){if("undefined"==typeof n[a])throw new TypeError('No method named "'+a+'"');n[a]()}else i.interval&&i.ride&&(n.pause(),n.cycle())}))},t._dataApiClickHandler=function(e){var n=d.getSelectorFromElement(this);if(n){var i=o.default(n)[0];if(i&&o.default(i).hasClass("carousel")){var a=r({},o.default(i).data(),o.default(this).data()),s=this.getAttribute("data-slide-to");s&&(a.interval=!1),t._jQueryInterface.call(o.default(i),a),s&&o.default(i).data(w).to(s),e.preventDefault()}}},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}},{key:"Default",get:function(){return k}}]),t}();o.default(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",P._dataApiClickHandler),o.default(window).on("load.bs.carousel.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-ride="carousel"]')),e=0,n=t.length;e0&&(this._selector=s,this._triggerArray.push(a))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=t.prototype;return e.toggle=function(){o.default(this._element).hasClass(q)?this.hide():this.show()},e.show=function(){var e,n,i=this;if(!(this._isTransitioning||o.default(this._element).hasClass(q)||(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(".show, .collapsing")).filter((function(t){return"string"==typeof i._config.parent?t.getAttribute("data-parent")===i._config.parent:t.classList.contains(F)}))).length&&(e=null),e&&(n=o.default(e).not(this._selector).data(R))&&n._isTransitioning))){var a=o.default.Event("show.bs.collapse");if(o.default(this._element).trigger(a),!a.isDefaultPrevented()){e&&(t._jQueryInterface.call(o.default(e).not(this._selector),"hide"),n||o.default(e).data(R,null));var s=this._getDimension();o.default(this._element).removeClass(F).addClass(Q),this._element.style[s]=0,this._triggerArray.length&&o.default(this._triggerArray).removeClass(B).attr("aria-expanded",!0),this.setTransitioning(!0);var l="scroll"+(s[0].toUpperCase()+s.slice(1)),r=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,(function(){o.default(i._element).removeClass(Q).addClass("collapse show"),i._element.style[s]="",i.setTransitioning(!1),o.default(i._element).trigger("shown.bs.collapse")})).emulateTransitionEnd(r),this._element.style[s]=this._element[l]+"px"}}},e.hide=function(){var t=this;if(!this._isTransitioning&&o.default(this._element).hasClass(q)){var e=o.default.Event("hide.bs.collapse");if(o.default(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",d.reflow(this._element),o.default(this._element).addClass(Q).removeClass("collapse show");var i=this._triggerArray.length;if(i>0)for(var a=0;a0},e._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets,t._element)),e}:e.offset=this._config.offset,e},e._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),r({},t,this._config.popperConfig)},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this).data(K);if(n||(n=new t(this,"object"==typeof e?e:null),o.default(this).data(K,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}}))},t._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=[].slice.call(document.querySelectorAll(it)),i=0,a=n.length;i0&&s--,40===e.which&&sdocument.documentElement.clientHeight;n||(this._element.style.overflowY="hidden"),this._element.classList.add(ht);var i=d.getTransitionDurationFromElement(this._dialog);o.default(this._element).off(d.TRANSITION_END),o.default(this._element).one(d.TRANSITION_END,(function(){t._element.classList.remove(ht),n||o.default(t._element).one(d.TRANSITION_END,(function(){t._element.style.overflowY=""})).emulateTransitionEnd(t._element,i)})).emulateTransitionEnd(i),this._element.focus()}},e._showElement=function(t){var e=this,n=o.default(this._element).hasClass(dt),i=this._dialog?this._dialog.querySelector(".modal-body"):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),o.default(this._dialog).hasClass("modal-dialog-scrollable")&&i?i.scrollTop=0:this._element.scrollTop=0,n&&d.reflow(this._element),o.default(this._element).addClass(ct),this._config.focus&&this._enforceFocus();var a=o.default.Event("shown.bs.modal",{relatedTarget:t}),s=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,o.default(e._element).trigger(a)};if(n){var l=d.getTransitionDurationFromElement(this._dialog);o.default(this._dialog).one(d.TRANSITION_END,s).emulateTransitionEnd(l)}else s()},e._enforceFocus=function(){var t=this;o.default(document).off(pt).on(pt,(function(e){document!==e.target&&t._element!==e.target&&0===o.default(t._element).has(e.target).length&&t._element.focus()}))},e._setEscapeEvent=function(){var t=this;this._isShown?o.default(this._element).on(yt,(function(e){t._config.keyboard&&27===e.which?(e.preventDefault(),t.hide()):t._config.keyboard||27!==e.which||t._triggerBackdropTransition()})):this._isShown||o.default(this._element).off(yt)},e._setResizeEvent=function(){var t=this;this._isShown?o.default(window).on(_t,(function(e){return t.handleUpdate(e)})):o.default(window).off(_t)},e._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._showBackdrop((function(){o.default(document.body).removeClass(ft),t._resetAdjustments(),t._resetScrollbar(),o.default(t._element).trigger(gt)}))},e._removeBackdrop=function(){this._backdrop&&(o.default(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(t){var e=this,n=o.default(this._element).hasClass(dt)?dt:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className="modal-backdrop",n&&this._backdrop.classList.add(n),o.default(this._backdrop).appendTo(document.body),o.default(this._element).on(vt,(function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._triggerBackdropTransition():e.hide())})),n&&d.reflow(this._backdrop),o.default(this._backdrop).addClass(ct),!t)return;if(!n)return void t();var i=d.getTransitionDurationFromElement(this._backdrop);o.default(this._backdrop).one(d.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){o.default(this._backdrop).removeClass(ct);var a=function(){e._removeBackdrop(),t&&t()};if(o.default(this._element).hasClass(dt)){var s=d.getTransitionDurationFromElement(this._backdrop);o.default(this._backdrop).one(d.TRANSITION_END,a).emulateTransitionEnd(s)}else a()}else t&&t()},e._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
      ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",customClass:"",sanitize:!0,sanitizeFn:null,whiteList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},Ut={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},Mt={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},Wt=function(){function t(t,e){if("undefined"==typeof a.default)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=o.default(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(o.default(this.getTipElement()).hasClass(Rt))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),o.default.removeData(this.element,this.constructor.DATA_KEY),o.default(this.element).off(this.constructor.EVENT_KEY),o.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&o.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===o.default(this.element).css("display"))throw new Error("Please use show on visible elements");var e=o.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){o.default(this.element).trigger(e);var n=d.findShadowRoot(this.element),i=o.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var s=this.getTipElement(),l=d.getUID(this.constructor.NAME);s.setAttribute("id",l),this.element.setAttribute("aria-describedby",l),this.setContent(),this.config.animation&&o.default(s).addClass(Lt);var r="function"==typeof this.config.placement?this.config.placement.call(this,s,this.element):this.config.placement,u=this._getAttachment(r);this.addAttachmentClass(u);var f=this._getContainer();o.default(s).data(this.constructor.DATA_KEY,this),o.default.contains(this.element.ownerDocument.documentElement,this.tip)||o.default(s).appendTo(f),o.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new a.default(this.element,s,this._getPopperConfig(u)),o.default(s).addClass(Rt),o.default(s).addClass(this.config.customClass),"ontouchstart"in document.documentElement&&o.default(document.body).children().on("mouseover",null,o.default.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,o.default(t.element).trigger(t.constructor.Event.SHOWN),e===qt&&t._leave(null,t)};if(o.default(this.tip).hasClass(Lt)){var h=d.getTransitionDurationFromElement(this.tip);o.default(this.tip).one(d.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(t){var e=this,n=this.getTipElement(),i=o.default.Event(this.constructor.Event.HIDE),a=function(){e._hoverState!==xt&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),o.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(o.default(this.element).trigger(i),!i.isDefaultPrevented()){if(o.default(n).removeClass(Rt),"ontouchstart"in document.documentElement&&o.default(document.body).children().off("mouseover",null,o.default.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,o.default(this.tip).hasClass(Lt)){var s=d.getTransitionDurationFromElement(n);o.default(n).one(d.TRANSITION_END,a).emulateTransitionEnd(s)}else a();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-tooltip-"+t)},e.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},e.setContent=function(){var t=this.getTipElement();this.setElementContent(o.default(t.querySelectorAll(".tooltip-inner")),this.getTitle()),o.default(t).removeClass("fade show")},e.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=At(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?o.default(e).parent().is(t)||t.empty().append(e):t.text(o.default(e).text())},e.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var e=this;return r({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t.config.offset(e.offsets,t.element)),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:d.isElement(this.config.container)?o.default(this.config.container):o.default(document).find(this.config.container)},e._getAttachment=function(t){return Bt[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)o.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n=e===Ft?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,i=e===Ft?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;o.default(t.element).on(n,t.config.selector,(function(e){return t._enter(e)})).on(i,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},o.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Qt:Ft]=!0),o.default(e.getTipElement()).hasClass(Rt)||e._hoverState===xt?e._hoverState=xt:(clearTimeout(e._timeout),e._hoverState=xt,e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){e._hoverState===xt&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Qt:Ft]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=qt,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){e._hoverState===qt&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var e=o.default(this.element).data();return Object.keys(e).forEach((function(t){-1!==Pt.indexOf(t)&&delete e[t]})),"number"==typeof(t=r({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),d.typeCheckConfig(It,t,this.constructor.DefaultType),t.sanitize&&(t.template=At(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(jt);null!==e&&e.length&&t.removeClass(e.join(""))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(o.default(t).removeClass(Lt),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(kt),a="object"==typeof e&&e;if((i||!/dispose|hide/.test(e))&&(i||(i=new t(this,a),n.data(kt,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}},{key:"Default",get:function(){return Ht}},{key:"NAME",get:function(){return It}},{key:"DATA_KEY",get:function(){return kt}},{key:"Event",get:function(){return Mt}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return Ut}}]),t}();o.default.fn.tooltip=Wt._jQueryInterface,o.default.fn.tooltip.Constructor=Wt,o.default.fn.tooltip.noConflict=function(){return o.default.fn.tooltip=Ot,Wt._jQueryInterface};var Vt="bs.popover",zt=o.default.fn.popover,Kt=new RegExp("(^|\\s)bs-popover\\S+","g"),Xt=r({},Wt.Default,{placement:"right",trigger:"click",content:"",template:''}),Yt=r({},Wt.DefaultType,{content:"(string|element|function)"}),$t={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},Jt=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),e.prototype.constructor=e,u(e,n);var a=i.prototype;return a.isWithContent=function(){return this.getTitle()||this._getContent()},a.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-popover-"+t)},a.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},a.setContent=function(){var t=o.default(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(".popover-body"),e),t.removeClass("fade show")},a._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},a._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(Kt);null!==e&&e.length>0&&t.removeClass(e.join(""))},i._jQueryInterface=function(t){return this.each((function(){var e=o.default(this).data(Vt),n="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new i(this,n),o.default(this).data(Vt,e)),"string"==typeof t)){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},l(i,null,[{key:"VERSION",get:function(){return"4.6.1"}},{key:"Default",get:function(){return Xt}},{key:"NAME",get:function(){return"popover"}},{key:"DATA_KEY",get:function(){return Vt}},{key:"Event",get:function(){return $t}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return Yt}}]),i}(Wt);o.default.fn.popover=Jt._jQueryInterface,o.default.fn.popover.Constructor=Jt,o.default.fn.popover.noConflict=function(){return o.default.fn.popover=zt,Jt._jQueryInterface};var Gt="scrollspy",Zt="bs.scrollspy",te=o.default.fn[Gt],ee="active",ne="position",ie=".nav, .list-group",oe={offset:10,method:"auto",target:""},ae={offset:"number",method:"string",target:"(string|element)"},se=function(){function t(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,o.default(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":ne,n="auto"===this._config.method?e:this._config.method,i=n===ne?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var e,a=d.getSelectorFromElement(t);if(a&&(e=document.querySelector(a)),e){var s=e.getBoundingClientRect();if(s.width||s.height)return[o.default(e)[n]().top+i,a]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){o.default.removeData(this._element,Zt),o.default(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if("string"!=typeof(t=r({},oe,"object"==typeof t&&t?t:{})).target&&d.isElement(t.target)){var e=o.default(t.target).attr("id");e||(e=d.getUID(Gt),o.default(t.target).attr("id",e)),t.target="#"+e}return d.typeCheckConfig(Gt,t,ae),t},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active",ge=function(){function t(t){this._element=t}var e=t.prototype;return e.show=function(){var t=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&o.default(this._element).hasClass(ue)||o.default(this._element).hasClass("disabled"))){var e,n,i=o.default(this._element).closest(".nav, .list-group")[0],a=d.getSelectorFromElement(this._element);if(i){var s="UL"===i.nodeName||"OL"===i.nodeName?he:ce;n=(n=o.default.makeArray(o.default(i).find(s)))[n.length-1]}var l=o.default.Event("hide.bs.tab",{relatedTarget:this._element}),r=o.default.Event("show.bs.tab",{relatedTarget:n});if(n&&o.default(n).trigger(l),o.default(this._element).trigger(r),!r.isDefaultPrevented()&&!l.isDefaultPrevented()){a&&(e=document.querySelector(a)),this._activate(this._element,i);var u=function(){var e=o.default.Event("hidden.bs.tab",{relatedTarget:t._element}),i=o.default.Event("shown.bs.tab",{relatedTarget:n});o.default(n).trigger(e),o.default(t._element).trigger(i)};e?this._activate(e,e.parentNode,u):u()}}},e.dispose=function(){o.default.removeData(this._element,le),this._element=null},e._activate=function(t,e,n){var i=this,a=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?o.default(e).children(ce):o.default(e).find(he))[0],s=n&&a&&o.default(a).hasClass(fe),l=function(){return i._transitionComplete(t,a,n)};if(a&&s){var r=d.getTransitionDurationFromElement(a);o.default(a).removeClass(de).one(d.TRANSITION_END,l).emulateTransitionEnd(r)}else l()},e._transitionComplete=function(t,e,n){if(e){o.default(e).removeClass(ue);var i=o.default(e.parentNode).find("> .dropdown-menu .active")[0];i&&o.default(i).removeClass(ue),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}o.default(t).addClass(ue),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),d.reflow(t),t.classList.contains(fe)&&t.classList.add(de);var a=t.parentNode;if(a&&"LI"===a.nodeName&&(a=a.parentNode),a&&o.default(a).hasClass("dropdown-menu")){var s=o.default(t).closest(".dropdown")[0];if(s){var l=[].slice.call(s.querySelectorAll(".dropdown-toggle"));o.default(l).addClass(ue)}t.setAttribute("aria-expanded",!0)}n&&n()},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(le);if(i||(i=new t(this),n.data(le,i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}}]),t}();o.default(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),ge._jQueryInterface.call(o.default(this),"show")})),o.default.fn.tab=ge._jQueryInterface,o.default.fn.tab.Constructor=ge,o.default.fn.tab.noConflict=function(){return o.default.fn.tab=re,ge._jQueryInterface};var me="bs.toast",pe=o.default.fn.toast,_e="hide",ve="show",ye="showing",be="click.dismiss.bs.toast",Ee={animation:!0,autohide:!0,delay:500},Te={animation:"boolean",autohide:"boolean",delay:"number"},we=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var e=t.prototype;return e.show=function(){var t=this,e=o.default.Event("show.bs.toast");if(o.default(this._element).trigger(e),!e.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var n=function(){t._element.classList.remove(ye),t._element.classList.add(ve),o.default(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove(_e),d.reflow(this._element),this._element.classList.add(ye),this._config.animation){var i=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,n).emulateTransitionEnd(i)}else n()}},e.hide=function(){if(this._element.classList.contains(ve)){var t=o.default.Event("hide.bs.toast");o.default(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},e.dispose=function(){this._clearTimeout(),this._element.classList.contains(ve)&&this._element.classList.remove(ve),o.default(this._element).off(be),o.default.removeData(this._element,me),this._element=null,this._config=null},e._getConfig=function(t){return t=r({},Ee,o.default(this._element).data(),"object"==typeof t&&t?t:{}),d.typeCheckConfig("toast",t,this.constructor.DefaultType),t},e._setListeners=function(){var t=this;o.default(this._element).on(be,'[data-dismiss="toast"]',(function(){return t.hide()}))},e._close=function(){var t=this,e=function(){t._element.classList.add(_e),o.default(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove(ve),this._config.animation){var n=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},e._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(me);if(i||(i=new t(this,"object"==typeof e&&e),n.data(me,i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e](this)}}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}},{key:"DefaultType",get:function(){return Te}},{key:"Default",get:function(){return Ee}}]),t}();o.default.fn.toast=we._jQueryInterface,o.default.fn.toast.Constructor=we,o.default.fn.toast.noConflict=function(){return o.default.fn.toast=pe,we._jQueryInterface},t.Alert=g,t.Button=E,t.Carousel=P,t.Collapse=V,t.Dropdown=lt,t.Modal=Ct,t.Popover=Jt,t.Scrollspy=se,t.Tab=ge,t.Toast=we,t.Tooltip=Wt,t.Util=d,Object.defineProperty(t,"__esModule",{value:!0})})); +//# sourceMappingURL=bootstrap.min.js.map!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function i(n){return!isNaN(n)}function u(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)<0?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)>0?i=u:r=u+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function f(n){return(n+="")===bo||n[0]===_o?_o+n:n}function s(n){return(n+="")[0]===_o?n.slice(1):n}function h(n){return f(n)in this._}function p(n){return(n=f(n))in this._&&delete this._[n]}function g(){var n=[];for(var t in this._)n.push(s(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function y(){this._=Object.create(null)}function m(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=wo.length;r>e;++e){var i=wo[e]+t;if(i in n)return i}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,i=-1,u=r.length;++ie;e++)for(var i,u=n[e],o=0,a=u.length;a>o;o++)(i=u[o])&&t(i,o,e);return n}function Z(n){return ko(n,qo),n}function V(n){var t,e;return function(r,i,u){var o,a=n[u].update,l=a.length;for(u!=e&&(e=u,t=0),i>=t&&(t=i+1);!(o=a[t])&&++t0&&(n=n.slice(0,a));var c=To.get(n);return c&&(n=c,l=B),a?t?i:r:t?b:u}function $(n,t){return function(e){var r=ao.event;ao.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ao.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Do,i="click"+r,u=ao.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ro&&(Ro="onselectstart"in e?!1:x(e.style,"userSelect")),Ro){var o=n(e).style,a=o[Ro];o[Ro]="none"}return function(n){if(u.on(r,null),Ro&&(o[Ro]=a),n){var t=function(){u.on(i,null)};u.on(i,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var i=r.createSVGPoint();if(0>Po){var u=t(n);if(u.scrollX||u.scrollY){r=ao.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Po=!(o.f||o.e),r.remove()}}return Po?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(n.getScreenCTM().inverse()),[i.x,i.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ao.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?Fo:Math.acos(n)}function tn(n){return n>1?Io:-1>n?-Io:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function on(n){return(n=Math.sin(n/2))*n}function an(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?u+(o-u)*n/60:180>n?o:240>n?u+(o-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,u=2*e-o,new mn(i(n+120),i(n),i(n-120))}function fn(n,t,e){return this instanceof fn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof fn?new fn(n.h,n.c,n.l):n instanceof hn?gn(n.l,n.a,n.b):gn((n=Sn((n=ao.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new fn(n,t,e)}function sn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Yo)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof fn?sn(n.h,n.c,n.l):Sn((n=mn(n)).r,n.g,n.b):new hn(n,t,e)}function pn(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=vn(i)*na,r=vn(r)*ta,u=vn(u)*ea,new mn(yn(3.2404542*i-1.5371385*r-.4985314*u),yn(-.969266*i+1.8760108*r+.041556*u),yn(.0556434*i-.2040259*r+1.0572252*u))}function gn(n,t,e){return n>0?new fn(Math.atan2(e,t)*Zo,Math.sqrt(t*t+e*e),n):new fn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function yn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mn(n,t,e){return this instanceof mn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mn?new mn(n.r,n.g,n.b):_n(""+n,mn,cn):new mn(n,t,e)}function Mn(n){return new mn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,i,u,o=0,a=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Nn(i[0]),Nn(i[1]),Nn(i[2]))}return(u=ua.get(n))?t(u.r,u.g,u.b):(null==n||"#"!==n.charAt(0)||isNaN(u=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&u)>>4,o=o>>4|o,a=240&u,a=a>>4|a,l=15&u,l=l<<4|l):7===n.length&&(o=(16711680&u)>>16,a=(65280&u)>>8,l=255&u)),t(o,a,l))}function wn(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-u,l=(o+u)/2;return a?(i=.5>l?a/(o+u):a/(2-o-u),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=NaN,i=l>0&&1>l?0:r),new ln(r,i,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/na),i=dn((.2126729*n+.7151522*t+.072175*e)/ta),u=dn((.0193339*n+.119192*t+.9503041*e)/ea);return hn(116*i-16,500*(r-i),200*(i-u))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function i(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(u,l)}catch(r){return void o.error.call(u,r)}o.load.call(u,n)}else o.error.call(u,l)}var u={},o=ao.dispatch("beforesend","progress","load","error"),a={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=i:l.onreadystatechange=function(){l.readyState>3&&i()},l.onprogress=function(n){var t=ao.event;ao.event=n;try{o.progress.call(u,l)}finally{ao.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(c=n,u):c},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(co(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),l.setRequestHeader)for(var f in a)l.setRequestHeader(f,a[f]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),o.beforesend.call(u,l),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},ao.rebind(u,o,"on"),null==r?u:u.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var i=e+t,u={c:n,t:i,n:null};return aa?aa.n=u:oa=u,aa=u,la||(ca=clearTimeout(ca),la=1,fa(Tn)),u}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(ca),ca=setTimeout(Tn,t)),la=0):(la=1,fa(Tn))}function Rn(){for(var n=Date.now(),t=oa;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=oa,e=1/0;t;)t.c?(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function jn(n){var t=n.decimal,e=n.thousands,r=n.grouping,i=n.currency,u=r&&e?function(n,t){for(var i=n.length,u=[],o=0,a=r[0],l=0;i>0&&a>0&&(l+a+1>t&&(a=Math.max(1,t-l)),u.push(n.substring(i-=a,i+a)),!((l+=a+1)>t));)a=r[o=(o+1)%r.length];return u.reverse().join(e)}:m;return function(n){var e=ha.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",l=e[4]||"",c=e[5],f=+e[6],s=e[7],h=e[8],p=e[9],g=1,v="",d="",y=!1,m=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===o)&&(c=r="0",o="="),p){case"n":s=!0,p="g";break;case"%":g=100,d="%",p="f";break;case"p":g=100,d="%",p="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+p.toLowerCase());case"c":m=!1;case"d":y=!0,h=0;break;case"s":g=-1,p="r"}"$"===l&&(v=i[0],d=i[1]),"r"!=p||h||(p="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=pa.get(p)||Fn;var M=c&&s;return function(n){var e=d;if(y&&n%1)return"";var i=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>g){var l=ao.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=g;n=p(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=m?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&s&&(x=u(x,1/0));var S=v.length+x.length+b.length+(M?0:i.length),k=f>S?new Array(S=f-S+1).join(r):"";return M&&(x=u(k+x,k.length?f-b.length:1/0)),i+=v,n=x+b,("<"===o?i+n+k:">"===o?k+i+n:"^"===o?k.substring(0,S>>=1)+i+n+k.substring(S):i+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=u(e,1);return r-t>t-e?e:r}function i(e){return t(e=n(new va(e-1)),1),e}function u(n,e){return t(n=new va(+n),e),n}function o(n,r,u){var o=i(n),a=[];if(u>1)for(;r>o;)e(o)%u||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{va=Hn;var r=new Hn;return r._=n,o(r,t,e)}finally{va=Date}}n.floor=n,n.round=r,n.ceil=i,n.offset=u,n.range=o;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(i),l.offset=In(u),l.range=a,n}function In(n){return function(t,e){try{va=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{va=Date}}}function Yn(n){function t(n){function t(t){for(var e,i,u,o=[],a=-1,l=0;++aa;){if(r>=c)return-1;if(i=t.charCodeAt(a++),37===i){if(o=t.charAt(a++),u=C[o in ya?t.charAt(a++):o],!u||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function f(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var s=n.dateTime,h=n.date,p=n.time,g=n.periods,v=n.days,d=n.shortDays,y=n.months,m=n.shortMonths;t.utc=function(n){function e(n){try{va=Hn;var t=new va;return t._=n,r(t)}finally{va=Date}}var r=t(n);return e.parse=function(n){try{va=Hn;var t=r.parse(n);return t&&t._}finally{va=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=ao.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(y),k=Xn(y),N=Vn(m),E=Xn(m);g.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return m[n.getMonth()]},B:function(n){return y[n.getMonth()]},c:t(s),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ga.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return g[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ga.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ga.mondayOfYear(n),t,2)},x:t(h),X:t(p),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:at,"%":function(){return"%"}},C={a:r,A:i,b:u,B:o,c:a,d:tt,e:tt,H:rt,I:rt,j:et,L:ot,m:nt,M:it,p:f,S:ut,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",i=(r?-n:n)+"",u=i.length;return r+(e>u?new Array(e-u+1).join(t)+i:i)}function Vn(n){return new RegExp("^(?:"+n.map(ao.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e68?1900:2e3)}function nt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function it(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ut(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ot(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function at(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=xo(t)/60|0,i=xo(t)%60;return e+Zn(r,"0",2)+Zn(i,"0",2)}function lt(n,t,e){Ma.lastIndex=0;var r=Ma.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e=0?1:-1,a=o*e,l=Math.cos(t),c=Math.sin(t),f=u*c,s=i*l+f*Math.cos(a),h=f*o*Math.sin(a);ka.add(Math.atan2(h,s)),r=n,i=l,u=c}var t,e,r,i,u;Na.point=function(o,a){Na.point=n,r=(t=o)*Yo,i=Math.cos(a=(e=a)*Yo/2+Fo/4),u=Math.sin(a)},Na.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function yt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function mt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return xo(n[0]-t[0])a;++a)i.point((e=n[a])[0],e[1]);return void i.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,u.push(l),o.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,u.push(l),o.push(c)}}),o.sort(t),qt(u),qt(o),u.length){for(var a=0,l=e,c=o.length;c>a;++a)o[a].e=l=!l;for(var f,s,h=u[0];;){for(var p=h,g=!0;p.v;)if((p=p.n)===h)return;f=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(g)for(var a=0,c=f.length;c>a;++a)i.point((s=f[a])[0],s[1]);else r(p.x,p.n.x,1,i);p=p.n}else{if(g){f=p.p.z;for(var a=f.length-1;a>=0;--a)i.point((s=f[a])[0],s[1])}else r(p.x,p.p.x,-1,i);p=p.p}p=p.o,f=p.z,g=!g}while(!p.v);i.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r0){for(b||(u.polygonStart(),b=!0),u.lineStart();++o1&&2&t&&e.push(e.pop().concat(e.shift())),p.push(e.filter(Dt))}var p,g,v,d=t(u),y=i.invert(r[0],r[1]),m={point:o,lineStart:l,lineEnd:c,polygonStart:function(){m.point=f,m.lineStart=s,m.lineEnd=h,p=[],g=[]},polygonEnd:function(){m.point=o,m.lineStart=l,m.lineEnd=c,p=ao.merge(p);var n=Ot(y,g);p.length?(b||(u.polygonStart(),b=!0),Lt(p,Ut,n,e,u)):n&&(b||(u.polygonStart(),b=!0),u.lineStart(),e(null,null,1,u),u.lineEnd()),b&&(u.polygonEnd(),b=!1),p=g=null},sphere:function(){u.polygonStart(),u.lineStart(),e(null,null,1,u),u.lineEnd(),u.polygonEnd()}},M=Pt(),x=t(M),b=!1;return m}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ut(n,t){return((n=n.x)[0]<0?n[1]-Io-Uo:Io-n[1])-((t=t.x)[0]<0?t[1]-Io-Uo:Io-t[1])}function jt(n){var t,e=NaN,r=NaN,i=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(u,o){var a=u>0?Fo:-Fo,l=xo(u-e);xo(l-Fo)0?Io:-Io),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(u,r),t=0):i!==a&&l>=Fo&&(xo(e-i)Uo?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*o)):(t+r)/2}function Ht(n,t,e,r){var i;if(null==n)i=e*Io,r.point(-Fo,i),r.point(0,i),r.point(Fo,i),r.point(Fo,0),r.point(Fo,-i),r.point(0,-i),r.point(-Fo,-i),r.point(-Fo,0),r.point(-Fo,i);else if(xo(n[0]-t[0])>Uo){var u=n[0]a;++a){var c=t[a],f=c.length;if(f)for(var s=c[0],h=s[0],p=s[1]/2+Fo/4,g=Math.sin(p),v=Math.cos(p),d=1;;){d===f&&(d=0),n=c[d];var y=n[0],m=n[1]/2+Fo/4,M=Math.sin(m),x=Math.cos(m),b=y-h,_=b>=0?1:-1,w=_*b,S=w>Fo,k=g*M;if(ka.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),u+=S?b+_*Ho:b,S^h>=e^y>=e){var N=mt(dt(s),dt(n));bt(N);var E=mt(i,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=y,g=M,v=x,s=n}}return(-Uo>u||Uo>u&&-Uo>ka)^1&o}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>u}function e(n){var e,u,l,c,f;return{lineStart:function(){c=l=!1,f=1},point:function(s,h){var p,g=[s,h],v=t(s,h),d=o?v?0:i(s,h):v?i(s+(0>s?Fo:-Fo),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(p=r(e,g),(wt(e,p)||wt(g,p))&&(g[0]+=Uo,g[1]+=Uo,v=t(g[0],g[1]))),v!==l)f=0,v?(n.lineStart(),p=r(g,e),n.point(p[0],p[1])):(p=r(e,g),n.point(p[0],p[1]),n.lineEnd()),e=p;else if(a&&e&&o^v){var y;d&u||!(y=r(g,e,!0))||(f=0,o?(n.lineStart(),n.point(y[0][0],y[0][1]),n.point(y[1][0],y[1][1]),n.lineEnd()):(n.point(y[1][0],y[1][1]),n.lineEnd(),n.lineStart(),n.point(y[0][0],y[0][1])))}!v||e&&wt(e,g)||n.point(g[0],g[1]),e=g,l=v,u=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return f|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),i=dt(t),o=[1,0,0],a=mt(r,i),l=yt(a,a),c=a[0],f=l-c*c;if(!f)return!e&&n;var s=u*l/f,h=-u*c/f,p=mt(o,a),g=xt(o,s),v=xt(a,h);Mt(g,v);var d=p,y=yt(g,d),m=yt(d,d),M=y*y-m*(yt(g,g)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-y-x)/m);if(Mt(b,g),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=xo(E-Fo)E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(xo(b[0]-w)Fo^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-y+x)/m);return Mt(z,g),[b,_t(z)]}}}function i(t,e){var r=o?n:Fo-n,i=0;return-r>t?i|=1:t>r&&(i|=2),-r>e?i|=4:e>r&&(i|=8),i}var u=Math.cos(n),o=u>0,a=xo(u)>Uo,l=ve(n,6*Yo);return Rt(t,e,l,o?[0,-n]:[-Fo,n-Fo])}function Yt(n,t,e,r){return function(i){var u,o=i.a,a=i.b,l=o.x,c=o.y,f=a.x,s=a.y,h=0,p=1,g=f-l,v=s-c;if(u=n-l,g||!(u>0)){if(u/=g,0>g){if(h>u)return;p>u&&(p=u)}else if(g>0){if(u>p)return;u>h&&(h=u)}if(u=e-l,g||!(0>u)){if(u/=g,0>g){if(u>p)return;u>h&&(h=u)}else if(g>0){if(h>u)return;p>u&&(p=u)}if(u=t-c,v||!(u>0)){if(u/=v,0>v){if(h>u)return;p>u&&(p=u)}else if(v>0){if(u>p)return;u>h&&(h=u)}if(u=r-c,v||!(0>u)){if(u/=v,0>v){if(u>p)return;u>h&&(h=u)}else if(v>0){if(h>u)return;p>u&&(p=u)}return h>0&&(i.a={x:l+h*g,y:c+h*v}),1>p&&(i.b={x:l+p*g,y:c+p*v}),i}}}}}}function Zt(n,t,e,r){function i(r,i){return xo(r[0]-n)0?0:3:xo(r[0]-e)0?2:1:xo(r[1]-t)0?1:0:i>0?3:2}function u(n,t){return o(n.x,t.x)}function o(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function l(n){for(var t=0,e=d.length,r=n[1],i=0;e>i;++i)for(var u,o=1,a=d[i],l=a.length,c=a[0];l>o;++o)u=a[o],c[1]<=r?u[1]>r&&Q(c,u,n)>0&&++t:u[1]<=r&&Q(c,u,n)<0&&--t,c=u;return 0!==t}function c(u,a,l,c){var f=0,s=0;if(null==u||(f=i(u,l))!==(s=i(a,l))||o(u,a)<0^l>0){do c.point(0===f||3===f?n:e,f>1?r:t);while((f=(f+l+4)%4)!==s)}else c.point(a[0],a[1])}function f(i,u){return i>=n&&e>=i&&u>=t&&r>=u}function s(n,t){f(n,t)&&a.point(n,t)}function h(){C.point=g,d&&d.push(y=[]),S=!0,w=!1,b=_=NaN}function p(){v&&(g(m,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=s,w&&a.lineEnd()}function g(n,t){n=Math.max(-Ha,Math.min(Ha,n)),t=Math.max(-Ha,Math.min(Ha,t));var e=f(n,t);if(d&&y.push([n,t]),S)m=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,y,m,M,x,b,_,w,S,k,N=a,E=Pt(),A=Yt(n,t,e,r),C={point:s,lineStart:h,lineEnd:p,polygonStart:function(){a=E,v=[],d=[],k=!0},polygonEnd:function(){a=N,v=ao.merge(v);var t=l([n,r]),e=k&&t,i=v.length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),c(null,null,1,a),a.lineEnd()),i&&Lt(v,u,t,c,a),a.polygonEnd()),v=d=y=null}};return C}}function Vt(n){var t=0,e=Fo/3,r=ae(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Fo/180,e=n[1]*Fo/180):[t/Fo*180,e/Fo*180]},i}function Xt(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),o-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),o=Math.sqrt(u)/i;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/i,tn((u-(n*n+e*e)*i*i)/(2*i))]},e}function $t(){function n(n,t){Ia+=i*n-r*t,r=n,i=t}var t,e,r,i;$a.point=function(u,o){$a.point=n,t=r=u,e=i=o},$a.lineEnd=function(){n(t,e)}}function Bt(n,t){Ya>n&&(Ya=n),n>Va&&(Va=n),Za>t&&(Za=t),t>Xa&&(Xa=t)}function Wt(){function n(n,t){o.push("M",n,",",t,u)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function i(){o.push("Z")}var u=Jt(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return u=Jt(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ca+=n,za+=t,++La}function Kt(){function n(n,r){var i=n-t,u=r-e,o=Math.sqrt(i*i+u*u);qa+=o*(t+n)/2,Ta+=o*(e+r)/2,Ra+=o,Gt(t=n,e=r)}var t,e;Wa.point=function(r,i){Wa.point=n,Gt(t=r,e=i)}}function Qt(){Wa.point=Gt}function ne(){function n(n,t){var e=n-r,u=t-i,o=Math.sqrt(e*e+u*u);qa+=o*(r+n)/2,Ta+=o*(i+t)/2,Ra+=o,o=i*n-r*t,Da+=o*(r+n),Pa+=o*(i+t),Ua+=3*o,Gt(r=n,i=t)}var t,e,r,i;Wa.point=function(u,o){Wa.point=n,Gt(t=r=u,e=i=o)},Wa.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,Ho)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function i(){a.point=t}function u(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:i,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=i,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function ee(n){function t(n){return(a?r:e)(n)}function e(t){return ue(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=u,t.lineStart()}function u(e,r){var u=dt([e,r]),o=n(e,r);i(M,x,m,b,_,w,M=o[0],x=o[1],m=e,b=u[0],_=u[1],w=u[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function l(){ +r(),S.point=c,S.lineEnd=f}function c(n,t){u(s=n,h=t),p=M,g=x,v=b,d=_,y=w,S.point=u}function f(){i(M,x,m,b,_,w,p,g,s,v,d,y,a,t),S.lineEnd=o,o()}var s,h,p,g,v,d,y,m,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function i(t,e,r,a,l,c,f,s,h,p,g,v,d,y){var m=f-t,M=s-e,x=m*m+M*M;if(x>4*u&&d--){var b=a+p,_=l+g,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=xo(xo(w)-1)u||xo((m*z+M*L)/x-.5)>.3||o>a*p+l*g+c*v)&&(i(t,e,r,a,l,c,A,C,N,b/=S,_/=S,w,d,y),y.point(A,C),i(A,C,N,b,_,w,f,s,h,p,g,v,d,y))}}var u=.5,o=Math.cos(30*Yo),a=16;return t.precision=function(n){return arguments.length?(a=(u=n*n)>0&&16,t):Math.sqrt(u)},t}function re(n){var t=ee(function(t,e){return n([t*Zo,e*Zo])});return function(n){return le(t(n))}}function ie(n){this.stream=n}function ue(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function oe(n){return ae(function(){return n})()}function ae(n){function t(n){return n=a(n[0]*Yo,n[1]*Yo),[n[0]*h+l,c-n[1]*h]}function e(n){return n=a.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Zo,n[1]*Zo]}function r(){a=Ct(o=se(y,M,x),u);var n=u(v,d);return l=p-n[0]*h,c=g+n[1]*h,i()}function i(){return f&&(f.valid=!1,f=null),t}var u,o,a,l,c,f,s=ee(function(n,t){return n=u(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,p=480,g=250,v=0,d=0,y=0,M=0,x=0,b=Fa,_=m,w=null,S=null;return t.stream=function(n){return f&&(f.valid=!1),f=le(b(o,s(_(n)))),f.valid=!0,f},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Fa):It((w=+n)*Yo),i()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):m,i()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(p=+n[0],g=+n[1],r()):[p,g]},t.center=function(n){return arguments.length?(v=n[0]%360*Yo,d=n[1]%360*Yo,r()):[v*Zo,d*Zo]},t.rotate=function(n){return arguments.length?(y=n[0]%360*Yo,M=n[1]%360*Yo,x=n.length>2?n[2]%360*Yo:0,r()):[y*Zo,M*Zo,x*Zo]},ao.rebind(t,s,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function le(n){return ue(n,function(t,e){n.point(t*Yo,e*Yo)})}function ce(n,t){return[n,t]}function fe(n,t){return[n>Fo?n-Ho:-Fo>n?n+Ho:n,t]}function se(n,t,e){return n?t||e?Ct(pe(n),ge(t,e)):pe(n):t||e?ge(t,e):fe}function he(n){return function(t,e){return t+=n,[t>Fo?t-Ho:-Fo>t?t+Ho:t,e]}}function pe(n){var t=he(n);return t.invert=he(-n),t}function ge(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*r+a*i;return[Math.atan2(l*u-f*o,a*r-c*i),tn(f*u+l*o)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*u-l*o;return[Math.atan2(l*u+c*o,a*r+f*i),tn(f*r-a*i)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,o,a){var l=o*t;null!=i?(i=de(e,i),u=de(e,u),(o>0?u>i:i>u)&&(i+=o*Ho)):(i=n+o*Ho,u=n-.5*l);for(var c,f=i;o>0?f>u:u>f;f-=l)a.point((c=_t([e,-r*Math.cos(f),-r*Math.sin(f)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Uo)%(2*Math.PI)}function ye(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function me(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var i=Math.cos(t),u=Math.sin(t),o=Math.cos(r),a=Math.sin(r),l=i*Math.cos(n),c=i*Math.sin(n),f=o*Math.cos(e),s=o*Math.sin(e),h=2*Math.asin(Math.sqrt(on(r-t)+i*o*on(e-n))),p=1/Math.sin(h),g=h?function(n){var t=Math.sin(n*=h)*p,e=Math.sin(h-n)*p,r=e*l+t*f,i=e*c+t*s,o=e*u+t*a;return[Math.atan2(i,r)*Zo,Math.atan2(o,Math.sqrt(r*r+i*i))*Zo]}:function(){return[n*Zo,t*Zo]};return g.distance=h,g}function _e(){function n(n,i){var u=Math.sin(i*=Yo),o=Math.cos(i),a=xo((n*=Yo)-t),l=Math.cos(a);Ja+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*u-e*o*l)*a),e*u+r*o*l),t=n,e=u,r=o}var t,e,r;Ga.point=function(i,u){t=i*Yo,e=Math.sin(u*=Yo),r=Math.cos(u),Ga.point=n},Ga.lineEnd=function(){Ga.point=Ga.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),i=Math.cos(e),u=n(r*i);return[u*i*Math.sin(t),u*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),i=t(r),u=Math.sin(i),o=Math.cos(i);return[Math.atan2(n*u,r*o),Math.asin(r&&e*u/r)]},e}function Se(n,t){function e(n,t){o>0?-Io+Uo>t&&(t=-Io+Uo):t>Io-Uo&&(t=Io-Uo);var e=o/Math.pow(i(t),u);return[e*Math.sin(u*n),o-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Fo/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),o=r*Math.pow(i(n),u)/u;return u?(e.invert=function(n,t){var e=o-t,r=K(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(o/r,1/u))-Io]},e):Ne}function ke(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return xo(i)i;i++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var i=n[0],u=e[0],o=t[0]-i,a=r[0]-u,l=n[1],c=e[1],f=t[1]-l,s=r[1]-c,h=(a*(l-c)-s*(i-u))/(s*o-a*f);return[i+h*o,l+h*f]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function Ue(n){var t=cl.pop()||new Pe;return t.site=n,t}function je(n){Be(n),ol.remove(n),cl.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,i={x:e,y:r},u=n.P,o=n.N,a=[n];je(n);for(var l=u;l.circle&&xo(e-l.circle.x)f;++f)c=a[f],l=a[f-1],nr(c.edge,l.site,c.site,i);l=a[0],c=a[s-1],c.edge=Ke(l.site,c.site,null,i),$e(l),$e(c)}function He(n){for(var t,e,r,i,u=n.x,o=n.y,a=ol._;a;)if(r=Oe(a,o)-u,r>Uo)a=a.L;else{if(i=u-Ie(a,o),!(i>Uo)){r>-Uo?(t=a.P,e=a):i>-Uo?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var l=Ue(n);if(ol.insert(t,l),t||e){if(t===e)return Be(t),e=Ue(t.site),ol.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,f=c.x,s=c.y,h=n.x-f,p=n.y-s,g=e.site,v=g.x-f,d=g.y-s,y=2*(h*d-p*v),m=h*h+p*p,M=v*v+d*d,x={x:(d*m-p*M)/y+f,y:(h*M-v*m)/y+s};nr(e.edge,c,g,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,g,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,i=e.y,u=i-t;if(!u)return r;var o=n.P;if(!o)return-(1/0);e=o.site;var a=e.x,l=e.y,c=l-t;if(!c)return a;var f=a-r,s=1/u-1/c,h=f/c;return s?(-h+Math.sqrt(h*h-2*s*(f*f/(-2*c)-l+c/2+i-u/2)))/s+r:(r+a)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,i,u,o,a,l,c,f,s=n[0][0],h=n[1][0],p=n[0][1],g=n[1][1],v=ul,d=v.length;d--;)if(u=v[d],u&&u.prepare())for(a=u.edges,l=a.length,o=0;l>o;)f=a[o].end(),r=f.x,i=f.y,c=a[++o%l].start(),t=c.x,e=c.y,(xo(r-t)>Uo||xo(i-e)>Uo)&&(a.splice(o,0,new tr(Qe(u.site,f,xo(r-s)Uo?{x:s,y:xo(t-s)Uo?{x:xo(e-g)Uo?{x:h,y:xo(t-h)Uo?{x:xo(e-p)=-jo)){var p=l*l+c*c,g=f*f+s*s,v=(s*p-c*g)/h,d=(l*g-f*p)/h,s=d+a,y=fl.pop()||new Xe;y.arc=n,y.site=i,y.x=v+o,y.y=s+Math.sqrt(v*v+d*d),y.cy=s,n.circle=y;for(var m=null,M=ll._;M;)if(y.yd||d>=a)return;if(h>g){if(u){if(u.y>=c)return}else u={x:d,y:l};e={x:d,y:c}}else{if(u){if(u.yr||r>1)if(h>g){if(u){if(u.y>=c)return}else u={x:(l-i)/r,y:l};e={x:(c-i)/r,y:c}}else{if(u){if(u.yp){if(u){if(u.x>=a)return}else u={x:o,y:r*o+i};e={x:a,y:r*a+i}}else{if(u){if(u.xu||s>o||r>h||i>p)){if(g=n.point){var g,v=t-n.x,d=e-n.y,y=v*v+d*d;if(l>y){var m=Math.sqrt(l=y);r=t-m,i=e-m,u=t+m,o=e+m,a=g}}for(var M=n.nodes,x=.5*(f+h),b=.5*(s+p),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,f,s,x,b);break;case 1:c(n,x,s,h,b);break;case 2:c(n,f,b,x,p);break;case 3:c(n,x,b,h,p)}}}(n,r,i,u,o),a}function vr(n,t){n=ao.rgb(n),t=ao.rgb(t);var e=n.r,r=n.g,i=n.b,u=t.r-e,o=t.g-r,a=t.b-i;return function(n){return"#"+bn(Math.round(e+u*n))+bn(Math.round(r+o*n))+bn(Math.round(i+a*n))}}function dr(n,t){var e,r={},i={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):i[e]=n[e];for(e in t)e in n||(i[e]=t[e]);return function(n){for(e in r)i[e]=r[e](n);return i}}function yr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function mr(n,t){var e,r,i,u=hl.lastIndex=pl.lastIndex=0,o=-1,a=[],l=[];for(n+="",t+="";(e=hl.exec(n))&&(r=pl.exec(t));)(i=r.index)>u&&(i=t.slice(u,i),a[o]?a[o]+=i:a[++o]=i),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,l.push({i:o,x:yr(e,r)})),u=pl.lastIndex;return ur;++r)a[(e=l[r]).i]=e.x(n);return a.join("")})}function Mr(n,t){for(var e,r=ao.interpolators.length;--r>=0&&!(e=ao.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],i=[],u=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(Mr(n[e],t[e]));for(;u>e;++e)i[e]=n[e];for(;o>e;++e)i[e]=t[e];return function(n){for(e=0;a>e;++e)i[e]=r[e](n);return i}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Io)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ho*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ho/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=ao.hcl(n),t=ao.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,o=t.c-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return sn(e+u*n,r+o*n,i+a*n)+""}}function Dr(n,t){n=ao.hsl(n),t=ao.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,o=t.s-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return cn(e+u*n,r+o*n,i+a*n)+""}}function Pr(n,t){n=ao.lab(n),t=ao.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,o=t.a-r,a=t.b-i;return function(n){return pn(e+u*n,r+o*n,i+a*n)+""}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function jr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),i=Fr(t,e),u=Hr(Or(e,t,-i))||0;t[0]*e[1]180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:yr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:yr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:i-4,x:yr(n[0],t[0])},{i:i-2,x:yr(n[1],t[1])})}else 1===t[0]&&1===t[1]||e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=ao.transform(n),t=ao.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,i=-1,u=r.length;++i=0;)e.push(i[r])}function oi(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(u=n.children)&&(i=u.length))for(var i,u,o=-1;++oe;++e)(t=n[e][1])>i&&(r=e,i=t);return r}function yi(n){return n.reduce(mi,0)}function mi(n,t){return n+t[1]}function Mi(n,t){return xi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function bi(n){return[ao.min(n),ao.max(n)]}function _i(n,t){return n.value-t.value}function wi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Si(n,t){n._pack_next=t,t._pack_prev=n}function ki(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function Ni(n){function t(n){f=Math.min(n.x-n.r,f),s=Math.max(n.x+n.r,s),h=Math.min(n.y-n.r,h),p=Math.max(n.y+n.r,p)}if((e=n.children)&&(c=e.length)){var e,r,i,u,o,a,l,c,f=1/0,s=-(1/0),h=1/0,p=-(1/0);if(e.forEach(Ei),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(i=e[1],i.x=i.r,i.y=0,t(i),c>2))for(u=e[2],zi(r,i,u),t(u),wi(r,u),r._pack_prev=u,wi(u,i),i=r._pack_next,o=3;c>o;o++){zi(r,i,u=e[o]);var g=0,v=1,d=1;for(a=i._pack_next;a!==i;a=a._pack_next,v++)if(ki(a,u)){g=1;break}if(1==g)for(l=r._pack_prev;l!==a._pack_prev&&!ki(l,u);l=l._pack_prev,d++);g?(d>v||v==d&&i.ro;o++)u=e[o],u.x-=y,u.y-=m,M=Math.max(M,u.r+Math.sqrt(u.x*u.x+u.y*u.y));n.r=M,e.forEach(Ai)}}function Ei(n){n._pack_next=n._pack_prev=n}function Ai(n){delete n._pack_next,delete n._pack_prev}function Ci(n,t,e,r){var i=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,i)for(var u=-1,o=i.length;++u=0;)t=i[u],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pi(n,t,e){return n.a.parent===t.parent?n.a:e}function Ui(n){return 1+ao.max(n,function(n){return n.y})}function ji(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fi(n){var t=n.children;return t&&t.length?Fi(t[0]):n}function Hi(n){var t,e=n.children;return e&&(t=e.length)?Hi(e[t-1]):n}function Oi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Ii(n,t){var e=n.x+t[3],r=n.y+t[0],i=n.dx-t[1]-t[3],u=n.dy-t[0]-t[2];return 0>i&&(e+=i/2,i=0),0>u&&(r+=u/2,u=0),{x:e,y:r,dx:i,dy:u}}function Yi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zi(n){return n.rangeExtent?n.rangeExtent():Yi(n.range())}function Vi(n,t,e,r){var i=e(n[0],n[1]),u=r(t[0],t[1]);return function(n){return u(i(n))}}function Xi(n,t){var e,r=0,i=n.length-1,u=n[r],o=n[i];return u>o&&(e=r,r=i,i=e,e=u,u=o,o=e),n[r]=t.floor(u),n[i]=t.ceil(o),n}function $i(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:Sl}function Bi(n,t,e,r){var i=[],u=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?Bi:Vi,l=r?Wr:Br;return o=i(n,t,l,e),a=i(t,n,l,Mr),u}function u(n){return o(n)}var o,a;return u.invert=function(n){return a(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Ur)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return Qi(n,t)},u.tickFormat=function(t,e){return nu(n,t,e)},u.nice=function(t){return Gi(n,t),i()},u.copy=function(){return Wi(n,t,e,r)},i()}function Ji(n,t){return ao.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gi(n,t){return Xi(n,$i(Ki(n,t)[2])),Xi(n,$i(Ki(n,t)[2])),n}function Ki(n,t){null==t&&(t=10);var e=Yi(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return.15>=u?i*=10:.35>=u?i*=5:.75>=u&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function Qi(n,t){return ao.range.apply(ao,Ki(n,t))}function nu(n,t,e){var r=Ki(n,t);if(e){var i=ha.exec(e);if(i.shift(),"s"===i[8]){var u=ao.formatPrefix(Math.max(xo(r[0]),xo(r[1])));return i[7]||(i[7]="."+tu(u.scale(r[2]))),i[8]="f",e=ao.format(i.join("")),function(n){return e(u.scale(n))+u.symbol}}i[7]||(i[7]="."+eu(i[8],r)),e=i.join("")}else e=",."+tu(r[2])+"f";return ao.format(e)}function tu(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function eu(n,t){var e=tu(t[2]);return n in kl?Math.abs(e-tu(Math.max(xo(t[0]),xo(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ru(n,t,e,r){function i(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(i(t))}return o.invert=function(t){return u(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),o):t},o.nice=function(){var t=Xi(r.map(i),e?Math:El);return n.domain(t),r=t.map(u),o},o.ticks=function(){var n=Yi(r),o=[],a=n[0],l=n[1],c=Math.floor(i(a)),f=Math.ceil(i(l)),s=t%1?2:t;if(isFinite(f-c)){if(e){for(;f>c;c++)for(var h=1;s>h;h++)o.push(u(c)*h);o.push(u(c))}else for(o.push(u(c));c++0;h--)o.push(u(c)*h);for(c=0;o[c]l;f--);o=o.slice(c,f)}return o},o.tickFormat=function(n,e){if(!arguments.length)return Nl;arguments.length<2?e=Nl:"function"!=typeof e&&(e=ao.format(e));var r=Math.max(1,t*n/o.ticks().length);return function(n){var o=n/u(Math.round(i(n)));return t-.5>o*t&&(o*=t),r>=o?e(n):""}},o.copy=function(){return ru(n.copy(),t,e,r)},Ji(o,n)}function iu(n,t,e){function r(t){return n(i(t))}var i=uu(t),u=uu(1/t);return r.invert=function(t){return u(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(i)),r):e},r.ticks=function(n){return Qi(e,n)},r.tickFormat=function(n,t){return nu(e,n,t)},r.nice=function(n){return r.domain(Gi(e,n))},r.exponent=function(o){return arguments.length?(i=uu(t=o),u=uu(1/t),n.domain(e.map(i)),r):t},r.copy=function(){return iu(n.copy(),t,e)},Ji(r,n)}function uu(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ou(n,t){function e(e){return u[((i.get(e)||("range"===t.t?i.set(e,n.push(e)):NaN))-1)%u.length]}function r(t,e){return ao.range(n.length).map(function(n){return t+e*n})}var i,u,o;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new c;for(var u,o=-1,a=r.length;++oe?[NaN,NaN]:[e>0?a[e-1]:n[0],et?NaN:t/u+n,[t,t+1/u]},r.copy=function(){return lu(n,t,e)},i()}function cu(n,t){function e(e){return e>=e?t[ao.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return cu(n,t)},e}function fu(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qi(n,t)},t.tickFormat=function(t,e){return nu(n,t,e)},t.copy=function(){return fu(n)},t}function su(){return 0}function hu(n){return n.innerRadius}function pu(n){return n.outerRadius}function gu(n){return n.startAngle}function vu(n){return n.endAngle}function du(n){return n&&n.padAngle}function yu(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function mu(n,t,e,r,i){var u=n[0]-t[0],o=n[1]-t[1],a=(i?r:-r)/Math.sqrt(u*u+o*o),l=a*o,c=-a*u,f=n[0]+l,s=n[1]+c,h=t[0]+l,p=t[1]+c,g=(f+h)/2,v=(s+p)/2,d=h-f,y=p-s,m=d*d+y*y,M=e-r,x=f*p-h*s,b=(0>y?-1:1)*Math.sqrt(Math.max(0,M*M*m-x*x)),_=(x*y-d*b)/m,w=(-x*d-y*b)/m,S=(x*y+d*b)/m,k=(-x*d+y*b)/m,N=_-g,E=w-v,A=S-g,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mu(n){function t(t){function o(){c.push("M",u(n(f),a))}for(var l,c=[],f=[],s=-1,h=t.length,p=En(e),g=En(r);++s1?n.join("L"):n+"Z"}function bu(n){return n.join("L")+"Z"}function _u(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1&&i.push("H",r[0]),i.join("")}function wu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1){a=t[1],u=n[l],l++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1];for(var c=2;c9&&(i=3*t/Math.sqrt(i),o[a]=i*e,o[a+1]=i*r));for(a=-1;++a<=l;)i=(n[Math.min(l,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),u.push([i||0,o[a]*i||0]);return u}function Fu(n){return n.length<3?xu(n):n[0]+Au(n,ju(n))}function Hu(n){for(var t,e,r,i=-1,u=n.length;++i=t?o(n-t):void(f.c=o)}function o(e){var i=g.active,u=g[i];u&&(u.timer.c=null,u.timer.t=NaN,--g.count,delete g[i],u.event&&u.event.interrupt.call(n,n.__data__,u.index));for(var o in g)if(r>+o){var c=g[o];c.timer.c=null,c.timer.t=NaN,--g.count,delete g[o]}f.c=a,qn(function(){return f.c&&a(e||1)&&(f.c=null,f.t=NaN),1},0,l),g.active=r,v.event&&v.event.start.call(n,n.__data__,t),p=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&p.push(r)}),h=v.ease,s=v.duration}function a(i){for(var u=i/s,o=h(u),a=p.length;a>0;)p[--a].call(n,o);return u>=1?(v.event&&v.event.end.call(n,n.__data__,t),--g.count?delete g[r]:delete n[e],1):void 0}var l,f,s,h,p,g=n[e]||(n[e]={active:0,count:0}),v=g[r];v||(l=i.time,f=qn(u,0,l),v=g[r]={tween:new c,time:l,timer:f,delay:i.delay,duration:i.duration,ease:i.ease,index:t},i=null,++g.count)}function no(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function to(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function eo(n){return n.toISOString()}function ro(n,t,e){function r(t){return n(t)}function i(n,e){var r=n[1]-n[0],i=r/e,u=ao.bisect(Kl,i);return u==Kl.length?[t.year,Ki(n.map(function(n){return n/31536e6}),e)[2]]:u?t[i/Kl[u-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yi(r.domain()),u=null==n?i(e,10):"number"==typeof n?i(e,n):!n.range&&[{range:n},t];return u&&(n=u[0],t=u[1]),n.range(e[0],io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ro(n.copy(),t,e)},Ji(r,n)}function io(n){return new Date(n)}function uo(n){return JSON.parse(n.responseText)}function oo(n){var t=fo.createRange();return t.selectNode(fo.body),t.createContextualFragment(n.responseText)}var ao={version:"3.5.17"},lo=[].slice,co=function(n){return lo.call(n)},fo=this.document;if(fo)try{co(fo.documentElement.childNodes)[0].nodeType}catch(so){co=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),fo)try{fo.createElement("DIV").style.setProperty("opacity",0,"")}catch(ho){var po=this.Element.prototype,go=po.setAttribute,vo=po.setAttributeNS,yo=this.CSSStyleDeclaration.prototype,mo=yo.setProperty;po.setAttribute=function(n,t){go.call(this,n,t+"")},po.setAttributeNS=function(n,t,e){vo.call(this,n,t,e+"")},yo.setProperty=function(n,t,e){mo.call(this,n,t+"",e)}}ao.ascending=e,ao.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},ao.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ir&&(e=r)}else{for(;++i=r){e=r;break}for(;++ir&&(e=r)}return e},ao.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ie&&(e=r)}else{for(;++i=r){e=r;break}for(;++ie&&(e=r)}return e},ao.extent=function(n,t){var e,r,i,u=-1,o=n.length;if(1===arguments.length){for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}else{for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}return[e,i]},ao.sum=function(n,t){var e,r=0,u=n.length,o=-1;if(1===arguments.length)for(;++o1?l/(f-1):void 0},ao.deviation=function(){var n=ao.variance.apply(this,arguments);return n?Math.sqrt(n):n};var Mo=u(e);ao.bisectLeft=Mo.left,ao.bisect=ao.bisectRight=Mo.right,ao.bisector=function(n){return u(1===n.length?function(t,r){return e(n(t),r)}:n)},ao.shuffle=function(n,t,e){(u=arguments.length)<3&&(e=n.length,2>u&&(t=0));for(var r,i,u=e-t;u;)i=Math.random()*u--|0,r=n[u+t],n[u+t]=n[i+t],n[i+t]=r;return n},ao.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ao.pairs=function(n){for(var t,e=0,r=n.length-1,i=n[0],u=new Array(0>r?0:r);r>e;)u[e]=[t=i,i=n[++e]];return u},ao.transpose=function(n){if(!(i=n.length))return[];for(var t=-1,e=ao.min(n,o),r=new Array(e);++t=0;)for(r=n[i],t=r.length;--t>=0;)e[--o]=r[t];return e};var xo=Math.abs;ao.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,i=[],u=a(xo(e)),o=-1;if(n*=u,t*=u,e*=u,0>e)for(;(r=n+e*++o)>t;)i.push(r/u);else for(;(r=n+e*++o)=u.length)return r?r.call(i,o):e?o.sort(e):o;for(var l,f,s,h,p=-1,g=o.length,v=u[a++],d=new c;++p=u.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,i={},u=[],o=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(ao.map,e,0),0)},i.key=function(n){return u.push(n),i},i.sortKeys=function(n){return o[u.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},ao.set=function(n){var t=new y;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(y,{has:h,add:function(n){return this._[f(n+="")]=!0,n},remove:p,values:g,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,s(t))}}),ao.behavior={},ao.rebind=function(n,t){for(var e,r=1,i=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ao.event=null,ao.requote=function(n){return n.replace(So,"\\$&")};var So=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ko={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},No=function(n,t){return t.querySelector(n)},Eo=function(n,t){return t.querySelectorAll(n)},Ao=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ao=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(No=function(n,t){return Sizzle(n,t)[0]||null},Eo=Sizzle,Ao=Sizzle.matchesSelector),ao.selection=function(){return ao.select(fo.documentElement)};var Co=ao.selection.prototype=[];Co.select=function(n){var t,e,r,i,u=[];n=A(n);for(var o=-1,a=this.length;++o=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Lo.hasOwnProperty(e)?{space:Lo[e],local:n}:n}},Co.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ao.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Co.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,i=-1;if(t=e.classList){for(;++ii){if("string"!=typeof n){2>i&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>i){var u=this.node();return t(u).getComputedStyle(u,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Co.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},Co.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Co.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Co.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Co.insert=function(n,t){return n=j(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Co.remove=function(){return this.each(F)},Co.data=function(n,t){function e(n,e){var r,i,u,o=n.length,s=e.length,h=Math.min(o,s),p=new Array(s),g=new Array(s),v=new Array(o);if(t){var d,y=new c,m=new Array(o);for(r=-1;++rr;++r)g[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}g.update=p,g.parentNode=p.parentNode=v.parentNode=n.parentNode,a.push(g),l.push(p),f.push(v)}var r,i,u=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++uu;u++){i.push(t=[]),t.parentNode=(e=this[u]).parentNode;for(var a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return E(i)},Co.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},Co.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,i=e.length;i>r;r++){var u=e[r];if(u)return u}return null},Co.size=function(){var n=0;return Y(this,function(){++n}),n};var qo=[];ao.selection.enter=Z,ao.selection.enter.prototype=qo,qo.append=Co.append,qo.empty=Co.empty,qo.node=Co.node,qo.call=Co.call,qo.size=Co.size,qo.select=function(n){for(var t,e,r,i,u,o=[],a=-1,l=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var To=ao.map({mouseenter:"mouseover",mouseleave:"mouseout"});fo&&To.forEach(function(n){"on"+n in fo&&To.remove(n)});var Ro,Do=0;ao.mouse=function(n){return J(n,k())};var Po=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ao.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,i=0,u=t.length;u>i;++i)if((r=t[i]).identifier===e)return J(n,r)},ao.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",o)}function e(n,t,e,u,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],g|=n|e,M=r,p({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(y.on(u+d,null).on(o+d,null),m(g),p({type:"dragend"}))}var c,f=this,s=ao.event.target.correspondingElement||ao.event.target,h=f.parentNode,p=r.of(f,arguments),g=0,v=n(),d=".drag"+(null==v?"":"-"+v),y=ao.select(e(s)).on(u+d,a).on(o+d,l),m=W(s),M=t(h,v);i?(c=i.apply(f,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],p({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),i=null,u=e(b,ao.mouse,t,"mousemove","mouseup"),o=e(G,ao.touch,m,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},ao.rebind(n,r,"on")},ao.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?co(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Uo=1e-6,jo=Uo*Uo,Fo=Math.PI,Ho=2*Fo,Oo=Ho-Uo,Io=Fo/2,Yo=Fo/180,Zo=180/Fo,Vo=Math.SQRT2,Xo=2,$o=4;ao.interpolateZoom=function(n,t){var e,r,i=n[0],u=n[1],o=n[2],a=t[0],l=t[1],c=t[2],f=a-i,s=l-u,h=f*f+s*s;if(jo>h)r=Math.log(c/o)/Vo,e=function(n){return[i+n*f,u+n*s,o*Math.exp(Vo*n*r)]};else{var p=Math.sqrt(h),g=(c*c-o*o+$o*h)/(2*o*Xo*p),v=(c*c-o*o-$o*h)/(2*c*Xo*p),d=Math.log(Math.sqrt(g*g+1)-g),y=Math.log(Math.sqrt(v*v+1)-v);r=(y-d)/Vo,e=function(n){var t=n*r,e=rn(d),a=o/(Xo*p)*(e*un(Vo*t+d)-en(d));return[i+a*f,u+a*s,o*e/rn(Vo*t+d)]}}return e.duration=1e3*r,e},ao.behavior.zoom=function(){function n(n){n.on(L,s).on(Wo+".zoom",p).on("dblclick.zoom",g).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function i(n){k.k=Math.max(A[0],Math.min(A[1],n))}function u(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},i(Math.pow(2,o)),u(d=e,r),t=ao.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function f(n){--z||(n({type:"zoomend"}),d=null)}function s(){function n(){a=1,u(ao.mouse(i),h),c(o)}function r(){s.on(q,null).on(T,null),p(a),f(o)}var i=this,o=D.of(i,arguments),a=0,s=ao.select(t(i)).on(q,n).on(T,r),h=e(ao.mouse(i)),p=W(i);Il.call(i),l(o)}function h(){function n(){var n=ao.touches(g);return p=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ao.event.target;ao.select(t).on(x,r).on(b,a),_.push(t);for(var e=ao.event.changedTouches,i=0,u=e.length;u>i;++i)d[e[i].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var f=l[0];o(g,f,d[f.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var f=l[0],s=l[1],h=f[0]-s[0],p=f[1]-s[1];y=h*h+p*p}}function r(){var n,t,e,r,o=ao.touches(g);Il.call(g);for(var a=0,l=o.length;l>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var f=(f=e[0]-n[0])*f+(f=e[1]-n[1])*f,s=y&&Math.sqrt(f/y);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],i(s*p)}M=null,u(n,t),c(v)}function a(){if(ao.event.touches.length){for(var t=ao.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var i in d)return void n()}ao.selectAll(_).on(m,null),w.on(L,s).on(R,h),N(),f(v)}var p,g=this,v=D.of(g,arguments),d={},y=0,m=".zoom-"+ao.event.changedTouches[0].identifier,x="touchmove"+m,b="touchend"+m,_=[],w=ao.select(g),N=W(g);t(),l(v),w.on(L,null).on(R,t)}function p(){var n=D.of(this,arguments);m?clearTimeout(m):(Il.call(this),v=e(d=y||ao.mouse(this)),l(n)),m=setTimeout(function(){m=null,f(n)},50),S(),i(Math.pow(2,.002*Bo())*k.k),u(d,v),c(n)}function g(){var n=ao.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ao.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,y,m,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Jo,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=N(n,"zoomstart","zoom","zoomend");return Wo||(Wo="onwheel"in fo?(Bo=function(){return-ao.event.deltaY*(ao.event.deltaMode?120:1)},"wheel"):"onmousewheel"in fo?(Bo=function(){return ao.event.wheelDelta},"mousewheel"):(Bo=function(){return-ao.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Hl?ao.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],i=d?d[0]:e/2,u=d?d[1]:r/2,o=ao.interpolateZoom([(i-k.x)/k.k,(u-k.y)/k.k,e/k.k],[(i-t.x)/t.k,(u-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:i-r[0]*a,y:u-r[1]*a,k:a},c(n)}}).each("interrupt.zoom",function(){f(n)}).each("end.zoom",function(){f(n)}):(this.__chart__=k,l(n),c(n),f(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},i(+t),a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Jo:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(y=t&&[+t[0],+t[1]],n):y},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ao.rebind(n,D,"on")};var Bo,Wo,Jo=[0,1/0];ao.color=an,an.prototype.toString=function(){return this.rgb()+""},ao.hsl=ln;var Go=ln.prototype=new an;Go.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Go.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Go.rgb=function(){return cn(this.h,this.s,this.l)},ao.hcl=fn;var Ko=fn.prototype=new an;Ko.brighter=function(n){return new fn(this.h,this.c,Math.min(100,this.l+Qo*(arguments.length?n:1)))},Ko.darker=function(n){return new fn(this.h,this.c,Math.max(0,this.l-Qo*(arguments.length?n:1)))},Ko.rgb=function(){return sn(this.h,this.c,this.l).rgb()},ao.lab=hn;var Qo=18,na=.95047,ta=1,ea=1.08883,ra=hn.prototype=new an;ra.brighter=function(n){return new hn(Math.min(100,this.l+Qo*(arguments.length?n:1)),this.a,this.b)},ra.darker=function(n){return new hn(Math.max(0,this.l-Qo*(arguments.length?n:1)),this.a,this.b)},ra.rgb=function(){return pn(this.l,this.a,this.b)},ao.rgb=mn;var ia=mn.prototype=new an;ia.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,i=30;return t||e||r?(t&&i>t&&(t=i),e&&i>e&&(e=i),r&&i>r&&(r=i),new mn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mn(i,i,i)},ia.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mn(n*this.r,n*this.g,n*this.b)},ia.hsl=function(){return wn(this.r,this.g,this.b)},ia.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ua=ao.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ua.forEach(function(n,t){ua.set(n,Mn(t))}),ao.functor=En,ao.xhr=An(m),ao.dsv=function(n,t){function e(n,e,u){arguments.length<3&&(u=e,e=null);var o=Cn(n,t,null==e?r:i(e),u);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:i(n)):e},o}function r(n){return e.parse(n.responseText)}function i(n){return function(t){return e.parse(t.responseText,n)}}function u(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var i=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(i(n),e)}:i})},e.parseRows=function(n,t){function e(){if(f>=c)return o;if(i)return i=!1,u;var t=f;if(34===n.charCodeAt(t)){for(var e=t;e++f;){var r=n.charCodeAt(f++),a=1;if(10===r)i=!0;else if(13===r)i=!0,10===n.charCodeAt(f)&&(++f,++a);else if(r!==l)continue;return n.slice(t,f-a)}return n.slice(t)}for(var r,i,u={},o={},a=[],c=n.length,f=0,s=0;(r=e())!==o;){for(var h=[];r!==u&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,s++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new y,i=[];return t.forEach(function(n){for(var t in n)r.has(t)||i.push(r.add(t))}),[i.map(o).join(n)].concat(t.map(function(t){return i.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(u).join("\n")},e},ao.csv=ao.dsv(",","text/csv"),ao.tsv=ao.dsv(" ","text/tab-separated-values");var oa,aa,la,ca,fa=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ao.timer=function(){qn.apply(this,arguments)},ao.timer.flush=function(){Rn(),Dn()},ao.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var sa=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Un);ao.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=ao.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),sa[8+e/3]};var ha=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,pa=ao.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ao.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ga=ao.time={},va=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){da.setUTCDate.apply(this._,arguments)},setDay:function(){da.setUTCDay.apply(this._,arguments)},setFullYear:function(){da.setUTCFullYear.apply(this._,arguments)},setHours:function(){da.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){da.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){da.setUTCMinutes.apply(this._,arguments)},setMonth:function(){da.setUTCMonth.apply(this._,arguments)},setSeconds:function(){da.setUTCSeconds.apply(this._,arguments)},setTime:function(){da.setTime.apply(this._,arguments)}};var da=Date.prototype;ga.year=On(function(n){return n=ga.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ga.years=ga.year.range,ga.years.utc=ga.year.utc.range,ga.day=On(function(n){var t=new va(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ga.days=ga.day.range,ga.days.utc=ga.day.utc.range,ga.dayOfYear=function(n){var t=ga.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ga[n]=On(function(n){return(n=ga.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ga[n+"s"]=e.range,ga[n+"s"].utc=e.utc.range,ga[n+"OfYear"]=function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)}}),ga.week=ga.sunday,ga.weeks=ga.sunday.range,ga.weeks.utc=ga.sunday.utc.range,ga.weekOfYear=ga.sundayOfYear;var ya={"-":"",_:" ",0:"0"},ma=/^\s*\d+/,Ma=/^%/;ao.locale=function(n){return{numberFormat:jn(n),timeFormat:Yn(n)}};var xa=ao.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], +shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ao.format=xa.numberFormat,ao.geo={},ft.prototype={s:0,t:0,add:function(n){st(n,this.t,ba),st(ba.s,this.s,this),this.s?this.t+=ba.t:this.s=ba.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var ba=new ft;ao.geo.stream=function(n,t){n&&_a.hasOwnProperty(n.type)?_a[n.type](n,t):ht(n,t)};var _a={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,i=e.length;++rn?4*Fo+n:n,Na.lineStart=Na.lineEnd=Na.point=b}};ao.geo.bounds=function(){function n(n,t){M.push(x=[f=n,h=n]),s>t&&(s=t),t>p&&(p=t)}function t(t,e){var r=dt([t*Yo,e*Yo]);if(y){var i=mt(y,r),u=[i[1],-i[0],0],o=mt(u,i);bt(o),o=_t(o);var l=t-g,c=l>0?1:-1,v=o[0]*Zo*c,d=xo(l)>180;if(d^(v>c*g&&c*t>v)){var m=o[1]*Zo;m>p&&(p=m)}else if(v=(v+360)%360-180,d^(v>c*g&&c*t>v)){var m=-o[1]*Zo;s>m&&(s=m)}else s>e&&(s=e),e>p&&(p=e);d?g>t?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t):h>=f?(f>t&&(f=t),t>h&&(h=t)):t>g?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t)}else n(t,e);y=r,g=t}function e(){b.point=t}function r(){x[0]=f,x[1]=h,b.point=n,y=null}function i(n,e){if(y){var r=n-g;m+=xo(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Na.point(n,e),t(n,e)}function u(){Na.lineStart()}function o(){i(v,d),Na.lineEnd(),xo(m)>Uo&&(f=-(h=180)),x[0]=f,x[1]=h,y=null}function a(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nka?(f=-(h=180),s=-(p=90)):m>Uo?p=90:-Uo>m&&(s=-90),x[0]=f,x[1]=h}};return function(n){p=h=-(f=s=1/0),M=[],ao.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,i=M[0],u=[i];t>r;++r)e=M[r],c(e[0],i)||c(e[1],i)?(a(i[0],e[1])>a(i[0],i[1])&&(i[1]=e[1]),a(e[0],i[1])>a(i[0],i[1])&&(i[0]=e[0])):u.push(i=e);for(var o,e,g=-(1/0),t=u.length-1,r=0,i=u[t];t>=r;i=e,++r)e=u[r],(o=a(i[1],e[0]))>g&&(g=o,f=e[0],h=i[1])}return M=x=null,f===1/0||s===1/0?[[NaN,NaN],[NaN,NaN]]:[[f,s],[h,p]]}}(),ao.geo.centroid=function(n){Ea=Aa=Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,ja);var t=Da,e=Pa,r=Ua,i=t*t+e*e+r*r;return jo>i&&(t=qa,e=Ta,r=Ra,Uo>Aa&&(t=Ca,e=za,r=La),i=t*t+e*e+r*r,jo>i)?[NaN,NaN]:[Math.atan2(e,t)*Zo,tn(r/Math.sqrt(i))*Zo]};var Ea,Aa,Ca,za,La,qa,Ta,Ra,Da,Pa,Ua,ja={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){ja.lineStart=At},polygonEnd:function(){ja.lineStart=Nt}},Fa=Rt(zt,jt,Ht,[-Fo,-Fo/2]),Ha=1e9;ao.geo.clipExtent=function(){var n,t,e,r,i,u,o={stream:function(n){return i&&(i.valid=!1),i=u(n),i.valid=!0,i},extent:function(a){return arguments.length?(u=Zt(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),i&&(i.valid=!1,i=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ao.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,ao.geo.albers=function(){return ao.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ao.geo.albersUsa=function(){function n(n){var u=n[0],o=n[1];return t=null,e(u,o),t||(r(u,o),t)||i(u,o),t}var t,e,r,i,u=ao.geo.albers(),o=ao.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ao.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=u.scale(),e=u.translate(),r=(n[0]-e[0])/t,i=(n[1]-e[1])/t;return(i>=.12&&.234>i&&r>=-.425&&-.214>r?o:i>=.166&&.234>i&&r>=-.214&&-.115>r?a:u).invert(n)},n.stream=function(n){var t=u.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,i){t.point(n,i),e.point(n,i),r.point(n,i)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(u.precision(t),o.precision(t),a.precision(t),n):u.precision()},n.scale=function(t){return arguments.length?(u.scale(t),o.scale(.35*t),a.scale(t),n.translate(u.translate())):u.scale()},n.translate=function(t){if(!arguments.length)return u.translate();var c=u.scale(),f=+t[0],s=+t[1];return e=u.translate(t).clipExtent([[f-.455*c,s-.238*c],[f+.455*c,s+.238*c]]).stream(l).point,r=o.translate([f-.307*c,s+.201*c]).clipExtent([[f-.425*c+Uo,s+.12*c+Uo],[f-.214*c-Uo,s+.234*c-Uo]]).stream(l).point,i=a.translate([f-.205*c,s+.212*c]).clipExtent([[f-.214*c+Uo,s+.166*c+Uo],[f-.115*c-Uo,s+.234*c-Uo]]).stream(l).point,n},n.scale(1070)};var Oa,Ia,Ya,Za,Va,Xa,$a={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Ia=0,$a.lineStart=$t},polygonEnd:function(){$a.lineStart=$a.lineEnd=$a.point=b,Oa+=xo(Ia/2)}},Ba={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Wa={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Wa.lineStart=ne},polygonEnd:function(){Wa.point=Gt,Wa.lineStart=Kt,Wa.lineEnd=Qt}};ao.geo.path=function(){function n(n){return n&&("function"==typeof a&&u.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=i(u)),ao.geo.stream(n,o)),u.result()}function t(){return o=null,n}var e,r,i,u,o,a=4.5;return n.area=function(n){return Oa=0,ao.geo.stream(n,i($a)),Oa},n.centroid=function(n){return Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,i(Wa)),Ua?[Da/Ua,Pa/Ua]:Ra?[qa/Ra,Ta/Ra]:La?[Ca/La,za/La]:[NaN,NaN]},n.bounds=function(n){return Va=Xa=-(Ya=Za=1/0),ao.geo.stream(n,i(Ba)),[[Ya,Za],[Va,Xa]]},n.projection=function(n){return arguments.length?(i=(e=n)?n.stream||re(n):m,t()):e},n.context=function(n){return arguments.length?(u=null==(r=n)?new Wt:new te(n),"function"!=typeof a&&u.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(u.pointRadius(+t),+t),n):a},n.projection(ao.geo.albersUsa()).context(null)},ao.geo.transform=function(n){return{stream:function(t){var e=new ie(t);for(var r in n)e[r]=n[r];return e}}},ie.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ao.geo.projection=oe,ao.geo.projectionMutator=ae,(ao.geo.equirectangular=function(){return oe(ce)}).raw=ce.invert=ce,ao.geo.rotation=function(n){function t(t){return t=n(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t}return n=se(n[0]%360*Yo,n[1]*Yo,n.length>2?n[2]*Yo:0),t.invert=function(t){return t=n.invert(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t},t},fe.invert=ce,ao.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=se(-n[0]*Yo,-n[1]*Yo,0).invert,i=[];return e(null,null,1,{point:function(n,e){i.push(n=t(n,e)),n[0]*=Zo,n[1]*=Zo}}),{type:"Polygon",coordinates:[i]}}var t,e,r=[0,0],i=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Yo,i*Yo),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Yo,(i=+r)*Yo),n):i},n.angle(90)},ao.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Yo,i=n[1]*Yo,u=t[1]*Yo,o=Math.sin(r),a=Math.cos(r),l=Math.sin(i),c=Math.cos(i),f=Math.sin(u),s=Math.cos(u);return Math.atan2(Math.sqrt((e=s*o)*e+(e=c*f-l*s*a)*e),l*f+c*s*a)},ao.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ao.range(Math.ceil(u/d)*d,i,d).map(h).concat(ao.range(Math.ceil(c/y)*y,l,y).map(p)).concat(ao.range(Math.ceil(r/g)*g,e,g).filter(function(n){return xo(n%d)>Uo}).map(f)).concat(ao.range(Math.ceil(a/v)*v,o,v).filter(function(n){return xo(n%y)>Uo}).map(s))}var e,r,i,u,o,a,l,c,f,s,h,p,g=10,v=g,d=90,y=360,m=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(p(l).slice(1),h(i).reverse().slice(1),p(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(u=+t[0][0],i=+t[1][0],c=+t[0][1],l=+t[1][1],u>i&&(t=u,u=i,i=t),c>l&&(t=c,c=l,l=t),n.precision(m)):[[u,c],[i,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(m)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],y=+t[1],n):[d,y]},n.minorStep=function(t){return arguments.length?(g=+t[0],v=+t[1],n):[g,v]},n.precision=function(t){return arguments.length?(m=+t,f=ye(a,o,90),s=me(r,e,m),h=ye(c,l,90),p=me(u,i,m),n):m},n.majorExtent([[-180,-90+Uo],[180,90-Uo]]).minorExtent([[-180,-80-Uo],[180,80+Uo]])},ao.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||i.apply(this,arguments)]}}var t,e,r=Me,i=xe;return n.distance=function(){return ao.geo.distance(t||r.apply(this,arguments),e||i.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(i=t,e="function"==typeof t?null:t,n):i},n.precision=function(){return arguments.length?n:0},n},ao.geo.interpolate=function(n,t){return be(n[0]*Yo,n[1]*Yo,t[0]*Yo,t[1]*Yo)},ao.geo.length=function(n){return Ja=0,ao.geo.stream(n,Ga),Ja};var Ja,Ga={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Ka=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ao.geo.azimuthalEqualArea=function(){return oe(Ka)}).raw=Ka;var Qa=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},m);(ao.geo.azimuthalEquidistant=function(){return oe(Qa)}).raw=Qa,(ao.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(ao.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var nl=we(function(n){return 1/n},Math.atan);(ao.geo.gnomonic=function(){return oe(nl)}).raw=nl,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Io]},(ao.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var tl=we(function(){return 1},Math.asin);(ao.geo.orthographic=function(){return oe(tl)}).raw=tl;var el=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ao.geo.stereographic=function(){return oe(el)}).raw=el,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Io]},(ao.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,ao.geom={},ao.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,i=En(e),u=En(r),o=n.length,a=[],l=[];for(t=0;o>t;t++)a.push([+i.call(this,n[t],t),+u.call(this,n[t],t),t]);for(a.sort(qe),t=0;o>t;t++)l.push([a[t][0],-a[t][1]]);var c=Le(a),f=Le(l),s=f[0]===c[0],h=f[f.length-1]===c[c.length-1],p=[];for(t=c.length-1;t>=0;--t)p.push(n[a[c[t]][2]]);for(t=+s;t=r&&c.x<=u&&c.y>=i&&c.y<=o?[[r,o],[u,o],[u,i],[r,i]]:[];f.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(u(n,t)/Uo)*Uo,y:Math.round(o(n,t)/Uo)*Uo,i:t}})}var r=Ce,i=ze,u=r,o=i,a=sl;return n?t(n):(t.links=function(n){return ar(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return ar(e(n)).cells.forEach(function(e,r){for(var i,u,o=e.site,a=e.edges.sort(Ve),l=-1,c=a.length,f=a[c-1].edge,s=f.l===o?f.r:f.l;++l=c,h=r>=f,p=h<<1|s;n.leaf=!1,n=n.nodes[p]||(n.nodes[p]=hr()),s?i=c:a=c,h?o=f:l=f,u(n,t,e,r,i,o,a,l)}var f,s,h,p,g,v,d,y,m,M=En(a),x=En(l);if(null!=t)v=t,d=e,y=r,m=i;else if(y=m=-(v=d=1/0),s=[],h=[],g=n.length,o)for(p=0;g>p;++p)f=n[p],f.xy&&(y=f.x),f.y>m&&(m=f.y),s.push(f.x),h.push(f.y);else for(p=0;g>p;++p){var b=+M(f=n[p],p),_=+x(f,p);v>b&&(v=b),d>_&&(d=_),b>y&&(y=b),_>m&&(m=_),s.push(b),h.push(_)}var w=y-v,S=m-d;w>S?m=d+w:y=v+S;var k=hr();if(k.add=function(n){u(k,n,+M(n,++p),+x(n,p),v,d,y,m)},k.visit=function(n){pr(n,k,v,d,y,m)},k.find=function(n){return gr(k,n[0],n[1],v,d,y,m)},p=-1,null==t){for(;++p=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=vl.get(e)||gl,r=dl.get(r)||m,br(r(e.apply(null,lo.call(arguments,1))))},ao.interpolateHcl=Rr,ao.interpolateHsl=Dr,ao.interpolateLab=Pr,ao.interpolateRound=Ur,ao.transform=function(n){var t=fo.createElementNS(ao.ns.prefix.svg,"g");return(ao.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new jr(e?e.matrix:yl)})(n)},jr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var yl={a:1,b:0,c:0,d:1,e:0,f:0};ao.interpolateTransform=$r,ao.layout={},ao.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/y){if(v>l){var c=t.charge/l;n.px-=u*c,n.py-=o*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=u*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=ao.event.x,n.py=ao.event.y,l.resume()}var e,r,i,u,o,a,l={},c=ao.dispatch("start","tick","end"),f=[1,1],s=.9,h=ml,p=Ml,g=-30,v=xl,d=.1,y=.64,M=[],x=[];return l.tick=function(){if((i*=.99)<.005)return e=null,c.end({type:"end",alpha:i=0}),!0;var t,r,l,h,p,v,y,m,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,p=l.target,m=p.x-h.x,b=p.y-h.y,(v=m*m+b*b)&&(v=i*o[r]*((v=Math.sqrt(v))-u[r])/v,m*=v,b*=v,p.x-=m*(y=h.weight+p.weight?h.weight/(h.weight+p.weight):.5),p.y-=b*y,h.x+=m*(y=1-y),h.y+=b*y);if((y=i*d)&&(m=f[0]/2,b=f[1]/2,r=-1,y))for(;++r<_;)l=M[r],l.x+=(m-l.x)*y,l.y+=(b-l.y)*y;if(g)for(ri(t=ao.geom.quadtree(M),i,a),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*s,l.y-=(l.py-(l.py=l.y))*s);c.tick({type:"tick",alpha:i})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(f=n,l):f},l.linkDistance=function(n){return arguments.length?(h="function"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(p="function"==typeof n?n:+n,l):p},l.friction=function(n){return arguments.length?(s=+n,l):s},l.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,l):g},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(y=n*n,l):Math.sqrt(y)},l.alpha=function(n){return arguments.length?(n=+n,i?n>0?i=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:i=0})):n>0&&(c.start({type:"start",alpha:i=n}),e=qn(l.tick)),l):i},l.start=function(){function n(n,r){if(!e){for(e=new Array(i),l=0;i>l;++l)e[l]=[];for(l=0;c>l;++l){var u=x[l];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var o,a=e[t],l=-1,f=a.length;++lt;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],"number"==typeof r.source&&(r.source=M[r.source]),"number"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;i>t;++t)r=M[t],isNaN(r.x)&&(r.x=n("x",s)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof h)for(t=0;c>t;++t)u[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)u[t]=h;if(o=[],"function"==typeof p)for(t=0;c>t;++t)o[t]=+p.call(this,x[t],t);else for(t=0;c>t;++t)o[t]=p;if(a=[],"function"==typeof g)for(t=0;i>t;++t)a[t]=+g.call(this,M[t],t);else for(t=0;i>t;++t)a[t]=g;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=ao.behavior.drag().origin(m).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",ni)),arguments.length?void this.on("mouseover.force",ti).on("mouseout.force",ei).call(r):r},ao.rebind(l,c,"on")};var ml=20,Ml=1,xl=1/0;ao.layout.hierarchy=function(){function n(i){var u,o=[i],a=[];for(i.depth=0;null!=(u=o.pop());)if(a.push(u),(c=e.call(n,u,u.depth))&&(l=c.length)){for(var l,c,f;--l>=0;)o.push(f=c[l]),f.parent=u,f.depth=u.depth+1;r&&(u.value=0),u.children=c}else r&&(u.value=+r.call(n,u,u.depth)||0),delete u.children;return oi(i,function(n){var e,i;t&&(e=n.children)&&e.sort(t),r&&(i=n.parent)&&(i.value+=n.value)}),a}var t=ci,e=ai,r=li;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(ui(t,function(n){n.children&&(n.value=0)}),oi(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ao.layout.partition=function(){function n(t,e,r,i){var u=t.children;if(t.x=e,t.y=t.depth*i,t.dx=r,t.dy=i,u&&(o=u.length)){var o,a,l,c=-1;for(r=t.value?r/t.value:0;++cs?-1:1),g=ao.sum(c),v=g?(s-l*p)/g:0,d=ao.range(l),y=[];return null!=e&&d.sort(e===bl?function(n,t){return c[t]-c[n]}:function(n,t){return e(o[n],o[t])}),d.forEach(function(n){y[n]={data:o[n],value:a=c[n],startAngle:f,endAngle:f+=a*v+p,padAngle:h}}),y}var t=Number,e=bl,r=0,i=Ho,u=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(i=t,n):i},n.padAngle=function(t){return arguments.length?(u=t,n):u},n};var bl={};ao.layout.stack=function(){function n(a,l){if(!(h=a.length))return a;var c=a.map(function(e,r){return t.call(n,e,r)}),f=c.map(function(t){return t.map(function(t,e){return[u.call(n,t,e),o.call(n,t,e)]})}),s=e.call(n,f,l);c=ao.permute(c,s),f=ao.permute(f,s);var h,p,g,v,d=r.call(n,f,l),y=c[0].length;for(g=0;y>g;++g)for(i.call(n,c[0][g],v=d[g],f[0][g][1]),p=1;h>p;++p)i.call(n,c[p][g],v+=f[p-1][g][1],f[p][g][1]);return a}var t=m,e=gi,r=vi,i=pi,u=si,o=hi;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:_l.get(t)||gi,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:wl.get(t)||vi,n):r},n.x=function(t){return arguments.length?(u=t,n):u},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(i=t,n):i},n};var _l=ao.map({"inside-out":function(n){var t,e,r=n.length,i=n.map(di),u=n.map(yi),o=ao.range(r).sort(function(n,t){return i[n]-i[t]}),a=0,l=0,c=[],f=[];for(t=0;r>t;++t)e=o[t],l>a?(a+=u[e],c.push(e)):(l+=u[e],f.push(e));return f.reverse().concat(c)},reverse:function(n){return ao.range(n.length).reverse()},"default":gi}),wl=ao.map({silhouette:function(n){var t,e,r,i=n.length,u=n[0].length,o=[],a=0,l=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;u>e;++e)l[e]=(a-o[e])/2;return l},wiggle:function(n){var t,e,r,i,u,o,a,l,c,f=n.length,s=n[0],h=s.length,p=[];for(p[0]=l=c=0,e=1;h>e;++e){for(t=0,i=0;f>t;++t)i+=n[t][e][1];for(t=0,u=0,a=s[e][0]-s[e-1][0];f>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;u+=o*n[t][e][1]}p[e]=l-=i?u/i*a:0,c>l&&(c=l)}for(e=0;h>e;++e)p[e]-=c;return p},expand:function(n){var t,e,r,i=n.length,u=n[0].length,o=1/i,a=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];if(r)for(t=0;i>t;t++)n[t][e][1]/=r;else for(t=0;i>t;t++)n[t][e][1]=o}for(e=0;u>e;++e)a[e]=0;return a},zero:vi});ao.layout.histogram=function(){function n(n,u){for(var o,a,l=[],c=n.map(e,this),f=r.call(this,c,u),s=i.call(this,f,c,u),u=-1,h=c.length,p=s.length-1,g=t?1:1/h;++u0)for(u=-1;++u=f[0]&&a<=f[1]&&(o=l[ao.bisect(s,a,1,p)-1],o.y+=g,o.push(n[u]));return l}var t=!0,e=Number,r=bi,i=Mi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(i="number"==typeof t?function(n){return xi(n,t)}:En(t),n):i},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ao.layout.pack=function(){function n(n,u){var o=e.call(this,n,u),a=o[0],l=i[0],c=i[1],f=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,oi(a,function(n){n.r=+f(n.value)}),oi(a,Ni),r){var s=r*(t?1:Math.max(2*a.r/l,2*a.r/c))/2;oi(a,function(n){n.r+=s}),oi(a,Ni),oi(a,function(n){n.r-=s})}return Ci(a,l/2,c/2,t?1:1/Math.max(2*a.r/l,2*a.r/c)),o}var t,e=ao.layout.hierarchy().sort(_i),r=0,i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},ii(n,e)},ao.layout.tree=function(){function n(n,i){var f=o.call(this,n,i),s=f[0],h=t(s);if(oi(h,e),h.parent.m=-h.z,ui(h,r),c)ui(s,u);else{var p=s,g=s,v=s;ui(s,function(n){n.xg.x&&(g=n),n.depth>v.depth&&(v=n)});var d=a(p,g)/2-p.x,y=l[0]/(g.x+a(g,p)/2+d),m=l[1]/(v.depth||1);ui(s,function(n){n.x=(n.x+d)*y,n.y=n.depth*m})}return f}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var i,u=t.children,o=0,a=u.length;a>o;++o)r.push((u[o]=i={_:u[o],parent:t,children:(i=u[o].children)&&i.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=i);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Di(n);var u=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-u):n.z=u}else r&&(n.z=r.z+a(n._,r._));n.parent.A=i(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function i(n,t,e){if(t){for(var r,i=n,u=n,o=t,l=i.parent.children[0],c=i.m,f=u.m,s=o.m,h=l.m;o=Ti(o),i=qi(i),o&&i;)l=qi(l),u=Ti(u),u.a=n,r=o.z+s-i.z-c+a(o._,i._),r>0&&(Ri(Pi(o,n,e),n,r),c+=r,f+=r),s+=o.m,c+=i.m,h+=l.m,f+=u.m;o&&!Ti(u)&&(u.t=o,u.m+=s-f),i&&!qi(l)&&(l.t=i,l.m+=c-h,e=n)}return e}function u(n){n.x*=l[0],n.y=n.depth*l[1]}var o=ao.layout.hierarchy().sort(null).value(null),a=Li,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(c=null==(l=t)?u:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:u,n):c?l:null},ii(n,o)},ao.layout.cluster=function(){function n(n,u){var o,a=t.call(this,n,u),l=a[0],c=0;oi(l,function(n){var t=n.children;t&&t.length?(n.x=ji(t),n.y=Ui(t)):(n.x=o?c+=e(n,o):0,n.y=0,o=n)});var f=Fi(l),s=Hi(l),h=f.x-e(f,s)/2,p=s.x+e(s,f)/2;return oi(l,i?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(p-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),a}var t=ao.layout.hierarchy().sort(null).value(null),e=Li,r=[1,1],i=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(i=null==(r=t),n):i?null:r},n.nodeSize=function(t){return arguments.length?(i=null!=(r=t),n):i?r:null},ii(n,t)},ao.layout.treemap=function(){function n(n,t){for(var e,r,i=-1,u=n.length;++it?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var u=e.children;if(u&&u.length){var o,a,l,c=s(e),f=[],h=u.slice(),g=1/0,v="slice"===p?c.dx:"dice"===p?c.dy:"slice-dice"===p?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),f.area=0;(l=h.length)>0;)f.push(o=h[l-1]),f.area+=o.area,"squarify"!==p||(a=r(f,v))<=g?(h.pop(),g=a):(f.area-=f.pop().area,i(f,v,c,!1),v=Math.min(c.dx,c.dy),f.length=f.area=0,g=1/0);f.length&&(i(f,v,c,!0),f.length=f.area=0),u.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var u,o=s(t),a=r.slice(),l=[];for(n(a,o.dx*o.dy/t.value),l.area=0;u=a.pop();)l.push(u),l.area+=u.area,null!=u.z&&(i(l,u.z?o.dx:o.dy,o,!a.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,i=0,u=1/0,o=-1,a=n.length;++oe&&(u=e),e>i&&(i=e));return r*=r,t*=t,r?Math.max(t*i*g/r,r/(t*u*g)):1/0}function i(n,t,e,r){var i,u=-1,o=n.length,a=e.x,c=e.y,f=t?l(n.area/t):0; +if(t==e.dx){for((r||f>e.dy)&&(f=e.dy);++ue.dx)&&(f=e.dx);++ue&&(t=1),1>e&&(n=0),function(){var e,r,i;do e=2*Math.random()-1,r=2*Math.random()-1,i=e*e+r*r;while(!i||i>1);return n+t*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var n=ao.random.normal.apply(ao,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ao.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ao.scale={};var Sl={floor:m,ceil:m};ao.scale.linear=function(){return Wi([0,1],[0,1],Mr,!1)};var kl={s:1,g:1,p:1,r:1,e:1};ao.scale.log=function(){return ru(ao.scale.linear().domain([0,1]),10,!0,[1,10])};var Nl=ao.format(".0e"),El={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ao.scale.pow=function(){return iu(ao.scale.linear(),1,[0,1])},ao.scale.sqrt=function(){return ao.scale.pow().exponent(.5)},ao.scale.ordinal=function(){return ou([],{t:"range",a:[[]]})},ao.scale.category10=function(){return ao.scale.ordinal().range(Al)},ao.scale.category20=function(){return ao.scale.ordinal().range(Cl)},ao.scale.category20b=function(){return ao.scale.ordinal().range(zl)},ao.scale.category20c=function(){return ao.scale.ordinal().range(Ll)};var Al=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Cl=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),zl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),Ll=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);ao.scale.quantile=function(){return au([],[])},ao.scale.quantize=function(){return lu(0,1,[0,1])},ao.scale.threshold=function(){return cu([.5],[0,1])},ao.scale.identity=function(){return fu([0,1])},ao.svg={},ao.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),f=o.apply(this,arguments)-Io,s=a.apply(this,arguments)-Io,h=Math.abs(s-f),p=f>s?0:1;if(n>c&&(g=c,c=n,n=g),h>=Oo)return t(c,p)+(n?t(n,1-p):"")+"Z";var g,v,d,y,m,M,x,b,_,w,S,k,N=0,E=0,A=[];if((y=(+l.apply(this,arguments)||0)/2)&&(d=u===ql?Math.sqrt(n*n+c*c):+u.apply(this,arguments),p||(E*=-1),c&&(E=tn(d/c*Math.sin(y))),n&&(N=tn(d/n*Math.sin(y)))),c){m=c*Math.cos(f+E),M=c*Math.sin(f+E),x=c*Math.cos(s-E),b=c*Math.sin(s-E);var C=Math.abs(s-f-2*E)<=Fo?0:1;if(E&&yu(m,M,x,b)===p^C){var z=(f+s)/2;m=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else m=M=0;if(n){_=n*Math.cos(s-N),w=n*Math.sin(s-N),S=n*Math.cos(f+N),k=n*Math.sin(f+N);var L=Math.abs(f-s+2*N)<=Fo?0:1;if(N&&yu(_,w,S,k)===1-p^L){var q=(f+s)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Uo&&(g=Math.min(Math.abs(c-n)/2,+i.apply(this,arguments)))>.001){v=c>n^p?0:1;var T=g,R=g;if(Fo>h){var D=null==S?[_,w]:null==x?[m,M]:Re([m,M],[S,k],[x,b],[_,w]),P=m-D[0],U=M-D[1],j=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*j+U*F)/(Math.sqrt(P*P+U*U)*Math.sqrt(j*j+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(g,(n-O)/(H-1)),T=Math.min(g,(c-O)/(H+1))}if(null!=x){var I=mu(null==S?[_,w]:[S,k],[m,M],c,T,p),Y=mu([x,b],[_,w],c,T,p);g===T?A.push("M",I[0],"A",T,",",T," 0 0,",v," ",I[1],"A",c,",",c," 0 ",1-p^yu(I[1][0],I[1][1],Y[1][0],Y[1][1]),",",p," ",Y[1],"A",T,",",T," 0 0,",v," ",Y[0]):A.push("M",I[0],"A",T,",",T," 0 1,",v," ",Y[0])}else A.push("M",m,",",M);if(null!=S){var Z=mu([m,M],[S,k],n,-R,p),V=mu([_,w],null==x?[m,M]:[x,b],n,-R,p);g===R?A.push("L",V[0],"A",R,",",R," 0 0,",v," ",V[1],"A",n,",",n," 0 ",p^yu(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-p," ",Z[1],"A",R,",",R," 0 0,",v," ",Z[0]):A.push("L",V[0],"A",R,",",R," 0 0,",v," ",Z[0])}else A.push("L",_,",",w)}else A.push("M",m,",",M),null!=x&&A.push("A",c,",",c," 0 ",C,",",p," ",x,",",b),A.push("L",_,",",w),null!=S&&A.push("A",n,",",n," 0 ",L,",",1-p," ",S,",",k);return A.push("Z"),A.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=hu,r=pu,i=su,u=ql,o=gu,a=vu,l=du;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(i=En(t),n):i},n.padRadius=function(t){return arguments.length?(u=t==ql?ql:En(t),n):u},n.startAngle=function(t){return arguments.length?(o=En(t),n):o},n.endAngle=function(t){return arguments.length?(a=En(t),n):a},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Io;return[Math.cos(t)*n,Math.sin(t)*n]},n};var ql="auto";ao.svg.line=function(){return Mu(m)};var Tl=ao.map({linear:xu,"linear-closed":bu,step:_u,"step-before":wu,"step-after":Su,basis:zu,"basis-open":Lu,"basis-closed":qu,bundle:Tu,cardinal:Eu,"cardinal-open":ku,"cardinal-closed":Nu,monotone:Fu});Tl.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Rl=[0,2/3,1/3,0],Dl=[0,1/3,2/3,0],Pl=[0,1/6,2/3,1/6];ao.svg.line.radial=function(){var n=Mu(Hu);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wu.reverse=Su,Su.reverse=wu,ao.svg.area=function(){return Ou(m)},ao.svg.area.radial=function(){var n=Ou(Hu);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ao.svg.chord=function(){function n(n,a){var l=t(this,u,n,a),c=t(this,o,n,a);return"M"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?i(l.r,l.p1,l.r,l.p0):i(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+i(c.r,c.p1,l.r,l.p0))+"Z"}function t(n,t,e,r){var i=t.call(n,e,r),u=a.call(n,i,r),o=l.call(n,i,r)-Io,f=c.call(n,i,r)-Io;return{r:u,a0:o,a1:f,p0:[u*Math.cos(o),u*Math.sin(o)],p1:[u*Math.cos(f),u*Math.sin(f)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Fo)+",1 "+t}function i(n,t,e,r){return"Q 0,0 "+r}var u=Me,o=xe,a=Iu,l=gu,c=vu;return n.radius=function(t){return arguments.length?(a=En(t),n):a},n.source=function(t){return arguments.length?(u=En(t),n):u},n.target=function(t){return arguments.length?(o=En(t),n):o},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},ao.svg.diagonal=function(){function n(n,i){var u=t.call(this,n,i),o=e.call(this,n,i),a=(u.y+o.y)/2,l=[u,{x:u.x,y:a},{x:o.x,y:a},o];return l=l.map(r),"M"+l[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=Me,e=xe,r=Yu;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ao.svg.diagonal.radial=function(){var n=ao.svg.diagonal(),t=Yu,e=n.projection;return n.projection=function(n){return arguments.length?e(Zu(t=n)):t},n},ao.svg.symbol=function(){function n(n,r){return(Ul.get(t.call(this,n,r))||$u)(e.call(this,n,r))}var t=Xu,e=Vu;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Ul=ao.map({circle:$u,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Fl)),e=t*Fl;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ao.svg.symbolTypes=Ul.keys();var jl=Math.sqrt(3),Fl=Math.tan(30*Yo);Co.transition=function(n){for(var t,e,r=Hl||++Zl,i=Ku(n),u=[],o=Ol||{time:Date.now(),ease:Nr,delay:0,duration:250},a=-1,l=this.length;++au;u++){i.push(t=[]);for(var e=this[u],a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return Wu(i,this.namespace,this.id)},Yl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(i){i[r][e].tween.set(n,t)})},Yl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function i(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function u(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?$r:Mr,a=ao.ns.qualify(n);return Ju(this,"attr."+n,t,a.local?u:i)},Yl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(i));return r&&function(n){this.setAttribute(i,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(i.space,i.local));return r&&function(n){this.setAttributeNS(i.space,i.local,r(n))}}var i=ao.ns.qualify(n);return this.tween("attr."+n,i.local?r:e)},Yl.style=function(n,e,r){function i(){this.style.removeProperty(n)}function u(e){return null==e?i:(e+="",function(){var i,u=t(this).getComputedStyle(this,null).getPropertyValue(n);return u!==e&&(i=Mr(u,e),function(t){this.style.setProperty(n,i(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Ju(this,"style."+n,e,u)},Yl.styleTween=function(n,e,r){function i(i,u){var o=e.call(this,i,u,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,i)},Yl.text=function(n){return Ju(this,"text",n,Gu)},Yl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Yl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ao.ease.apply(ao,arguments)),Y(this,function(r){r[e][t].ease=n}))},Yl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,i,u){r[e][t].delay=+n.call(r,r.__data__,i,u)}:(n=+n,function(r){r[e][t].delay=n}))},Yl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,i,u){r[e][t].duration=Math.max(1,n.call(r,r.__data__,i,u))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Yl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var i=Ol,u=Hl;try{Hl=e,Y(this,function(t,i,u){Ol=t[r][e],n.call(t,t.__data__,i,u)})}finally{Ol=i,Hl=u}}else Y(this,function(i){var u=i[r][e];(u.event||(u.event=ao.dispatch("start","end","interrupt"))).on(n,t)});return this},Yl.transition=function(){for(var n,t,e,r,i=this.id,u=++Zl,o=this.namespace,a=[],l=0,c=this.length;c>l;l++){a.push(n=[]);for(var t=this[l],f=0,s=t.length;s>f;f++)(e=t[f])&&(r=e[o][i],Qu(e,f,o,u,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wu(a,o,u)},ao.svg.axis=function(){function n(n){n.each(function(){var n,c=ao.select(this),f=this.__chart__||e,s=this.__chart__=e.copy(),h=null==l?s.ticks?s.ticks.apply(s,a):s.domain():l,p=null==t?s.tickFormat?s.tickFormat.apply(s,a):m:t,g=c.selectAll(".tick").data(h,s),v=g.enter().insert("g",".domain").attr("class","tick").style("opacity",Uo),d=ao.transition(g.exit()).style("opacity",Uo).remove(),y=ao.transition(g.order()).style("opacity",1),M=Math.max(i,0)+o,x=Zi(s),b=c.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ao.transition(b));v.append("line"),v.append("text");var w,S,k,N,E=v.select("line"),A=y.select("line"),C=g.select("text").text(p),z=v.select("text"),L=y.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=no,w="x",k="y",S="x2",N="y2",C.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+q*u+"V0H"+x[1]+"V"+q*u)):(n=to,w="y",k="x",S="y2",N="x2",C.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),_.attr("d","M"+q*u+","+x[0]+"H0V"+x[1]+"H"+q*u)),E.attr(N,q*i),z.attr(k,q*M),A.attr(S,0).attr(N,q*i),L.attr(w,0).attr(k,q*M),s.rangeBand){var T=s,R=T.rangeBand()/2;f=s=function(n){return T(n)+R}}else f.rangeBand?f=s:d.call(n,s,f);v.call(n,f,s),y.call(n,s,s)})}var t,e=ao.scale.linear(),r=Vl,i=6,u=6,o=3,a=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Xl?t+"":Vl,n):r},n.ticks=function(){return arguments.length?(a=co(arguments),n):a},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(i=+t,u=+arguments[e-1],n):i},n.innerTickSize=function(t){return arguments.length?(i=+t,n):i},n.outerTickSize=function(t){return arguments.length?(u=+t,n):u},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Vl="bottom",Xl={top:1,right:1,bottom:1,left:1};ao.svg.brush=function(){function n(t){t.each(function(){var t=ao.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,m);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return $l[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,s=ao.transition(t),h=ao.transition(o);c&&(l=Zi(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),r(s)),f&&(l=Zi(f),h.attr("y",l[0]).attr("height",l[1]-l[0]),i(s)),e(s)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",s[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function i(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==ao.event.keyCode&&(C||(M=null,L[0]-=s[1],L[1]-=h[1],C=2),S())}function v(){32==ao.event.keyCode&&2==C&&(L[0]+=s[1],L[1]+=h[1],C=0,S())}function d(){var n=ao.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ao.event.altKey?(M||(M=[(s[0]+s[1])/2,(h[0]+h[1])/2]),L[0]=s[+(n[0]f?(i=r,r=f):i=f),v[0]!=r||v[1]!=i?(e?a=null:o=null,v[0]=r,v[1]=i,!0):void 0}function m(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ao.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ao.select(ao.event.target),w=l.of(b,arguments),k=ao.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&f,C=_.classed("extent"),z=W(b),L=ao.mouse(b),q=ao.select(t(b)).on("keydown.brush",u).on("keyup.brush",v);if(ao.event.changedTouches?q.on("touchmove.brush",d).on("touchend.brush",m):q.on("mousemove.brush",d).on("mouseup.brush",m),k.interrupt().selectAll("*").interrupt(),C)L[0]=s[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[s[1-T]-L[0],h[1-R]-L[1]],L[0]=s[T],L[1]=h[R]}else ao.event.altKey&&(M=L.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ao.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,l=N(n,"brushstart","brush","brushend"),c=null,f=null,s=[0,0],h=[0,0],p=!0,g=!0,v=Bl[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:s,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Hl?ao.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,s=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=xr(s,t.x),r=xr(h,t.y);return o=a=null,function(i){s=t.x=e(i),h=t.y=r(i),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=Bl[!c<<1|!f],n):c},n.y=function(t){return arguments.length?(f=t,v=Bl[!c<<1|!f],n):f},n.clamp=function(t){return arguments.length?(c&&f?(p=!!t[0],g=!!t[1]):c?p=!!t:f&&(g=!!t),n):c&&f?[p,g]:c?p:f?g:null},n.extent=function(t){var e,r,i,u,l;return arguments.length?(c&&(e=t[0],r=t[1],f&&(e=e[0],r=r[0]),o=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),e==s[0]&&r==s[1]||(s=[e,r])),f&&(i=t[0],u=t[1],c&&(i=i[1],u=u[1]),a=[i,u],f.invert&&(i=f(i),u=f(u)),i>u&&(l=i,i=u,u=l),i==h[0]&&u==h[1]||(h=[i,u])),n):(c&&(o?(e=o[0],r=o[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),f&&(a?(i=a[0],u=a[1]):(i=h[0],u=h[1],f.invert&&(i=f.invert(i),u=f.invert(u)),i>u&&(l=i,i=u,u=l))),c&&f?[[e,i],[r,u]]:c?[e,r]:f&&[i,u])},n.clear=function(){return n.empty()||(s=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!f&&h[0]==h[1]},ao.rebind(n,l,"on")};var $l={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Bl=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Wl=ga.format=xa.timeFormat,Jl=Wl.utc,Gl=Jl("%Y-%m-%dT%H:%M:%S.%LZ");Wl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?eo:Gl,eo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},eo.toString=Gl.toString,ga.second=On(function(n){return new va(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ga.seconds=ga.second.range,ga.seconds.utc=ga.second.utc.range,ga.minute=On(function(n){return new va(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ga.minutes=ga.minute.range,ga.minutes.utc=ga.minute.utc.range,ga.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new va(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ga.hours=ga.hour.range,ga.hours.utc=ga.hour.utc.range,ga.month=On(function(n){return n=ga.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ga.months=ga.month.range,ga.months.utc=ga.month.utc.range;var Kl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Ql=[[ga.second,1],[ga.second,5],[ga.second,15],[ga.second,30],[ga.minute,1],[ga.minute,5],[ga.minute,15],[ga.minute,30],[ga.hour,1],[ga.hour,3],[ga.hour,6],[ga.hour,12],[ga.day,1],[ga.day,2],[ga.week,1],[ga.month,1],[ga.month,3],[ga.year,1]],nc=Wl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",zt]]),tc={range:function(n,t,e){return ao.range(Math.ceil(n/e)*e,+t,e).map(io)},floor:m,ceil:m};Ql.year=ga.year,ga.scale=function(){return ro(ao.scale.linear(),Ql,nc)};var ec=Ql.map(function(n){return[n[0].utc,n[1]]}),rc=Jl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",zt]]);ec.year=ga.year.utc,ga.scale.utc=function(){return ro(ao.scale.linear(),ec,rc)},ao.text=An(function(n){return n.responseText}),ao.json=function(n,t){return Cn(n,"application/json",uo,t)},ao.html=function(n,t){return Cn(n,"text/html",oo,t)},ao.xml=An(function(n){return n.responseXML}),"function"==typeof define&&define.amd?(this.d3=ao,define(ao)):"object"==typeof module&&module.exports?module.exports=ao:this.d3=ao}(); $(function() { + var $window = $(window) + , $top_link = $('#toplink') + , $body = $('body, html') + , offset = $('#code').offset().top + , hidePopover = function ($target) { + $target.data('popover-hover', false); -use InvalidArgumentException; -use const PREG_BACKTRACK_LIMIT_ERROR; -use const PREG_BAD_UTF8_ERROR; -use const PREG_BAD_UTF8_OFFSET_ERROR; -use const PREG_INTERNAL_ERROR; -use const PREG_JIT_STACKLIMIT_ERROR; -use const PREG_NO_ERROR; -use const PREG_RECURSION_LIMIT_ERROR; -final class PcreException extends InvalidArgumentException -{ - public static function createFromPhpError(int $errorCode) : self - { - switch ($errorCode) { - case \PREG_BACKTRACK_LIMIT_ERROR: - return new self('Backtrack limit error'); - case \PREG_RECURSION_LIMIT_ERROR: - return new self('Recursion limit error'); - case \PREG_BAD_UTF8_ERROR: - return new self('Bad UTF8 error'); - case \PREG_BAD_UTF8_OFFSET_ERROR: - return new self('Bad UTF8 offset error'); - case \PREG_JIT_STACKLIMIT_ERROR: - return new self('Jit stacklimit error'); - case \PREG_NO_ERROR: - case \PREG_INTERNAL_ERROR: - default: - } - return new self('Unknown Pcre error'); - } -} -summary = $summary; - $this->description = $description ?: new DocBlock\Description(''); - foreach ($tags as $tag) { - $this->addTag($tag); - } - $this->context = $context; - $this->location = $location; - $this->isTemplateEnd = $isTemplateEnd; - $this->isTemplateStart = $isTemplateStart; - } - public function getSummary() : string - { - return $this->summary; - } - public function getDescription() : DocBlock\Description - { - return $this->description; - } - /** - * Returns the current context. - */ - public function getContext() : ?Types\Context - { - return $this->context; - } - /** - * Returns the current location. - */ - public function getLocation() : ?Location - { - return $this->location; - } - /** - * Returns whether this DocBlock is the start of a Template section. - * - * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker - * (`#@+`) that is appended directly after the opening `/**` of a DocBlock. - * - * An example of such an opening is: - * - * ``` - * /**#@+ - * * My DocBlock - * * / - * ``` - * - * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all - * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). - * - * @see self::isTemplateEnd() for the check whether a closing marker was provided. - */ - public function isTemplateStart() : bool - { - return $this->isTemplateStart; - } - /** - * Returns whether this DocBlock is the end of a Template section. - * - * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. - */ - public function isTemplateEnd() : bool - { - return $this->isTemplateEnd; - } - /** - * Returns the tags for this DocBlock. - * - * @return Tag[] - */ - public function getTags() : array - { - return $this->tags; - } - /** - * Returns an array of tags matching the given name. If no tags are found - * an empty array is returned. - * - * @param string $name String to search by. - * - * @return Tag[] - */ - public function getTagsByName(string $name) : array - { - $result = []; - foreach ($this->getTags() as $tag) { - if ($tag->getName() !== $name) { - continue; - } - $result[] = $tag; - } - return $result; - } - /** - * Checks if a tag of a certain type is present in this DocBlock. - * - * @param string $name Tag name to check for. - */ - public function hasTag(string $name) : bool - { - foreach ($this->getTags() as $tag) { - if ($tag->getName() === $name) { - return \true; - } - } - return \false; - } - /** - * Remove a tag from this DocBlock. - * - * @param Tag $tagToRemove The tag to remove. - */ - public function removeTag(Tag $tagToRemove) : void - { - foreach ($this->tags as $key => $tag) { - if ($tag === $tagToRemove) { - unset($this->tags[$key]); - break; - } - } - } - /** - * Adds a tag to this DocBlock. - * - * @param Tag $tag The tag to add. - */ - private function addTag(Tag $tag) : void - { - $this->tags[] = $tag; + $window.scroll(function() { + if($window.scrollTop() > offset) { + $top_link.fadeIn(); + } else { + $top_link.fadeOut(); } -} -The MIT License (MIT) - -Copyright (c) 2010 Mike van Riel + }).scroll(); -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + $('.popin') + .popover({trigger: 'manual'}) + .on({ + 'mouseenter.popover': function () { + var $target = $(this); + var $container = $target.children().first(); -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + $target.data('popover-hover', true); -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -> $additionalTags - */ - public static function createInstance(array $additionalTags = []) : DocBlockFactory; - /** - * @param string|object $docblock - */ - public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock; -} -+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
      ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.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(e,n){S.fn[n]=function(e,t){return 0f&&(e=a.render.queue[f]);f++)d=e.generate(),typeof e.callback==typeof Function&&e.callback(d);a.render.queue.splice(0,f),a.render.queue.length?setTimeout(c):(a.dispatch.render_end(),a.render.active=!1)};setTimeout(c)},a.render.active=!1,a.render.queue=[],a.addGraph=function(b){typeof arguments[0]==typeof Function&&(b={generate:arguments[0],callback:arguments[1]}),a.render.queue.push(b),a.render.active||a.render()},"undefined"!=typeof module&&"undefined"!=typeof exports&&(module.exports=a),"undefined"!=typeof window&&(window.nv=a),a.dom.write=function(a){return void 0!==window.fastdom?fastdom.write(a):a()},a.dom.read=function(a){return void 0!==window.fastdom?fastdom.read(a):a()},a.interactiveGuideline=function(){"use strict";function b(l){l.each(function(l){function m(){var a=d3.mouse(this),d=a[0],e=a[1],i=!0,j=!1;if(k&&(d=d3.event.offsetX,e=d3.event.offsetY,"svg"!==d3.event.target.tagName&&(i=!1),d3.event.target.className.baseVal.match("nv-legend")&&(j=!0)),i&&(d-=f.left,e-=f.top),0>d||0>e||d>o||e>p||d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement||j){if(k&&d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement&&(void 0===d3.event.relatedTarget.className||d3.event.relatedTarget.className.match(c.nvPointerEventsClass)))return;return h.elementMouseout({mouseX:d,mouseY:e}),b.renderGuideLine(null),void c.hidden(!0)}c.hidden(!1);var l=g.invert(d);h.elementMousemove({mouseX:d,mouseY:e,pointXValue:l}),"dblclick"===d3.event.type&&h.elementDblclick({mouseX:d,mouseY:e,pointXValue:l}),"click"===d3.event.type&&h.elementClick({mouseX:d,mouseY:e,pointXValue:l})}var n=d3.select(this),o=d||960,p=e||400,q=n.selectAll("g.nv-wrap.nv-interactiveLineLayer").data([l]),r=q.enter().append("g").attr("class"," nv-wrap nv-interactiveLineLayer");r.append("g").attr("class","nv-interactiveGuideLine"),j&&(j.on("touchmove",m).on("mousemove",m,!0).on("mouseout",m,!0).on("dblclick",m).on("click",m),b.guideLine=null,b.renderGuideLine=function(c){i&&(b.guideLine&&b.guideLine.attr("x1")===c||a.dom.write(function(){var b=q.select(".nv-interactiveGuideLine").selectAll("line").data(null!=c?[a.utils.NaNtoZero(c)]:[],String);b.enter().append("line").attr("class","nv-guideline").attr("x1",function(a){return a}).attr("x2",function(a){return a}).attr("y1",p).attr("y2",0),b.exit().remove()}))})})}var c=a.models.tooltip();c.duration(0).hideDelay(0)._isInteractiveLayer(!0).hidden(!1);var d=null,e=null,f={left:0,top:0},g=d3.scale.linear(),h=d3.dispatch("elementMousemove","elementMouseout","elementClick","elementDblclick"),i=!0,j=null,k="ActiveXObject"in window;return b.dispatch=h,b.tooltip=c,b.margin=function(a){return arguments.length?(f.top="undefined"!=typeof a.top?a.top:f.top,f.left="undefined"!=typeof a.left?a.left:f.left,b):f},b.width=function(a){return arguments.length?(d=a,b):d},b.height=function(a){return arguments.length?(e=a,b):e},b.xScale=function(a){return arguments.length?(g=a,b):g},b.showGuideLine=function(a){return arguments.length?(i=a,b):i},b.svgContainer=function(a){return arguments.length?(j=a,b):j},b},a.interactiveBisect=function(a,b,c){"use strict";if(!(a instanceof Array))return null;var d;d="function"!=typeof c?function(a){return a.x}:c;var e=function(a,b){return d(a)-b},f=d3.bisector(e).left,g=d3.max([0,f(a,b)-1]),h=d(a[g]);if("undefined"==typeof h&&(h=g),h===b)return g;var i=d3.min([g+1,a.length-1]),j=d(a[i]);return"undefined"==typeof j&&(j=i),Math.abs(j-b)>=Math.abs(h-b)?g:i},a.nearestValueIndex=function(a,b,c){"use strict";var d=1/0,e=null;return a.forEach(function(a,f){var g=Math.abs(b-a);null!=a&&d>=g&&c>g&&(d=g,e=f)}),e},function(){"use strict";a.models.tooltip=function(){function b(){if(k){var a=d3.select(k);"svg"!==a.node().tagName&&(a=a.select("svg"));var b=a.node()?a.attr("viewBox"):null;if(b){b=b.split(" ");var c=parseInt(a.style("width"),10)/b[2];p.left=p.left*c,p.top=p.top*c}}}function c(){if(!n){var a;a=k?k:document.body,n=d3.select(a).append("div").attr("class","nvtooltip "+(j?j:"xy-tooltip")).attr("id",v),n.style("top",0).style("left",0),n.style("opacity",0),n.selectAll("div, table, td, tr").classed(w,!0),n.classed(w,!0),o=n.node()}}function d(){if(r&&B(e)){b();var f=p.left,g=null!==i?i:p.top;return a.dom.write(function(){c();var b=A(e);b&&(o.innerHTML=b),k&&u?a.dom.read(function(){var a=k.getElementsByTagName("svg")[0],b={left:0,top:0};if(a){var c=a.getBoundingClientRect(),d=k.getBoundingClientRect(),e=c.top;if(0>e){var i=k.getBoundingClientRect();e=Math.abs(e)>i.height?0:e}b.top=Math.abs(e-d.top),b.left=Math.abs(c.left-d.left)}f+=k.offsetLeft+b.left-2*k.scrollLeft,g+=k.offsetTop+b.top-2*k.scrollTop,h&&h>0&&(g=Math.floor(g/h)*h),C([f,g])}):C([f,g])}),d}}var e=null,f="w",g=25,h=0,i=null,j=null,k=null,l=!0,m=400,n=null,o=null,p={left:null,top:null},q={left:0,top:0},r=!0,s=100,t=!0,u=!1,v="nvtooltip-"+Math.floor(1e5*Math.random()),w="nv-pointer-events-none",x=function(a){return a},y=function(a){return a},z=function(a){return a},A=function(a){if(null===a)return"";var b=d3.select(document.createElement("table"));if(t){var c=b.selectAll("thead").data([a]).enter().append("thead");c.append("tr").append("td").attr("colspan",3).append("strong").classed("x-value",!0).html(y(a.value))}var d=b.selectAll("tbody").data([a]).enter().append("tbody"),e=d.selectAll("tr").data(function(a){return a.series}).enter().append("tr").classed("highlight",function(a){return a.highlight});e.append("td").classed("legend-color-guide",!0).append("div").style("background-color",function(a){return a.color}),e.append("td").classed("key",!0).html(function(a,b){return z(a.key,b)}),e.append("td").classed("value",!0).html(function(a,b){return x(a.value,b)}),e.selectAll("td").each(function(a){if(a.highlight){var b=d3.scale.linear().domain([0,1]).range(["#fff",a.color]),c=.6;d3.select(this).style("border-bottom-color",b(c)).style("border-top-color",b(c))}});var f=b.node().outerHTML;return void 0!==a.footer&&(f+=""),f},B=function(a){if(a&&a.series){if(a.series instanceof Array)return!!a.series.length;if(a.series instanceof Object)return a.series=[a.series],!0}return!1},C=function(b){o&&a.dom.read(function(){var c,d,e=parseInt(o.offsetHeight,10),h=parseInt(o.offsetWidth,10),i=a.utils.windowSize().width,j=a.utils.windowSize().height,k=window.pageYOffset,p=window.pageXOffset;j=window.innerWidth>=document.body.scrollWidth?j:j-16,i=window.innerHeight>=document.body.scrollHeight?i:i-16;var r,t,u=function(a){var b=d;do isNaN(a.offsetTop)||(b+=a.offsetTop),a=a.offsetParent;while(a);return b},v=function(a){var b=c;do isNaN(a.offsetLeft)||(b+=a.offsetLeft),a=a.offsetParent;while(a);return b};switch(f){case"e":c=b[0]-h-g,d=b[1]-e/2,r=v(o),t=u(o),p>r&&(c=b[0]+g>p?b[0]+g:p-r+c),k>t&&(d=k-t+d),t+e>k+j&&(d=k+j-t+d-e);break;case"w":c=b[0]+g,d=b[1]-e/2,r=v(o),t=u(o),r+h>i&&(c=b[0]-h-g),k>t&&(d=k+5),t+e>k+j&&(d=k+j-t+d-e);break;case"n":c=b[0]-h/2-5,d=b[1]+g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),t+e>k+j&&(d=k+j-t+d-e);break;case"s":c=b[0]-h/2,d=b[1]-e-g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),k>t&&(d=k);break;case"none":c=b[0],d=b[1]-g,r=v(o),t=u(o)}c-=q.left,d-=q.top;var w=o.getBoundingClientRect(),k=window.pageYOffset||document.documentElement.scrollTop,p=window.pageXOffset||document.documentElement.scrollLeft,x="translate("+(w.left+p)+"px, "+(w.top+k)+"px)",y="translate("+c+"px, "+d+"px)",z=d3.interpolateString(x,y),A=n.style("opacity")<.1;l?n.transition().delay(m).duration(0).style("opacity",0):n.interrupt().transition().duration(A?0:s).styleTween("transform",function(){return z},"important").style("-webkit-transform",y).style("opacity",1)})};return d.nvPointerEventsClass=w,d.options=a.utils.optionsFunc.bind(d),d._options=Object.create({},{duration:{get:function(){return s},set:function(a){s=a}},gravity:{get:function(){return f},set:function(a){f=a}},distance:{get:function(){return g},set:function(a){g=a}},snapDistance:{get:function(){return h},set:function(a){h=a}},classes:{get:function(){return j},set:function(a){j=a}},chartContainer:{get:function(){return k},set:function(a){k=a}},fixedTop:{get:function(){return i},set:function(a){i=a}},enabled:{get:function(){return r},set:function(a){r=a}},hideDelay:{get:function(){return m},set:function(a){m=a}},contentGenerator:{get:function(){return A},set:function(a){A=a}},valueFormatter:{get:function(){return x},set:function(a){x=a}},headerFormatter:{get:function(){return y},set:function(a){y=a}},keyFormatter:{get:function(){return z},set:function(a){z=a}},headerEnabled:{get:function(){return t},set:function(a){t=a}},_isInteractiveLayer:{get:function(){return u},set:function(a){u=!!a}},position:{get:function(){return p},set:function(a){p.left=void 0!==a.left?a.left:p.left,p.top=void 0!==a.top?a.top:p.top}},offset:{get:function(){return q},set:function(a){q.left=void 0!==a.left?a.left:q.left,q.top=void 0!==a.top?a.top:q.top}},hidden:{get:function(){return l},set:function(a){l!=a&&(l=!!a,d())}},data:{get:function(){return e},set:function(a){a.point&&(a.value=a.point.x,a.series=a.series||{},a.series.value=a.point.y,a.series.color=a.point.color||a.series.color),e=a}},tooltipElem:{get:function(){return o},set:function(){}},id:{get:function(){return v},set:function(){}}}),a.utils.initOptions(d),d}}(),a.utils.windowSize=function(){var a={width:640,height:480};return window.innerWidth&&window.innerHeight?(a.width=window.innerWidth,a.height=window.innerHeight,a):"CSS1Compat"==document.compatMode&&document.documentElement&&document.documentElement.offsetWidth?(a.width=document.documentElement.offsetWidth,a.height=document.documentElement.offsetHeight,a):document.body&&document.body.offsetWidth?(a.width=document.body.offsetWidth,a.height=document.body.offsetHeight,a):a},a.utils.windowResize=function(b){return window.addEventListener?window.addEventListener("resize",b):a.log("ERROR: Failed to bind to window.resize with: ",b),{callback:b,clear:function(){window.removeEventListener("resize",b)}}},a.utils.getColor=function(b){if(void 0===b)return a.utils.defaultColor();if(Array.isArray(b)){var c=d3.scale.ordinal().range(b);return function(a,b){var d=void 0===b?a:b;return a.color||c(d)}}return b},a.utils.defaultColor=function(){return a.utils.getColor(d3.scale.category20().range())},a.utils.customTheme=function(a,b,c){b=b||function(a){return a.key},c=c||d3.scale.category20().range();var d=c.length;return function(e){var f=b(e);return"function"==typeof a[f]?a[f]():void 0!==a[f]?a[f]:(d||(d=c.length),d-=1,c[d])}},a.utils.pjax=function(b,c){var d=function(d){d3.html(d,function(d){var e=d3.select(c).node();e.parentNode.replaceChild(d3.select(d).select(c).node(),e),a.utils.pjax(b,c)})};d3.selectAll(b).on("click",function(){history.pushState(this.href,this.textContent,this.href),d(this.href),d3.event.preventDefault()}),d3.select(window).on("popstate",function(){d3.event.state&&d(d3.event.state)})},a.utils.calcApproxTextWidth=function(a){if("function"==typeof a.style&&"function"==typeof a.text){var b=parseInt(a.style("font-size").replace("px",""),10),c=a.text().length;return c*b*.5}return 0},a.utils.NaNtoZero=function(a){return"number"!=typeof a||isNaN(a)||null===a||1/0===a||a===-1/0?0:a},d3.selection.prototype.watchTransition=function(a){var b=[this].concat([].slice.call(arguments,1));return a.transition.apply(a,b)},a.utils.renderWatch=function(b,c){if(!(this instanceof a.utils.renderWatch))return new a.utils.renderWatch(b,c);var d=void 0!==c?c:250,e=[],f=this;this.models=function(a){return a=[].slice.call(arguments,0),a.forEach(function(a){a.__rendered=!1,function(a){a.dispatch.on("renderEnd",function(){a.__rendered=!0,f.renderEnd("model")})}(a),e.indexOf(a)<0&&e.push(a)}),this},this.reset=function(a){void 0!==a&&(d=a),e=[]},this.transition=function(a,b,c){if(b=arguments.length>1?[].slice.call(arguments,1):[],c=b.length>1?b.pop():void 0!==d?d:250,a.__rendered=!1,e.indexOf(a)<0&&e.push(a),0===c)return a.__rendered=!0,a.delay=function(){return this},a.duration=function(){return this},a;a.__rendered=0===a.length?!0:a.every(function(a){return!a.length})?!0:!1;var g=0;return a.transition().duration(c).each(function(){++g}).each("end",function(){0===--g&&(a.__rendered=!0,f.renderEnd.apply(this,b))})},this.renderEnd=function(){e.every(function(a){return a.__rendered})&&(e.forEach(function(a){a.__rendered=!1}),b.renderEnd.apply(this,arguments))}},a.utils.deepExtend=function(b){var c=arguments.length>1?[].slice.call(arguments,1):[];c.forEach(function(c){for(var d in c){var e=b[d]instanceof Array,f="object"==typeof b[d],g="object"==typeof c[d];f&&!e&&g?a.utils.deepExtend(b[d],c[d]):b[d]=c[d]}})},a.utils.state=function(){if(!(this instanceof a.utils.state))return new a.utils.state;var b={},c=function(){},d=function(){return{}},e=null,f=null;this.dispatch=d3.dispatch("change","set"),this.dispatch.on("set",function(a){c(a,!0)}),this.getter=function(a){return d=a,this},this.setter=function(a,b){return b||(b=function(){}),c=function(c,d){a(c),d&&b()},this},this.init=function(b){e=e||{},a.utils.deepExtend(e,b)};var g=function(){var a=d();if(JSON.stringify(a)===JSON.stringify(b))return!1;for(var c in a)void 0===b[c]&&(b[c]={}),b[c]=a[c],f=!0;return!0};this.update=function(){e&&(c(e,!1),e=null),g.call(this)&&this.dispatch.change(b)}},a.utils.optionsFunc=function(a){return a&&d3.map(a).forEach(function(a,b){"function"==typeof this[a]&&this[a](b)}.bind(this)),this},a.utils.calcTicksX=function(b,c){var d=1,e=0;for(e;ed?f:d}return a.log("Requested number of ticks: ",b),a.log("Calculated max values to be: ",d),b=b>d?b=d-1:b,b=1>b?1:b,b=Math.floor(b),a.log("Calculating tick count as: ",b),b},a.utils.calcTicksY=function(b,c){return a.utils.calcTicksX(b,c)},a.utils.initOption=function(a,b){a._calls&&a._calls[b]?a[b]=a._calls[b]:(a[b]=function(c){return arguments.length?(a._overrides[b]=!0,a._options[b]=c,a):a._options[b]},a["_"+b]=function(c){return arguments.length?(a._overrides[b]||(a._options[b]=c),a):a._options[b]})},a.utils.initOptions=function(b){b._overrides=b._overrides||{};var c=Object.getOwnPropertyNames(b._options||{}),d=Object.getOwnPropertyNames(b._calls||{});c=c.concat(d);for(var e in c)a.utils.initOption(b,c[e])},a.utils.inheritOptionsD3=function(a,b,c){a._d3options=c.concat(a._d3options||[]),c.unshift(b),c.unshift(a),d3.rebind.apply(this,c)},a.utils.arrayUnique=function(a){return a.sort().filter(function(b,c){return!c||b!=a[c-1]})},a.utils.symbolMap=d3.map(),a.utils.symbol=function(){function b(b,e){var f=c.call(this,b,e),g=d.call(this,b,e);return-1!==d3.svg.symbolTypes.indexOf(f)?d3.svg.symbol().type(f).size(g)():a.utils.symbolMap.get(f)(g)}var c,d=64;return b.type=function(a){return arguments.length?(c=d3.functor(a),b):c},b.size=function(a){return arguments.length?(d=d3.functor(a),b):d},b},a.utils.inheritOptions=function(b,c){var d=Object.getOwnPropertyNames(c._options||{}),e=Object.getOwnPropertyNames(c._calls||{}),f=c._inherited||[],g=c._d3options||[],h=d.concat(e).concat(f).concat(g);h.unshift(c),h.unshift(b),d3.rebind.apply(this,h),b._inherited=a.utils.arrayUnique(d.concat(e).concat(f).concat(d).concat(b._inherited||[])),b._d3options=a.utils.arrayUnique(g.concat(b._d3options||[]))},a.utils.initSVG=function(a){a.classed({"nvd3-svg":!0})},a.utils.sanitizeHeight=function(a,b){return a||parseInt(b.style("height"),10)||400},a.utils.sanitizeWidth=function(a,b){return a||parseInt(b.style("width"),10)||960},a.utils.availableHeight=function(b,c,d){return a.utils.sanitizeHeight(b,c)-d.top-d.bottom},a.utils.availableWidth=function(b,c,d){return a.utils.sanitizeWidth(b,c)-d.left-d.right},a.utils.noData=function(b,c){var d=b.options(),e=d.margin(),f=d.noData(),g=null==f?["No Data Available."]:[f],h=a.utils.availableHeight(d.height(),c,e),i=a.utils.availableWidth(d.width(),c,e),j=e.left+i/2,k=e.top+h/2;c.selectAll("g").remove();var l=c.selectAll(".nv-noData").data(g);l.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),l.attr("x",j).attr("y",k).text(function(a){return a})},a.models.axis=function(){"use strict";function b(g){return s.reset(),g.each(function(b){var g=d3.select(this);a.utils.initSVG(g);var p=g.selectAll("g.nv-wrap.nv-axis").data([b]),q=p.enter().append("g").attr("class","nvd3 nv-wrap nv-axis"),t=(q.append("g"),p.select("g"));null!==n?c.ticks(n):("top"==c.orient()||"bottom"==c.orient())&&c.ticks(Math.abs(d.range()[1]-d.range()[0])/100),t.watchTransition(s,"axis").call(c),r=r||c.scale();var u=c.tickFormat();null==u&&(u=r.tickFormat());var v=t.selectAll("text.nv-axislabel").data([h||null]);v.exit().remove();var w,x,y;switch(c.orient()){case"top":v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",0).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b))+",0)"}).select("text").attr("dy","-0.5em").attr("y",-c.tickPadding()).attr("text-anchor","middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max top").attr("transform",function(b,c){return"translate("+a.utils.NaNtoZero(d.range()[c])+",0)"}));break;case"bottom":w=o+36;var z=30,A=0,B=t.selectAll("g").select("text"),C="";if(j%360){B.each(function(){var a=this.getBoundingClientRect(),b=a.width;A=a.height,b>z&&(z=b)}),C="rotate("+j+" 0,"+(A/2+c.tickPadding())+")";var D=Math.abs(Math.sin(j*Math.PI/180));w=(D?D*z:z)+30,B.attr("transform",C).style("text-anchor",j%360>0?"start":"end")}v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",w).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data([d.domain()[0],d.domain()[d.domain().length-1]]),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"}).select("text").attr("dy",".71em").attr("y",c.tickPadding()).attr("transform",C).style("text-anchor",j?j%360>0?"start":"end":"middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max bottom").attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"})),l&&B.attr("transform",function(a,b){return"translate(0,"+(b%2==0?"0":"12")+")"});break;case"right":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"begin").attr("transform",k?"rotate(90)":"").attr("y",k?-Math.max(e.right,f)+12:-10).attr("x",k?d3.max(d.range())/2:c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(d(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",c.tickPadding()).style("text-anchor","start").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1));break;case"left":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"end").attr("transform",k?"rotate(-90)":"").attr("y",k?-Math.max(e.left,f)+25-(o||0):-10).attr("x",k?-d3.max(d.range())/2:-c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(r(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",-c.tickPadding()).attr("text-anchor","end").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1))}if(v.text(function(a){return a}),!i||"left"!==c.orient()&&"right"!==c.orient()||(t.selectAll("g").each(function(a){d3.select(this).select("text").attr("opacity",1),(d(a)d.range()[0]-10)&&((a>1e-10||-1e-10>a)&&d3.select(this).attr("opacity",0),d3.select(this).select("text").attr("opacity",0))}),d.domain()[0]==d.domain()[1]&&0==d.domain()[0]&&p.selectAll("g.nv-axisMaxMin").style("opacity",function(a,b){return b?0:1})),i&&("top"===c.orient()||"bottom"===c.orient())){var E=[];p.selectAll("g.nv-axisMaxMin").each(function(a,b){try{E.push(b?d(a)-this.getBoundingClientRect().width-4:d(a)+this.getBoundingClientRect().width+4)}catch(c){E.push(b?d(a)-4:d(a)+4)}}),t.selectAll("g").each(function(a){(d(a)E[1])&&(a>1e-10||-1e-10>a?d3.select(this).remove():d3.select(this).select("text").remove())})}t.selectAll(".tick").filter(function(a){return!parseFloat(Math.round(1e5*a)/1e6)&&void 0!==a}).classed("zero",!0),r=d.copy()}),s.renderEnd("axis immediate"),b}var c=d3.svg.axis(),d=d3.scale.linear(),e={top:0,right:0,bottom:0,left:0},f=75,g=60,h=null,i=!0,j=0,k=!0,l=!1,m=!1,n=null,o=0,p=250,q=d3.dispatch("renderEnd");c.scale(d).orient("bottom").tickFormat(function(a){return a});var r,s=a.utils.renderWatch(q,p);return b.axis=c,b.dispatch=q,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{axisLabelDistance:{get:function(){return o},set:function(a){o=a}},staggerLabels:{get:function(){return l},set:function(a){l=a}},rotateLabels:{get:function(){return j},set:function(a){j=a}},rotateYLabel:{get:function(){return k},set:function(a){k=a}},showMaxMin:{get:function(){return i},set:function(a){i=a}},axisLabel:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return g},set:function(a){g=a}},ticks:{get:function(){return n},set:function(a){n=a}},width:{get:function(){return f},set:function(a){f=a}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},duration:{get:function(){return p},set:function(a){p=a,s.reset(p)}},scale:{get:function(){return d},set:function(e){d=e,c.scale(d),m="function"==typeof d.rangeBands,a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"])}}}),a.utils.initOptions(b),a.utils.inheritOptionsD3(b,c,["orient","tickValues","tickSubdivide","tickSize","tickPadding","tickFormat"]),a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"]),b},a.models.boxPlot=function(){"use strict";function b(l){return v.reset(),l.each(function(b){var l=j-i.left-i.right,p=k-i.top-i.bottom;r=d3.select(this),a.utils.initSVG(r),m.domain(c||b.map(function(a,b){return o(a,b)})).rangeBands(e||[0,l],.1);var w=[];if(!d){var x=d3.min(b.map(function(a){var b=[];return b.push(a.values.Q1),a.values.hasOwnProperty("whisker_low")&&null!==a.values.whisker_low&&b.push(a.values.whisker_low),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.min(b)})),y=d3.max(b.map(function(a){var b=[];return b.push(a.values.Q3),a.values.hasOwnProperty("whisker_high")&&null!==a.values.whisker_high&&b.push(a.values.whisker_high),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.max(b)}));w=[x,y]}n.domain(d||w),n.range(f||[p,0]),g=g||m,h=h||n.copy().range([n(0),n(0)]);{var z=r.selectAll("g.nv-wrap").data([b]);z.enter().append("g").attr("class","nvd3 nv-wrap")}z.attr("transform","translate("+i.left+","+i.top+")");var A=z.selectAll(".nv-boxplot").data(function(a){return a}),B=A.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);A.attr("class","nv-boxplot").attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}).classed("hover",function(a){return a.hover}),A.watchTransition(v,"nv-boxplot: boxplots").style("stroke-opacity",1).style("fill-opacity",.75).delay(function(a,c){return c*t/b.length}).attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}),A.exit().remove(),B.each(function(a,b){var c=d3.select(this);["low","high"].forEach(function(d){a.values.hasOwnProperty("whisker_"+d)&&null!==a.values["whisker_"+d]&&(c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-whisker nv-boxplot-"+d),c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-tick nv-boxplot-"+d))})});var C=A.selectAll(".nv-boxplot-outlier").data(function(a){return a.values.hasOwnProperty("outliers")&&null!==a.values.outliers?a.values.outliers:[]});C.enter().append("circle").style("fill",function(a,b,c){return q(a,c)}).style("stroke",function(a,b,c){return q(a,c)}).on("mouseover",function(a,b,c){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:a,color:q(a,c)},e:d3.event})}).on("mouseout",function(a,b,c){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:a,color:q(a,c)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),C.attr("class","nv-boxplot-outlier"),C.watchTransition(v,"nv-boxplot: nv-boxplot-outlier").attr("cx",.45*m.rangeBand()).attr("cy",function(a){return n(a)}).attr("r","3"),C.exit().remove();var D=function(){return null===u?.9*m.rangeBand():Math.min(75,.9*m.rangeBand())},E=function(){return.45*m.rangeBand()-D()/2},F=function(){return.45*m.rangeBand()+D()/2};["low","high"].forEach(function(a){var b="low"===a?"Q1":"Q3";A.select("line.nv-boxplot-whisker.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",.45*m.rangeBand()).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",.45*m.rangeBand()).attr("y2",function(a){return n(a.values[b])}),A.select("line.nv-boxplot-tick.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",E).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",F).attr("y2",function(b){return n(b.values["whisker_"+a])})}),["low","high"].forEach(function(a){B.selectAll(".nv-boxplot-"+a).on("mouseover",function(b,c,d){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mouseout",function(b,c,d){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})})}),B.append("rect").attr("class","nv-boxplot-box").on("mouseover",function(a,b){d3.select(this).classed("hover",!0),s.elementMouseover({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),s.elementMouseout({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),A.select("rect.nv-boxplot-box").watchTransition(v,"nv-boxplot: boxes").attr("y",function(a){return n(a.values.Q3)}).attr("width",D).attr("x",E).attr("height",function(a){return Math.abs(n(a.values.Q3)-n(a.values.Q1))||1}).style("fill",function(a,b){return a.color||q(a,b)}).style("stroke",function(a,b){return a.color||q(a,b)}),B.append("line").attr("class","nv-boxplot-median"),A.select("line.nv-boxplot-median").watchTransition(v,"nv-boxplot: boxplots line").attr("x1",E).attr("y1",function(a){return n(a.values.Q2)}).attr("x2",F).attr("y2",function(a){return n(a.values.Q2)}),g=m.copy(),h=n.copy()}),v.renderEnd("nv-boxplot immediate"),b}var c,d,e,f,g,h,i={top:0,right:0,bottom:0,left:0},j=960,k=500,l=Math.floor(1e4*Math.random()),m=d3.scale.ordinal(),n=d3.scale.linear(),o=function(a){return a.x},p=function(a){return a.y},q=a.utils.defaultColor(),r=null,s=d3.dispatch("elementMouseover","elementMouseout","elementMousemove","renderEnd"),t=250,u=null,v=a.utils.renderWatch(s,t);return b.dispatch=s,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},maxBoxWidth:{get:function(){return u},set:function(a){u=a}},x:{get:function(){return o},set:function(a){o=a}},y:{get:function(){return p},set:function(a){p=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return l},set:function(a){l=a}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}},duration:{get:function(){return t},set:function(a){t=a,v.reset(t)}}}),a.utils.initOptions(b),b},a.models.boxPlotChart=function(){"use strict";function b(k){return t.reset(),t.models(e),l&&t.models(f),m&&t.models(g),k.each(function(k){var p=d3.select(this);a.utils.initSVG(p);var t=(i||parseInt(p.style("width"))||960)-h.left-h.right,u=(j||parseInt(p.style("height"))||400)-h.top-h.bottom;if(b.update=function(){r.beforeUpdate(),p.transition().duration(s).call(b)},b.container=this,!(k&&k.length&&k.filter(function(a){return a.values.hasOwnProperty("Q1")&&a.values.hasOwnProperty("Q2")&&a.values.hasOwnProperty("Q3")}).length)){var v=p.selectAll(".nv-noData").data([q]);return v.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),v.attr("x",h.left+t/2).attr("y",h.top+u/2).text(function(a){return a}),b}p.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var w=p.selectAll("g.nv-wrap.nv-boxPlotWithAxes").data([k]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-boxPlotWithAxes").append("g"),y=x.append("defs"),z=w.select("g"); +x.append("g").attr("class","nv-x nv-axis"),x.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),x.append("g").attr("class","nv-barsWrap"),z.attr("transform","translate("+h.left+","+h.top+")"),n&&z.select(".nv-y.nv-axis").attr("transform","translate("+t+",0)"),e.width(t).height(u);var A=z.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));if(A.transition().call(e),y.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),z.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(o?2:1)).attr("height",16).attr("x",-c.rangeBand()/(o?1:2)),l){f.scale(c).ticks(a.utils.calcTicksX(t/100,k)).tickSize(-u,0),z.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),z.select(".nv-x.nv-axis").call(f);var B=z.select(".nv-x.nv-axis").selectAll("g");o&&B.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}m&&(g.scale(d).ticks(Math.floor(u/36)).tickSize(-t,0),z.select(".nv-y.nv-axis").call(g)),z.select(".nv-zeroLine line").attr("x1",0).attr("x2",t).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("nv-boxplot chart immediate"),b}var c,d,e=a.models.boxPlot(),f=a.models.axis(),g=a.models.axis(),h={top:15,right:10,bottom:50,left:60},i=null,j=null,k=a.utils.getColor(),l=!0,m=!0,n=!1,o=!1,p=a.models.tooltip(),q="No Data Available.",r=d3.dispatch("tooltipShow","tooltipHide","beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(n?"right":"left").tickFormat(d3.format(",.1f")),p.duration(0);var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){p.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(a){p.data(a).hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){p.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.boxplot=e,b.xAxis=f,b.yAxis=g,b.tooltip=p,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},staggerLabels:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return l},set:function(a){l=a}},showYAxis:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return tooltips},set:function(a){tooltips=a}},tooltipContent:{get:function(){return p},set:function(a){p=a}},noData:{get:function(){return q},set:function(a){q=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!==a.top?a.top:h.top,h.right=void 0!==a.right?a.right:h.right,h.bottom=void 0!==a.bottom?a.bottom:h.bottom,h.left=void 0!==a.left?a.left:h.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}},rightAlignYAxis:{get:function(){return n},set:function(a){n=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.bullet=function(){"use strict";function b(d){return d.each(function(b,d){var p=m-c.left-c.right,s=n-c.top-c.bottom;o=d3.select(this),a.utils.initSVG(o);{var t=f.call(this,b,d).slice().sort(d3.descending),u=g.call(this,b,d).slice().sort(d3.descending),v=h.call(this,b,d).slice().sort(d3.descending),w=i.call(this,b,d).slice(),x=j.call(this,b,d).slice(),y=k.call(this,b,d).slice(),z=d3.scale.linear().domain(d3.extent(d3.merge([l,t]))).range(e?[p,0]:[0,p]);this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range())}this.__chart__=z;var A=d3.min(t),B=d3.max(t),C=t[1],D=o.selectAll("g.nv-wrap.nv-bullet").data([b]),E=D.enter().append("g").attr("class","nvd3 nv-wrap nv-bullet"),F=E.append("g"),G=D.select("g");F.append("rect").attr("class","nv-range nv-rangeMax"),F.append("rect").attr("class","nv-range nv-rangeAvg"),F.append("rect").attr("class","nv-range nv-rangeMin"),F.append("rect").attr("class","nv-measure"),D.attr("transform","translate("+c.left+","+c.top+")");var H=function(a){return Math.abs(z(a)-z(0))},I=function(a){return z(0>a?a:0)};G.select("rect.nv-rangeMax").attr("height",s).attr("width",H(B>0?B:A)).attr("x",I(B>0?B:A)).datum(B>0?B:A),G.select("rect.nv-rangeAvg").attr("height",s).attr("width",H(C)).attr("x",I(C)).datum(C),G.select("rect.nv-rangeMin").attr("height",s).attr("width",H(B)).attr("x",I(B)).attr("width",H(B>0?A:B)).attr("x",I(B>0?A:B)).datum(B>0?A:B),G.select("rect.nv-measure").style("fill",q).attr("height",s/3).attr("y",s/3).attr("width",0>v?z(0)-z(v[0]):z(v[0])-z(0)).attr("x",I(v)).on("mouseover",function(){r.elementMouseover({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mouseout",function(){r.elementMouseout({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})});var J=s/6,K=u.map(function(a,b){return{value:a,label:x[b]}});F.selectAll("path.nv-markerTriangle").data(K).enter().append("path").attr("class","nv-markerTriangle").attr("transform",function(a){return"translate("+z(a.value)+","+s/2+")"}).attr("d","M0,"+J+"L"+J+","+-J+" "+-J+","+-J+"Z").on("mouseover",function(a){r.elementMouseover({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill"),pos:[z(a.value),s/2]})}).on("mousemove",function(a){r.elementMousemove({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a){r.elementMouseout({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}),D.selectAll(".nv-range").on("mouseover",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseover({value:a,label:c,color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseout({value:a,label:c,color:d3.select(this).style("fill")})})}),b}var c={top:0,right:0,bottom:0,left:0},d="left",e=!1,f=function(a){return a.ranges},g=function(a){return a.markers?a.markers:[0]},h=function(a){return a.measures},i=function(a){return a.rangeLabels?a.rangeLabels:[]},j=function(a){return a.markerLabels?a.markerLabels:[]},k=function(a){return a.measureLabels?a.measureLabels:[]},l=[0],m=380,n=30,o=null,p=null,q=a.utils.getColor(["#1f77b4"]),r=d3.dispatch("elementMouseover","elementMouseout","elementMousemove");return b.dispatch=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return f},set:function(a){f=a}},markers:{get:function(){return g},set:function(a){g=a}},measures:{get:function(){return h},set:function(a){h=a}},forceX:{get:function(){return l},set:function(a){l=a}},width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},tickFormat:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},orient:{get:function(){return d},set:function(a){d=a,e="right"==d||"bottom"==d}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.bulletChart=function(){"use strict";function b(d){return d.each(function(e,o){var p=d3.select(this);a.utils.initSVG(p);var q=a.utils.availableWidth(k,p,g),r=l-g.top-g.bottom;if(b.update=function(){b(d)},b.container=this,!e||!h.call(this,e,o))return a.utils.noData(b,p),b;p.selectAll(".nv-noData").remove();var s=h.call(this,e,o).slice().sort(d3.descending),t=i.call(this,e,o).slice().sort(d3.descending),u=j.call(this,e,o).slice().sort(d3.descending),v=p.selectAll("g.nv-wrap.nv-bulletChart").data([e]),w=v.enter().append("g").attr("class","nvd3 nv-wrap nv-bulletChart"),x=w.append("g"),y=v.select("g");x.append("g").attr("class","nv-bulletWrap"),x.append("g").attr("class","nv-titles"),v.attr("transform","translate("+g.left+","+g.top+")");var z=d3.scale.linear().domain([0,Math.max(s[0],t[0],u[0])]).range(f?[q,0]:[0,q]),A=this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range());this.__chart__=z;var B=x.select(".nv-titles").append("g").attr("text-anchor","end").attr("transform","translate(-6,"+(l-g.top-g.bottom)/2+")");B.append("text").attr("class","nv-title").text(function(a){return a.title}),B.append("text").attr("class","nv-subtitle").attr("dy","1em").text(function(a){return a.subtitle}),c.width(q).height(r);var C=y.select(".nv-bulletWrap");d3.transition(C).call(c);var D=m||z.tickFormat(q/100),E=y.selectAll("g.nv-tick").data(z.ticks(n?n:q/50),function(a){return this.textContent||D(a)}),F=E.enter().append("g").attr("class","nv-tick").attr("transform",function(a){return"translate("+A(a)+",0)"}).style("opacity",1e-6);F.append("line").attr("y1",r).attr("y2",7*r/6),F.append("text").attr("text-anchor","middle").attr("dy","1em").attr("y",7*r/6).text(D);var G=d3.transition(E).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1);G.select("line").attr("y1",r).attr("y2",7*r/6),G.select("text").attr("y",7*r/6),d3.transition(E.exit()).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1e-6).remove()}),d3.timer.flush(),b}var c=a.models.bullet(),d=a.models.tooltip(),e="left",f=!1,g={top:5,right:40,bottom:20,left:120},h=function(a){return a.ranges},i=function(a){return a.markers?a.markers:[0]},j=function(a){return a.measures},k=null,l=55,m=null,n=null,o=null,p=d3.dispatch("tooltipShow","tooltipHide");return d.duration(0).headerEnabled(!1),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.label,value:a.value,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.bullet=c,b.dispatch=p,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return h},set:function(a){h=a}},markers:{get:function(){return i},set:function(a){i=a}},measures:{get:function(){return j},set:function(a){j=a}},width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},tickFormat:{get:function(){return m},set:function(a){m=a}},ticks:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return o},set:function(a){o=a}},tooltips:{get:function(){return d.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),d.enabled(!!b)}},tooltipContent:{get:function(){return d.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),d.contentGenerator(b)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},orient:{get:function(){return e},set:function(a){e=a,f="right"==e||"bottom"==e}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.candlestickBar=function(){"use strict";function b(x){return x.each(function(b){c=d3.select(this);var x=a.utils.availableWidth(i,c,h),y=a.utils.availableHeight(j,c,h);a.utils.initSVG(c);var A=x/b[0].values.length*.45;l.domain(d||d3.extent(b[0].values.map(n).concat(t))),l.range(v?f||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:f||[5+A/2,x-A/2-5]),m.domain(e||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(g||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var B=d3.select(this).selectAll("g.nv-wrap.nv-candlestickBar").data([b[0].values]),C=B.enter().append("g").attr("class","nvd3 nv-wrap nv-candlestickBar"),D=C.append("defs"),E=C.append("g"),F=B.select("g");E.append("g").attr("class","nv-ticks"),B.attr("transform","translate("+h.left+","+h.top+")"),c.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:k})}),D.append("clipPath").attr("id","nv-chart-clip-path-"+k).append("rect"),B.select("#nv-chart-clip-path-"+k+" rect").attr("width",x).attr("height",y),F.attr("clip-path",w?"url(#nv-chart-clip-path-"+k+")":"");var G=B.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});G.exit().remove();{var H=G.enter().append("g").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b});H.append("line").attr("class","nv-candlestick-lines").attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),H.append("rect").attr("class","nv-candlestick-rects nv-bars").attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}c.selectAll(".nv-candlestick-lines").transition().attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),c.selectAll(".nv-candlestick-rects").transition().attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}),b}var c,d,e,f,g,h={top:0,right:0,bottom:0,left:0},i=null,j=null,k=Math.floor(1e4*Math.random()),l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,d){b.clearHighlights(),c.select(".nv-candlestickBar .nv-tick-0-"+a).classed("hover",d)},b.clearHighlights=function(){c.select(".nv-candlestickBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return k},set:function(a){k=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!=a.top?a.top:h.top,h.right=void 0!=a.right?a.right:h.right,h.bottom=void 0!=a.bottom?a.bottom:h.bottom,h.left=void 0!=a.left?a.left:h.left}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.cumulativeLineChart=function(){"use strict";function b(l){return H.reset(),H.models(f),r&&H.models(g),s&&H.models(h),l.each(function(l){function A(){d3.select(b.container).style("cursor","ew-resize")}function E(){G.x=d3.event.x,G.i=Math.round(F.invert(G.x)),K()}function H(){d3.select(b.container).style("cursor","auto"),y.index=G.i,C.stateChange(y)}function K(){bb.data([G]);var a=b.duration();b.duration(0),b.update(),b.duration(a)}var L=d3.select(this);a.utils.initSVG(L),L.classed("nv-chart-"+x,!0);var M=this,N=a.utils.availableWidth(o,L,m),O=a.utils.availableHeight(p,L,m);if(b.update=function(){0===D?L.call(b):L.transition().duration(D).call(b)},b.container=this,y.setter(J(l),b.update).getter(I(l)).update(),y.disabled=l.map(function(a){return!!a.disabled}),!z){var P;z={};for(P in y)z[P]=y[P]instanceof Array?y[P].slice(0):y[P]}var Q=d3.behavior.drag().on("dragstart",A).on("drag",E).on("dragend",H);if(!(l&&l.length&&l.filter(function(a){return a.values.length}).length))return a.utils.noData(b,L),b;if(L.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale(),w)f.yDomain(null);else{var R=l.filter(function(a){return!a.disabled}).map(function(a){var b=d3.extent(a.values,f.y());return b[0]<-.95&&(b[0]=-.95),[(b[0]-b[1])/(1+b[1]),(b[1]-b[0])/(1+b[0])]}),S=[d3.min(R,function(a){return a[0]}),d3.max(R,function(a){return a[1]})];f.yDomain(S)}F.domain([0,l[0].values.length-1]).range([0,N]).clamp(!0);var l=c(G.i,l),T=v?"none":"all",U=L.selectAll("g.nv-wrap.nv-cumulativeLine").data([l]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-cumulativeLine").append("g"),W=U.select("g");if(V.append("g").attr("class","nv-interactive"),V.append("g").attr("class","nv-x nv-axis").style("pointer-events","none"),V.append("g").attr("class","nv-y nv-axis"),V.append("g").attr("class","nv-background"),V.append("g").attr("class","nv-linesWrap").style("pointer-events",T),V.append("g").attr("class","nv-avgLinesWrap").style("pointer-events","none"),V.append("g").attr("class","nv-legendWrap"),V.append("g").attr("class","nv-controlsWrap"),q&&(i.width(N),W.select(".nv-legendWrap").datum(l).call(i),m.top!=i.height()&&(m.top=i.height(),O=a.utils.availableHeight(p,L,m)),W.select(".nv-legendWrap").attr("transform","translate(0,"+-m.top+")")),u){var X=[{key:"Re-scale y-axis",disabled:!w}];j.width(140).color(["#444","#444","#444"]).rightAlign(!1).margin({top:5,right:0,bottom:5,left:20}),W.select(".nv-controlsWrap").datum(X).attr("transform","translate(0,"+-m.top+")").call(j)}U.attr("transform","translate("+m.left+","+m.top+")"),t&&W.select(".nv-y.nv-axis").attr("transform","translate("+N+",0)");var Y=l.filter(function(a){return a.tempDisabled});U.select(".tempDisabled").remove(),Y.length&&U.append("text").attr("class","tempDisabled").attr("x",N/2).attr("y","-.71em").style("text-anchor","end").text(Y.map(function(a){return a.key}).join(", ")+" values cannot be calculated for this time period."),v&&(k.width(N).height(O).margin({left:m.left,top:m.top}).svgContainer(L).xScale(d),U.select(".nv-interactive").call(k)),V.select(".nv-background").append("rect"),W.select(".nv-background rect").attr("width",N).attr("height",O),f.y(function(a){return a.display.y}).width(N).height(O).color(l.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!l[b].disabled&&!l[b].tempDisabled}));var Z=W.select(".nv-linesWrap").datum(l.filter(function(a){return!a.disabled&&!a.tempDisabled}));Z.call(f),l.forEach(function(a,b){a.seriesIndex=b});var $=l.filter(function(a){return!a.disabled&&!!B(a)}),_=W.select(".nv-avgLinesWrap").selectAll("line").data($,function(a){return a.key}),ab=function(a){var b=e(B(a));return 0>b?0:b>O?O:b};_.enter().append("line").style("stroke-width",2).style("stroke-dasharray","10,10").style("stroke",function(a){return f.color()(a,a.seriesIndex)}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.style("stroke-opacity",function(a){var b=e(B(a));return 0>b||b>O?0:1}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.exit().remove();var bb=Z.selectAll(".nv-indexLine").data([G]);bb.enter().append("rect").attr("class","nv-indexLine").attr("width",3).attr("x",-2).attr("fill","red").attr("fill-opacity",.5).style("pointer-events","all").call(Q),bb.attr("transform",function(a){return"translate("+F(a.i)+",0)"}).attr("height",O),r&&(g.scale(d)._ticks(a.utils.calcTicksX(N/70,l)).tickSize(-O,0),W.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),W.select(".nv-x.nv-axis").call(g)),s&&(h.scale(e)._ticks(a.utils.calcTicksY(O/36,l)).tickSize(-N,0),W.select(".nv-y.nv-axis").call(h)),W.select(".nv-background rect").on("click",function(){G.x=d3.mouse(this)[0],G.i=Math.round(F.invert(G.x)),y.index=G.i,C.stateChange(y),K()}),f.dispatch.on("elementClick",function(a){G.i=a.pointIndex,G.x=F(G.i),y.index=G.i,C.stateChange(y),K()}),j.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,w=!a.disabled,y.rescaleY=w,C.stateChange(y),b.update()}),i.dispatch.on("stateChange",function(a){for(var c in a)y[c]=a[c];C.stateChange(y),b.update()}),k.dispatch.on("elementMousemove",function(c){f.clearHighlights();var d,e,i,j=[];if(l.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g,h){e=a.interactiveBisect(g.values,c.pointXValue,b.x()),f.highlightPoint(h,e,!0);var k=g.values[e];"undefined"!=typeof k&&("undefined"==typeof d&&(d=k),"undefined"==typeof i&&(i=b.xScale()(b.x()(k,e))),j.push({key:g.key,value:b.y()(k,e),color:n(g,g.seriesIndex)}))}),j.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(j.map(function(a){return a.value}),o,q);null!==r&&(j[r].highlight=!0)}var s=g.tickFormat()(b.x()(d,e),e);k.tooltip.position({left:i+m.left,top:c.mouseY+m.top}).chartContainer(M.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:s,series:j})(),k.renderGuideLine(i)}),k.dispatch.on("elementMouseout",function(){f.clearHighlights()}),C.on("changeState",function(a){"undefined"!=typeof a.disabled&&(l.forEach(function(b,c){b.disabled=a.disabled[c]}),y.disabled=a.disabled),"undefined"!=typeof a.index&&(G.i=a.index,G.x=F(G.i),y.index=a.index,bb.data([G])),"undefined"!=typeof a.rescaleY&&(w=a.rescaleY),b.update()})}),H.renderEnd("cumulativeLineChart immediate"),b}function c(a,b){return K||(K=f.y()),b.map(function(b){if(!b.values)return b;var c=b.values[a];if(null==c)return b;var d=K(c,a);return-.95>d&&!E?(b.tempDisabled=!0,b):(b.tempDisabled=!1,b.values=b.values.map(function(a,b){return a.display={y:(K(a,b)-d)/(1+d)},a}),b)})}var d,e,f=a.models.line(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.models.legend(),k=a.interactiveGuideline(),l=a.models.tooltip(),m={top:30,right:30,bottom:50,left:60},n=a.utils.defaultColor(),o=null,p=null,q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=!0,x=f.id(),y=a.utils.state(),z=null,A=null,B=function(a){return a.average},C=d3.dispatch("stateChange","changeState","renderEnd"),D=250,E=!1;y.index=0,y.rescaleY=w,g.orient("bottom").tickPadding(7),h.orient(t?"right":"left"),l.valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)}),j.updateState(!1);var F=d3.scale.linear(),G={i:0,x:0},H=a.utils.renderWatch(C,D),I=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),index:G.i,rescaleY:w}}},J=function(a){return function(b){void 0!==b.index&&(G.i=b.index),void 0!==b.rescaleY&&(w=b.rescaleY),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};f.dispatch.on("elementMouseover.tooltip",function(a){var c={x:b.x()(a.point),y:b.y()(a.point),color:a.point.color};a.point=c,l.data(a).position(a.pos).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){l.hidden(!0)});var K=null;return b.dispatch=C,b.lines=f,b.legend=i,b.controls=j,b.xAxis=g,b.yAxis=h,b.interactiveLayer=k,b.state=y,b.tooltip=l,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return o},set:function(a){o=a}},height:{get:function(){return p},set:function(a){p=a}},rescaleY:{get:function(){return w},set:function(a){w=a}},showControls:{get:function(){return u},set:function(a){u=a}},showLegend:{get:function(){return q},set:function(a){q=a}},average:{get:function(){return B},set:function(a){B=a}},defaultState:{get:function(){return z},set:function(a){z=a}},noData:{get:function(){return A},set:function(a){A=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},noErrorCheck:{get:function(){return E},set:function(a){E=a}},tooltips:{get:function(){return l.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),l.enabled(!!b)}},tooltipContent:{get:function(){return l.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),l.contentGenerator(b)}},margin:{get:function(){return m},set:function(a){m.top=void 0!==a.top?a.top:m.top,m.right=void 0!==a.right?a.right:m.right,m.bottom=void 0!==a.bottom?a.bottom:m.bottom,m.left=void 0!==a.left?a.left:m.left}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),i.color(n)}},useInteractiveGuideline:{get:function(){return v},set:function(a){v=a,a===!0&&(b.interactive(!1),b.useVoronoi(!1))}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,h.orient(a?"right":"left")}},duration:{get:function(){return D},set:function(a){D=a,f.duration(D),g.duration(D),h.duration(D),H.reset(D)}}}),a.utils.inheritOptions(b,f),a.utils.initOptions(b),b},a.models.discreteBar=function(){"use strict";function b(m){return y.reset(),m.each(function(b){var m=k-j.left-j.right,x=l-j.top-j.bottom;c=d3.select(this),a.utils.initSVG(c),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var z=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),y0:a.y0}})});n.domain(d||d3.merge(z).map(function(a){return a.x})).rangeBands(f||[0,m],.1),o.domain(e||d3.extent(d3.merge(z).map(function(a){return a.y}).concat(r))),o.range(t?g||[x-(o.domain()[0]<0?12:0),o.domain()[1]>0?12:0]:g||[x,0]),h=h||n,i=i||o.copy().range([o(0),o(0)]);{var A=c.selectAll("g.nv-wrap.nv-discretebar").data([b]),B=A.enter().append("g").attr("class","nvd3 nv-wrap nv-discretebar"),C=B.append("g");A.select("g")}C.append("g").attr("class","nv-groups"),A.attr("transform","translate("+j.left+","+j.top+")");var D=A.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});D.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),D.exit().watchTransition(y,"discreteBar: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),D.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),D.watchTransition(y,"discreteBar: groups").style("stroke-opacity",1).style("fill-opacity",.75);var E=D.selectAll("g.nv-bar").data(function(a){return a.values});E.exit().remove();var F=E.enter().append("g").attr("transform",function(a,b){return"translate("+(n(p(a,b))+.05*n.rangeBand())+", "+o(0)+")"}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),v.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),v.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){v.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){v.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()});F.append("rect").attr("height",0).attr("width",.9*n.rangeBand()/b.length),t?(F.append("text").attr("text-anchor","middle"),E.select("text").text(function(a,b){return u(q(a,b))}).watchTransition(y,"discreteBar: bars text").attr("x",.9*n.rangeBand()/2).attr("y",function(a,b){return q(a,b)<0?o(q(a,b))-o(0)+12:-4})):E.selectAll("text").remove(),E.attr("class",function(a,b){return q(a,b)<0?"nv-bar negative":"nv-bar positive"}).style("fill",function(a,b){return a.color||s(a,b)}).style("stroke",function(a,b){return a.color||s(a,b)}).select("rect").attr("class",w).watchTransition(y,"discreteBar: bars rect").attr("width",.9*n.rangeBand()/b.length),E.watchTransition(y,"discreteBar: bars").attr("transform",function(a,b){var c=n(p(a,b))+.05*n.rangeBand(),d=q(a,b)<0?o(0):o(0)-o(q(a,b))<1?o(0)-1:o(q(a,b));return"translate("+c+", "+d+")"}).select("rect").attr("height",function(a,b){return Math.max(Math.abs(o(q(a,b))-o(e&&e[0]||0))||1)}),h=n.copy(),i=o.copy()}),y.renderEnd("discreteBar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=d3.scale.ordinal(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=[0],s=a.utils.defaultColor(),t=!1,u=d3.format(",.2f"),v=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),w="discreteBar",x=250,y=a.utils.renderWatch(v,x);return b.dispatch=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},forceY:{get:function(){return r},set:function(a){r=a}},showValues:{get:function(){return t},set:function(a){t=a}},x:{get:function(){return p},set:function(a){p=a}},y:{get:function(){return q},set:function(a){q=a}},xScale:{get:function(){return n},set:function(a){n=a}},yScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},valueFormat:{get:function(){return u},set:function(a){u=a}},id:{get:function(){return m},set:function(a){m=a}},rectClass:{get:function(){return w},set:function(a){w=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b)}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x)}}}),a.utils.initOptions(b),b},a.models.discreteBarChart=function(){"use strict";function b(h){return t.reset(),t.models(e),m&&t.models(f),n&&t.models(g),h.each(function(h){var l=d3.select(this);a.utils.initSVG(l);var q=a.utils.availableWidth(j,l,i),t=a.utils.availableHeight(k,l,i);if(b.update=function(){r.beforeUpdate(),l.transition().duration(s).call(b)},b.container=this,!(h&&h.length&&h.filter(function(a){return a.values.length}).length))return a.utils.noData(b,l),b;l.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var u=l.selectAll("g.nv-wrap.nv-discreteBarWithAxes").data([h]),v=u.enter().append("g").attr("class","nvd3 nv-wrap nv-discreteBarWithAxes").append("g"),w=v.append("defs"),x=u.select("g");v.append("g").attr("class","nv-x nv-axis"),v.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),v.append("g").attr("class","nv-barsWrap"),x.attr("transform","translate("+i.left+","+i.top+")"),o&&x.select(".nv-y.nv-axis").attr("transform","translate("+q+",0)"),e.width(q).height(t);var y=x.select(".nv-barsWrap").datum(h.filter(function(a){return!a.disabled}));if(y.transition().call(e),w.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),x.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(p?2:1)).attr("height",16).attr("x",-c.rangeBand()/(p?1:2)),m){f.scale(c)._ticks(a.utils.calcTicksX(q/100,h)).tickSize(-t,0),x.select(".nv-x.nv-axis").attr("transform","translate(0,"+(d.range()[0]+(e.showValues()&&d.domain()[0]<0?16:0))+")"),x.select(".nv-x.nv-axis").call(f); +var z=x.select(".nv-x.nv-axis").selectAll("g");p&&z.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}n&&(g.scale(d)._ticks(a.utils.calcTicksY(t/36,h)).tickSize(-q,0),x.select(".nv-y.nv-axis").call(g)),x.select(".nv-zeroLine line").attr("x1",0).attr("x2",q).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("discreteBar chart immediate"),b}var c,d,e=a.models.discreteBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.tooltip(),i={top:15,right:10,bottom:50,left:60},j=null,k=null,l=a.utils.getColor(),m=!0,n=!0,o=!1,p=!1,q=null,r=d3.dispatch("beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(o?"right":"left").tickFormat(d3.format(",.1f")),h.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).keyFormatter(function(a,b){return f.tickFormat()(a,b)});var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},h.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){h.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){h.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.discretebar=e,b.xAxis=f,b.yAxis=g,b.tooltip=h,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},staggerLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return m},set:function(a){m=a}},showYAxis:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return q},set:function(a){q=a}},tooltips:{get:function(){return h.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),h.enabled(!!b)}},tooltipContent:{get:function(){return h.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),h.contentGenerator(b)}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),e.color(l)}},rightAlignYAxis:{get:function(){return o},set:function(a){o=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.distribution=function(){"use strict";function b(k){return m.reset(),k.each(function(b){var k=(e-("x"===g?d.left+d.right:d.top+d.bottom),"x"==g?"y":"x"),l=d3.select(this);a.utils.initSVG(l),c=c||j;var n=l.selectAll("g.nv-distribution").data([b]),o=n.enter().append("g").attr("class","nvd3 nv-distribution"),p=(o.append("g"),n.select("g"));n.attr("transform","translate("+d.left+","+d.top+")");var q=p.selectAll("g.nv-dist").data(function(a){return a},function(a){return a.key});q.enter().append("g"),q.attr("class",function(a,b){return"nv-dist nv-series-"+b}).style("stroke",function(a,b){return i(a,b)});var r=q.selectAll("line.nv-dist"+g).data(function(a){return a.values});r.enter().append("line").attr(g+"1",function(a,b){return c(h(a,b))}).attr(g+"2",function(a,b){return c(h(a,b))}),m.transition(q.exit().selectAll("line.nv-dist"+g),"dist exit").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}).style("stroke-opacity",0).remove(),r.attr("class",function(a,b){return"nv-dist"+g+" nv-dist"+g+"-"+b}).attr(k+"1",0).attr(k+"2",f),m.transition(r,"dist").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}),c=j.copy()}),m.renderEnd("distribution immediate"),b}var c,d={top:0,right:0,bottom:0,left:0},e=400,f=8,g="x",h=function(a){return a[g]},i=a.utils.defaultColor(),j=d3.scale.linear(),k=250,l=d3.dispatch("renderEnd"),m=a.utils.renderWatch(l,k);return b.options=a.utils.optionsFunc.bind(b),b.dispatch=l,b.margin=function(a){return arguments.length?(d.top="undefined"!=typeof a.top?a.top:d.top,d.right="undefined"!=typeof a.right?a.right:d.right,d.bottom="undefined"!=typeof a.bottom?a.bottom:d.bottom,d.left="undefined"!=typeof a.left?a.left:d.left,b):d},b.width=function(a){return arguments.length?(e=a,b):e},b.axis=function(a){return arguments.length?(g=a,b):g},b.size=function(a){return arguments.length?(f=a,b):f},b.getData=function(a){return arguments.length?(h=d3.functor(a),b):h},b.scale=function(a){return arguments.length?(j=a,b):j},b.color=function(c){return arguments.length?(i=a.utils.getColor(c),b):i},b.duration=function(a){return arguments.length?(k=a,m.reset(k),b):k},b},a.models.furiousLegend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?g(a,b):"#fff":m?void 0:a.disabled?g(a,b):"#fff"}function r(a,b){return m&&"furious"==o?a.disengaged?"#fff":g(a,b):a.disabled?"#fff":g(a,b)}return p.each(function(b){var p=d-c.left-c.right,s=d3.select(this);a.utils.initSVG(s);var t=s.selectAll("g.nv-legend").data([b]),u=(t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),t.select("g"));t.attr("transform","translate("+c.left+","+c.top+")");var v,w=u.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),x=w.enter().append("g").attr("class","nv-series");if("classic"==o)x.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),v=w.select("circle");else if("furious"==o){x.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),v=w.select("rect"),x.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var y=w.select(".nv-check-box");y.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}x.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var z=w.select("text.nv-legend-text");w.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=w.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=w.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),w.classed("nv-disabled",function(a){return a.userDisabled}),w.exit().remove(),z.attr("fill",q).text(f);var A;switch(o){case"furious":A=23;break;case"classic":A=20}if(h){var B=[];w.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}B.push(b+i)});for(var C=0,D=0,E=[];p>D&&Cp&&C>1;){E=[],C--;for(var F=0;F(E[F%C]||0)&&(E[F%C]=B[F]);D=E.reduce(function(a,b){return a+b})}for(var G=[],H=0,I=0;C>H;H++)G[H]=I,I+=E[H];w.attr("transform",function(a,b){return"translate("+G[b%C]+","+(5+Math.floor(b/C)*A)+")"}),j?u.attr("transform","translate("+(d-c.right-D)+","+c.top+")"):u.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(B.length/C)*A}else{var J,K=5,L=5,M=0;w.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return J=L,dM&&(M=L),"translate("+J+","+K+")"}),u.attr("transform","translate("+(d-c.right-M)+","+c.top+")"),e=c.top+c.bottom+K+15}"furious"==o&&v.attr("width",function(a,b){return z[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),v.style("fill",r).style("stroke",function(a,b){return a.color||g(a,b)})}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=28,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBar=function(){"use strict";function b(x){return x.each(function(b){w.reset(),k=d3.select(this);var x=a.utils.availableWidth(h,k,g),y=a.utils.availableHeight(i,k,g);a.utils.initSVG(k),l.domain(c||d3.extent(b[0].values.map(n).concat(p))),l.range(r?e||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:e||[0,x]),m.domain(d||d3.extent(b[0].values.map(o).concat(q))).range(f||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var z=k.selectAll("g.nv-wrap.nv-historicalBar-"+j).data([b[0].values]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBar-"+j),B=A.append("defs"),C=A.append("g"),D=z.select("g");C.append("g").attr("class","nv-bars"),z.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){u.chartClick({data:a,index:b,pos:d3.event,id:j})}),B.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),z.select("#nv-chart-clip-path-"+j+" rect").attr("width",x).attr("height",y),D.attr("clip-path",s?"url(#nv-chart-clip-path-"+j+")":"");var E=z.select(".nv-bars").selectAll(".nv-bar").data(function(a){return a},function(a,b){return n(a,b)});E.exit().remove(),E.enter().append("rect").attr("x",0).attr("y",function(b,c){return a.utils.NaNtoZero(m(Math.max(0,o(b,c))))}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.abs(m(o(b,c))-m(0)))}).attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).on("mouseover",function(a,b){v&&(d3.select(this).classed("hover",!0),u.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mouseout",function(a,b){v&&(d3.select(this).classed("hover",!1),u.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mousemove",function(a,b){v&&u.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v&&(u.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}).on("dblclick",function(a,b){v&&(u.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}),E.attr("fill",function(a,b){return t(a,b)}).attr("class",function(a,b,c){return(o(a,b)<0?"nv-bar negative":"nv-bar positive")+" nv-bar-"+c+"-"+b}).watchTransition(w,"bars").attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).attr("width",x/b[0].values.length*.9),E.watchTransition(w,"bars").attr("y",function(b,c){var d=o(b,c)<0?m(0):m(0)-m(o(b,c))<1?m(0)-1:m(o(b,c));return a.utils.NaNtoZero(d)}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.max(Math.abs(m(o(b,c))-m(0)),1))})}),w.renderEnd("historicalBar immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=[],q=[0],r=!1,s=!0,t=a.utils.defaultColor(),u=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),v=!0,w=a.utils.renderWatch(u,0);return b.highlightPoint=function(a,b){k.select(".nv-bars .nv-bar-0-"+a).classed("hover",b)},b.clearHighlights=function(){k.select(".nv-bars .nv-bar.hover").classed("hover",!1)},b.dispatch=u,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},forceX:{get:function(){return p},set:function(a){p=a}},forceY:{get:function(){return q},set:function(a){q=a}},padData:{get:function(){return r},set:function(a){r=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},clipEdge:{get:function(){return s},set:function(a){s=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return v},set:function(a){v=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return t},set:function(b){t=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBarChart=function(b){"use strict";function c(b){return b.each(function(k){z.reset(),z.models(f),q&&z.models(g),r&&z.models(h);var w=d3.select(this),A=this;a.utils.initSVG(w);var B=a.utils.availableWidth(n,w,l),C=a.utils.availableHeight(o,w,l);if(c.update=function(){w.transition().duration(y).call(c)},c.container=this,u.disabled=k.map(function(a){return!!a.disabled}),!v){var D;v={};for(D in u)v[D]=u[D]instanceof Array?u[D].slice(0):u[D]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(c,w),c;w.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale();var E=w.selectAll("g.nv-wrap.nv-historicalBarChart").data([k]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBarChart").append("g"),G=E.select("g");F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-barsWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),p&&(i.width(B),G.select(".nv-legendWrap").datum(k).call(i),l.top!=i.height()&&(l.top=i.height(),C=a.utils.availableHeight(o,w,l)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-l.top+")")),E.attr("transform","translate("+l.left+","+l.top+")"),s&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),t&&(j.width(B).height(C).margin({left:l.left,top:l.top}).svgContainer(w).xScale(d),E.select(".nv-interactive").call(j)),f.width(B).height(C).color(k.map(function(a,b){return a.color||m(a,b)}).filter(function(a,b){return!k[b].disabled}));var H=G.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));H.transition().call(f),q&&(g.scale(d)._ticks(a.utils.calcTicksX(B/100,k)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),G.select(".nv-x.nv-axis").transition().call(g)),r&&(h.scale(e)._ticks(a.utils.calcTicksY(C/36,k)).tickSize(-B,0),G.select(".nv-y.nv-axis").transition().call(h)),j.dispatch.on("elementMousemove",function(b){f.clearHighlights();var d,e,i,n=[];k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g){e=a.interactiveBisect(g.values,b.pointXValue,c.x()),f.highlightPoint(e,!0);var h=g.values[e];void 0!==h&&(void 0===d&&(d=h),void 0===i&&(i=c.xScale()(c.x()(h,e))),n.push({key:g.key,value:c.y()(h,e),color:m(g,g.seriesIndex),data:g.values[e]}))});var o=g.tickFormat()(c.x()(d,e));j.tooltip.position({left:i+l.left,top:b.mouseY+l.top}).chartContainer(A.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:o,index:e,series:n})(),j.renderGuideLine(i)}),j.dispatch.on("elementMouseout",function(){x.tooltipHide(),f.clearHighlights()}),i.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,k.filter(function(a){return!a.disabled}).length||k.map(function(a){return a.disabled=!1,E.selectAll(".nv-series").classed("disabled",!1),a}),u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),b.transition().call(c)}),i.dispatch.on("legendDblclick",function(a){k.forEach(function(a){a.disabled=!0}),a.disabled=!1,u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),c.update()}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),c.update()})}),z.renderEnd("historicalBarChart immediate"),c}var d,e,f=b||a.models.historicalBar(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:90,bottom:50,left:90},m=a.utils.defaultColor(),n=null,o=null,p=!1,q=!0,r=!0,s=!1,t=!1,u={},v=null,w=null,x=d3.dispatch("tooltipHide","stateChange","changeState","renderEnd"),y=250;g.orient("bottom").tickPadding(7),h.orient(s?"right":"left"),k.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)});var z=a.utils.renderWatch(x,0);return f.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:c.x()(a.data),value:c.y()(a.data),color:a.color},k.data(a).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),f.dispatch.on("elementMousemove.tooltip",function(){k.position({top:d3.event.pageY,left:d3.event.pageX})()}),c.dispatch=x,c.bars=f,c.legend=i,c.xAxis=g,c.yAxis=h,c.interactiveLayer=j,c.tooltip=k,c.options=a.utils.optionsFunc.bind(c),c._options=Object.create({},{width:{get:function(){return n},set:function(a){n=a}},height:{get:function(){return o},set:function(a){o=a}},showLegend:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return q},set:function(a){q=a}},showYAxis:{get:function(){return r},set:function(a){r=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b),i.color(m),f.color(m)}},duration:{get:function(){return y},set:function(a){y=a,z.reset(y),h.duration(y),g.duration(y)}},rightAlignYAxis:{get:function(){return s},set:function(a){s=a,h.orient(a?"right":"left")}},useInteractiveGuideline:{get:function(){return t},set:function(a){t=a,a===!0&&c.interactive(!1)}}}),a.utils.inheritOptions(c,f),a.utils.initOptions(c),c},a.models.ohlcBarChart=function(){var b=a.models.historicalBarChart(a.models.ohlcBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
      open:"+b.yAxis.tickFormat()(c.open)+"
      close:"+b.yAxis.tickFormat()(c.close)+"
      high"+b.yAxis.tickFormat()(c.high)+"
      low:"+b.yAxis.tickFormat()(c.low)+"
      "}),b},a.models.candlestickBarChart=function(){var b=a.models.historicalBarChart(a.models.candlestickBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
      open:"+b.yAxis.tickFormat()(c.open)+"
      close:"+b.yAxis.tickFormat()(c.close)+"
      high"+b.yAxis.tickFormat()(c.high)+"
      low:"+b.yAxis.tickFormat()(c.low)+"
      "}),b},a.models.legend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?"#000":"#fff":m?void 0:(a.color||(a.color=g(a,b)),a.disabled?a.color:"#fff")}function r(a,b){return m&&"furious"==o&&a.disengaged?"#eee":a.color||g(a,b)}function s(a){return m&&"furious"==o?1:a.disabled?0:1}return p.each(function(b){var g=d-c.left-c.right,p=d3.select(this);a.utils.initSVG(p);var t=p.selectAll("g.nv-legend").data([b]),u=t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),v=t.select("g");t.attr("transform","translate("+c.left+","+c.top+")");var w,x,y=v.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),z=y.enter().append("g").attr("class","nv-series");switch(o){case"furious":x=23;break;case"classic":x=20}if("classic"==o)z.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),w=y.select("circle");else if("furious"==o){z.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),w=y.select(".nv-legend-symbol"),z.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var A=y.select(".nv-check-box");A.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}z.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var B=y.select("text.nv-legend-text");y.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=y.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=y.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),y.classed("nv-disabled",function(a){return a.userDisabled}),y.exit().remove(),B.attr("fill",q).text(f);var C=0;if(h){var D=[];y.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}D.push(b+i)});var E=0,F=[];for(C=0;g>C&&Eg&&E>1;){F=[],E--;for(var G=0;G(F[G%E]||0)&&(F[G%E]=D[G]);C=F.reduce(function(a,b){return a+b})}for(var H=[],I=0,J=0;E>I;I++)H[I]=J,J+=F[I];y.attr("transform",function(a,b){return"translate("+H[b%E]+","+(5+Math.floor(b/E)*x)+")"}),j?v.attr("transform","translate("+(d-c.right-C)+","+c.top+")"):v.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(D.length/E)*x}else{var K,L=5,M=5,N=0;y.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return K=M,dN&&(N=M),K+N>C&&(C=K+N),"translate("+K+","+L+")"}),v.attr("transform","translate("+(d-c.right-N)+","+c.top+")"),e=c.top+c.bottom+L+15}if("furious"==o){w.attr("width",function(a,b){return B[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),u.insert("rect",":first-child").attr("class","nv-legend-bg").attr("fill","#eee").attr("opacity",0);var O=v.select(".nv-legend-bg");O.transition().duration(300).attr("x",-x).attr("width",C+x-12).attr("height",e+10).attr("y",-c.top-10).attr("opacity",m?1:0)}w.style("fill",r).style("fill-opacity",s).style("stroke",r)}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=32,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.line=function(){"use strict";function b(r){return v.reset(),v.models(e),r.each(function(b){i=d3.select(this);var r=a.utils.availableWidth(g,i,f),s=a.utils.availableHeight(h,i,f);a.utils.initSVG(i),c=e.xScale(),d=e.yScale(),t=t||c,u=u||d;var w=i.selectAll("g.nv-wrap.nv-line").data([b]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-line"),y=x.append("defs"),z=x.append("g"),A=w.select("g");z.append("g").attr("class","nv-groups"),z.append("g").attr("class","nv-scatterWrap"),w.attr("transform","translate("+f.left+","+f.top+")"),e.width(r).height(s);var B=w.select(".nv-scatterWrap");B.call(e),y.append("clipPath").attr("id","nv-edge-clip-"+e.id()).append("rect"),w.select("#nv-edge-clip-"+e.id()+" rect").attr("width",r).attr("height",s>0?s:0),A.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":""),B.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":"");var C=w.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});C.enter().append("g").style("stroke-opacity",1e-6).style("stroke-width",function(a){return a.strokeWidth||j}).style("fill-opacity",1e-6),C.exit().remove(),C.attr("class",function(a,b){return(a.classed||"")+" nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return k(a,b)}).style("stroke",function(a,b){return k(a,b)}),C.watchTransition(v,"line: groups").style("stroke-opacity",1).style("fill-opacity",function(a){return a.fillOpacity||.5});var D=C.selectAll("path.nv-area").data(function(a){return o(a)?[a]:[]});D.enter().append("path").attr("class","nv-area").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y0(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))}).y1(function(){return u(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])}),C.exit().selectAll("path.nv-area").remove(),D.watchTransition(v,"line: areaPaths").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y0(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))}).y1(function(){return d(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])});var E=C.selectAll("path.nv-line").data(function(a){return[a.values]});E.enter().append("path").attr("class","nv-line").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))})),E.watchTransition(v,"line: linePaths").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))})),t=c.copy(),u=d.copy()}),v.renderEnd("line immediate"),b}var c,d,e=a.models.scatter(),f={top:0,right:0,bottom:0,left:0},g=960,h=500,i=null,j=1.5,k=a.utils.defaultColor(),l=function(a){return a.x},m=function(a){return a.y},n=function(a,b){return!isNaN(m(a,b))&&null!==m(a,b)},o=function(a){return a.area},p=!1,q="linear",r=250,s=d3.dispatch("elementClick","elementMouseover","elementMouseout","renderEnd");e.pointSize(16).pointDomain([16,256]);var t,u,v=a.utils.renderWatch(s,r);return b.dispatch=s,b.scatter=e,e.dispatch.on("elementClick",function(){s.elementClick.apply(this,arguments)}),e.dispatch.on("elementMouseover",function(){s.elementMouseover.apply(this,arguments)}),e.dispatch.on("elementMouseout",function(){s.elementMouseout.apply(this,arguments)}),b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},defined:{get:function(){return n},set:function(a){n=a}},interpolate:{get:function(){return q},set:function(a){q=a}},clipEdge:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},duration:{get:function(){return r},set:function(a){r=a,v.reset(r),e.duration(r)}},isArea:{get:function(){return o},set:function(a){o=d3.functor(a)}},x:{get:function(){return l},set:function(a){l=a,e.x(a)}},y:{get:function(){return m},set:function(a){m=a,e.y(a)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.lineChart=function(){"use strict";function b(j){return y.reset(),y.models(e),p&&y.models(f),q&&y.models(g),j.each(function(j){var v=d3.select(this),y=this;a.utils.initSVG(v);var B=a.utils.availableWidth(m,v,k),C=a.utils.availableHeight(n,v,k);if(b.update=function(){0===x?v.call(b):v.transition().duration(x).call(b)},b.container=this,t.setter(A(j),b.update).getter(z(j)).update(),t.disabled=j.map(function(a){return!!a.disabled}),!u){var D;u={};for(D in t)u[D]=t[D]instanceof Array?t[D].slice(0):t[D] +}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,v),b;v.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var E=v.selectAll("g.nv-wrap.nv-lineChart").data([j]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-lineChart").append("g"),G=E.select("g");F.append("rect").style("opacity",0),F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-linesWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),G.select("rect").attr("width",B).attr("height",C>0?C:0),o&&(h.width(B),G.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),C=a.utils.availableHeight(n,v,k)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-k.top+")")),E.attr("transform","translate("+k.left+","+k.top+")"),r&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),s&&(i.width(B).height(C).margin({left:k.left,top:k.top}).svgContainer(v).xScale(c),E.select(".nv-interactive").call(i)),e.width(B).height(C).color(j.map(function(a,b){return a.color||l(a,b)}).filter(function(a,b){return!j[b].disabled}));var H=G.select(".nv-linesWrap").datum(j.filter(function(a){return!a.disabled}));H.call(e),p&&(f.scale(c)._ticks(a.utils.calcTicksX(B/100,j)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),G.select(".nv-x.nv-axis").call(f)),q&&(g.scale(d)._ticks(a.utils.calcTicksY(C/36,j)).tickSize(-B,0),G.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)t[c]=a[c];w.stateChange(t),b.update()}),i.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,h,m,n=[];if(j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,g){h=a.interactiveBisect(f.values,c.pointXValue,b.x());var i=f.values[h],j=b.y()(i,h);null!=j&&e.highlightPoint(g,h,!0),void 0!==i&&(void 0===d&&(d=i),void 0===m&&(m=b.xScale()(b.x()(i,h))),n.push({key:f.key,value:j,color:l(f,f.seriesIndex)}))}),n.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(n.map(function(a){return a.value}),o,q);null!==r&&(n[r].highlight=!0)}var s=f.tickFormat()(b.x()(d,h));i.tooltip.position({left:c.mouseX+k.left,top:c.mouseY+k.top}).chartContainer(y.parentNode).valueFormatter(function(a){return null==a?"N/A":g.tickFormat()(a)}).data({value:s,index:h,series:n})(),i.renderGuideLine(m)}),i.dispatch.on("elementClick",function(c){var d,f=[];j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(e){var g=a.interactiveBisect(e.values,c.pointXValue,b.x()),h=e.values[g];if("undefined"!=typeof h){"undefined"==typeof d&&(d=b.xScale()(b.x()(h,g)));var i=b.yScale()(b.y()(h,g));f.push({point:h,pointIndex:g,pos:[d,i],seriesIndex:e.seriesIndex,series:e})}}),e.dispatch.elementClick(f)}),i.dispatch.on("elementMouseout",function(){e.clearHighlights()}),w.on("changeState",function(a){"undefined"!=typeof a.disabled&&j.length===a.disabled.length&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),t.disabled=a.disabled),b.update()})}),y.renderEnd("lineChart immediate"),b}var c,d,e=a.models.line(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.interactiveGuideline(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=a.utils.defaultColor(),m=null,n=null,o=!0,p=!0,q=!0,r=!1,s=!1,t=a.utils.state(),u=null,v=null,w=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),x=250;f.orient("bottom").tickPadding(7),g.orient(r?"right":"left"),j.valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)});var y=a.utils.renderWatch(w,x),z=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},A=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){j.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),b.dispatch=w,b.lines=e,b.legend=h,b.xAxis=f,b.yAxis=g,b.interactiveLayer=i,b.tooltip=j,b.dispatch=w,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return p},set:function(a){p=a}},showYAxis:{get:function(){return q},set:function(a){q=a}},defaultState:{get:function(){return u},set:function(a){u=a}},noData:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x),e.duration(x),f.duration(x),g.duration(x)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),h.color(l),e.color(l)}},rightAlignYAxis:{get:function(){return r},set:function(a){r=a,g.orient(r?"right":"left")}},useInteractiveGuideline:{get:function(){return s},set:function(a){s=a,s&&(e.interactive(!1),e.useVoronoi(!1))}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.linePlusBarChart=function(){"use strict";function b(v){return v.each(function(v){function J(a){var b=+("e"==a),c=b?1:-1,d=X/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function S(){u.empty()||u.extent(I),kb.data([u.empty()?e.domain():I]).each(function(a){var b=e(a[0])-e.range()[0],c=e.range()[1]-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>c?0:c)})}function T(){I=u.empty()?null:u.extent(),c=u.empty()?e.domain():u.extent(),K.brush({extent:c,brush:u}),S(),l.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),j.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var b=db.select(".nv-focus .nv-barsWrap").datum(Z.length?Z.map(function(a){return{key:a.key,values:a.values.filter(function(a,b){return l.x()(a,b)>=c[0]&&l.x()(a,b)<=c[1]})}}):[{values:[]}]),h=db.select(".nv-focus .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$.map(function(a){return{area:a.area,fillOpacity:a.fillOpacity,key:a.key,values:a.values.filter(function(a,b){return j.x()(a,b)>=c[0]&&j.x()(a,b)<=c[1]})}}));d=Z.length?l.xScale():j.xScale(),n.scale(d)._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-W,0),n.domain([Math.ceil(c[0]),Math.floor(c[1])]),db.select(".nv-x.nv-axis").transition().duration(L).call(n),b.transition().duration(L).call(l),h.transition().duration(L).call(j),db.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),p.scale(f)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(-V,0),q.scale(g)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(Z.length?0:-V,0),db.select(".nv-focus .nv-y1.nv-axis").style("opacity",Z.length?1:0),db.select(".nv-focus .nv-y2.nv-axis").style("opacity",$.length&&!$[0].disabled?1:0).attr("transform","translate("+d.range()[1]+",0)"),db.select(".nv-focus .nv-y1.nv-axis").transition().duration(L).call(p),db.select(".nv-focus .nv-y2.nv-axis").transition().duration(L).call(q)}var U=d3.select(this);a.utils.initSVG(U);var V=a.utils.availableWidth(y,U,w),W=a.utils.availableHeight(z,U,w)-(E?H:0),X=H-x.top-x.bottom;if(b.update=function(){U.transition().duration(L).call(b)},b.container=this,M.setter(R(v),b.update).getter(Q(v)).update(),M.disabled=v.map(function(a){return!!a.disabled}),!N){var Y;N={};for(Y in M)N[Y]=M[Y]instanceof Array?M[Y].slice(0):M[Y]}if(!(v&&v.length&&v.filter(function(a){return a.values.length}).length))return a.utils.noData(b,U),b;U.selectAll(".nv-noData").remove();var Z=v.filter(function(a){return!a.disabled&&a.bar}),$=v.filter(function(a){return!a.bar});d=l.xScale(),e=o.scale(),f=l.yScale(),g=j.yScale(),h=m.yScale(),i=k.yScale();var _=v.filter(function(a){return!a.disabled&&a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})}),ab=v.filter(function(a){return!a.disabled&&!a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})});d.range([0,V]),e.domain(d3.extent(d3.merge(_.concat(ab)),function(a){return a.x})).range([0,V]);var bb=U.selectAll("g.nv-wrap.nv-linePlusBar").data([v]),cb=bb.enter().append("g").attr("class","nvd3 nv-wrap nv-linePlusBar").append("g"),db=bb.select("g");cb.append("g").attr("class","nv-legendWrap");var eb=cb.append("g").attr("class","nv-focus");eb.append("g").attr("class","nv-x nv-axis"),eb.append("g").attr("class","nv-y1 nv-axis"),eb.append("g").attr("class","nv-y2 nv-axis"),eb.append("g").attr("class","nv-barsWrap"),eb.append("g").attr("class","nv-linesWrap");var fb=cb.append("g").attr("class","nv-context");if(fb.append("g").attr("class","nv-x nv-axis"),fb.append("g").attr("class","nv-y1 nv-axis"),fb.append("g").attr("class","nv-y2 nv-axis"),fb.append("g").attr("class","nv-barsWrap"),fb.append("g").attr("class","nv-linesWrap"),fb.append("g").attr("class","nv-brushBackground"),fb.append("g").attr("class","nv-x nv-brush"),D){var gb=t.align()?V/2:V,hb=t.align()?gb:0;t.width(gb),db.select(".nv-legendWrap").datum(v.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(a.bar?O:P),a})).call(t),w.top!=t.height()&&(w.top=t.height(),W=a.utils.availableHeight(z,U,w)-H),db.select(".nv-legendWrap").attr("transform","translate("+hb+","+-w.top+")")}bb.attr("transform","translate("+w.left+","+w.top+")"),db.select(".nv-context").style("display",E?"initial":"none"),m.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),k.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var ib=db.select(".nv-context .nv-barsWrap").datum(Z.length?Z:[{values:[]}]),jb=db.select(".nv-context .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$);db.select(".nv-context").attr("transform","translate(0,"+(W+w.bottom+x.top)+")"),ib.transition().call(m),jb.transition().call(k),G&&(o._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-X,0),db.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+h.range()[0]+")"),db.select(".nv-context .nv-x.nv-axis").transition().call(o)),F&&(r.scale(h)._ticks(X/36).tickSize(-V,0),s.scale(i)._ticks(X/36).tickSize(Z.length?0:-V,0),db.select(".nv-context .nv-y3.nv-axis").style("opacity",Z.length?1:0).attr("transform","translate(0,"+e.range()[0]+")"),db.select(".nv-context .nv-y2.nv-axis").style("opacity",$.length?1:0).attr("transform","translate("+e.range()[1]+",0)"),db.select(".nv-context .nv-y1.nv-axis").transition().call(r),db.select(".nv-context .nv-y2.nv-axis").transition().call(s)),u.x(e).on("brush",T),I&&u.extent(I);var kb=db.select(".nv-brushBackground").selectAll("g").data([I||u.extent()]),lb=kb.enter().append("g");lb.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",X),lb.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",X);var mb=db.select(".nv-x.nv-brush").call(u);mb.selectAll("rect").attr("height",X),mb.selectAll(".resize").append("path").attr("d",J),t.dispatch.on("stateChange",function(a){for(var c in a)M[c]=a[c];K.stateChange(M),b.update()}),K.on("changeState",function(a){"undefined"!=typeof a.disabled&&(v.forEach(function(b,c){b.disabled=a.disabled[c]}),M.disabled=a.disabled),b.update()}),T()}),b}var c,d,e,f,g,h,i,j=a.models.line(),k=a.models.line(),l=a.models.historicalBar(),m=a.models.historicalBar(),n=a.models.axis(),o=a.models.axis(),p=a.models.axis(),q=a.models.axis(),r=a.models.axis(),s=a.models.axis(),t=a.models.legend(),u=d3.svg.brush(),v=a.models.tooltip(),w={top:30,right:30,bottom:30,left:60},x={top:0,right:30,bottom:20,left:60},y=null,z=null,A=function(a){return a.x},B=function(a){return a.y},C=a.utils.defaultColor(),D=!0,E=!0,F=!1,G=!0,H=50,I=null,J=null,K=d3.dispatch("brush","stateChange","changeState"),L=0,M=a.utils.state(),N=null,O=" (left axis)",P=" (right axis)";j.clipEdge(!0),k.interactive(!1),n.orient("bottom").tickPadding(5),p.orient("left"),q.orient("right"),o.orient("bottom").tickPadding(5),r.orient("left"),s.orient("right"),v.headerEnabled(!0).headerFormatter(function(a,b){return n.tickFormat()(a,b)});var Q=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},R=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return j.dispatch.on("elementMouseover.tooltip",function(a){v.duration(100).valueFormatter(function(a,b){return q.tickFormat()(a,b)}).data(a).position(a.pos).hidden(!1)}),j.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={value:b.y()(a.data),color:a.color},v.duration(0).valueFormatter(function(a,b){return p.tickFormat()(a,b)}).data(a).hidden(!1)}),l.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMousemove.tooltip",function(){v.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=K,b.legend=t,b.lines=j,b.lines2=k,b.bars=l,b.bars2=m,b.xAxis=n,b.x2Axis=o,b.y1Axis=p,b.y2Axis=q,b.y3Axis=r,b.y4Axis=s,b.tooltip=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return y},set:function(a){y=a}},height:{get:function(){return z},set:function(a){z=a}},showLegend:{get:function(){return D},set:function(a){D=a}},brushExtent:{get:function(){return I},set:function(a){I=a}},noData:{get:function(){return J},set:function(a){J=a}},focusEnable:{get:function(){return E},set:function(a){E=a}},focusHeight:{get:function(){return H},set:function(a){H=a}},focusShowAxisX:{get:function(){return G},set:function(a){G=a}},focusShowAxisY:{get:function(){return F},set:function(a){F=a}},legendLeftAxisHint:{get:function(){return O},set:function(a){O=a}},legendRightAxisHint:{get:function(){return P},set:function(a){P=a}},tooltips:{get:function(){return v.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),v.enabled(!!b)}},tooltipContent:{get:function(){return v.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),v.contentGenerator(b)}},margin:{get:function(){return w},set:function(a){w.top=void 0!==a.top?a.top:w.top,w.right=void 0!==a.right?a.right:w.right,w.bottom=void 0!==a.bottom?a.bottom:w.bottom,w.left=void 0!==a.left?a.left:w.left}},duration:{get:function(){return L},set:function(a){L=a}},color:{get:function(){return C},set:function(b){C=a.utils.getColor(b),t.color(C)}},x:{get:function(){return A},set:function(a){A=a,j.x(a),k.x(a),l.x(a),m.x(a)}},y:{get:function(){return B},set:function(a){B=a,j.y(a),k.y(a),l.y(a),m.y(a)}}}),a.utils.inheritOptions(b,j),a.utils.initOptions(b),b},a.models.lineWithFocusChart=function(){"use strict";function b(o){return o.each(function(o){function z(a){var b=+("e"==a),c=b?1:-1,d=M/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function G(){n.empty()||n.extent(y),U.data([n.empty()?e.domain():y]).each(function(a){var b=e(a[0])-c.range()[0],d=K-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>d?0:d)})}function H(){y=n.empty()?null:n.extent();var a=n.empty()?e.domain():n.extent();if(!(Math.abs(a[0]-a[1])<=1)){A.brush({extent:a,brush:n}),G();var b=Q.select(".nv-focus .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}).map(function(b){return{key:b.key,area:b.area,values:b.values.filter(function(b,c){return g.x()(b,c)>=a[0]&&g.x()(b,c)<=a[1]})}}));b.transition().duration(B).call(g),Q.select(".nv-focus .nv-x.nv-axis").transition().duration(B).call(i),Q.select(".nv-focus .nv-y.nv-axis").transition().duration(B).call(j)}}var I=d3.select(this),J=this;a.utils.initSVG(I);var K=a.utils.availableWidth(t,I,q),L=a.utils.availableHeight(u,I,q)-v,M=v-r.top-r.bottom;if(b.update=function(){I.transition().duration(B).call(b)},b.container=this,C.setter(F(o),b.update).getter(E(o)).update(),C.disabled=o.map(function(a){return!!a.disabled}),!D){var N;D={};for(N in C)D[N]=C[N]instanceof Array?C[N].slice(0):C[N]}if(!(o&&o.length&&o.filter(function(a){return a.values.length}).length))return a.utils.noData(b,I),b;I.selectAll(".nv-noData").remove(),c=g.xScale(),d=g.yScale(),e=h.xScale(),f=h.yScale();var O=I.selectAll("g.nv-wrap.nv-lineWithFocusChart").data([o]),P=O.enter().append("g").attr("class","nvd3 nv-wrap nv-lineWithFocusChart").append("g"),Q=O.select("g");P.append("g").attr("class","nv-legendWrap");var R=P.append("g").attr("class","nv-focus");R.append("g").attr("class","nv-x nv-axis"),R.append("g").attr("class","nv-y nv-axis"),R.append("g").attr("class","nv-linesWrap"),R.append("g").attr("class","nv-interactive");var S=P.append("g").attr("class","nv-context");S.append("g").attr("class","nv-x nv-axis"),S.append("g").attr("class","nv-y nv-axis"),S.append("g").attr("class","nv-linesWrap"),S.append("g").attr("class","nv-brushBackground"),S.append("g").attr("class","nv-x nv-brush"),x&&(m.width(K),Q.select(".nv-legendWrap").datum(o).call(m),q.top!=m.height()&&(q.top=m.height(),L=a.utils.availableHeight(u,I,q)-v),Q.select(".nv-legendWrap").attr("transform","translate(0,"+-q.top+")")),O.attr("transform","translate("+q.left+","+q.top+")"),w&&(p.width(K).height(L).margin({left:q.left,top:q.top}).svgContainer(I).xScale(c),O.select(".nv-interactive").call(p)),g.width(K).height(L).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),h.defined(g.defined()).width(K).height(M).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),Q.select(".nv-context").attr("transform","translate(0,"+(L+q.bottom+r.top)+")");var T=Q.select(".nv-context .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}));d3.transition(T).call(h),i.scale(c)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-L,0),j.scale(d)._ticks(a.utils.calcTicksY(L/36,o)).tickSize(-K,0),Q.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+L+")"),n.x(e).on("brush",function(){H()}),y&&n.extent(y);var U=Q.select(".nv-brushBackground").selectAll("g").data([y||n.extent()]),V=U.enter().append("g");V.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",M),V.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",M);var W=Q.select(".nv-x.nv-brush").call(n);W.selectAll("rect").attr("height",M),W.selectAll(".resize").append("path").attr("d",z),H(),k.scale(e)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-M,0),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),d3.transition(Q.select(".nv-context .nv-x.nv-axis")).call(k),l.scale(f)._ticks(a.utils.calcTicksY(M/36,o)).tickSize(-K,0),d3.transition(Q.select(".nv-context .nv-y.nv-axis")).call(l),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),m.dispatch.on("stateChange",function(a){for(var c in a)C[c]=a[c];A.stateChange(C),b.update()}),p.dispatch.on("elementMousemove",function(c){g.clearHighlights();var d,f,h,k=[];if(o.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(i,j){var l=n.empty()?e.domain():n.extent(),m=i.values.filter(function(a,b){return g.x()(a,b)>=l[0]&&g.x()(a,b)<=l[1]});f=a.interactiveBisect(m,c.pointXValue,g.x());var o=m[f],p=b.y()(o,f);null!=p&&g.highlightPoint(j,f,!0),void 0!==o&&(void 0===d&&(d=o),void 0===h&&(h=b.xScale()(b.x()(o,f))),k.push({key:i.key,value:b.y()(o,f),color:s(i,i.seriesIndex)}))}),k.length>2){var l=b.yScale().invert(c.mouseY),m=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),r=.03*m,t=a.nearestValueIndex(k.map(function(a){return a.value}),l,r);null!==t&&(k[t].highlight=!0)}var u=i.tickFormat()(b.x()(d,f));p.tooltip.position({left:c.mouseX+q.left,top:c.mouseY+q.top}).chartContainer(J.parentNode).valueFormatter(function(a){return null==a?"N/A":j.tickFormat()(a)}).data({value:u,index:f,series:k})(),p.renderGuideLine(h)}),p.dispatch.on("elementMouseout",function(){g.clearHighlights()}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&o.forEach(function(b,c){b.disabled=a.disabled[c]}),b.update()})}),b}var c,d,e,f,g=a.models.line(),h=a.models.line(),i=a.models.axis(),j=a.models.axis(),k=a.models.axis(),l=a.models.axis(),m=a.models.legend(),n=d3.svg.brush(),o=a.models.tooltip(),p=a.interactiveGuideline(),q={top:30,right:30,bottom:30,left:60},r={top:0,right:30,bottom:20,left:60},s=a.utils.defaultColor(),t=null,u=null,v=50,w=!1,x=!0,y=null,z=null,A=d3.dispatch("brush","stateChange","changeState"),B=250,C=a.utils.state(),D=null;g.clipEdge(!0).duration(0),h.interactive(!1),i.orient("bottom").tickPadding(5),j.orient("left"),k.orient("bottom").tickPadding(5),l.orient("left"),o.valueFormatter(function(a,b){return j.tickFormat()(a,b)}).headerFormatter(function(a,b){return i.tickFormat()(a,b)});var E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return g.dispatch.on("elementMouseover.tooltip",function(a){o.data(a).position(a.pos).hidden(!1)}),g.dispatch.on("elementMouseout.tooltip",function(){o.hidden(!0)}),b.dispatch=A,b.legend=m,b.lines=g,b.lines2=h,b.xAxis=i,b.yAxis=j,b.x2Axis=k,b.y2Axis=l,b.interactiveLayer=p,b.tooltip=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return t},set:function(a){t=a}},height:{get:function(){return u},set:function(a){u=a}},focusHeight:{get:function(){return v},set:function(a){v=a}},showLegend:{get:function(){return x},set:function(a){x=a}},brushExtent:{get:function(){return y},set:function(a){y=a}},defaultState:{get:function(){return D},set:function(a){D=a}},noData:{get:function(){return z},set:function(a){z=a}},tooltips:{get:function(){return o.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),o.enabled(!!b)}},tooltipContent:{get:function(){return o.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),o.contentGenerator(b)}},margin:{get:function(){return q},set:function(a){q.top=void 0!==a.top?a.top:q.top,q.right=void 0!==a.right?a.right:q.right,q.bottom=void 0!==a.bottom?a.bottom:q.bottom,q.left=void 0!==a.left?a.left:q.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b),m.color(s)}},interpolate:{get:function(){return g.interpolate()},set:function(a){g.interpolate(a),h.interpolate(a)}},xTickFormat:{get:function(){return i.tickFormat()},set:function(a){i.tickFormat(a),k.tickFormat(a)}},yTickFormat:{get:function(){return j.tickFormat()},set:function(a){j.tickFormat(a),l.tickFormat(a)}},duration:{get:function(){return B},set:function(a){B=a,j.duration(B),l.duration(B),i.duration(B),k.duration(B)}},x:{get:function(){return g.x()},set:function(a){g.x(a),h.x(a)}},y:{get:function(){return g.y()},set:function(a){g.y(a),h.y(a)}},useInteractiveGuideline:{get:function(){return w},set:function(a){w=a,w&&(g.interactive(!1),g.useVoronoi(!1))}}}),a.utils.inheritOptions(b,g),a.utils.initOptions(b),b},a.models.multiBar=function(){"use strict";function b(E){return C.reset(),E.each(function(b){var E=k-j.left-j.right,F=l-j.top-j.bottom;p=d3.select(this),a.utils.initSVG(p);var G=0;if(x&&b.length&&(x=[{values:b[0].values.map(function(a){return{x:a.x,y:0,series:a.series,size:.01}})}]),u){var H=d3.layout.stack().offset(v).values(function(a){return a.values}).y(r)(!b.length&&x?x:b);H.forEach(function(a,c){a.nonStackable?(b[c].nonStackableSeries=G++,H[c]=b[c]):c>0&&H[c-1].nonStackable&&H[c].values.map(function(a,b){a.y0-=H[c-1].values[b].y,a.y1=a.y0+a.y})}),b=H}b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),u&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a,f){if(!b[f].nonStackable){var g=a.values[c];g.size=Math.abs(g.y),g.y<0?(g.y1=e,e-=g.size):(g.y1=g.size+d,d+=g.size)}})});var I=d&&e?[]:b.map(function(a,b){return a.values.map(function(a,c){return{x:q(a,c),y:r(a,c),y0:a.y0,y1:a.y1,idx:b}})});m.domain(d||d3.merge(I).map(function(a){return a.x})).rangeBands(f||[0,E],A),n.domain(e||d3.extent(d3.merge(I).map(function(a){var c=a.y;return u&&!b[a.idx].nonStackable&&(c=a.y>0?a.y1:a.y1+a.y),c}).concat(s))).range(g||[F,0]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]+.01*n.domain()[0],n.domain()[1]-.01*n.domain()[1]]:[-1,1]),h=h||m,i=i||n;var J=p.selectAll("g.nv-wrap.nv-multibar").data([b]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-multibar"),L=K.append("defs"),M=K.append("g"),N=J.select("g");M.append("g").attr("class","nv-groups"),J.attr("transform","translate("+j.left+","+j.top+")"),L.append("clipPath").attr("id","nv-edge-clip-"+o).append("rect"),J.select("#nv-edge-clip-"+o+" rect").attr("width",E).attr("height",F),N.attr("clip-path",t?"url(#nv-edge-clip-"+o+")":"");var O=J.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});O.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);var P=C.transition(O.exit().selectAll("rect.nv-bar"),"multibarExit",Math.min(100,z)).attr("y",function(a){var c=i(0)||0;return u&&b[a.series]&&!b[a.series].nonStackable&&(c=i(a.y0)),c}).attr("height",0).remove();P.delay&&P.delay(function(a,b){var c=b*(z/(D+1))-b;return c}),O.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return w(a,b)}).style("stroke",function(a,b){return w(a,b)}),O.style("stroke-opacity",1).style("fill-opacity",.75);var Q=O.selectAll("rect.nv-bar").data(function(a){return x&&!b.length?x.values:a.values});Q.exit().remove();Q.enter().append("rect").attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("x",function(a,c,d){return u&&!b[d].nonStackable?0:d*m.rangeBand()/b.length}).attr("y",function(a,c,d){return i(u&&!b[d].nonStackable?a.y0:0)||0}).attr("height",0).attr("width",function(a,c,d){return m.rangeBand()/(u&&!b[d].nonStackable?1:b.length)}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"});Q.style("fill",function(a,b,c){return w(a,c,b)}).style("stroke",function(a,b,c){return w(a,c,b)}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),B.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),B.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){B.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){B.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){B.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),Q.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"}),y&&(c||(c=b.map(function(){return!0})),Q.style("fill",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}));var R=Q.watchTransition(C,"multibar",Math.min(250,z)).delay(function(a,c){return c*z/b[0].values.length});u?R.attr("y",function(a,c,d){var e=0;return e=b[d].nonStackable?r(a,c)<0?n(0):n(0)-n(r(a,c))<-1?n(0)-1:n(r(a,c))||0:n(a.y1)}).attr("height",function(a,c,d){return b[d].nonStackable?Math.max(Math.abs(n(r(a,c))-n(0)),1)||0:Math.max(Math.abs(n(a.y+a.y0)-n(a.y0)),1)}).attr("x",function(a,c,d){var e=0;return b[d].nonStackable&&(e=a.series*m.rangeBand()/b.length,b.length!==G&&(e=b[d].nonStackableSeries*m.rangeBand()/(2*G))),e}).attr("width",function(a,c,d){if(b[d].nonStackable){var e=m.rangeBand()/G;return b.length!==G&&(e=m.rangeBand()/(2*G)),e}return m.rangeBand()}):R.attr("x",function(a){return a.series*m.rangeBand()/b.length}).attr("width",m.rangeBand()/b.length).attr("y",function(a,b){return r(a,b)<0?n(0):n(0)-n(r(a,b))<1?n(0)-1:n(r(a,b))||0}).attr("height",function(a,b){return Math.max(Math.abs(n(r(a,b))-n(0)),1)||0}),h=m.copy(),i=n.copy(),b[0]&&b[0].values&&(D=b[0].values.length)}),C.renderEnd("multibar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=d3.scale.ordinal(),n=d3.scale.linear(),o=Math.floor(1e4*Math.random()),p=null,q=function(a){return a.x},r=function(a){return a.y},s=[0],t=!0,u=!1,v="zero",w=a.utils.defaultColor(),x=!1,y=null,z=500,A=.1,B=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),C=a.utils.renderWatch(B,z),D=0;return b.dispatch=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return s},set:function(a){s=a}},stacked:{get:function(){return u},set:function(a){u=a}},stackOffset:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return t},set:function(a){t=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return o},set:function(a){o=a}},hideable:{get:function(){return x},set:function(a){x=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return z},set:function(a){z=a,C.reset(z)}},color:{get:function(){return w},set:function(b){w=a.utils.getColor(b)}},barColor:{get:function(){return y},set:function(b){y=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarChart=function(){"use strict";function b(j){return D.reset(),D.models(e),r&&D.models(f),s&&D.models(g),j.each(function(j){var z=d3.select(this);a.utils.initSVG(z);var D=a.utils.availableWidth(l,z,k),H=a.utils.availableHeight(m,z,k);if(b.update=function(){0===C?z.call(b):z.transition().duration(C).call(b)},b.container=this,x.setter(G(j),b.update).getter(F(j)).update(),x.disabled=j.map(function(a){return!!a.disabled}),!y){var I;y={};for(I in x)y[I]=x[I]instanceof Array?x[I].slice(0):x[I]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,z),b;z.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale(); +var J=z.selectAll("g.nv-wrap.nv-multiBarWithLegend").data([j]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarWithLegend").append("g"),L=J.select("g");if(K.append("g").attr("class","nv-x nv-axis"),K.append("g").attr("class","nv-y nv-axis"),K.append("g").attr("class","nv-barsWrap"),K.append("g").attr("class","nv-legendWrap"),K.append("g").attr("class","nv-controlsWrap"),q&&(h.width(D-B()),L.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),H=a.utils.availableHeight(m,z,k)),L.select(".nv-legendWrap").attr("transform","translate("+B()+","+-k.top+")")),o){var M=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(B()).color(["#444","#444","#444"]),L.select(".nv-controlsWrap").datum(M).attr("transform","translate(0,"+-k.top+")").call(i)}J.attr("transform","translate("+k.left+","+k.top+")"),t&&L.select(".nv-y.nv-axis").attr("transform","translate("+D+",0)"),e.disabled(j.map(function(a){return a.disabled})).width(D).height(H).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var N=L.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(N.call(e),r){f.scale(c)._ticks(a.utils.calcTicksX(D/100,j)).tickSize(-H,0),L.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),L.select(".nv-x.nv-axis").call(f);var O=L.select(".nv-x.nv-axis > g").selectAll("g");if(O.selectAll("line, text").style("opacity",1),v){var P=function(a,b){return"translate("+a+","+b+")"},Q=5,R=17;O.selectAll("text").attr("transform",function(a,b,c){return P(0,c%2==0?Q:R)});var S=d3.selectAll(".nv-x.nv-axis .nv-wrap g g text")[0].length;L.selectAll(".nv-x.nv-axis .nv-axisMaxMin text").attr("transform",function(a,b){return P(0,0===b||S%2!==0?R:Q)})}u&&O.filter(function(a,b){return b%Math.ceil(j[0].values.length/(D/100))!==0}).selectAll("text, line").style("opacity",0),w&&O.selectAll(".tick text").attr("transform","rotate("+w+" 0,0)").style("text-anchor",w>0?"start":"end"),L.select(".nv-x.nv-axis").selectAll("g.nv-axisMaxMin text").style("opacity",1)}s&&(g.scale(d)._ticks(a.utils.calcTicksY(H/36,j)).tickSize(-D,0),L.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)x[c]=a[c];A.stateChange(x),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(M=M.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":case p.grouped:e.stacked(!1);break;case"Stacked":case p.stacked:e.stacked(!0)}x.stacked=e.stacked(),A.stateChange(x),b.update()}}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),x.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),x.stacked=a.stacked,E=a.stacked),b.update()})}),D.renderEnd("multibarchart immediate"),b}var c,d,e=a.models.multiBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=0,x=a.utils.state(),y=null,z=null,A=d3.dispatch("stateChange","changeState","renderEnd"),B=function(){return o?180:0},C=250;x.stacked=!1,e.stacked(!1),f.orient("bottom").tickPadding(7).showMaxMin(!1).tickFormat(function(a){return a}),g.orient(t?"right":"left").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var D=a.utils.renderWatch(A),E=!1,F=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:E}}},G=function(a){return function(b){void 0!==b.stacked&&(E=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=A,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=x,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return y},set:function(a){y=a}},noData:{get:function(){return z},set:function(a){z=a}},reduceXTicks:{get:function(){return u},set:function(a){u=a}},rotateLabels:{get:function(){return w},set:function(a){w=a}},staggerLabels:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return C},set:function(a){C=a,e.duration(C),f.duration(C),g.duration(C),D.reset(C)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiBarHorizontal=function(){"use strict";function b(m){return E.reset(),m.each(function(b){var m=k-j.left-j.right,C=l-j.top-j.bottom;n=d3.select(this),a.utils.initSVG(n),w&&(b=d3.layout.stack().offset("zero").values(function(a){return a.values}).y(r)(b)),b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),w&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a){var b=a.values[c];b.size=Math.abs(b.y),b.y<0?(b.y1=e-b.size,e-=b.size):(b.y1=d,d+=b.size)})});var F=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:q(a,b),y:r(a,b),y0:a.y0,y1:a.y1}})});o.domain(d||d3.merge(F).map(function(a){return a.x})).rangeBands(f||[0,C],A),p.domain(e||d3.extent(d3.merge(F).map(function(a){return w?a.y>0?a.y1+a.y:a.y1:a.y}).concat(t))),p.range(x&&!w?g||[p.domain()[0]<0?z:0,m-(p.domain()[1]>0?z:0)]:g||[0,m]),h=h||o,i=i||d3.scale.linear().domain(p.domain()).range([p(0),p(0)]);{var G=d3.select(this).selectAll("g.nv-wrap.nv-multibarHorizontal").data([b]),H=G.enter().append("g").attr("class","nvd3 nv-wrap nv-multibarHorizontal"),I=(H.append("defs"),H.append("g"));G.select("g")}I.append("g").attr("class","nv-groups"),G.attr("transform","translate("+j.left+","+j.top+")");var J=G.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});J.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),J.exit().watchTransition(E,"multibarhorizontal: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),J.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return u(a,b)}).style("stroke",function(a,b){return u(a,b)}),J.watchTransition(E,"multibarhorizontal: groups").style("stroke-opacity",1).style("fill-opacity",.75);var K=J.selectAll("g.nv-bar").data(function(a){return a.values});K.exit().remove();var L=K.enter().append("g").attr("transform",function(a,c,d){return"translate("+i(w?a.y0:0)+","+(w?0:d*o.rangeBand()/b.length+o(q(a,c)))+")"});L.append("rect").attr("width",0).attr("height",o.rangeBand()/(w?1:b.length)),K.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),D.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),D.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){D.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){D.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){D.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){D.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),s(b[0],0)&&(L.append("polyline"),K.select("polyline").attr("fill","none").attr("points",function(a,c){var d=s(a,c),e=.8*o.rangeBand()/(2*(w?1:b.length));d=d.length?d:[-Math.abs(d),Math.abs(d)],d=d.map(function(a){return p(a)-p(0)});var f=[[d[0],-e],[d[0],e],[d[0],0],[d[1],0],[d[1],-e],[d[1],e]];return f.map(function(a){return a.join(",")}).join(" ")}).attr("transform",function(a,c){var d=o.rangeBand()/(2*(w?1:b.length));return"translate("+(r(a,c)<0?0:p(r(a,c))-p(0))+", "+d+")"})),L.append("text"),x&&!w?(K.select("text").attr("text-anchor",function(a,b){return r(a,b)<0?"end":"start"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){var c=B(r(a,b)),d=s(a,b);return void 0===d?c:d.length?c+"+"+B(Math.abs(d[1]))+"-"+B(Math.abs(d[0])):c+"±"+B(Math.abs(d))}),K.watchTransition(E,"multibarhorizontal: bars").select("text").attr("x",function(a,b){return r(a,b)<0?-4:p(r(a,b))-p(0)+4})):K.selectAll("text").text(""),y&&!w?(L.append("text").classed("nv-bar-label",!0),K.select("text.nv-bar-label").attr("text-anchor",function(a,b){return r(a,b)<0?"start":"end"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){return q(a,b)}),K.watchTransition(E,"multibarhorizontal: bars").select("text.nv-bar-label").attr("x",function(a,b){return r(a,b)<0?p(0)-p(r(a,b))+4:-4})):K.selectAll("text.nv-bar-label").text(""),K.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}),v&&(c||(c=b.map(function(){return!0})),K.style("fill",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()})),w?K.watchTransition(E,"multibarhorizontal: bars").attr("transform",function(a,b){return"translate("+p(a.y1)+","+o(q(a,b))+")"}).select("rect").attr("width",function(a,b){return Math.abs(p(r(a,b)+a.y0)-p(a.y0))}).attr("height",o.rangeBand()):K.watchTransition(E,"multibarhorizontal: bars").attr("transform",function(a,c){return"translate("+p(r(a,c)<0?r(a,c):0)+","+(a.series*o.rangeBand()/b.length+o(q(a,c)))+")"}).select("rect").attr("height",o.rangeBand()/b.length).attr("width",function(a,b){return Math.max(Math.abs(p(r(a,b))-p(0)),1)}),h=o.copy(),i=p.copy()}),E.renderEnd("multibarHorizontal immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=null,o=d3.scale.ordinal(),p=d3.scale.linear(),q=function(a){return a.x},r=function(a){return a.y},s=function(a){return a.yErr},t=[0],u=a.utils.defaultColor(),v=null,w=!1,x=!1,y=!1,z=60,A=.1,B=d3.format(",.2f"),C=250,D=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),E=a.utils.renderWatch(D,C);return b.dispatch=D,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},yErr:{get:function(){return s},set:function(a){s=a}},xScale:{get:function(){return o},set:function(a){o=a}},yScale:{get:function(){return p},set:function(a){p=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return t},set:function(a){t=a}},stacked:{get:function(){return w},set:function(a){w=a}},showValues:{get:function(){return x},set:function(a){x=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return m},set:function(a){m=a}},valueFormat:{get:function(){return B},set:function(a){B=a}},valuePadding:{get:function(){return z},set:function(a){z=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return C},set:function(a){C=a,E.reset(C)}},color:{get:function(){return u},set:function(b){u=a.utils.getColor(b)}},barColor:{get:function(){return v},set:function(b){v=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarHorizontalChart=function(){"use strict";function b(j){return C.reset(),C.models(e),r&&C.models(f),s&&C.models(g),j.each(function(j){var w=d3.select(this);a.utils.initSVG(w);var C=a.utils.availableWidth(l,w,k),D=a.utils.availableHeight(m,w,k);if(b.update=function(){w.transition().duration(z).call(b)},b.container=this,t=e.stacked(),u.setter(B(j),b.update).getter(A(j)).update(),u.disabled=j.map(function(a){return!!a.disabled}),!v){var E;v={};for(E in u)v[E]=u[E]instanceof Array?u[E].slice(0):u[E]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,w),b;w.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var F=w.selectAll("g.nv-wrap.nv-multiBarHorizontalChart").data([j]),G=F.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarHorizontalChart").append("g"),H=F.select("g");if(G.append("g").attr("class","nv-x nv-axis"),G.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),G.append("g").attr("class","nv-barsWrap"),G.append("g").attr("class","nv-legendWrap"),G.append("g").attr("class","nv-controlsWrap"),q&&(h.width(C-y()),H.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),D=a.utils.availableHeight(m,w,k)),H.select(".nv-legendWrap").attr("transform","translate("+y()+","+-k.top+")")),o){var I=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(y()).color(["#444","#444","#444"]),H.select(".nv-controlsWrap").datum(I).attr("transform","translate(0,"+-k.top+")").call(i)}F.attr("transform","translate("+k.left+","+k.top+")"),e.disabled(j.map(function(a){return a.disabled})).width(C).height(D).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var J=H.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(J.transition().call(e),r){f.scale(c)._ticks(a.utils.calcTicksY(D/24,j)).tickSize(-C,0),H.select(".nv-x.nv-axis").call(f);var K=H.select(".nv-x.nv-axis").selectAll("g");K.selectAll("line, text")}s&&(g.scale(d)._ticks(a.utils.calcTicksX(C/100,j)).tickSize(-D,0),H.select(".nv-y.nv-axis").attr("transform","translate(0,"+D+")"),H.select(".nv-y.nv-axis").call(g)),H.select(".nv-zeroLine line").attr("x1",d(0)).attr("x2",d(0)).attr("y1",0).attr("y2",-D),h.dispatch.on("stateChange",function(a){for(var c in a)u[c]=a[c];x.stateChange(u),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(I=I.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":e.stacked(!1);break;case"Stacked":e.stacked(!0)}u.stacked=e.stacked(),x.stateChange(u),t=e.stacked(),b.update()}}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),u.stacked=a.stacked,t=a.stacked),b.update()})}),C.renderEnd("multibar horizontal chart immediate"),b}var c,d,e=a.models.multiBarHorizontal(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend().height(30),i=a.models.legend().height(30),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=a.utils.state(),v=null,w=null,x=d3.dispatch("stateChange","changeState","renderEnd"),y=function(){return o?180:0},z=250;u.stacked=!1,e.stacked(t),f.orient("left").tickPadding(5).showMaxMin(!1).tickFormat(function(a){return a}),g.orient("bottom").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var A=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:t}}},B=function(a){return function(b){void 0!==b.stacked&&(t=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},C=a.utils.renderWatch(x,z);return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=x,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=u,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return z},set:function(a){z=a,C.reset(z),e.duration(z),f.duration(z),g.duration(z)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiChart=function(){"use strict";function b(j){return j.each(function(j){function k(a){var b=2===j[a.seriesIndex].yAxis?z:y;a.value=a.point.x,a.series={value:a.point.y,color:a.point.color},B.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function l(a){var b=2===j[a.seriesIndex].yAxis?z:y;a.point.x=v.x()(a.point),a.point.y=v.y()(a.point),B.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function n(a){var b=2===j[a.data.series].yAxis?z:y;a.value=t.x()(a.data),a.series={value:t.y()(a.data),color:a.color},B.duration(0).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).hidden(!1)}var C=d3.select(this);a.utils.initSVG(C),b.update=function(){C.transition().call(b)},b.container=this;var D=a.utils.availableWidth(g,C,e),E=a.utils.availableHeight(h,C,e),F=j.filter(function(a){return"line"==a.type&&1==a.yAxis}),G=j.filter(function(a){return"line"==a.type&&2==a.yAxis}),H=j.filter(function(a){return"bar"==a.type&&1==a.yAxis}),I=j.filter(function(a){return"bar"==a.type&&2==a.yAxis}),J=j.filter(function(a){return"area"==a.type&&1==a.yAxis}),K=j.filter(function(a){return"area"==a.type&&2==a.yAxis});if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,C),b;C.selectAll(".nv-noData").remove();var L=j.filter(function(a){return!a.disabled&&1==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})}),M=j.filter(function(a){return!a.disabled&&2==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})});o.domain(d3.extent(d3.merge(L.concat(M)),function(a){return a.x})).range([0,D]);var N=C.selectAll("g.wrap.multiChart").data([j]),O=N.enter().append("g").attr("class","wrap nvd3 multiChart").append("g");O.append("g").attr("class","nv-x nv-axis"),O.append("g").attr("class","nv-y1 nv-axis"),O.append("g").attr("class","nv-y2 nv-axis"),O.append("g").attr("class","lines1Wrap"),O.append("g").attr("class","lines2Wrap"),O.append("g").attr("class","bars1Wrap"),O.append("g").attr("class","bars2Wrap"),O.append("g").attr("class","stack1Wrap"),O.append("g").attr("class","stack2Wrap"),O.append("g").attr("class","legendWrap");var P=N.select("g"),Q=j.map(function(a,b){return j[b].color||f(a,b)});if(i){var R=A.align()?D/2:D,S=A.align()?R:0;A.width(R),A.color(Q),P.select(".legendWrap").datum(j.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(1==a.yAxis?"":" (right axis)"),a})).call(A),e.top!=A.height()&&(e.top=A.height(),E=a.utils.availableHeight(h,C,e)),P.select(".legendWrap").attr("transform","translate("+S+","+-e.top+")")}r.width(D).height(E).interpolate(m).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"line"==j[b].type})),s.width(D).height(E).interpolate(m).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"line"==j[b].type})),t.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"bar"==j[b].type})),u.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"bar"==j[b].type})),v.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"area"==j[b].type})),w.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"area"==j[b].type})),P.attr("transform","translate("+e.left+","+e.top+")");var T=P.select(".lines1Wrap").datum(F.filter(function(a){return!a.disabled})),U=P.select(".bars1Wrap").datum(H.filter(function(a){return!a.disabled})),V=P.select(".stack1Wrap").datum(J.filter(function(a){return!a.disabled})),W=P.select(".lines2Wrap").datum(G.filter(function(a){return!a.disabled})),X=P.select(".bars2Wrap").datum(I.filter(function(a){return!a.disabled})),Y=P.select(".stack2Wrap").datum(K.filter(function(a){return!a.disabled})),Z=J.length?J.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[],$=K.length?K.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[];p.domain(c||d3.extent(d3.merge(L).concat(Z),function(a){return a.y})).range([0,E]),q.domain(d||d3.extent(d3.merge(M).concat($),function(a){return a.y})).range([0,E]),r.yDomain(p.domain()),t.yDomain(p.domain()),v.yDomain(p.domain()),s.yDomain(q.domain()),u.yDomain(q.domain()),w.yDomain(q.domain()),J.length&&d3.transition(V).call(v),K.length&&d3.transition(Y).call(w),H.length&&d3.transition(U).call(t),I.length&&d3.transition(X).call(u),F.length&&d3.transition(T).call(r),G.length&&d3.transition(W).call(s),x._ticks(a.utils.calcTicksX(D/100,j)).tickSize(-E,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+E+")"),d3.transition(P.select(".nv-x.nv-axis")).call(x),y._ticks(a.utils.calcTicksY(E/36,j)).tickSize(-D,0),d3.transition(P.select(".nv-y1.nv-axis")).call(y),z._ticks(a.utils.calcTicksY(E/36,j)).tickSize(-D,0),d3.transition(P.select(".nv-y2.nv-axis")).call(z),P.select(".nv-y1.nv-axis").classed("nv-disabled",L.length?!1:!0).attr("transform","translate("+o.range()[0]+",0)"),P.select(".nv-y2.nv-axis").classed("nv-disabled",M.length?!1:!0).attr("transform","translate("+o.range()[1]+",0)"),A.dispatch.on("stateChange",function(){b.update()}),r.dispatch.on("elementMouseover.tooltip",k),s.dispatch.on("elementMouseover.tooltip",k),r.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),s.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),v.dispatch.on("elementMouseover.tooltip",l),w.dispatch.on("elementMouseover.tooltip",l),v.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),w.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),t.dispatch.on("elementMouseover.tooltip",n),u.dispatch.on("elementMouseover.tooltip",n),t.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),u.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),t.dispatch.on("elementMousemove.tooltip",function(){B.position({top:d3.event.pageY,left:d3.event.pageX})()}),u.dispatch.on("elementMousemove.tooltip",function(){B.position({top:d3.event.pageY,left:d3.event.pageX})()})}),b}var c,d,e={top:30,right:20,bottom:50,left:60},f=a.utils.defaultColor(),g=null,h=null,i=!0,j=null,k=function(a){return a.x},l=function(a){return a.y},m="monotone",n=!0,o=d3.scale.linear(),p=d3.scale.linear(),q=d3.scale.linear(),r=a.models.line().yScale(p),s=a.models.line().yScale(q),t=a.models.multiBar().stacked(!1).yScale(p),u=a.models.multiBar().stacked(!1).yScale(q),v=a.models.stackedArea().yScale(p),w=a.models.stackedArea().yScale(q),x=a.models.axis().scale(o).orient("bottom").tickPadding(5),y=a.models.axis().scale(p).orient("left"),z=a.models.axis().scale(q).orient("right"),A=a.models.legend().height(30),B=a.models.tooltip(),C=d3.dispatch();return b.dispatch=C,b.lines1=r,b.lines2=s,b.bars1=t,b.bars2=u,b.stack1=v,b.stack2=w,b.xAxis=x,b.yAxis1=y,b.yAxis2=z,b.tooltip=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},showLegend:{get:function(){return i},set:function(a){i=a}},yDomain1:{get:function(){return c},set:function(a){c=a}},yDomain2:{get:function(){return d},set:function(a){d=a}},noData:{get:function(){return j},set:function(a){j=a}},interpolate:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return B.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),B.enabled(!!b)}},tooltipContent:{get:function(){return B.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),B.contentGenerator(b)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return f},set:function(b){f=a.utils.getColor(b)}},x:{get:function(){return k},set:function(a){k=a,r.x(a),s.x(a),t.x(a),u.x(a),v.x(a),w.x(a)}},y:{get:function(){return l},set:function(a){l=a,r.y(a),s.y(a),v.y(a),w.y(a),t.y(a),u.y(a)}},useVoronoi:{get:function(){return n},set:function(a){n=a,r.useVoronoi(a),s.useVoronoi(a),v.useVoronoi(a),w.useVoronoi(a)}}}),a.utils.initOptions(b),b},a.models.ohlcBar=function(){"use strict";function b(y){return y.each(function(b){k=d3.select(this);var y=a.utils.availableWidth(h,k,g),A=a.utils.availableHeight(i,k,g);a.utils.initSVG(k);var B=y/b[0].values.length*.9;l.domain(c||d3.extent(b[0].values.map(n).concat(t))),l.range(v?e||[.5*y/b[0].values.length,y*(b[0].values.length-.5)/b[0].values.length]:e||[5+B/2,y-B/2-5]),m.domain(d||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(f||[A,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var C=d3.select(this).selectAll("g.nv-wrap.nv-ohlcBar").data([b[0].values]),D=C.enter().append("g").attr("class","nvd3 nv-wrap nv-ohlcBar"),E=D.append("defs"),F=D.append("g"),G=C.select("g");F.append("g").attr("class","nv-ticks"),C.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:j})}),E.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),C.select("#nv-chart-clip-path-"+j+" rect").attr("width",y).attr("height",A),G.attr("clip-path",w?"url(#nv-chart-clip-path-"+j+")":"");var H=C.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});H.exit().remove(),H.enter().append("path").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}).attr("d",function(a,b){return"m0,0l0,"+(m(p(a,b))-m(r(a,b)))+"l"+-B/2+",0l"+B/2+",0l0,"+(m(s(a,b))-m(p(a,b)))+"l0,"+(m(q(a,b))-m(s(a,b)))+"l"+B/2+",0l"+-B/2+",0z"}).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("fill",function(){return x[0]}).attr("stroke",function(){return x[0]}).attr("x",0).attr("y",function(a,b){return m(Math.max(0,o(a,b)))}).attr("height",function(a,b){return Math.abs(m(o(a,b))-m(0))}),H.attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}),d3.transition(H).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("d",function(a,c){var d=y/b[0].values.length*.9;return"m0,0l0,"+(m(p(a,c))-m(r(a,c)))+"l"+-d/2+",0l"+d/2+",0l0,"+(m(s(a,c))-m(p(a,c)))+"l0,"+(m(q(a,c))-m(s(a,c)))+"l"+d/2+",0l"+-d/2+",0z"})}),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,c){b.clearHighlights(),k.select(".nv-ohlcBar .nv-tick-0-"+a).classed("hover",c)},b.clearHighlights=function(){k.select(".nv-ohlcBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!=a.top?a.top:g.top,g.right=void 0!=a.right?a.right:g.right,g.bottom=void 0!=a.bottom?a.bottom:g.bottom,g.left=void 0!=a.left?a.left:g.left +}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.parallelCoordinates=function(){"use strict";function b(p){return p.each(function(b){function p(a){return F(h.map(function(b){if(isNaN(a[b])||isNaN(parseFloat(a[b]))){var c=g[b].domain(),d=g[b].range(),e=c[0]-(c[1]-c[0])/9;if(J.indexOf(b)<0){var h=d3.scale.linear().domain([e,c[1]]).range([x-12,d[1]]);g[b].brush.y(h),J.push(b)}return[f(b),g[b](e)]}return J.length>0?(D.style("display","inline"),E.style("display","inline")):(D.style("display","none"),E.style("display","none")),[f(b),g[b](a[b])]}))}function q(){var a=h.filter(function(a){return!g[a].brush.empty()}),b=a.map(function(a){return g[a].brush.extent()});k=[],a.forEach(function(a,c){k[c]={dimension:a,extent:b[c]}}),l=[],M.style("display",function(c){var d=a.every(function(a,d){return isNaN(c[a])&&b[d][0]==g[a].brush.y().domain()[0]?!0:b[d][0]<=c[a]&&c[a]<=b[d][1]});return d&&l.push(c),d?null:"none"}),o.brush({filters:k,active:l})}function r(a){m[a]=this.parentNode.__origin__=f(a),L.attr("visibility","hidden")}function s(a){m[a]=Math.min(w,Math.max(0,this.parentNode.__origin__+=d3.event.x)),M.attr("d",p),h.sort(function(a,b){return u(a)-u(b)}),f.domain(h),N.attr("transform",function(a){return"translate("+u(a)+")"})}function t(a){delete this.parentNode.__origin__,delete m[a],d3.select(this.parentNode).attr("transform","translate("+f(a)+")"),M.attr("d",p),L.attr("d",p).attr("visibility",null)}function u(a){var b=m[a];return null==b?f(a):b}var v=d3.select(this),w=a.utils.availableWidth(d,v,c),x=a.utils.availableHeight(e,v,c);a.utils.initSVG(v),l=b,f.rangePoints([0,w],1).domain(h);var y={};h.forEach(function(a){var c=d3.extent(b,function(b){return+b[a]});return y[a]=!1,void 0===c[0]&&(y[a]=!0,c[0]=0,c[1]=0),c[0]===c[1]&&(c[0]=c[0]-1,c[1]=c[1]+1),g[a]=d3.scale.linear().domain(c).range([.9*(x-12),0]),g[a].brush=d3.svg.brush().y(g[a]).on("brush",q),"name"!=a});var z=v.selectAll("g.nv-wrap.nv-parallelCoordinates").data([b]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-parallelCoordinates"),B=A.append("g"),C=z.select("g");B.append("g").attr("class","nv-parallelCoordinates background"),B.append("g").attr("class","nv-parallelCoordinates foreground"),B.append("g").attr("class","nv-parallelCoordinates missingValuesline"),z.attr("transform","translate("+c.left+","+c.top+")");var D,E,F=d3.svg.line().interpolate("cardinal").tension(n),G=d3.svg.axis().orient("left"),H=d3.behavior.drag().on("dragstart",r).on("drag",s).on("dragend",t),I=f.range()[1]-f.range()[0],J=[],K=[0+I/2,x-12,w-I/2,x-12];D=z.select(".missingValuesline").selectAll("line").data([K]),D.enter().append("line"),D.exit().remove(),D.attr("x1",function(a){return a[0]}).attr("y1",function(a){return a[1]}).attr("x2",function(a){return a[2]}).attr("y2",function(a){return a[3]}),E=z.select(".missingValuesline").selectAll("text").data(["undefined values"]),E.append("text").data(["undefined values"]),E.enter().append("text"),E.exit().remove(),E.attr("y",x).attr("x",w-92-I/2).text(function(a){return a});var L=z.select(".background").selectAll("path").data(b);L.enter().append("path"),L.exit().remove(),L.attr("d",p);var M=z.select(".foreground").selectAll("path").data(b);M.enter().append("path"),M.exit().remove(),M.attr("d",p).attr("stroke",j),M.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),o.elementMouseover({label:a.name,data:a.data,index:b,pos:[d3.mouse(this.parentNode)[0],d3.mouse(this.parentNode)[1]]})}),M.on("mouseout",function(a,b){d3.select(this).classed("hover",!1),o.elementMouseout({label:a.name,data:a.data,index:b})});var N=C.selectAll(".dimension").data(h),O=N.enter().append("g").attr("class","nv-parallelCoordinates dimension");O.append("g").attr("class","nv-parallelCoordinates nv-axis"),O.append("g").attr("class","nv-parallelCoordinates-brush"),O.append("text").attr("class","nv-parallelCoordinates nv-label"),N.attr("transform",function(a){return"translate("+f(a)+",0)"}),N.exit().remove(),N.select(".nv-label").style("cursor","move").attr("dy","-1em").attr("text-anchor","middle").text(String).on("mouseover",function(a){o.elementMouseover({dim:a,pos:[d3.mouse(this.parentNode.parentNode)[0],d3.mouse(this.parentNode.parentNode)[1]]})}).on("mouseout",function(a){o.elementMouseout({dim:a})}).call(H),N.select(".nv-axis").each(function(a,b){d3.select(this).call(G.scale(g[a]).tickFormat(d3.format(i[b])))}),N.select(".nv-parallelCoordinates-brush").each(function(a){d3.select(this).call(g[a].brush)}).selectAll("rect").attr("x",-8).attr("width",16)}),b}var c={top:30,right:0,bottom:10,left:0},d=null,e=null,f=d3.scale.ordinal(),g={},h=[],i=[],j=a.utils.defaultColor(),k=[],l=[],m=[],n=1,o=d3.dispatch("brush","elementMouseover","elementMouseout");return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},dimensionNames:{get:function(){return h},set:function(a){h=a}},dimensionFormats:{get:function(){return i},set:function(a){i=a}},lineTension:{get:function(){return n},set:function(a){n=a}},dimensions:{get:function(){return h},set:function(b){a.deprecated("dimensions","use dimensionNames instead"),h=b}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.pie=function(){"use strict";function b(E){return D.reset(),E.each(function(b){function E(a,b){a.endAngle=isNaN(a.endAngle)?0:a.endAngle,a.startAngle=isNaN(a.startAngle)?0:a.startAngle,p||(a.innerRadius=0);var c=d3.interpolate(this._current,a);return this._current=c(0),function(a){return B[b](c(a))}}var F=d-c.left-c.right,G=e-c.top-c.bottom,H=Math.min(F,G)/2,I=[],J=[];if(i=d3.select(this),0===z.length)for(var K=H-H/5,L=y*H,M=0;Mc)return"";if("function"==typeof n)d=n(a,b,{key:f(a.data),value:g(a.data),percent:k(c)});else switch(n){case"key":d=f(a.data);break;case"value":d=k(g(a.data));break;case"percent":d=d3.format("%")(c)}return d})}}),D.renderEnd("pie immediate"),b}var c={top:0,right:0,bottom:0,left:0},d=500,e=500,f=function(a){return a.x},g=function(a){return a.y},h=Math.floor(1e4*Math.random()),i=null,j=a.utils.defaultColor(),k=d3.format(",.2f"),l=!0,m=!1,n="key",o=.02,p=!1,q=!1,r=!0,s=0,t=!1,u=!1,v=!1,w=!1,x=0,y=.5,z=[],A=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),B=[],C=[],D=a.utils.renderWatch(A);return b.dispatch=A,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{arcsRadius:{get:function(){return z},set:function(a){z=a}},width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},showLabels:{get:function(){return l},set:function(a){l=a}},title:{get:function(){return q},set:function(a){q=a}},titleOffset:{get:function(){return s},set:function(a){s=a}},labelThreshold:{get:function(){return o},set:function(a){o=a}},valueFormat:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return h},set:function(a){h=a}},endAngle:{get:function(){return w},set:function(a){w=a}},startAngle:{get:function(){return u},set:function(a){u=a}},padAngle:{get:function(){return v},set:function(a){v=a}},cornerRadius:{get:function(){return x},set:function(a){x=a}},donutRatio:{get:function(){return y},set:function(a){y=a}},labelsOutside:{get:function(){return m},set:function(a){m=a}},labelSunbeamLayout:{get:function(){return t},set:function(a){t=a}},donut:{get:function(){return p},set:function(a){p=a}},growOnHover:{get:function(){return r},set:function(a){r=a}},pieLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("pieLabelsOutside","use labelsOutside instead")}},donutLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("donutLabelsOutside","use labelsOutside instead")}},labelFormat:{get:function(){return k},set:function(b){k=b,a.deprecated("labelFormat","use valueFormat instead")}},margin:{get:function(){return c},set:function(a){c.top="undefined"!=typeof a.top?a.top:c.top,c.right="undefined"!=typeof a.right?a.right:c.right,c.bottom="undefined"!=typeof a.bottom?a.bottom:c.bottom,c.left="undefined"!=typeof a.left?a.left:c.left}},y:{get:function(){return g},set:function(a){g=d3.functor(a)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},labelType:{get:function(){return n},set:function(a){n=a||"key"}}}),a.utils.initOptions(b),b},a.models.pieChart=function(){"use strict";function b(e){return q.reset(),q.models(c),e.each(function(e){var k=d3.select(this);a.utils.initSVG(k);var n=a.utils.availableWidth(g,k,f),o=a.utils.availableHeight(h,k,f);if(b.update=function(){k.transition().call(b)},b.container=this,l.setter(s(e),b.update).getter(r(e)).update(),l.disabled=e.map(function(a){return!!a.disabled}),!m){var q;m={};for(q in l)m[q]=l[q]instanceof Array?l[q].slice(0):l[q]}if(!e||!e.length)return a.utils.noData(b,k),b;k.selectAll(".nv-noData").remove();var t=k.selectAll("g.nv-wrap.nv-pieChart").data([e]),u=t.enter().append("g").attr("class","nvd3 nv-wrap nv-pieChart").append("g"),v=t.select("g");if(u.append("g").attr("class","nv-pieWrap"),u.append("g").attr("class","nv-legendWrap"),i)if("top"===j)d.width(n).key(c.x()),t.select(".nv-legendWrap").datum(e).call(d),f.top!=d.height()&&(f.top=d.height(),o=a.utils.availableHeight(h,k,f)),t.select(".nv-legendWrap").attr("transform","translate(0,"+-f.top+")");else if("right"===j){var w=a.models.legend().width();w>n/2&&(w=n/2),d.height(o).key(c.x()),d.width(w),n-=d.width(),t.select(".nv-legendWrap").datum(e).call(d).attr("transform","translate("+n+",0)")}t.attr("transform","translate("+f.left+","+f.top+")"),c.width(n).height(o);var x=v.select(".nv-pieWrap").datum([e]);d3.transition(x).call(c),d.dispatch.on("stateChange",function(a){for(var c in a)l[c]=a[c];p.stateChange(l),b.update()}),p.on("changeState",function(a){"undefined"!=typeof a.disabled&&(e.forEach(function(b,c){b.disabled=a.disabled[c]}),l.disabled=a.disabled),b.update()})}),q.renderEnd("pieChart immediate"),b}var c=a.models.pie(),d=a.models.legend(),e=a.models.tooltip(),f={top:30,right:20,bottom:20,left:20},g=null,h=null,i=!0,j="top",k=a.utils.defaultColor(),l=a.utils.state(),m=null,n=null,o=250,p=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd");e.headerEnabled(!1).duration(0).valueFormatter(function(a,b){return c.valueFormat()(a,b)});var q=a.utils.renderWatch(p),r=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},s=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},e.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){e.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){e.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.legend=d,b.dispatch=p,b.pie=c,b.tooltip=e,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return i},set:function(a){i=a}},legendPosition:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return e.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),e.enabled(!!b)}},tooltipContent:{get:function(){return e.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),e.contentGenerator(b)}},color:{get:function(){return k},set:function(a){k=a,d.color(k),c.color(k)}},duration:{get:function(){return o},set:function(a){o=a,q.reset(o)}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.scatter=function(){"use strict";function b(N){return P.reset(),N.each(function(b){function N(){if(O=!1,!w)return!1;if(M===!0){var a=d3.merge(b.map(function(a,b){return a.values.map(function(a,c){var d=p(a,c),e=q(a,c);return[m(d)+1e-4*Math.random(),n(e)+1e-4*Math.random(),b,c,a]}).filter(function(a,b){return x(a[4],b)})}));if(0==a.length)return!1;a.length<3&&(a.push([m.range()[0]-20,n.range()[0]-20,null,null]),a.push([m.range()[1]+20,n.range()[1]+20,null,null]),a.push([m.range()[0]-20,n.range()[0]+20,null,null]),a.push([m.range()[1]+20,n.range()[1]-20,null,null]));var c=d3.geom.polygon([[-10,-10],[-10,i+10],[h+10,i+10],[h+10,-10]]),d=d3.geom.voronoi(a).map(function(b,d){return{data:c.clip(b),series:a[d][2],point:a[d][3]}});U.select(".nv-point-paths").selectAll("path").remove();var e=U.select(".nv-point-paths").selectAll("path").data(d),f=e.enter().append("svg:path").attr("d",function(a){return a&&a.data&&0!==a.data.length?"M"+a.data.join(",")+"Z":"M 0 0"}).attr("id",function(a,b){return"nv-path-"+b}).attr("clip-path",function(a,b){return"url(#nv-clip-"+b+")"});C&&f.style("fill",d3.rgb(230,230,230)).style("fill-opacity",.4).style("stroke-opacity",1).style("stroke",d3.rgb(200,200,200)),B&&(U.select(".nv-point-clips").selectAll("clipPath").remove(),U.select(".nv-point-clips").selectAll("clipPath").data(a).enter().append("svg:clipPath").attr("id",function(a,b){return"nv-clip-"+b}).append("svg:circle").attr("cx",function(a){return a[0]}).attr("cy",function(a){return a[1]}).attr("r",D));var k=function(a,c){if(O)return 0;var d=b[a.series];if(void 0!==d){var e=d.values[a.point];e.color=j(d,a.series),e.x=p(e),e.y=q(e);var f=l.node().getBoundingClientRect(),h=window.pageYOffset||document.documentElement.scrollTop,i=window.pageXOffset||document.documentElement.scrollLeft,k={left:m(p(e,a.point))+f.left+i+g.left+10,top:n(q(e,a.point))+f.top+h+g.top+10};c({point:e,series:d,pos:k,seriesIndex:a.series,pointIndex:a.point})}};e.on("click",function(a){k(a,L.elementClick)}).on("dblclick",function(a){k(a,L.elementDblClick)}).on("mouseover",function(a){k(a,L.elementMouseover)}).on("mouseout",function(a){k(a,L.elementMouseout)})}else U.select(".nv-groups").selectAll(".nv-group").selectAll(".nv-point").on("click",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("dblclick",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementDblClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("mouseover",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseover({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c,color:j(a,c)})}).on("mouseout",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseout({point:e,series:d,seriesIndex:a.series,pointIndex:c,color:j(a,c)})})}l=d3.select(this);var R=a.utils.availableWidth(h,l,g),S=a.utils.availableHeight(i,l,g);a.utils.initSVG(l),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var T=E&&F&&I?[]:d3.merge(b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),size:r(a,b)}})}));m.domain(E||d3.extent(T.map(function(a){return a.x}).concat(t))),m.range(y&&b[0]?G||[(R*z+R)/(2*b[0].values.length),R-R*(1+z)/(2*b[0].values.length)]:G||[0,R]),n.domain(F||d3.extent(T.map(function(a){return a.y}).concat(u))).range(H||[S,0]),o.domain(I||d3.extent(T.map(function(a){return a.size}).concat(v))).range(J||Q),K=m.domain()[0]===m.domain()[1]||n.domain()[0]===n.domain()[1],m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]-.01*n.domain()[0],n.domain()[1]+.01*n.domain()[1]]:[-1,1]),isNaN(m.domain()[0])&&m.domain([-1,1]),isNaN(n.domain()[0])&&n.domain([-1,1]),c=c||m,d=d||n,e=e||o;var U=l.selectAll("g.nv-wrap.nv-scatter").data([b]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-scatter nv-chart-"+k),W=V.append("defs"),X=V.append("g"),Y=U.select("g");U.classed("nv-single-point",K),X.append("g").attr("class","nv-groups"),X.append("g").attr("class","nv-point-paths"),V.append("g").attr("class","nv-point-clips"),U.attr("transform","translate("+g.left+","+g.top+")"),W.append("clipPath").attr("id","nv-edge-clip-"+k).append("rect"),U.select("#nv-edge-clip-"+k+" rect").attr("width",R).attr("height",S>0?S:0),Y.attr("clip-path",A?"url(#nv-edge-clip-"+k+")":""),O=!0;var Z=U.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});Z.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),Z.exit().remove(),Z.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),Z.watchTransition(P,"scatter: groups").style("fill",function(a,b){return j(a,b)}).style("stroke",function(a,b){return j(a,b)}).style("stroke-opacity",1).style("fill-opacity",.5);var $=Z.selectAll("path.nv-point").data(function(a){return a.values.map(function(a,b){return[a,b]}).filter(function(a,b){return x(a[0],b)})});$.enter().append("path").style("fill",function(a){return a.color}).style("stroke",function(a){return a.color}).attr("transform",function(a){return"translate("+c(p(a[0],a[1]))+","+d(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),$.exit().remove(),Z.exit().selectAll("path.nv-point").watchTransition(P,"scatter exit").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).remove(),$.each(function(a){d3.select(this).classed("nv-point",!0).classed("nv-point-"+a[1],!0).classed("nv-noninteractive",!w).classed("hover",!1)}),$.watchTransition(P,"scatter points").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),clearTimeout(f),f=setTimeout(N,300),c=m.copy(),d=n.copy(),e=o.copy()}),P.renderEnd("scatter immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=a.utils.defaultColor(),k=Math.floor(1e5*Math.random()),l=null,m=d3.scale.linear(),n=d3.scale.linear(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=function(a){return a.size||1},s=function(a){return a.shape||"circle"},t=[],u=[],v=[],w=!0,x=function(a){return!a.notActive},y=!1,z=.1,A=!1,B=!0,C=!1,D=function(){return 25},E=null,F=null,G=null,H=null,I=null,J=null,K=!1,L=d3.dispatch("elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),M=!0,N=250,O=!1,P=a.utils.renderWatch(L,N),Q=[16,256];return b.dispatch=L,b.options=a.utils.optionsFunc.bind(b),b._calls=new function(){this.clearHighlights=function(){return a.dom.write(function(){l.selectAll(".nv-point.hover").classed("hover",!1)}),null},this.highlightPoint=function(b,c,d){a.dom.write(function(){l.select(" .nv-series-"+b+" .nv-point-"+c).classed("hover",d)})}},L.on("elementMouseover.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!0)}),L.on("elementMouseout.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!1)}),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},pointScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return E},set:function(a){E=a}},yDomain:{get:function(){return F},set:function(a){F=a}},pointDomain:{get:function(){return I},set:function(a){I=a}},xRange:{get:function(){return G},set:function(a){G=a}},yRange:{get:function(){return H},set:function(a){H=a}},pointRange:{get:function(){return J},set:function(a){J=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},forcePoint:{get:function(){return v},set:function(a){v=a}},interactive:{get:function(){return w},set:function(a){w=a}},pointActive:{get:function(){return x},set:function(a){x=a}},padDataOuter:{get:function(){return z},set:function(a){z=a}},padData:{get:function(){return y},set:function(a){y=a}},clipEdge:{get:function(){return A},set:function(a){A=a}},clipVoronoi:{get:function(){return B},set:function(a){B=a}},clipRadius:{get:function(){return D},set:function(a){D=a}},showVoronoi:{get:function(){return C},set:function(a){C=a}},id:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return p},set:function(a){p=d3.functor(a)}},y:{get:function(){return q},set:function(a){q=d3.functor(a)}},pointSize:{get:function(){return r},set:function(a){r=d3.functor(a)}},pointShape:{get:function(){return s},set:function(a){s=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},duration:{get:function(){return N},set:function(a){N=a,P.reset(N)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},useVoronoi:{get:function(){return M},set:function(a){M=a,M===!1&&(B=!1)}}}),a.utils.initOptions(b),b},a.models.scatterChart=function(){"use strict";function b(z){return D.reset(),D.models(c),t&&D.models(d),u&&D.models(e),q&&D.models(g),r&&D.models(h),z.each(function(z){m=d3.select(this),a.utils.initSVG(m);var G=a.utils.availableWidth(k,m,j),H=a.utils.availableHeight(l,m,j);if(b.update=function(){0===A?m.call(b):m.transition().duration(A).call(b)},b.container=this,w.setter(F(z),b.update).getter(E(z)).update(),w.disabled=z.map(function(a){return!!a.disabled}),!x){var I;x={};for(I in w)x[I]=w[I]instanceof Array?w[I].slice(0):w[I]}if(!(z&&z.length&&z.filter(function(a){return a.values.length}).length))return a.utils.noData(b,m),D.renderEnd("scatter immediate"),b;m.selectAll(".nv-noData").remove(),o=c.xScale(),p=c.yScale();var J=m.selectAll("g.nv-wrap.nv-scatterChart").data([z]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-scatterChart nv-chart-"+c.id()),L=K.append("g"),M=J.select("g");if(L.append("rect").attr("class","nvd3 nv-background").style("pointer-events","none"),L.append("g").attr("class","nv-x nv-axis"),L.append("g").attr("class","nv-y nv-axis"),L.append("g").attr("class","nv-scatterWrap"),L.append("g").attr("class","nv-regressionLinesWrap"),L.append("g").attr("class","nv-distWrap"),L.append("g").attr("class","nv-legendWrap"),v&&M.select(".nv-y.nv-axis").attr("transform","translate("+G+",0)"),s){var N=G;f.width(N),J.select(".nv-legendWrap").datum(z).call(f),j.top!=f.height()&&(j.top=f.height(),H=a.utils.availableHeight(l,m,j)),J.select(".nv-legendWrap").attr("transform","translate(0,"+-j.top+")")}J.attr("transform","translate("+j.left+","+j.top+")"),c.width(G).height(H).color(z.map(function(a,b){return a.color=a.color||n(a,b),a.color}).filter(function(a,b){return!z[b].disabled})),J.select(".nv-scatterWrap").datum(z.filter(function(a){return!a.disabled})).call(c),J.select(".nv-regressionLinesWrap").attr("clip-path","url(#nv-edge-clip-"+c.id()+")");var O=J.select(".nv-regressionLinesWrap").selectAll(".nv-regLines").data(function(a){return a});O.enter().append("g").attr("class","nv-regLines");var P=O.selectAll(".nv-regLine").data(function(a){return[a]});P.enter().append("line").attr("class","nv-regLine").style("stroke-opacity",0),P.filter(function(a){return a.intercept&&a.slope}).watchTransition(D,"scatterPlusLineChart: regline").attr("x1",o.range()[0]).attr("x2",o.range()[1]).attr("y1",function(a){return p(o.domain()[0]*a.slope+a.intercept)}).attr("y2",function(a){return p(o.domain()[1]*a.slope+a.intercept)}).style("stroke",function(a,b,c){return n(a,c)}).style("stroke-opacity",function(a){return a.disabled||"undefined"==typeof a.slope||"undefined"==typeof a.intercept?0:1}),t&&(d.scale(o)._ticks(a.utils.calcTicksX(G/100,z)).tickSize(-H,0),M.select(".nv-x.nv-axis").attr("transform","translate(0,"+p.range()[0]+")").call(d)),u&&(e.scale(p)._ticks(a.utils.calcTicksY(H/36,z)).tickSize(-G,0),M.select(".nv-y.nv-axis").call(e)),q&&(g.getData(c.x()).scale(o).width(G).color(z.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionX"),M.select(".nv-distributionX").attr("transform","translate(0,"+p.range()[0]+")").datum(z.filter(function(a){return!a.disabled})).call(g)),r&&(h.getData(c.y()).scale(p).width(H).color(z.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionY"),M.select(".nv-distributionY").attr("transform","translate("+(v?G:-h.size())+",0)").datum(z.filter(function(a){return!a.disabled})).call(h)),f.dispatch.on("stateChange",function(a){for(var c in a)w[c]=a[c];y.stateChange(w),b.update()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&(z.forEach(function(b,c){b.disabled=a.disabled[c]}),w.disabled=a.disabled),b.update()}),c.dispatch.on("elementMouseout.tooltip",function(a){i.hidden(!0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",h.size())}),c.dispatch.on("elementMouseover.tooltip",function(a){m.select(".nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",a.pos.top-H-j.top),m.select(".nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",a.pos.left+g.size()-j.left),i.position(a.pos).data(a).hidden(!1)}),B=o.copy(),C=p.copy()}),D.renderEnd("scatter with line immediate"),b}var c=a.models.scatter(),d=a.models.axis(),e=a.models.axis(),f=a.models.legend(),g=a.models.distribution(),h=a.models.distribution(),i=a.models.tooltip(),j={top:30,right:20,bottom:50,left:75},k=null,l=null,m=null,n=a.utils.defaultColor(),o=c.xScale(),p=c.yScale(),q=!1,r=!1,s=!0,t=!0,u=!0,v=!1,w=a.utils.state(),x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=null,A=250;c.xScale(o).yScale(p),d.orient("bottom").tickPadding(10),e.orient(v?"right":"left").tickPadding(10),g.axis("x"),h.axis("y"),i.headerFormatter(function(a,b){return d.tickFormat()(a,b)}).valueFormatter(function(a,b){return e.tickFormat()(a,b)});var B,C,D=a.utils.renderWatch(y,A),E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return b.dispatch=y,b.scatter=c,b.legend=f,b.xAxis=d,b.yAxis=e,b.distX=g,b.distY=h,b.tooltip=i,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},container:{get:function(){return m},set:function(a){m=a}},showDistX:{get:function(){return q},set:function(a){q=a}},showDistY:{get:function(){return r},set:function(a){r=a}},showLegend:{get:function(){return s},set:function(a){s=a}},showXAxis:{get:function(){return t},set:function(a){t=a}},showYAxis:{get:function(){return u},set:function(a){u=a}},defaultState:{get:function(){return x},set:function(a){x=a}},noData:{get:function(){return z},set:function(a){z=a}},duration:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return i.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),i.enabled(!!b) +}},tooltipContent:{get:function(){return i.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),i.contentGenerator(b)}},tooltipXContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},tooltipYContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},rightAlignYAxis:{get:function(){return v},set:function(a){v=a,e.orient(a?"right":"left")}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),f.color(n),g.color(n),h.color(n)}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.sparkline=function(){"use strict";function b(k){return k.each(function(b){var k=h-g.left-g.right,q=i-g.top-g.bottom;j=d3.select(this),a.utils.initSVG(j),l.domain(c||d3.extent(b,n)).range(e||[0,k]),m.domain(d||d3.extent(b,o)).range(f||[q,0]);{var r=j.selectAll("g.nv-wrap.nv-sparkline").data([b]),s=r.enter().append("g").attr("class","nvd3 nv-wrap nv-sparkline");s.append("g"),r.select("g")}r.attr("transform","translate("+g.left+","+g.top+")");var t=r.selectAll("path").data(function(a){return[a]});t.enter().append("path"),t.exit().remove(),t.style("stroke",function(a,b){return a.color||p(a,b)}).attr("d",d3.svg.line().x(function(a,b){return l(n(a,b))}).y(function(a,b){return m(o(a,b))}));var u=r.selectAll("circle.nv-point").data(function(a){function b(b){if(-1!=b){var c=a[b];return c.pointIndex=b,c}return null}var c=a.map(function(a,b){return o(a,b)}),d=b(c.lastIndexOf(m.domain()[1])),e=b(c.indexOf(m.domain()[0])),f=b(c.length-1);return[e,d,f].filter(function(a){return null!=a})});u.enter().append("circle"),u.exit().remove(),u.attr("cx",function(a){return l(n(a,a.pointIndex))}).attr("cy",function(a){return m(o(a,a.pointIndex))}).attr("r",2).attr("class",function(a){return n(a,a.pointIndex)==l.domain()[1]?"nv-point nv-currentValue":o(a,a.pointIndex)==m.domain()[0]?"nv-point nv-minValue":"nv-point nv-maxValue"})}),b}var c,d,e,f,g={top:2,right:0,bottom:2,left:0},h=400,i=32,j=null,k=!0,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=a.utils.getColor(["#000"]);return b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},animate:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return n},set:function(a){n=d3.functor(a)}},y:{get:function(){return o},set:function(a){o=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return p},set:function(b){p=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sparklinePlus=function(){"use strict";function b(p){return p.each(function(p){function q(){if(!j){var a=z.selectAll(".nv-hoverValue").data(i),b=a.enter().append("g").attr("class","nv-hoverValue").style("stroke-opacity",0).style("fill-opacity",0);a.exit().transition().duration(250).style("stroke-opacity",0).style("fill-opacity",0).remove(),a.attr("transform",function(a){return"translate("+c(e.x()(p[a],a))+",0)"}).transition().duration(250).style("stroke-opacity",1).style("fill-opacity",1),i.length&&(b.append("line").attr("x1",0).attr("y1",-f.top).attr("x2",0).attr("y2",u),b.append("text").attr("class","nv-xValue").attr("x",-6).attr("y",-f.top).attr("text-anchor","end").attr("dy",".9em"),z.select(".nv-hoverValue .nv-xValue").text(k(e.x()(p[i[0]],i[0]))),b.append("text").attr("class","nv-yValue").attr("x",6).attr("y",-f.top).attr("text-anchor","start").attr("dy",".9em"),z.select(".nv-hoverValue .nv-yValue").text(l(e.y()(p[i[0]],i[0]))))}}function r(){function a(a,b){for(var c=Math.abs(e.x()(a[0],0)-b),d=0,f=0;fc;++c){for(b=0,d=0;bb;b++)a[b][c][1]/=d;else for(b=0;e>b;b++)a[b][c][1]=0}for(c=0;f>c;++c)g[c]=0;return g}}),u.renderEnd("stackedArea immediate"),b}var c,d,e={top:0,right:0,bottom:0,left:0},f=960,g=500,h=a.utils.defaultColor(),i=Math.floor(1e5*Math.random()),j=null,k=function(a){return a.x},l=function(a){return a.y},m="stack",n="zero",o="default",p="linear",q=!1,r=a.models.scatter(),s=250,t=d3.dispatch("areaClick","areaMouseover","areaMouseout","renderEnd","elementClick","elementMouseover","elementMouseout");r.pointSize(2.2).pointDomain([2.2,2.2]);var u=a.utils.renderWatch(t,s);return b.dispatch=t,b.scatter=r,r.dispatch.on("elementClick",function(){t.elementClick.apply(this,arguments)}),r.dispatch.on("elementMouseover",function(){t.elementMouseover.apply(this,arguments)}),r.dispatch.on("elementMouseout",function(){t.elementMouseout.apply(this,arguments)}),b.interpolate=function(a){return arguments.length?(p=a,b):p},b.duration=function(a){return arguments.length?(s=a,u.reset(s),r.duration(s),b):s},b.dispatch=t,b.scatter=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return f},set:function(a){f=a}},height:{get:function(){return g},set:function(a){g=a}},clipEdge:{get:function(){return q},set:function(a){q=a}},offset:{get:function(){return n},set:function(a){n=a}},order:{get:function(){return o},set:function(a){o=a}},interpolate:{get:function(){return p},set:function(a){p=a}},x:{get:function(){return k},set:function(a){k=d3.functor(a)}},y:{get:function(){return l},set:function(a){l=d3.functor(a)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return h},set:function(b){h=a.utils.getColor(b)}},style:{get:function(){return m},set:function(a){switch(m=a){case"stack":b.offset("zero"),b.order("default");break;case"stream":b.offset("wiggle"),b.order("inside-out");break;case"stream-center":b.offset("silhouette"),b.order("inside-out");break;case"expand":b.offset("expand"),b.order("default");break;case"stack_percent":b.offset(b.d3_stackedOffset_stackPercent),b.order("default")}}},duration:{get:function(){return s},set:function(a){s=a,u.reset(s),r.duration(s)}}}),a.utils.inheritOptions(b,r),a.utils.initOptions(b),b},a.models.stackedAreaChart=function(){"use strict";function b(k){return F.reset(),F.models(e),r&&F.models(f),s&&F.models(g),k.each(function(k){var x=d3.select(this),F=this;a.utils.initSVG(x);var K=a.utils.availableWidth(m,x,l),L=a.utils.availableHeight(n,x,l);if(b.update=function(){x.transition().duration(C).call(b)},b.container=this,v.setter(I(k),b.update).getter(H(k)).update(),v.disabled=k.map(function(a){return!!a.disabled}),!w){var M;w={};for(M in v)w[M]=v[M]instanceof Array?v[M].slice(0):v[M]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(b,x),b;x.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var N=x.selectAll("g.nv-wrap.nv-stackedAreaChart").data([k]),O=N.enter().append("g").attr("class","nvd3 nv-wrap nv-stackedAreaChart").append("g"),P=N.select("g");if(O.append("rect").style("opacity",0),O.append("g").attr("class","nv-x nv-axis"),O.append("g").attr("class","nv-y nv-axis"),O.append("g").attr("class","nv-stackedWrap"),O.append("g").attr("class","nv-legendWrap"),O.append("g").attr("class","nv-controlsWrap"),O.append("g").attr("class","nv-interactive"),P.select("rect").attr("width",K).attr("height",L),q){var Q=p?K-z:K;h.width(Q),P.select(".nv-legendWrap").datum(k).call(h),l.top!=h.height()&&(l.top=h.height(),L=a.utils.availableHeight(n,x,l)),P.select(".nv-legendWrap").attr("transform","translate("+(K-Q)+","+-l.top+")")}if(p){var R=[{key:B.stacked||"Stacked",metaKey:"Stacked",disabled:"stack"!=e.style(),style:"stack"},{key:B.stream||"Stream",metaKey:"Stream",disabled:"stream"!=e.style(),style:"stream"},{key:B.expanded||"Expanded",metaKey:"Expanded",disabled:"expand"!=e.style(),style:"expand"},{key:B.stack_percent||"Stack %",metaKey:"Stack_Percent",disabled:"stack_percent"!=e.style(),style:"stack_percent"}];z=A.length/3*260,R=R.filter(function(a){return-1!==A.indexOf(a.metaKey)}),i.width(z).color(["#444","#444","#444"]),P.select(".nv-controlsWrap").datum(R).call(i),l.top!=Math.max(i.height(),h.height())&&(l.top=Math.max(i.height(),h.height()),L=a.utils.availableHeight(n,x,l)),P.select(".nv-controlsWrap").attr("transform","translate(0,"+-l.top+")")}N.attr("transform","translate("+l.left+","+l.top+")"),t&&P.select(".nv-y.nv-axis").attr("transform","translate("+K+",0)"),u&&(j.width(K).height(L).margin({left:l.left,top:l.top}).svgContainer(x).xScale(c),N.select(".nv-interactive").call(j)),e.width(K).height(L);var S=P.select(".nv-stackedWrap").datum(k);if(S.transition().call(e),r&&(f.scale(c)._ticks(a.utils.calcTicksX(K/100,k)).tickSize(-L,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+L+")"),P.select(".nv-x.nv-axis").transition().duration(0).call(f)),s){var T;if(T="wiggle"===e.offset()?0:a.utils.calcTicksY(L/36,k),g.scale(d)._ticks(T).tickSize(-K,0),"expand"===e.style()||"stack_percent"===e.style()){var U=g.tickFormat();D&&U===J||(D=U),g.tickFormat(J)}else D&&(g.tickFormat(D),D=null);P.select(".nv-y.nv-axis").transition().duration(0).call(g)}e.dispatch.on("areaClick.toggle",function(a){k.forEach(1===k.filter(function(a){return!a.disabled}).length?function(a){a.disabled=!1}:function(b,c){b.disabled=c!=a.seriesIndex}),v.disabled=k.map(function(a){return!!a.disabled}),y.stateChange(v),b.update()}),h.dispatch.on("stateChange",function(a){for(var c in a)v[c]=a[c];y.stateChange(v),b.update()}),i.dispatch.on("legendClick",function(a){a.disabled&&(R=R.map(function(a){return a.disabled=!0,a}),a.disabled=!1,e.style(a.style),v.style=e.style(),y.stateChange(v),b.update())}),j.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,g,h,i=[];if(k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,j){g=a.interactiveBisect(f.values,c.pointXValue,b.x());var k=f.values[g],l=b.y()(k,g);if(null!=l&&e.highlightPoint(j,g,!0),"undefined"!=typeof k){"undefined"==typeof d&&(d=k),"undefined"==typeof h&&(h=b.xScale()(b.x()(k,g)));var m="expand"==e.style()?k.display.y:b.y()(k,g);i.push({key:f.key,value:m,color:o(f,f.seriesIndex),stackedValue:k.display})}}),i.reverse(),i.length>2){var m=b.yScale().invert(c.mouseY),n=null;i.forEach(function(a,b){m=Math.abs(m);var c=Math.abs(a.stackedValue.y0),d=Math.abs(a.stackedValue.y);return m>=c&&d+c>=m?void(n=b):void 0}),null!=n&&(i[n].highlight=!0)}var p=f.tickFormat()(b.x()(d,g)),q=j.tooltip.valueFormatter();"expand"===e.style()||"stack_percent"===e.style()?(E||(E=q),q=d3.format(".1%")):E&&(q=E,E=null),j.tooltip.position({left:h+l.left,top:c.mouseY+l.top}).chartContainer(F.parentNode).valueFormatter(q).data({value:p,series:i})(),j.renderGuideLine(h)}),j.dispatch.on("elementMouseout",function(){e.clearHighlights()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&k.length===a.disabled.length&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),v.disabled=a.disabled),"undefined"!=typeof a.style&&(e.style(a.style),G=a.style),b.update()})}),F.renderEnd("stacked Area chart immediate"),b}var c,d,e=a.models.stackedArea(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:25,bottom:50,left:60},m=null,n=null,o=a.utils.defaultColor(),p=!0,q=!0,r=!0,s=!0,t=!1,u=!1,v=a.utils.state(),w=null,x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=250,A=["Stacked","Stream","Expanded"],B={},C=250;v.style=e.style(),f.orient("bottom").tickPadding(7),g.orient(t?"right":"left"),k.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)}),j.tooltip.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)});var D=null,E=null;i.updateState(!1);var F=a.utils.renderWatch(y),G=e.style(),H=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),style:e.style()}}},I=function(a){return function(b){void 0!==b.style&&(G=b.style),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},J=d3.format("%");return e.dispatch.on("elementMouseover.tooltip",function(a){a.point.x=e.x()(a.point),a.point.y=e.y()(a.point),k.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),b.dispatch=y,b.stacked=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.interactiveLayer=j,b.tooltip=k,b.dispatch=y,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return w},set:function(a){w=a}},noData:{get:function(){return x},set:function(a){x=a}},showControls:{get:function(){return p},set:function(a){p=a}},controlLabels:{get:function(){return B},set:function(a){B=a}},controlOptions:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},duration:{get:function(){return C},set:function(a){C=a,F.reset(C),e.duration(C),f.duration(C),g.duration(C)}},color:{get:function(){return o},set:function(b){o=a.utils.getColor(b),h.color(o),e.color(o)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},useInteractiveGuideline:{get:function(){return u},set:function(a){u=!!a,b.interactive(!a),b.useVoronoi(!a),e.scatter.interactive(!a)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.sunburst=function(){"use strict";function b(u){return t.reset(),u.each(function(b){function t(a){a.x0=a.x,a.dx0=a.dx}function u(a){var b=d3.interpolate(p.domain(),[a.x,a.x+a.dx]),c=d3.interpolate(q.domain(),[a.y,1]),d=d3.interpolate(q.range(),[a.y?20:0,y]);return function(a,e){return e?function(){return s(a)}:function(e){return p.domain(b(e)),q.domain(c(e)).range(d(e)),s(a)}}}l=d3.select(this);var v,w=a.utils.availableWidth(g,l,f),x=a.utils.availableHeight(h,l,f),y=Math.min(w,x)/2;a.utils.initSVG(l);var z=l.selectAll(".nv-wrap.nv-sunburst").data(b),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburst nv-chart-"+k),B=A.selectAll("nv-sunburst");z.attr("transform","translate("+w/2+","+x/2+")"),l.on("click",function(a,b){o.chartClick({data:a,index:b,pos:d3.event,id:k})}),q.range([0,y]),c=c||b,e=b[0],r.value(j[i]||j.count),v=B.data(r.nodes).enter().append("path").attr("d",s).style("fill",function(a){return m((a.children?a:a.parent).name)}).style("stroke","#FFF").on("click",function(a){d!==c&&c!==a&&(d=c),c=a,v.transition().duration(n).attrTween("d",u(a))}).each(t).on("dblclick",function(a){d.parent==a&&v.transition().duration(n).attrTween("d",u(e))}).each(t).on("mouseover",function(a){d3.select(this).classed("hover",!0).style("opacity",.8),o.elementMouseover({data:a,color:d3.select(this).style("fill")})}).on("mouseout",function(a){d3.select(this).classed("hover",!1).style("opacity",1),o.elementMouseout({data:a})}).on("mousemove",function(a){o.elementMousemove({data:a})})}),t.renderEnd("sunburst immediate"),b}var c,d,e,f={top:0,right:0,bottom:0,left:0},g=null,h=null,i="count",j={count:function(){return 1},size:function(a){return a.size}},k=Math.floor(1e4*Math.random()),l=null,m=a.utils.defaultColor(),n=500,o=d3.dispatch("chartClick","elementClick","elementDblClick","elementMousemove","elementMouseover","elementMouseout","renderEnd"),p=d3.scale.linear().range([0,2*Math.PI]),q=d3.scale.sqrt(),r=d3.layout.partition().sort(null).value(function(){return 1}),s=d3.svg.arc().startAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x)))}).endAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x+a.dx)))}).innerRadius(function(a){return Math.max(0,q(a.y))}).outerRadius(function(a){return Math.max(0,q(a.y+a.dy))}),t=a.utils.renderWatch(o);return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},mode:{get:function(){return i},set:function(a){i=a}},id:{get:function(){return k},set:function(a){k=a}},duration:{get:function(){return n},set:function(a){n=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!=a.top?a.top:f.top,f.right=void 0!=a.right?a.right:f.right,f.bottom=void 0!=a.bottom?a.bottom:f.bottom,f.left=void 0!=a.left?a.left:f.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sunburstChart=function(){"use strict";function b(d){return m.reset(),m.models(c),d.each(function(d){var h=d3.select(this);a.utils.initSVG(h);var i=a.utils.availableWidth(f,h,e),j=a.utils.availableHeight(g,h,e);if(b.update=function(){0===k?h.call(b):h.transition().duration(k).call(b)},b.container=this,!d||!d.length)return a.utils.noData(b,h),b;h.selectAll(".nv-noData").remove();var l=h.selectAll("g.nv-wrap.nv-sunburstChart").data(d),m=l.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburstChart").append("g"),n=l.select("g");m.append("g").attr("class","nv-sunburstWrap"),l.attr("transform","translate("+e.left+","+e.top+")"),c.width(i).height(j);var o=n.select(".nv-sunburstWrap").datum(d);d3.transition(o).call(c)}),m.renderEnd("sunburstChart immediate"),b}var c=a.models.sunburst(),d=a.models.tooltip(),e={top:30,right:20,bottom:20,left:20},f=null,g=null,h=a.utils.defaultColor(),i=(Math.round(1e5*Math.random()),null),j=null,k=250,l=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),m=a.utils.renderWatch(l);return d.headerEnabled(!1).duration(0).valueFormatter(function(a){return a}),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.data.name,value:a.data.size,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=l,b.sunburst=c,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return i},set:function(a){i=a}},color:{get:function(){return h},set:function(a){h=a,c.color(h)}},duration:{get:function(){return k},set:function(a){k=a,m.reset(k),c.duration(k)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.version="1.8.1"}();/* + Copyright (C) Federico Zivolo 2020 + Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). + */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function i(e){return e&&e.referenceNode?e.referenceNode:e}function r(e){return 11===e?re:10===e?pe:re||pe}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),ae({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=le({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f]),E=parseFloat(w['border'+f+'Width']),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},ae(n,m,$(v)),ae(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ce.FLIP:p=[n,i];break;case ce.CLOCKWISE:p=G(n);break;case ce.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u),E=!!t.flipVariationsByContent&&(w&&'start'===r&&c||w&&'end'===r&&h||!w&&'start'===r&&u||!w&&'end'===r&&g),v=y||E;(m||b||v)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),v&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=le({},e.offsets.popper,C(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport',flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=D(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!fe),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=B('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=le({},E,e.attributes),e.styles=le({},m,e.styles),e.arrowStyles=le({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return V(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&V(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),V(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ge}); +//# sourceMappingURL=popper.min.js.map + {{lineNumber}}{{lineContent}} + + +{{lines}} + +
      + + {{name}} + {{lines_bar}} +
      {{lines_executed_percent}}
      +
      {{lines_number}}
      + {{methods_bar}} +
      {{methods_tested_percent}}
      +
      {{methods_number}}
      + {{crap}} + + -declare (strict_types=1); -/** - * This file is part of phpDocumentor. - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link http://phpdoc.org - */ -namespace PHPUnit\phpDocumentor\Reflection\Types; + + {{name}} + {{lines_bar}} +
      {{lines_executed_percent}}
      +
      {{lines_number}}
      + {{branches_bar}} +
      {{branches_executed_percent}}
      +
      {{branches_number}}
      + {{paths_bar}} +
      {{paths_executed_percent}}
      +
      {{paths_number}}
      + {{methods_bar}} +
      {{methods_tested_percent}}
      +
      {{methods_number}}
      + {{crap}} + + -use PHPUnit\phpDocumentor\Reflection\Type; -/** - * Value Object representing the 'resource' Type. - * - * @psalm-immutable - */ -final class Resource_ implements Type -{ - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'resource'; - } -} +
      +

      Paths

      +

      + Below are the source code lines that represent each code path as identified by Xdebug. Please note a path is not + necessarily coterminous with a line, a line may contain multiple paths and therefore show up more than once. + Please also be aware that some paths may include implicit rather than explicit branches, e.g. an if statement + always has an else as part of its logical flow even if you didn't write one. +

      +{{paths}} * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report; -use PHPUnit\phpDocumentor\Reflection\Type; -/** - * Value Object representing a Compound Type. - * - * A Compound Type is not so much a special keyword or object reference but is a series of Types that are separated - * using an OR operator (`|`). This combination of types signifies that whatever is associated with this compound type - * may contain a value with any of the given types. - * - * @psalm-immutable - */ -final class Compound extends AggregatedType +use function dirname; +use function file_put_contents; +use function serialize; +use function sprintf; +use PHPUnit\SebastianBergmann\CodeCoverage\CodeCoverage; +use PHPUnit\SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; +use PHPUnit\SebastianBergmann\CodeCoverage\Util\Filesystem; +final class PHP { - /** - * Initializes a compound type (i.e. `string|int`) and tests if the provided types all implement the Type interface. - * - * @param array $types - */ - public function __construct(array $types) + public function process(CodeCoverage $coverage, ?string $target = null) : string { - parent::__construct($types, '|'); + $buffer = sprintf(" * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report; -use PHPUnit\phpDocumentor\Reflection\Type; -/** - * Value object representing Integer type - * - * @psalm-immutable - */ -class Integer implements Type +use const PHP_EOL; +use function array_map; +use function date; +use function ksort; +use function max; +use function sprintf; +use function str_pad; +use function strlen; +use PHPUnit\SebastianBergmann\CodeCoverage\CodeCoverage; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\File; +use PHPUnit\SebastianBergmann\CodeCoverage\Util\Percentage; +final class Text { /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @var string */ - public function __toString() : string - { - return 'int'; - } -} -lowUpperBound = $lowUpperBound; + $this->highLowerBound = $highLowerBound; + $this->showUncoveredFiles = $showUncoveredFiles; + $this->showOnlySummary = $showOnlySummary; + } + public function process(CodeCoverage $coverage, bool $showColors = \false) : string + { + $hasBranchCoverage = !empty($coverage->getData(\true)->functionCoverage()); + $output = PHP_EOL . PHP_EOL; + $report = $coverage->getReport(); + $colors = ['header' => '', 'classes' => '', 'methods' => '', 'lines' => '', 'branches' => '', 'paths' => '', 'reset' => '', 'eol' => '']; + if ($showColors) { + $colors['classes'] = $this->coverageColor($report->numberOfTestedClassesAndTraits(), $report->numberOfClassesAndTraits()); + $colors['methods'] = $this->coverageColor($report->numberOfTestedMethods(), $report->numberOfMethods()); + $colors['lines'] = $this->coverageColor($report->numberOfExecutedLines(), $report->numberOfExecutableLines()); + $colors['branches'] = $this->coverageColor($report->numberOfExecutedBranches(), $report->numberOfExecutableBranches()); + $colors['paths'] = $this->coverageColor($report->numberOfExecutedPaths(), $report->numberOfExecutablePaths()); + $colors['reset'] = self::COLOR_RESET; + $colors['header'] = self::COLOR_HEADER; + $colors['eol'] = self::COLOR_EOL; + } + $classes = sprintf(' Classes: %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfTestedClassesAndTraits(), $report->numberOfClassesAndTraits())->asString(), $report->numberOfTestedClassesAndTraits(), $report->numberOfClassesAndTraits()); + $methods = sprintf(' Methods: %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfTestedMethods(), $report->numberOfMethods())->asString(), $report->numberOfTestedMethods(), $report->numberOfMethods()); + $paths = ''; + $branches = ''; + if ($hasBranchCoverage) { + $paths = sprintf(' Paths: %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfExecutedPaths(), $report->numberOfExecutablePaths())->asString(), $report->numberOfExecutedPaths(), $report->numberOfExecutablePaths()); + $branches = sprintf(' Branches: %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfExecutedBranches(), $report->numberOfExecutableBranches())->asString(), $report->numberOfExecutedBranches(), $report->numberOfExecutableBranches()); + } + $lines = sprintf(' Lines: %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfExecutedLines(), $report->numberOfExecutableLines())->asString(), $report->numberOfExecutedLines(), $report->numberOfExecutableLines()); + $padding = max(array_map('strlen', [$classes, $methods, $lines])); + if ($this->showOnlySummary) { + $title = 'Code Coverage Report Summary:'; + $padding = max($padding, strlen($title)); + $output .= $this->format($colors['header'], $padding, $title); + } else { + $date = date(' Y-m-d H:i:s'); + $title = 'Code Coverage Report:'; + $output .= $this->format($colors['header'], $padding, $title); + $output .= $this->format($colors['header'], $padding, $date); + $output .= $this->format($colors['header'], $padding, ''); + $output .= $this->format($colors['header'], $padding, ' Summary:'); + } + $output .= $this->format($colors['classes'], $padding, $classes); + $output .= $this->format($colors['methods'], $padding, $methods); + if ($hasBranchCoverage) { + $output .= $this->format($colors['paths'], $padding, $paths); + $output .= $this->format($colors['branches'], $padding, $branches); + } + $output .= $this->format($colors['lines'], $padding, $lines); + if ($this->showOnlySummary) { + return $output . PHP_EOL; + } + $classCoverage = []; + foreach ($report as $item) { + if (!$item instanceof File) { + continue; + } + $classes = $item->classesAndTraits(); + foreach ($classes as $className => $class) { + $classExecutableLines = 0; + $classExecutedLines = 0; + $classExecutableBranches = 0; + $classExecutedBranches = 0; + $classExecutablePaths = 0; + $classExecutedPaths = 0; + $coveredMethods = 0; + $classMethods = 0; + foreach ($class['methods'] as $method) { + if ($method['executableLines'] == 0) { + continue; + } + $classMethods++; + $classExecutableLines += $method['executableLines']; + $classExecutedLines += $method['executedLines']; + $classExecutableBranches += $method['executableBranches']; + $classExecutedBranches += $method['executedBranches']; + $classExecutablePaths += $method['executablePaths']; + $classExecutedPaths += $method['executedPaths']; + if ($method['coverage'] == 100) { + $coveredMethods++; + } + } + $classCoverage[$className] = ['namespace' => $class['namespace'], 'className' => $className, 'methodsCovered' => $coveredMethods, 'methodCount' => $classMethods, 'statementsCovered' => $classExecutedLines, 'statementCount' => $classExecutableLines, 'branchesCovered' => $classExecutedBranches, 'branchesCount' => $classExecutableBranches, 'pathsCovered' => $classExecutedPaths, 'pathsCount' => $classExecutablePaths]; + } + } + ksort($classCoverage); + $methodColor = ''; + $pathsColor = ''; + $branchesColor = ''; + $linesColor = ''; + $resetColor = ''; + foreach ($classCoverage as $fullQualifiedPath => $classInfo) { + if ($this->showUncoveredFiles || $classInfo['statementsCovered'] != 0) { + if ($showColors) { + $methodColor = $this->coverageColor($classInfo['methodsCovered'], $classInfo['methodCount']); + $pathsColor = $this->coverageColor($classInfo['pathsCovered'], $classInfo['pathsCount']); + $branchesColor = $this->coverageColor($classInfo['branchesCovered'], $classInfo['branchesCount']); + $linesColor = $this->coverageColor($classInfo['statementsCovered'], $classInfo['statementCount']); + $resetColor = $colors['reset']; + } + $output .= PHP_EOL . $fullQualifiedPath . PHP_EOL . ' ' . $methodColor . 'Methods: ' . $this->printCoverageCounts($classInfo['methodsCovered'], $classInfo['methodCount'], 2) . $resetColor . ' '; + if ($hasBranchCoverage) { + $output .= ' ' . $pathsColor . 'Paths: ' . $this->printCoverageCounts($classInfo['pathsCovered'], $classInfo['pathsCount'], 3) . $resetColor . ' ' . ' ' . $branchesColor . 'Branches: ' . $this->printCoverageCounts($classInfo['branchesCovered'], $classInfo['branchesCount'], 3) . $resetColor . ' '; + } + $output .= ' ' . $linesColor . 'Lines: ' . $this->printCoverageCounts($classInfo['statementsCovered'], $classInfo['statementCount'], 3) . $resetColor; + } + } + return $output . PHP_EOL; + } + private function coverageColor(int $numberOfCoveredElements, int $totalNumberOfElements) : string + { + $coverage = Percentage::fromFractionAndTotal($numberOfCoveredElements, $totalNumberOfElements); + if ($coverage->asFloat() >= $this->highLowerBound) { + return self::COLOR_GREEN; + } + if ($coverage->asFloat() > $this->lowUpperBound) { + return self::COLOR_YELLOW; + } + return self::COLOR_RED; + } + private function printCoverageCounts(int $numberOfCoveredElements, int $totalNumberOfElements, int $precision) : string + { + $format = '%' . $precision . 's'; + return Percentage::fromFractionAndTotal($numberOfCoveredElements, $totalNumberOfElements)->asFixedWidthString() . ' (' . sprintf($format, $numberOfCoveredElements) . '/' . sprintf($format, $totalNumberOfElements) . ')'; } -} - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Xml; -use PHPUnit\phpDocumentor\Reflection\Type; +use function constant; +use function phpversion; +use DateTimeImmutable; +use DOMElement; +use PHPUnit\SebastianBergmann\Environment\Runtime; /** - * Value Object representing the return-type 'void'. - * - * Void is generally only used when working with return types as it signifies that the method intentionally does not - * return any value. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Void_ implements Type +final class BuildInformation { /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @var DOMElement */ - public function __toString() : string + private $contextNode; + public function __construct(DOMElement $contextNode) { - return 'void'; + $this->contextNode = $contextNode; + } + public function setRuntimeInformation(Runtime $runtime) : void + { + $runtimeNode = $this->nodeByName('runtime'); + $runtimeNode->setAttribute('name', $runtime->getName()); + $runtimeNode->setAttribute('version', $runtime->getVersion()); + $runtimeNode->setAttribute('url', $runtime->getVendorUrl()); + $driverNode = $this->nodeByName('driver'); + if ($runtime->hasPHPDBGCodeCoverage()) { + $driverNode->setAttribute('name', 'phpdbg'); + $driverNode->setAttribute('version', constant('PHPDBG_VERSION')); + } + if ($runtime->hasXdebug()) { + $driverNode->setAttribute('name', 'xdebug'); + $driverNode->setAttribute('version', phpversion('xdebug')); + } + if ($runtime->hasPCOV()) { + $driverNode->setAttribute('name', 'pcov'); + $driverNode->setAttribute('version', phpversion('pcov')); + } + } + public function setBuildTime(DateTimeImmutable $date) : void + { + $this->contextNode->setAttribute('time', $date->format('D M j G:i:s T Y')); + } + public function setGeneratorVersions(string $phpUnitVersion, string $coverageVersion) : void + { + $this->contextNode->setAttribute('phpunit', $phpUnitVersion); + $this->contextNode->setAttribute('coverage', $coverageVersion); + } + private function nodeByName(string $name) : DOMElement + { + $node = $this->contextNode->getElementsByTagNameNS('https://schema.phpunit.de/coverage/1.0', $name)->item(0); + if (!$node) { + $node = $this->contextNode->appendChild($this->contextNode->ownerDocument->createElementNS('https://schema.phpunit.de/coverage/1.0', $name)); + } + return $node; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Xml; -use PHPUnit\phpDocumentor\Reflection\Type; +use DOMElement; +use PHPUnit\SebastianBergmann\CodeCoverage\ReportAlreadyFinalizedException; +use XMLWriter; /** - * Value Object representing a Boolean type. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -class Boolean implements Type +final class Coverage { /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @var XMLWriter */ - public function __toString() : string + private $writer; + /** + * @var DOMElement + */ + private $contextNode; + /** + * @var bool + */ + private $finalized = \false; + public function __construct(DOMElement $context, string $line) { - return 'bool'; + $this->contextNode = $context; + $this->writer = new XMLWriter(); + $this->writer->openMemory(); + $this->writer->startElementNS(null, $context->nodeName, 'https://schema.phpunit.de/coverage/1.0'); + $this->writer->writeAttribute('nr', $line); } -} -finalized) { + throw new ReportAlreadyFinalizedException(); + } + $this->writer->startElement('covered'); + $this->writer->writeAttribute('by', $test); + $this->writer->endElement(); } - public function __toString() : string + public function finalize() : void { - return 'array-key'; - } -} -writer->endElement(); + $fragment = $this->contextNode->ownerDocument->createDocumentFragment(); + $fragment->appendXML($this->writer->outputMemory()); + $this->contextNode->parentNode->replaceChild($fragment, $this->contextNode); + $this->finalized = \true; + } } + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Xml; + /** - * Convenience class to create a Context for DocBlocks when not using the Reflection Component of phpDocumentor. + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + */ +final class Directory extends Node +{ +} + * - * @see Context for more information. + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. */ -final class ContextFactory +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Xml; + +use const DIRECTORY_SEPARATOR; +use const PHP_EOL; +use function count; +use function dirname; +use function file_get_contents; +use function file_put_contents; +use function is_array; +use function is_dir; +use function is_file; +use function is_writable; +use function libxml_clear_errors; +use function libxml_get_errors; +use function libxml_use_internal_errors; +use function sprintf; +use function strlen; +use function substr; +use DateTimeImmutable; +use DOMDocument; +use PHPUnit\SebastianBergmann\CodeCoverage\CodeCoverage; +use PHPUnit\SebastianBergmann\CodeCoverage\Driver\PathExistsButIsNotDirectoryException; +use PHPUnit\SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\AbstractNode; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; +use PHPUnit\SebastianBergmann\CodeCoverage\Node\File as FileNode; +use PHPUnit\SebastianBergmann\CodeCoverage\Util\Filesystem as DirectoryUtil; +use PHPUnit\SebastianBergmann\CodeCoverage\Version; +use PHPUnit\SebastianBergmann\CodeCoverage\XmlException; +use PHPUnit\SebastianBergmann\Environment\Runtime; +final class Facade { - /** The literal used at the end of a use statement. */ - private const T_LITERAL_END_OF_USE = ';'; - /** The literal used between sets of use statements */ - private const T_LITERAL_USE_SEPARATOR = ','; /** - * Build a Context given a Class Reflection. - * - * @see Context for more information on Contexts. + * @var string */ - public function createFromReflector(Reflector $reflector) : Context + private $target; + /** + * @var Project + */ + private $project; + /** + * @var string + */ + private $phpUnitVersion; + public function __construct(string $version) { - if ($reflector instanceof ReflectionClass) { - //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable - /** @var ReflectionClass $reflector */ - return $this->createFromReflectionClass($reflector); - } - if ($reflector instanceof ReflectionParameter) { - return $this->createFromReflectionParameter($reflector); - } - if ($reflector instanceof ReflectionMethod) { - return $this->createFromReflectionMethod($reflector); - } - if ($reflector instanceof ReflectionProperty) { - return $this->createFromReflectionProperty($reflector); - } - if ($reflector instanceof ReflectionClassConstant) { - return $this->createFromReflectionClassConstant($reflector); - } - throw new UnexpectedValueException('Unhandled \\Reflector instance given: ' . get_class($reflector)); + $this->phpUnitVersion = $version; } - private function createFromReflectionParameter(ReflectionParameter $parameter) : Context + /** + * @throws XmlException + */ + public function process(CodeCoverage $coverage, string $target) : void { - $class = $parameter->getDeclaringClass(); - if (!$class) { - throw new InvalidArgumentException('Unable to get class of ' . $parameter->getName()); + if (substr($target, -1, 1) !== DIRECTORY_SEPARATOR) { + $target .= DIRECTORY_SEPARATOR; } - return $this->createFromReflectionClass($class); - } - private function createFromReflectionMethod(ReflectionMethod $method) : Context - { - $class = $method->getDeclaringClass(); - return $this->createFromReflectionClass($class); - } - private function createFromReflectionProperty(ReflectionProperty $property) : Context - { - $class = $property->getDeclaringClass(); - return $this->createFromReflectionClass($class); + $this->target = $target; + $this->initTargetDirectory($target); + $report = $coverage->getReport(); + $this->project = new Project($coverage->getReport()->name()); + $this->setBuildInformation(); + $this->processTests($coverage->getTests()); + $this->processDirectory($report, $this->project); + $this->saveDocument($this->project->asDom(), 'index'); } - private function createFromReflectionClassConstant(ReflectionClassConstant $constant) : Context + private function setBuildInformation() : void { - //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable - /** @phpstan-var ReflectionClass $class */ - $class = $constant->getDeclaringClass(); - return $this->createFromReflectionClass($class); + $buildNode = $this->project->buildInformation(); + $buildNode->setRuntimeInformation(new Runtime()); + $buildNode->setBuildTime(new DateTimeImmutable()); + $buildNode->setGeneratorVersions($this->phpUnitVersion, Version::id()); } /** - * @phpstan-param ReflectionClass $class + * @throws PathExistsButIsNotDirectoryException + * @throws WriteOperationFailedException */ - private function createFromReflectionClass(ReflectionClass $class) : Context + private function initTargetDirectory(string $directory) : void { - $fileName = $class->getFileName(); - $namespace = $class->getNamespaceName(); - if (is_string($fileName) && file_exists($fileName)) { - $contents = file_get_contents($fileName); - if ($contents === \false) { - throw new RuntimeException('Unable to read file "' . $fileName . '"'); + if (is_file($directory)) { + if (!is_dir($directory)) { + throw new PathExistsButIsNotDirectoryException($directory); + } + if (!is_writable($directory)) { + throw new WriteOperationFailedException($directory); } - return $this->createForNamespace($namespace, $contents); } - return new Context($namespace, []); + DirectoryUtil::createDirectory($directory); } /** - * Build a Context for a namespace in the provided file contents. - * - * @see Context for more information on Contexts. - * - * @param string $namespace It does not matter if a `\` precedes the namespace name, - * this method first normalizes. - * @param string $fileContents The file's contents to retrieve the aliases from with the given namespace. + * @throws XmlException */ - public function createForNamespace(string $namespace, string $fileContents) : Context + private function processDirectory(DirectoryNode $directory, Node $context) : void { - $namespace = trim($namespace, '\\'); - $useStatements = []; - $currentNamespace = ''; - $tokens = new ArrayIterator(token_get_all($fileContents)); - while ($tokens->valid()) { - $currentToken = $tokens->current(); - switch ($currentToken[0]) { - case \T_NAMESPACE: - $currentNamespace = $this->parseNamespace($tokens); - break; - case \T_CLASS: - // Fast-forward the iterator through the class so that any - // T_USE tokens found within are skipped - these are not - // valid namespace use statements so should be ignored. - $braceLevel = 0; - $firstBraceFound = \false; - while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { - $currentToken = $tokens->current(); - if ($currentToken === '{' || in_array($currentToken[0], [\T_CURLY_OPEN, \T_DOLLAR_OPEN_CURLY_BRACES], \true)) { - if (!$firstBraceFound) { - $firstBraceFound = \true; - } - ++$braceLevel; - } - if ($currentToken === '}') { - --$braceLevel; - } - $tokens->next(); - } - break; - case \T_USE: - if ($currentNamespace === $namespace) { - $useStatements += $this->parseUseStatement($tokens); - } - break; - } - $tokens->next(); + $directoryName = $directory->name(); + if ($this->project->projectSourceDirectory() === $directoryName) { + $directoryName = '/'; + } + $directoryObject = $context->addDirectory($directoryName); + $this->setTotals($directory, $directoryObject->totals()); + foreach ($directory->directories() as $node) { + $this->processDirectory($node, $directoryObject); + } + foreach ($directory->files() as $node) { + $this->processFile($node, $directoryObject); } - return new Context($namespace, $useStatements); } /** - * Deduce the name from tokens when we are at the T_NAMESPACE token. - * - * @param ArrayIterator $tokens + * @throws XmlException */ - private function parseNamespace(ArrayIterator $tokens) : string + private function processFile(FileNode $file, Directory $context) : void { - // skip to the first string or namespace separator - $this->skipToNextStringOrNamespaceSeparator($tokens); - $name = ''; - $acceptedTokens = [\T_STRING, \T_NS_SEPARATOR, \T_NAME_QUALIFIED]; - while ($tokens->valid() && in_array($tokens->current()[0], $acceptedTokens, \true)) { - $name .= $tokens->current()[1]; - $tokens->next(); + $fileObject = $context->addFile($file->name(), $file->id() . '.xml'); + $this->setTotals($file, $fileObject->totals()); + $path = substr($file->pathAsString(), strlen($this->project->projectSourceDirectory())); + $fileReport = new Report($path); + $this->setTotals($file, $fileReport->totals()); + foreach ($file->classesAndTraits() as $unit) { + $this->processUnit($unit, $fileReport); } - return $name; + foreach ($file->functions() as $function) { + $this->processFunction($function, $fileReport); + } + foreach ($file->lineCoverageData() as $line => $tests) { + if (!is_array($tests) || count($tests) === 0) { + continue; + } + $coverage = $fileReport->lineCoverage((string) $line); + foreach ($tests as $test) { + $coverage->addTest($test); + } + $coverage->finalize(); + } + $fileReport->source()->setSourceCode(file_get_contents($file->pathAsString())); + $this->saveDocument($fileReport->asDom(), $file->id()); } - /** - * Deduce the names of all imports when we are at the T_USE token. - * - * @param ArrayIterator $tokens - * - * @return string[] - * @psalm-return array - */ - private function parseUseStatement(ArrayIterator $tokens) : array + private function processUnit(array $unit, Report $report) : void { - $uses = []; - while ($tokens->valid()) { - $this->skipToNextStringOrNamespaceSeparator($tokens); - $uses += $this->extractUseStatements($tokens); - $currentToken = $tokens->current(); - if ($currentToken[0] === self::T_LITERAL_END_OF_USE) { - return $uses; - } + if (isset($unit['className'])) { + $unitObject = $report->classObject($unit['className']); + } else { + $unitObject = $report->traitObject($unit['traitName']); } - return $uses; + $unitObject->setLines($unit['startLine'], $unit['executableLines'], $unit['executedLines']); + $unitObject->setCrap((float) $unit['crap']); + $unitObject->setNamespace($unit['namespace']); + foreach ($unit['methods'] as $method) { + $methodObject = $unitObject->addMethod($method['methodName']); + $methodObject->setSignature($method['signature']); + $methodObject->setLines((string) $method['startLine'], (string) $method['endLine']); + $methodObject->setCrap($method['crap']); + $methodObject->setTotals((string) $method['executableLines'], (string) $method['executedLines'], (string) $method['coverage']); + } + } + private function processFunction(array $function, Report $report) : void + { + $functionObject = $report->functionObject($function['functionName']); + $functionObject->setSignature($function['signature']); + $functionObject->setLines((string) $function['startLine']); + $functionObject->setCrap($function['crap']); + $functionObject->setTotals((string) $function['executableLines'], (string) $function['executedLines'], (string) $function['coverage']); + } + private function processTests(array $tests) : void + { + $testsObject = $this->project->tests(); + foreach ($tests as $test => $result) { + $testsObject->addTest($test, $result); + } + } + private function setTotals(AbstractNode $node, Totals $totals) : void + { + $loc = $node->linesOfCode(); + $totals->setNumLines($loc['linesOfCode'], $loc['commentLinesOfCode'], $loc['nonCommentLinesOfCode'], $node->numberOfExecutableLines(), $node->numberOfExecutedLines()); + $totals->setNumClasses($node->numberOfClasses(), $node->numberOfTestedClasses()); + $totals->setNumTraits($node->numberOfTraits(), $node->numberOfTestedTraits()); + $totals->setNumMethods($node->numberOfMethods(), $node->numberOfTestedMethods()); + $totals->setNumFunctions($node->numberOfFunctions(), $node->numberOfTestedFunctions()); + } + private function targetDirectory() : string + { + return $this->target; } /** - * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. - * - * @param ArrayIterator $tokens + * @throws XmlException */ - private function skipToNextStringOrNamespaceSeparator(ArrayIterator $tokens) : void + private function saveDocument(DOMDocument $document, string $name) : void { - while ($tokens->valid()) { - $currentToken = $tokens->current(); - if (in_array($currentToken[0], [\T_STRING, \T_NS_SEPARATOR], \true)) { - break; - } - if ($currentToken[0] === \T_NAME_QUALIFIED) { - break; - } - if (defined('T_NAME_FULLY_QUALIFIED') && $currentToken[0] === \T_NAME_FULLY_QUALIFIED) { - break; - } - $tokens->next(); - } + $filename = sprintf('%s/%s.xml', $this->targetDirectory(), $name); + $document->formatOutput = \true; + $document->preserveWhiteSpace = \false; + $this->initTargetDirectory(dirname($filename)); + file_put_contents($filename, $this->documentAsString($document)); } /** - * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of - * a USE statement yet. This will return a key/value array of the alias => namespace. - * - * @param ArrayIterator $tokens - * - * @return string[] - * @psalm-return array + * @throws XmlException * - * @psalm-suppress TypeDoesNotContainType + * @see https://bugs.php.net/bug.php?id=79191 */ - private function extractUseStatements(ArrayIterator $tokens) : array + private function documentAsString(DOMDocument $document) : string { - $extractedUseStatements = []; - $groupedNs = ''; - $currentNs = ''; - $currentAlias = ''; - $state = 'start'; - while ($tokens->valid()) { - $currentToken = $tokens->current(); - $tokenId = is_string($currentToken) ? $currentToken : $currentToken[0]; - $tokenValue = is_string($currentToken) ? null : $currentToken[1]; - switch ($state) { - case 'start': - switch ($tokenId) { - case \T_STRING: - case \T_NS_SEPARATOR: - $currentNs .= (string) $tokenValue; - $currentAlias = $tokenValue; - break; - case \T_NAME_QUALIFIED: - case \T_NAME_FULLY_QUALIFIED: - $currentNs .= (string) $tokenValue; - $currentAlias = substr((string) $tokenValue, (int) strrpos((string) $tokenValue, '\\') + 1); - break; - case \T_CURLY_OPEN: - case '{': - $state = 'grouped'; - $groupedNs = $currentNs; - break; - case \T_AS: - $state = 'start-alias'; - break; - case self::T_LITERAL_USE_SEPARATOR: - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - break; - case 'start-alias': - switch ($tokenId) { - case \T_STRING: - $currentAlias = $tokenValue; - break; - case self::T_LITERAL_USE_SEPARATOR: - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - break; - case 'grouped': - switch ($tokenId) { - case \T_STRING: - case \T_NS_SEPARATOR: - $currentNs .= (string) $tokenValue; - $currentAlias = $tokenValue; - break; - case \T_AS: - $state = 'grouped-alias'; - break; - case self::T_LITERAL_USE_SEPARATOR: - $state = 'grouped'; - $extractedUseStatements[(string) $currentAlias] = $currentNs; - $currentNs = $groupedNs; - $currentAlias = ''; - break; - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - break; - case 'grouped-alias': - switch ($tokenId) { - case \T_STRING: - $currentAlias = $tokenValue; - break; - case self::T_LITERAL_USE_SEPARATOR: - $state = 'grouped'; - $extractedUseStatements[(string) $currentAlias] = $currentNs; - $currentNs = $groupedNs; - $currentAlias = ''; - break; - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - } - if ($state === 'end') { - break; + $xmlErrorHandling = libxml_use_internal_errors(\true); + $xml = $document->saveXML(); + if ($xml === \false) { + $message = 'Unable to generate the XML'; + foreach (libxml_get_errors() as $error) { + $message .= PHP_EOL . $error->message; } - $tokens->next(); - } - if ($groupedNs !== $currentNs) { - $extractedUseStatements[(string) $currentAlias] = $currentNs; + throw new XmlException($message); } - return $extractedUseStatements; + libxml_clear_errors(); + libxml_use_internal_errors($xmlErrorHandling); + return $xml; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Xml; -use PHPUnit\phpDocumentor\Reflection\Type; +use DOMDocument; +use DOMElement; /** - * Represents a list of values. This is an abstract class for Array_ and Collection. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -abstract class AbstractList implements Type +class File { - /** @var Type */ - protected $valueType; - /** @var Type|null */ - protected $keyType; - /** @var Type */ - protected $defaultKeyType; /** - * Initializes this representation of an array with the given Type. + * @var DOMDocument */ - public function __construct(?Type $valueType = null, ?Type $keyType = null) - { - if ($valueType === null) { - $valueType = new Mixed_(); - } - $this->valueType = $valueType; - $this->defaultKeyType = new Compound([new String_(), new Integer()]); - $this->keyType = $keyType; - } + private $dom; /** - * Returns the type for the keys of this array. + * @var DOMElement */ - public function getKeyType() : Type + private $contextNode; + public function __construct(DOMElement $context) { - return $this->keyType ?? $this->defaultKeyType; + $this->dom = $context->ownerDocument; + $this->contextNode = $context; } - /** - * Returns the value for the keys of this array. - */ - public function getValueType() : Type + public function totals() : Totals { - return $this->valueType; + $totalsContainer = $this->contextNode->firstChild; + if (!$totalsContainer) { + $totalsContainer = $this->contextNode->appendChild($this->dom->createElementNS('https://schema.phpunit.de/coverage/1.0', 'totals')); + } + return new Totals($totalsContainer); } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string + public function lineCoverage(string $line) : Coverage { - if ($this->keyType) { - return 'array<' . $this->keyType . ',' . $this->valueType . '>'; - } - if ($this->valueType instanceof Mixed_) { - return 'array'; - } - if ($this->valueType instanceof Compound) { - return '(' . $this->valueType . ')[]'; + $coverage = $this->contextNode->getElementsByTagNameNS('https://schema.phpunit.de/coverage/1.0', 'coverage')->item(0); + if (!$coverage) { + $coverage = $this->contextNode->appendChild($this->dom->createElementNS('https://schema.phpunit.de/coverage/1.0', 'coverage')); } - return $this->valueType . '[]'; + $lineNode = $coverage->appendChild($this->dom->createElementNS('https://schema.phpunit.de/coverage/1.0', 'line')); + return new Coverage($lineNode, $line); + } + protected function contextNode() : DOMElement + { + return $this->contextNode; + } + protected function dom() : DOMDocument + { + return $this->dom; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Xml; -use PHPUnit\phpDocumentor\Reflection\Type; +use DOMElement; /** - * Value Object representing the type 'string'. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -class String_ implements Type +final class Method { /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @var DOMElement */ - public function __toString() : string + private $contextNode; + public function __construct(DOMElement $context, string $name) { - return 'string'; + $this->contextNode = $context; + $this->setName($name); + } + public function setSignature(string $signature) : void + { + $this->contextNode->setAttribute('signature', $signature); + } + public function setLines(string $start, ?string $end = null) : void + { + $this->contextNode->setAttribute('start', $start); + if ($end !== null) { + $this->contextNode->setAttribute('end', $end); + } + } + public function setTotals(string $executable, string $executed, string $coverage) : void + { + $this->contextNode->setAttribute('executable', $executable); + $this->contextNode->setAttribute('executed', $executed); + $this->contextNode->setAttribute('coverage', $coverage); + } + public function setCrap(string $crap) : void + { + $this->contextNode->setAttribute('crap', $crap); + } + private function setName(string $name) : void + { + $this->contextNode->setAttribute('name', $name); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Xml; -use PHPUnit\phpDocumentor\Reflection\Fqsen; -use PHPUnit\phpDocumentor\Reflection\Type; +use DOMDocument; +use DOMElement; /** - * Value Object representing the type 'string'. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class ClassString implements Type +abstract class Node { - /** @var Fqsen|null */ - private $fqsen; /** - * Initializes this representation of a class string with the given Fqsen. + * @var DOMDocument */ - public function __construct(?Fqsen $fqsen = null) - { - $this->fqsen = $fqsen; - } + private $dom; /** - * Returns the FQSEN associated with this object. + * @var DOMElement */ - public function getFqsen() : ?Fqsen + private $contextNode; + public function __construct(DOMElement $context) { - return $this->fqsen; + $this->setContextNode($context); } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string + public function dom() : DOMDocument { - if ($this->fqsen === null) { - return 'class-string'; + return $this->dom; + } + public function totals() : Totals + { + $totalsContainer = $this->contextNode()->firstChild; + if (!$totalsContainer) { + $totalsContainer = $this->contextNode()->appendChild($this->dom->createElementNS('https://schema.phpunit.de/coverage/1.0', 'totals')); } - return 'class-string<' . (string) $this->fqsen . '>'; + return new Totals($totalsContainer); + } + public function addDirectory(string $name) : Directory + { + $dirNode = $this->dom()->createElementNS('https://schema.phpunit.de/coverage/1.0', 'directory'); + $dirNode->setAttribute('name', $name); + $this->contextNode()->appendChild($dirNode); + return new Directory($dirNode); + } + public function addFile(string $name, string $href) : File + { + $fileNode = $this->dom()->createElementNS('https://schema.phpunit.de/coverage/1.0', 'file'); + $fileNode->setAttribute('name', $name); + $fileNode->setAttribute('href', $href); + $this->contextNode()->appendChild($fileNode); + return new File($fileNode); + } + protected function setContextNode(DOMElement $context) : void + { + $this->dom = $context->ownerDocument; + $this->contextNode = $context; + } + protected function contextNode() : DOMElement + { + return $this->contextNode; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Xml; -use PHPUnit\phpDocumentor\Reflection\Type; +use DOMDocument; /** - * Value Object representing the 'self' type. - * - * Self, as a Type, represents the class in which the associated element was defined. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Self_ implements Type +final class Project extends Node { - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string + public function __construct(string $directory) { - return 'self'; + $this->init(); + $this->setProjectSourceDirectory($directory); + } + public function projectSourceDirectory() : string + { + return $this->contextNode()->getAttribute('source'); + } + public function buildInformation() : BuildInformation + { + $buildNode = $this->dom()->getElementsByTagNameNS('https://schema.phpunit.de/coverage/1.0', 'build')->item(0); + if (!$buildNode) { + $buildNode = $this->dom()->documentElement->appendChild($this->dom()->createElementNS('https://schema.phpunit.de/coverage/1.0', 'build')); + } + return new BuildInformation($buildNode); + } + public function tests() : Tests + { + $testsNode = $this->contextNode()->getElementsByTagNameNS('https://schema.phpunit.de/coverage/1.0', 'tests')->item(0); + if (!$testsNode) { + $testsNode = $this->contextNode()->appendChild($this->dom()->createElementNS('https://schema.phpunit.de/coverage/1.0', 'tests')); + } + return new Tests($testsNode); + } + public function asDom() : DOMDocument + { + return $this->dom(); + } + private function init() : void + { + $dom = new DOMDocument(); + $dom->loadXML(''); + $this->setContextNode($dom->getElementsByTagNameNS('https://schema.phpunit.de/coverage/1.0', 'project')->item(0)); + } + private function setProjectSourceDirectory(string $name) : void + { + $this->contextNode()->setAttribute('source', $name); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Xml; -use PHPUnit\phpDocumentor\Reflection\Type; +use function basename; +use function dirname; +use DOMDocument; /** - * Value Object representing a Float. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Float_ implements Type +final class Report extends File { - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string + public function __construct(string $name) { - return 'float'; + $dom = new DOMDocument(); + $dom->loadXML(''); + $contextNode = $dom->getElementsByTagNameNS('https://schema.phpunit.de/coverage/1.0', 'file')->item(0); + parent::__construct($contextNode); + $this->setName($name); + } + public function asDom() : DOMDocument + { + return $this->dom(); + } + public function functionObject($name) : Method + { + $node = $this->contextNode()->appendChild($this->dom()->createElementNS('https://schema.phpunit.de/coverage/1.0', 'function')); + return new Method($node, $name); + } + public function classObject($name) : Unit + { + return $this->unitObject('class', $name); + } + public function traitObject($name) : Unit + { + return $this->unitObject('trait', $name); + } + public function source() : Source + { + $source = $this->contextNode()->getElementsByTagNameNS('https://schema.phpunit.de/coverage/1.0', 'source')->item(0); + if (!$source) { + $source = $this->contextNode()->appendChild($this->dom()->createElementNS('https://schema.phpunit.de/coverage/1.0', 'source')); + } + return new Source($source); + } + private function setName(string $name) : void + { + $this->contextNode()->setAttribute('name', basename($name)); + $this->contextNode()->setAttribute('path', dirname($name)); + } + private function unitObject(string $tagName, $name) : Unit + { + $node = $this->contextNode()->appendChild($this->dom()->createElementNS('https://schema.phpunit.de/coverage/1.0', $tagName)); + return new Unit($node, $name); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Xml; -use PHPUnit\phpDocumentor\Reflection\Type; +use DOMElement; +use PHPUnit\TheSeer\Tokenizer\NamespaceUri; +use PHPUnit\TheSeer\Tokenizer\Tokenizer; +use PHPUnit\TheSeer\Tokenizer\XMLSerializer; /** - * Value Object representing the 'static' type. - * - * Self, as a Type, represents the class in which the associated element was called. This differs from self as self does - * not take inheritance into account but static means that the return type is always that of the class of the called - * element. - * - * See the documentation on late static binding in the PHP Documentation for more information on the difference between - * static and self. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Static_ implements Type +final class Source { - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string + /** @var DOMElement */ + private $context; + public function __construct(DOMElement $context) { - return 'static'; + $this->context = $context; + } + public function setSourceCode(string $source) : void + { + $context = $this->context; + $tokens = (new Tokenizer())->parse($source); + $srcDom = (new XMLSerializer(new NamespaceUri($context->namespaceURI)))->toDom($tokens); + $context->parentNode->replaceChild($context->ownerDocument->importNode($srcDom->documentElement, \true), $context); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Xml; -use function strlen; -use function substr; -use function trim; +use DOMElement; /** - * Provides information about the Context in which the DocBlock occurs that receives this context. - * - * A DocBlock does not know of its own accord in which namespace it occurs and which namespace aliases are applicable - * for the block of code in which it is in. This information is however necessary to resolve Class names in tags since - * you can provide a short form or make use of namespace aliases. - * - * The phpDocumentor Reflection component knows how to create this class but if you use the DocBlock parser from your - * own application it is possible to generate a Context class using the ContextFactory; this will analyze the file in - * which an associated class resides for its namespace and imports. - * - * @see ContextFactory::createFromClassReflector() - * @see ContextFactory::createForNamespace() - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Context +final class Tests { - /** @var string The current namespace. */ - private $namespace; - /** - * @var string[] List of namespace aliases => Fully Qualified Namespace. - * @psalm-var array - */ - private $namespaceAliases; - /** - * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) - * format (without a preceding `\`). - * - * @param string $namespace The namespace where this DocBlock resides in. - * @param string[] $namespaceAliases List of namespace aliases => Fully Qualified Namespace. - * @psalm-param array $namespaceAliases - */ - public function __construct(string $namespace, array $namespaceAliases = []) - { - $this->namespace = $namespace !== 'global' && $namespace !== 'default' ? trim($namespace, '\\') : ''; - foreach ($namespaceAliases as $alias => $fqnn) { - if ($fqnn[0] === '\\') { - $fqnn = substr($fqnn, 1); - } - if ($fqnn[strlen($fqnn) - 1] === '\\') { - $fqnn = substr($fqnn, 0, -1); - } - $namespaceAliases[$alias] = $fqnn; - } - $this->namespaceAliases = $namespaceAliases; - } - /** - * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. - */ - public function getNamespace() : string + private $contextNode; + private $codeMap = [ + -1 => 'UNKNOWN', + // PHPUnit_Runner_BaseTestRunner::STATUS_UNKNOWN + 0 => 'PASSED', + // PHPUnit_Runner_BaseTestRunner::STATUS_PASSED + 1 => 'SKIPPED', + // PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED + 2 => 'INCOMPLETE', + // PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE + 3 => 'FAILURE', + // PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE + 4 => 'ERROR', + // PHPUnit_Runner_BaseTestRunner::STATUS_ERROR + 5 => 'RISKY', + // PHPUnit_Runner_BaseTestRunner::STATUS_RISKY + 6 => 'WARNING', + ]; + public function __construct(DOMElement $context) { - return $this->namespace; + $this->contextNode = $context; } - /** - * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent - * the alias for the imported Namespace. - * - * @return string[] - * @psalm-return array - */ - public function getNamespaceAliases() : array + public function addTest(string $test, array $result) : void { - return $this->namespaceAliases; + $node = $this->contextNode->appendChild($this->contextNode->ownerDocument->createElementNS('https://schema.phpunit.de/coverage/1.0', 'test')); + $node->setAttribute('name', $test); + $node->setAttribute('size', $result['size']); + $node->setAttribute('result', (string) $result['status']); + $node->setAttribute('status', $this->codeMap[(int) $result['status']]); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Xml; +use function sprintf; +use DOMElement; +use DOMNode; +use PHPUnit\SebastianBergmann\CodeCoverage\Util\Percentage; /** - * Represents an array type as described in the PSR-5, the PHPDoc Standard. - * - * An array can be represented in two forms: - * - * 1. Untyped (`array`), where the key and value type is unknown and hence classified as 'Mixed_'. - * 2. Types (`string[]`), where the value type is provided by preceding an opening and closing square bracket with a - * type name. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Array_ extends AbstractList +final class Totals { + /** + * @var DOMNode + */ + private $container; + /** + * @var DOMElement + */ + private $linesNode; + /** + * @var DOMElement + */ + private $methodsNode; + /** + * @var DOMElement + */ + private $functionsNode; + /** + * @var DOMElement + */ + private $classesNode; + /** + * @var DOMElement + */ + private $traitsNode; + public function __construct(DOMElement $container) + { + $this->container = $container; + $dom = $container->ownerDocument; + $this->linesNode = $dom->createElementNS('https://schema.phpunit.de/coverage/1.0', 'lines'); + $this->methodsNode = $dom->createElementNS('https://schema.phpunit.de/coverage/1.0', 'methods'); + $this->functionsNode = $dom->createElementNS('https://schema.phpunit.de/coverage/1.0', 'functions'); + $this->classesNode = $dom->createElementNS('https://schema.phpunit.de/coverage/1.0', 'classes'); + $this->traitsNode = $dom->createElementNS('https://schema.phpunit.de/coverage/1.0', 'traits'); + $container->appendChild($this->linesNode); + $container->appendChild($this->methodsNode); + $container->appendChild($this->functionsNode); + $container->appendChild($this->classesNode); + $container->appendChild($this->traitsNode); + } + public function container() : DOMNode + { + return $this->container; + } + public function setNumLines(int $loc, int $cloc, int $ncloc, int $executable, int $executed) : void + { + $this->linesNode->setAttribute('total', (string) $loc); + $this->linesNode->setAttribute('comments', (string) $cloc); + $this->linesNode->setAttribute('code', (string) $ncloc); + $this->linesNode->setAttribute('executable', (string) $executable); + $this->linesNode->setAttribute('executed', (string) $executed); + $this->linesNode->setAttribute('percent', $executable === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($executed, $executable)->asFloat())); + } + public function setNumClasses(int $count, int $tested) : void + { + $this->classesNode->setAttribute('count', (string) $count); + $this->classesNode->setAttribute('tested', (string) $tested); + $this->classesNode->setAttribute('percent', $count === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($tested, $count)->asFloat())); + } + public function setNumTraits(int $count, int $tested) : void + { + $this->traitsNode->setAttribute('count', (string) $count); + $this->traitsNode->setAttribute('tested', (string) $tested); + $this->traitsNode->setAttribute('percent', $count === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($tested, $count)->asFloat())); + } + public function setNumMethods(int $count, int $tested) : void + { + $this->methodsNode->setAttribute('count', (string) $count); + $this->methodsNode->setAttribute('tested', (string) $tested); + $this->methodsNode->setAttribute('percent', $count === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($tested, $count)->asFloat())); + } + public function setNumFunctions(int $count, int $tested) : void + { + $this->functionsNode->setAttribute('count', (string) $count); + $this->functionsNode->setAttribute('tested', (string) $tested); + $this->functionsNode->setAttribute('percent', $count === 0 ? '0' : sprintf('%01.2F', Percentage::fromFractionAndTotal($tested, $count)->asFloat())); + } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Xml; -use InvalidArgumentException; -use PHPUnit\phpDocumentor\Reflection\Fqsen; -use PHPUnit\phpDocumentor\Reflection\Type; -use function strpos; +use DOMElement; /** - * Value Object representing an object. - * - * An object can be either typed or untyped. When an object is typed it means that it has an identifier, the FQSEN, - * pointing to an element in PHP. Object types that are untyped do not refer to a specific class but represent objects - * in general. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Object_ implements Type +final class Unit { - /** @var Fqsen|null */ - private $fqsen; /** - * Initializes this object with an optional FQSEN, if not provided this object is considered 'untyped'. - * - * @throws InvalidArgumentException When provided $fqsen is not a valid type. + * @var DOMElement */ - public function __construct(?Fqsen $fqsen = null) + private $contextNode; + public function __construct(DOMElement $context, string $name) { - if (strpos((string) $fqsen, '::') !== \false || strpos((string) $fqsen, '()') !== \false) { - throw new InvalidArgumentException('Object types can only refer to a class, interface or trait but a method, function, constant or ' . 'property was received: ' . (string) $fqsen); - } - $this->fqsen = $fqsen; + $this->contextNode = $context; + $this->setName($name); } - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen() : ?Fqsen + public function setLines(int $start, int $executable, int $executed) : void { - return $this->fqsen; + $this->contextNode->setAttribute('start', (string) $start); + $this->contextNode->setAttribute('executable', (string) $executable); + $this->contextNode->setAttribute('executed', (string) $executed); } - public function __toString() : string + public function setCrap(float $crap) : void { - if ($this->fqsen) { - return (string) $this->fqsen; + $this->contextNode->setAttribute('crap', (string) $crap); + } + public function setNamespace(string $namespace) : void + { + $node = $this->contextNode->getElementsByTagNameNS('https://schema.phpunit.de/coverage/1.0', 'namespace')->item(0); + if (!$node) { + $node = $this->contextNode->appendChild($this->contextNode->ownerDocument->createElementNS('https://schema.phpunit.de/coverage/1.0', 'namespace')); } - return 'object'; + $node->setAttribute('name', $namespace); + } + public function addMethod(string $name) : Method + { + $node = $this->contextNode->appendChild($this->contextNode->ownerDocument->createElementNS('https://schema.phpunit.de/coverage/1.0', 'method')); + return new Method($node, $name); + } + private function setName(string $name) : void + { + $this->contextNode->setAttribute('name', $name); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; -use PHPUnit\phpDocumentor\Reflection\Type; -/** - * Value Object representing a Callable type. - * - * @psalm-immutable - */ -final class Callable_ implements Type +use PHPUnit\SebastianBergmann\CodeCoverage\Filter; +final class CacheWarmer { - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string + public function warmCache(string $cacheDirectory, bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecatedCode, Filter $filter) : void { - return 'callable'; + $analyser = new CachingFileAnalyser($cacheDirectory, new ParsingFileAnalyser($useAnnotationsForIgnoringCode, $ignoreDeprecatedCode)); + foreach ($filter->files() as $file) { + $analyser->process($file); + } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; -use PHPUnit\phpDocumentor\Reflection\Fqsen; -use PHPUnit\phpDocumentor\Reflection\Type; +use function file_get_contents; +use function file_put_contents; +use function implode; +use function is_file; +use function md5; +use function serialize; +use PHPUnit\SebastianBergmann\CodeCoverage\Util\Filesystem; +use PHPUnit\SebastianBergmann\FileIterator\Facade as FileIteratorFacade; /** - * Represents a collection type as described in the PSR-5, the PHPDoc Standard. - * - * A collection can be represented in two forms: - * - * 1. `ACollectionObject` - * 2. `ACollectionObject` - * - * - ACollectionObject can be 'array' or an object that can act as an array - * - aValueType and aKeyType can be any type expression - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Collection extends AbstractList +final class CachingFileAnalyser implements FileAnalyser { - /** @var Fqsen|null */ - private $fqsen; /** - * Initializes this representation of an array with the given Type or Fqsen. + * @var ?string */ - public function __construct(?Fqsen $fqsen, Type $valueType, ?Type $keyType = null) + private static $cacheVersion; + /** + * @var FileAnalyser + */ + private $analyser; + /** + * @var array + */ + private $cache = []; + /** + * @var string + */ + private $directory; + public function __construct(string $directory, FileAnalyser $analyser) { - parent::__construct($valueType, $keyType); - $this->fqsen = $fqsen; + Filesystem::createDirectory($directory); + $this->analyser = $analyser; + $this->directory = $directory; + } + public function classesIn(string $filename) : array + { + if (!isset($this->cache[$filename])) { + $this->process($filename); + } + return $this->cache[$filename]['classesIn']; + } + public function traitsIn(string $filename) : array + { + if (!isset($this->cache[$filename])) { + $this->process($filename); + } + return $this->cache[$filename]['traitsIn']; + } + public function functionsIn(string $filename) : array + { + if (!isset($this->cache[$filename])) { + $this->process($filename); + } + return $this->cache[$filename]['functionsIn']; } /** - * Returns the FQSEN associated with this object. + * @psalm-return array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} */ - public function getFqsen() : ?Fqsen + public function linesOfCodeFor(string $filename) : array { - return $this->fqsen; + if (!isset($this->cache[$filename])) { + $this->process($filename); + } + return $this->cache[$filename]['linesOfCodeFor']; + } + public function executableLinesIn(string $filename) : array + { + if (!isset($this->cache[$filename])) { + $this->process($filename); + } + return $this->cache[$filename]['executableLinesIn']; + } + public function ignoredLinesFor(string $filename) : array + { + if (!isset($this->cache[$filename])) { + $this->process($filename); + } + return $this->cache[$filename]['ignoredLinesFor']; + } + public function process(string $filename) : void + { + $cache = $this->read($filename); + if ($cache !== \false) { + $this->cache[$filename] = $cache; + return; + } + $this->cache[$filename] = ['classesIn' => $this->analyser->classesIn($filename), 'traitsIn' => $this->analyser->traitsIn($filename), 'functionsIn' => $this->analyser->functionsIn($filename), 'linesOfCodeFor' => $this->analyser->linesOfCodeFor($filename), 'ignoredLinesFor' => $this->analyser->ignoredLinesFor($filename), 'executableLinesIn' => $this->analyser->executableLinesIn($filename)]; + $this->write($filename, $this->cache[$filename]); } /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @return mixed */ - public function __toString() : string + private function read(string $filename) { - $objectType = (string) ($this->fqsen ?? 'object'); - if ($this->keyType === null) { - return $objectType . '<' . $this->valueType . '>'; + $cacheFile = $this->cacheFile($filename); + if (!is_file($cacheFile)) { + return \false; } - return $objectType . '<' . $this->keyType . ',' . $this->valueType . '>'; + return \unserialize(file_get_contents($cacheFile), ['allowed_classes' => \false]); } -} -cacheFile($filename), serialize($data)); + } + private function cacheFile(string $filename) : string + { + return $this->directory . \DIRECTORY_SEPARATOR . md5($filename . "\x00" . file_get_contents($filename) . "\x00" . self::cacheVersion()); + } + private static function cacheVersion() : string + { + if (self::$cacheVersion !== null) { + return self::$cacheVersion; + } + $buffer = []; + foreach ((new FileIteratorFacade())->getFilesAsArray(__DIR__, '.php') as $file) { + $buffer[] = $file; + $buffer[] = file_get_contents($file); + } + self::$cacheVersion = md5(implode("\x00", $buffer)); + return self::$cacheVersion; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; -use PHPUnit\phpDocumentor\Reflection\Type; +use function implode; +use function rtrim; +use function trim; +use PHPUnit\PhpParser\Node; +use PHPUnit\PhpParser\Node\ComplexType; +use PHPUnit\PhpParser\Node\Identifier; +use PHPUnit\PhpParser\Node\IntersectionType; +use PHPUnit\PhpParser\Node\Name; +use PHPUnit\PhpParser\Node\NullableType; +use PHPUnit\PhpParser\Node\Stmt\Class_; +use PHPUnit\PhpParser\Node\Stmt\ClassMethod; +use PHPUnit\PhpParser\Node\Stmt\Enum_; +use PHPUnit\PhpParser\Node\Stmt\Function_; +use PHPUnit\PhpParser\Node\Stmt\Interface_; +use PHPUnit\PhpParser\Node\Stmt\Trait_; +use PHPUnit\PhpParser\Node\UnionType; +use PHPUnit\PhpParser\NodeTraverser; +use PHPUnit\PhpParser\NodeVisitorAbstract; +use PHPUnit\SebastianBergmann\Complexity\CyclomaticComplexityCalculatingVisitor; /** - * Represents an expression type as described in the PSR-5, the PHPDoc Standard. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Expression implements Type +final class CodeUnitFindingVisitor extends NodeVisitorAbstract { - /** @var Type */ - protected $valueType; /** - * Initializes this representation of an array with the given Type. + * @psalm-var array}> */ - public function __construct(Type $valueType) + private $classes = []; + /** + * @psalm-var array}> + */ + private $traits = []; + /** + * @psalm-var array + */ + private $functions = []; + public function enterNode(Node $node) : void { - $this->valueType = $valueType; + if ($node instanceof Class_) { + if ($node->isAnonymous()) { + return; + } + $this->processClass($node); + } + if ($node instanceof Trait_) { + $this->processTrait($node); + } + if (!$node instanceof ClassMethod && !$node instanceof Function_) { + return; + } + if ($node instanceof ClassMethod) { + $parentNode = $node->getAttribute('parent'); + if ($parentNode instanceof Class_ && $parentNode->isAnonymous()) { + return; + } + $this->processMethod($node); + return; + } + $this->processFunction($node); } /** - * Returns the value for the keys of this array. + * @psalm-return array}> */ - public function getValueType() : Type + public function classes() : array { - return $this->valueType; + return $this->classes; } /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @psalm-return array}> */ - public function __toString() : string + public function traits() : array { - return '(' . $this->valueType . ')'; + return $this->traits; } -} - */ - public function __toString() : string + public function functions() : array { - return 'mixed'; + return $this->functions; + } + /** + * @psalm-param ClassMethod|Function_ $node + */ + private function cyclomaticComplexity(Node $node) : int + { + \assert($node instanceof ClassMethod || $node instanceof Function_); + $nodes = $node->getStmts(); + if ($nodes === null) { + return 0; + } + $traverser = new NodeTraverser(); + $cyclomaticComplexityCalculatingVisitor = new CyclomaticComplexityCalculatingVisitor(); + $traverser->addVisitor($cyclomaticComplexityCalculatingVisitor); + /* @noinspection UnusedFunctionResultInspection */ + $traverser->traverse($nodes); + return $cyclomaticComplexityCalculatingVisitor->cyclomaticComplexity(); + } + /** + * @psalm-param ClassMethod|Function_ $node + */ + private function signature(Node $node) : string + { + \assert($node instanceof ClassMethod || $node instanceof Function_); + $signature = ($node->returnsByRef() ? '&' : '') . $node->name->toString() . '('; + $parameters = []; + foreach ($node->getParams() as $parameter) { + \assert(isset($parameter->var->name)); + $parameterAsString = ''; + if ($parameter->type !== null) { + $parameterAsString = $this->type($parameter->type) . ' '; + } + $parameterAsString .= '$' . $parameter->var->name; + /* @todo Handle default values */ + $parameters[] = $parameterAsString; + } + $signature .= implode(', ', $parameters) . ')'; + $returnType = $node->getReturnType(); + if ($returnType !== null) { + $signature .= ': ' . $this->type($returnType); + } + return $signature; + } + /** + * @psalm-param Identifier|Name|ComplexType $type + */ + private function type(Node $type) : string + { + \assert($type instanceof Identifier || $type instanceof Name || $type instanceof ComplexType); + if ($type instanceof NullableType) { + return '?' . $type->type; + } + if ($type instanceof UnionType || $type instanceof IntersectionType) { + return $this->unionOrIntersectionAsString($type); + } + return $type->toString(); + } + private function visibility(ClassMethod $node) : string + { + if ($node->isPrivate()) { + return 'private'; + } + if ($node->isProtected()) { + return 'protected'; + } + return 'public'; + } + private function processClass(Class_ $node) : void + { + $name = $node->name->toString(); + $namespacedName = $node->namespacedName->toString(); + $this->classes[$namespacedName] = ['name' => $name, 'namespacedName' => $namespacedName, 'namespace' => $this->namespace($namespacedName, $name), 'startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine(), 'methods' => []]; + } + private function processTrait(Trait_ $node) : void + { + $name = $node->name->toString(); + $namespacedName = $node->namespacedName->toString(); + $this->traits[$namespacedName] = ['name' => $name, 'namespacedName' => $namespacedName, 'namespace' => $this->namespace($namespacedName, $name), 'startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine(), 'methods' => []]; + } + private function processMethod(ClassMethod $node) : void + { + $parentNode = $node->getAttribute('parent'); + if ($parentNode instanceof Interface_) { + return; + } + \assert($parentNode instanceof Class_ || $parentNode instanceof Trait_ || $parentNode instanceof Enum_); + \assert(isset($parentNode->name)); + \assert(isset($parentNode->namespacedName)); + \assert($parentNode->namespacedName instanceof Name); + $parentName = $parentNode->name->toString(); + $parentNamespacedName = $parentNode->namespacedName->toString(); + if ($parentNode instanceof Class_) { + $storage =& $this->classes; + } else { + $storage =& $this->traits; + } + if (!isset($storage[$parentNamespacedName])) { + $storage[$parentNamespacedName] = ['name' => $parentName, 'namespacedName' => $parentNamespacedName, 'namespace' => $this->namespace($parentNamespacedName, $parentName), 'startLine' => $parentNode->getStartLine(), 'endLine' => $parentNode->getEndLine(), 'methods' => []]; + } + $storage[$parentNamespacedName]['methods'][$node->name->toString()] = ['methodName' => $node->name->toString(), 'signature' => $this->signature($node), 'visibility' => $this->visibility($node), 'startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine(), 'ccn' => $this->cyclomaticComplexity($node)]; + } + private function processFunction(Function_ $node) : void + { + \assert(isset($node->name)); + \assert(isset($node->namespacedName)); + \assert($node->namespacedName instanceof Name); + $name = $node->name->toString(); + $namespacedName = $node->namespacedName->toString(); + $this->functions[$namespacedName] = ['name' => $name, 'namespacedName' => $namespacedName, 'namespace' => $this->namespace($namespacedName, $name), 'signature' => $this->signature($node), 'startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine(), 'ccn' => $this->cyclomaticComplexity($node)]; + } + private function namespace(string $namespacedName, string $name) : string + { + return trim(rtrim($namespacedName, $name), '\\'); + } + /** + * @psalm-param UnionType|IntersectionType $type + */ + private function unionOrIntersectionAsString(ComplexType $type) : string + { + if ($type instanceof UnionType) { + $separator = '|'; + } else { + $separator = '&'; + } + $types = []; + foreach ($type->types as $_type) { + if ($_type instanceof Name) { + $types[] = $_type->toCodeString(); + } else { + $types[] = $_type->toString(); + } + } + return implode($separator, $types); } } * - * @link http://phpdoc.org + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. */ -declare (strict_types=1); -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; -use ArrayIterator; -use IteratorAggregate; -use PHPUnit\phpDocumentor\Reflection\Type; -use function array_key_exists; -use function implode; -/** - * Base class for aggregated types like Compound and Intersection - * - * A Aggregated Type is not so much a special keyword or object reference but is a series of Types that are separated - * using separator. - * - * @psalm-immutable - * @template-implements IteratorAggregate +use PHPUnit\PhpParser\Node; +use PHPUnit\PhpParser\Node\Expr\Array_; +use PHPUnit\PhpParser\Node\Expr\ArrayDimFetch; +use PHPUnit\PhpParser\Node\Expr\ArrayItem; +use PHPUnit\PhpParser\Node\Expr\Assign; +use PHPUnit\PhpParser\Node\Expr\BinaryOp; +use PHPUnit\PhpParser\Node\Expr\CallLike; +use PHPUnit\PhpParser\Node\Expr\Cast; +use PHPUnit\PhpParser\Node\Expr\Closure; +use PHPUnit\PhpParser\Node\Expr\Match_; +use PHPUnit\PhpParser\Node\Expr\MethodCall; +use PHPUnit\PhpParser\Node\Expr\NullsafePropertyFetch; +use PHPUnit\PhpParser\Node\Expr\PropertyFetch; +use PHPUnit\PhpParser\Node\Expr\StaticPropertyFetch; +use PHPUnit\PhpParser\Node\Expr\Ternary; +use PHPUnit\PhpParser\Node\MatchArm; +use PHPUnit\PhpParser\Node\Scalar\Encapsed; +use PHPUnit\PhpParser\Node\Stmt\Break_; +use PHPUnit\PhpParser\Node\Stmt\Case_; +use PHPUnit\PhpParser\Node\Stmt\Catch_; +use PHPUnit\PhpParser\Node\Stmt\Class_; +use PHPUnit\PhpParser\Node\Stmt\ClassMethod; +use PHPUnit\PhpParser\Node\Stmt\Continue_; +use PHPUnit\PhpParser\Node\Stmt\Do_; +use PHPUnit\PhpParser\Node\Stmt\Echo_; +use PHPUnit\PhpParser\Node\Stmt\Else_; +use PHPUnit\PhpParser\Node\Stmt\ElseIf_; +use PHPUnit\PhpParser\Node\Stmt\Expression; +use PHPUnit\PhpParser\Node\Stmt\Finally_; +use PHPUnit\PhpParser\Node\Stmt\For_; +use PHPUnit\PhpParser\Node\Stmt\Foreach_; +use PHPUnit\PhpParser\Node\Stmt\Goto_; +use PHPUnit\PhpParser\Node\Stmt\If_; +use PHPUnit\PhpParser\Node\Stmt\Property; +use PHPUnit\PhpParser\Node\Stmt\Return_; +use PHPUnit\PhpParser\Node\Stmt\Switch_; +use PHPUnit\PhpParser\Node\Stmt\Throw_; +use PHPUnit\PhpParser\Node\Stmt\TryCatch; +use PHPUnit\PhpParser\Node\Stmt\Unset_; +use PHPUnit\PhpParser\Node\Stmt\While_; +use PHPUnit\PhpParser\NodeVisitorAbstract; +/** + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -abstract class AggregatedType implements Type, IteratorAggregate +final class ExecutableLinesFindingVisitor extends NodeVisitorAbstract { /** - * @psalm-allow-private-mutation - * @var array + * @psalm-var array */ - private $types = []; - /** @var string */ - private $token; + private $executableLines = []; /** - * @param array $types + * @psalm-var array */ - public function __construct(array $types, string $token) - { - foreach ($types as $type) { - $this->add($type); - } - $this->token = $token; - } + private $propertyLines = []; /** - * Returns the type at the given index. + * @psalm-var array */ - public function get(int $index) : ?Type + private $returns = []; + public function enterNode(Node $node) : void { - if (!$this->has($index)) { - return null; + $this->savePropertyLines($node); + if (!$this->isExecutable($node)) { + return; + } + foreach ($this->getLines($node) as $line) { + if (isset($this->propertyLines[$line])) { + return; + } + $this->executableLines[$line] = $line; } - return $this->types[$index]; } /** - * Tests if this compound type has a type with the given index. + * @psalm-return array */ - public function has(int $index) : bool + public function executableLines() : array { - return array_key_exists($index, $this->types); + $this->computeReturns(); + \sort($this->executableLines); + return $this->executableLines; } - /** - * Tests if this compound type contains the given type. - */ - public function contains(Type $type) : bool + private function savePropertyLines(Node $node) : void { - foreach ($this->types as $typePart) { - // if the type is duplicate; do not add it - if ((string) $typePart === (string) $type) { - return \true; - } + if (!$node instanceof Property && !$node instanceof Node\Stmt\ClassConst) { + return; + } + foreach (\range($node->getStartLine(), $node->getEndLine()) as $index) { + $this->propertyLines[$index] = $index; } - return \false; - } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return implode($this->token, $this->types); } - /** - * @return ArrayIterator - */ - public function getIterator() : ArrayIterator + private function computeReturns() : void { - return new ArrayIterator($this->types); + foreach ($this->returns as $return) { + foreach (\range($return->getStartLine(), $return->getEndLine()) as $loc) { + if (isset($this->executableLines[$loc])) { + continue 2; + } + } + $line = $return->getEndLine(); + if ($return->expr !== null) { + $line = $return->expr->getStartLine(); + } + $this->executableLines[$line] = $line; + } } /** - * @psalm-suppress ImpureMethodCall + * @return int[] */ - private function add(Type $type) : void + private function getLines(Node $node) : array { - if ($type instanceof self) { - foreach ($type->getIterator() as $subType) { - $this->add($subType); + if ($node instanceof BinaryOp) { + if (($node->left instanceof Node\Scalar || $node->left instanceof Node\Expr\ConstFetch) && ($node->right instanceof Node\Scalar || $node->right instanceof Node\Expr\ConstFetch)) { + return [$node->right->getStartLine()]; } - return; + return []; } - // if the type is duplicate; do not add it - if ($this->contains($type)) { - return; + if ($node instanceof Cast || $node instanceof PropertyFetch || $node instanceof NullsafePropertyFetch || $node instanceof StaticPropertyFetch) { + return [$node->getEndLine()]; } - $this->types[] = $type; + if ($node instanceof ArrayDimFetch) { + if (null === $node->dim) { + return []; + } + return [$node->dim->getStartLine()]; + } + if ($node instanceof Array_) { + $startLine = $node->getStartLine(); + if (isset($this->executableLines[$startLine])) { + return []; + } + if ([] === $node->items) { + return [$node->getEndLine()]; + } + if ($node->items[0] instanceof ArrayItem) { + return [$node->items[0]->getStartLine()]; + } + } + if ($node instanceof ClassMethod) { + if ($node->name->name !== '__construct') { + return []; + } + $existsAPromotedProperty = \false; + foreach ($node->getParams() as $param) { + if (0 !== ($param->flags & Class_::VISIBILITY_MODIFIER_MASK)) { + $existsAPromotedProperty = \true; + break; + } + } + if ($existsAPromotedProperty) { + // Only the line with `function` keyword should be listed here + // but `nikic/php-parser` doesn't provide a way to fetch it + return \range($node->getStartLine(), $node->name->getEndLine()); + } + return []; + } + if ($node instanceof MethodCall) { + return [$node->name->getStartLine()]; + } + if ($node instanceof Ternary) { + $lines = [$node->cond->getStartLine()]; + if (null !== $node->if) { + $lines[] = $node->if->getStartLine(); + } + $lines[] = $node->else->getStartLine(); + return $lines; + } + if ($node instanceof Match_) { + return [$node->cond->getStartLine()]; + } + if ($node instanceof MatchArm) { + return [$node->body->getStartLine()]; + } + if ($node instanceof Expression && ($node->expr instanceof Cast || $node->expr instanceof Match_ || $node->expr instanceof MethodCall)) { + return []; + } + if ($node instanceof Return_) { + $this->returns[] = $node; + return []; + } + return [$node->getStartLine()]; + } + private function isExecutable(Node $node) : bool + { + return $node instanceof Assign || $node instanceof ArrayDimFetch || $node instanceof Array_ || $node instanceof BinaryOp || $node instanceof Break_ || $node instanceof CallLike || $node instanceof Case_ || $node instanceof Cast || $node instanceof Catch_ || $node instanceof ClassMethod || $node instanceof Closure || $node instanceof Continue_ || $node instanceof Do_ || $node instanceof Echo_ || $node instanceof ElseIf_ || $node instanceof Else_ || $node instanceof Encapsed || $node instanceof Expression || $node instanceof Finally_ || $node instanceof For_ || $node instanceof Foreach_ || $node instanceof Goto_ || $node instanceof If_ || $node instanceof Match_ || $node instanceof MatchArm || $node instanceof MethodCall || $node instanceof NullsafePropertyFetch || $node instanceof PropertyFetch || $node instanceof Return_ || $node instanceof StaticPropertyFetch || $node instanceof Switch_ || $node instanceof Ternary || $node instanceof Throw_ || $node instanceof TryCatch || $node instanceof Unset_ || $node instanceof While_; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; /** - * Value Object representing iterable type - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Iterable_ extends AbstractList +interface FileAnalyser { + public function classesIn(string $filename) : array; + public function traitsIn(string $filename) : array; + public function functionsIn(string $filename) : array; /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @psalm-return array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} */ - public function __toString() : string - { - if ($this->keyType) { - return 'iterable<' . $this->keyType . ',' . $this->valueType . '>'; - } - if ($this->valueType instanceof Mixed_) { - return 'iterable'; - } - return 'iterable<' . $this->valueType . '>'; - } + public function linesOfCodeFor(string $filename) : array; + public function executableLinesIn(string $filename) : array; + public function ignoredLinesFor(string $filename) : array; } * - * @link http://phpdoc.org + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. */ -declare (strict_types=1); -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; -use PHPUnit\phpDocumentor\Reflection\Type; +use function array_merge; +use function assert; +use function range; +use function strpos; +use PHPUnit\PhpParser\Node; +use PHPUnit\PhpParser\Node\Attribute; +use PHPUnit\PhpParser\Node\Stmt\Class_; +use PHPUnit\PhpParser\Node\Stmt\ClassMethod; +use PHPUnit\PhpParser\Node\Stmt\Function_; +use PHPUnit\PhpParser\Node\Stmt\Interface_; +use PHPUnit\PhpParser\Node\Stmt\Trait_; +use PHPUnit\PhpParser\NodeVisitorAbstract; /** - * Value Object representing a Compound Type. - * - * A Intersection Type is not so much a special keyword or object reference but is a series of Types that are separated - * using an AND operator (`&`). This combination of types signifies that whatever is associated with this Intersection - * type may contain a value with any of the given types. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Intersection extends AggregatedType +final class IgnoredLinesFindingVisitor extends NodeVisitorAbstract { /** - * Initializes a intersection type (i.e. `\A&\B`) and tests if the provided types all implement the Type interface. - * - * @param array $types + * @psalm-var list */ - public function __construct(array $types) + private $ignoredLines = []; + /** + * @var bool + */ + private $useAnnotationsForIgnoringCode; + /** + * @var bool + */ + private $ignoreDeprecated; + public function __construct(bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecated) { - parent::__construct($types, '&'); + $this->useAnnotationsForIgnoringCode = $useAnnotationsForIgnoringCode; + $this->ignoreDeprecated = $ignoreDeprecated; + } + public function enterNode(Node $node) : void + { + if (!$node instanceof Class_ && !$node instanceof Trait_ && !$node instanceof Interface_ && !$node instanceof ClassMethod && !$node instanceof Function_ && !$node instanceof Attribute) { + return; + } + if ($node instanceof Class_ && $node->isAnonymous()) { + return; + } + if ($node instanceof Class_ || $node instanceof Trait_ || $node instanceof Interface_ || $node instanceof Attribute) { + $this->ignoredLines[] = $node->getStartLine(); + assert($node->name !== null); + // Workaround for https://github.com/nikic/PHP-Parser/issues/886 + $this->ignoredLines[] = $node->name->getStartLine(); + } + if (!$this->useAnnotationsForIgnoringCode) { + return; + } + if ($node instanceof Interface_) { + return; + } + $this->processDocComment($node); } -} - */ - public function __toString() : string + public function ignoredLines() : array { - return '$this'; + return $this->ignoredLines; + } + private function processDocComment(Node $node) : void + { + $docComment = $node->getDocComment(); + if ($docComment === null) { + return; + } + if (strpos($docComment->getText(), '@codeCoverageIgnore') !== \false) { + $this->ignoredLines = array_merge($this->ignoredLines, range($node->getStartLine(), $node->getEndLine())); + } + if ($this->ignoreDeprecated && strpos($docComment->getText(), '@deprecated') !== \false) { + $this->ignoredLines = array_merge($this->ignoredLines, range($node->getStartLine(), $node->getEndLine())); + } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; -use PHPUnit\phpDocumentor\Reflection\Type; +use function array_unique; +use function assert; +use function file_get_contents; +use function is_array; +use function max; +use function sprintf; +use function substr_count; +use function token_get_all; +use function trim; +use PHPUnit\PhpParser\Error; +use PHPUnit\PhpParser\Lexer; +use PHPUnit\PhpParser\NodeTraverser; +use PHPUnit\PhpParser\NodeVisitor\NameResolver; +use PHPUnit\PhpParser\NodeVisitor\ParentConnectingVisitor; +use PHPUnit\PhpParser\ParserFactory; +use PHPUnit\SebastianBergmann\CodeCoverage\ParserException; +use PHPUnit\SebastianBergmann\LinesOfCode\LineCountingVisitor; /** - * Value Object representing a nullable type. The real type is wrapped. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class Nullable implements Type +final class ParsingFileAnalyser implements FileAnalyser { - /** @var Type The actual type that is wrapped */ - private $realType; /** - * Initialises this nullable type using the real type embedded + * @var array */ - public function __construct(Type $realType) + private $classes = []; + /** + * @var array + */ + private $traits = []; + /** + * @var array + */ + private $functions = []; + /** + * @var array + */ + private $linesOfCode = []; + /** + * @var array + */ + private $ignoredLines = []; + /** + * @var array + */ + private $executableLines = []; + /** + * @var bool + */ + private $useAnnotationsForIgnoringCode; + /** + * @var bool + */ + private $ignoreDeprecatedCode; + public function __construct(bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecatedCode) { - $this->realType = $realType; + $this->useAnnotationsForIgnoringCode = $useAnnotationsForIgnoringCode; + $this->ignoreDeprecatedCode = $ignoreDeprecatedCode; + } + public function classesIn(string $filename) : array + { + $this->analyse($filename); + return $this->classes[$filename]; + } + public function traitsIn(string $filename) : array + { + $this->analyse($filename); + return $this->traits[$filename]; + } + public function functionsIn(string $filename) : array + { + $this->analyse($filename); + return $this->functions[$filename]; } /** - * Provide access to the actual type directly, if needed. + * @psalm-return array{linesOfCode: int, commentLinesOfCode: int, nonCommentLinesOfCode: int} */ - public function getActualType() : Type + public function linesOfCodeFor(string $filename) : array { - return $this->realType; + $this->analyse($filename); + return $this->linesOfCode[$filename]; + } + public function executableLinesIn(string $filename) : array + { + $this->analyse($filename); + return $this->executableLines[$filename]; + } + public function ignoredLinesFor(string $filename) : array + { + $this->analyse($filename); + return $this->ignoredLines[$filename]; } /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @throws ParserException */ - public function __toString() : string + private function analyse(string $filename) : void { - return '?' . $this->realType->__toString(); + if (isset($this->classes[$filename])) { + return; + } + $source = file_get_contents($filename); + $linesOfCode = max(substr_count($source, "\n") + 1, substr_count($source, "\r") + 1); + if ($linesOfCode === 0 && !empty($source)) { + $linesOfCode = 1; + } + $parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7, new Lexer()); + try { + $nodes = $parser->parse($source); + assert($nodes !== null); + $traverser = new NodeTraverser(); + $codeUnitFindingVisitor = new CodeUnitFindingVisitor(); + $lineCountingVisitor = new LineCountingVisitor($linesOfCode); + $ignoredLinesFindingVisitor = new IgnoredLinesFindingVisitor($this->useAnnotationsForIgnoringCode, $this->ignoreDeprecatedCode); + $executableLinesFindingVisitor = new ExecutableLinesFindingVisitor(); + $traverser->addVisitor(new NameResolver()); + $traverser->addVisitor(new ParentConnectingVisitor()); + $traverser->addVisitor($codeUnitFindingVisitor); + $traverser->addVisitor($lineCountingVisitor); + $traverser->addVisitor($ignoredLinesFindingVisitor); + $traverser->addVisitor($executableLinesFindingVisitor); + /* @noinspection UnusedFunctionResultInspection */ + $traverser->traverse($nodes); + // @codeCoverageIgnoreStart + } catch (Error $error) { + throw new ParserException(sprintf('Cannot parse %s: %s', $filename, $error->getMessage()), (int) $error->getCode(), $error); + } + // @codeCoverageIgnoreEnd + $this->classes[$filename] = $codeUnitFindingVisitor->classes(); + $this->traits[$filename] = $codeUnitFindingVisitor->traits(); + $this->functions[$filename] = $codeUnitFindingVisitor->functions(); + $this->executableLines[$filename] = $executableLinesFindingVisitor->executableLines(); + $this->ignoredLines[$filename] = []; + $this->findLinesIgnoredByLineBasedAnnotations($filename, $source, $this->useAnnotationsForIgnoringCode); + $this->ignoredLines[$filename] = array_unique(\array_merge($this->ignoredLines[$filename], $ignoredLinesFindingVisitor->ignoredLines())); + \sort($this->ignoredLines[$filename]); + $result = $lineCountingVisitor->result(); + $this->linesOfCode[$filename] = ['linesOfCode' => $result->linesOfCode(), 'commentLinesOfCode' => $result->commentLinesOfCode(), 'nonCommentLinesOfCode' => $result->nonCommentLinesOfCode()]; + } + private function findLinesIgnoredByLineBasedAnnotations(string $filename, string $source, bool $useAnnotationsForIgnoringCode) : void + { + $ignore = \false; + $stop = \false; + foreach (token_get_all($source) as $token) { + if (!is_array($token)) { + continue; + } + switch ($token[0]) { + case \T_COMMENT: + case \T_DOC_COMMENT: + if (!$useAnnotationsForIgnoringCode) { + break; + } + $comment = trim($token[1]); + if ($comment === '// @codeCoverageIgnore' || $comment === '//@codeCoverageIgnore') { + $ignore = \true; + $stop = \true; + } elseif ($comment === '// @codeCoverageIgnoreStart' || $comment === '//@codeCoverageIgnoreStart') { + $ignore = \true; + } elseif ($comment === '// @codeCoverageIgnoreEnd' || $comment === '//@codeCoverageIgnoreEnd') { + $stop = \true; + } + break; + } + if ($ignore) { + $this->ignoredLines[$filename][] = $token[2]; + if ($stop) { + $ignore = \false; + $stop = \false; + } + } + } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\Types; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Util; -use PHPUnit\phpDocumentor\Reflection\Fqsen; -use PHPUnit\phpDocumentor\Reflection\Type; +use function is_dir; +use function mkdir; +use function sprintf; /** - * Value Object representing the type 'string'. - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -final class InterfaceString implements Type +final class Filesystem { - /** @var Fqsen|null */ - private $fqsen; - /** - * Initializes this representation of a class string with the given Fqsen. - */ - public function __construct(?Fqsen $fqsen = null) - { - $this->fqsen = $fqsen; - } - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen() : ?Fqsen - { - return $this->fqsen; - } /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @throws DirectoryCouldNotBeCreatedException */ - public function __toString() : string + public static function createDirectory(string $directory) : void { - if ($this->fqsen === null) { - return 'interface-string'; + $success = !(!is_dir($directory) && !@mkdir($directory, 0777, \true) && !is_dir($directory)); + if (!$success) { + throw new DirectoryCouldNotBeCreatedException(sprintf('Directory "%s" could not be created', $directory)); } - return 'interface-string<' . (string) $this->fqsen . '>'; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection; +namespace PHPUnit\SebastianBergmann\CodeCoverage\Util; -use InvalidArgumentException; -use PHPUnit\phpDocumentor\Reflection\Types\Context; -use function explode; -use function implode; -use function strpos; +use function sprintf; /** - * Resolver for Fqsen using Context information - * - * @psalm-immutable + * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ -class FqsenResolver +final class Percentage { - /** @var string Definition of the NAMESPACE operator in PHP */ - private const OPERATOR_NAMESPACE = '\\'; - public function resolve(string $fqsen, ?Context $context = null) : Fqsen + /** + * @var float + */ + private $fraction; + /** + * @var float + */ + private $total; + public static function fromFractionAndTotal(float $fraction, float $total) : self { - if ($context === null) { - $context = new Context(''); - } - if ($this->isFqsen($fqsen)) { - return new Fqsen($fqsen); + return new self($fraction, $total); + } + private function __construct(float $fraction, float $total) + { + $this->fraction = $fraction; + $this->total = $total; + } + public function asFloat() : float + { + if ($this->total > 0) { + return $this->fraction / $this->total * 100; } - return $this->resolvePartialStructuralElementName($fqsen, $context); + return 100.0; } - /** - * Tests whether the given type is a Fully Qualified Structural Element Name. - */ - private function isFqsen(string $type) : bool + public function asString() : string { - return strpos($type, self::OPERATOR_NAMESPACE) === 0; + if ($this->total > 0) { + return sprintf('%01.2F%%', $this->asFloat()); + } + return ''; } - /** - * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation - * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. - * - * @throws InvalidArgumentException When type is not a valid FQSEN. - */ - private function resolvePartialStructuralElementName(string $type, Context $context) : Fqsen + public function asFixedWidthString() : string { - $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); - $namespaceAliases = $context->getNamespaceAliases(); - // if the first segment is not an alias; prepend namespace name and return - if (!isset($namespaceAliases[$typeParts[0]])) { - $namespace = $context->getNamespace(); - if ($namespace !== '') { - $namespace .= self::OPERATOR_NAMESPACE; - } - return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type); + if ($this->total > 0) { + return sprintf('%6.2F%%', $this->asFloat()); } - $typeParts[0] = $namespaceAliases[$typeParts[0]]; - return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts)); + return ''; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; +namespace PHPUnit\SebastianBergmann\CodeCoverage; -use PHPUnit\phpDocumentor\Reflection\PseudoType; -use PHPUnit\phpDocumentor\Reflection\Type; -use PHPUnit\phpDocumentor\Reflection\Types\String_; -/** - * Value Object representing the type 'string'. - * - * @psalm-immutable - */ -final class HtmlEscapedString extends String_ implements PseudoType +use function dirname; +use PHPUnit\SebastianBergmann\Version as VersionId; +final class Version { - public function underlyingType() : Type - { - return new String_(); - } /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @var string */ - public function __toString() : string + private static $version; + public static function id() : string { - return 'html-escaped-string'; + if (self::$version === null) { + self::$version = (new VersionId('9.2.18', dirname(__DIR__)))->getVersion(); + } + return self::$version; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link https://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; +namespace PHPUnit\SebastianBergmann\FileIterator; -use PHPUnit\phpDocumentor\Reflection\PseudoType; -use PHPUnit\phpDocumentor\Reflection\Type; -use PHPUnit\phpDocumentor\Reflection\Types\Boolean; -use function class_alias; -/** - * Value Object representing the PseudoType 'False', which is a Boolean type. - * - * @psalm-immutable - */ -final class False_ extends Boolean implements PseudoType +use const DIRECTORY_SEPARATOR; +use function array_unique; +use function count; +use function dirname; +use function explode; +use function is_file; +use function is_string; +use function realpath; +use function sort; +class Facade { - public function underlyingType() : Type + /** + * @param array|string $paths + * @param array|string $suffixes + * @param array|string $prefixes + */ + public function getFilesAsArray($paths, $suffixes = '', $prefixes = '', array $exclude = [], bool $commonPath = \false) : array { - return new Boolean(); + if (is_string($paths)) { + $paths = [$paths]; + } + $iterator = (new Factory())->getFileIterator($paths, $suffixes, $prefixes, $exclude); + $files = []; + foreach ($iterator as $file) { + $file = $file->getRealPath(); + if ($file) { + $files[] = $file; + } + } + foreach ($paths as $path) { + if (is_file($path)) { + $files[] = realpath($path); + } + } + $files = array_unique($files); + sort($files); + if ($commonPath) { + return ['commonPath' => $this->getCommonPath($files), 'files' => $files]; + } + return $files; } - public function __toString() : string + protected function getCommonPath(array $files) : string { - return 'false'; + $count = count($files); + if ($count === 0) { + return ''; + } + if ($count === 1) { + return dirname($files[0]) . DIRECTORY_SEPARATOR; + } + $_files = []; + foreach ($files as $file) { + $_files[] = $_fileParts = explode(DIRECTORY_SEPARATOR, $file); + if (empty($_fileParts[0])) { + $_fileParts[0] = DIRECTORY_SEPARATOR; + } + } + $common = ''; + $done = \false; + $j = 0; + $count--; + while (!$done) { + for ($i = 0; $i < $count; $i++) { + if ($_files[$i][$j] != $_files[$i + 1][$j]) { + $done = \true; + break; + } + } + if (!$done) { + $common .= $_files[0][$j]; + if ($j > 0) { + $common .= DIRECTORY_SEPARATOR; + } + } + $j++; + } + return DIRECTORY_SEPARATOR . $common; } } -class_alias('PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\False_', 'PHPUnit\\phpDocumentor\\Reflection\\Types\\False_', \false); * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; +namespace PHPUnit\SebastianBergmann\FileIterator; -use PHPUnit\phpDocumentor\Reflection\PseudoType; -use PHPUnit\phpDocumentor\Reflection\Type; -use PHPUnit\phpDocumentor\Reflection\Types\String_; -/** - * Value Object representing the type 'string'. - * - * @psalm-immutable - */ -final class NonEmptyString extends String_ implements PseudoType +use const GLOB_ONLYDIR; +use function array_filter; +use function array_map; +use function array_merge; +use function glob; +use function is_dir; +use function is_string; +use function realpath; +use AppendIterator; +use RecursiveDirectoryIterator; +use RecursiveIteratorIterator; +class Factory { - public function underlyingType() : Type - { - return new String_(); - } /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @param array|string $paths + * @param array|string $suffixes + * @param array|string $prefixes */ - public function __toString() : string + public function getFileIterator($paths, $suffixes = '', $prefixes = '', array $exclude = []) : AppendIterator { - return 'non-empty-string'; + if (is_string($paths)) { + $paths = [$paths]; + } + $paths = $this->getPathsAfterResolvingWildcards($paths); + $exclude = $this->getPathsAfterResolvingWildcards($exclude); + if (is_string($prefixes)) { + if ($prefixes !== '') { + $prefixes = [$prefixes]; + } else { + $prefixes = []; + } + } + if (is_string($suffixes)) { + if ($suffixes !== '') { + $suffixes = [$suffixes]; + } else { + $suffixes = []; + } + } + $iterator = new AppendIterator(); + foreach ($paths as $path) { + if (is_dir($path)) { + $iterator->append(new Iterator($path, new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::FOLLOW_SYMLINKS | RecursiveDirectoryIterator::SKIP_DOTS)), $suffixes, $prefixes, $exclude)); + } + } + return $iterator; + } + protected function getPathsAfterResolvingWildcards(array $paths) : array + { + $_paths = [[]]; + foreach ($paths as $path) { + if ($locals = glob($path, GLOB_ONLYDIR)) { + $_paths[] = array_map('\\realpath', $locals); + } else { + $_paths[] = [realpath($path)]; + } + } + return array_filter(array_merge(...$_paths)); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; +namespace PHPUnit\SebastianBergmann\FileIterator; -use PHPUnit\phpDocumentor\Reflection\PseudoType; -use PHPUnit\phpDocumentor\Reflection\Type; -use PHPUnit\phpDocumentor\Reflection\Types\String_; -/** - * Value Object representing the type 'string'. - * - * @psalm-immutable - */ -final class TraitString extends String_ implements PseudoType +use function array_filter; +use function array_map; +use function preg_match; +use function realpath; +use function str_replace; +use function strlen; +use function strpos; +use function substr; +use FilterIterator; +class Iterator extends FilterIterator { - public function underlyingType() : Type - { - return new String_(); - } + public const PREFIX = 0; + public const SUFFIX = 1; /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @var string */ - public function __toString() : string + private $basePath; + /** + * @var array + */ + private $suffixes = []; + /** + * @var array + */ + private $prefixes = []; + /** + * @var array + */ + private $exclude = []; + public function __construct(string $basePath, \Iterator $iterator, array $suffixes = [], array $prefixes = [], array $exclude = []) { - return 'trait-string'; + $this->basePath = realpath($basePath); + $this->prefixes = $prefixes; + $this->suffixes = $suffixes; + $this->exclude = array_filter(array_map('realpath', $exclude)); + parent::__construct($iterator); + } + public function accept() : bool + { + $current = $this->getInnerIterator()->current(); + $filename = $current->getFilename(); + $realPath = $current->getRealPath(); + if ($realPath === \false) { + return \false; + } + return $this->acceptPath($realPath) && $this->acceptPrefix($filename) && $this->acceptSuffix($filename); + } + private function acceptPath(string $path) : bool + { + // Filter files in hidden directories by checking path that is relative to the base path. + if (preg_match('=/\\.[^/]*/=', str_replace($this->basePath, '', $path))) { + return \false; + } + foreach ($this->exclude as $exclude) { + if (strpos($path, $exclude) === 0) { + return \false; + } + } + return \true; + } + private function acceptPrefix(string $filename) : bool + { + return $this->acceptSubString($filename, $this->prefixes, self::PREFIX); + } + private function acceptSuffix(string $filename) : bool + { + return $this->acceptSubString($filename, $this->suffixes, self::SUFFIX); + } + private function acceptSubString(string $filename, array $subStrings, int $type) : bool + { + if (empty($subStrings)) { + return \true; + } + $matched = \false; + foreach ($subStrings as $string) { + if ($type === self::PREFIX && strpos($filename, $string) === 0 || $type === self::SUFFIX && substr($filename, -1 * strlen($string)) === $string) { + $matched = \true; + break; + } + } + return $matched; } } +php-file-iterator + +Copyright (c) 2009-2021, Sebastian Bergmann . +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Sebastian Bergmann nor the names of his + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link https://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; +namespace PHPUnit\SebastianBergmann\Invoker; -use PHPUnit\phpDocumentor\Reflection\PseudoType; -use PHPUnit\phpDocumentor\Reflection\Type; -use PHPUnit\phpDocumentor\Reflection\Types\Boolean; -use function class_alias; -/** - * Value Object representing the PseudoType 'False', which is a Boolean type. - * - * @psalm-immutable - */ -final class True_ extends Boolean implements PseudoType +use const SIGALRM; +use function call_user_func_array; +use function function_exists; +use function pcntl_alarm; +use function pcntl_async_signals; +use function pcntl_signal; +use function sprintf; +use Throwable; +final class Invoker { - public function underlyingType() : Type + /** + * @var int + */ + private $timeout; + /** + * @throws Throwable + */ + public function invoke(callable $callable, array $arguments, int $timeout) { - return new Boolean(); + if (!$this->canInvokeWithTimeout()) { + throw new ProcessControlExtensionNotLoadedException('The pcntl (process control) extension for PHP is required'); + } + pcntl_signal(SIGALRM, function () : void { + throw new TimeoutException(sprintf('Execution aborted after %d second%s', $this->timeout, $this->timeout === 1 ? '' : 's')); + }, \true); + $this->timeout = $timeout; + pcntl_async_signals(\true); + pcntl_alarm($timeout); + try { + return call_user_func_array($callable, $arguments); + } finally { + pcntl_alarm(0); + } } - public function __toString() : string + public function canInvokeWithTimeout() : bool { - return 'true'; + return function_exists('pcntl_signal') && function_exists('pcntl_async_signals') && function_exists('pcntl_alarm'); } } -class_alias('PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\True_', 'PHPUnit\\phpDocumentor\\Reflection\\Types\\True_', \false); * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; +namespace PHPUnit\SebastianBergmann\Invoker; -use PHPUnit\phpDocumentor\Reflection\PseudoType; -use PHPUnit\phpDocumentor\Reflection\Type; -use PHPUnit\phpDocumentor\Reflection\Types\String_; -/** - * Value Object representing the type 'string'. - * - * @psalm-immutable - */ -final class CallableString extends String_ implements PseudoType +use Throwable; +interface Exception extends Throwable { - public function underlyingType() : Type - { - return new String_(); - } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'callable-string'; - } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; +namespace PHPUnit\SebastianBergmann\Invoker; -use PHPUnit\phpDocumentor\Reflection\PseudoType; -use PHPUnit\phpDocumentor\Reflection\Type; -use PHPUnit\phpDocumentor\Reflection\Types\String_; -/** - * Value Object representing the type 'string'. +use RuntimeException; +final class ProcessControlExtensionNotLoadedException extends RuntimeException implements Exception +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. */ -final class NonEmptyLowercaseString extends String_ implements PseudoType +namespace PHPUnit\SebastianBergmann\Invoker; + +use RuntimeException; +final class TimeoutException extends RuntimeException implements Exception { - public function underlyingType() : Type - { - return new String_(); - } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'non-empty-lowercase-string'; - } } +phpunit/php-text-template + +Copyright (c) 2009-2020, Sebastian Bergmann . +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Sebastian Bergmann nor the names of his + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; +namespace PHPUnit\SebastianBergmann\Template; -use PHPUnit\phpDocumentor\Reflection\PseudoType; -use PHPUnit\phpDocumentor\Reflection\Type; -use PHPUnit\phpDocumentor\Reflection\Types\String_; -/** - * Value Object representing the type 'string'. - * - * @psalm-immutable - */ -final class NumericString extends String_ implements PseudoType +use function array_merge; +use function file_exists; +use function file_get_contents; +use function file_put_contents; +use function sprintf; +use function str_replace; +final class Template { - public function underlyingType() : Type + /** + * @var string + */ + private $template = ''; + /** + * @var string + */ + private $openDelimiter; + /** + * @var string + */ + private $closeDelimiter; + /** + * @var array + */ + private $values = []; + /** + * @throws InvalidArgumentException + */ + public function __construct(string $file = '', string $openDelimiter = '{', string $closeDelimiter = '}') { - return new String_(); + $this->setFile($file); + $this->openDelimiter = $openDelimiter; + $this->closeDelimiter = $closeDelimiter; } /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @throws InvalidArgumentException */ - public function __toString() : string + public function setFile(string $file) : void { - return 'numeric-string'; + $distFile = $file . '.dist'; + if (file_exists($file)) { + $this->template = file_get_contents($file); + } elseif (file_exists($distFile)) { + $this->template = file_get_contents($distFile); + } else { + throw new InvalidArgumentException(sprintf('Failed to load template "%s"', $file)); + } } -} -values)) { + $this->values = $values; + } else { + $this->values = array_merge($this->values, $values); + } + } + public function render() : string + { + $keys = []; + foreach ($this->values as $key => $value) { + $keys[] = $this->openDelimiter . $key . $this->closeDelimiter; + } + return str_replace($keys, $this->values, $this->template); } /** - * Returns a rendered output of the Type as it would be used in a DocBlock. + * @codeCoverageIgnore */ - public function __toString() : string + public function renderTo(string $target) : void { - return 'lowercase-string'; + if (!file_put_contents($target, $this->render())) { + throw new RuntimeException(sprintf('Writing rendered result to "%s" failed', $target)); + } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; +namespace PHPUnit\SebastianBergmann\Template; -use PHPUnit\phpDocumentor\Reflection\PseudoType; -use PHPUnit\phpDocumentor\Reflection\Type; -use PHPUnit\phpDocumentor\Reflection\Types\Integer; -/** - * Value Object representing the type 'string'. - * - * @psalm-immutable - */ -final class PositiveInteger extends Integer implements PseudoType +use Throwable; +interface Exception extends Throwable { - public function underlyingType() : Type - { - return new Integer(); - } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return 'positive-int'; - } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection; +namespace PHPUnit\SebastianBergmann\Template; -/** - * @psalm-immutable - */ -interface Type +final class InvalidArgumentException extends \InvalidArgumentException implements Exception { - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string; } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection; +namespace PHPUnit\SebastianBergmann\Template; -interface PseudoType extends Type +use InvalidArgumentException; +final class RuntimeException extends InvalidArgumentException implements Exception { - public function underlyingType() : Type; } -The MIT License (MIT) - -Copyright (c) 2010 Mike van Riel - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - * - * @link http://phpdoc.org */ -namespace PHPUnit\phpDocumentor\Reflection; +namespace PHPUnit\SebastianBergmann\Timer; -use ArrayIterator; -use InvalidArgumentException; -use PHPUnit\phpDocumentor\Reflection\Types\Array_; -use PHPUnit\phpDocumentor\Reflection\Types\ClassString; -use PHPUnit\phpDocumentor\Reflection\Types\Collection; -use PHPUnit\phpDocumentor\Reflection\Types\Compound; -use PHPUnit\phpDocumentor\Reflection\Types\Context; -use PHPUnit\phpDocumentor\Reflection\Types\Expression; -use PHPUnit\phpDocumentor\Reflection\Types\Integer; -use PHPUnit\phpDocumentor\Reflection\Types\InterfaceString; -use PHPUnit\phpDocumentor\Reflection\Types\Intersection; -use PHPUnit\phpDocumentor\Reflection\Types\Iterable_; -use PHPUnit\phpDocumentor\Reflection\Types\Nullable; -use PHPUnit\phpDocumentor\Reflection\Types\Object_; -use PHPUnit\phpDocumentor\Reflection\Types\String_; -use RuntimeException; -use function array_key_exists; -use function array_pop; -use function array_values; -use function class_exists; -use function class_implements; -use function count; -use function end; -use function in_array; -use function key; -use function preg_split; -use function strpos; -use function strtolower; -use function trim; -use const PREG_SPLIT_DELIM_CAPTURE; -use const PREG_SPLIT_NO_EMPTY; -final class TypeResolver +use function floor; +use function sprintf; +/** + * @psalm-immutable + */ +final class Duration { - /** @var string Definition of the ARRAY operator for types */ - private const OPERATOR_ARRAY = '[]'; - /** @var string Definition of the NAMESPACE operator in PHP */ - private const OPERATOR_NAMESPACE = '\\'; - /** @var int the iterator parser is inside a compound context */ - private const PARSER_IN_COMPOUND = 0; - /** @var int the iterator parser is inside a nullable expression context */ - private const PARSER_IN_NULLABLE = 1; - /** @var int the iterator parser is inside an array expression context */ - private const PARSER_IN_ARRAY_EXPRESSION = 2; - /** @var int the iterator parser is inside a collection expression context */ - private const PARSER_IN_COLLECTION_EXPRESSION = 3; /** - * @var array List of recognized keywords and unto which Value Object they map - * @psalm-var array> + * @var float */ - private $keywords = ['string' => Types\String_::class, 'class-string' => Types\ClassString::class, 'interface-string' => Types\InterfaceString::class, 'html-escaped-string' => PseudoTypes\HtmlEscapedString::class, 'lowercase-string' => PseudoTypes\LowercaseString::class, 'non-empty-lowercase-string' => PseudoTypes\NonEmptyLowercaseString::class, 'non-empty-string' => PseudoTypes\NonEmptyString::class, 'numeric-string' => PseudoTypes\NumericString::class, 'trait-string' => PseudoTypes\TraitString::class, 'int' => Types\Integer::class, 'integer' => Types\Integer::class, 'positive-int' => PseudoTypes\PositiveInteger::class, 'bool' => Types\Boolean::class, 'boolean' => Types\Boolean::class, 'real' => Types\Float_::class, 'float' => Types\Float_::class, 'double' => Types\Float_::class, 'object' => Types\Object_::class, 'mixed' => Types\Mixed_::class, 'array' => Types\Array_::class, 'array-key' => Types\ArrayKey::class, 'resource' => Types\Resource_::class, 'void' => Types\Void_::class, 'null' => Types\Null_::class, 'scalar' => Types\Scalar::class, 'callback' => Types\Callable_::class, 'callable' => Types\Callable_::class, 'callable-string' => PseudoTypes\CallableString::class, 'false' => PseudoTypes\False_::class, 'true' => PseudoTypes\True_::class, 'self' => Types\Self_::class, '$this' => Types\This::class, 'static' => Types\Static_::class, 'parent' => Types\Parent_::class, 'iterable' => Types\Iterable_::class, 'never' => Types\Never_::class]; + private $nanoseconds; /** - * @var FqsenResolver - * @psalm-readonly + * @var int */ - private $fqsenResolver; + private $hours; /** - * Initializes this TypeResolver with the means to create and resolve Fqsen objects. + * @var int */ - public function __construct(?FqsenResolver $fqsenResolver = null) - { - $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); - } + private $minutes; /** - * Analyzes the given type and returns the FQCN variant. - * - * When a type is provided this method checks whether it is not a keyword or - * Fully Qualified Class Name. If so it will use the given namespace and - * aliases to expand the type to a FQCN representation. - * - * This method only works as expected if the namespace and aliases are set; - * no dynamic reflection is being performed here. - * - * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be - * replaced with another namespace. - * @uses Context::getNamespace() to determine with what to prefix the type name. - * - * @param string $type The relative or absolute type. + * @var int */ - public function resolve(string $type, ?Context $context = null) : Type - { - $type = trim($type); - if (!$type) { - throw new InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); - } - if ($context === null) { - $context = new Context(''); - } - // split the type string into tokens `|`, `?`, `<`, `>`, `,`, `(`, `)`, `[]`, '<', '>' and type names - $tokens = preg_split('/(\\||\\?|<|>|&|, ?|\\(|\\)|\\[\\]+)/', $type, -1, \PREG_SPLIT_NO_EMPTY | \PREG_SPLIT_DELIM_CAPTURE); - if ($tokens === \false) { - throw new InvalidArgumentException('Unable to split the type string "' . $type . '" into tokens'); - } - /** @var ArrayIterator $tokenIterator */ - $tokenIterator = new ArrayIterator($tokens); - return $this->parseTypes($tokenIterator, $context, self::PARSER_IN_COMPOUND); - } + private $seconds; /** - * Analyse each tokens and creates types - * - * @param ArrayIterator $tokens the iterator on tokens - * @param int $parserContext on of self::PARSER_* constants, indicating - * the context where we are in the parsing + * @var int */ - private function parseTypes(ArrayIterator $tokens, Context $context, int $parserContext) : Type + private $milliseconds; + public static function fromMicroseconds(float $microseconds) : self { - $types = []; - $token = ''; - $compoundToken = '|'; - while ($tokens->valid()) { - $token = $tokens->current(); - if ($token === null) { - throw new RuntimeException('Unexpected nullable character'); - } - if ($token === '|' || $token === '&') { - if (count($types) === 0) { - throw new RuntimeException('A type is missing before a type separator'); - } - if (!in_array($parserContext, [self::PARSER_IN_COMPOUND, self::PARSER_IN_ARRAY_EXPRESSION, self::PARSER_IN_COLLECTION_EXPRESSION], \true)) { - throw new RuntimeException('Unexpected type separator'); - } - $compoundToken = $token; - $tokens->next(); - } elseif ($token === '?') { - if (!in_array($parserContext, [self::PARSER_IN_COMPOUND, self::PARSER_IN_ARRAY_EXPRESSION, self::PARSER_IN_COLLECTION_EXPRESSION], \true)) { - throw new RuntimeException('Unexpected nullable character'); - } - $tokens->next(); - $type = $this->parseTypes($tokens, $context, self::PARSER_IN_NULLABLE); - $types[] = new Nullable($type); - } elseif ($token === '(') { - $tokens->next(); - $type = $this->parseTypes($tokens, $context, self::PARSER_IN_ARRAY_EXPRESSION); - $token = $tokens->current(); - if ($token === null) { - // Someone did not properly close their array expression .. - break; - } - $tokens->next(); - $resolvedType = new Expression($type); - $types[] = $resolvedType; - } elseif ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION && isset($token[0]) && $token[0] === ')') { - break; - } elseif ($token === '<') { - if (count($types) === 0) { - throw new RuntimeException('Unexpected collection operator "<", class name is missing'); - } - $classType = array_pop($types); - if ($classType !== null) { - if ((string) $classType === 'class-string') { - $types[] = $this->resolveClassString($tokens, $context); - } elseif ((string) $classType === 'interface-string') { - $types[] = $this->resolveInterfaceString($tokens, $context); - } else { - $types[] = $this->resolveCollection($tokens, $classType, $context); - } - } - $tokens->next(); - } elseif ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION && ($token === '>' || trim($token) === ',')) { - break; - } elseif ($token === self::OPERATOR_ARRAY) { - end($types); - $last = key($types); - $lastItem = $types[$last]; - if ($lastItem instanceof Expression) { - $lastItem = $lastItem->getValueType(); - } - $types[$last] = new Array_($lastItem); - $tokens->next(); - } else { - $type = $this->resolveSingleType($token, $context); - $tokens->next(); - if ($parserContext === self::PARSER_IN_NULLABLE) { - return $type; - } - $types[] = $type; - } - } - if ($token === '|' || $token === '&') { - throw new RuntimeException('A type is missing after a type separator'); - } - if (count($types) === 0) { - if ($parserContext === self::PARSER_IN_NULLABLE) { - throw new RuntimeException('A type is missing after a nullable character'); - } - if ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION) { - throw new RuntimeException('A type is missing in an array expression'); - } - if ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION) { - throw new RuntimeException('A type is missing in a collection expression'); - } - } elseif (count($types) === 1) { - return $types[0]; - } - if ($compoundToken === '|') { - return new Compound(array_values($types)); - } - return new Intersection(array_values($types)); + return new self($microseconds * 1000); } - /** - * resolve the given type into a type object - * - * @param string $type the type string, representing a single type - * - * @return Type|Array_|Object_ - * - * @psalm-mutation-free - */ - private function resolveSingleType(string $type, Context $context) : object + public static function fromNanoseconds(float $nanoseconds) : self { - switch (\true) { - case $this->isKeyword($type): - return $this->resolveKeyword($type); - case $this->isFqsen($type): - return $this->resolveTypedObject($type); - case $this->isPartialStructuralElementName($type): - return $this->resolveTypedObject($type, $context); - // @codeCoverageIgnoreStart - default: - // I haven't got the foggiest how the logic would come here but added this as a defense. - throw new RuntimeException('Unable to resolve type "' . $type . '", there is no known method to resolve it'); - } - // @codeCoverageIgnoreEnd + return new self($nanoseconds); } - /** - * Adds a keyword to the list of Keywords and associates it with a specific Value Object. - * - * @psalm-param class-string $typeClassName - */ - public function addKeyword(string $keyword, string $typeClassName) : void + private function __construct(float $nanoseconds) { - if (!class_exists($typeClassName)) { - throw new InvalidArgumentException('The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName); - } - $interfaces = class_implements($typeClassName); - if ($interfaces === \false) { - throw new InvalidArgumentException('The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName); - } - if (!in_array(Type::class, $interfaces, \true)) { - throw new InvalidArgumentException('The class "' . $typeClassName . '" must implement the interface "phpDocumentor\\Reflection\\Type"'); - } - $this->keywords[$keyword] = $typeClassName; + $this->nanoseconds = $nanoseconds; + $timeInMilliseconds = $nanoseconds / 1000000; + $hours = floor($timeInMilliseconds / 60 / 60 / 1000); + $hoursInMilliseconds = $hours * 60 * 60 * 1000; + $minutes = floor($timeInMilliseconds / 60 / 1000) % 60; + $minutesInMilliseconds = $minutes * 60 * 1000; + $seconds = floor(($timeInMilliseconds - $hoursInMilliseconds - $minutesInMilliseconds) / 1000); + $secondsInMilliseconds = $seconds * 1000; + $milliseconds = $timeInMilliseconds - $hoursInMilliseconds - $minutesInMilliseconds - $secondsInMilliseconds; + $this->hours = (int) $hours; + $this->minutes = $minutes; + $this->seconds = (int) $seconds; + $this->milliseconds = (int) $milliseconds; } - /** - * Detects whether the given type represents a PHPDoc keyword. - * - * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. - * - * @psalm-mutation-free - */ - private function isKeyword(string $type) : bool + public function asNanoseconds() : float { - return array_key_exists(strtolower($type), $this->keywords); + return $this->nanoseconds; } - /** - * Detects whether the given type represents a relative structural element name. - * - * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. - * - * @psalm-mutation-free - */ - private function isPartialStructuralElementName(string $type) : bool + public function asMicroseconds() : float { - return isset($type[0]) && $type[0] !== self::OPERATOR_NAMESPACE && !$this->isKeyword($type); + return $this->nanoseconds / 1000; } - /** - * Tests whether the given type is a Fully Qualified Structural Element Name. - * - * @psalm-mutation-free - */ - private function isFqsen(string $type) : bool + public function asMilliseconds() : float { - return strpos($type, self::OPERATOR_NAMESPACE) === 0; + return $this->nanoseconds / 1000000; } - /** - * Resolves the given keyword (such as `string`) into a Type object representing that keyword. - * - * @psalm-mutation-free - */ - private function resolveKeyword(string $type) : Type + public function asSeconds() : float { - $className = $this->keywords[strtolower($type)]; - return new $className(); + return $this->nanoseconds / 1000000000; + } + public function asString() : string + { + $result = ''; + if ($this->hours > 0) { + $result = sprintf('%02d', $this->hours) . ':'; + } + $result .= sprintf('%02d', $this->minutes) . ':'; + $result .= sprintf('%02d', $this->seconds); + if ($this->milliseconds > 0) { + $result .= '.' . sprintf('%03d', $this->milliseconds); + } + return $result; } +} +phpunit/php-timer + +Copyright (c) 2010-2020, Sebastian Bergmann . +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Sebastian Bergmann nor the names of his + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\Timer; + +use function is_float; +use function memory_get_peak_usage; +use function microtime; +use function sprintf; +final class ResourceUsageFormatter +{ /** - * Resolves the given FQSEN string into an FQSEN object. - * - * @psalm-mutation-free + * @psalm-var array */ - private function resolveTypedObject(string $type, ?Context $context = null) : Object_ + private const SIZES = ['GB' => 1073741824, 'MB' => 1048576, 'KB' => 1024]; + public function resourceUsage(Duration $duration) : string { - return new Object_($this->fqsenResolver->resolve($type, $context)); + return sprintf('Time: %s, Memory: %s', $duration->asString(), $this->bytesToString(memory_get_peak_usage(\true))); } /** - * Resolves class string - * - * @param ArrayIterator $tokens + * @throws TimeSinceStartOfRequestNotAvailableException */ - private function resolveClassString(ArrayIterator $tokens, Context $context) : Type + public function resourceUsageSinceStartOfRequest() : string { - $tokens->next(); - $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - if (!$classType instanceof Object_ || $classType->getFqsen() === null) { - throw new RuntimeException($classType . ' is not a class string'); + if (!isset($_SERVER['REQUEST_TIME_FLOAT'])) { + throw new TimeSinceStartOfRequestNotAvailableException('Cannot determine time at which the request started because $_SERVER[\'REQUEST_TIME_FLOAT\'] is not available'); } - $token = $tokens->current(); - if ($token !== '>') { - if (empty($token)) { - throw new RuntimeException('class-string: ">" is missing'); - } - throw new RuntimeException('Unexpected character "' . $token . '", ">" is missing'); + if (!is_float($_SERVER['REQUEST_TIME_FLOAT'])) { + throw new TimeSinceStartOfRequestNotAvailableException('Cannot determine time at which the request started because $_SERVER[\'REQUEST_TIME_FLOAT\'] is not of type float'); } - return new ClassString($classType->getFqsen()); + return $this->resourceUsage(Duration::fromMicroseconds(1000000 * (microtime(\true) - $_SERVER['REQUEST_TIME_FLOAT']))); } - /** - * Resolves class string - * - * @param ArrayIterator $tokens - */ - private function resolveInterfaceString(ArrayIterator $tokens, Context $context) : Type + private function bytesToString(int $bytes) : string { - $tokens->next(); - $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - if (!$classType instanceof Object_ || $classType->getFqsen() === null) { - throw new RuntimeException($classType . ' is not a interface string'); - } - $token = $tokens->current(); - if ($token !== '>') { - if (empty($token)) { - throw new RuntimeException('interface-string: ">" is missing'); + foreach (self::SIZES as $unit => $value) { + if ($bytes >= $value) { + return sprintf('%.2f %s', $bytes >= 1024 ? $bytes / $value : $bytes, $unit); } - throw new RuntimeException('Unexpected character "' . $token . '", ">" is missing'); } - return new InterfaceString($classType->getFqsen()); + // @codeCoverageIgnoreStart + return $bytes . ' byte' . ($bytes !== 1 ? 's' : ''); + // @codeCoverageIgnoreEnd } +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\Timer; + +use function array_pop; +use function hrtime; +final class Timer +{ /** - * Resolves the collection values and keys - * - * @param ArrayIterator $tokens - * - * @return Array_|Iterable_|Collection + * @psalm-var list */ - private function resolveCollection(ArrayIterator $tokens, Type $classType, Context $context) : Type + private $startTimes = []; + public function start() : void { - $isArray = (string) $classType === 'array'; - $isIterable = (string) $classType === 'iterable'; - // allow only "array", "iterable" or class name before "<" - if (!$isArray && !$isIterable && (!$classType instanceof Object_ || $classType->getFqsen() === null)) { - throw new RuntimeException($classType . ' is not a collection'); - } - $tokens->next(); - $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - $keyType = null; - $token = $tokens->current(); - if ($token !== null && trim($token) === ',') { - // if we have a comma, then we just parsed the key type, not the value type - $keyType = $valueType; - if ($isArray) { - // check the key type for an "array" collection. We allow only - // strings or integers. - if (!$keyType instanceof String_ && !$keyType instanceof Integer && !$keyType instanceof Compound) { - throw new RuntimeException('An array can have only integers or strings as keys'); - } - if ($keyType instanceof Compound) { - foreach ($keyType->getIterator() as $item) { - if (!$item instanceof String_ && !$item instanceof Integer) { - throw new RuntimeException('An array can have only integers or strings as keys'); - } - } - } - } - $tokens->next(); - // now let's parse the value type - $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - } - $token = $tokens->current(); - if ($token !== '>') { - if (empty($token)) { - throw new RuntimeException('Collection: ">" is missing'); - } - throw new RuntimeException('Unexpected character "' . $token . '", ">" is missing'); - } - if ($isArray) { - return new Array_($valueType, $keyType); - } - if ($isIterable) { - return new Iterable_($valueType, $keyType); - } - if ($classType instanceof Object_) { - return $this->makeCollectionFromObject($classType, $valueType, $keyType); - } - throw new RuntimeException('Invalid $classType provided'); + $this->startTimes[] = (float) hrtime(\true); } /** - * @psalm-pure + * @throws NoActiveTimerException */ - private function makeCollectionFromObject(Object_ $object, Type $valueType, ?Type $keyType = null) : Collection + public function stop() : Duration { - return new Collection($object->getFqsen(), $valueType, $keyType); + if (empty($this->startTimes)) { + throw new NoActiveTimerException('Timer::start() has to be called before Timer::stop()'); + } + return Duration::fromNanoseconds((float) hrtime(\true) - array_pop($this->startTimes)); } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\Environment; +namespace PHPUnit\SebastianBergmann\Timer; -use const DIRECTORY_SEPARATOR; -use const STDIN; -use const STDOUT; -use function defined; -use function fclose; -use function fstat; -use function function_exists; -use function getenv; -use function is_resource; -use function is_string; -use function posix_isatty; -use function preg_match; -use function proc_close; -use function proc_open; -use function sapi_windows_vt100_support; -use function shell_exec; -use function stream_get_contents; -use function stream_isatty; -use function trim; -final class Console +use Throwable; +interface Exception extends Throwable +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\Timer; + +use LogicException; +final class NoActiveTimerException extends LogicException implements Exception +{ +} + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\SebastianBergmann\Timer; + +use RuntimeException; +final class TimeSinceStartOfRequestNotAvailableException extends RuntimeException implements Exception +{ +} +isWindows()) { - // @codeCoverageIgnoreStart - return defined('STDOUT') && function_exists('sapi_windows_vt100_support') && @sapi_windows_vt100_support(\STDOUT) || \false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI') || 'xterm' === getenv('TERM'); - // @codeCoverageIgnoreEnd - } - if (!defined('STDOUT')) { - // @codeCoverageIgnoreStart - return \false; - // @codeCoverageIgnoreEnd - } - return $this->isInteractive(\STDOUT); - } + public function md5() : string; /** - * Returns the number of columns of the terminal. + * Returns an relative path to the file. + */ + public function path() : string; +} +isInteractive(defined('STDIN') ? \STDIN : self::STDIN)) { - return 80; + $matches = []; + $result = preg_match( + //phpcs:ignore Generic.Files.LineLength.TooLong + '/^\\\\([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff\\\\]*)?(?:[:]{2}\\$?([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*))?(?:\\(\\))?$/', + $fqsen, + $matches + ); + if ($result === 0) { + throw new InvalidArgumentException(sprintf('"%s" is not a valid Fqsen.', $fqsen)); } - if ($this->isWindows()) { - return $this->getNumberOfColumnsWindows(); + $this->fqsen = $fqsen; + if (isset($matches[2])) { + $this->name = $matches[2]; + } else { + $matches = explode('\\', $fqsen); + $name = end($matches); + assert(is_string($name)); + $this->name = trim($name, '()'); } - return $this->getNumberOfColumnsInteractive(); } /** - * Returns if the file descriptor is an interactive terminal or not. - * - * Normally, we want to use a resource as a parameter, yet sadly it's not always awailable, - * eg when running code in interactive console (`php -a`), STDIN/STDOUT/STDERR constants are not defined. - * - * @param int|resource $fileDescriptor + * converts this class to string. */ - public function isInteractive($fileDescriptor = self::STDOUT) : bool + public function __toString() : string { - if (is_resource($fileDescriptor)) { - // These functions require a descriptor that is a real resource, not a numeric ID of it - if (function_exists('stream_isatty') && @stream_isatty($fileDescriptor)) { - return \true; - } - // Check if formatted mode is S_IFCHR - if (function_exists('fstat') && @stream_isatty($fileDescriptor)) { - $stat = @fstat(\STDOUT); - return $stat ? 020000 === ($stat['mode'] & 0170000) : \false; - } - return \false; - } - return function_exists('posix_isatty') && @posix_isatty($fileDescriptor); + return $this->fqsen; } - private function isWindows() : bool + /** + * Returns the name of the element without path. + */ + public function getName() : string { - return \DIRECTORY_SEPARATOR === '\\'; + return $this->name; } +} +The MIT License (MIT) + +Copyright (c) 2015 phpDocumentor + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + 0) { - return (int) $match[1]; - } - } - if (function_exists('shell_exec') && preg_match('#columns = (\\d+);#', shell_exec('stty') ?: '', $match) === 1) { - if ((int) $match[1] > 0) { - return (int) $match[1]; - } - } - return 80; + $this->lineNumber = $lineNumber; + $this->columnNumber = $columnNumber; } /** - * @codeCoverageIgnore + * Returns the line number that is covered by this location. */ - private function getNumberOfColumnsWindows() : int + public function getLineNumber() : int { - $ansicon = getenv('ANSICON'); - $columns = 80; - if (is_string($ansicon) && preg_match('/^(\\d+)x\\d+ \\(\\d+x(\\d+)\\)$/', trim($ansicon), $matches)) { - $columns = (int) $matches[1]; - } elseif (function_exists('proc_open')) { - $process = proc_open('mode CON', [1 => ['pipe', 'w'], 2 => ['pipe', 'w']], $pipes, null, null, ['suppress_errors' => \true]); - if (is_resource($process)) { - $info = stream_get_contents($pipes[1]); - fclose($pipes[1]); - fclose($pipes[2]); - proc_close($process); - if (preg_match('/--------+\\r?\\n.+?(\\d+)\\r?\\n.+?(\\d+)\\r?\\n/', $info, $matches)) { - $columns = (int) $matches[2]; - } - } - } - return $columns - 1; + return $this->lineNumber; + } + /** + * Returns the column number (character position on a line) for this location object. + */ + public function getColumnNumber() : int + { + return $this->columnNumber; } } +/** + * phpDocumentor * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Environment; +namespace PHPUnit\phpDocumentor\Reflection; -use const DIRECTORY_SEPARATOR; -use const PHP_OS; -use const PHP_OS_FAMILY; -use function defined; -final class OperatingSystem +/** + * Interface for project. Since the definition of a project can be different per factory this interface will be small. + */ +interface Project { /** - * Returns PHP_OS_FAMILY (if defined (which it is on PHP >= 7.2)). - * Returns a string (compatible with PHP_OS_FAMILY) derived from PHP_OS otherwise. + * Returns the name of the project. */ - public function getFamily() : string - { - if (defined('PHP_OS_FAMILY')) { - return \PHP_OS_FAMILY; - } - if (\DIRECTORY_SEPARATOR === '\\') { - return 'Windows'; - } - switch (\PHP_OS) { - case 'Darwin': - return 'Darwin'; - case 'DragonFly': - case 'FreeBSD': - case 'NetBSD': - case 'OpenBSD': - return 'BSD'; - case 'Linux': - return 'Linux'; - case 'SunOS': - return 'Solaris'; - default: - return 'Unknown'; - } - } + public function getName() : string; } +/** + * phpDocumentor * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Environment; +namespace PHPUnit\phpDocumentor\Reflection; -use const PHP_BINARY; -use const PHP_BINDIR; -use const PHP_MAJOR_VERSION; -use const PHP_SAPI; -use const PHP_VERSION; -use function array_map; -use function array_merge; -use function defined; -use function escapeshellarg; -use function explode; -use function extension_loaded; -use function getenv; -use function ini_get; -use function is_readable; -use function parse_ini_file; -use function php_ini_loaded_file; -use function php_ini_scanned_files; -use function phpversion; -use function sprintf; -use function strpos; /** - * Utility class for HHVM/PHP environment handling. + * Interface for project factories. A project factory shall convert a set of files + * into an object implementing the Project interface. */ -final class Runtime +interface ProjectFactory { /** - * @var string - */ - private static $binary; - /** - * Returns true when Xdebug or PCOV is available or - * the runtime used is PHPDBG. - */ - public function canCollectCodeCoverage() : bool - { - return $this->hasXdebug() || $this->hasPCOV() || $this->hasPHPDBGCodeCoverage(); - } - /** - * Returns true when Zend OPcache is loaded, enabled, - * and is configured to discard comments. - */ - public function discardsComments() : bool - { - if (!$this->isOpcacheActive()) { - return \false; - } - if (ini_get('opcache.save_comments') !== '0') { - return \false; - } - return \true; - } - /** - * Returns true when Zend OPcache is loaded, enabled, - * and is configured to perform just-in-time compilation. + * Creates a project from the set of files. + * + * @param File[] $files */ - public function performsJustInTimeCompilation() : bool - { - if (\PHP_MAJOR_VERSION < 8) { - return \false; - } - if (!$this->isOpcacheActive()) { - return \false; - } - if (strpos(ini_get('opcache.jit'), '0') === 0) { - return \false; - } - return \true; - } + public function create(string $name, array $files) : Project; +} +isHHVM()) { - // @codeCoverageIgnoreStart - if ((self::$binary = getenv('PHP_BINARY')) === \false) { - self::$binary = \PHP_BINARY; - } - self::$binary = escapeshellarg(self::$binary) . ' --php' . ' -d hhvm.php7.all=1'; - // @codeCoverageIgnoreEnd - } - if (self::$binary === null && \PHP_BINARY !== '') { - self::$binary = escapeshellarg(\PHP_BINARY); - } - if (self::$binary === null) { - // @codeCoverageIgnoreStart - $possibleBinaryLocations = [\PHP_BINDIR . '/php', \PHP_BINDIR . '/php-cli.exe', \PHP_BINDIR . '/php.exe']; - foreach ($possibleBinaryLocations as $binary) { - if (is_readable($binary)) { - self::$binary = escapeshellarg($binary); - break; - } - } - // @codeCoverageIgnoreEnd - } - if (self::$binary === null) { - // @codeCoverageIgnoreStart - self::$binary = 'php'; - // @codeCoverageIgnoreEnd - } - return self::$binary; - } - public function getNameWithVersion() : string - { - return $this->getName() . ' ' . $this->getVersion(); - } - public function getNameWithVersionAndCodeCoverageDriver() : string - { - if (!$this->canCollectCodeCoverage() || $this->hasPHPDBGCodeCoverage()) { - return $this->getNameWithVersion(); - } - if ($this->hasPCOV()) { - return sprintf('%s with PCOV %s', $this->getNameWithVersion(), phpversion('pcov')); - } - if ($this->hasXdebug()) { - return sprintf('%s with Xdebug %s', $this->getNameWithVersion(), phpversion('xdebug')); - } - } - public function getName() : string - { - if ($this->isHHVM()) { - // @codeCoverageIgnoreStart - return 'HHVM'; - // @codeCoverageIgnoreEnd - } - if ($this->isPHPDBG()) { - // @codeCoverageIgnoreStart - return 'PHPDBG'; - // @codeCoverageIgnoreEnd - } - return 'PHP'; - } - public function getVendorUrl() : string + public function __construct(string $summary = '', ?DocBlock\Description $description = null, array $tags = [], ?Types\Context $context = null, ?Location $location = null, bool $isTemplateStart = \false, bool $isTemplateEnd = \false) { - if ($this->isHHVM()) { - // @codeCoverageIgnoreStart - return 'http://hhvm.com/'; - // @codeCoverageIgnoreEnd + Assert::allIsInstanceOf($tags, Tag::class); + $this->summary = $summary; + $this->description = $description ?: new DocBlock\Description(''); + foreach ($tags as $tag) { + $this->addTag($tag); } - return 'https://secure.php.net/'; + $this->context = $context; + $this->location = $location; + $this->isTemplateEnd = $isTemplateEnd; + $this->isTemplateStart = $isTemplateStart; } - public function getVersion() : string + public function getSummary() : string { - if ($this->isHHVM()) { - // @codeCoverageIgnoreStart - return HHVM_VERSION; - // @codeCoverageIgnoreEnd - } - return \PHP_VERSION; + return $this->summary; } - /** - * Returns true when the runtime used is PHP and Xdebug is loaded. - */ - public function hasXdebug() : bool + public function getDescription() : DocBlock\Description { - return ($this->isPHP() || $this->isHHVM()) && extension_loaded('xdebug'); + return $this->description; } /** - * Returns true when the runtime used is HHVM. + * Returns the current context. */ - public function isHHVM() : bool + public function getContext() : ?Types\Context { - return defined('HHVM_VERSION'); + return $this->context; } /** - * Returns true when the runtime used is PHP without the PHPDBG SAPI. + * Returns the current location. */ - public function isPHP() : bool + public function getLocation() : ?Location { - return !$this->isHHVM() && !$this->isPHPDBG(); + return $this->location; } /** - * Returns true when the runtime used is PHP with the PHPDBG SAPI. + * Returns whether this DocBlock is the start of a Template section. + * + * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker + * (`#@+`) that is appended directly after the opening `/**` of a DocBlock. + * + * An example of such an opening is: + * + * ``` + * /**#@+ + * * My DocBlock + * * / + * ``` + * + * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all + * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). + * + * @see self::isTemplateEnd() for the check whether a closing marker was provided. */ - public function isPHPDBG() : bool + public function isTemplateStart() : bool { - return \PHP_SAPI === 'phpdbg' && !$this->isHHVM(); + return $this->isTemplateStart; } /** - * Returns true when the runtime used is PHP with the PHPDBG SAPI - * and the phpdbg_*_oplog() functions are available (PHP >= 7.0). + * Returns whether this DocBlock is the end of a Template section. + * + * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. */ - public function hasPHPDBGCodeCoverage() : bool + public function isTemplateEnd() : bool { - return $this->isPHPDBG(); + return $this->isTemplateEnd; } /** - * Returns true when the runtime used is PHP with PCOV loaded and enabled. + * Returns the tags for this DocBlock. + * + * @return Tag[] */ - public function hasPCOV() : bool + public function getTags() : array { - return $this->isPHP() && extension_loaded('pcov') && ini_get('pcov.enabled'); + return $this->tags; } /** - * Parses the loaded php.ini file (if any) as well as all - * additional php.ini files from the additional ini dir for - * a list of all configuration settings loaded from files - * at startup. Then checks for each php.ini setting passed - * via the `$values` parameter whether this setting has - * been changed at runtime. Returns an array of strings - * where each string has the format `key=value` denoting - * the name of a changed php.ini setting with its new value. + * Returns an array of tags matching the given name. If no tags are found + * an empty array is returned. * - * @return string[] + * @param string $name String to search by. + * + * @return Tag[] */ - public function getCurrentSettings(array $values) : array + public function getTagsByName(string $name) : array { - $diff = []; - $files = []; - if ($file = php_ini_loaded_file()) { - $files[] = $file; - } - if ($scanned = php_ini_scanned_files()) { - $files = array_merge($files, array_map('trim', explode(",\n", $scanned))); - } - foreach ($files as $ini) { - $config = parse_ini_file($ini, \true); - foreach ($values as $value) { - $set = ini_get($value); - if (isset($config[$value]) && $set != $config[$value]) { - $diff[] = sprintf('%s=%s', $value, $set); - } + $result = []; + foreach ($this->getTags() as $tag) { + if ($tag->getName() !== $name) { + continue; } + $result[] = $tag; } - return $diff; - } - private function isOpcacheActive() : bool - { - if (!extension_loaded('Zend OPcache')) { - return \false; - } - if ((\PHP_SAPI === 'cli' || \PHP_SAPI === 'phpdbg') && ini_get('opcache.enable_cli') === '1') { - return \true; - } - if (\PHP_SAPI !== 'cli' && \PHP_SAPI !== 'phpdbg' && ini_get('opcache.enable') === '1') { - return \true; - } - return \false; + return $result; } -} -sebastian/environment - -Copyright (c) 2014-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Comparator; - -use RuntimeException; -use PHPUnit\SebastianBergmann\Diff\Differ; -use PHPUnit\SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; -/** - * Thrown when an assertion for string equality failed. - */ -class ComparisonFailure extends RuntimeException -{ - /** - * Expected value of the retrieval which does not match $actual. - * - * @var mixed - */ - protected $expected; - /** - * Actually retrieved value which does not match $expected. - * - * @var mixed - */ - protected $actual; - /** - * The string representation of the expected value. - * - * @var string - */ - protected $expectedAsString; - /** - * The string representation of the actual value. - * - * @var string - */ - protected $actualAsString; - /** - * @var bool - */ - protected $identical; /** - * Optional message which is placed in front of the first line - * returned by toString(). + * Returns an array of tags with type matching the given name. If no tags are found + * an empty array is returned. * - * @var string - */ - protected $message; - /** - * Initialises with the expected value and the actual value. + * @param string $name String to search by. * - * @param mixed $expected expected value retrieved - * @param mixed $actual actual value retrieved - * @param string $expectedAsString - * @param string $actualAsString - * @param bool $identical - * @param string $message a string which is prefixed on all returned lines - * in the difference output - */ - public function __construct($expected, $actual, $expectedAsString, $actualAsString, $identical = \false, $message = '') - { - $this->expected = $expected; - $this->actual = $actual; - $this->expectedAsString = $expectedAsString; - $this->actualAsString = $actualAsString; - $this->message = $message; - } - public function getActual() - { - return $this->actual; - } - public function getExpected() - { - return $this->expected; - } - /** - * @return string + * @return TagWithType[] */ - public function getActualAsString() + public function getTagsWithTypeByName(string $name) : array { - return $this->actualAsString; + $result = []; + foreach ($this->getTagsByName($name) as $tag) { + if (!$tag instanceof TagWithType) { + continue; + } + $result[] = $tag; + } + return $result; } /** - * @return string + * Checks if a tag of a certain type is present in this DocBlock. + * + * @param string $name Tag name to check for. */ - public function getExpectedAsString() + public function hasTag(string $name) : bool { - return $this->expectedAsString; + foreach ($this->getTags() as $tag) { + if ($tag->getName() === $name) { + return \true; + } + } + return \false; } /** - * @return string + * Remove a tag from this DocBlock. + * + * @param Tag $tagToRemove The tag to remove. */ - public function getDiff() + public function removeTag(Tag $tagToRemove) : void { - if (!$this->actualAsString && !$this->expectedAsString) { - return ''; + foreach ($this->tags as $key => $tag) { + if ($tag === $tagToRemove) { + unset($this->tags[$key]); + break; + } } - $differ = new Differ(new UnifiedDiffOutputBuilder("\n--- Expected\n+++ Actual\n")); - return $differ->diff($this->expectedAsString, $this->actualAsString); } /** - * @return string + * Adds a tag to this DocBlock. + * + * @param Tag $tag The tag to add. */ - public function toString() + private function addTag(Tag $tag) : void { - return $this->message . $this->getDiff(); + $this->tags[] = $tag; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Comparator; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock; -use function is_resource; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Formatter; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter; +use function vsprintf; /** - * Compares resources for equality. + * Object representing to description for a DocBlock. + * + * A Description object can consist of plain text but can also include tags. A Description Formatter can then combine + * a body template with sprintf-style placeholders together with formatted tags in order to reconstitute a complete + * description text using the format that you would prefer. + * + * Because parsing a Description text can be a verbose process this is handled by the {@see DescriptionFactory}. It is + * thus recommended to use that to create a Description object, like this: + * + * $description = $descriptionFactory->create('This is a {@see Description}', $context); + * + * The description factory will interpret the given body and create a body template and list of tags from them, and pass + * that onto the constructor if this class. + * + * > The $context variable is a class of type {@see \phpDocumentor\Reflection\Types\Context} and contains the namespace + * > and the namespace aliases that apply to this DocBlock. These are used by the Factory to resolve and expand partial + * > type names and FQSENs. + * + * If you do not want to use the DescriptionFactory you can pass a body template and tag listing like this: + * + * $description = new Description( + * 'This is a %1$s', + * [ new See(new Fqsen('\phpDocumentor\Reflection\DocBlock\Description')) ] + * ); + * + * It is generally recommended to use the Factory as that will also apply escaping rules, while the Description object + * is mainly responsible for rendering. + * + * @see DescriptionFactory to create a new Description. + * @see Description\Formatter for the formatting of the body and tags. */ -class ResourceComparator extends Comparator +class Description { + /** @var string */ + private $bodyTemplate; + /** @var Tag[] */ + private $tags; /** - * Returns whether the comparator can compare two values. - * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare + * Initializes a Description with its body (template) and a listing of the tags used in the body template. * - * @return bool + * @param Tag[] $tags */ - public function accepts($expected, $actual) + public function __construct(string $bodyTemplate, array $tags = []) { - return is_resource($expected) && is_resource($actual); + $this->bodyTemplate = $bodyTemplate; + $this->tags = $tags; } /** - * Asserts that two values are equal. - * - * @param mixed $expected First value to compare - * @param mixed $actual Second value to compare - * @param float $delta Allowed numerical distance between two values to consider them equal - * @param bool $canonicalize Arrays are sorted before comparison when set to true - * @param bool $ignoreCase Case is ignored when set to true - * - * @throws ComparisonFailure + * Returns the body template. */ - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = \false, $ignoreCase = \false) + public function getBodyTemplate() : string { - if ($actual != $expected) { - throw new ComparisonFailure($expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual)); - } + return $this->bodyTemplate; } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Comparator; - -use function is_float; -use function is_numeric; -/** - * Compares doubles for equality. - */ -class DoubleComparator extends NumericComparator -{ /** - * Smallest value available in PHP. + * Returns the tags for this DocBlock. * - * @var float + * @return Tag[] */ - public const EPSILON = 1.0E-10; + public function getTags() : array + { + return $this->tags; + } /** - * Returns whether the comparator can compare two values. - * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare - * - * @return bool + * Renders this description as a string where the provided formatter will format the tags in the expected string + * format. */ - public function accepts($expected, $actual) + public function render(?Formatter $formatter = null) : string { - return (is_float($expected) || is_float($actual)) && is_numeric($expected) && is_numeric($actual); + if ($formatter === null) { + $formatter = new PassthroughFormatter(); + } + $tags = []; + foreach ($this->tags as $tag) { + $tags[] = '{' . $formatter->format($tag) . '}'; + } + return vsprintf($this->bodyTemplate, $tags); } /** - * Asserts that two values are equal. - * - * @param mixed $expected First value to compare - * @param mixed $actual Second value to compare - * @param float $delta Allowed numerical distance between two values to consider them equal - * @param bool $canonicalize Arrays are sorted before comparison when set to true - * @param bool $ignoreCase Case is ignored when set to true - * - * @throws ComparisonFailure + * Returns a plain string representation of this description. */ - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = \false, $ignoreCase = \false) + public function __toString() : string { - if ($delta == 0) { - $delta = self::EPSILON; - } - parent::assertEquals($expected, $actual, $delta, $canonicalize, $ignoreCase); + return $this->render(); } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Comparator; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock; -use function abs; -use function is_float; -use function is_infinite; -use function is_nan; -use function is_numeric; -use function is_string; -use function sprintf; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\phpDocumentor\Reflection\Utils; +use function count; +use function implode; +use function ltrim; +use function min; +use function str_replace; +use function strlen; +use function strpos; +use function substr; +use function trim; +use const PREG_SPLIT_DELIM_CAPTURE; /** - * Compares numerical values for equality. + * Creates a new Description object given a body of text. + * + * Descriptions in phpDocumentor are somewhat complex entities as they can contain one or more tags inside their + * body that can be replaced with a readable output. The replacing is done by passing a Formatter object to the + * Description object's `render` method. + * + * In addition to the above does a Description support two types of escape sequences: + * + * 1. `{@}` to escape the `@` character to prevent it from being interpreted as part of a tag, i.e. `{{@}link}` + * 2. `{}` to escape the `}` character, this can be used if you want to use the `}` character in the description + * of an inline tag. + * + * If a body consists of multiple lines then this factory will also remove any superfluous whitespace at the beginning + * of each line while maintaining any indentation that is used. This will prevent formatting parsers from tripping + * over unexpected spaces as can be observed with tag descriptions. */ -class NumericComparator extends ScalarComparator +class DescriptionFactory { + /** @var TagFactory */ + private $tagFactory; /** - * Returns whether the comparator can compare two values. - * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare - * - * @return bool + * Initializes this factory with the means to construct (inline) tags. */ - public function accepts($expected, $actual) + public function __construct(TagFactory $tagFactory) { - // all numerical values, but not if one of them is a double - // or both of them are strings - return is_numeric($expected) && is_numeric($actual) && !(is_float($expected) || is_float($actual)) && !(is_string($expected) && is_string($actual)); + $this->tagFactory = $tagFactory; } /** - * Asserts that two values are equal. - * - * @param mixed $expected First value to compare - * @param mixed $actual Second value to compare - * @param float $delta Allowed numerical distance between two values to consider them equal - * @param bool $canonicalize Arrays are sorted before comparison when set to true - * @param bool $ignoreCase Case is ignored when set to true - * - * @throws ComparisonFailure + * Returns the parsed text of this description. */ - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = \false, $ignoreCase = \false) + public function create(string $contents, ?TypeContext $context = null) : Description { - if ($this->isInfinite($actual) && $this->isInfinite($expected)) { - return; + $tokens = $this->lex($contents); + $count = count($tokens); + $tagCount = 0; + $tags = []; + for ($i = 1; $i < $count; $i += 2) { + $tags[] = $this->tagFactory->create($tokens[$i], $context); + $tokens[$i] = '%' . ++$tagCount . '$s'; } - if (($this->isInfinite($actual) xor $this->isInfinite($expected)) || ($this->isNan($actual) || $this->isNan($expected)) || abs($actual - $expected) > $delta) { - throw new ComparisonFailure($expected, $actual, '', '', \false, sprintf('Failed asserting that %s matches expected %s.', $this->exporter->export($actual), $this->exporter->export($expected))); + //In order to allow "literal" inline tags, the otherwise invalid + //sequence "{@}" is changed to "@", and "{}" is changed to "}". + //"%" is escaped to "%%" because of vsprintf. + //See unit tests for examples. + for ($i = 0; $i < $count; $i += 2) { + $tokens[$i] = str_replace(['{@}', '{}', '%'], ['@', '}', '%%'], $tokens[$i]); } + return new Description(implode('', $tokens), $tags); } - private function isInfinite($value) : bool + /** + * Strips the contents from superfluous whitespace and splits the description into a series of tokens. + * + * @return string[] A series of tokens of which the description text is composed. + */ + private function lex(string $contents) : array { - return is_float($value) && is_infinite($value); + $contents = $this->removeSuperfluousStartingWhitespace($contents); + // performance optimalization; if there is no inline tag, don't bother splitting it up. + if (strpos($contents, '{@') === \false) { + return [$contents]; + } + return Utils::pregSplit('/\\{ + # "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally. + (?!@\\}) + # We want to capture the whole tag line, but without the inline tag delimiters. + (\\@ + # Match everything up to the next delimiter. + [^{}]* + # Nested inline tag content should not be captured, or it will appear in the result separately. + (?: + # Match nested inline tags. + (?: + # Because we did not catch the tag delimiters earlier, we must be explicit with them here. + # Notice that this also matches "{}", as a way to later introduce it as an escape sequence. + \\{(?1)?\\} + | + # Make sure we match hanging "{". + \\{ + ) + # Match content after the nested inline tag. + [^{}]* + )* # If there are more inline tags, match them as well. We use "*" since there may not be any + # nested inline tags. + ) + \\}/Sux', $contents, 0, PREG_SPLIT_DELIM_CAPTURE); } - private function isNan($value) : bool + /** + * Removes the superfluous from a multi-line description. + * + * When a description has more than one line then it can happen that the second and subsequent lines have an + * additional indentation. This is commonly in use with tags like this: + * + * {@}since 1.1.0 This is an example + * description where we have an + * indentation in the second and + * subsequent lines. + * + * If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent + * lines and this may cause rendering issues when, for example, using a Markdown converter. + */ + private function removeSuperfluousStartingWhitespace(string $contents) : string { - return is_float($value) && is_nan($value); + $lines = Utils::pregSplit("/\r\n?|\n/", $contents); + // if there is only one line then we don't have lines with superfluous whitespace and + // can use the contents as-is + if (count($lines) <= 1) { + return $contents; + } + // determine how many whitespace characters need to be stripped + $startingSpaceCount = 9999999; + for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { + // lines with a no length do not count as they are not indented at all + if (trim($lines[$i]) === '') { + continue; + } + // determine the number of prefixing spaces by checking the difference in line length before and after + // an ltrim + $startingSpaceCount = min($startingSpaceCount, strlen($lines[$i]) - strlen(ltrim($lines[$i]))); + } + // strip the number of spaces from each line + if ($startingSpaceCount > 0) { + for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { + $lines[$i] = substr($lines[$i], $startingSpaceCount); + } + } + return implode("\n", $lines); } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Comparator; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock; -use function array_unshift; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Example; +use function array_slice; +use function file; +use function getcwd; +use function implode; +use function is_readable; +use function rtrim; +use function sprintf; +use function trim; +use const DIRECTORY_SEPARATOR; /** - * Factory for comparators which compare values for equality. + * Class used to find an example file's location based on a given ExampleDescriptor. */ -class Factory +class ExampleFinder { + /** @var string */ + private $sourceDirectory = ''; + /** @var string[] */ + private $exampleDirectories = []; /** - * @var Factory - */ - private static $instance; - /** - * @var Comparator[] - */ - private $customComparators = []; - /** - * @var Comparator[] + * Attempts to find the example contents for the given descriptor. */ - private $defaultComparators = []; + public function find(Example $example) : string + { + $filename = $example->getFilePath(); + $file = $this->getExampleFileContents($filename); + if (!$file) { + return sprintf('** File not found : %s **', $filename); + } + return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount())); + } /** - * @return Factory + * Registers the project's root directory where an 'examples' folder can be expected. */ - public static function getInstance() + public function setSourceDirectory(string $directory = '') : void { - if (self::$instance === null) { - self::$instance = new self(); - // @codeCoverageIgnore - } - return self::$instance; + $this->sourceDirectory = $directory; } /** - * Constructs a new factory. + * Returns the project's root directory where an 'examples' folder can be expected. */ - public function __construct() + public function getSourceDirectory() : string { - $this->registerDefaultComparators(); + return $this->sourceDirectory; } /** - * Returns the correct comparator for comparing two values. - * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare + * Registers a series of directories that may contain examples. * - * @return Comparator + * @param string[] $directories */ - public function getComparatorFor($expected, $actual) + public function setExampleDirectories(array $directories) : void { - foreach ($this->customComparators as $comparator) { - if ($comparator->accepts($expected, $actual)) { - return $comparator; - } - } - foreach ($this->defaultComparators as $comparator) { - if ($comparator->accepts($expected, $actual)) { - return $comparator; - } - } - throw new RuntimeException('No suitable Comparator implementation found'); + $this->exampleDirectories = $directories; } /** - * Registers a new comparator. - * - * This comparator will be returned by getComparatorFor() if its accept() method - * returns TRUE for the compared values. It has higher priority than the - * existing comparators, meaning that its accept() method will be invoked - * before those of the other comparators. + * Returns a series of directories that may contain examples. * - * @param Comparator $comparator The comparator to be registered + * @return string[] */ - public function register(Comparator $comparator) + public function getExampleDirectories() : array { - array_unshift($this->customComparators, $comparator); - $comparator->setFactory($this); + return $this->exampleDirectories; } /** - * Unregisters a comparator. + * Attempts to find the requested example file and returns its contents or null if no file was found. * - * This comparator will no longer be considered by getComparatorFor(). + * This method will try several methods in search of the given example file, the first one it encounters is + * returned: * - * @param Comparator $comparator The comparator to be unregistered + * 1. Iterates through all examples folders for the given filename + * 2. Checks the source folder for the given filename + * 3. Checks the 'examples' folder in the current working directory for examples + * 4. Checks the path relative to the current working directory for the given filename + * + * @return string[] all lines of the example file */ - public function unregister(Comparator $comparator) + private function getExampleFileContents(string $filename) : ?array { - foreach ($this->customComparators as $key => $_comparator) { - if ($comparator === $_comparator) { - unset($this->customComparators[$key]); + $normalizedPath = null; + foreach ($this->exampleDirectories as $directory) { + $exampleFileFromConfig = $this->constructExamplePath($directory, $filename); + if (is_readable($exampleFileFromConfig)) { + $normalizedPath = $exampleFileFromConfig; + break; } } - } - /** - * Unregisters all non-default comparators. - */ - public function reset() - { - $this->customComparators = []; - } - private function registerDefaultComparators() : void - { - $this->registerDefaultComparator(new MockObjectComparator()); - $this->registerDefaultComparator(new DateTimeComparator()); - $this->registerDefaultComparator(new DOMNodeComparator()); - $this->registerDefaultComparator(new SplObjectStorageComparator()); - $this->registerDefaultComparator(new ExceptionComparator()); - $this->registerDefaultComparator(new ObjectComparator()); - $this->registerDefaultComparator(new ResourceComparator()); - $this->registerDefaultComparator(new ArrayComparator()); - $this->registerDefaultComparator(new DoubleComparator()); - $this->registerDefaultComparator(new NumericComparator()); - $this->registerDefaultComparator(new ScalarComparator()); - $this->registerDefaultComparator(new TypeComparator()); - } - private function registerDefaultComparator(Comparator $comparator) : void - { - $this->defaultComparators[] = $comparator; - $comparator->setFactory($this); - } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Comparator; - -use function sprintf; -use function strtolower; -use DOMDocument; -use DOMNode; -use ValueError; -/** - * Compares DOMNode instances for equality. - */ -class DOMNodeComparator extends ObjectComparator -{ + if (!$normalizedPath) { + if (is_readable($this->getExamplePathFromSource($filename))) { + $normalizedPath = $this->getExamplePathFromSource($filename); + } elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) { + $normalizedPath = $this->getExamplePathFromExampleDirectory($filename); + } elseif (is_readable($filename)) { + $normalizedPath = $filename; + } + } + $lines = $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : \false; + return $lines !== \false ? $lines : null; + } /** - * Returns whether the comparator can compare two values. - * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare - * - * @return bool + * Get example filepath based on the example directory inside your project. */ - public function accepts($expected, $actual) + private function getExamplePathFromExampleDirectory(string $file) : string { - return $expected instanceof DOMNode && $actual instanceof DOMNode; + return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file; } /** - * Asserts that two values are equal. - * - * @param mixed $expected First value to compare - * @param mixed $actual Second value to compare - * @param float $delta Allowed numerical distance between two values to consider them equal - * @param bool $canonicalize Arrays are sorted before comparison when set to true - * @param bool $ignoreCase Case is ignored when set to true - * @param array $processed List of already processed elements (used to prevent infinite recursion) - * - * @throws ComparisonFailure + * Returns a path to the example file in the given directory.. */ - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = \false, $ignoreCase = \false, array &$processed = []) + private function constructExamplePath(string $directory, string $file) : string { - $expectedAsString = $this->nodeToText($expected, \true, $ignoreCase); - $actualAsString = $this->nodeToText($actual, \true, $ignoreCase); - if ($expectedAsString !== $actualAsString) { - $type = $expected instanceof DOMDocument ? 'documents' : 'nodes'; - throw new ComparisonFailure($expected, $actual, $expectedAsString, $actualAsString, \false, sprintf("Failed asserting that two DOM %s are equal.\n", $type)); - } + return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file; } /** - * Returns the normalized, whitespace-cleaned, and indented textual - * representation of a DOMNode. + * Get example filepath based on sourcecode. */ - private function nodeToText(DOMNode $node, bool $canonicalize, bool $ignoreCase) : string + private function getExamplePathFromSource(string $file) : string { - if ($canonicalize) { - $document = new DOMDocument(); - try { - @$document->loadXML($node->C14N()); - } catch (ValueError $e) { - } - $node = $document; - } - $document = $node instanceof DOMDocument ? $node : $node->ownerDocument; - $document->formatOutput = \true; - $document->normalizeDocument(); - $text = $node instanceof DOMDocument ? $node->saveXML() : $document->saveXML($node); - return $ignoreCase ? strtolower($text) : $text; + return sprintf('%s%s%s', trim($this->getSourceDirectory(), '\\/'), DIRECTORY_SEPARATOR, trim($file, '"')); } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Comparator; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock; -use function get_class; -use function in_array; -use function is_object; +use PHPUnit\phpDocumentor\Reflection\DocBlock; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Formatter; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter; use function sprintf; -use function substr_replace; +use function str_repeat; +use function str_replace; +use function strlen; +use function wordwrap; /** - * Compares objects for equality. + * Converts a DocBlock back from an object to a complete DocComment including Asterisks. */ -class ObjectComparator extends ArrayComparator +class Serializer { + /** @var string The string to indent the comment with. */ + protected $indentString = ' '; + /** @var int The number of times the indent string is repeated. */ + protected $indent = 0; + /** @var bool Whether to indent the first line with the given indent amount and string. */ + protected $isFirstLineIndented = \true; + /** @var int|null The max length of a line. */ + protected $lineLength; + /** @var Formatter A custom tag formatter. */ + protected $tagFormatter; + /** @var string */ + private $lineEnding; /** - * Returns whether the comparator can compare two values. - * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare + * Create a Serializer instance. * - * @return bool + * @param int $indent The number of times the indent string is repeated. + * @param string $indentString The string to indent the comment with. + * @param bool $indentFirstLine Whether to indent the first line. + * @param int|null $lineLength The max length of a line or NULL to disable line wrapping. + * @param Formatter $tagFormatter A custom tag formatter, defaults to PassthroughFormatter. + * @param string $lineEnding Line ending used in the output, by default \n is used. */ - public function accepts($expected, $actual) + public function __construct(int $indent = 0, string $indentString = ' ', bool $indentFirstLine = \true, ?int $lineLength = null, ?Formatter $tagFormatter = null, string $lineEnding = "\n") { - return is_object($expected) && is_object($actual); + $this->indent = $indent; + $this->indentString = $indentString; + $this->isFirstLineIndented = $indentFirstLine; + $this->lineLength = $lineLength; + $this->tagFormatter = $tagFormatter ?: new PassthroughFormatter(); + $this->lineEnding = $lineEnding; } /** - * Asserts that two values are equal. + * Generate a DocBlock comment. * - * @param mixed $expected First value to compare - * @param mixed $actual Second value to compare - * @param float $delta Allowed numerical distance between two values to consider them equal - * @param bool $canonicalize Arrays are sorted before comparison when set to true - * @param bool $ignoreCase Case is ignored when set to true - * @param array $processed List of already processed elements (used to prevent infinite recursion) + * @param DocBlock $docblock The DocBlock to serialize. * - * @throws ComparisonFailure + * @return string The serialized doc block. */ - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = \false, $ignoreCase = \false, array &$processed = []) + public function getDocComment(DocBlock $docblock) : string { - if (get_class($actual) !== get_class($expected)) { - throw new ComparisonFailure($expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual), \false, sprintf('%s is not instance of expected class "%s".', $this->exporter->export($actual), get_class($expected))); - } - // don't compare twice to allow for cyclic dependencies - if (in_array([$actual, $expected], $processed, \true) || in_array([$expected, $actual], $processed, \true)) { - return; + $indent = str_repeat($this->indentString, $this->indent); + $firstIndent = $this->isFirstLineIndented ? $indent : ''; + // 3 === strlen(' * ') + $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null; + $text = $this->removeTrailingSpaces($indent, $this->addAsterisksForEachLine($indent, $this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength))); + $comment = $firstIndent . "/**\n"; + if ($text) { + $comment .= $indent . ' * ' . $text . "\n"; + $comment .= $indent . " *\n"; } - $processed[] = [$actual, $expected]; - // don't compare objects if they are identical - // this helps to avoid the error "maximum function nesting level reached" - // CAUTION: this conditional clause is not tested - if ($actual !== $expected) { - try { - parent::assertEquals($this->toArray($expected), $this->toArray($actual), $delta, $canonicalize, $ignoreCase, $processed); - } catch (ComparisonFailure $e) { - throw new ComparisonFailure( - $expected, - $actual, - // replace "Array" with "MyClass object" - substr_replace($e->getExpectedAsString(), get_class($expected) . ' Object', 0, 5), - substr_replace($e->getActualAsString(), get_class($actual) . ' Object', 0, 5), - \false, - 'Failed asserting that two objects are equal.' - ); - } + $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment); + return str_replace("\n", $this->lineEnding, $comment . $indent . ' */'); + } + private function removeTrailingSpaces(string $indent, string $text) : string + { + return str_replace(sprintf("\n%s * \n", $indent), sprintf("\n%s *\n", $indent), $text); + } + private function addAsterisksForEachLine(string $indent, string $text) : string + { + return str_replace("\n", sprintf("\n%s * ", $indent), $text); + } + private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, ?int $wrapLength) : string + { + $text = $docblock->getSummary() . ((string) $docblock->getDescription() ? "\n\n" . $docblock->getDescription() : ''); + if ($wrapLength !== null) { + $text = wordwrap($text, $wrapLength); + return $text; } + return $text; } - /** - * Converts an object to an array containing all of its private, protected - * and public properties. - * - * @param object $object - * - * @return array - */ - protected function toArray($object) + private function addTagBlock(DocBlock $docblock, ?int $wrapLength, string $indent, string $comment) : string { - return $this->exporter->toArray($object); + foreach ($docblock->getTags() as $tag) { + $tagText = $this->tagFormatter->format($tag); + if ($wrapLength !== null) { + $tagText = wordwrap($tagText, $wrapLength); + } + $tagText = str_replace("\n", sprintf("\n%s * ", $indent), $tagText); + $comment .= sprintf("%s * %s\n", $indent, $tagText); + } + return $comment; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Comparator; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock; -use function is_object; -use function is_scalar; -use function is_string; -use function method_exists; -use function sprintf; -use function strtolower; +use InvalidArgumentException; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Author; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Covers; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Deprecated; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Generic; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\InvalidTag; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Link as LinkTag; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Method; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Param; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Property; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\PropertyRead; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Return_; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\See as SeeTag; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Since; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Source; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Throws; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Uses; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Var_; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Version; +use PHPUnit\phpDocumentor\Reflection\FqsenResolver; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use ReflectionMethod; +use ReflectionNamedType; +use ReflectionParameter; +use PHPUnit\Webmozart\Assert\Assert; +use function array_merge; +use function array_slice; +use function call_user_func_array; +use function count; +use function get_class; +use function preg_match; +use function strpos; +use function trim; /** - * Compares scalar or NULL values for equality. + * Creates a Tag object given the contents of a tag. + * + * This Factory is capable of determining the appropriate class for a tag and instantiate it using its `create` + * factory method. The `create` factory method of a Tag can have a variable number of arguments; this way you can + * pass the dependencies that you need to construct a tag object. + * + * > Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise + * > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to + * > verify that a dependency is actually passed. + * + * This Factory also features a Service Locator component that is used to pass the right dependencies to the + * `create` method of a tag; each dependency should be registered as a service or as a parameter. + * + * When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass + * the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface. */ -class ScalarComparator extends Comparator +final class StandardTagFactory implements TagFactory { + /** PCRE regular expression matching a tag name. */ + public const REGEX_TAGNAME = '[\\w\\-\\_\\\\:]+'; /** - * Returns whether the comparator can compare two values. + * @var array> An array with a tag as a key, and an + * FQCN to a class that handles it as an array value. + */ + private $tagHandlerMappings = [ + 'author' => Author::class, + 'covers' => Covers::class, + 'deprecated' => Deprecated::class, + // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example', + 'link' => LinkTag::class, + 'method' => Method::class, + 'param' => Param::class, + 'property-read' => PropertyRead::class, + 'property' => Property::class, + 'property-write' => PropertyWrite::class, + 'return' => Return_::class, + 'see' => SeeTag::class, + 'since' => Since::class, + 'source' => Source::class, + 'throw' => Throws::class, + 'throws' => Throws::class, + 'uses' => Uses::class, + 'var' => Var_::class, + 'version' => Version::class, + ]; + /** + * @var array> An array with a anotation s a key, and an + * FQCN to a class that handles it as an array value. + */ + private $annotationMappings = []; + /** + * @var ReflectionParameter[][] a lazy-loading cache containing parameters + * for each tagHandler that has been used. + */ + private $tagHandlerParameterCache = []; + /** @var FqsenResolver */ + private $fqsenResolver; + /** + * @var mixed[] an array representing a simple Service Locator where we can store parameters and + * services that can be inserted into the Factory Methods of Tag Handlers. + */ + private $serviceLocator = []; + /** + * Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers. * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare + * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property + * is used. * - * @return bool + * @see self::registerTagHandler() to add a new tag handler to the existing default list. * - * @since Method available since Release 3.6.0 + * @param array> $tagHandlers */ - public function accepts($expected, $actual) + public function __construct(FqsenResolver $fqsenResolver, ?array $tagHandlers = null) { - return (is_scalar($expected) xor null === $expected) && (is_scalar($actual) xor null === $actual) || is_string($expected) && is_object($actual) && method_exists($actual, '__toString') || is_object($expected) && method_exists($expected, '__toString') && is_string($actual); + $this->fqsenResolver = $fqsenResolver; + if ($tagHandlers !== null) { + $this->tagHandlerMappings = $tagHandlers; + } + $this->addService($fqsenResolver, FqsenResolver::class); + } + public function create(string $tagLine, ?TypeContext $context = null) : Tag + { + if (!$context) { + $context = new TypeContext(''); + } + [$tagName, $tagBody] = $this->extractTagParts($tagLine); + return $this->createTag(trim($tagBody), $tagName, $context); } /** - * Asserts that two values are equal. - * - * @param mixed $expected First value to compare - * @param mixed $actual Second value to compare - * @param float $delta Allowed numerical distance between two values to consider them equal - * @param bool $canonicalize Arrays are sorted before comparison when set to true - * @param bool $ignoreCase Case is ignored when set to true - * - * @throws ComparisonFailure + * @param mixed $value */ - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = \false, $ignoreCase = \false) + public function addParameter(string $name, $value) : void { - $expectedToCompare = $expected; - $actualToCompare = $actual; - // always compare as strings to avoid strange behaviour - // otherwise 0 == 'Foobar' - if (is_string($expected) || is_string($actual)) { - $expectedToCompare = (string) $expectedToCompare; - $actualToCompare = (string) $actualToCompare; - if ($ignoreCase) { - $expectedToCompare = strtolower($expectedToCompare); - $actualToCompare = strtolower($actualToCompare); - } - } - if ($expectedToCompare !== $actualToCompare && is_string($expected) && is_string($actual)) { - throw new ComparisonFailure($expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual), \false, 'Failed asserting that two strings are equal.'); - } - if ($expectedToCompare != $actualToCompare) { - throw new ComparisonFailure( - $expected, - $actual, - // no diff is required - '', - '', - \false, - sprintf('Failed asserting that %s matches expected %s.', $this->exporter->export($actual), $this->exporter->export($expected)) - ); + $this->serviceLocator[$name] = $value; + } + public function addService(object $service, ?string $alias = null) : void + { + $this->serviceLocator[$alias ?: get_class($service)] = $service; + } + public function registerTagHandler(string $tagName, string $handler) : void + { + Assert::stringNotEmpty($tagName); + Assert::classExists($handler); + Assert::implementsInterface($handler, Tag::class); + if (strpos($tagName, '\\') && $tagName[0] !== '\\') { + throw new InvalidArgumentException('A namespaced tag must have a leading backslash as it must be fully qualified'); } + $this->tagHandlerMappings[$tagName] = $handler; } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Comparator; - -use function abs; -use function floor; -use function sprintf; -use DateInterval; -use DateTime; -use DateTimeInterface; -use DateTimeZone; -use Exception; -/** - * Compares DateTimeInterface instances for equality. - */ -class DateTimeComparator extends ObjectComparator -{ /** - * Returns whether the comparator can compare two values. - * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare + * Extracts all components for a tag. * - * @return bool + * @return string[] */ - public function accepts($expected, $actual) + private function extractTagParts(string $tagLine) : array { - return ($expected instanceof DateTime || $expected instanceof DateTimeInterface) && ($actual instanceof DateTime || $actual instanceof DateTimeInterface); + $matches = []; + if (!preg_match('/^@(' . self::REGEX_TAGNAME . ')((?:[\\s\\(\\{])\\s*([^\\s].*)|$)/us', $tagLine, $matches)) { + throw new InvalidArgumentException('The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors'); + } + if (count($matches) < 3) { + $matches[] = ''; + } + return array_slice($matches, 1); } /** - * Asserts that two values are equal. - * - * @param mixed $expected First value to compare - * @param mixed $actual Second value to compare - * @param float $delta Allowed numerical distance between two values to consider them equal - * @param bool $canonicalize Arrays are sorted before comparison when set to true - * @param bool $ignoreCase Case is ignored when set to true - * @param array $processed List of already processed elements (used to prevent infinite recursion) - * - * @throws Exception - * @throws ComparisonFailure + * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the + * body was invalid. */ - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = \false, $ignoreCase = \false, array &$processed = []) + private function createTag(string $body, string $name, TypeContext $context) : Tag { - /** @var DateTimeInterface $expected */ - /** @var DateTimeInterface $actual */ - $absDelta = abs($delta); - $delta = new DateInterval(sprintf('PT%dS', $absDelta)); - $delta->f = $absDelta - floor($absDelta); - $actualClone = (clone $actual)->setTimezone(new DateTimeZone('UTC')); - $expectedLower = (clone $expected)->setTimezone(new DateTimeZone('UTC'))->sub($delta); - $expectedUpper = (clone $expected)->setTimezone(new DateTimeZone('UTC'))->add($delta); - if ($actualClone < $expectedLower || $actualClone > $expectedUpper) { - throw new ComparisonFailure($expected, $actual, $this->dateTimeToString($expected), $this->dateTimeToString($actual), \false, 'Failed asserting that two DateTime objects are equal.'); + $handlerClassName = $this->findHandlerClassName($name, $context); + $arguments = $this->getArgumentsForParametersFromWiring($this->fetchParametersForHandlerFactoryMethod($handlerClassName), $this->getServiceLocatorWithDynamicParameters($context, $name, $body)); + try { + $callable = [$handlerClassName, 'create']; + Assert::isCallable($callable); + /** @phpstan-var callable(string): ?Tag $callable */ + $tag = call_user_func_array($callable, $arguments); + return $tag ?? InvalidTag::create($body, $name); + } catch (InvalidArgumentException $e) { + return InvalidTag::create($body, $name)->withError($e); } } /** - * Returns an ISO 8601 formatted string representation of a datetime or - * 'Invalid DateTimeInterface object' if the provided DateTimeInterface was not properly - * initialized. + * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`). + * + * @return class-string */ - private function dateTimeToString(DateTimeInterface $datetime) : string + private function findHandlerClassName(string $tagName, TypeContext $context) : string { - $string = $datetime->format('Y-m-d\\TH:i:s.uO'); - return $string ?: 'Invalid DateTimeInterface object'; + $handlerClassName = Generic::class; + if (isset($this->tagHandlerMappings[$tagName])) { + $handlerClassName = $this->tagHandlerMappings[$tagName]; + } elseif ($this->isAnnotation($tagName)) { + // TODO: Annotation support is planned for a later stage and as such is disabled for now + $tagName = (string) $this->fqsenResolver->resolve($tagName, $context); + if (isset($this->annotationMappings[$tagName])) { + $handlerClassName = $this->annotationMappings[$tagName]; + } + } + return $handlerClassName; } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Comparator; - -use function gettype; -use function sprintf; -/** - * Compares values for type equality. - */ -class TypeComparator extends Comparator -{ /** - * Returns whether the comparator can compare two values. + * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters. * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare + * @param ReflectionParameter[] $parameters + * @param mixed[] $locator * - * @return bool + * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters + * is provided with this method. */ - public function accepts($expected, $actual) + private function getArgumentsForParametersFromWiring(array $parameters, array $locator) : array { - return \true; + $arguments = []; + foreach ($parameters as $parameter) { + $type = $parameter->getType(); + $typeHint = null; + if ($type instanceof ReflectionNamedType) { + $typeHint = $type->getName(); + if ($typeHint === 'self') { + $declaringClass = $parameter->getDeclaringClass(); + if ($declaringClass !== null) { + $typeHint = $declaringClass->getName(); + } + } + } + if (isset($locator[$typeHint])) { + $arguments[] = $locator[$typeHint]; + continue; + } + $parameterName = $parameter->getName(); + if (isset($locator[$parameterName])) { + $arguments[] = $locator[$parameterName]; + continue; + } + $arguments[] = null; + } + return $arguments; } /** - * Asserts that two values are equal. + * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given + * tag handler class name. * - * @param mixed $expected First value to compare - * @param mixed $actual Second value to compare - * @param float $delta Allowed numerical distance between two values to consider them equal - * @param bool $canonicalize Arrays are sorted before comparison when set to true - * @param bool $ignoreCase Case is ignored when set to true + * @param class-string $handlerClassName * - * @throws ComparisonFailure + * @return ReflectionParameter[] */ - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = \false, $ignoreCase = \false) + private function fetchParametersForHandlerFactoryMethod(string $handlerClassName) : array { - if (gettype($expected) != gettype($actual)) { - throw new ComparisonFailure( - $expected, - $actual, - // we don't need a diff - '', - '', - \false, - sprintf('%s does not match expected type "%s".', $this->exporter->shortenedExport($actual), gettype($expected)) - ); + if (!isset($this->tagHandlerParameterCache[$handlerClassName])) { + $methodReflection = new ReflectionMethod($handlerClassName, 'create'); + $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters(); } + return $this->tagHandlerParameterCache[$handlerClassName]; } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Comparator; - -use Exception; -/** - * Compares Exception instances for equality. - */ -class ExceptionComparator extends ObjectComparator -{ /** - * Returns whether the comparator can compare two values. + * Returns a copy of this class' Service Locator with added dynamic parameters, + * such as the tag's name, body and Context. * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare + * @param TypeContext $context The Context (namespace and aliasses) that may be + * passed and is used to resolve FQSENs. + * @param string $tagName The name of the tag that may be + * passed onto the factory method of the Tag class. + * @param string $tagBody The body of the tag that may be + * passed onto the factory method of the Tag class. * - * @return bool + * @return mixed[] */ - public function accepts($expected, $actual) + private function getServiceLocatorWithDynamicParameters(TypeContext $context, string $tagName, string $tagBody) : array { - return $expected instanceof Exception && $actual instanceof Exception; + return array_merge($this->serviceLocator, ['name' => $tagName, 'body' => $tagBody, TypeContext::class => $context]); } /** - * Converts an object to an array containing all of its private, protected - * and public properties. - * - * @param object $object + * Returns whether the given tag belongs to an annotation. * - * @return array + * @todo this method should be populated once we implement Annotation notation support. */ - protected function toArray($object) + private function isAnnotation(string $tagContent) : bool { - $array = parent::toArray($object); - unset($array['file'], $array['line'], $array['trace'], $array['string'], $array['xdebug_message']); - return $array; + // 1. Contains a namespace separator + // 2. Contains parenthesis + // 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part + // of the annotation class name matches the found tag name + return \false; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Comparator; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock; -final class RuntimeException extends \RuntimeException implements Exception +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Formatter; +interface Tag { + public function getName() : string; + /** + * @return Tag|mixed Class that implements Tag + * @phpstan-return ?Tag + */ + public static function create(string $body); + public function render(?Formatter $formatter = null) : string; + public function __toString() : string; } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Comparator; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock; -use Throwable; -interface Exception extends Throwable +use InvalidArgumentException; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +interface TagFactory { + /** + * Adds a parameter to the service locator that can be injected in a tag's factory method. + * + * When calling a tag's "create" method we always check the signature for dependencies to inject. One way is to + * typehint a parameter in the signature so that we can use that interface or class name to inject a dependency + * (see {@see addService()} for more information on that). + * + * Another way is to check the name of the argument against the names in the Service Locator. With this method + * you can add a variable that will be inserted when a tag's create method is not typehinted and has a matching + * name. + * + * Be aware that there are two reserved names: + * + * - name, representing the name of the tag. + * - body, representing the complete body of the tag. + * + * These parameters are injected at the last moment and will override any existing parameter with those names. + * + * @param mixed $value + */ + public function addParameter(string $name, $value) : void; + /** + * Factory method responsible for instantiating the correct sub type. + * + * @param string $tagLine The text for this tag, including description. + * + * @return Tag A new tag object. + * + * @throws InvalidArgumentException If an invalid tag line was presented. + */ + public function create(string $tagLine, ?TypeContext $context = null) : Tag; + /** + * Registers a service with the Service Locator using the FQCN of the class or the alias, if provided. + * + * When calling a tag's "create" method we always check the signature for dependencies to inject. If a parameter + * has a typehint then the ServiceLocator is queried to see if a Service is registered for that typehint. + * + * Because interfaces are regularly used as type-hints this method provides an alias parameter; if the FQCN of the + * interface is passed as alias then every time that interface is requested the provided service will be returned. + */ + public function addService(object $service) : void; + /** + * Registers a handler for tags. + * + * If you want to use your own tags then you can use this method to instruct the TagFactory + * to register the name of a tag with the FQCN of a 'Tag Handler'. The Tag handler should implement + * the {@see Tag} interface (and thus the create method). + * + * @param string $tagName Name of tag to register a handler for. When registering a namespaced + * tag, the full name, along with a prefixing slash MUST be provided. + * @param class-string $handler FQCN of handler. + * + * @throws InvalidArgumentException If the tag name is not a string. + * @throws InvalidArgumentException If the tag name is namespaced (contains backslashes) but + * does not start with a backslash. + * @throws InvalidArgumentException If the handler is not a string. + * @throws InvalidArgumentException If the handler is not an existing class. + * @throws InvalidArgumentException If the handler does not implement the {@see Tag} interface. + */ + public function registerTagHandler(string $tagName, string $handler) : void; } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Comparator; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -use SplObjectStorage; +use InvalidArgumentException; +use function filter_var; +use function preg_match; +use function trim; +use const FILTER_VALIDATE_EMAIL; /** - * Compares \SplObjectStorage instances for equality. + * Reflection class for an {@}author tag in a Docblock. */ -class SplObjectStorageComparator extends Comparator +final class Author extends BaseTag implements Factory\StaticMethod { + /** @var string register that this is the author tag. */ + protected $name = 'author'; + /** @var string The name of the author */ + private $authorName; + /** @var string The email of the author */ + private $authorEmail; /** - * Returns whether the comparator can compare two values. - * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare - * - * @return bool + * Initializes this tag with the author name and e-mail. */ - public function accepts($expected, $actual) + public function __construct(string $authorName, string $authorEmail) { - return $expected instanceof SplObjectStorage && $actual instanceof SplObjectStorage; + if ($authorEmail && !filter_var($authorEmail, FILTER_VALIDATE_EMAIL)) { + throw new InvalidArgumentException('The author tag does not have a valid e-mail address'); + } + $this->authorName = $authorName; + $this->authorEmail = $authorEmail; } /** - * Asserts that two values are equal. + * Gets the author's name. * - * @param mixed $expected First value to compare - * @param mixed $actual Second value to compare - * @param float $delta Allowed numerical distance between two values to consider them equal - * @param bool $canonicalize Arrays are sorted before comparison when set to true - * @param bool $ignoreCase Case is ignored when set to true + * @return string The author's name. + */ + public function getAuthorName() : string + { + return $this->authorName; + } + /** + * Returns the author's email. * - * @throws ComparisonFailure + * @return string The author's email. */ - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = \false, $ignoreCase = \false) + public function getEmail() : string { - foreach ($actual as $object) { - if (!$expected->contains($object)) { - throw new ComparisonFailure($expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual), \false, 'Failed asserting that two objects are equal.'); - } + return $this->authorEmail; + } + /** + * Returns this tag in string form. + */ + public function __toString() : string + { + if ($this->authorEmail) { + $authorEmail = '<' . $this->authorEmail . '>'; + } else { + $authorEmail = ''; } - foreach ($expected as $object) { - if (!$actual->contains($object)) { - throw new ComparisonFailure($expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual), \false, 'Failed asserting that two objects are equal.'); - } + $authorName = $this->authorName; + return $authorName . ($authorEmail !== '' ? ($authorName !== '' ? ' ' : '') . $authorEmail : ''); + } + /** + * Attempts to create a new Author object based on the tag body. + */ + public static function create(string $body) : ?self + { + $splitTagContent = preg_match('/^([^\\<]*)(?:\\<([^\\>]*)\\>)?$/u', $body, $matches); + if (!$splitTagContent) { + return null; } + $authorName = trim($matches[1]); + $email = isset($matches[2]) ? trim($matches[2]) : ''; + return new static($authorName, $email); } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Comparator; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -use PHPUnit\SebastianBergmann\Exporter\Exporter; +use PHPUnit\phpDocumentor\Reflection\DocBlock; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; /** - * Abstract base class for comparators which compare values for equality. + * Parses a tag definition for a DocBlock. */ -abstract class Comparator +abstract class BaseTag implements DocBlock\Tag { + /** @var string Name of the tag */ + protected $name = ''; + /** @var Description|null Description of the tag. */ + protected $description; /** - * @var Factory - */ - protected $factory; - /** - * @var Exporter + * Gets the name of this tag. + * + * @return string The name of this tag. */ - protected $exporter; - public function __construct() + public function getName() : string { - $this->exporter = new Exporter(); + return $this->name; } - public function setFactory(Factory $factory) + public function getDescription() : ?Description { - $this->factory = $factory; + return $this->description; + } + public function render(?Formatter $formatter = null) : string + { + if ($formatter === null) { + $formatter = new Formatter\PassthroughFormatter(); + } + return $formatter->format($this); } - /** - * Returns whether the comparator can compare two values. - * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare - * - * @return bool - */ - public abstract function accepts($expected, $actual); - /** - * Asserts that two values are equal. - * - * @param mixed $expected First value to compare - * @param mixed $actual Second value to compare - * @param float $delta Allowed numerical distance between two values to consider them equal - * @param bool $canonicalize Arrays are sorted before comparison when set to true - * @param bool $ignoreCase Case is ignored when set to true - * - * @throws ComparisonFailure - */ - public abstract function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = \false, $ignoreCase = \false); } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Comparator; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Fqsen; +use PHPUnit\phpDocumentor\Reflection\FqsenResolver; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\phpDocumentor\Reflection\Utils; +use PHPUnit\Webmozart\Assert\Assert; use function array_key_exists; -use function is_array; -use function sort; -use function sprintf; -use function str_replace; -use function trim; +use function explode; /** - * Compares arrays for equality. - * - * Arrays are equal if they contain the same key-value pairs. - * The order of the keys does not matter. - * The types of key-value pairs do not matter. + * Reflection class for a @covers tag in a Docblock. */ -class ArrayComparator extends Comparator +final class Covers extends BaseTag implements Factory\StaticMethod { + /** @var string */ + protected $name = 'covers'; + /** @var Fqsen */ + private $refers; /** - * Returns whether the comparator can compare two values. - * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare - * - * @return bool + * Initializes this tag. */ - public function accepts($expected, $actual) + public function __construct(Fqsen $refers, ?Description $description = null) { - return is_array($expected) && is_array($actual); + $this->refers = $refers; + $this->description = $description; } - /** - * Asserts that two arrays are equal. - * - * @param mixed $expected First value to compare - * @param mixed $actual Second value to compare - * @param float $delta Allowed numerical distance between two values to consider them equal - * @param bool $canonicalize Arrays are sorted before comparison when set to true - * @param bool $ignoreCase Case is ignored when set to true - * @param array $processed List of already processed elements (used to prevent infinite recursion) - * - * @throws ComparisonFailure - */ - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = \false, $ignoreCase = \false, array &$processed = []) + public static function create(string $body, ?DescriptionFactory $descriptionFactory = null, ?FqsenResolver $resolver = null, ?TypeContext $context = null) : self { - if ($canonicalize) { - sort($expected); - sort($actual); - } - $remaining = $actual; - $actualAsString = "Array (\n"; - $expectedAsString = "Array (\n"; - $equal = \true; - foreach ($expected as $key => $value) { - unset($remaining[$key]); - if (!array_key_exists($key, $actual)) { - $expectedAsString .= sprintf(" %s => %s\n", $this->exporter->export($key), $this->exporter->shortenedExport($value)); - $equal = \false; - continue; - } - try { - $comparator = $this->factory->getComparatorFor($value, $actual[$key]); - $comparator->assertEquals($value, $actual[$key], $delta, $canonicalize, $ignoreCase, $processed); - $expectedAsString .= sprintf(" %s => %s\n", $this->exporter->export($key), $this->exporter->shortenedExport($value)); - $actualAsString .= sprintf(" %s => %s\n", $this->exporter->export($key), $this->exporter->shortenedExport($actual[$key])); - } catch (ComparisonFailure $e) { - $expectedAsString .= sprintf(" %s => %s\n", $this->exporter->export($key), $e->getExpectedAsString() ? $this->indent($e->getExpectedAsString()) : $this->exporter->shortenedExport($e->getExpected())); - $actualAsString .= sprintf(" %s => %s\n", $this->exporter->export($key), $e->getActualAsString() ? $this->indent($e->getActualAsString()) : $this->exporter->shortenedExport($e->getActual())); - $equal = \false; - } - } - foreach ($remaining as $key => $value) { - $actualAsString .= sprintf(" %s => %s\n", $this->exporter->export($key), $this->exporter->shortenedExport($value)); - $equal = \false; - } - $expectedAsString .= ')'; - $actualAsString .= ')'; - if (!$equal) { - throw new ComparisonFailure($expected, $actual, $expectedAsString, $actualAsString, \false, 'Failed asserting that two arrays are equal.'); + Assert::stringNotEmpty($body); + Assert::notNull($descriptionFactory); + Assert::notNull($resolver); + $parts = Utils::pregSplit('/\\s+/Su', $body, 2); + return new static(self::resolveFqsen($parts[0], $resolver, $context), $descriptionFactory->create($parts[1] ?? '', $context)); + } + private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen + { + Assert::notNull($fqsenResolver); + $fqsenParts = explode('::', $parts); + $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); + if (!array_key_exists(1, $fqsenParts)) { + return $resolved; } + return new Fqsen($resolved . '::' . $fqsenParts[1]); } - protected function indent($lines) + /** + * Returns the structural element this tag refers to. + */ + public function getReference() : Fqsen { - return trim(str_replace("\n", "\n ", $lines)); + return $this->refers; } -} -Comparator - -Copyright (c) 2002-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. + /** + * Returns a string representation of this tag. + */ + public function __toString() : string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + $refers = (string) $this->refers; + return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); + } +} +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Comparator; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\Webmozart\Assert\Assert; +use function preg_match; /** - * Compares PHPUnit\Framework\MockObject\MockObject instances for equality. + * Reflection class for a {@}deprecated tag in a Docblock. */ -class MockObjectComparator extends ObjectComparator +final class Deprecated extends BaseTag implements Factory\StaticMethod { + /** @var string */ + protected $name = 'deprecated'; /** - * Returns whether the comparator can compare two values. - * - * @param mixed $expected The first value to compare - * @param mixed $actual The second value to compare - * - * @return bool + * PCRE regular expression matching a version vector. + * Assumes the "x" modifier. */ - public function accepts($expected, $actual) + public const REGEX_VECTOR = '(?: + # Normal release vectors. + \\d\\S* + | + # VCS version vectors. Per PHPCS, they are expected to + # follow the form of the VCS name, followed by ":", followed + # by the version vector itself. + # By convention, popular VCSes like CVS, SVN and GIT use "$" + # around the actual version vector. + [^\\s\\:]+\\:\\s*\\$[^\\$]+\\$ + )'; + /** @var string|null The version vector. */ + private $version; + public function __construct(?string $version = null, ?Description $description = null) { - return $expected instanceof MockObject && $actual instanceof MockObject; + Assert::nullOrNotEmpty($version); + $this->version = $version; + $this->description = $description; } /** - * Converts an object to an array containing all of its private, protected - * and public properties. - * - * @param object $object - * - * @return array + * @return static */ - protected function toArray($object) + public static function create(?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { - $array = parent::toArray($object); - unset($array['__phpunit_invocationMocker']); - return $array; + if (empty($body)) { + return new static(); + } + $matches = []; + if (!preg_match('/^(' . self::REGEX_VECTOR . ')\\s*(.+)?$/sux', $body, $matches)) { + return new static(null, $descriptionFactory !== null ? $descriptionFactory->create($body, $context) : null); + } + Assert::notNull($descriptionFactory); + return new static($matches[1], $descriptionFactory->create($matches[2] ?? '', $context)); + } + /** + * Gets the version section of the tag. + */ + public function getVersion() : ?string + { + return $this->version; + } + /** + * Returns a string representation for this tag. + */ + public function __toString() : string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + $version = (string) $this->version; + return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -use PHPUnit\PharIo\Version\Exception as VersionException; -use PHPUnit\PharIo\Version\Version; -use PHPUnit\PharIo\Version\VersionConstraintParser; -class ManifestDocumentMapper +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tag; +use PHPUnit\Webmozart\Assert\Assert; +use function array_key_exists; +use function preg_match; +use function rawurlencode; +use function str_replace; +use function strpos; +use function trim; +/** + * Reflection class for a {@}example tag in a Docblock. + */ +final class Example implements Tag, Factory\StaticMethod { - public function map(ManifestDocument $document) : Manifest + /** @var string Path to a file to use as an example. May also be an absolute URI. */ + private $filePath; + /** + * @var bool Whether the file path component represents an URI. This determines how the file portion + * appears at {@link getContent()}. + */ + private $isURI; + /** @var int */ + private $startingLine; + /** @var int */ + private $lineCount; + /** @var string|null */ + private $content; + public function __construct(string $filePath, bool $isURI, int $startingLine, int $lineCount, ?string $content) { - try { - $contains = $document->getContainsElement(); - $type = $this->mapType($contains); - $copyright = $this->mapCopyright($document->getCopyrightElement()); - $requirements = $this->mapRequirements($document->getRequiresElement()); - $bundledComponents = $this->mapBundledComponents($document); - return new Manifest(new ApplicationName($contains->getName()), new Version($contains->getVersion()), $type, $copyright, $requirements, $bundledComponents); - } catch (VersionException $e) { - throw new ManifestDocumentMapperException($e->getMessage(), (int) $e->getCode(), $e); - } catch (Exception $e) { - throw new ManifestDocumentMapperException($e->getMessage(), (int) $e->getCode(), $e); + Assert::stringNotEmpty($filePath); + Assert::greaterThanEq($startingLine, 1); + Assert::greaterThanEq($lineCount, 0); + $this->filePath = $filePath; + $this->startingLine = $startingLine; + $this->lineCount = $lineCount; + if ($content !== null) { + $this->content = trim($content); } + $this->isURI = $isURI; } - private function mapType(ContainsElement $contains) : Type + public function getContent() : string { - switch ($contains->getType()) { - case 'application': - return Type::application(); - case 'library': - return Type::library(); - case 'extension': - return $this->mapExtension($contains->getExtensionElement()); + if ($this->content === null || $this->content === '') { + $filePath = $this->filePath; + if ($this->isURI) { + $filePath = $this->isUriRelative($this->filePath) ? str_replace('%2F', '/', rawurlencode($this->filePath)) : $this->filePath; + } + return trim($filePath); } - throw new ManifestDocumentMapperException(\sprintf('Unsupported type %s', $contains->getType())); + return $this->content; } - private function mapCopyright(CopyrightElement $copyright) : CopyrightInformation + public function getDescription() : ?string { - $authors = new AuthorCollection(); - foreach ($copyright->getAuthorElements() as $authorElement) { - $authors->add(new Author($authorElement->getName(), new Email($authorElement->getEmail()))); - } - $licenseElement = $copyright->getLicenseElement(); - $license = new License($licenseElement->getType(), new Url($licenseElement->getUrl())); - return new CopyrightInformation($authors, $license); + return $this->content; } - private function mapRequirements(RequiresElement $requires) : RequirementCollection + public static function create(string $body) : ?Tag { - $collection = new RequirementCollection(); - $phpElement = $requires->getPHPElement(); - $parser = new VersionConstraintParser(); - try { - $versionConstraint = $parser->parse($phpElement->getVersion()); - } catch (VersionException $e) { - throw new ManifestDocumentMapperException(\sprintf('Unsupported version constraint - %s', $e->getMessage()), (int) $e->getCode(), $e); + // File component: File path in quotes or File URI / Source information + if (!preg_match('/^\\s*(?:(\\"[^\\"]+\\")|(\\S+))(?:\\s+(.*))?$/sux', $body, $matches)) { + return null; } - $collection->add(new PhpVersionRequirement($versionConstraint)); - if (!$phpElement->hasExtElements()) { - return $collection; + $filePath = null; + $fileUri = null; + if ($matches[1] !== '') { + $filePath = $matches[1]; + } else { + $fileUri = $matches[2]; } - foreach ($phpElement->getExtElements() as $extElement) { - $collection->add(new PhpExtensionRequirement($extElement->getName())); + $startingLine = 1; + $lineCount = 0; + $description = null; + if (array_key_exists(3, $matches)) { + $description = $matches[3]; + // Starting line / Number of lines / Description + if (preg_match('/^([1-9]\\d*)(?:\\s+((?1))\\s*)?(.*)$/sux', $matches[3], $contentMatches)) { + $startingLine = (int) $contentMatches[1]; + if (isset($contentMatches[2])) { + $lineCount = (int) $contentMatches[2]; + } + if (array_key_exists(3, $contentMatches)) { + $description = $contentMatches[3]; + } + } } - return $collection; + return new static($filePath ?? $fileUri ?? '', $fileUri !== null, $startingLine, $lineCount, $description); } - private function mapBundledComponents(ManifestDocument $document) : BundledComponentCollection + /** + * Returns the file path. + * + * @return string Path to a file to use as an example. + * May also be an absolute URI. + */ + public function getFilePath() : string { - $collection = new BundledComponentCollection(); - if (!$document->hasBundlesElement()) { - return $collection; - } - foreach ($document->getBundlesElement()->getComponentElements() as $componentElement) { - $collection->add(new BundledComponent($componentElement->getName(), new Version($componentElement->getVersion()))); - } - return $collection; + return trim($this->filePath, '"'); } - private function mapExtension(ExtensionElement $extension) : Extension + /** + * Returns a string representation for this tag. + */ + public function __toString() : string { - try { - $versionConstraint = (new VersionConstraintParser())->parse($extension->getCompatible()); - return Type::extension(new ApplicationName($extension->getFor()), $versionConstraint); - } catch (VersionException $e) { - throw new ManifestDocumentMapperException(\sprintf('Unsupported version constraint - %s', $e->getMessage()), (int) $e->getCode(), $e); + $filePath = $this->filePath; + $isDefaultLine = $this->startingLine === 1 && $this->lineCount === 0; + $startingLine = !$isDefaultLine ? (string) $this->startingLine : ''; + $lineCount = !$isDefaultLine ? (string) $this->lineCount : ''; + $content = (string) $this->content; + return $filePath . ($startingLine !== '' ? ($filePath !== '' ? ' ' : '') . $startingLine : '') . ($lineCount !== '' ? ($filePath !== '' || $startingLine !== '' ? ' ' : '') . $lineCount : '') . ($content !== '' ? ($filePath !== '' || $startingLine !== '' || $lineCount !== '' ? ' ' : '') . $content : ''); + } + /** + * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute). + */ + private function isUriRelative(string $uri) : bool + { + return strpos($uri, ':') === \false; + } + public function getStartingLine() : int + { + return $this->startingLine; + } + public function getLineCount() : int + { + return $this->lineCount; + } + public function getName() : string + { + return 'example'; + } + public function render(?Formatter $formatter = null) : string + { + if ($formatter === null) { + $formatter = new Formatter\PassthroughFormatter(); } + return $formatter->format($this); } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Factory; -class InvalidUrlException extends \InvalidArgumentException implements Exception +/** + * @deprecated This contract is totally covered by Tag contract. Every class using StaticMethod also use Tag + */ +interface StaticMethod { + /** + * @return mixed + */ + public static function create(string $body); } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; - -class InvalidApplicationNameException extends \InvalidArgumentException implements Exception -{ - public const InvalidFormat = 2; -} -, Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Formatter; -class InvalidEmailException extends \InvalidArgumentException implements Exception +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tag; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Formatter; +use function max; +use function str_repeat; +use function strlen; +class AlignFormatter implements Formatter { + /** @var int The maximum tag name length. */ + protected $maxLen = 0; + /** + * @param Tag[] $tags All tags that should later be aligned with the formatter. + */ + public function __construct(array $tags) + { + foreach ($tags as $tag) { + $this->maxLen = max($this->maxLen, strlen($tag->getName())); + } + } + /** + * Formats the given tag to return a simple plain text version. + */ + public function format(Tag $tag) : string + { + return '@' . $tag->getName() . str_repeat(' ', $this->maxLen - strlen($tag->getName()) + 1) . $tag; + } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Formatter; -interface Exception extends \Throwable +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tag; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Formatter; +use function trim; +class PassthroughFormatter implements Formatter { + /** + * Formats the given tag to return a simple plain text version. + */ + public function format(Tag $tag) : string + { + return trim('@' . $tag->getName() . ' ' . $tag); + } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -use LibXMLError; -class ManifestDocumentLoadingException extends \Exception implements Exception +use InvalidArgumentException; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\DocBlock\StandardTagFactory; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\Webmozart\Assert\Assert; +use function preg_match; +/** + * Parses a tag definition for a DocBlock. + */ +final class Generic extends BaseTag implements Factory\StaticMethod { - /** @var LibXMLError[] */ - private $libxmlErrors; /** - * ManifestDocumentLoadingException constructor. + * Parses a tag and populates the member variables. * - * @param LibXMLError[] $libxmlErrors + * @param string $name Name of the tag. + * @param Description $description The contents of the given tag. */ - public function __construct(array $libxmlErrors) + public function __construct(string $name, ?Description $description = null) { - $this->libxmlErrors = $libxmlErrors; - $first = $this->libxmlErrors[0]; - parent::__construct(\sprintf('%s (Line: %d / Column: %d / File: %s)', $first->message, $first->line, $first->column, $first->file), $first->code); + $this->validateTagName($name); + $this->name = $name; + $this->description = $description; } /** - * @return LibXMLError[] + * Creates a new tag that represents any unknown tag type. + * + * @return static */ - public function getLibxmlErrors() : array + public static function create(string $body, string $name = '', ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { - return $this->libxmlErrors; + Assert::stringNotEmpty($name); + Assert::notNull($descriptionFactory); + $description = $body !== '' ? $descriptionFactory->create($body, $context) : null; + return new static($name, $description); + } + /** + * Returns the tag as a serialized string + */ + public function __toString() : string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + return $description; + } + /** + * Validates if the tag name matches the expected format, otherwise throws an exception. + */ + private function validateTagName(string $name) : void + { + if (!preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { + throw new InvalidArgumentException('The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, ' . 'hyphens and backslashes.'); + } } } , Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Manifest; - -class ElementCollectionException extends \InvalidArgumentException implements Exception -{ -} -, Sebastian Heuer , Sebastian Bergmann + * Since the internals of the library are relaying on the correct syntax of a docblock + * we cannot simply throw exceptions at all time because the exceptions will break the creation of a + * docklock. Just silently ignore the exceptions is not an option because the user as an issue to fix. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * This tag holds that error information until a using application is able to display it. The object wil just behave + * like any normal tag. So the normal application flow will not break. */ -namespace PHPUnit\PharIo\Manifest; - -use PHPUnit\PharIo\Version\AnyVersionConstraint; -use PHPUnit\PharIo\Version\Version; -use PHPUnit\PharIo\Version\VersionConstraint; -use XMLWriter; -/** @psalm-suppress MissingConstructor */ -class ManifestSerializer +final class InvalidTag implements Tag { - /** @var XMLWriter */ - private $xmlWriter; - public function serializeToFile(Manifest $manifest, string $filename) : void + /** @var string */ + private $name; + /** @var string */ + private $body; + /** @var Throwable|null */ + private $throwable; + private function __construct(string $name, string $body) { - \file_put_contents($filename, $this->serializeToString($manifest)); + $this->name = $name; + $this->body = $body; } - public function serializeToString(Manifest $manifest) : string + public function getException() : ?Throwable { - $this->startDocument(); - $this->addContains($manifest->getName(), $manifest->getVersion(), $manifest->getType()); - $this->addCopyright($manifest->getCopyrightInformation()); - $this->addRequirements($manifest->getRequirements()); - $this->addBundles($manifest->getBundledComponents()); - return $this->finishDocument(); + return $this->throwable; } - private function startDocument() : void + public function getName() : string { - $xmlWriter = new XMLWriter(); - $xmlWriter->openMemory(); - $xmlWriter->setIndent(\true); - $xmlWriter->setIndentString(\str_repeat(' ', 4)); - $xmlWriter->startDocument('1.0', 'UTF-8'); - $xmlWriter->startElement('phar'); - $xmlWriter->writeAttribute('xmlns', 'https://phar.io/xml/manifest/1.0'); - $this->xmlWriter = $xmlWriter; + return $this->name; } - private function finishDocument() : string + public static function create(string $body, string $name = '') : self { - $this->xmlWriter->endElement(); - $this->xmlWriter->endDocument(); - return $this->xmlWriter->outputMemory(); + return new self($name, $body); } - private function addContains(ApplicationName $name, Version $version, Type $type) : void + public function withError(Throwable $exception) : self { - $this->xmlWriter->startElement('contains'); - $this->xmlWriter->writeAttribute('name', $name->asString()); - $this->xmlWriter->writeAttribute('version', $version->getVersionString()); - switch (\true) { - case $type->isApplication(): - $this->xmlWriter->writeAttribute('type', 'application'); - break; - case $type->isLibrary(): - $this->xmlWriter->writeAttribute('type', 'library'); - break; - case $type->isExtension(): - $this->xmlWriter->writeAttribute('type', 'extension'); - /* @var $type Extension */ - $this->addExtension($type->getApplicationName(), $type->getVersionConstraint()); - break; - default: - $this->xmlWriter->writeAttribute('type', 'custom'); - } - $this->xmlWriter->endElement(); + $this->flattenExceptionBacktrace($exception); + $tag = new self($this->name, $this->body); + $tag->throwable = $exception; + return $tag; } - private function addCopyright(CopyrightInformation $copyrightInformation) : void + /** + * Removes all complex types from backtrace + * + * Not all objects are serializable. So we need to remove them from the + * stored exception to be sure that we do not break existing library usage. + */ + private function flattenExceptionBacktrace(Throwable $exception) : void { - $this->xmlWriter->startElement('copyright'); - foreach ($copyrightInformation->getAuthors() as $author) { - $this->xmlWriter->startElement('author'); - $this->xmlWriter->writeAttribute('name', $author->getName()); - $this->xmlWriter->writeAttribute('email', $author->getEmail()->asString()); - $this->xmlWriter->endElement(); - } - $license = $copyrightInformation->getLicense(); - $this->xmlWriter->startElement('license'); - $this->xmlWriter->writeAttribute('type', $license->getName()); - $this->xmlWriter->writeAttribute('url', $license->getUrl()->asString()); - $this->xmlWriter->endElement(); - $this->xmlWriter->endElement(); + $traceProperty = (new ReflectionClass(Exception::class))->getProperty('trace'); + $traceProperty->setAccessible(\true); + do { + $trace = $exception->getTrace(); + if (isset($trace[0]['args'])) { + $trace = array_map(function (array $call) : array { + $call['args'] = array_map([$this, 'flattenArguments'], $call['args'] ?? []); + return $call; + }, $trace); + } + $traceProperty->setValue($exception, $trace); + $exception = $exception->getPrevious(); + } while ($exception !== null); + $traceProperty->setAccessible(\false); } - private function addRequirements(RequirementCollection $requirementCollection) : void + /** + * @param mixed $value + * + * @return mixed + * + * @throws ReflectionException + */ + private function flattenArguments($value) { - $phpRequirement = new AnyVersionConstraint(); - $extensions = []; - foreach ($requirementCollection as $requirement) { - if ($requirement instanceof PhpVersionRequirement) { - $phpRequirement = $requirement->getVersionConstraint(); - continue; - } - if ($requirement instanceof PhpExtensionRequirement) { - $extensions[] = $requirement->asString(); - } - } - $this->xmlWriter->startElement('requires'); - $this->xmlWriter->startElement('php'); - $this->xmlWriter->writeAttribute('version', $phpRequirement->asString()); - foreach ($extensions as $extension) { - $this->xmlWriter->startElement('ext'); - $this->xmlWriter->writeAttribute('name', $extension); - $this->xmlWriter->endElement(); + if ($value instanceof Closure) { + $closureReflection = new ReflectionFunction($value); + $value = sprintf('(Closure at %s:%s)', $closureReflection->getFileName(), $closureReflection->getStartLine()); + } elseif (is_object($value)) { + $value = sprintf('object(%s)', get_class($value)); + } elseif (is_resource($value)) { + $value = sprintf('resource(%s)', get_resource_type($value)); + } elseif (is_array($value)) { + $value = array_map([$this, 'flattenArguments'], $value); } - $this->xmlWriter->endElement(); - $this->xmlWriter->endElement(); + return $value; } - private function addBundles(BundledComponentCollection $bundledComponentCollection) : void + public function render(?Formatter $formatter = null) : string { - if (\count($bundledComponentCollection) === 0) { - return; - } - $this->xmlWriter->startElement('bundles'); - foreach ($bundledComponentCollection as $bundledComponent) { - $this->xmlWriter->startElement('component'); - $this->xmlWriter->writeAttribute('name', $bundledComponent->getName()); - $this->xmlWriter->writeAttribute('version', $bundledComponent->getVersion()->getVersionString()); - $this->xmlWriter->endElement(); + if ($formatter === null) { + $formatter = new Formatter\PassthroughFormatter(); } - $this->xmlWriter->endElement(); + return $formatter->format($this); } - private function addExtension(ApplicationName $applicationName, VersionConstraint $versionConstraint) : void + public function __toString() : string { - $this->xmlWriter->startElement('extension'); - $this->xmlWriter->writeAttribute('for', $applicationName->asString()); - $this->xmlWriter->writeAttribute('compatible', $versionConstraint->asString()); - $this->xmlWriter->endElement(); + return $this->body; } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -class ExtElement extends ManifestElement +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\phpDocumentor\Reflection\Utils; +use PHPUnit\Webmozart\Assert\Assert; +/** + * Reflection class for a {@}link tag in a Docblock. + */ +final class Link extends BaseTag implements Factory\StaticMethod { - public function getName() : string + /** @var string */ + protected $name = 'link'; + /** @var string */ + private $link; + /** + * Initializes a link to a URL. + */ + public function __construct(string $link, ?Description $description = null) { - return $this->getAttributeValue('name'); + $this->link = $link; + $this->description = $description; } -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Manifest; - -class CopyrightElement extends ManifestElement -{ - public function getAuthorElements() : AuthorElementCollection + public static function create(string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { - return new AuthorElementCollection($this->getChildrenByName('author')); + Assert::notNull($descriptionFactory); + $parts = Utils::pregSplit('/\\s+/Su', $body, 2); + $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; + return new static($parts[0], $description); } - public function getLicenseElement() : LicenseElement + /** + * Gets the link + */ + public function getLink() : string { - return new LicenseElement($this->getChildByName('license')); + return $this->link; + } + /** + * Returns a string representation for this tag. + */ + public function __toString() : string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + $link = $this->link; + return $link . ($description !== '' ? ($link !== '' ? ' ' : '') . $description : ''); } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -class PhpElement extends ManifestElement +use InvalidArgumentException; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\TypeResolver; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\phpDocumentor\Reflection\Types\Mixed_; +use PHPUnit\phpDocumentor\Reflection\Types\Void_; +use PHPUnit\Webmozart\Assert\Assert; +use function array_keys; +use function explode; +use function implode; +use function is_string; +use function preg_match; +use function sort; +use function strpos; +use function substr; +use function trim; +use function var_export; +/** + * Reflection class for an {@}method in a Docblock. + */ +final class Method extends BaseTag implements Factory\StaticMethod { - public function getVersion() : string + /** @var string */ + protected $name = 'method'; + /** @var string */ + private $methodName; + /** + * @phpstan-var array + * @var array> + */ + private $arguments; + /** @var bool */ + private $isStatic; + /** @var Type */ + private $returnType; + /** + * @param array> $arguments + * @phpstan-param array $arguments + */ + public function __construct(string $methodName, array $arguments = [], ?Type $returnType = null, bool $static = \false, ?Description $description = null) { - return $this->getAttributeValue('version'); + Assert::stringNotEmpty($methodName); + if ($returnType === null) { + $returnType = new Void_(); + } + $this->methodName = $methodName; + $this->arguments = $this->filterArguments($arguments); + $this->returnType = $returnType; + $this->isStatic = $static; + $this->description = $description; } - public function hasExtElements() : bool + public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : ?self { - return $this->hasChild('ext'); + Assert::stringNotEmpty($body); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + // 1. none or more whitespace + // 2. optionally the keyword "static" followed by whitespace + // 3. optionally a word with underscores followed by whitespace : as + // type for the return value + // 4. then optionally a word with underscores followed by () and + // whitespace : as method name as used by phpDocumentor + // 5. then a word with underscores, followed by ( and any character + // until a ) and whitespace : as method name with signature + // 6. any remaining text : as description + if (!preg_match('/^ + # Static keyword + # Declares a static method ONLY if type is also present + (?: + (static) + \\s+ + )? + # Return type + (?: + ( + (?:[\\w\\|_\\\\]*\\$this[\\w\\|_\\\\]*) + | + (?: + (?:[\\w\\|_\\\\]+) + # array notation + (?:\\[\\])* + )*+ + ) + \\s+ + )? + # Method name + ([\\w_]+) + # Arguments + (?: + \\(([^\\)]*)\\) + )? + \\s* + # Description + (.*) + $/sux', $body, $matches)) { + return null; + } + [, $static, $returnType, $methodName, $argumentLines, $description] = $matches; + $static = $static === 'static'; + if ($returnType === '') { + $returnType = 'void'; + } + $returnType = $typeResolver->resolve($returnType, $context); + $description = $descriptionFactory->create($description, $context); + /** @phpstan-var array $arguments */ + $arguments = []; + if ($argumentLines !== '') { + $argumentsExploded = explode(',', $argumentLines); + foreach ($argumentsExploded as $argument) { + $argument = explode(' ', self::stripRestArg(trim($argument)), 2); + if (strpos($argument[0], '$') === 0) { + $argumentName = substr($argument[0], 1); + $argumentType = new Mixed_(); + } else { + $argumentType = $typeResolver->resolve($argument[0], $context); + $argumentName = ''; + if (isset($argument[1])) { + $argument[1] = self::stripRestArg($argument[1]); + $argumentName = substr($argument[1], 1); + } + } + $arguments[] = ['name' => $argumentName, 'type' => $argumentType]; + } + } + return new static($methodName, $arguments, $returnType, $static, $description); } - public function getExtElements() : ExtElementCollection + /** + * Retrieves the method name. + */ + public function getMethodName() : string { - return new ExtElementCollection($this->getChildrenByName('ext')); + return $this->methodName; } -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Manifest; - -class AuthorElementCollection extends ElementCollection -{ - public function current() : AuthorElement + /** + * @return array> + * @phpstan-return array + */ + public function getArguments() : array { - return new AuthorElement($this->getCurrentElement()); + return $this->arguments; + } + /** + * Checks whether the method tag describes a static method or not. + * + * @return bool TRUE if the method declaration is for a static method, FALSE otherwise. + */ + public function isStatic() : bool + { + return $this->isStatic; + } + public function getReturnType() : Type + { + return $this->returnType; + } + public function __toString() : string + { + $arguments = []; + foreach ($this->arguments as $argument) { + $arguments[] = $argument['type'] . ' $' . $argument['name']; + } + $argumentStr = '(' . implode(', ', $arguments) . ')'; + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + $static = $this->isStatic ? 'static' : ''; + $returnType = (string) $this->returnType; + $methodName = $this->methodName; + return $static . ($returnType !== '' ? ($static !== '' ? ' ' : '') . $returnType : '') . ($methodName !== '' ? ($static !== '' || $returnType !== '' ? ' ' : '') . $methodName : '') . $argumentStr . ($description !== '' ? ' ' . $description : ''); + } + /** + * @param mixed[][]|string[] $arguments + * @phpstan-param array $arguments + * + * @return mixed[][] + * @phpstan-return array + */ + private function filterArguments(array $arguments = []) : array + { + $result = []; + foreach ($arguments as $argument) { + if (is_string($argument)) { + $argument = ['name' => $argument]; + } + if (!isset($argument['type'])) { + $argument['type'] = new Mixed_(); + } + $keys = array_keys($argument); + sort($keys); + if ($keys !== ['name', 'type']) { + throw new InvalidArgumentException('Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, \true)); + } + $result[] = $argument; + } + return $result; + } + private static function stripRestArg(string $argument) : string + { + if (strpos($argument, '...') === 0) { + $argument = trim(substr($argument, 3)); + } + return $argument; } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -use DOMElement; -use DOMNodeList; -abstract class ElementCollection implements \Iterator +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\TypeResolver; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\phpDocumentor\Reflection\Utils; +use PHPUnit\Webmozart\Assert\Assert; +use function array_shift; +use function array_unshift; +use function implode; +use function strpos; +use function substr; +use const PREG_SPLIT_DELIM_CAPTURE; +/** + * Reflection class for the {@}param tag in a Docblock. + */ +final class Param extends TagWithType implements Factory\StaticMethod { - /** @var DOMElement[] */ - private $nodes = []; - /** @var int */ - private $position; - public function __construct(DOMNodeList $nodeList) + /** @var string|null */ + private $variableName; + /** @var bool determines whether this is a variadic argument */ + private $isVariadic; + /** @var bool determines whether this is passed by reference */ + private $isReference; + public function __construct(?string $variableName, ?Type $type = null, bool $isVariadic = \false, ?Description $description = null, bool $isReference = \false) { - $this->position = 0; - $this->importNodes($nodeList); + $this->name = 'param'; + $this->variableName = $variableName; + $this->type = $type; + $this->isVariadic = $isVariadic; + $this->description = $description; + $this->isReference = $isReference; } - #[\ReturnTypeWillChange] - public abstract function current(); - public function next() : void + public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { - $this->position++; + Assert::stringNotEmpty($body); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + [$firstPart, $body] = self::extractTypeFromBody($body); + $type = null; + $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); + $variableName = ''; + $isVariadic = \false; + $isReference = \false; + // if the first item that is encountered is not a variable; it is a type + if ($firstPart && !self::strStartsWithVariable($firstPart)) { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); + } + // if the next item starts with a $ or ...$ or &$ or &...$ it must be the variable name + if (isset($parts[0]) && self::strStartsWithVariable($parts[0])) { + $variableName = array_shift($parts); + if ($type) { + array_shift($parts); + } + Assert::notNull($variableName); + if (strpos($variableName, '$') === 0) { + $variableName = substr($variableName, 1); + } elseif (strpos($variableName, '&$') === 0) { + $isReference = \true; + $variableName = substr($variableName, 2); + } elseif (strpos($variableName, '...$') === 0) { + $isVariadic = \true; + $variableName = substr($variableName, 4); + } elseif (strpos($variableName, '&...$') === 0) { + $isVariadic = \true; + $isReference = \true; + $variableName = substr($variableName, 5); + } + } + $description = $descriptionFactory->create(implode('', $parts), $context); + return new static($variableName, $type, $isVariadic, $description, $isReference); } - public function key() : int + /** + * Returns the variable's name. + */ + public function getVariableName() : ?string { - return $this->position; + return $this->variableName; } - public function valid() : bool + /** + * Returns whether this tag is variadic. + */ + public function isVariadic() : bool { - return $this->position < \count($this->nodes); + return $this->isVariadic; } - public function rewind() : void + /** + * Returns whether this tag is passed by reference. + */ + public function isReference() : bool { - $this->position = 0; + return $this->isReference; } - protected function getCurrentElement() : DOMElement + /** + * Returns a string representation for this tag. + */ + public function __toString() : string { - return $this->nodes[$this->position]; + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + $variableName = ''; + if ($this->variableName) { + $variableName .= ($this->isReference ? '&' : '') . ($this->isVariadic ? '...' : ''); + $variableName .= '$' . $this->variableName; + } + $type = (string) $this->type; + return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } - private function importNodes(DOMNodeList $nodeList) : void + private static function strStartsWithVariable(string $str) : bool { - foreach ($nodeList as $node) { - if (!$node instanceof DOMElement) { - throw new ElementCollectionException(\sprintf('\\DOMElement expected, got \\%s', \get_class($node))); - } - $this->nodes[] = $node; - } + return strpos($str, '$') === 0 || strpos($str, '...$') === 0 || strpos($str, '&$') === 0 || strpos($str, '&...$') === 0; } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -class ExtensionElement extends ManifestElement +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\TypeResolver; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\phpDocumentor\Reflection\Utils; +use PHPUnit\Webmozart\Assert\Assert; +use function array_shift; +use function array_unshift; +use function implode; +use function strpos; +use function substr; +use const PREG_SPLIT_DELIM_CAPTURE; +/** + * Reflection class for a {@}property tag in a Docblock. + */ +final class Property extends TagWithType implements Factory\StaticMethod { - public function getFor() : string + /** @var string|null */ + protected $variableName; + public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) { - return $this->getAttributeValue('for'); + Assert::string($variableName); + $this->name = 'property'; + $this->variableName = $variableName; + $this->type = $type; + $this->description = $description; } - public function getCompatible() : string + public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { - return $this->getAttributeValue('compatible'); + Assert::stringNotEmpty($body); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + [$firstPart, $body] = self::extractTypeFromBody($body); + $type = null; + $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); + $variableName = ''; + // if the first item that is encountered is not a variable; it is a type + if ($firstPart && $firstPart[0] !== '$') { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); + } + // if the next item starts with a $ it must be the variable name + if (isset($parts[0]) && strpos($parts[0], '$') === 0) { + $variableName = array_shift($parts); + if ($type) { + array_shift($parts); + } + Assert::notNull($variableName); + $variableName = substr($variableName, 1); + } + $description = $descriptionFactory->create(implode('', $parts), $context); + return new static($variableName, $type, $description); } -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Manifest; - -class LicenseElement extends ManifestElement -{ - public function getType() : string + /** + * Returns the variable's name. + */ + public function getVariableName() : ?string { - return $this->getAttributeValue('type'); + return $this->variableName; } - public function getUrl() : string + /** + * Returns a string representation for this tag. + */ + public function __toString() : string { - return $this->getAttributeValue('url'); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + if ($this->variableName) { + $variableName = '$' . $this->variableName; + } else { + $variableName = ''; + } + $type = (string) $this->type; + return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -class ExtElementCollection extends ElementCollection +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\TypeResolver; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\phpDocumentor\Reflection\Utils; +use PHPUnit\Webmozart\Assert\Assert; +use function array_shift; +use function array_unshift; +use function implode; +use function strpos; +use function substr; +use const PREG_SPLIT_DELIM_CAPTURE; +/** + * Reflection class for a {@}property-read tag in a Docblock. + */ +final class PropertyRead extends TagWithType implements Factory\StaticMethod { - public function current() : ExtElement + /** @var string|null */ + protected $variableName; + public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) { - return new ExtElement($this->getCurrentElement()); + Assert::string($variableName); + $this->name = 'property-read'; + $this->variableName = $variableName; + $this->type = $type; + $this->description = $description; } -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Manifest; - -class RequiresElement extends ManifestElement -{ - public function getPHPElement() : PhpElement + public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { - return new PhpElement($this->getChildByName('php')); + Assert::stringNotEmpty($body); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + [$firstPart, $body] = self::extractTypeFromBody($body); + $type = null; + $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); + $variableName = ''; + // if the first item that is encountered is not a variable; it is a type + if ($firstPart && $firstPart[0] !== '$') { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); + } + // if the next item starts with a $ it must be the variable name + if (isset($parts[0]) && strpos($parts[0], '$') === 0) { + $variableName = array_shift($parts); + if ($type) { + array_shift($parts); + } + Assert::notNull($variableName); + $variableName = substr($variableName, 1); + } + $description = $descriptionFactory->create(implode('', $parts), $context); + return new static($variableName, $type, $description); } -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Manifest; - -class BundlesElement extends ManifestElement -{ - public function getComponentElements() : ComponentElementCollection + /** + * Returns the variable's name. + */ + public function getVariableName() : ?string { - return new ComponentElementCollection($this->getChildrenByName('component')); + return $this->variableName; + } + /** + * Returns a string representation for this tag. + */ + public function __toString() : string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + if ($this->variableName) { + $variableName = '$' . $this->variableName; + } else { + $variableName = ''; + } + $type = (string) $this->type; + return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -class ContainsElement extends ManifestElement +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\TypeResolver; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\phpDocumentor\Reflection\Utils; +use PHPUnit\Webmozart\Assert\Assert; +use function array_shift; +use function array_unshift; +use function implode; +use function strpos; +use function substr; +use const PREG_SPLIT_DELIM_CAPTURE; +/** + * Reflection class for a {@}property-write tag in a Docblock. + */ +final class PropertyWrite extends TagWithType implements Factory\StaticMethod { - public function getName() : string + /** @var string */ + protected $variableName; + public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) { - return $this->getAttributeValue('name'); + Assert::string($variableName); + $this->name = 'property-write'; + $this->variableName = $variableName; + $this->type = $type; + $this->description = $description; } - public function getVersion() : string + public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { - return $this->getAttributeValue('version'); + Assert::stringNotEmpty($body); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + [$firstPart, $body] = self::extractTypeFromBody($body); + $type = null; + $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); + $variableName = ''; + // if the first item that is encountered is not a variable; it is a type + if ($firstPart && $firstPart[0] !== '$') { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); + } + // if the next item starts with a $ it must be the variable name + if (isset($parts[0]) && strpos($parts[0], '$') === 0) { + $variableName = array_shift($parts); + if ($type) { + array_shift($parts); + } + Assert::notNull($variableName); + $variableName = substr($variableName, 1); + } + $description = $descriptionFactory->create(implode('', $parts), $context); + return new static($variableName, $type, $description); } - public function getType() : string + /** + * Returns the variable's name. + */ + public function getVariableName() : ?string { - return $this->getAttributeValue('type'); + return $this->variableName; } - public function getExtensionElement() : ExtensionElement + /** + * Returns a string representation for this tag. + */ + public function __toString() : string { - return new ExtensionElement($this->getChildByName('extension')); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + if ($this->variableName) { + $variableName = '$' . $this->variableName; + } else { + $variableName = ''; + } + $type = (string) $this->type; + return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } , Sebastian Heuer , Sebastian Bergmann + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Reference; -use DOMDocument; -use DOMElement; -class ManifestDocument +use PHPUnit\phpDocumentor\Reflection\Fqsen as RealFqsen; +/** + * Fqsen reference used by {@see \phpDocumentor\Reflection\DocBlock\Tags\See} + */ +final class Fqsen implements Reference { - public const XMLNS = 'https://phar.io/xml/manifest/1.0'; - /** @var DOMDocument */ - private $dom; - public static function fromFile(string $filename) : ManifestDocument - { - if (!\file_exists($filename)) { - throw new ManifestDocumentException(\sprintf('File "%s" not found', $filename)); - } - return self::fromString(\file_get_contents($filename)); - } - public static function fromString(string $xmlString) : ManifestDocument - { - $prev = \libxml_use_internal_errors(\true); - \libxml_clear_errors(); - $dom = new DOMDocument(); - $dom->loadXML($xmlString); - $errors = \libxml_get_errors(); - \libxml_use_internal_errors($prev); - if (\count($errors) !== 0) { - throw new ManifestDocumentLoadingException($errors); - } - return new self($dom); - } - private function __construct(DOMDocument $dom) - { - $this->ensureCorrectDocumentType($dom); - $this->dom = $dom; - } - public function getContainsElement() : ContainsElement - { - return new ContainsElement($this->fetchElementByName('contains')); - } - public function getCopyrightElement() : CopyrightElement - { - return new CopyrightElement($this->fetchElementByName('copyright')); - } - public function getRequiresElement() : RequiresElement - { - return new RequiresElement($this->fetchElementByName('requires')); - } - public function hasBundlesElement() : bool - { - return $this->dom->getElementsByTagNameNS(self::XMLNS, 'bundles')->length === 1; - } - public function getBundlesElement() : BundlesElement - { - return new BundlesElement($this->fetchElementByName('bundles')); - } - private function ensureCorrectDocumentType(DOMDocument $dom) : void + /** @var RealFqsen */ + private $fqsen; + public function __construct(RealFqsen $fqsen) { - $root = $dom->documentElement; - if ($root->localName !== 'phar' || $root->namespaceURI !== self::XMLNS) { - throw new ManifestDocumentException('Not a phar.io manifest document'); - } + $this->fqsen = $fqsen; } - private function fetchElementByName(string $elementName) : DOMElement + /** + * @return string string representation of the referenced fqsen + */ + public function __toString() : string { - $element = $this->dom->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); - if (!$element instanceof DOMElement) { - throw new ManifestDocumentException(\sprintf('Element %s missing', $elementName)); - } - return $element; + return (string) $this->fqsen; } } , Sebastian Heuer , Sebastian Bergmann + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Reference; -class ComponentElement extends ManifestElement +/** + * Interface for references in {@see \phpDocumentor\Reflection\DocBlock\Tags\See} + */ +interface Reference { - public function getName() : string - { - return $this->getAttributeValue('name'); - } - public function getVersion() : string - { - return $this->getAttributeValue('version'); - } + public function __toString() : string; } , Sebastian Heuer , Sebastian Bergmann + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Reference; -use DOMElement; -use DOMNodeList; -class ManifestElement +use PHPUnit\Webmozart\Assert\Assert; +/** + * Url reference used by {@see \phpDocumentor\Reflection\DocBlock\Tags\See} + */ +final class Url implements Reference { - public const XMLNS = 'https://phar.io/xml/manifest/1.0'; - /** @var DOMElement */ - private $element; - public function __construct(DOMElement $element) - { - $this->element = $element; - } - protected function getAttributeValue(string $name) : string - { - if (!$this->element->hasAttribute($name)) { - throw new ManifestElementException(\sprintf('Attribute %s not set on element %s', $name, $this->element->localName)); - } - return $this->element->getAttribute($name); - } - protected function getChildByName(string $elementName) : DOMElement - { - $element = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); - if (!$element instanceof DOMElement) { - throw new ManifestElementException(\sprintf('Element %s missing', $elementName)); - } - return $element; - } - protected function getChildrenByName(string $elementName) : DOMNodeList + /** @var string */ + private $uri; + public function __construct(string $uri) { - $elementList = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName); - if ($elementList->length === 0) { - throw new ManifestElementException(\sprintf('Element(s) %s missing', $elementName)); - } - return $elementList; + Assert::stringNotEmpty($uri); + $this->uri = $uri; } - protected function hasChild(string $elementName) : bool + public function __toString() : string { - return $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->length !== 0; + return $this->uri; } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -class AuthorElement extends ManifestElement +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\TypeResolver; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\Webmozart\Assert\Assert; +/** + * Reflection class for a {@}return tag in a Docblock. + */ +final class Return_ extends TagWithType implements Factory\StaticMethod { - public function getName() : string + public function __construct(Type $type, ?Description $description = null) { - return $this->getAttributeValue('name'); + $this->name = 'return'; + $this->type = $type; + $this->description = $description; } - public function getEmail() : string + public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { - return $this->getAttributeValue('email'); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + [$type, $description] = self::extractTypeFromBody($body); + $type = $typeResolver->resolve($type, $context); + $description = $descriptionFactory->create($description, $context); + return new static($type, $description); + } + public function __toString() : string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + $type = $this->type ? '' . $this->type : 'mixed'; + return $type . ($description !== '' ? ' ' . $description : ''); } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -class ComponentElementCollection extends ElementCollection +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Reference\Fqsen as FqsenRef; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Reference\Reference; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Reference\Url; +use PHPUnit\phpDocumentor\Reflection\Fqsen; +use PHPUnit\phpDocumentor\Reflection\FqsenResolver; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\phpDocumentor\Reflection\Utils; +use PHPUnit\Webmozart\Assert\Assert; +use function array_key_exists; +use function explode; +use function preg_match; +/** + * Reflection class for an {@}see tag in a Docblock. + */ +final class See extends BaseTag implements Factory\StaticMethod { - public function current() : ComponentElement + /** @var string */ + protected $name = 'see'; + /** @var Reference */ + protected $refers; + /** + * Initializes this tag. + */ + public function __construct(Reference $refers, ?Description $description = null) { - return new ComponentElement($this->getCurrentElement()); + $this->refers = $refers; + $this->description = $description; + } + public static function create(string $body, ?FqsenResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self + { + Assert::notNull($descriptionFactory); + $parts = Utils::pregSplit('/\\s+/Su', $body, 2); + $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; + // https://tools.ietf.org/html/rfc2396#section-3 + if (preg_match('#\\w://\\w#', $parts[0])) { + return new static(new Url($parts[0]), $description); + } + return new static(new FqsenRef(self::resolveFqsen($parts[0], $typeResolver, $context)), $description); + } + private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen + { + Assert::notNull($fqsenResolver); + $fqsenParts = explode('::', $parts); + $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); + if (!array_key_exists(1, $fqsenParts)) { + return $resolved; + } + return new Fqsen($resolved . '::' . $fqsenParts[1]); + } + /** + * Returns the ref of this tag. + */ + public function getReference() : Reference + { + return $this->refers; + } + /** + * Returns a string representation of this tag. + */ + public function __toString() : string + { + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + $refers = (string) $this->refers; + return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } -Phar.io - Manifest - -Copyright (c) 2016-2019 Arne Blankerts , Sebastian Heuer , Sebastian Bergmann , and contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Arne Blankerts nor the names of contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -use PHPUnit\PharIo\Version\Version; -class Manifest +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\Webmozart\Assert\Assert; +use function preg_match; +/** + * Reflection class for a {@}since tag in a Docblock. + */ +final class Since extends BaseTag implements Factory\StaticMethod { - /** @var ApplicationName */ - private $name; - /** @var Version */ + /** @var string */ + protected $name = 'since'; + /** + * PCRE regular expression matching a version vector. + * Assumes the "x" modifier. + */ + public const REGEX_VECTOR = '(?: + # Normal release vectors. + \\d\\S* + | + # VCS version vectors. Per PHPCS, they are expected to + # follow the form of the VCS name, followed by ":", followed + # by the version vector itself. + # By convention, popular VCSes like CVS, SVN and GIT use "$" + # around the actual version vector. + [^\\s\\:]+\\:\\s*\\$[^\\$]+\\$ + )'; + /** @var string|null The version vector. */ private $version; - /** @var Type */ - private $type; - /** @var CopyrightInformation */ - private $copyrightInformation; - /** @var RequirementCollection */ - private $requirements; - /** @var BundledComponentCollection */ - private $bundledComponents; - public function __construct(ApplicationName $name, Version $version, Type $type, CopyrightInformation $copyrightInformation, RequirementCollection $requirements, BundledComponentCollection $bundledComponents) + public function __construct(?string $version = null, ?Description $description = null) { - $this->name = $name; + Assert::nullOrNotEmpty($version); $this->version = $version; - $this->type = $type; - $this->copyrightInformation = $copyrightInformation; - $this->requirements = $requirements; - $this->bundledComponents = $bundledComponents; + $this->description = $description; } - public function getName() : ApplicationName + public static function create(?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : ?self { - return $this->name; + if (empty($body)) { + return new static(); + } + $matches = []; + if (!preg_match('/^(' . self::REGEX_VECTOR . ')\\s*(.+)?$/sux', $body, $matches)) { + return null; + } + Assert::notNull($descriptionFactory); + return new static($matches[1], $descriptionFactory->create($matches[2] ?? '', $context)); } - public function getVersion() : Version + /** + * Gets the version section of the tag. + */ + public function getVersion() : ?string { return $this->version; } - public function getType() : Type + /** + * Returns a string representation for this tag. + */ + public function __toString() : string { - return $this->type; + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + $version = (string) $this->version; + return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } - public function getCopyrightInformation() : CopyrightInformation +} +copyrightInformation; + Assert::integerish($startingLine); + Assert::nullOrIntegerish($lineCount); + $this->startingLine = (int) $startingLine; + $this->lineCount = $lineCount !== null ? (int) $lineCount : null; + $this->description = $description; } - public function getRequirements() : RequirementCollection + public static function create(string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { - return $this->requirements; + Assert::stringNotEmpty($body); + Assert::notNull($descriptionFactory); + $startingLine = 1; + $lineCount = null; + $description = null; + // Starting line / Number of lines / Description + if (preg_match('/^([1-9]\\d*)\\s*(?:((?1))\\s+)?(.*)$/sux', $body, $matches)) { + $startingLine = (int) $matches[1]; + if (isset($matches[2]) && $matches[2] !== '') { + $lineCount = (int) $matches[2]; + } + $description = $matches[3]; + } + return new static($startingLine, $lineCount, $descriptionFactory->create($description ?? '', $context)); } - public function getBundledComponents() : BundledComponentCollection + /** + * Gets the starting line. + * + * @return int The starting line, relative to the structural element's + * location. + */ + public function getStartingLine() : int { - return $this->bundledComponents; + return $this->startingLine; } - public function isApplication() : bool + /** + * Returns the number of lines. + * + * @return int|null The number of lines, relative to the starting line. NULL + * means "to the end". + */ + public function getLineCount() : ?int { - return $this->type->isApplication(); + return $this->lineCount; } - public function isLibrary() : bool + public function __toString() : string { - return $this->type->isLibrary(); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + $startingLine = (string) $this->startingLine; + $lineCount = $this->lineCount !== null ? ' ' . $this->lineCount : ''; + return $startingLine . $lineCount . ($description !== '' ? ' ' . $description : ''); } - public function isExtension() : bool +} +type->isExtension(); + return $this->type; } - public function isExtensionFor(ApplicationName $application, Version $version = null) : bool + /** + * @return string[] + */ + protected static function extractTypeFromBody(string $body) : array { - if (!$this->isExtension()) { - return \false; - } - /** @var Extension $type */ - $type = $this->type; - if ($version !== null) { - return $type->isCompatibleWith($application, $version); + $type = ''; + $nestingLevel = 0; + for ($i = 0, $iMax = strlen($body); $i < $iMax; $i++) { + $character = $body[$i]; + if ($nestingLevel === 0 && trim($character) === '') { + break; + } + $type .= $character; + if (in_array($character, ['<', '(', '[', '{'])) { + $nestingLevel++; + continue; + } + if (in_array($character, ['>', ')', ']', '}'])) { + $nestingLevel--; + continue; + } } - return $type->isExtensionFor($application); + $description = trim(substr($body, strlen($type))); + return [$type, $description]; } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -class Url +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\TypeResolver; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\Webmozart\Assert\Assert; +/** + * Reflection class for a {@}throws tag in a Docblock. + */ +final class Throws extends TagWithType implements Factory\StaticMethod { - /** @var string */ - private $url; - public function __construct(string $url) + public function __construct(Type $type, ?Description $description = null) { - $this->ensureUrlIsValid($url); - $this->url = $url; + $this->name = 'throws'; + $this->type = $type; + $this->description = $description; } - public function asString() : string + public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { - return $this->url; + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + [$type, $description] = self::extractTypeFromBody($body); + $type = $typeResolver->resolve($type, $context); + $description = $descriptionFactory->create($description, $context); + return new static($type, $description); } - /** - * @param string $url - * - * @throws InvalidUrlException - */ - private function ensureUrlIsValid($url) : void + public function __toString() : string { - if (\filter_var($url, \FILTER_VALIDATE_URL) === \false) { - throw new InvalidUrlException(); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; } + $type = (string) $this->type; + return $type . ($description !== '' ? ($type !== '' ? ' ' : '') . $description : ''); } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -class AuthorCollectionIterator implements \Iterator +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Fqsen; +use PHPUnit\phpDocumentor\Reflection\FqsenResolver; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\phpDocumentor\Reflection\Utils; +use PHPUnit\Webmozart\Assert\Assert; +use function array_key_exists; +use function explode; +/** + * Reflection class for a {@}uses tag in a Docblock. + */ +final class Uses extends BaseTag implements Factory\StaticMethod { - /** @var Author[] */ - private $authors; - /** @var int */ - private $position = 0; - public function __construct(AuthorCollection $authors) - { - $this->authors = $authors->getAuthors(); - } - public function rewind() : void + /** @var string */ + protected $name = 'uses'; + /** @var Fqsen */ + protected $refers; + /** + * Initializes this tag. + */ + public function __construct(Fqsen $refers, ?Description $description = null) { - $this->position = 0; + $this->refers = $refers; + $this->description = $description; } - public function valid() : bool + public static function create(string $body, ?FqsenResolver $resolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { - return $this->position < \count($this->authors); + Assert::notNull($resolver); + Assert::notNull($descriptionFactory); + $parts = Utils::pregSplit('/\\s+/Su', $body, 2); + return new static(self::resolveFqsen($parts[0], $resolver, $context), $descriptionFactory->create($parts[1] ?? '', $context)); } - public function key() : int + private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen { - return $this->position; + Assert::notNull($fqsenResolver); + $fqsenParts = explode('::', $parts); + $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); + if (!array_key_exists(1, $fqsenParts)) { + return $resolved; + } + return new Fqsen($resolved . '::' . $fqsenParts[1]); } - public function current() : Author + /** + * Returns the structural element this tag refers to. + */ + public function getReference() : Fqsen { - return $this->authors[$this->position]; + return $this->refers; } - public function next() : void + /** + * Returns a string representation of this tag. + */ + public function __toString() : string { - $this->position++; + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + $refers = (string) $this->refers; + return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -class Author +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\TypeResolver; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\phpDocumentor\Reflection\Utils; +use PHPUnit\Webmozart\Assert\Assert; +use function array_shift; +use function array_unshift; +use function implode; +use function strpos; +use function substr; +use const PREG_SPLIT_DELIM_CAPTURE; +/** + * Reflection class for a {@}var tag in a Docblock. + */ +final class Var_ extends TagWithType implements Factory\StaticMethod { - /** @var string */ - private $name; - /** @var Email */ - private $email; - public function __construct(string $name, Email $email) + /** @var string|null */ + protected $variableName = ''; + public function __construct(?string $variableName, ?Type $type = null, ?Description $description = null) { - $this->name = $name; - $this->email = $email; + Assert::string($variableName); + $this->name = 'var'; + $this->variableName = $variableName; + $this->type = $type; + $this->description = $description; } - public function asString() : string + public static function create(string $body, ?TypeResolver $typeResolver = null, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : self { - return \sprintf('%s <%s>', $this->name, $this->email->asString()); + Assert::stringNotEmpty($body); + Assert::notNull($typeResolver); + Assert::notNull($descriptionFactory); + [$firstPart, $body] = self::extractTypeFromBody($body); + $parts = Utils::pregSplit('/(\\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); + $type = null; + $variableName = ''; + // if the first item that is encountered is not a variable; it is a type + if ($firstPart && $firstPart[0] !== '$') { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); + } + // if the next item starts with a $ it must be the variable name + if (isset($parts[0]) && strpos($parts[0], '$') === 0) { + $variableName = array_shift($parts); + if ($type) { + array_shift($parts); + } + Assert::notNull($variableName); + $variableName = substr($variableName, 1); + } + $description = $descriptionFactory->create(implode('', $parts), $context); + return new static($variableName, $type, $description); } - public function getName() : string + /** + * Returns the variable's name. + */ + public function getVariableName() : ?string { - return $this->name; + return $this->variableName; } - public function getEmail() : Email + /** + * Returns a string representation for this tag. + */ + public function __toString() : string { - return $this->email; + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; + } + if ($this->variableName) { + $variableName = '$' . $this->variableName; + } else { + $variableName = ''; + } + $type = (string) $this->type; + return $type . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\DocBlock\Tags; -class ApplicationName +use PHPUnit\phpDocumentor\Reflection\DocBlock\Description; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\Types\Context as TypeContext; +use PHPUnit\Webmozart\Assert\Assert; +use function preg_match; +/** + * Reflection class for a {@}version tag in a Docblock. + */ +final class Version extends BaseTag implements Factory\StaticMethod { /** @var string */ - private $name; - public function __construct(string $name) + protected $name = 'version'; + /** + * PCRE regular expression matching a version vector. + * Assumes the "x" modifier. + */ + public const REGEX_VECTOR = '(?: + # Normal release vectors. + \\d\\S* + | + # VCS version vectors. Per PHPCS, they are expected to + # follow the form of the VCS name, followed by ":", followed + # by the version vector itself. + # By convention, popular VCSes like CVS, SVN and GIT use "$" + # around the actual version vector. + [^\\s\\:]+\\:\\s*\\$[^\\$]+\\$ + )'; + /** @var string|null The version vector. */ + private $version; + public function __construct(?string $version = null, ?Description $description = null) { - $this->ensureValidFormat($name); - $this->name = $name; + Assert::nullOrStringNotEmpty($version); + $this->version = $version; + $this->description = $description; } - public function asString() : string + public static function create(?string $body, ?DescriptionFactory $descriptionFactory = null, ?TypeContext $context = null) : ?self { - return $this->name; + if (empty($body)) { + return new static(); + } + $matches = []; + if (!preg_match('/^(' . self::REGEX_VECTOR . ')\\s*(.+)?$/sux', $body, $matches)) { + return null; + } + $description = null; + if ($descriptionFactory !== null) { + $description = $descriptionFactory->create($matches[2] ?? '', $context); + } + return new static($matches[1], $description); } - public function isEqual(ApplicationName $name) : bool + /** + * Gets the version section of the tag. + */ + public function getVersion() : ?string { - return $this->name === $name->name; + return $this->version; } - private function ensureValidFormat(string $name) : void + /** + * Returns a string representation for this tag. + */ + public function __toString() : string { - if (!\preg_match('#\\w/\\w#', $name)) { - throw new InvalidApplicationNameException(\sprintf('Format of name "%s" is not valid - expected: vendor/packagename', $name), InvalidApplicationNameException::InvalidFormat); + if ($this->description) { + $description = $this->description->render(); + } else { + $description = ''; } + $version = (string) $this->version; + return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Manifest; - -class Application extends Type -{ - public function isApplication() : bool - { - return \true; - } -} -, Sebastian Heuer , Sebastian Bergmann * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection; -use PHPUnit\PharIo\Version\VersionConstraint; -class PhpVersionRequirement implements Requirement +use InvalidArgumentException; +use LogicException; +use PHPUnit\phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use PHPUnit\phpDocumentor\Reflection\DocBlock\StandardTagFactory; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tag; +use PHPUnit\phpDocumentor\Reflection\DocBlock\TagFactory; +use PHPUnit\Webmozart\Assert\Assert; +use function array_shift; +use function count; +use function explode; +use function is_object; +use function method_exists; +use function preg_match; +use function preg_replace; +use function str_replace; +use function strpos; +use function substr; +use function trim; +final class DocBlockFactory implements DocBlockFactoryInterface { - /** @var VersionConstraint */ - private $versionConstraint; - public function __construct(VersionConstraint $versionConstraint) + /** @var DocBlock\DescriptionFactory */ + private $descriptionFactory; + /** @var DocBlock\TagFactory */ + private $tagFactory; + /** + * Initializes this factory with the required subcontractors. + */ + public function __construct(DescriptionFactory $descriptionFactory, TagFactory $tagFactory) { - $this->versionConstraint = $versionConstraint; + $this->descriptionFactory = $descriptionFactory; + $this->tagFactory = $tagFactory; } - public function getVersionConstraint() : VersionConstraint + /** + * Factory method for easy instantiation. + * + * @param array> $additionalTags + */ + public static function createInstance(array $additionalTags = []) : self { - return $this->versionConstraint; + $fqsenResolver = new FqsenResolver(); + $tagFactory = new StandardTagFactory($fqsenResolver); + $descriptionFactory = new DescriptionFactory($tagFactory); + $tagFactory->addService($descriptionFactory); + $tagFactory->addService(new TypeResolver($fqsenResolver)); + $docBlockFactory = new self($descriptionFactory, $tagFactory); + foreach ($additionalTags as $tagName => $tagHandler) { + $docBlockFactory->registerTagHandler($tagName, $tagHandler); + } + return $docBlockFactory; } -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Manifest; - -class License -{ - /** @var string */ - private $name; - /** @var Url */ - private $url; - public function __construct(string $name, Url $url) + /** + * @param object|string $docblock A string containing the DocBlock to parse or an object supporting the + * getDocComment method (such as a ReflectionClass object). + */ + public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock { - $this->name = $name; - $this->url = $url; + if (is_object($docblock)) { + if (!method_exists($docblock, 'getDocComment')) { + $exceptionMessage = 'Invalid object passed; the given object must support the getDocComment method'; + throw new InvalidArgumentException($exceptionMessage); + } + $docblock = $docblock->getDocComment(); + Assert::string($docblock); + } + Assert::stringNotEmpty($docblock); + if ($context === null) { + $context = new Types\Context(''); + } + $parts = $this->splitDocBlock($this->stripDocComment($docblock)); + [$templateMarker, $summary, $description, $tags] = $parts; + return new DocBlock($summary, $description ? $this->descriptionFactory->create($description, $context) : null, $this->parseTagBlock($tags, $context), $context, $location, $templateMarker === '#@+', $templateMarker === '#@-'); } - public function getName() : string + /** + * @param class-string $handler + */ + public function registerTagHandler(string $tagName, string $handler) : void { - return $this->name; + $this->tagFactory->registerTagHandler($tagName, $handler); } - public function getUrl() : Url + /** + * Strips the asterisks from the DocBlock comment. + * + * @param string $comment String containing the comment text. + */ + private function stripDocComment(string $comment) : string { - return $this->url; + $comment = preg_replace('#[ \\t]*(?:\\/\\*\\*|\\*\\/|\\*)?[ \\t]?(.*)?#u', '$1', $comment); + Assert::string($comment); + $comment = trim($comment); + // reg ex above is not able to remove */ from a single line docblock + if (substr($comment, -2) === '*/') { + $comment = trim(substr($comment, 0, -2)); + } + return str_replace(["\r\n", "\r"], "\n", $comment); } -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Manifest; - -class Library extends Type -{ - public function isLibrary() : bool + // phpcs:disable + /** + * Splits the DocBlock into a template marker, summary, description and block of tags. + * + * @param string $comment Comment to split into the sub-parts. + * + * @return string[] containing the template marker (if any), summary, description and a string containing the tags. + * + * @author Mike van Riel for extending the regex with template marker support. + * + * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. + */ + private function splitDocBlock(string $comment) : array { - return \true; - } -} -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Manifest; + # 2. Extract the summary + (?: + (?! @\\pL ) # The summary may not start with an @ + ( + [^\\n.]+ + (?: + (?! \\. \\n | \\n{2} ) # End summary upon a dot followed by newline or two newlines + [\\n.]* (?! [ \\t]* @\\pL ) # End summary when an @ is found as first character on a new line + [^\\n.]+ # Include anything else + )* + \\.? + )? + ) -class AuthorCollection implements \Countable, \IteratorAggregate -{ - /** @var Author[] */ - private $authors = []; - public function add(Author $author) : void - { - $this->authors[] = $author; + # 3. Extract the description + (?: + \\s* # Some form of whitespace _must_ precede a description because a summary must be there + (?! @\\pL ) # The description may not start with an @ + ( + [^\\n]+ + (?: \\n+ + (?! [ \\t]* @\\pL ) # End description when an @ is found as first character on a new line + [^\\n]+ # Include anything else + )* + ) + )? + + # 4. Extract the tags (anything that follows) + (\\s+ [\\s\\S]*)? # everything that follows + /ux', $comment, $matches); + array_shift($matches); + while (count($matches) < 4) { + $matches[] = ''; + } + return $matches; } /** - * @return Author[] + * Creates the tag objects. + * + * @param string $tags Tag block to parse. + * @param Types\Context $context Context of the parsed Tag + * + * @return DocBlock\Tag[] */ - public function getAuthors() : array + private function parseTagBlock(string $tags, Types\Context $context) : array { - return $this->authors; + $tags = $this->filterTagBlock($tags); + if ($tags === null) { + return []; + } + $result = []; + $lines = $this->splitTagBlockIntoTagLines($tags); + foreach ($lines as $key => $tagLine) { + $result[$key] = $this->tagFactory->create(trim($tagLine), $context); + } + return $result; } - public function count() : int + /** + * @return string[] + */ + private function splitTagBlockIntoTagLines(string $tags) : array { - return \count($this->authors); + $result = []; + foreach (explode("\n", $tags) as $tagLine) { + if ($tagLine !== '' && strpos($tagLine, '@') === 0) { + $result[] = $tagLine; + } else { + $result[count($result) - 1] .= "\n" . $tagLine; + } + } + return $result; } - public function getIterator() : AuthorCollectionIterator + private function filterTagBlock(string $tags) : ?string { - return new AuthorCollectionIterator($this); + $tags = trim($tags); + if (!$tags) { + return null; + } + if ($tags[0] !== '@') { + // @codeCoverageIgnoreStart + // Can't simulate this; this only happens if there is an error with the parsing of the DocBlock that + // we didn't foresee. + throw new LogicException('A tag block started with text instead of an at-sign(@): ' . $tags); + // @codeCoverageIgnoreEnd + } + return $tags; } } , Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection; -interface Requirement +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tag; +// phpcs:ignore SlevomatCodingStandard.Classes.SuperfluousInterfaceNaming.SuperfluousSuffix +interface DocBlockFactoryInterface { + /** + * Factory method for easy instantiation. + * + * @param array> $additionalTags + */ + public static function createInstance(array $additionalTags = []) : DocBlockFactory; + /** + * @param string|object $docblock + */ + public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock; } , Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\Exception; -use PHPUnit\PharIo\Version\Version; -use PHPUnit\PharIo\Version\VersionConstraint; -class Extension extends Type +use InvalidArgumentException; +use const PREG_BACKTRACK_LIMIT_ERROR; +use const PREG_BAD_UTF8_ERROR; +use const PREG_BAD_UTF8_OFFSET_ERROR; +use const PREG_INTERNAL_ERROR; +use const PREG_JIT_STACKLIMIT_ERROR; +use const PREG_NO_ERROR; +use const PREG_RECURSION_LIMIT_ERROR; +final class PcreException extends InvalidArgumentException { - /** @var ApplicationName */ - private $application; - /** @var VersionConstraint */ - private $versionConstraint; - public function __construct(ApplicationName $application, VersionConstraint $versionConstraint) - { - $this->application = $application; - $this->versionConstraint = $versionConstraint; - } - public function getApplicationName() : ApplicationName - { - return $this->application; - } - public function getVersionConstraint() : VersionConstraint - { - return $this->versionConstraint; - } - public function isExtension() : bool - { - return \true; - } - public function isExtensionFor(ApplicationName $name) : bool - { - return $this->application->isEqual($name); - } - public function isCompatibleWith(ApplicationName $name, Version $version) : bool + public static function createFromPhpError(int $errorCode) : self { - return $this->isExtensionFor($name) && $this->versionConstraint->complies($version); + switch ($errorCode) { + case PREG_BACKTRACK_LIMIT_ERROR: + return new self('Backtrack limit error'); + case PREG_RECURSION_LIMIT_ERROR: + return new self('Recursion limit error'); + case PREG_BAD_UTF8_ERROR: + return new self('Bad UTF8 error'); + case PREG_BAD_UTF8_OFFSET_ERROR: + return new self('Bad UTF8 offset error'); + case PREG_JIT_STACKLIMIT_ERROR: + return new self('Jit stacklimit error'); + case PREG_NO_ERROR: + case PREG_INTERNAL_ERROR: + default: + } + return new self('Unknown Pcre error'); } } -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\PharIo\Manifest; +Copyright (c) 2010 Mike van Riel -class BundledComponentCollectionIterator implements \Iterator -{ - /** @var BundledComponent[] */ - private $bundledComponents; - /** @var int */ - private $position = 0; - public function __construct(BundledComponentCollection $bundledComponents) - { - $this->bundledComponents = $bundledComponents->getBundledComponents(); - } - public function rewind() : void - { - $this->position = 0; - } - public function valid() : bool - { - return $this->position < \count($this->bundledComponents); - } - public function key() : int - { - return $this->position; - } - public function current() : BundledComponent - { - return $this->bundledComponents[$this->position]; - } - public function next() : void - { - $this->position++; - } -} +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection; -class RequirementCollection implements \Countable, \IteratorAggregate +use PHPUnit\phpDocumentor\Reflection\Exception\PcreException; +use PHPUnit\Webmozart\Assert\Assert; +use function preg_last_error; +use function preg_split as php_preg_split; +abstract class Utils { - /** @var Requirement[] */ - private $requirements = []; - public function add(Requirement $requirement) : void - { - $this->requirements[] = $requirement; - } /** - * @return Requirement[] + * Wrapper function for phps preg_split + * + * This function is inspired by {@link https://github.com/thecodingmachine/safe/blob/master/generated/pcre.php}. But + * since this library is all about performance we decided to strip everything we don't need. Reducing the amount + * of files that have to be loaded, ect. + * + * @param string $pattern The pattern to search for, as a string. + * @param string $subject The input string. + * @param int $limit If specified, then only substrings up to limit are returned with the + * rest of the string being placed in the last substring. A limit of -1 or 0 means "no limit". + * @param int $flags flags can be any combination of the following flags (combined with the | bitwise operator): + * *PREG_SPLIT_NO_EMPTY* + * If this flag is set, only non-empty pieces will be returned by preg_split(). + * *PREG_SPLIT_DELIM_CAPTURE* + * If this flag is set, parenthesized expression in the delimiter pattern will be captured + * and returned as well. + * *PREG_SPLIT_OFFSET_CAPTURE* + * If this flag is set, for every occurring match the appendant string offset will also be returned. + * Note that this changes the return value in an array where every element is an array consisting of the + * matched string at offset 0 and its string offset into subject at offset 1. + * + * @return string[] Returns an array containing substrings of subject + * split along boundaries matched by pattern + * + * @throws PcreException */ - public function getRequirements() : array + public static function pregSplit(string $pattern, string $subject, int $limit = -1, int $flags = 0) : array { - return $this->requirements; - } - public function count() : int - { - return \count($this->requirements); - } - public function getIterator() : RequirementCollectionIterator - { - return new RequirementCollectionIterator($this); + $parts = php_preg_split($pattern, $subject, $limit, $flags); + if ($parts === \false) { + throw PcreException::createFromPhpError(preg_last_error()); + } + Assert::allString($parts); + return $parts; } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; - -class RequirementCollectionIterator implements \Iterator -{ - /** @var Requirement[] */ - private $requirements; - /** @var int */ - private $position = 0; - public function __construct(RequirementCollection $requirements) - { - $this->requirements = $requirements->getRequirements(); - } - public function rewind() : void - { - $this->position = 0; - } - public function valid() : bool - { - return $this->position < \count($this->requirements); - } - public function key() : int - { - return $this->position; - } - public function current() : Requirement - { - return $this->requirements[$this->position]; - } - public function next() : void - { - $this->position++; - } -} -, Sebastian Heuer , Sebastian Bergmann +use InvalidArgumentException; +use PHPUnit\phpDocumentor\Reflection\Types\Context; +use function explode; +use function implode; +use function strpos; +/** + * Resolver for Fqsen using Context information * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @psalm-immutable */ -namespace PHPUnit\PharIo\Manifest; - -class Email +class FqsenResolver { - /** @var string */ - private $email; - public function __construct(string $email) + /** @var string Definition of the NAMESPACE operator in PHP */ + private const OPERATOR_NAMESPACE = '\\'; + public function resolve(string $fqsen, ?Context $context = null) : Fqsen { - $this->ensureEmailIsValid($email); - $this->email = $email; + if ($context === null) { + $context = new Context(''); + } + if ($this->isFqsen($fqsen)) { + return new Fqsen($fqsen); + } + return $this->resolvePartialStructuralElementName($fqsen, $context); } - public function asString() : string + /** + * Tests whether the given type is a Fully Qualified Structural Element Name. + */ + private function isFqsen(string $type) : bool { - return $this->email; + return strpos($type, self::OPERATOR_NAMESPACE) === 0; } - private function ensureEmailIsValid(string $url) : void + /** + * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation + * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. + * + * @throws InvalidArgumentException When type is not a valid FQSEN. + */ + private function resolvePartialStructuralElementName(string $type, Context $context) : Fqsen { - if (\filter_var($url, \FILTER_VALIDATE_EMAIL) === \false) { - throw new InvalidEmailException(); + $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); + $namespaceAliases = $context->getNamespaceAliases(); + // if the first segment is not an alias; prepend namespace name and return + if (!isset($namespaceAliases[$typeParts[0]])) { + $namespace = $context->getNamespace(); + if ($namespace !== '') { + $namespace .= self::OPERATOR_NAMESPACE; + } + return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type); } + $typeParts[0] = $namespaceAliases[$typeParts[0]]; + return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts)); } } +The MIT License (MIT) + +Copyright (c) 2010 Mike van Riel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection; -use PHPUnit\PharIo\Version\VersionConstraint; -abstract class Type +interface PseudoType extends Type { - public static function application() : Application - { - return new Application(); - } - public static function library() : Library - { - return new Library(); - } - public static function extension(ApplicationName $application, VersionConstraint $versionConstraint) : Extension - { - return new Extension($application, $versionConstraint); - } - /** @psalm-assert-if-true Application $this */ - public function isApplication() : bool - { - return \false; - } - /** @psalm-assert-if-true Library $this */ - public function isLibrary() : bool - { - return \false; - } - /** @psalm-assert-if-true Extension $this */ - public function isExtension() : bool - { - return \false; - } + public function underlyingType() : Type; } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; -class BundledComponentCollection implements \Countable, \IteratorAggregate +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\Types\String_; +/** + * Value Object representing the type 'string'. + * + * @psalm-immutable + */ +final class CallableString extends String_ implements PseudoType { - /** @var BundledComponent[] */ - private $bundledComponents = []; - public function add(BundledComponent $bundledComponent) : void + public function underlyingType() : Type { - $this->bundledComponents[] = $bundledComponent; + return new String_(); } /** - * @return BundledComponent[] + * Returns a rendered output of the Type as it would be used in a DocBlock. */ - public function getBundledComponents() : array - { - return $this->bundledComponents; - } - public function count() : int - { - return \count($this->bundledComponents); - } - public function getIterator() : BundledComponentCollectionIterator + public function __toString() : string { - return new BundledComponentCollectionIterator($this); + return 'callable-string'; } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link https://phpdoc.org + */ +namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; + +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\Types\Boolean; +use function class_alias; +/** + * Value Object representing the PseudoType 'False', which is a Boolean type. + * + * @psalm-immutable */ -namespace PHPUnit\PharIo\Manifest; - -class PhpExtensionRequirement implements Requirement +final class False_ extends Boolean implements PseudoType { - /** @var string */ - private $extension; - public function __construct(string $extension) + public function underlyingType() : Type { - $this->extension = $extension; + return new Boolean(); } - public function asString() : string + public function __toString() : string { - return $this->extension; + return 'false'; } } +class_alias('PHPUnit\\phpDocumentor\\Reflection\\PseudoTypes\\False_', 'PHPUnit\\phpDocumentor\\Reflection\\Types\\False_', \false); , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; -use PHPUnit\PharIo\Version\Version; -class BundledComponent +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\Types\String_; +/** + * Value Object representing the type 'string'. + * + * @psalm-immutable + */ +final class HtmlEscapedString extends String_ implements PseudoType { - /** @var string */ - private $name; - /** @var Version */ - private $version; - public function __construct(string $name, Version $version) - { - $this->name = $name; - $this->version = $version; - } - public function getName() : string + public function underlyingType() : Type { - return $this->name; + return new String_(); } - public function getVersion() : Version + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string { - return $this->version; + return 'html-escaped-string'; } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; -class CopyrightInformation +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\Types\Integer; +/** + * Value Object representing the type 'int'. + * + * @psalm-immutable + */ +final class IntegerRange extends Integer implements PseudoType { - /** @var AuthorCollection */ - private $authors; - /** @var License */ - private $license; - public function __construct(AuthorCollection $authors, License $license) + /** @var string */ + private $minValue; + /** @var string */ + private $maxValue; + public function __construct(string $minValue, string $maxValue) { - $this->authors = $authors; - $this->license = $license; + $this->minValue = $minValue; + $this->maxValue = $maxValue; } - public function getAuthors() : AuthorCollection + public function underlyingType() : Type { - return $this->authors; + return new Integer(); } - public function getLicense() : License + public function getMinValue() : string { - return $this->license; + return $this->minValue; + } + public function getMaxValue() : string + { + return $this->maxValue; + } + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + return 'int<' . $this->minValue . ', ' . $this->maxValue . '>'; } } , Sebastian Heuer , Sebastian Bergmann +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\PharIo\Manifest; +namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; -class ManifestLoader +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\Types\Array_; +use PHPUnit\phpDocumentor\Reflection\Types\Integer; +use PHPUnit\phpDocumentor\Reflection\Types\Mixed_; +/** + * Value Object representing the type 'list'. + * + * @psalm-immutable + */ +final class List_ extends Array_ implements PseudoType { - public static function fromFile(string $filename) : Manifest + public function underlyingType() : Type { - try { - return (new ManifestDocumentMapper())->map(ManifestDocument::fromFile($filename)); - } catch (Exception $e) { - throw new ManifestLoaderException(\sprintf('Loading %s failed.', $filename), (int) $e->getCode(), $e); - } + return new Array_(); } - public static function fromPhar(string $filename) : Manifest + public function __construct(?Type $valueType = null) { - return self::fromFile('phar://' . $filename . '/manifest.xml'); + parent::__construct($valueType, new Integer()); } - public static function fromString(string $manifest) : Manifest + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string { - try { - return (new ManifestDocumentMapper())->map(ManifestDocument::fromString($manifest)); - } catch (Exception $e) { - throw new ManifestLoaderException('Processing string failed', (int) $e->getCode(), $e); + if ($this->valueType instanceof Mixed_) { + return 'list'; } + return 'list<' . $this->valueType . '>'; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\CliParser; +namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; -use function sprintf; -use RuntimeException; -final class AmbiguousOptionException extends RuntimeException implements Exception +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\Types\String_; +/** + * Value Object representing the type 'string'. + * + * @psalm-immutable + */ +final class LiteralString extends String_ implements PseudoType { - public function __construct(string $option) + public function underlyingType() : Type { - parent::__construct(sprintf('Option "%s" is ambiguous', $option)); + return new String_(); + } + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + return 'literal-string'; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\CliParser; +namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; -use function sprintf; -use RuntimeException; -final class UnknownOptionException extends RuntimeException implements Exception +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\Types\String_; +/** + * Value Object representing the type 'string'. + * + * @psalm-immutable + */ +final class LowercaseString extends String_ implements PseudoType { - public function __construct(string $option) + public function underlyingType() : Type { - parent::__construct(sprintf('Unknown option "%s"', $option)); + return new String_(); + } + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + return 'lowercase-string'; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\CliParser; +namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; -use function sprintf; -use RuntimeException; -final class OptionDoesNotAllowArgumentException extends RuntimeException implements Exception +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\Types\Integer; +/** + * Value Object representing the type 'int'. + * + * @psalm-immutable + */ +final class NegativeInteger extends Integer implements PseudoType { - public function __construct(string $option) + public function underlyingType() : Type { - parent::__construct(sprintf('Option "%s" does not allow an argument', $option)); + return new Integer(); + } + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + return 'negative-int'; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\CliParser; - -use Throwable; -interface Exception extends Throwable -{ -} - +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\Types\String_; +/** + * Value Object representing the type 'string'. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @psalm-immutable */ -namespace PHPUnit\SebastianBergmann\CliParser; - -use function sprintf; -use RuntimeException; -final class RequiredOptionArgumentMissingException extends RuntimeException implements Exception +final class NonEmptyLowercaseString extends String_ implements PseudoType { - public function __construct(string $option) + public function underlyingType() : Type { - parent::__construct(sprintf('Required argument for option "%s" is missing', $option)); + return new String_(); + } + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + return 'non-empty-lowercase-string'; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\CliParser; +namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; -use function array_map; -use function array_merge; -use function array_shift; -use function array_slice; -use function assert; -use function count; -use function current; -use function explode; -use function is_array; -use function is_int; -use function is_string; -use function key; -use function next; -use function preg_replace; -use function reset; -use function sort; -use function strlen; -use function strpos; -use function strstr; -use function substr; -final class Parser +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\Types\String_; +/** + * Value Object representing the type 'string'. + * + * @psalm-immutable + */ +final class NonEmptyString extends String_ implements PseudoType { - /** - * @psalm-param list $argv - * @psalm-param list $longOptions - * - * @throws AmbiguousOptionException - * @throws RequiredOptionArgumentMissingException - * @throws OptionDoesNotAllowArgumentException - * @throws UnknownOptionException - */ - public function parse(array $argv, string $shortOptions, array $longOptions = null) : array - { - if (empty($argv)) { - return [[], []]; - } - $options = []; - $nonOptions = []; - if ($longOptions) { - sort($longOptions); - } - if (isset($argv[0][0]) && $argv[0][0] !== '-') { - array_shift($argv); - } - reset($argv); - $argv = array_map('trim', $argv); - while (\false !== ($arg = current($argv))) { - $i = key($argv); - assert(is_int($i)); - next($argv); - if ($arg === '') { - continue; - } - if ($arg === '--') { - $nonOptions = array_merge($nonOptions, array_slice($argv, $i + 1)); - break; - } - if ($arg[0] !== '-' || strlen($arg) > 1 && $arg[1] === '-' && !$longOptions) { - $nonOptions[] = $arg; - continue; - } - if (strlen($arg) > 1 && $arg[1] === '-' && is_array($longOptions)) { - $this->parseLongOption(substr($arg, 2), $longOptions, $options, $argv); - } else { - $this->parseShortOption(substr($arg, 1), $shortOptions, $options, $argv); - } - } - return [$options, $nonOptions]; - } - /** - * @throws RequiredOptionArgumentMissingException - */ - private function parseShortOption(string $arg, string $shortOptions, array &$opts, array &$args) : void + public function underlyingType() : Type { - $argLength = strlen($arg); - for ($i = 0; $i < $argLength; $i++) { - $option = $arg[$i]; - $optionArgument = null; - if ($arg[$i] === ':' || ($spec = strstr($shortOptions, $option)) === \false) { - throw new UnknownOptionException('-' . $option); - } - assert(is_string($spec)); - if (strlen($spec) > 1 && $spec[1] === ':') { - if ($i + 1 < $argLength) { - $opts[] = [$option, substr($arg, $i + 1)]; - break; - } - if (!(strlen($spec) > 2 && $spec[2] === ':')) { - $optionArgument = current($args); - if (!$optionArgument) { - throw new RequiredOptionArgumentMissingException('-' . $option); - } - assert(is_string($optionArgument)); - next($args); - } - } - $opts[] = [$option, $optionArgument]; - } + return new String_(); } /** - * @psalm-param list $longOptions - * - * @throws AmbiguousOptionException - * @throws RequiredOptionArgumentMissingException - * @throws OptionDoesNotAllowArgumentException - * @throws UnknownOptionException + * Returns a rendered output of the Type as it would be used in a DocBlock. */ - private function parseLongOption(string $arg, array $longOptions, array &$opts, array &$args) : void + public function __toString() : string { - $count = count($longOptions); - $list = explode('=', $arg); - $option = $list[0]; - $optionArgument = null; - if (count($list) > 1) { - $optionArgument = $list[1]; - } - $optionLength = strlen($option); - foreach ($longOptions as $i => $longOption) { - $opt_start = substr($longOption, 0, $optionLength); - if ($opt_start !== $option) { - continue; - } - $opt_rest = substr($longOption, $optionLength); - if ($opt_rest !== '' && $i + 1 < $count && $option[0] !== '=' && strpos($longOptions[$i + 1], $option) === 0) { - throw new AmbiguousOptionException('--' . $option); - } - if (substr($longOption, -1) === '=') { - /* @noinspection StrlenInEmptyStringCheckContextInspection */ - if (substr($longOption, -2) !== '==' && !strlen((string) $optionArgument)) { - if (\false === ($optionArgument = current($args))) { - throw new RequiredOptionArgumentMissingException('--' . $option); - } - next($args); - } - } elseif ($optionArgument) { - throw new OptionDoesNotAllowArgumentException('--' . $option); - } - $fullOption = '--' . preg_replace('/={1,2}$/', '', $longOption); - $opts[] = [$fullOption, $optionArgument]; - return; - } - throw new UnknownOptionException('--' . $option); + return 'non-empty-string'; } } -sebastian/cli-parser - -Copyright (c) 2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. +declare (strict_types=1); +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -use PHPUnit\Symfony\Polyfill\Ctype as p; -if (\PHP_VERSION_ID >= 80000) { - return require __DIR__ . '/bootstrap80.php'; -} -if (!\function_exists('ctype_alnum')) { - function ctype_alnum($text) - { - return p\Ctype::ctype_alnum($text); - } -} -if (!\function_exists('ctype_alpha')) { - function ctype_alpha($text) - { - return p\Ctype::ctype_alpha($text); - } -} -if (!\function_exists('ctype_cntrl')) { - function ctype_cntrl($text) - { - return p\Ctype::ctype_cntrl($text); - } -} -if (!\function_exists('ctype_digit')) { - function ctype_digit($text) - { - return p\Ctype::ctype_digit($text); - } -} -if (!\function_exists('ctype_graph')) { - function ctype_graph($text) - { - return p\Ctype::ctype_graph($text); - } -} -if (!\function_exists('ctype_lower')) { - function ctype_lower($text) - { - return p\Ctype::ctype_lower($text); - } -} -if (!\function_exists('ctype_print')) { - function ctype_print($text) - { - return p\Ctype::ctype_print($text); - } -} -if (!\function_exists('ctype_punct')) { - function ctype_punct($text) - { - return p\Ctype::ctype_punct($text); - } -} -if (!\function_exists('ctype_space')) { - function ctype_space($text) - { - return p\Ctype::ctype_space($text); - } -} -if (!\function_exists('ctype_upper')) { - function ctype_upper($text) +namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; + +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\Types\String_; +/** + * Value Object representing the type 'string'. + * + * @psalm-immutable + */ +final class NumericString extends String_ implements PseudoType +{ + public function underlyingType() : Type { - return p\Ctype::ctype_upper($text); + return new String_(); } -} -if (!\function_exists('ctype_xdigit')) { - function ctype_xdigit($text) + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string { - return p\Ctype::ctype_xdigit($text); + return 'numeric-string'; } } +declare (strict_types=1); +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -use PHPUnit\Symfony\Polyfill\Ctype as p; -if (!\function_exists('ctype_alnum')) { - function ctype_alnum(mixed $text) : bool - { - return p\Ctype::ctype_alnum($text); - } -} -if (!\function_exists('ctype_alpha')) { - function ctype_alpha(mixed $text) : bool - { - return p\Ctype::ctype_alpha($text); - } -} -if (!\function_exists('ctype_cntrl')) { - function ctype_cntrl(mixed $text) : bool +namespace PHPUnit\phpDocumentor\Reflection\PseudoTypes; + +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +use PHPUnit\phpDocumentor\Reflection\Types\AggregatedType; +use PHPUnit\phpDocumentor\Reflection\Types\Compound; +use PHPUnit\phpDocumentor\Reflection\Types\Float_; +use PHPUnit\phpDocumentor\Reflection\Types\Integer; +/** + * Value Object representing the 'numeric' pseudo-type, which is either a numeric-string, integer or float. + * + * @psalm-immutable + */ +final class Numeric_ extends AggregatedType implements PseudoType +{ + public function __construct() { - return p\Ctype::ctype_cntrl($text); + AggregatedType::__construct([new NumericString(), new Integer(), new Float_()], '|'); } -} -if (!\function_exists('ctype_digit')) { - function ctype_digit(mixed $text) : bool + public function underlyingType() : Type { - return p\Ctype::ctype_digit($text); + return new Compound([new NumericString(), new Integer(), new Float_()]); } -} -if (!\function_exists('ctype_graph')) { - function ctype_graph(mixed $text) : bool + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string { - return p\Ctype::ctype_graph($text); + return 'numeric'; } } -if (!\function_exists('ctype_lower')) { - function ctype_lower(mixed $text) : bool + +declare (strict_types=1); +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org + */ +namespace PHPUnit\phpDocumentor\Reflection; + +/** + * @psalm-immutable */ -namespace PHPUnit\Symfony\Polyfill\Ctype; +interface Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string; +} + + * @link http://phpdoc.org */ -final class Ctype +namespace PHPUnit\phpDocumentor\Reflection; + +use ArrayIterator; +use InvalidArgumentException; +use PHPUnit\phpDocumentor\Reflection\PseudoTypes\IntegerRange; +use PHPUnit\phpDocumentor\Reflection\PseudoTypes\List_; +use PHPUnit\phpDocumentor\Reflection\Types\Array_; +use PHPUnit\phpDocumentor\Reflection\Types\ArrayKey; +use PHPUnit\phpDocumentor\Reflection\Types\ClassString; +use PHPUnit\phpDocumentor\Reflection\Types\Collection; +use PHPUnit\phpDocumentor\Reflection\Types\Compound; +use PHPUnit\phpDocumentor\Reflection\Types\Context; +use PHPUnit\phpDocumentor\Reflection\Types\Expression; +use PHPUnit\phpDocumentor\Reflection\Types\Integer; +use PHPUnit\phpDocumentor\Reflection\Types\InterfaceString; +use PHPUnit\phpDocumentor\Reflection\Types\Intersection; +use PHPUnit\phpDocumentor\Reflection\Types\Iterable_; +use PHPUnit\phpDocumentor\Reflection\Types\Nullable; +use PHPUnit\phpDocumentor\Reflection\Types\Object_; +use PHPUnit\phpDocumentor\Reflection\Types\String_; +use RuntimeException; +use function array_key_exists; +use function array_pop; +use function array_values; +use function class_exists; +use function class_implements; +use function count; +use function current; +use function end; +use function in_array; +use function is_numeric; +use function key; +use function preg_split; +use function strpos; +use function strtolower; +use function trim; +use const PREG_SPLIT_DELIM_CAPTURE; +use const PREG_SPLIT_NO_EMPTY; +final class TypeResolver { + /** @var string Definition of the ARRAY operator for types */ + private const OPERATOR_ARRAY = '[]'; + /** @var string Definition of the NAMESPACE operator in PHP */ + private const OPERATOR_NAMESPACE = '\\'; + /** @var int the iterator parser is inside a compound context */ + private const PARSER_IN_COMPOUND = 0; + /** @var int the iterator parser is inside a nullable expression context */ + private const PARSER_IN_NULLABLE = 1; + /** @var int the iterator parser is inside an array expression context */ + private const PARSER_IN_ARRAY_EXPRESSION = 2; + /** @var int the iterator parser is inside a collection expression context */ + private const PARSER_IN_COLLECTION_EXPRESSION = 3; /** - * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. - * - * @see https://php.net/ctype-alnum - * - * @param string|int $text - * - * @return bool + * @var array List of recognized keywords and unto which Value Object they map + * @psalm-var array> */ - public static function ctype_alnum($text) - { - $text = self::convert_int_to_char_for_ctype($text); - return \is_string($text) && '' !== $text && !\preg_match('/[^A-Za-z0-9]/', $text); - } + private $keywords = ['string' => Types\String_::class, 'class-string' => Types\ClassString::class, 'interface-string' => Types\InterfaceString::class, 'html-escaped-string' => PseudoTypes\HtmlEscapedString::class, 'lowercase-string' => PseudoTypes\LowercaseString::class, 'non-empty-lowercase-string' => PseudoTypes\NonEmptyLowercaseString::class, 'non-empty-string' => PseudoTypes\NonEmptyString::class, 'numeric-string' => PseudoTypes\NumericString::class, 'numeric' => PseudoTypes\Numeric_::class, 'trait-string' => PseudoTypes\TraitString::class, 'int' => Types\Integer::class, 'integer' => Types\Integer::class, 'positive-int' => PseudoTypes\PositiveInteger::class, 'negative-int' => PseudoTypes\NegativeInteger::class, 'bool' => Types\Boolean::class, 'boolean' => Types\Boolean::class, 'real' => Types\Float_::class, 'float' => Types\Float_::class, 'double' => Types\Float_::class, 'object' => Types\Object_::class, 'mixed' => Types\Mixed_::class, 'array' => Types\Array_::class, 'array-key' => Types\ArrayKey::class, 'resource' => Types\Resource_::class, 'void' => Types\Void_::class, 'null' => Types\Null_::class, 'scalar' => Types\Scalar::class, 'callback' => Types\Callable_::class, 'callable' => Types\Callable_::class, 'callable-string' => PseudoTypes\CallableString::class, 'false' => PseudoTypes\False_::class, 'true' => PseudoTypes\True_::class, 'literal-string' => PseudoTypes\LiteralString::class, 'self' => Types\Self_::class, '$this' => Types\This::class, 'static' => Types\Static_::class, 'parent' => Types\Parent_::class, 'iterable' => Types\Iterable_::class, 'never' => Types\Never_::class, 'list' => PseudoTypes\List_::class]; /** - * Returns TRUE if every character in text is a letter, FALSE otherwise. - * - * @see https://php.net/ctype-alpha - * - * @param string|int $text - * - * @return bool + * @var FqsenResolver + * @psalm-readonly */ - public static function ctype_alpha($text) - { - $text = self::convert_int_to_char_for_ctype($text); - return \is_string($text) && '' !== $text && !\preg_match('/[^A-Za-z]/', $text); - } + private $fqsenResolver; /** - * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. - * - * @see https://php.net/ctype-cntrl - * - * @param string|int $text - * - * @return bool + * Initializes this TypeResolver with the means to create and resolve Fqsen objects. */ - public static function ctype_cntrl($text) + public function __construct(?FqsenResolver $fqsenResolver = null) { - $text = self::convert_int_to_char_for_ctype($text); - return \is_string($text) && '' !== $text && !\preg_match('/[^\\x00-\\x1f\\x7f]/', $text); + $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); } /** - * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. - * - * @see https://php.net/ctype-digit - * - * @param string|int $text + * Analyzes the given type and returns the FQCN variant. * - * @return bool - */ - public static function ctype_digit($text) - { - $text = self::convert_int_to_char_for_ctype($text); - return \is_string($text) && '' !== $text && !\preg_match('/[^0-9]/', $text); - } - /** - * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. + * When a type is provided this method checks whether it is not a keyword or + * Fully Qualified Class Name. If so it will use the given namespace and + * aliases to expand the type to a FQCN representation. * - * @see https://php.net/ctype-graph + * This method only works as expected if the namespace and aliases are set; + * no dynamic reflection is being performed here. * - * @param string|int $text + * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be + * replaced with another namespace. + * @uses Context::getNamespace() to determine with what to prefix the type name. * - * @return bool + * @param string $type The relative or absolute type. */ - public static function ctype_graph($text) + public function resolve(string $type, ?Context $context = null) : Type { - $text = self::convert_int_to_char_for_ctype($text); - return \is_string($text) && '' !== $text && !\preg_match('/[^!-~]/', $text); + $type = trim($type); + if (!$type) { + throw new InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); + } + if ($context === null) { + $context = new Context(''); + } + // split the type string into tokens `|`, `?`, `<`, `>`, `,`, `(`, `)`, `[]`, '<', '>' and type names + $tokens = preg_split('/(\\||\\?|<|>|&|, ?|\\(|\\)|\\[\\]+)/', $type, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); + if ($tokens === \false) { + throw new InvalidArgumentException('Unable to split the type string "' . $type . '" into tokens'); + } + /** @var ArrayIterator $tokenIterator */ + $tokenIterator = new ArrayIterator($tokens); + return $this->parseTypes($tokenIterator, $context, self::PARSER_IN_COMPOUND); } /** - * Returns TRUE if every character in text is a lowercase letter. - * - * @see https://php.net/ctype-lower - * - * @param string|int $text + * Analyse each tokens and creates types * - * @return bool + * @param ArrayIterator $tokens the iterator on tokens + * @param int $parserContext on of self::PARSER_* constants, indicating + * the context where we are in the parsing */ - public static function ctype_lower($text) + private function parseTypes(ArrayIterator $tokens, Context $context, int $parserContext) : Type { - $text = self::convert_int_to_char_for_ctype($text); - return \is_string($text) && '' !== $text && !\preg_match('/[^a-z]/', $text); + $types = []; + $token = ''; + $compoundToken = '|'; + while ($tokens->valid()) { + $token = $tokens->current(); + if ($token === null) { + throw new RuntimeException('Unexpected nullable character'); + } + if ($token === '|' || $token === '&') { + if (count($types) === 0) { + throw new RuntimeException('A type is missing before a type separator'); + } + if (!in_array($parserContext, [self::PARSER_IN_COMPOUND, self::PARSER_IN_ARRAY_EXPRESSION, self::PARSER_IN_COLLECTION_EXPRESSION], \true)) { + throw new RuntimeException('Unexpected type separator'); + } + $compoundToken = $token; + $tokens->next(); + } elseif ($token === '?') { + if (!in_array($parserContext, [self::PARSER_IN_COMPOUND, self::PARSER_IN_ARRAY_EXPRESSION, self::PARSER_IN_COLLECTION_EXPRESSION], \true)) { + throw new RuntimeException('Unexpected nullable character'); + } + $tokens->next(); + $type = $this->parseTypes($tokens, $context, self::PARSER_IN_NULLABLE); + $types[] = new Nullable($type); + } elseif ($token === '(') { + $tokens->next(); + $type = $this->parseTypes($tokens, $context, self::PARSER_IN_ARRAY_EXPRESSION); + $token = $tokens->current(); + if ($token === null) { + // Someone did not properly close their array expression .. + break; + } + $tokens->next(); + $resolvedType = new Expression($type); + $types[] = $resolvedType; + } elseif ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION && isset($token[0]) && $token[0] === ')') { + break; + } elseif ($token === '<') { + if (count($types) === 0) { + throw new RuntimeException('Unexpected collection operator "<", class name is missing'); + } + $classType = array_pop($types); + if ($classType !== null) { + if ((string) $classType === 'class-string') { + $types[] = $this->resolveClassString($tokens, $context); + } elseif ((string) $classType === 'int') { + $types[] = $this->resolveIntRange($tokens); + } elseif ((string) $classType === 'interface-string') { + $types[] = $this->resolveInterfaceString($tokens, $context); + } else { + $types[] = $this->resolveCollection($tokens, $classType, $context); + } + } + $tokens->next(); + } elseif ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION && ($token === '>' || trim($token) === ',')) { + break; + } elseif ($token === self::OPERATOR_ARRAY) { + end($types); + $last = key($types); + if ($last === null) { + throw new InvalidArgumentException('Unexpected array operator'); + } + $lastItem = $types[$last]; + if ($lastItem instanceof Expression) { + $lastItem = $lastItem->getValueType(); + } + $types[$last] = new Array_($lastItem); + $tokens->next(); + } else { + $type = $this->resolveSingleType($token, $context); + $tokens->next(); + if ($parserContext === self::PARSER_IN_NULLABLE) { + return $type; + } + $types[] = $type; + } + } + if ($token === '|' || $token === '&') { + throw new RuntimeException('A type is missing after a type separator'); + } + if (count($types) === 0) { + if ($parserContext === self::PARSER_IN_NULLABLE) { + throw new RuntimeException('A type is missing after a nullable character'); + } + if ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION) { + throw new RuntimeException('A type is missing in an array expression'); + } + if ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION) { + throw new RuntimeException('A type is missing in a collection expression'); + } + } elseif (count($types) === 1) { + return current($types); + } + if ($compoundToken === '|') { + return new Compound(array_values($types)); + } + return new Intersection(array_values($types)); } /** - * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. + * resolve the given type into a type object * - * @see https://php.net/ctype-print + * @param string $type the type string, representing a single type * - * @param string|int $text + * @return Type|Array_|Object_ * - * @return bool + * @psalm-mutation-free */ - public static function ctype_print($text) + private function resolveSingleType(string $type, Context $context) : object { - $text = self::convert_int_to_char_for_ctype($text); - return \is_string($text) && '' !== $text && !\preg_match('/[^ -~]/', $text); + switch (\true) { + case $this->isKeyword($type): + return $this->resolveKeyword($type); + case $this->isFqsen($type): + return $this->resolveTypedObject($type); + case $this->isPartialStructuralElementName($type): + return $this->resolveTypedObject($type, $context); + // @codeCoverageIgnoreStart + default: + // I haven't got the foggiest how the logic would come here but added this as a defense. + throw new RuntimeException('Unable to resolve type "' . $type . '", there is no known method to resolve it'); + } + // @codeCoverageIgnoreEnd } /** - * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. - * - * @see https://php.net/ctype-punct - * - * @param string|int $text + * Adds a keyword to the list of Keywords and associates it with a specific Value Object. * - * @return bool + * @psalm-param class-string $typeClassName */ - public static function ctype_punct($text) + public function addKeyword(string $keyword, string $typeClassName) : void { - $text = self::convert_int_to_char_for_ctype($text); - return \is_string($text) && '' !== $text && !\preg_match('/[^!-\\/\\:-@\\[-`\\{-~]/', $text); + if (!class_exists($typeClassName)) { + throw new InvalidArgumentException('The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName); + } + $interfaces = class_implements($typeClassName); + if ($interfaces === \false) { + throw new InvalidArgumentException('The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName); + } + if (!in_array(Type::class, $interfaces, \true)) { + throw new InvalidArgumentException('The class "' . $typeClassName . '" must implement the interface "phpDocumentor\\Reflection\\Type"'); + } + $this->keywords[$keyword] = $typeClassName; } /** - * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. - * - * @see https://php.net/ctype-space + * Detects whether the given type represents a PHPDoc keyword. * - * @param string|int $text + * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. * - * @return bool + * @psalm-mutation-free */ - public static function ctype_space($text) + private function isKeyword(string $type) : bool { - $text = self::convert_int_to_char_for_ctype($text); - return \is_string($text) && '' !== $text && !\preg_match('/[^\\s]/', $text); + return array_key_exists(strtolower($type), $this->keywords); } /** - * Returns TRUE if every character in text is an uppercase letter. - * - * @see https://php.net/ctype-upper + * Detects whether the given type represents a relative structural element name. * - * @param string|int $text + * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. * - * @return bool + * @psalm-mutation-free */ - public static function ctype_upper($text) + private function isPartialStructuralElementName(string $type) : bool { - $text = self::convert_int_to_char_for_ctype($text); - return \is_string($text) && '' !== $text && !\preg_match('/[^A-Z]/', $text); + return isset($type[0]) && $type[0] !== self::OPERATOR_NAMESPACE && !$this->isKeyword($type); } /** - * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. - * - * @see https://php.net/ctype-xdigit - * - * @param string|int $text + * Tests whether the given type is a Fully Qualified Structural Element Name. * - * @return bool + * @psalm-mutation-free */ - public static function ctype_xdigit($text) + private function isFqsen(string $type) : bool { - $text = self::convert_int_to_char_for_ctype($text); - return \is_string($text) && '' !== $text && !\preg_match('/[^A-Fa-f0-9]/', $text); + return strpos($type, self::OPERATOR_NAMESPACE) === 0; } /** - * Converts integers to their char versions according to normal ctype behaviour, if needed. - * - * If an integer between -128 and 255 inclusive is provided, - * it is interpreted as the ASCII value of a single character - * (negative values have 256 added in order to allow characters in the Extended ASCII range). - * Any other integer is interpreted as a string containing the decimal digits of the integer. - * - * @param string|int $int + * Resolves the given keyword (such as `string`) into a Type object representing that keyword. * - * @return mixed + * @psalm-mutation-free */ - private static function convert_int_to_char_for_ctype($int) + private function resolveKeyword(string $type) : Type { - if (!\is_int($int)) { - return $int; - } - if ($int < -128 || $int > 255) { - return (string) $int; - } - if ($int < 0) { - $int += 256; - } - return \chr($int); - } -} -Copyright (c) 2018-2019 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Complexity; - -final class RuntimeException extends \RuntimeException implements Exception -{ -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Complexity; - -use Throwable; -interface Exception extends Throwable -{ -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Complexity; - -use PHPUnit\PhpParser\Error; -use PHPUnit\PhpParser\Lexer; -use PHPUnit\PhpParser\Node; -use PHPUnit\PhpParser\NodeTraverser; -use PHPUnit\PhpParser\NodeVisitor\NameResolver; -use PHPUnit\PhpParser\NodeVisitor\ParentConnectingVisitor; -use PHPUnit\PhpParser\Parser; -use PHPUnit\PhpParser\ParserFactory; -final class Calculator -{ + $className = $this->keywords[strtolower($type)]; + return new $className(); + } /** - * @throws RuntimeException + * Resolves the given FQSEN string into an FQSEN object. + * + * @psalm-mutation-free */ - public function calculateForSourceFile(string $sourceFile) : ComplexityCollection + private function resolveTypedObject(string $type, ?Context $context = null) : Object_ { - return $this->calculateForSourceString(\file_get_contents($sourceFile)); + return new Object_($this->fqsenResolver->resolve($type, $context)); } /** - * @throws RuntimeException + * Resolves class string + * + * @param ArrayIterator $tokens */ - public function calculateForSourceString(string $source) : ComplexityCollection + private function resolveClassString(ArrayIterator $tokens, Context $context) : Type { - try { - $nodes = $this->parser()->parse($source); - \assert($nodes !== null); - return $this->calculateForAbstractSyntaxTree($nodes); - // @codeCoverageIgnoreStart - } catch (Error $error) { - throw new RuntimeException($error->getMessage(), (int) $error->getCode(), $error); + $tokens->next(); + $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); + if (!$classType instanceof Object_ || $classType->getFqsen() === null) { + throw new RuntimeException($classType . ' is not a class string'); } - // @codeCoverageIgnoreEnd + $token = $tokens->current(); + if ($token !== '>') { + if (empty($token)) { + throw new RuntimeException('class-string: ">" is missing'); + } + throw new RuntimeException('Unexpected character "' . $token . '", ">" is missing'); + } + return new ClassString($classType->getFqsen()); } /** - * @param Node[] $nodes + * Resolves integer ranges * - * @throws RuntimeException + * @param ArrayIterator $tokens */ - public function calculateForAbstractSyntaxTree(array $nodes) : ComplexityCollection + private function resolveIntRange(ArrayIterator $tokens) : Type { - $traverser = new NodeTraverser(); - $complexityCalculatingVisitor = new ComplexityCalculatingVisitor(\true); - $traverser->addVisitor(new NameResolver()); - $traverser->addVisitor(new ParentConnectingVisitor()); - $traverser->addVisitor($complexityCalculatingVisitor); - try { - /* @noinspection UnusedFunctionResultInspection */ - $traverser->traverse($nodes); - // @codeCoverageIgnoreStart - } catch (Error $error) { - throw new RuntimeException($error->getMessage(), (int) $error->getCode(), $error); + $tokens->next(); + $token = ''; + $minValue = null; + $maxValue = null; + $commaFound = \false; + $tokenCounter = 0; + while ($tokens->valid()) { + $tokenCounter++; + $token = $tokens->current(); + if ($token === null) { + throw new RuntimeException('Unexpected nullable character'); + } + $token = trim($token); + if ($token === '>') { + break; + } + if ($token === ',') { + $commaFound = \true; + } + if ($commaFound === \false && $minValue === null) { + if (is_numeric($token) || $token === 'max' || $token === 'min') { + $minValue = $token; + } + } + if ($commaFound === \true && $maxValue === null) { + if (is_numeric($token) || $token === 'max' || $token === 'min') { + $maxValue = $token; + } + } + $tokens->next(); } - // @codeCoverageIgnoreEnd - return $complexityCalculatingVisitor->result(); - } - private function parser() : Parser - { - return (new ParserFactory())->create(ParserFactory::PREFER_PHP7, new Lexer()); + if ($token !== '>') { + if (empty($token)) { + throw new RuntimeException('interface-string: ">" is missing'); + } + throw new RuntimeException('Unexpected character "' . $token . '", ">" is missing'); + } + if ($minValue === null || $maxValue === null || $tokenCounter > 4) { + throw new RuntimeException('int has not the correct format'); + } + return new IntegerRange($minValue, $maxValue); } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Complexity; - -use function count; -use Countable; -use IteratorAggregate; -/** - * @psalm-immutable - */ -final class ComplexityCollection implements Countable, IteratorAggregate -{ /** - * @psalm-var list + * Resolves class string + * + * @param ArrayIterator $tokens */ - private $items = []; - public static function fromList(Complexity ...$items) : self + private function resolveInterfaceString(ArrayIterator $tokens, Context $context) : Type { - return new self($items); + $tokens->next(); + $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); + if (!$classType instanceof Object_ || $classType->getFqsen() === null) { + throw new RuntimeException($classType . ' is not a interface string'); + } + $token = $tokens->current(); + if ($token !== '>') { + if (empty($token)) { + throw new RuntimeException('interface-string: ">" is missing'); + } + throw new RuntimeException('Unexpected character "' . $token . '", ">" is missing'); + } + return new InterfaceString($classType->getFqsen()); } /** - * @psalm-param list $items + * Resolves the collection values and keys + * + * @param ArrayIterator $tokens + * + * @return Array_|Iterable_|Collection */ - private function __construct(array $items) + private function resolveCollection(ArrayIterator $tokens, Type $classType, Context $context) : Type { - $this->items = $items; + $isArray = (string) $classType === 'array'; + $isIterable = (string) $classType === 'iterable'; + $isList = (string) $classType === 'list'; + // allow only "array", "iterable" or class name before "<" + if (!$isArray && !$isIterable && !$isList && (!$classType instanceof Object_ || $classType->getFqsen() === null)) { + throw new RuntimeException($classType . ' is not a collection'); + } + $tokens->next(); + $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); + $keyType = null; + $token = $tokens->current(); + if ($token !== null && trim($token) === ',' && !$isList) { + // if we have a comma, then we just parsed the key type, not the value type + $keyType = $valueType; + if ($isArray) { + // check the key type for an "array" collection. We allow only + // strings or integers. + if (!$keyType instanceof ArrayKey && !$keyType instanceof String_ && !$keyType instanceof Integer && !$keyType instanceof Compound) { + throw new RuntimeException('An array can have only integers or strings as keys'); + } + if ($keyType instanceof Compound) { + foreach ($keyType->getIterator() as $item) { + if (!$item instanceof ArrayKey && !$item instanceof String_ && !$item instanceof Integer) { + throw new RuntimeException('An array can have only integers or strings as keys'); + } + } + } + } + $tokens->next(); + // now let's parse the value type + $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); + } + $token = $tokens->current(); + if ($token !== '>') { + if (empty($token)) { + throw new RuntimeException('Collection: ">" is missing'); + } + throw new RuntimeException('Unexpected character "' . $token . '", ">" is missing'); + } + if ($isArray) { + return new Array_($valueType, $keyType); + } + if ($isIterable) { + return new Iterable_($valueType, $keyType); + } + if ($isList) { + return new List_($valueType); + } + if ($classType instanceof Object_) { + return $this->makeCollectionFromObject($classType, $valueType, $keyType); + } + throw new RuntimeException('Invalid $classType provided'); } /** - * @psalm-return list + * @psalm-pure */ - public function asArray() : array - { - return $this->items; - } - public function getIterator() : ComplexityCollectionIterator - { - return new ComplexityCollectionIterator($this); - } - public function count() : int - { - return count($this->items); - } - public function isEmpty() : bool - { - return empty($this->items); - } - public function cyclomaticComplexity() : int + private function makeCollectionFromObject(Object_ $object, Type $valueType, ?Type $keyType = null) : Collection { - $cyclomaticComplexity = 0; - foreach ($this as $item) { - $cyclomaticComplexity += $item->cyclomaticComplexity(); - } - return $cyclomaticComplexity; + return new Collection($object->getFqsen(), $valueType, $keyType); } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Complexity; +namespace PHPUnit\phpDocumentor\Reflection\Types; +use PHPUnit\phpDocumentor\Reflection\Type; /** + * Represents a list of values. This is an abstract class for Array_ and Collection. + * * @psalm-immutable */ -final class Complexity +abstract class AbstractList implements Type { + /** @var Type */ + protected $valueType; + /** @var Type|null */ + protected $keyType; + /** @var Type */ + protected $defaultKeyType; /** - * @var string + * Initializes this representation of an array with the given Type. */ - private $name; + public function __construct(?Type $valueType = null, ?Type $keyType = null) + { + if ($valueType === null) { + $valueType = new Mixed_(); + } + $this->valueType = $valueType; + $this->defaultKeyType = new Compound([new String_(), new Integer()]); + $this->keyType = $keyType; + } /** - * @var int + * Returns the type for the keys of this array. */ - private $cyclomaticComplexity; - public function __construct(string $name, int $cyclomaticComplexity) + public function getKeyType() : Type { - $this->name = $name; - $this->cyclomaticComplexity = $cyclomaticComplexity; + return $this->keyType ?? $this->defaultKeyType; } - public function name() : string + /** + * Returns the value for the keys of this array. + */ + public function getValueType() : Type { - return $this->name; + return $this->valueType; } - public function cyclomaticComplexity() : int + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string { - return $this->cyclomaticComplexity; + if ($this->keyType) { + return 'array<' . $this->keyType . ',' . $this->valueType . '>'; + } + if ($this->valueType instanceof Mixed_) { + return 'array'; + } + if ($this->valueType instanceof Compound) { + return '(' . $this->valueType . ')[]'; + } + return $this->valueType . '[]'; } } + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\Complexity; - -use Iterator; -final class ComplexityCollectionIterator implements Iterator -{ - /** - * @psalm-var list - */ - private $items; - /** - * @var int - */ - private $position = 0; - public function __construct(ComplexityCollection $items) - { - $this->items = $items->asArray(); - } - public function rewind() : void - { - $this->position = 0; - } - public function valid() : bool - { - return isset($this->items[$this->position]); - } - public function key() : int - { - return $this->position; - } - public function current() : Complexity - { - return $this->items[$this->position]; - } - public function next() : void - { - $this->position++; - } -} -sebastian/complexity - -Copyright (c) 2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - + * A Aggregated Type is not so much a special keyword or object reference but is a series of Types that are separated + * using separator. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @psalm-immutable + * @template-implements IteratorAggregate */ -namespace PHPUnit\SebastianBergmann\Complexity; - -use function assert; -use function is_array; -use PHPUnit\PhpParser\Node; -use PHPUnit\PhpParser\Node\Name; -use PHPUnit\PhpParser\Node\Stmt; -use PHPUnit\PhpParser\Node\Stmt\Class_; -use PHPUnit\PhpParser\Node\Stmt\ClassMethod; -use PHPUnit\PhpParser\Node\Stmt\Function_; -use PHPUnit\PhpParser\Node\Stmt\Trait_; -use PHPUnit\PhpParser\NodeTraverser; -use PHPUnit\PhpParser\NodeVisitorAbstract; -final class ComplexityCalculatingVisitor extends NodeVisitorAbstract +abstract class AggregatedType implements Type, IteratorAggregate { /** - * @psalm-var list + * @psalm-allow-private-mutation + * @var array */ - private $result = []; + private $types = []; + /** @var string */ + private $token; /** - * @var bool + * @param array $types */ - private $shortCircuitTraversal; - public function __construct(bool $shortCircuitTraversal) + public function __construct(array $types, string $token) { - $this->shortCircuitTraversal = $shortCircuitTraversal; + foreach ($types as $type) { + $this->add($type); + } + $this->token = $token; } - public function enterNode(Node $node) : ?int + /** + * Returns the type at the given index. + */ + public function get(int $index) : ?Type { - if (!$node instanceof ClassMethod && !$node instanceof Function_) { + if (!$this->has($index)) { return null; } - if ($node instanceof ClassMethod) { - $name = $this->classMethodName($node); - } else { - $name = $this->functionName($node); - } - $statements = $node->getStmts(); - assert(is_array($statements)); - $this->result[] = new Complexity($name, $this->cyclomaticComplexity($statements)); - if ($this->shortCircuitTraversal) { - return NodeTraverser::DONT_TRAVERSE_CHILDREN; - } - return null; - } - public function result() : ComplexityCollection - { - return ComplexityCollection::fromList(...$this->result); + return $this->types[$index]; } /** - * @param Stmt[] $statements + * Tests if this compound type has a type with the given index. */ - private function cyclomaticComplexity(array $statements) : int + public function has(int $index) : bool { - $traverser = new NodeTraverser(); - $cyclomaticComplexityCalculatingVisitor = new CyclomaticComplexityCalculatingVisitor(); - $traverser->addVisitor($cyclomaticComplexityCalculatingVisitor); - /* @noinspection UnusedFunctionResultInspection */ - $traverser->traverse($statements); - return $cyclomaticComplexityCalculatingVisitor->cyclomaticComplexity(); + return array_key_exists($index, $this->types); } - private function classMethodName(ClassMethod $node) : string + /** + * Tests if this compound type contains the given type. + */ + public function contains(Type $type) : bool { - $parent = $node->getAttribute('parent'); - assert($parent instanceof Class_ || $parent instanceof Trait_); - assert(isset($parent->namespacedName)); - assert($parent->namespacedName instanceof Name); - return $parent->namespacedName->toString() . '::' . $node->name->toString(); + foreach ($this->types as $typePart) { + // if the type is duplicate; do not add it + if ((string) $typePart === (string) $type) { + return \true; + } + } + return \false; } - private function functionName(Function_ $node) : string + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string { - assert(isset($node->namespacedName)); - assert($node->namespacedName instanceof Name); - return $node->namespacedName->toString(); + return implode($this->token, $this->types); } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\Complexity; - -use function get_class; -use PHPUnit\PhpParser\Node; -use PHPUnit\PhpParser\Node\Expr\BinaryOp\BooleanAnd; -use PHPUnit\PhpParser\Node\Expr\BinaryOp\BooleanOr; -use PHPUnit\PhpParser\Node\Expr\BinaryOp\LogicalAnd; -use PHPUnit\PhpParser\Node\Expr\BinaryOp\LogicalOr; -use PHPUnit\PhpParser\Node\Expr\Ternary; -use PHPUnit\PhpParser\Node\Stmt\Case_; -use PHPUnit\PhpParser\Node\Stmt\Catch_; -use PHPUnit\PhpParser\Node\Stmt\ElseIf_; -use PHPUnit\PhpParser\Node\Stmt\For_; -use PHPUnit\PhpParser\Node\Stmt\Foreach_; -use PHPUnit\PhpParser\Node\Stmt\If_; -use PHPUnit\PhpParser\Node\Stmt\While_; -use PHPUnit\PhpParser\NodeVisitorAbstract; -final class CyclomaticComplexityCalculatingVisitor extends NodeVisitorAbstract -{ /** - * @var int + * @return ArrayIterator */ - private $cyclomaticComplexity = 1; - public function enterNode(Node $node) : void + public function getIterator() : ArrayIterator { - /* @noinspection GetClassMissUseInspection */ - switch (get_class($node)) { - case BooleanAnd::class: - case BooleanOr::class: - case Case_::class: - case Catch_::class: - case ElseIf_::class: - case For_::class: - case Foreach_::class: - case If_::class: - case LogicalAnd::class: - case LogicalOr::class: - case Ternary::class: - case While_::class: - $this->cyclomaticComplexity++; - } + return new ArrayIterator($this->types); } - public function cyclomaticComplexity() : int + /** + * @psalm-suppress ImpureMethodCall + */ + private function add(Type $type) : void { - return $this->cyclomaticComplexity; + if ($type instanceof self) { + foreach ($type->getIterator() as $subType) { + $this->add($subType); + } + return; + } + // if the type is duplicate; do not add it + if ($this->contains($type)) { + return; + } + $this->types[] = $type; } } -Object Reflector - -Copyright (c) 2017-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\LinesOfCode; +namespace PHPUnit\phpDocumentor\Reflection\Types; -use InvalidArgumentException; -final class NegativeValueException extends InvalidArgumentException implements Exception +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +/** + * Value Object representing a array-key Type. + * + * A array-key Type is the supertype (but not a union) of int and string. + * + * @psalm-immutable + */ +final class ArrayKey extends AggregatedType implements PseudoType { + public function __construct() + { + parent::__construct([new String_(), new Integer()], '|'); + } + public function underlyingType() : Type + { + return new Compound([new String_(), new Integer()]); + } + public function __toString() : string + { + return 'array-key'; + } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\LinesOfCode; +namespace PHPUnit\phpDocumentor\Reflection\Types; -use LogicException; -final class IllogicalValuesException extends LogicException implements Exception +/** + * Represents an array type as described in the PSR-5, the PHPDoc Standard. + * + * An array can be represented in two forms: + * + * 1. Untyped (`array`), where the key and value type is unknown and hence classified as 'Mixed_'. + * 2. Types (`string[]`), where the value type is provided by preceding an opening and closing square bracket with a + * type name. + * + * @psalm-immutable + */ +class Array_ extends AbstractList { } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\LinesOfCode; +namespace PHPUnit\phpDocumentor\Reflection\Types; -final class RuntimeException extends \RuntimeException implements Exception +use PHPUnit\phpDocumentor\Reflection\Type; +/** + * Value Object representing a Boolean type. + * + * @psalm-immutable + */ +class Boolean implements Type { + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + return 'bool'; + } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\LinesOfCode; +namespace PHPUnit\phpDocumentor\Reflection\Types; -use Throwable; -interface Exception extends Throwable +use PHPUnit\phpDocumentor\Reflection\Type; +/** + * Value Object representing a Callable type. + * + * @psalm-immutable + */ +final class Callable_ implements Type { + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + return 'callable'; + } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\LinesOfCode; +namespace PHPUnit\phpDocumentor\Reflection\Types; -use function substr_count; -use PHPUnit\PhpParser\Error; -use PHPUnit\PhpParser\Lexer; -use PHPUnit\PhpParser\Node; -use PHPUnit\PhpParser\NodeTraverser; -use PHPUnit\PhpParser\Parser; -use PHPUnit\PhpParser\ParserFactory; -final class Counter +use PHPUnit\phpDocumentor\Reflection\Fqsen; +use PHPUnit\phpDocumentor\Reflection\PseudoType; +use PHPUnit\phpDocumentor\Reflection\Type; +/** + * Value Object representing the type 'string'. + * + * @psalm-immutable + */ +final class ClassString extends String_ implements PseudoType { + /** @var Fqsen|null */ + private $fqsen; /** - * @throws RuntimeException + * Initializes this representation of a class string with the given Fqsen. */ - public function countInSourceFile(string $sourceFile) : LinesOfCode + public function __construct(?Fqsen $fqsen = null) { - return $this->countInSourceString(\file_get_contents($sourceFile)); + $this->fqsen = $fqsen; + } + public function underlyingType() : Type + { + return new String_(); } /** - * @throws RuntimeException + * Returns the FQSEN associated with this object. */ - public function countInSourceString(string $source) : LinesOfCode + public function getFqsen() : ?Fqsen { - $linesOfCode = substr_count($source, "\n"); - if ($linesOfCode === 0 && !empty($source)) { - $linesOfCode = 1; - } - try { - $nodes = $this->parser()->parse($source); - \assert($nodes !== null); - return $this->countInAbstractSyntaxTree($linesOfCode, $nodes); - // @codeCoverageIgnoreStart - } catch (Error $error) { - throw new RuntimeException($error->getMessage(), (int) $error->getCode(), $error); - } - // @codeCoverageIgnoreEnd + return $this->fqsen; } /** - * @param Node[] $nodes - * - * @throws RuntimeException + * Returns a rendered output of the Type as it would be used in a DocBlock. */ - public function countInAbstractSyntaxTree(int $linesOfCode, array $nodes) : LinesOfCode + public function __toString() : string { - $traverser = new NodeTraverser(); - $visitor = new LineCountingVisitor($linesOfCode); - $traverser->addVisitor($visitor); - try { - /* @noinspection UnusedFunctionResultInspection */ - $traverser->traverse($nodes); - // @codeCoverageIgnoreStart - } catch (Error $error) { - throw new RuntimeException($error->getMessage(), (int) $error->getCode(), $error); + if ($this->fqsen === null) { + return 'class-string'; } - // @codeCoverageIgnoreEnd - return $visitor->result(); - } - private function parser() : Parser - { - return (new ParserFactory())->create(ParserFactory::PREFER_PHP7, new Lexer()); + return 'class-string<' . (string) $this->fqsen . '>'; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\LinesOfCode; +namespace PHPUnit\phpDocumentor\Reflection\Types; +use PHPUnit\phpDocumentor\Reflection\Fqsen; +use PHPUnit\phpDocumentor\Reflection\Type; /** + * Represents a collection type as described in the PSR-5, the PHPDoc Standard. + * + * A collection can be represented in two forms: + * + * 1. `ACollectionObject` + * 2. `ACollectionObject` + * + * - ACollectionObject can be 'array' or an object that can act as an array + * - aValueType and aKeyType can be any type expression + * * @psalm-immutable */ -final class LinesOfCode +final class Collection extends AbstractList { + /** @var Fqsen|null */ + private $fqsen; /** - * @var int - */ - private $linesOfCode; - /** - * @var int - */ - private $commentLinesOfCode; - /** - * @var int + * Initializes this representation of an array with the given Type or Fqsen. */ - private $nonCommentLinesOfCode; + public function __construct(?Fqsen $fqsen, Type $valueType, ?Type $keyType = null) + { + parent::__construct($valueType, $keyType); + $this->fqsen = $fqsen; + } /** - * @var int + * Returns the FQSEN associated with this object. */ - private $logicalLinesOfCode; + public function getFqsen() : ?Fqsen + { + return $this->fqsen; + } /** - * @throws IllogicalValuesException - * @throws NegativeValueException + * Returns a rendered output of the Type as it would be used in a DocBlock. */ - public function __construct(int $linesOfCode, int $commentLinesOfCode, int $nonCommentLinesOfCode, int $logicalLinesOfCode) + public function __toString() : string { - if ($linesOfCode < 0) { - throw new NegativeValueException('$linesOfCode must not be negative'); - } - if ($commentLinesOfCode < 0) { - throw new NegativeValueException('$commentLinesOfCode must not be negative'); - } - if ($nonCommentLinesOfCode < 0) { - throw new NegativeValueException('$nonCommentLinesOfCode must not be negative'); - } - if ($logicalLinesOfCode < 0) { - throw new NegativeValueException('$logicalLinesOfCode must not be negative'); - } - if ($linesOfCode - $commentLinesOfCode !== $nonCommentLinesOfCode) { - throw new IllogicalValuesException('$linesOfCode !== $commentLinesOfCode + $nonCommentLinesOfCode'); + $objectType = (string) ($this->fqsen ?? 'object'); + if ($this->keyType === null) { + return $objectType . '<' . $this->valueType . '>'; } - $this->linesOfCode = $linesOfCode; - $this->commentLinesOfCode = $commentLinesOfCode; - $this->nonCommentLinesOfCode = $nonCommentLinesOfCode; - $this->logicalLinesOfCode = $logicalLinesOfCode; - } - public function linesOfCode() : int - { - return $this->linesOfCode; - } - public function commentLinesOfCode() : int - { - return $this->commentLinesOfCode; - } - public function nonCommentLinesOfCode() : int - { - return $this->nonCommentLinesOfCode; - } - public function logicalLinesOfCode() : int - { - return $this->logicalLinesOfCode; - } - public function plus(self $other) : self - { - return new self($this->linesOfCode() + $other->linesOfCode(), $this->commentLinesOfCode() + $other->commentLinesOfCode(), $this->nonCommentLinesOfCode() + $other->nonCommentLinesOfCode(), $this->logicalLinesOfCode() + $other->logicalLinesOfCode()); + return $objectType . '<' . $this->keyType . ',' . $this->valueType . '>'; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\LinesOfCode; +namespace PHPUnit\phpDocumentor\Reflection\Types; -use function array_merge; -use function array_unique; -use function count; -use PHPUnit\PhpParser\Comment; -use PHPUnit\PhpParser\Node; -use PHPUnit\PhpParser\Node\Expr; -use PHPUnit\PhpParser\NodeVisitorAbstract; -final class LineCountingVisitor extends NodeVisitorAbstract +use PHPUnit\phpDocumentor\Reflection\Type; +/** + * Value Object representing a Compound Type. + * + * A Compound Type is not so much a special keyword or object reference but is a series of Types that are separated + * using an OR operator (`|`). This combination of types signifies that whatever is associated with this compound type + * may contain a value with any of the given types. + * + * @psalm-immutable + */ +final class Compound extends AggregatedType { /** - * @var int - */ - private $linesOfCode; - /** - * @var Comment[] - */ - private $comments = []; - /** - * @var int[] - */ - private $linesWithStatements = []; - public function __construct(int $linesOfCode) - { - $this->linesOfCode = $linesOfCode; - } - public function enterNode(Node $node) : void - { - $this->comments = array_merge($this->comments, $node->getComments()); - if (!$node instanceof Expr) { - return; - } - $this->linesWithStatements[] = $node->getStartLine(); - } - public function result() : LinesOfCode - { - $commentLinesOfCode = 0; - foreach ($this->comments() as $comment) { - $commentLinesOfCode += $comment->getEndLine() - $comment->getStartLine() + 1; - } - return new LinesOfCode($this->linesOfCode, $commentLinesOfCode, $this->linesOfCode - $commentLinesOfCode, count(array_unique($this->linesWithStatements))); - } - /** - * @return Comment[] + * Initializes a compound type (i.e. `string|int`) and tests if the provided types all implement the Type interface. + * + * @param array $types */ - private function comments() : array + public function __construct(array $types) { - $comments = []; - foreach ($this->comments as $comment) { - $comments[$comment->getStartLine() . '_' . $comment->getStartTokenPos() . '_' . $comment->getEndLine() . '_' . $comment->getEndTokenPos()] = $comment; - } - return $comments; + parent::__construct($types, '|'); } } -sebastian/lines-of-code - -Copyright (c) 2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -phpunit/phpunit: 9.5.10 -doctrine/instantiator: 1.4.0 -myclabs/deep-copy: 1.10.2 -nikic/php-parser: v4.13.0 -phar-io/manifest: 2.0.3 -phar-io/version: 3.1.0 -phpdocumentor/reflection-common: 2.2.0 -phpdocumentor/reflection-docblock: 5.2.2 -phpdocumentor/type-resolver: 1.5.0 -phpspec/prophecy: 1.14.0 -phpunit/php-code-coverage: 9.2.7 -phpunit/php-file-iterator: 3.0.5 -phpunit/php-invoker: 3.1.1 -phpunit/php-text-template: 2.0.4 -phpunit/php-timer: 5.0.3 -sebastian/cli-parser: 1.0.1 -sebastian/code-unit: 1.0.8 -sebastian/code-unit-reverse-lookup: 2.0.3 -sebastian/comparator: 4.0.6 -sebastian/complexity: 2.0.2 -sebastian/diff: 4.0.4 -sebastian/environment: 5.1.3 -sebastian/exporter: 4.0.3 -sebastian/global-state: 5.0.3 -sebastian/lines-of-code: 1.0.3 -sebastian/object-enumerator: 4.0.4 -sebastian/object-reflector: 2.0.4 -sebastian/recursion-context: 4.0.4 -sebastian/resource-operations: 3.0.3 -sebastian/type: 2.3.4 -sebastian/version: 3.0.2 -symfony/polyfill-ctype: v1.23.0 -theseer/tokenizer: 1.2.1 -webmozart/assert: 1.10.0 Fully Qualified Namespace. + * @psalm-var array + */ + private $namespaceAliases; + /** + * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) + * format (without a preceding `\`). + * + * @param string $namespace The namespace where this DocBlock resides in. + * @param string[] $namespaceAliases List of namespace aliases => Fully Qualified Namespace. + * @psalm-param array $namespaceAliases + */ + public function __construct(string $namespace, array $namespaceAliases = []) + { + $this->namespace = $namespace !== 'global' && $namespace !== 'default' ? trim($namespace, '\\') : ''; + foreach ($namespaceAliases as $alias => $fqnn) { + if ($fqnn[0] === '\\') { + $fqnn = substr($fqnn, 1); + } + if ($fqnn[strlen($fqnn) - 1] === '\\') { + $fqnn = substr($fqnn, 0, -1); + } + $namespaceAliases[$alias] = $fqnn; + } + $this->namespaceAliases = $namespaceAliases; + } /** - * @template T of object - * @phpstan-param ReflectionClass $reflectionClass + * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. */ - public static function fromSerializationTriggeredException(ReflectionClass $reflectionClass, Exception $exception) : self + public function getNamespace() : string { - return new self(sprintf('An exception was raised while trying to instantiate an instance of "%s" via un-serialization', $reflectionClass->getName()), 0, $exception); + return $this->namespace; } /** - * @template T of object - * @phpstan-param ReflectionClass $reflectionClass + * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent + * the alias for the imported Namespace. + * + * @return string[] + * @psalm-return array */ - public static function fromUncleanUnSerialization(ReflectionClass $reflectionClass, string $errorString, int $errorCode, string $errorFile, int $errorLine) : self + public function getNamespaceAliases() : array { - return new self(sprintf('Could not produce an instance of "%s" via un-serialization, since an error was triggered ' . 'in file "%s" at line "%d"', $reflectionClass->getName(), $errorFile, $errorLine), 0, new Exception($errorString, $errorCode)); + return $this->namespaceAliases; } } $reflectionClass - */ - public static function fromAbstractClass(ReflectionClass $reflectionClass) : self - { - return new self(sprintf('The provided class "%s" is abstract, and can not be instantiated', $reflectionClass->getName())); - } -} - $reflector */ + return $this->createFromReflectionClass($reflector); } - if (isset(self::$cachedInstantiators[$className])) { - $factory = self::$cachedInstantiators[$className]; - return $factory(); + if ($reflector instanceof ReflectionParameter) { + return $this->createFromReflectionParameter($reflector); } - return $this->buildAndCacheFromFactory($className); + if ($reflector instanceof ReflectionMethod) { + return $this->createFromReflectionMethod($reflector); + } + if ($reflector instanceof ReflectionProperty) { + return $this->createFromReflectionProperty($reflector); + } + if ($reflector instanceof ReflectionClassConstant) { + return $this->createFromReflectionClassConstant($reflector); + } + throw new UnexpectedValueException('Unhandled \\Reflector instance given: ' . get_class($reflector)); } - /** - * Builds the requested object and caches it in static properties for performance - * - * @return object - * - * @template T of object - * @phpstan-param class-string $className - * - * @phpstan-return T - */ - private function buildAndCacheFromFactory(string $className) + private function createFromReflectionParameter(ReflectionParameter $parameter) : Context { - $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className); - $instance = $factory(); - if ($this->isSafeToClone(new ReflectionClass($instance))) { - self::$cachedCloneables[$className] = clone $instance; + $class = $parameter->getDeclaringClass(); + if (!$class) { + throw new InvalidArgumentException('Unable to get class of ' . $parameter->getName()); } - return $instance; + return $this->createFromReflectionClass($class); } - /** - * Builds a callable capable of instantiating the given $className without - * invoking its constructor. - * - * @throws InvalidArgumentException - * @throws UnexpectedValueException - * @throws ReflectionException - * - * @template T of object - * @phpstan-param class-string $className - * - * @phpstan-return callable(): T - */ - private function buildFactory(string $className) : callable + private function createFromReflectionMethod(ReflectionMethod $method) : Context { - $reflectionClass = $this->getReflectionClass($className); - if ($this->isInstantiableViaReflection($reflectionClass)) { - return [$reflectionClass, 'newInstanceWithoutConstructor']; - } - $serializedString = sprintf('%s:%d:"%s":0:{}', is_subclass_of($className, Serializable::class) ? self::SERIALIZATION_FORMAT_USE_UNSERIALIZER : self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER, strlen($className), $className); - $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString); - return static function () use($serializedString) { - return unserialize($serializedString); - }; + $class = $method->getDeclaringClass(); + return $this->createFromReflectionClass($class); } - /** - * @throws InvalidArgumentException - * @throws ReflectionException - * - * @template T of object - * @phpstan-param class-string $className - * - * @phpstan-return ReflectionClass - */ - private function getReflectionClass(string $className) : ReflectionClass + private function createFromReflectionProperty(ReflectionProperty $property) : Context { - if (!class_exists($className)) { - throw InvalidArgumentException::fromNonExistingClass($className); - } - $reflection = new ReflectionClass($className); - if ($reflection->isAbstract()) { - throw InvalidArgumentException::fromAbstractClass($reflection); - } - return $reflection; + $class = $property->getDeclaringClass(); + return $this->createFromReflectionClass($class); + } + private function createFromReflectionClassConstant(ReflectionClassConstant $constant) : Context + { + //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable + /** @phpstan-var ReflectionClass $class */ + $class = $constant->getDeclaringClass(); + return $this->createFromReflectionClass($class); } /** - * @throws UnexpectedValueException - * - * @template T of object - * @phpstan-param ReflectionClass $reflectionClass + * @phpstan-param ReflectionClass $class */ - private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, string $serializedString) : void + private function createFromReflectionClass(ReflectionClass $class) : Context { - set_error_handler(static function (int $code, string $message, string $file, int $line) use($reflectionClass, &$error) : bool { - $error = UnexpectedValueException::fromUncleanUnSerialization($reflectionClass, $message, $code, $file, $line); - return \true; - }); - try { - $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString); - } finally { - restore_error_handler(); - } - if ($error) { - throw $error; + $fileName = $class->getFileName(); + $namespace = $class->getNamespaceName(); + if (is_string($fileName) && file_exists($fileName)) { + $contents = file_get_contents($fileName); + if ($contents === \false) { + throw new RuntimeException('Unable to read file "' . $fileName . '"'); + } + return $this->createForNamespace($namespace, $contents); } + return new Context($namespace, []); } /** - * @throws UnexpectedValueException + * Build a Context for a namespace in the provided file contents. * - * @template T of object - * @phpstan-param ReflectionClass $reflectionClass + * @see Context for more information on Contexts. + * + * @param string $namespace It does not matter if a `\` precedes the namespace name, + * this method first normalizes. + * @param string $fileContents The file's contents to retrieve the aliases from with the given namespace. */ - private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, string $serializedString) : void + public function createForNamespace(string $namespace, string $fileContents) : Context { - try { - unserialize($serializedString); - } catch (Exception $exception) { - throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception); + $namespace = trim($namespace, '\\'); + $useStatements = []; + $currentNamespace = ''; + $tokens = new ArrayIterator(token_get_all($fileContents)); + while ($tokens->valid()) { + $currentToken = $tokens->current(); + switch ($currentToken[0]) { + case T_NAMESPACE: + $currentNamespace = $this->parseNamespace($tokens); + break; + case T_CLASS: + // Fast-forward the iterator through the class so that any + // T_USE tokens found within are skipped - these are not + // valid namespace use statements so should be ignored. + $braceLevel = 0; + $firstBraceFound = \false; + while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { + $currentToken = $tokens->current(); + if ($currentToken === '{' || in_array($currentToken[0], [T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES], \true)) { + if (!$firstBraceFound) { + $firstBraceFound = \true; + } + ++$braceLevel; + } + if ($currentToken === '}') { + --$braceLevel; + } + $tokens->next(); + } + break; + case T_USE: + if ($currentNamespace === $namespace) { + $useStatements += $this->parseUseStatement($tokens); + } + break; + } + $tokens->next(); } + return new Context($namespace, $useStatements); } /** - * @template T of object - * @phpstan-param ReflectionClass $reflectionClass + * Deduce the name from tokens when we are at the T_NAMESPACE token. + * + * @param ArrayIterator $tokens */ - private function isInstantiableViaReflection(ReflectionClass $reflectionClass) : bool + private function parseNamespace(ArrayIterator $tokens) : string { - return !($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal()); + // skip to the first string or namespace separator + $this->skipToNextStringOrNamespaceSeparator($tokens); + $name = ''; + $acceptedTokens = [T_STRING, T_NS_SEPARATOR, T_NAME_QUALIFIED]; + while ($tokens->valid() && in_array($tokens->current()[0], $acceptedTokens, \true)) { + $name .= $tokens->current()[1]; + $tokens->next(); + } + return $name; } /** - * Verifies whether the given class is to be considered internal + * Deduce the names of all imports when we are at the T_USE token. * - * @template T of object - * @phpstan-param ReflectionClass $reflectionClass + * @param ArrayIterator $tokens + * + * @return string[] + * @psalm-return array */ - private function hasInternalAncestors(ReflectionClass $reflectionClass) : bool + private function parseUseStatement(ArrayIterator $tokens) : array { - do { - if ($reflectionClass->isInternal()) { - return \true; + $uses = []; + while ($tokens->valid()) { + $this->skipToNextStringOrNamespaceSeparator($tokens); + $uses += $this->extractUseStatements($tokens); + $currentToken = $tokens->current(); + if ($currentToken[0] === self::T_LITERAL_END_OF_USE) { + return $uses; } - $reflectionClass = $reflectionClass->getParentClass(); - } while ($reflectionClass); - return \false; + } + return $uses; } /** - * Checks if a class is cloneable - * - * Classes implementing `__clone` cannot be safely cloned, as that may cause side-effects. + * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. * - * @template T of object - * @phpstan-param ReflectionClass $reflectionClass + * @param ArrayIterator $tokens */ - private function isSafeToClone(ReflectionClass $reflectionClass) : bool + private function skipToNextStringOrNamespaceSeparator(ArrayIterator $tokens) : void { - return $reflectionClass->isCloneable() && !$reflectionClass->hasMethod('__clone') && !$reflectionClass->isSubclassOf(ArrayIterator::class); + while ($tokens->valid()) { + $currentToken = $tokens->current(); + if (in_array($currentToken[0], [T_STRING, T_NS_SEPARATOR], \true)) { + break; + } + if ($currentToken[0] === T_NAME_QUALIFIED) { + break; + } + if (defined('T_NAME_FULLY_QUALIFIED') && $currentToken[0] === T_NAME_FULLY_QUALIFIED) { + break; + } + $tokens->next(); + } } -} - namespace. * - * @return object + * @param ArrayIterator $tokens * - * @throws ExceptionInterface + * @return string[] + * @psalm-return array * - * @template T of object - * @phpstan-param class-string $className + * @psalm-suppress TypeDoesNotContainType */ - public function instantiate($className); -} -Copyright (c) 2014 Doctrine Project - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + private function extractUseStatements(ArrayIterator $tokens) : array + { + $extractedUseStatements = []; + $groupedNs = ''; + $currentNs = ''; + $currentAlias = ''; + $state = 'start'; + while ($tokens->valid()) { + $currentToken = $tokens->current(); + $tokenId = is_string($currentToken) ? $currentToken : $currentToken[0]; + $tokenValue = is_string($currentToken) ? null : $currentToken[1]; + switch ($state) { + case 'start': + switch ($tokenId) { + case T_STRING: + case T_NS_SEPARATOR: + $currentNs .= (string) $tokenValue; + $currentAlias = $tokenValue; + break; + case T_NAME_QUALIFIED: + case T_NAME_FULLY_QUALIFIED: + $currentNs .= (string) $tokenValue; + $currentAlias = substr((string) $tokenValue, (int) strrpos((string) $tokenValue, '\\') + 1); + break; + case T_CURLY_OPEN: + case '{': + $state = 'grouped'; + $groupedNs = $currentNs; + break; + case T_AS: + $state = 'start-alias'; + break; + case self::T_LITERAL_USE_SEPARATOR: + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + break; + case 'start-alias': + switch ($tokenId) { + case T_STRING: + $currentAlias = $tokenValue; + break; + case self::T_LITERAL_USE_SEPARATOR: + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + break; + case 'grouped': + switch ($tokenId) { + case T_STRING: + case T_NS_SEPARATOR: + $currentNs .= (string) $tokenValue; + $currentAlias = $tokenValue; + break; + case T_AS: + $state = 'grouped-alias'; + break; + case self::T_LITERAL_USE_SEPARATOR: + $state = 'grouped'; + $extractedUseStatements[(string) $currentAlias] = $currentNs; + $currentNs = $groupedNs; + $currentAlias = ''; + break; + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + break; + case 'grouped-alias': + switch ($tokenId) { + case T_STRING: + $currentAlias = $tokenValue; + break; + case self::T_LITERAL_USE_SEPARATOR: + $state = 'grouped'; + $extractedUseStatements[(string) $currentAlias] = $currentNs; + $currentNs = $groupedNs; + $currentAlias = ''; + break; + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + } + if ($state === 'end') { + break; + } + $tokens->next(); + } + if ($groupedNs !== $currentNs) { + $extractedUseStatements[(string) $currentAlias] = $currentNs; + } + return $extractedUseStatements; + } +} +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\ResourceOperations; +namespace PHPUnit\phpDocumentor\Reflection\Types; -final class ResourceOperations +use PHPUnit\phpDocumentor\Reflection\Type; +/** + * Represents an expression type as described in the PSR-5, the PHPDoc Standard. + * + * @psalm-immutable + */ +final class Expression implements Type { + /** @var Type */ + protected $valueType; /** - * @return string[] + * Initializes this representation of an array with the given Type. */ - public static function getFunctions() : array + public function __construct(Type $valueType) { - return ['Directory::close', 'Directory::read', 'Directory::rewind', 'DirectoryIterator::openFile', 'FilesystemIterator::openFile', 'Gmagick::readimagefile', 'HttpResponse::getRequestBodyStream', 'HttpResponse::getStream', 'HttpResponse::setStream', 'Imagick::pingImageFile', 'Imagick::readImageFile', 'Imagick::writeImageFile', 'Imagick::writeImagesFile', 'MongoGridFSCursor::__construct', 'MongoGridFSFile::getResource', 'MysqlndUhConnection::stmtInit', 'MysqlndUhConnection::storeResult', 'MysqlndUhConnection::useResult', 'PDF_activate_item', 'PDF_add_launchlink', 'PDF_add_locallink', 'PDF_add_nameddest', 'PDF_add_note', 'PDF_add_pdflink', 'PDF_add_table_cell', 'PDF_add_textflow', 'PDF_add_thumbnail', 'PDF_add_weblink', 'PDF_arc', 'PDF_arcn', 'PDF_attach_file', 'PDF_begin_document', 'PDF_begin_font', 'PDF_begin_glyph', 'PDF_begin_item', 'PDF_begin_layer', 'PDF_begin_page', 'PDF_begin_page_ext', 'PDF_begin_pattern', 'PDF_begin_template', 'PDF_begin_template_ext', 'PDF_circle', 'PDF_clip', 'PDF_close', 'PDF_close_image', 'PDF_close_pdi', 'PDF_close_pdi_page', 'PDF_closepath', 'PDF_closepath_fill_stroke', 'PDF_closepath_stroke', 'PDF_concat', 'PDF_continue_text', 'PDF_create_3dview', 'PDF_create_action', 'PDF_create_annotation', 'PDF_create_bookmark', 'PDF_create_field', 'PDF_create_fieldgroup', 'PDF_create_gstate', 'PDF_create_pvf', 'PDF_create_textflow', 'PDF_curveto', 'PDF_define_layer', 'PDF_delete', 'PDF_delete_pvf', 'PDF_delete_table', 'PDF_delete_textflow', 'PDF_encoding_set_char', 'PDF_end_document', 'PDF_end_font', 'PDF_end_glyph', 'PDF_end_item', 'PDF_end_layer', 'PDF_end_page', 'PDF_end_page_ext', 'PDF_end_pattern', 'PDF_end_template', 'PDF_endpath', 'PDF_fill', 'PDF_fill_imageblock', 'PDF_fill_pdfblock', 'PDF_fill_stroke', 'PDF_fill_textblock', 'PDF_findfont', 'PDF_fit_image', 'PDF_fit_pdi_page', 'PDF_fit_table', 'PDF_fit_textflow', 'PDF_fit_textline', 'PDF_get_apiname', 'PDF_get_buffer', 'PDF_get_errmsg', 'PDF_get_errnum', 'PDF_get_parameter', 'PDF_get_pdi_parameter', 'PDF_get_pdi_value', 'PDF_get_value', 'PDF_info_font', 'PDF_info_matchbox', 'PDF_info_table', 'PDF_info_textflow', 'PDF_info_textline', 'PDF_initgraphics', 'PDF_lineto', 'PDF_load_3ddata', 'PDF_load_font', 'PDF_load_iccprofile', 'PDF_load_image', 'PDF_makespotcolor', 'PDF_moveto', 'PDF_new', 'PDF_open_ccitt', 'PDF_open_file', 'PDF_open_image', 'PDF_open_image_file', 'PDF_open_memory_image', 'PDF_open_pdi', 'PDF_open_pdi_document', 'PDF_open_pdi_page', 'PDF_pcos_get_number', 'PDF_pcos_get_stream', 'PDF_pcos_get_string', 'PDF_place_image', 'PDF_place_pdi_page', 'PDF_process_pdi', 'PDF_rect', 'PDF_restore', 'PDF_resume_page', 'PDF_rotate', 'PDF_save', 'PDF_scale', 'PDF_set_border_color', 'PDF_set_border_dash', 'PDF_set_border_style', 'PDF_set_gstate', 'PDF_set_info', 'PDF_set_layer_dependency', 'PDF_set_parameter', 'PDF_set_text_pos', 'PDF_set_value', 'PDF_setcolor', 'PDF_setdash', 'PDF_setdashpattern', 'PDF_setflat', 'PDF_setfont', 'PDF_setgray', 'PDF_setgray_fill', 'PDF_setgray_stroke', 'PDF_setlinecap', 'PDF_setlinejoin', 'PDF_setlinewidth', 'PDF_setmatrix', 'PDF_setmiterlimit', 'PDF_setrgbcolor', 'PDF_setrgbcolor_fill', 'PDF_setrgbcolor_stroke', 'PDF_shading', 'PDF_shading_pattern', 'PDF_shfill', 'PDF_show', 'PDF_show_boxed', 'PDF_show_xy', 'PDF_skew', 'PDF_stringwidth', 'PDF_stroke', 'PDF_suspend_page', 'PDF_translate', 'PDF_utf16_to_utf8', 'PDF_utf32_to_utf16', 'PDF_utf8_to_utf16', 'PDO::pgsqlLOBOpen', 'RarEntry::getStream', 'SQLite3::openBlob', 'SWFMovie::saveToFile', 'SplFileInfo::openFile', 'SplFileObject::openFile', 'SplTempFileObject::openFile', 'V8Js::compileString', 'V8Js::executeScript', 'Vtiful\\Kernel\\Excel::setColumn', 'Vtiful\\Kernel\\Excel::setRow', 'Vtiful\\Kernel\\Format::align', 'Vtiful\\Kernel\\Format::bold', 'Vtiful\\Kernel\\Format::italic', 'Vtiful\\Kernel\\Format::underline', 'XMLWriter::openMemory', 'XMLWriter::openURI', 'ZipArchive::getStream', 'Zookeeper::setLogStream', 'apc_bin_dumpfile', 'apc_bin_loadfile', 'bbcode_add_element', 'bbcode_add_smiley', 'bbcode_create', 'bbcode_destroy', 'bbcode_parse', 'bbcode_set_arg_parser', 'bbcode_set_flags', 'bcompiler_read', 'bcompiler_write_class', 'bcompiler_write_constant', 'bcompiler_write_exe_footer', 'bcompiler_write_file', 'bcompiler_write_footer', 'bcompiler_write_function', 'bcompiler_write_functions_from_file', 'bcompiler_write_header', 'bcompiler_write_included_filename', 'bzclose', 'bzerrno', 'bzerror', 'bzerrstr', 'bzflush', 'bzopen', 'bzread', 'bzwrite', 'cairo_surface_write_to_png', 'closedir', 'copy', 'crack_closedict', 'crack_opendict', 'cubrid_bind', 'cubrid_close_prepare', 'cubrid_close_request', 'cubrid_col_get', 'cubrid_col_size', 'cubrid_column_names', 'cubrid_column_types', 'cubrid_commit', 'cubrid_connect', 'cubrid_connect_with_url', 'cubrid_current_oid', 'cubrid_db_parameter', 'cubrid_disconnect', 'cubrid_drop', 'cubrid_fetch', 'cubrid_free_result', 'cubrid_get', 'cubrid_get_autocommit', 'cubrid_get_charset', 'cubrid_get_class_name', 'cubrid_get_db_parameter', 'cubrid_get_query_timeout', 'cubrid_get_server_info', 'cubrid_insert_id', 'cubrid_is_instance', 'cubrid_lob2_bind', 'cubrid_lob2_close', 'cubrid_lob2_export', 'cubrid_lob2_import', 'cubrid_lob2_new', 'cubrid_lob2_read', 'cubrid_lob2_seek', 'cubrid_lob2_seek64', 'cubrid_lob2_size', 'cubrid_lob2_size64', 'cubrid_lob2_tell', 'cubrid_lob2_tell64', 'cubrid_lob2_write', 'cubrid_lob_export', 'cubrid_lob_get', 'cubrid_lob_send', 'cubrid_lob_size', 'cubrid_lock_read', 'cubrid_lock_write', 'cubrid_move_cursor', 'cubrid_next_result', 'cubrid_num_cols', 'cubrid_num_rows', 'cubrid_pconnect', 'cubrid_pconnect_with_url', 'cubrid_prepare', 'cubrid_put', 'cubrid_query', 'cubrid_rollback', 'cubrid_schema', 'cubrid_seq_add', 'cubrid_seq_drop', 'cubrid_seq_insert', 'cubrid_seq_put', 'cubrid_set_add', 'cubrid_set_autocommit', 'cubrid_set_db_parameter', 'cubrid_set_drop', 'cubrid_set_query_timeout', 'cubrid_unbuffered_query', 'curl_close', 'curl_copy_handle', 'curl_errno', 'curl_error', 'curl_escape', 'curl_exec', 'curl_getinfo', 'curl_multi_add_handle', 'curl_multi_close', 'curl_multi_errno', 'curl_multi_exec', 'curl_multi_getcontent', 'curl_multi_info_read', 'curl_multi_remove_handle', 'curl_multi_select', 'curl_multi_setopt', 'curl_pause', 'curl_reset', 'curl_setopt', 'curl_setopt_array', 'curl_share_close', 'curl_share_errno', 'curl_share_init', 'curl_share_setopt', 'curl_unescape', 'cyrus_authenticate', 'cyrus_bind', 'cyrus_close', 'cyrus_connect', 'cyrus_query', 'cyrus_unbind', 'db2_autocommit', 'db2_bind_param', 'db2_client_info', 'db2_close', 'db2_column_privileges', 'db2_columns', 'db2_commit', 'db2_conn_error', 'db2_conn_errormsg', 'db2_connect', 'db2_cursor_type', 'db2_exec', 'db2_execute', 'db2_fetch_array', 'db2_fetch_assoc', 'db2_fetch_both', 'db2_fetch_object', 'db2_fetch_row', 'db2_field_display_size', 'db2_field_name', 'db2_field_num', 'db2_field_precision', 'db2_field_scale', 'db2_field_type', 'db2_field_width', 'db2_foreign_keys', 'db2_free_result', 'db2_free_stmt', 'db2_get_option', 'db2_last_insert_id', 'db2_lob_read', 'db2_next_result', 'db2_num_fields', 'db2_num_rows', 'db2_pclose', 'db2_pconnect', 'db2_prepare', 'db2_primary_keys', 'db2_procedure_columns', 'db2_procedures', 'db2_result', 'db2_rollback', 'db2_server_info', 'db2_set_option', 'db2_special_columns', 'db2_statistics', 'db2_stmt_error', 'db2_stmt_errormsg', 'db2_table_privileges', 'db2_tables', 'dba_close', 'dba_delete', 'dba_exists', 'dba_fetch', 'dba_firstkey', 'dba_insert', 'dba_nextkey', 'dba_open', 'dba_optimize', 'dba_popen', 'dba_replace', 'dba_sync', 'dbplus_add', 'dbplus_aql', 'dbplus_close', 'dbplus_curr', 'dbplus_find', 'dbplus_first', 'dbplus_flush', 'dbplus_freelock', 'dbplus_freerlocks', 'dbplus_getlock', 'dbplus_getunique', 'dbplus_info', 'dbplus_last', 'dbplus_lockrel', 'dbplus_next', 'dbplus_open', 'dbplus_prev', 'dbplus_rchperm', 'dbplus_rcreate', 'dbplus_rcrtexact', 'dbplus_rcrtlike', 'dbplus_restorepos', 'dbplus_rkeys', 'dbplus_ropen', 'dbplus_rquery', 'dbplus_rrename', 'dbplus_rsecindex', 'dbplus_runlink', 'dbplus_rzap', 'dbplus_savepos', 'dbplus_setindex', 'dbplus_setindexbynumber', 'dbplus_sql', 'dbplus_tremove', 'dbplus_undo', 'dbplus_undoprepare', 'dbplus_unlockrel', 'dbplus_unselect', 'dbplus_update', 'dbplus_xlockrel', 'dbplus_xunlockrel', 'deflate_add', 'dio_close', 'dio_fcntl', 'dio_open', 'dio_read', 'dio_seek', 'dio_stat', 'dio_tcsetattr', 'dio_truncate', 'dio_write', 'dir', 'eio_busy', 'eio_cancel', 'eio_chmod', 'eio_chown', 'eio_close', 'eio_custom', 'eio_dup2', 'eio_fallocate', 'eio_fchmod', 'eio_fchown', 'eio_fdatasync', 'eio_fstat', 'eio_fstatvfs', 'eio_fsync', 'eio_ftruncate', 'eio_futime', 'eio_get_last_error', 'eio_grp', 'eio_grp_add', 'eio_grp_cancel', 'eio_grp_limit', 'eio_link', 'eio_lstat', 'eio_mkdir', 'eio_mknod', 'eio_nop', 'eio_open', 'eio_read', 'eio_readahead', 'eio_readdir', 'eio_readlink', 'eio_realpath', 'eio_rename', 'eio_rmdir', 'eio_seek', 'eio_sendfile', 'eio_stat', 'eio_statvfs', 'eio_symlink', 'eio_sync', 'eio_sync_file_range', 'eio_syncfs', 'eio_truncate', 'eio_unlink', 'eio_utime', 'eio_write', 'enchant_broker_describe', 'enchant_broker_dict_exists', 'enchant_broker_free', 'enchant_broker_free_dict', 'enchant_broker_get_dict_path', 'enchant_broker_get_error', 'enchant_broker_init', 'enchant_broker_list_dicts', 'enchant_broker_request_dict', 'enchant_broker_request_pwl_dict', 'enchant_broker_set_dict_path', 'enchant_broker_set_ordering', 'enchant_dict_add_to_personal', 'enchant_dict_add_to_session', 'enchant_dict_check', 'enchant_dict_describe', 'enchant_dict_get_error', 'enchant_dict_is_in_session', 'enchant_dict_quick_check', 'enchant_dict_store_replacement', 'enchant_dict_suggest', 'event_add', 'event_base_free', 'event_base_loop', 'event_base_loopbreak', 'event_base_loopexit', 'event_base_new', 'event_base_priority_init', 'event_base_reinit', 'event_base_set', 'event_buffer_base_set', 'event_buffer_disable', 'event_buffer_enable', 'event_buffer_fd_set', 'event_buffer_free', 'event_buffer_new', 'event_buffer_priority_set', 'event_buffer_read', 'event_buffer_set_callback', 'event_buffer_timeout_set', 'event_buffer_watermark_set', 'event_buffer_write', 'event_del', 'event_free', 'event_new', 'event_priority_set', 'event_set', 'event_timer_add', 'event_timer_del', 'event_timer_pending', 'event_timer_set', 'expect_expectl', 'expect_popen', 'fam_cancel_monitor', 'fam_close', 'fam_monitor_collection', 'fam_monitor_directory', 'fam_monitor_file', 'fam_next_event', 'fam_open', 'fam_pending', 'fam_resume_monitor', 'fam_suspend_monitor', 'fann_cascadetrain_on_data', 'fann_cascadetrain_on_file', 'fann_clear_scaling_params', 'fann_copy', 'fann_create_from_file', 'fann_create_shortcut_array', 'fann_create_standard', 'fann_create_standard_array', 'fann_create_train', 'fann_create_train_from_callback', 'fann_descale_input', 'fann_descale_output', 'fann_descale_train', 'fann_destroy', 'fann_destroy_train', 'fann_duplicate_train_data', 'fann_get_MSE', 'fann_get_activation_function', 'fann_get_activation_steepness', 'fann_get_bias_array', 'fann_get_bit_fail', 'fann_get_bit_fail_limit', 'fann_get_cascade_activation_functions', 'fann_get_cascade_activation_functions_count', 'fann_get_cascade_activation_steepnesses', 'fann_get_cascade_activation_steepnesses_count', 'fann_get_cascade_candidate_change_fraction', 'fann_get_cascade_candidate_limit', 'fann_get_cascade_candidate_stagnation_epochs', 'fann_get_cascade_max_cand_epochs', 'fann_get_cascade_max_out_epochs', 'fann_get_cascade_min_cand_epochs', 'fann_get_cascade_min_out_epochs', 'fann_get_cascade_num_candidate_groups', 'fann_get_cascade_num_candidates', 'fann_get_cascade_output_change_fraction', 'fann_get_cascade_output_stagnation_epochs', 'fann_get_cascade_weight_multiplier', 'fann_get_connection_array', 'fann_get_connection_rate', 'fann_get_errno', 'fann_get_errstr', 'fann_get_layer_array', 'fann_get_learning_momentum', 'fann_get_learning_rate', 'fann_get_network_type', 'fann_get_num_input', 'fann_get_num_layers', 'fann_get_num_output', 'fann_get_quickprop_decay', 'fann_get_quickprop_mu', 'fann_get_rprop_decrease_factor', 'fann_get_rprop_delta_max', 'fann_get_rprop_delta_min', 'fann_get_rprop_delta_zero', 'fann_get_rprop_increase_factor', 'fann_get_sarprop_step_error_shift', 'fann_get_sarprop_step_error_threshold_factor', 'fann_get_sarprop_temperature', 'fann_get_sarprop_weight_decay_shift', 'fann_get_total_connections', 'fann_get_total_neurons', 'fann_get_train_error_function', 'fann_get_train_stop_function', 'fann_get_training_algorithm', 'fann_init_weights', 'fann_length_train_data', 'fann_merge_train_data', 'fann_num_input_train_data', 'fann_num_output_train_data', 'fann_randomize_weights', 'fann_read_train_from_file', 'fann_reset_errno', 'fann_reset_errstr', 'fann_run', 'fann_save', 'fann_save_train', 'fann_scale_input', 'fann_scale_input_train_data', 'fann_scale_output', 'fann_scale_output_train_data', 'fann_scale_train', 'fann_scale_train_data', 'fann_set_activation_function', 'fann_set_activation_function_hidden', 'fann_set_activation_function_layer', 'fann_set_activation_function_output', 'fann_set_activation_steepness', 'fann_set_activation_steepness_hidden', 'fann_set_activation_steepness_layer', 'fann_set_activation_steepness_output', 'fann_set_bit_fail_limit', 'fann_set_callback', 'fann_set_cascade_activation_functions', 'fann_set_cascade_activation_steepnesses', 'fann_set_cascade_candidate_change_fraction', 'fann_set_cascade_candidate_limit', 'fann_set_cascade_candidate_stagnation_epochs', 'fann_set_cascade_max_cand_epochs', 'fann_set_cascade_max_out_epochs', 'fann_set_cascade_min_cand_epochs', 'fann_set_cascade_min_out_epochs', 'fann_set_cascade_num_candidate_groups', 'fann_set_cascade_output_change_fraction', 'fann_set_cascade_output_stagnation_epochs', 'fann_set_cascade_weight_multiplier', 'fann_set_error_log', 'fann_set_input_scaling_params', 'fann_set_learning_momentum', 'fann_set_learning_rate', 'fann_set_output_scaling_params', 'fann_set_quickprop_decay', 'fann_set_quickprop_mu', 'fann_set_rprop_decrease_factor', 'fann_set_rprop_delta_max', 'fann_set_rprop_delta_min', 'fann_set_rprop_delta_zero', 'fann_set_rprop_increase_factor', 'fann_set_sarprop_step_error_shift', 'fann_set_sarprop_step_error_threshold_factor', 'fann_set_sarprop_temperature', 'fann_set_sarprop_weight_decay_shift', 'fann_set_scaling_params', 'fann_set_train_error_function', 'fann_set_train_stop_function', 'fann_set_training_algorithm', 'fann_set_weight', 'fann_set_weight_array', 'fann_shuffle_train_data', 'fann_subset_train_data', 'fann_test', 'fann_test_data', 'fann_train', 'fann_train_epoch', 'fann_train_on_data', 'fann_train_on_file', 'fbsql_affected_rows', 'fbsql_autocommit', 'fbsql_blob_size', 'fbsql_change_user', 'fbsql_clob_size', 'fbsql_close', 'fbsql_commit', 'fbsql_connect', 'fbsql_create_blob', 'fbsql_create_clob', 'fbsql_create_db', 'fbsql_data_seek', 'fbsql_database', 'fbsql_database_password', 'fbsql_db_query', 'fbsql_db_status', 'fbsql_drop_db', 'fbsql_errno', 'fbsql_error', 'fbsql_fetch_array', 'fbsql_fetch_assoc', 'fbsql_fetch_field', 'fbsql_fetch_lengths', 'fbsql_fetch_object', 'fbsql_fetch_row', 'fbsql_field_flags', 'fbsql_field_len', 'fbsql_field_name', 'fbsql_field_seek', 'fbsql_field_table', 'fbsql_field_type', 'fbsql_free_result', 'fbsql_get_autostart_info', 'fbsql_hostname', 'fbsql_insert_id', 'fbsql_list_dbs', 'fbsql_list_fields', 'fbsql_list_tables', 'fbsql_next_result', 'fbsql_num_fields', 'fbsql_num_rows', 'fbsql_password', 'fbsql_pconnect', 'fbsql_query', 'fbsql_read_blob', 'fbsql_read_clob', 'fbsql_result', 'fbsql_rollback', 'fbsql_rows_fetched', 'fbsql_select_db', 'fbsql_set_characterset', 'fbsql_set_lob_mode', 'fbsql_set_password', 'fbsql_set_transaction', 'fbsql_start_db', 'fbsql_stop_db', 'fbsql_table_name', 'fbsql_username', 'fclose', 'fdf_add_doc_javascript', 'fdf_add_template', 'fdf_close', 'fdf_create', 'fdf_enum_values', 'fdf_get_ap', 'fdf_get_attachment', 'fdf_get_encoding', 'fdf_get_file', 'fdf_get_flags', 'fdf_get_opt', 'fdf_get_status', 'fdf_get_value', 'fdf_get_version', 'fdf_next_field_name', 'fdf_open', 'fdf_open_string', 'fdf_remove_item', 'fdf_save', 'fdf_save_string', 'fdf_set_ap', 'fdf_set_encoding', 'fdf_set_file', 'fdf_set_flags', 'fdf_set_javascript_action', 'fdf_set_on_import_javascript', 'fdf_set_opt', 'fdf_set_status', 'fdf_set_submit_form_action', 'fdf_set_target_frame', 'fdf_set_value', 'fdf_set_version', 'feof', 'fflush', 'ffmpeg_frame::__construct', 'ffmpeg_frame::toGDImage', 'fgetc', 'fgetcsv', 'fgets', 'fgetss', 'file', 'file_get_contents', 'file_put_contents', 'finfo::buffer', 'finfo::file', 'finfo_buffer', 'finfo_close', 'finfo_file', 'finfo_open', 'finfo_set_flags', 'flock', 'fopen', 'fpassthru', 'fprintf', 'fputcsv', 'fputs', 'fread', 'fscanf', 'fseek', 'fstat', 'ftell', 'ftp_alloc', 'ftp_append', 'ftp_cdup', 'ftp_chdir', 'ftp_chmod', 'ftp_close', 'ftp_delete', 'ftp_exec', 'ftp_fget', 'ftp_fput', 'ftp_get', 'ftp_get_option', 'ftp_login', 'ftp_mdtm', 'ftp_mkdir', 'ftp_mlsd', 'ftp_nb_continue', 'ftp_nb_fget', 'ftp_nb_fput', 'ftp_nb_get', 'ftp_nb_put', 'ftp_nlist', 'ftp_pasv', 'ftp_put', 'ftp_pwd', 'ftp_quit', 'ftp_raw', 'ftp_rawlist', 'ftp_rename', 'ftp_rmdir', 'ftp_set_option', 'ftp_site', 'ftp_size', 'ftp_systype', 'ftruncate', 'fwrite', 'get_resource_type', 'gmp_div', 'gnupg::init', 'gnupg_adddecryptkey', 'gnupg_addencryptkey', 'gnupg_addsignkey', 'gnupg_cleardecryptkeys', 'gnupg_clearencryptkeys', 'gnupg_clearsignkeys', 'gnupg_decrypt', 'gnupg_decryptverify', 'gnupg_encrypt', 'gnupg_encryptsign', 'gnupg_export', 'gnupg_geterror', 'gnupg_getprotocol', 'gnupg_import', 'gnupg_init', 'gnupg_keyinfo', 'gnupg_setarmor', 'gnupg_seterrormode', 'gnupg_setsignmode', 'gnupg_sign', 'gnupg_verify', 'gupnp_context_get_host_ip', 'gupnp_context_get_port', 'gupnp_context_get_subscription_timeout', 'gupnp_context_host_path', 'gupnp_context_new', 'gupnp_context_set_subscription_timeout', 'gupnp_context_timeout_add', 'gupnp_context_unhost_path', 'gupnp_control_point_browse_start', 'gupnp_control_point_browse_stop', 'gupnp_control_point_callback_set', 'gupnp_control_point_new', 'gupnp_device_action_callback_set', 'gupnp_device_info_get', 'gupnp_device_info_get_service', 'gupnp_root_device_get_available', 'gupnp_root_device_get_relative_location', 'gupnp_root_device_new', 'gupnp_root_device_set_available', 'gupnp_root_device_start', 'gupnp_root_device_stop', 'gupnp_service_action_get', 'gupnp_service_action_return', 'gupnp_service_action_return_error', 'gupnp_service_action_set', 'gupnp_service_freeze_notify', 'gupnp_service_info_get', 'gupnp_service_info_get_introspection', 'gupnp_service_introspection_get_state_variable', 'gupnp_service_notify', 'gupnp_service_proxy_action_get', 'gupnp_service_proxy_action_set', 'gupnp_service_proxy_add_notify', 'gupnp_service_proxy_callback_set', 'gupnp_service_proxy_get_subscribed', 'gupnp_service_proxy_remove_notify', 'gupnp_service_proxy_send_action', 'gupnp_service_proxy_set_subscribed', 'gupnp_service_thaw_notify', 'gzclose', 'gzeof', 'gzgetc', 'gzgets', 'gzgetss', 'gzpassthru', 'gzputs', 'gzread', 'gzrewind', 'gzseek', 'gztell', 'gzwrite', 'hash_update_stream', 'http\\Env\\Response::send', 'http_get_request_body_stream', 'ibase_add_user', 'ibase_affected_rows', 'ibase_backup', 'ibase_blob_add', 'ibase_blob_cancel', 'ibase_blob_close', 'ibase_blob_create', 'ibase_blob_get', 'ibase_blob_open', 'ibase_close', 'ibase_commit', 'ibase_commit_ret', 'ibase_connect', 'ibase_db_info', 'ibase_delete_user', 'ibase_drop_db', 'ibase_execute', 'ibase_fetch_assoc', 'ibase_fetch_object', 'ibase_fetch_row', 'ibase_field_info', 'ibase_free_event_handler', 'ibase_free_query', 'ibase_free_result', 'ibase_gen_id', 'ibase_maintain_db', 'ibase_modify_user', 'ibase_name_result', 'ibase_num_fields', 'ibase_num_params', 'ibase_param_info', 'ibase_pconnect', 'ibase_prepare', 'ibase_query', 'ibase_restore', 'ibase_rollback', 'ibase_rollback_ret', 'ibase_server_info', 'ibase_service_attach', 'ibase_service_detach', 'ibase_set_event_handler', 'ibase_trans', 'ifx_affected_rows', 'ifx_close', 'ifx_connect', 'ifx_do', 'ifx_error', 'ifx_fetch_row', 'ifx_fieldproperties', 'ifx_fieldtypes', 'ifx_free_result', 'ifx_getsqlca', 'ifx_htmltbl_result', 'ifx_num_fields', 'ifx_num_rows', 'ifx_pconnect', 'ifx_prepare', 'ifx_query', 'image2wbmp', 'imageaffine', 'imagealphablending', 'imageantialias', 'imagearc', 'imagebmp', 'imagechar', 'imagecharup', 'imagecolorallocate', 'imagecolorallocatealpha', 'imagecolorat', 'imagecolorclosest', 'imagecolorclosestalpha', 'imagecolorclosesthwb', 'imagecolordeallocate', 'imagecolorexact', 'imagecolorexactalpha', 'imagecolormatch', 'imagecolorresolve', 'imagecolorresolvealpha', 'imagecolorset', 'imagecolorsforindex', 'imagecolorstotal', 'imagecolortransparent', 'imageconvolution', 'imagecopy', 'imagecopymerge', 'imagecopymergegray', 'imagecopyresampled', 'imagecopyresized', 'imagecrop', 'imagecropauto', 'imagedashedline', 'imagedestroy', 'imageellipse', 'imagefill', 'imagefilledarc', 'imagefilledellipse', 'imagefilledpolygon', 'imagefilledrectangle', 'imagefilltoborder', 'imagefilter', 'imageflip', 'imagefttext', 'imagegammacorrect', 'imagegd', 'imagegd2', 'imagegetclip', 'imagegif', 'imagegrabscreen', 'imagegrabwindow', 'imageinterlace', 'imageistruecolor', 'imagejpeg', 'imagelayereffect', 'imageline', 'imageopenpolygon', 'imagepalettecopy', 'imagepalettetotruecolor', 'imagepng', 'imagepolygon', 'imagepsencodefont', 'imagepsextendfont', 'imagepsfreefont', 'imagepsloadfont', 'imagepsslantfont', 'imagepstext', 'imagerectangle', 'imageresolution', 'imagerotate', 'imagesavealpha', 'imagescale', 'imagesetbrush', 'imagesetclip', 'imagesetinterpolation', 'imagesetpixel', 'imagesetstyle', 'imagesetthickness', 'imagesettile', 'imagestring', 'imagestringup', 'imagesx', 'imagesy', 'imagetruecolortopalette', 'imagettftext', 'imagewbmp', 'imagewebp', 'imagexbm', 'imap_append', 'imap_body', 'imap_bodystruct', 'imap_check', 'imap_clearflag_full', 'imap_close', 'imap_create', 'imap_createmailbox', 'imap_delete', 'imap_deletemailbox', 'imap_expunge', 'imap_fetch_overview', 'imap_fetchbody', 'imap_fetchheader', 'imap_fetchmime', 'imap_fetchstructure', 'imap_fetchtext', 'imap_gc', 'imap_get_quota', 'imap_get_quotaroot', 'imap_getacl', 'imap_getmailboxes', 'imap_getsubscribed', 'imap_header', 'imap_headerinfo', 'imap_headers', 'imap_list', 'imap_listmailbox', 'imap_listscan', 'imap_listsubscribed', 'imap_lsub', 'imap_mail_copy', 'imap_mail_move', 'imap_mailboxmsginfo', 'imap_msgno', 'imap_num_msg', 'imap_num_recent', 'imap_ping', 'imap_rename', 'imap_renamemailbox', 'imap_reopen', 'imap_savebody', 'imap_scan', 'imap_scanmailbox', 'imap_search', 'imap_set_quota', 'imap_setacl', 'imap_setflag_full', 'imap_sort', 'imap_status', 'imap_subscribe', 'imap_thread', 'imap_uid', 'imap_undelete', 'imap_unsubscribe', 'inflate_add', 'inflate_get_read_len', 'inflate_get_status', 'ingres_autocommit', 'ingres_autocommit_state', 'ingres_charset', 'ingres_close', 'ingres_commit', 'ingres_connect', 'ingres_cursor', 'ingres_errno', 'ingres_error', 'ingres_errsqlstate', 'ingres_escape_string', 'ingres_execute', 'ingres_fetch_array', 'ingres_fetch_assoc', 'ingres_fetch_object', 'ingres_fetch_proc_return', 'ingres_fetch_row', 'ingres_field_length', 'ingres_field_name', 'ingres_field_nullable', 'ingres_field_precision', 'ingres_field_scale', 'ingres_field_type', 'ingres_free_result', 'ingres_next_error', 'ingres_num_fields', 'ingres_num_rows', 'ingres_pconnect', 'ingres_prepare', 'ingres_query', 'ingres_result_seek', 'ingres_rollback', 'ingres_set_environment', 'ingres_unbuffered_query', 'inotify_add_watch', 'inotify_init', 'inotify_queue_len', 'inotify_read', 'inotify_rm_watch', 'kadm5_chpass_principal', 'kadm5_create_principal', 'kadm5_delete_principal', 'kadm5_destroy', 'kadm5_flush', 'kadm5_get_policies', 'kadm5_get_principal', 'kadm5_get_principals', 'kadm5_init_with_password', 'kadm5_modify_principal', 'ldap_add', 'ldap_bind', 'ldap_close', 'ldap_compare', 'ldap_control_paged_result', 'ldap_control_paged_result_response', 'ldap_count_entries', 'ldap_delete', 'ldap_errno', 'ldap_error', 'ldap_exop', 'ldap_exop_passwd', 'ldap_exop_refresh', 'ldap_exop_whoami', 'ldap_first_attribute', 'ldap_first_entry', 'ldap_first_reference', 'ldap_free_result', 'ldap_get_attributes', 'ldap_get_dn', 'ldap_get_entries', 'ldap_get_option', 'ldap_get_values', 'ldap_get_values_len', 'ldap_mod_add', 'ldap_mod_del', 'ldap_mod_replace', 'ldap_modify', 'ldap_modify_batch', 'ldap_next_attribute', 'ldap_next_entry', 'ldap_next_reference', 'ldap_parse_exop', 'ldap_parse_reference', 'ldap_parse_result', 'ldap_rename', 'ldap_sasl_bind', 'ldap_set_option', 'ldap_set_rebind_proc', 'ldap_sort', 'ldap_start_tls', 'ldap_unbind', 'libxml_set_streams_context', 'm_checkstatus', 'm_completeauthorizations', 'm_connect', 'm_connectionerror', 'm_deletetrans', 'm_destroyconn', 'm_getcell', 'm_getcellbynum', 'm_getcommadelimited', 'm_getheader', 'm_initconn', 'm_iscommadelimited', 'm_maxconntimeout', 'm_monitor', 'm_numcolumns', 'm_numrows', 'm_parsecommadelimited', 'm_responsekeys', 'm_responseparam', 'm_returnstatus', 'm_setblocking', 'm_setdropfile', 'm_setip', 'm_setssl', 'm_setssl_cafile', 'm_setssl_files', 'm_settimeout', 'm_transactionssent', 'm_transinqueue', 'm_transkeyval', 'm_transnew', 'm_transsend', 'm_validateidentifier', 'm_verifyconnection', 'm_verifysslcert', 'mailparse_determine_best_xfer_encoding', 'mailparse_msg_create', 'mailparse_msg_extract_part', 'mailparse_msg_extract_part_file', 'mailparse_msg_extract_whole_part_file', 'mailparse_msg_free', 'mailparse_msg_get_part', 'mailparse_msg_get_part_data', 'mailparse_msg_get_structure', 'mailparse_msg_parse', 'mailparse_msg_parse_file', 'mailparse_stream_encode', 'mailparse_uudecode_all', 'maxdb::use_result', 'maxdb_affected_rows', 'maxdb_connect', 'maxdb_disable_rpl_parse', 'maxdb_dump_debug_info', 'maxdb_embedded_connect', 'maxdb_enable_reads_from_master', 'maxdb_enable_rpl_parse', 'maxdb_errno', 'maxdb_error', 'maxdb_fetch_lengths', 'maxdb_field_tell', 'maxdb_get_host_info', 'maxdb_get_proto_info', 'maxdb_get_server_info', 'maxdb_get_server_version', 'maxdb_info', 'maxdb_init', 'maxdb_insert_id', 'maxdb_master_query', 'maxdb_more_results', 'maxdb_next_result', 'maxdb_num_fields', 'maxdb_num_rows', 'maxdb_rpl_parse_enabled', 'maxdb_rpl_probe', 'maxdb_select_db', 'maxdb_sqlstate', 'maxdb_stmt::result_metadata', 'maxdb_stmt_affected_rows', 'maxdb_stmt_errno', 'maxdb_stmt_error', 'maxdb_stmt_num_rows', 'maxdb_stmt_param_count', 'maxdb_stmt_result_metadata', 'maxdb_stmt_sqlstate', 'maxdb_thread_id', 'maxdb_use_result', 'maxdb_warning_count', 'mcrypt_enc_get_algorithms_name', 'mcrypt_enc_get_block_size', 'mcrypt_enc_get_iv_size', 'mcrypt_enc_get_key_size', 'mcrypt_enc_get_modes_name', 'mcrypt_enc_get_supported_key_sizes', 'mcrypt_enc_is_block_algorithm', 'mcrypt_enc_is_block_algorithm_mode', 'mcrypt_enc_is_block_mode', 'mcrypt_enc_self_test', 'mcrypt_generic', 'mcrypt_generic_deinit', 'mcrypt_generic_end', 'mcrypt_generic_init', 'mcrypt_module_close', 'mcrypt_module_open', 'mdecrypt_generic', 'mkdir', 'mqseries_back', 'mqseries_begin', 'mqseries_close', 'mqseries_cmit', 'mqseries_conn', 'mqseries_connx', 'mqseries_disc', 'mqseries_get', 'mqseries_inq', 'mqseries_open', 'mqseries_put', 'mqseries_put1', 'mqseries_set', 'msg_get_queue', 'msg_receive', 'msg_remove_queue', 'msg_send', 'msg_set_queue', 'msg_stat_queue', 'msql_affected_rows', 'msql_close', 'msql_connect', 'msql_create_db', 'msql_data_seek', 'msql_db_query', 'msql_drop_db', 'msql_fetch_array', 'msql_fetch_field', 'msql_fetch_object', 'msql_fetch_row', 'msql_field_flags', 'msql_field_len', 'msql_field_name', 'msql_field_seek', 'msql_field_table', 'msql_field_type', 'msql_free_result', 'msql_list_dbs', 'msql_list_fields', 'msql_list_tables', 'msql_num_fields', 'msql_num_rows', 'msql_pconnect', 'msql_query', 'msql_result', 'msql_select_db', 'mssql_bind', 'mssql_close', 'mssql_connect', 'mssql_data_seek', 'mssql_execute', 'mssql_fetch_array', 'mssql_fetch_assoc', 'mssql_fetch_batch', 'mssql_fetch_field', 'mssql_fetch_object', 'mssql_fetch_row', 'mssql_field_length', 'mssql_field_name', 'mssql_field_seek', 'mssql_field_type', 'mssql_free_result', 'mssql_free_statement', 'mssql_init', 'mssql_next_result', 'mssql_num_fields', 'mssql_num_rows', 'mssql_pconnect', 'mssql_query', 'mssql_result', 'mssql_rows_affected', 'mssql_select_db', 'mysql_affected_rows', 'mysql_client_encoding', 'mysql_close', 'mysql_connect', 'mysql_create_db', 'mysql_data_seek', 'mysql_db_name', 'mysql_db_query', 'mysql_drop_db', 'mysql_errno', 'mysql_error', 'mysql_fetch_array', 'mysql_fetch_assoc', 'mysql_fetch_field', 'mysql_fetch_lengths', 'mysql_fetch_object', 'mysql_fetch_row', 'mysql_field_flags', 'mysql_field_len', 'mysql_field_name', 'mysql_field_seek', 'mysql_field_table', 'mysql_field_type', 'mysql_free_result', 'mysql_get_host_info', 'mysql_get_proto_info', 'mysql_get_server_info', 'mysql_info', 'mysql_insert_id', 'mysql_list_dbs', 'mysql_list_fields', 'mysql_list_processes', 'mysql_list_tables', 'mysql_num_fields', 'mysql_num_rows', 'mysql_pconnect', 'mysql_ping', 'mysql_query', 'mysql_real_escape_string', 'mysql_result', 'mysql_select_db', 'mysql_set_charset', 'mysql_stat', 'mysql_tablename', 'mysql_thread_id', 'mysql_unbuffered_query', 'mysqlnd_uh_convert_to_mysqlnd', 'ncurses_bottom_panel', 'ncurses_del_panel', 'ncurses_delwin', 'ncurses_getmaxyx', 'ncurses_getyx', 'ncurses_hide_panel', 'ncurses_keypad', 'ncurses_meta', 'ncurses_move_panel', 'ncurses_mvwaddstr', 'ncurses_new_panel', 'ncurses_newpad', 'ncurses_newwin', 'ncurses_panel_above', 'ncurses_panel_below', 'ncurses_panel_window', 'ncurses_pnoutrefresh', 'ncurses_prefresh', 'ncurses_replace_panel', 'ncurses_show_panel', 'ncurses_top_panel', 'ncurses_waddch', 'ncurses_waddstr', 'ncurses_wattroff', 'ncurses_wattron', 'ncurses_wattrset', 'ncurses_wborder', 'ncurses_wclear', 'ncurses_wcolor_set', 'ncurses_werase', 'ncurses_wgetch', 'ncurses_whline', 'ncurses_wmouse_trafo', 'ncurses_wmove', 'ncurses_wnoutrefresh', 'ncurses_wrefresh', 'ncurses_wstandend', 'ncurses_wstandout', 'ncurses_wvline', 'newt_button', 'newt_button_bar', 'newt_checkbox', 'newt_checkbox_get_value', 'newt_checkbox_set_flags', 'newt_checkbox_set_value', 'newt_checkbox_tree', 'newt_checkbox_tree_add_item', 'newt_checkbox_tree_find_item', 'newt_checkbox_tree_get_current', 'newt_checkbox_tree_get_entry_value', 'newt_checkbox_tree_get_multi_selection', 'newt_checkbox_tree_get_selection', 'newt_checkbox_tree_multi', 'newt_checkbox_tree_set_current', 'newt_checkbox_tree_set_entry', 'newt_checkbox_tree_set_entry_value', 'newt_checkbox_tree_set_width', 'newt_compact_button', 'newt_component_add_callback', 'newt_component_takes_focus', 'newt_create_grid', 'newt_draw_form', 'newt_entry', 'newt_entry_get_value', 'newt_entry_set', 'newt_entry_set_filter', 'newt_entry_set_flags', 'newt_form', 'newt_form_add_component', 'newt_form_add_components', 'newt_form_add_hot_key', 'newt_form_destroy', 'newt_form_get_current', 'newt_form_run', 'newt_form_set_background', 'newt_form_set_height', 'newt_form_set_size', 'newt_form_set_timer', 'newt_form_set_width', 'newt_form_watch_fd', 'newt_grid_add_components_to_form', 'newt_grid_basic_window', 'newt_grid_free', 'newt_grid_get_size', 'newt_grid_h_close_stacked', 'newt_grid_h_stacked', 'newt_grid_place', 'newt_grid_set_field', 'newt_grid_simple_window', 'newt_grid_v_close_stacked', 'newt_grid_v_stacked', 'newt_grid_wrapped_window', 'newt_grid_wrapped_window_at', 'newt_label', 'newt_label_set_text', 'newt_listbox', 'newt_listbox_append_entry', 'newt_listbox_clear', 'newt_listbox_clear_selection', 'newt_listbox_delete_entry', 'newt_listbox_get_current', 'newt_listbox_get_selection', 'newt_listbox_insert_entry', 'newt_listbox_item_count', 'newt_listbox_select_item', 'newt_listbox_set_current', 'newt_listbox_set_current_by_key', 'newt_listbox_set_data', 'newt_listbox_set_entry', 'newt_listbox_set_width', 'newt_listitem', 'newt_listitem_get_data', 'newt_listitem_set', 'newt_radio_get_current', 'newt_radiobutton', 'newt_run_form', 'newt_scale', 'newt_scale_set', 'newt_scrollbar_set', 'newt_textbox', 'newt_textbox_get_num_lines', 'newt_textbox_reflowed', 'newt_textbox_set_height', 'newt_textbox_set_text', 'newt_vertical_scrollbar', 'oci_bind_array_by_name', 'oci_bind_by_name', 'oci_cancel', 'oci_close', 'oci_commit', 'oci_connect', 'oci_define_by_name', 'oci_error', 'oci_execute', 'oci_fetch', 'oci_fetch_all', 'oci_fetch_array', 'oci_fetch_assoc', 'oci_fetch_object', 'oci_fetch_row', 'oci_field_is_null', 'oci_field_name', 'oci_field_precision', 'oci_field_scale', 'oci_field_size', 'oci_field_type', 'oci_field_type_raw', 'oci_free_cursor', 'oci_free_statement', 'oci_get_implicit_resultset', 'oci_new_collection', 'oci_new_connect', 'oci_new_cursor', 'oci_new_descriptor', 'oci_num_fields', 'oci_num_rows', 'oci_parse', 'oci_pconnect', 'oci_register_taf_callback', 'oci_result', 'oci_rollback', 'oci_server_version', 'oci_set_action', 'oci_set_client_identifier', 'oci_set_client_info', 'oci_set_module_name', 'oci_set_prefetch', 'oci_statement_type', 'oci_unregister_taf_callback', 'odbc_autocommit', 'odbc_close', 'odbc_columnprivileges', 'odbc_columns', 'odbc_commit', 'odbc_connect', 'odbc_cursor', 'odbc_data_source', 'odbc_do', 'odbc_error', 'odbc_errormsg', 'odbc_exec', 'odbc_execute', 'odbc_fetch_array', 'odbc_fetch_into', 'odbc_fetch_row', 'odbc_field_len', 'odbc_field_name', 'odbc_field_num', 'odbc_field_precision', 'odbc_field_scale', 'odbc_field_type', 'odbc_foreignkeys', 'odbc_free_result', 'odbc_gettypeinfo', 'odbc_next_result', 'odbc_num_fields', 'odbc_num_rows', 'odbc_pconnect', 'odbc_prepare', 'odbc_primarykeys', 'odbc_procedurecolumns', 'odbc_procedures', 'odbc_result', 'odbc_result_all', 'odbc_rollback', 'odbc_setoption', 'odbc_specialcolumns', 'odbc_statistics', 'odbc_tableprivileges', 'odbc_tables', 'openal_buffer_create', 'openal_buffer_data', 'openal_buffer_destroy', 'openal_buffer_get', 'openal_buffer_loadwav', 'openal_context_create', 'openal_context_current', 'openal_context_destroy', 'openal_context_process', 'openal_context_suspend', 'openal_device_close', 'openal_device_open', 'openal_source_create', 'openal_source_destroy', 'openal_source_get', 'openal_source_pause', 'openal_source_play', 'openal_source_rewind', 'openal_source_set', 'openal_source_stop', 'openal_stream', 'opendir', 'openssl_csr_new', 'openssl_dh_compute_key', 'openssl_free_key', 'openssl_pkey_export', 'openssl_pkey_free', 'openssl_pkey_get_details', 'openssl_spki_new', 'openssl_x509_free', 'pclose', 'pfsockopen', 'pg_affected_rows', 'pg_cancel_query', 'pg_client_encoding', 'pg_close', 'pg_connect_poll', 'pg_connection_busy', 'pg_connection_reset', 'pg_connection_status', 'pg_consume_input', 'pg_convert', 'pg_copy_from', 'pg_copy_to', 'pg_dbname', 'pg_delete', 'pg_end_copy', 'pg_escape_bytea', 'pg_escape_identifier', 'pg_escape_literal', 'pg_escape_string', 'pg_execute', 'pg_fetch_all', 'pg_fetch_all_columns', 'pg_fetch_array', 'pg_fetch_assoc', 'pg_fetch_row', 'pg_field_name', 'pg_field_num', 'pg_field_size', 'pg_field_table', 'pg_field_type', 'pg_field_type_oid', 'pg_flush', 'pg_free_result', 'pg_get_notify', 'pg_get_pid', 'pg_get_result', 'pg_host', 'pg_insert', 'pg_last_error', 'pg_last_notice', 'pg_last_oid', 'pg_lo_close', 'pg_lo_create', 'pg_lo_export', 'pg_lo_import', 'pg_lo_open', 'pg_lo_read', 'pg_lo_read_all', 'pg_lo_seek', 'pg_lo_tell', 'pg_lo_truncate', 'pg_lo_unlink', 'pg_lo_write', 'pg_meta_data', 'pg_num_fields', 'pg_num_rows', 'pg_options', 'pg_parameter_status', 'pg_ping', 'pg_port', 'pg_prepare', 'pg_put_line', 'pg_query', 'pg_query_params', 'pg_result_error', 'pg_result_error_field', 'pg_result_seek', 'pg_result_status', 'pg_select', 'pg_send_execute', 'pg_send_prepare', 'pg_send_query', 'pg_send_query_params', 'pg_set_client_encoding', 'pg_set_error_verbosity', 'pg_socket', 'pg_trace', 'pg_transaction_status', 'pg_tty', 'pg_untrace', 'pg_update', 'pg_version', 'php_user_filter::filter', 'proc_close', 'proc_get_status', 'proc_terminate', 'ps_add_bookmark', 'ps_add_launchlink', 'ps_add_locallink', 'ps_add_note', 'ps_add_pdflink', 'ps_add_weblink', 'ps_arc', 'ps_arcn', 'ps_begin_page', 'ps_begin_pattern', 'ps_begin_template', 'ps_circle', 'ps_clip', 'ps_close', 'ps_close_image', 'ps_closepath', 'ps_closepath_stroke', 'ps_continue_text', 'ps_curveto', 'ps_delete', 'ps_end_page', 'ps_end_pattern', 'ps_end_template', 'ps_fill', 'ps_fill_stroke', 'ps_findfont', 'ps_get_buffer', 'ps_get_parameter', 'ps_get_value', 'ps_hyphenate', 'ps_include_file', 'ps_lineto', 'ps_makespotcolor', 'ps_moveto', 'ps_new', 'ps_open_file', 'ps_open_image', 'ps_open_image_file', 'ps_open_memory_image', 'ps_place_image', 'ps_rect', 'ps_restore', 'ps_rotate', 'ps_save', 'ps_scale', 'ps_set_border_color', 'ps_set_border_dash', 'ps_set_border_style', 'ps_set_info', 'ps_set_parameter', 'ps_set_text_pos', 'ps_set_value', 'ps_setcolor', 'ps_setdash', 'ps_setflat', 'ps_setfont', 'ps_setgray', 'ps_setlinecap', 'ps_setlinejoin', 'ps_setlinewidth', 'ps_setmiterlimit', 'ps_setoverprintmode', 'ps_setpolydash', 'ps_shading', 'ps_shading_pattern', 'ps_shfill', 'ps_show', 'ps_show2', 'ps_show_boxed', 'ps_show_xy', 'ps_show_xy2', 'ps_string_geometry', 'ps_stringwidth', 'ps_stroke', 'ps_symbol', 'ps_symbol_name', 'ps_symbol_width', 'ps_translate', 'px_close', 'px_create_fp', 'px_date2string', 'px_delete', 'px_delete_record', 'px_get_field', 'px_get_info', 'px_get_parameter', 'px_get_record', 'px_get_schema', 'px_get_value', 'px_insert_record', 'px_new', 'px_numfields', 'px_numrecords', 'px_open_fp', 'px_put_record', 'px_retrieve_record', 'px_set_blob_file', 'px_set_parameter', 'px_set_tablename', 'px_set_targetencoding', 'px_set_value', 'px_timestamp2string', 'px_update_record', 'radius_acct_open', 'radius_add_server', 'radius_auth_open', 'radius_close', 'radius_config', 'radius_create_request', 'radius_demangle', 'radius_demangle_mppe_key', 'radius_get_attr', 'radius_put_addr', 'radius_put_attr', 'radius_put_int', 'radius_put_string', 'radius_put_vendor_addr', 'radius_put_vendor_attr', 'radius_put_vendor_int', 'radius_put_vendor_string', 'radius_request_authenticator', 'radius_salt_encrypt_attr', 'radius_send_request', 'radius_server_secret', 'radius_strerror', 'readdir', 'readfile', 'recode_file', 'rename', 'rewind', 'rewinddir', 'rmdir', 'rpm_close', 'rpm_get_tag', 'rpm_open', 'sapi_windows_vt100_support', 'scandir', 'sem_acquire', 'sem_get', 'sem_release', 'sem_remove', 'set_file_buffer', 'shm_attach', 'shm_detach', 'shm_get_var', 'shm_has_var', 'shm_put_var', 'shm_remove', 'shm_remove_var', 'shmop_close', 'shmop_delete', 'shmop_open', 'shmop_read', 'shmop_size', 'shmop_write', 'socket_accept', 'socket_addrinfo_bind', 'socket_addrinfo_connect', 'socket_addrinfo_explain', 'socket_bind', 'socket_clear_error', 'socket_close', 'socket_connect', 'socket_export_stream', 'socket_get_option', 'socket_get_status', 'socket_getopt', 'socket_getpeername', 'socket_getsockname', 'socket_import_stream', 'socket_last_error', 'socket_listen', 'socket_read', 'socket_recv', 'socket_recvfrom', 'socket_recvmsg', 'socket_send', 'socket_sendmsg', 'socket_sendto', 'socket_set_block', 'socket_set_blocking', 'socket_set_nonblock', 'socket_set_option', 'socket_set_timeout', 'socket_shutdown', 'socket_write', 'sqlite_close', 'sqlite_fetch_string', 'sqlite_has_more', 'sqlite_open', 'sqlite_popen', 'sqlsrv_begin_transaction', 'sqlsrv_cancel', 'sqlsrv_client_info', 'sqlsrv_close', 'sqlsrv_commit', 'sqlsrv_connect', 'sqlsrv_execute', 'sqlsrv_fetch', 'sqlsrv_fetch_array', 'sqlsrv_fetch_object', 'sqlsrv_field_metadata', 'sqlsrv_free_stmt', 'sqlsrv_get_field', 'sqlsrv_has_rows', 'sqlsrv_next_result', 'sqlsrv_num_fields', 'sqlsrv_num_rows', 'sqlsrv_prepare', 'sqlsrv_query', 'sqlsrv_rollback', 'sqlsrv_rows_affected', 'sqlsrv_send_stream_data', 'sqlsrv_server_info', 'ssh2_auth_agent', 'ssh2_auth_hostbased_file', 'ssh2_auth_none', 'ssh2_auth_password', 'ssh2_auth_pubkey_file', 'ssh2_disconnect', 'ssh2_exec', 'ssh2_fetch_stream', 'ssh2_fingerprint', 'ssh2_methods_negotiated', 'ssh2_publickey_add', 'ssh2_publickey_init', 'ssh2_publickey_list', 'ssh2_publickey_remove', 'ssh2_scp_recv', 'ssh2_scp_send', 'ssh2_sftp', 'ssh2_sftp_chmod', 'ssh2_sftp_lstat', 'ssh2_sftp_mkdir', 'ssh2_sftp_readlink', 'ssh2_sftp_realpath', 'ssh2_sftp_rename', 'ssh2_sftp_rmdir', 'ssh2_sftp_stat', 'ssh2_sftp_symlink', 'ssh2_sftp_unlink', 'ssh2_shell', 'ssh2_tunnel', 'stomp_connect', 'streamWrapper::stream_cast', 'stream_bucket_append', 'stream_bucket_make_writeable', 'stream_bucket_new', 'stream_bucket_prepend', 'stream_context_create', 'stream_context_get_default', 'stream_context_get_options', 'stream_context_get_params', 'stream_context_set_default', 'stream_context_set_params', 'stream_copy_to_stream', 'stream_encoding', 'stream_filter_append', 'stream_filter_prepend', 'stream_filter_remove', 'stream_get_contents', 'stream_get_line', 'stream_get_meta_data', 'stream_isatty', 'stream_set_blocking', 'stream_set_chunk_size', 'stream_set_read_buffer', 'stream_set_timeout', 'stream_set_write_buffer', 'stream_socket_accept', 'stream_socket_client', 'stream_socket_enable_crypto', 'stream_socket_get_name', 'stream_socket_recvfrom', 'stream_socket_sendto', 'stream_socket_server', 'stream_socket_shutdown', 'stream_supports_lock', 'svn_fs_abort_txn', 'svn_fs_apply_text', 'svn_fs_begin_txn2', 'svn_fs_change_node_prop', 'svn_fs_check_path', 'svn_fs_contents_changed', 'svn_fs_copy', 'svn_fs_delete', 'svn_fs_dir_entries', 'svn_fs_file_contents', 'svn_fs_file_length', 'svn_fs_is_dir', 'svn_fs_is_file', 'svn_fs_make_dir', 'svn_fs_make_file', 'svn_fs_node_created_rev', 'svn_fs_node_prop', 'svn_fs_props_changed', 'svn_fs_revision_prop', 'svn_fs_revision_root', 'svn_fs_txn_root', 'svn_fs_youngest_rev', 'svn_repos_create', 'svn_repos_fs', 'svn_repos_fs_begin_txn_for_commit', 'svn_repos_fs_commit_txn', 'svn_repos_open', 'sybase_affected_rows', 'sybase_close', 'sybase_connect', 'sybase_data_seek', 'sybase_fetch_array', 'sybase_fetch_assoc', 'sybase_fetch_field', 'sybase_fetch_object', 'sybase_fetch_row', 'sybase_field_seek', 'sybase_free_result', 'sybase_num_fields', 'sybase_num_rows', 'sybase_pconnect', 'sybase_query', 'sybase_result', 'sybase_select_db', 'sybase_set_message_handler', 'sybase_unbuffered_query', 'tmpfile', 'udm_add_search_limit', 'udm_alloc_agent', 'udm_alloc_agent_array', 'udm_cat_list', 'udm_cat_path', 'udm_check_charset', 'udm_clear_search_limits', 'udm_crc32', 'udm_errno', 'udm_error', 'udm_find', 'udm_free_agent', 'udm_free_res', 'udm_get_doc_count', 'udm_get_res_field', 'udm_get_res_param', 'udm_hash32', 'udm_load_ispell_data', 'udm_set_agent_param', 'unlink', 'vfprintf', 'w32api_init_dtype', 'wddx_add_vars', 'wddx_packet_end', 'wddx_packet_start', 'xml_get_current_byte_index', 'xml_get_current_column_number', 'xml_get_current_line_number', 'xml_get_error_code', 'xml_parse', 'xml_parse_into_struct', 'xml_parser_create', 'xml_parser_create_ns', 'xml_parser_free', 'xml_parser_get_option', 'xml_parser_set_option', 'xml_set_character_data_handler', 'xml_set_default_handler', 'xml_set_element_handler', 'xml_set_end_namespace_decl_handler', 'xml_set_external_entity_ref_handler', 'xml_set_notation_decl_handler', 'xml_set_object', 'xml_set_processing_instruction_handler', 'xml_set_start_namespace_decl_handler', 'xml_set_unparsed_entity_decl_handler', 'xmlrpc_server_add_introspection_data', 'xmlrpc_server_call_method', 'xmlrpc_server_create', 'xmlrpc_server_destroy', 'xmlrpc_server_register_introspection_callback', 'xmlrpc_server_register_method', 'xmlwriter_end_attribute', 'xmlwriter_end_cdata', 'xmlwriter_end_comment', 'xmlwriter_end_document', 'xmlwriter_end_dtd', 'xmlwriter_end_dtd_attlist', 'xmlwriter_end_dtd_element', 'xmlwriter_end_dtd_entity', 'xmlwriter_end_element', 'xmlwriter_end_pi', 'xmlwriter_flush', 'xmlwriter_full_end_element', 'xmlwriter_open_memory', 'xmlwriter_open_uri', 'xmlwriter_output_memory', 'xmlwriter_set_indent', 'xmlwriter_set_indent_string', 'xmlwriter_start_attribute', 'xmlwriter_start_attribute_ns', 'xmlwriter_start_cdata', 'xmlwriter_start_comment', 'xmlwriter_start_document', 'xmlwriter_start_dtd', 'xmlwriter_start_dtd_attlist', 'xmlwriter_start_dtd_element', 'xmlwriter_start_dtd_entity', 'xmlwriter_start_element', 'xmlwriter_start_element_ns', 'xmlwriter_start_pi', 'xmlwriter_text', 'xmlwriter_write_attribute', 'xmlwriter_write_attribute_ns', 'xmlwriter_write_cdata', 'xmlwriter_write_comment', 'xmlwriter_write_dtd', 'xmlwriter_write_dtd_attlist', 'xmlwriter_write_dtd_element', 'xmlwriter_write_dtd_entity', 'xmlwriter_write_element', 'xmlwriter_write_element_ns', 'xmlwriter_write_pi', 'xmlwriter_write_raw', 'xslt_create', 'yaz_addinfo', 'yaz_ccl_conf', 'yaz_ccl_parse', 'yaz_close', 'yaz_database', 'yaz_element', 'yaz_errno', 'yaz_error', 'yaz_es', 'yaz_es_result', 'yaz_get_option', 'yaz_hits', 'yaz_itemorder', 'yaz_present', 'yaz_range', 'yaz_record', 'yaz_scan', 'yaz_scan_result', 'yaz_schema', 'yaz_search', 'yaz_sort', 'yaz_syntax', 'zip_close', 'zip_entry_close', 'zip_entry_compressedsize', 'zip_entry_compressionmethod', 'zip_entry_filesize', 'zip_entry_name', 'zip_entry_open', 'zip_entry_read', 'zip_open', 'zip_read']; + $this->valueType = $valueType; + } + /** + * Returns the value for the keys of this array. + */ + public function getValueType() : Type + { + return $this->valueType; + } + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + return '(' . $this->valueType . ')'; } } -Resource Operations - -Copyright (c) 2015-2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\CodeUnit; +namespace PHPUnit\phpDocumentor\Reflection\Types; +use PHPUnit\phpDocumentor\Reflection\Type; /** + * Value Object representing a Float. + * * @psalm-immutable */ -final class FunctionUnit extends CodeUnit +final class Float_ implements Type { /** - * @psalm-assert-if-true FunctionUnit $this + * Returns a rendered output of the Type as it would be used in a DocBlock. */ - public function isFunction() : bool + public function __toString() : string { - return \true; + return 'float'; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\CodeUnit; +namespace PHPUnit\phpDocumentor\Reflection\Types; -use Iterator; -final class CodeUnitCollectionIterator implements Iterator +use PHPUnit\phpDocumentor\Reflection\Type; +/** + * Value object representing Integer type + * + * @psalm-immutable + */ +class Integer implements Type { /** - * @psalm-var list - */ - private $codeUnits; - /** - * @var int + * Returns a rendered output of the Type as it would be used in a DocBlock. */ - private $position = 0; - public function __construct(CodeUnitCollection $collection) - { - $this->codeUnits = $collection->asArray(); - } - public function rewind() : void - { - $this->position = 0; - } - public function valid() : bool - { - return isset($this->codeUnits[$this->position]); - } - public function key() : int - { - return $this->position; - } - public function current() : CodeUnit - { - return $this->codeUnits[$this->position]; - } - public function next() : void + public function __toString() : string { - $this->position++; + return 'int'; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\CodeUnit; +namespace PHPUnit\phpDocumentor\Reflection\Types; -use function array_keys; -use function array_merge; -use function array_unique; -use function array_values; -use function class_exists; -use function explode; -use function function_exists; -use function interface_exists; -use function ksort; -use function method_exists; -use function sort; -use function sprintf; -use function str_replace; -use function strpos; -use function trait_exists; -use ReflectionClass; -use ReflectionFunction; -use ReflectionMethod; -final class Mapper +use PHPUnit\phpDocumentor\Reflection\Fqsen; +use PHPUnit\phpDocumentor\Reflection\Type; +/** + * Value Object representing the type 'string'. + * + * @psalm-immutable + */ +final class InterfaceString implements Type { + /** @var Fqsen|null */ + private $fqsen; /** - * @psalm-return array> - */ - public function codeUnitsToSourceLines(CodeUnitCollection $codeUnits) : array - { - $result = []; - foreach ($codeUnits as $codeUnit) { - $sourceFileName = $codeUnit->sourceFileName(); - if (!isset($result[$sourceFileName])) { - $result[$sourceFileName] = []; - } - $result[$sourceFileName] = array_merge($result[$sourceFileName], $codeUnit->sourceLines()); - } - foreach (array_keys($result) as $sourceFileName) { - $result[$sourceFileName] = array_values(array_unique($result[$sourceFileName])); - sort($result[$sourceFileName]); - } - ksort($result); - return $result; - } - /** - * @throws InvalidCodeUnitException - * @throws ReflectionException - */ - public function stringToCodeUnits(string $unit) : CodeUnitCollection - { - if (strpos($unit, '::') !== \false) { - [$firstPart, $secondPart] = explode('::', $unit); - if (empty($firstPart) && $this->isUserDefinedFunction($secondPart)) { - return CodeUnitCollection::fromList(CodeUnit::forFunction($secondPart)); - } - if ($this->isUserDefinedClass($firstPart)) { - if ($secondPart === '') { - return $this->publicMethodsOfClass($firstPart); - } - if ($secondPart === '') { - return $this->protectedAndPrivateMethodsOfClass($firstPart); - } - if ($secondPart === '') { - return $this->protectedMethodsOfClass($firstPart); - } - if ($secondPart === '') { - return $this->publicAndPrivateMethodsOfClass($firstPart); - } - if ($secondPart === '') { - return $this->privateMethodsOfClass($firstPart); - } - if ($secondPart === '') { - return $this->publicAndProtectedMethodsOfClass($firstPart); - } - if ($this->isUserDefinedMethod($firstPart, $secondPart)) { - return CodeUnitCollection::fromList(CodeUnit::forClassMethod($firstPart, $secondPart)); - } - } - if ($this->isUserDefinedInterface($firstPart)) { - return CodeUnitCollection::fromList(CodeUnit::forInterfaceMethod($firstPart, $secondPart)); - } - if ($this->isUserDefinedTrait($firstPart)) { - return CodeUnitCollection::fromList(CodeUnit::forTraitMethod($firstPart, $secondPart)); - } - } else { - if ($this->isUserDefinedClass($unit)) { - $units = [CodeUnit::forClass($unit)]; - foreach ($this->reflectorForClass($unit)->getTraits() as $trait) { - if (!$trait->isUserDefined()) { - // @codeCoverageIgnoreStart - continue; - // @codeCoverageIgnoreEnd - } - $units[] = CodeUnit::forTrait($trait->getName()); - } - return CodeUnitCollection::fromArray($units); - } - if ($this->isUserDefinedInterface($unit)) { - return CodeUnitCollection::fromList(CodeUnit::forInterface($unit)); - } - if ($this->isUserDefinedTrait($unit)) { - return CodeUnitCollection::fromList(CodeUnit::forTrait($unit)); - } - if ($this->isUserDefinedFunction($unit)) { - return CodeUnitCollection::fromList(CodeUnit::forFunction($unit)); - } - $unit = str_replace('', '', $unit); - if ($this->isUserDefinedClass($unit)) { - return $this->classAndParentClassesAndTraits($unit); - } - } - throw new InvalidCodeUnitException(sprintf('"%s" is not a valid code unit', $unit)); - } - /** - * @psalm-param class-string $className - * - * @throws ReflectionException + * Initializes this representation of a class string with the given Fqsen. */ - private function publicMethodsOfClass(string $className) : CodeUnitCollection + public function __construct(?Fqsen $fqsen = null) { - return $this->methodsOfClass($className, ReflectionMethod::IS_PUBLIC); + $this->fqsen = $fqsen; } /** - * @psalm-param class-string $className - * - * @throws ReflectionException + * Returns the FQSEN associated with this object. */ - private function publicAndProtectedMethodsOfClass(string $className) : CodeUnitCollection + public function getFqsen() : ?Fqsen { - return $this->methodsOfClass($className, ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED); + return $this->fqsen; } /** - * @psalm-param class-string $className - * - * @throws ReflectionException + * Returns a rendered output of the Type as it would be used in a DocBlock. */ - private function publicAndPrivateMethodsOfClass(string $className) : CodeUnitCollection + public function __toString() : string { - return $this->methodsOfClass($className, ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PRIVATE); + if ($this->fqsen === null) { + return 'interface-string'; + } + return 'interface-string<' . (string) $this->fqsen . '>'; } +} + $types */ - private function protectedMethodsOfClass(string $className) : CodeUnitCollection + public function __construct(array $types) { - return $this->methodsOfClass($className, ReflectionMethod::IS_PROTECTED); + parent::__construct($types, '&'); } +} +methodsOfClass($className, ReflectionMethod::IS_PROTECTED | ReflectionMethod::IS_PRIVATE); + if ($this->keyType) { + return 'iterable<' . $this->keyType . ',' . $this->valueType . '>'; + } + if ($this->valueType instanceof Mixed_) { + return 'iterable'; + } + return 'iterable<' . $this->valueType . '>'; } +} +methodsOfClass($className, ReflectionMethod::IS_PRIVATE); + return 'mixed'; } +} +reflectorForClass($className)->getMethods($filter) as $method) { - if (!$method->isUserDefined()) { - continue; - } - $units[] = CodeUnit::forClassMethod($className, $method->getName()); - } - return CodeUnitCollection::fromArray($units); + return 'never'; } +} +reflectorForClass($className); - foreach ($this->reflectorForClass($className)->getTraits() as $trait) { - if (!$trait->isUserDefined()) { - // @codeCoverageIgnoreStart - continue; - // @codeCoverageIgnoreEnd - } - $units[] = CodeUnit::forTrait($trait->getName()); - } - while ($reflector = $reflector->getParentClass()) { - if (!$reflector->isUserDefined()) { - break; - } - $units[] = CodeUnit::forClass($reflector->getName()); - foreach ($reflector->getTraits() as $trait) { - if (!$trait->isUserDefined()) { - // @codeCoverageIgnoreStart - continue; - // @codeCoverageIgnoreEnd - } - $units[] = CodeUnit::forTrait($trait->getName()); - } - } - return CodeUnitCollection::fromArray($units); + return 'null'; } +} +getMessage(), (int) $e->getCode(), $e); - } - // @codeCoverageIgnoreEnd + $this->realType = $realType; } /** - * @throws ReflectionException + * Provide access to the actual type directly, if needed. */ - private function isUserDefinedFunction(string $functionName) : bool + public function getActualType() : Type { - if (!function_exists($functionName)) { - return \false; - } - try { - return (new ReflectionFunction($functionName))->isUserDefined(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException($e->getMessage(), (int) $e->getCode(), $e); - } - // @codeCoverageIgnoreEnd + return $this->realType; } /** - * @throws ReflectionException + * Returns a rendered output of the Type as it would be used in a DocBlock. */ - private function isUserDefinedClass(string $className) : bool + public function __toString() : string { - if (!class_exists($className)) { - return \false; - } - try { - return (new ReflectionClass($className))->isUserDefined(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException($e->getMessage(), (int) $e->getCode(), $e); - } - // @codeCoverageIgnoreEnd + return '?' . $this->realType->__toString(); } +} +isUserDefined(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException($e->getMessage(), (int) $e->getCode(), $e); + if (strpos((string) $fqsen, '::') !== \false || strpos((string) $fqsen, '()') !== \false) { + throw new InvalidArgumentException('Object types can only refer to a class, interface or trait but a method, function, constant or ' . 'property was received: ' . (string) $fqsen); } - // @codeCoverageIgnoreEnd + $this->fqsen = $fqsen; } /** - * @throws ReflectionException + * Returns the FQSEN associated with this object. */ - private function isUserDefinedTrait(string $traitName) : bool + public function getFqsen() : ?Fqsen { - if (!trait_exists($traitName)) { - return \false; - } - try { - return (new ReflectionClass($traitName))->isUserDefined(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException($e->getMessage(), (int) $e->getCode(), $e); - } - // @codeCoverageIgnoreEnd + return $this->fqsen; } - /** - * @throws ReflectionException - */ - private function isUserDefinedMethod(string $className, string $methodName) : bool + public function __toString() : string { - if (!class_exists($className)) { - // @codeCoverageIgnoreStart - return \false; - // @codeCoverageIgnoreEnd - } - if (!method_exists($className, $methodName)) { - // @codeCoverageIgnoreStart - return \false; - // @codeCoverageIgnoreEnd - } - try { - return (new ReflectionMethod($className, $methodName))->isUserDefined(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException($e->getMessage(), (int) $e->getCode(), $e); + if ($this->fqsen) { + return (string) $this->fqsen; } - // @codeCoverageIgnoreEnd + return 'object'; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\CodeUnit; +namespace PHPUnit\phpDocumentor\Reflection\Types; +use PHPUnit\phpDocumentor\Reflection\Type; /** + * Value Object representing the 'parent' type. + * + * Parent, as a Type, represents the parent class of class in which the associated element was defined. + * * @psalm-immutable */ -final class InterfaceUnit extends CodeUnit +final class Parent_ implements Type { /** - * @psalm-assert-if-true InterfaceUnit $this + * Returns a rendered output of the Type as it would be used in a DocBlock. */ - public function isInterface() : bool + public function __toString() : string { - return \true; + return 'parent'; } } +/** + * This file is part of phpDocumentor. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. + * + * @link http://phpdoc.org */ -namespace PHPUnit\SebastianBergmann\CodeUnit; +namespace PHPUnit\phpDocumentor\Reflection\Types; -use function range; -use function sprintf; -use ReflectionClass; -use ReflectionFunction; -use ReflectionMethod; +use PHPUnit\phpDocumentor\Reflection\Type; /** + * Value Object representing the 'resource' Type. + * * @psalm-immutable */ -abstract class CodeUnit +final class Resource_ implements Type { /** - * @var string + * Returns a rendered output of the Type as it would be used in a DocBlock. */ - private $name; + public function __toString() : string + { + return 'resource'; + } +} + + * Returns a rendered output of the Type as it would be used in a DocBlock. */ - private $sourceLines; + public function __toString() : string + { + return 'self'; + } +} +getFileName(), range($reflector->getStartLine(), $reflector->getEndLine())); + return 'static'; } +} +getFileName(), range($reflector->getStartLine(), $reflector->getEndLine())); + return 'string'; } +} +getFileName(), range($reflector->getStartLine(), $reflector->getEndLine())); + return '$this'; } +} +getFileName(), range($reflector->getStartLine(), $reflector->getEndLine())); + return 'void'; } +} +Copyright (c) 2013 Konstantin Kudryashov +Copyright (c) 2013 Marcello Duarte + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy; + +use Prophecy\Argument\Token; +/** + * Argument tokens shortcuts. + * + * @author Konstantin Kudryashov + */ +class Argument +{ /** - * @psalm-param class-string $traitName + * Checks that argument is exact value or object. * - * @throws InvalidCodeUnitException - * @throws ReflectionException + * @param mixed $value + * + * @return Token\ExactValueToken */ - public static function forTrait(string $traitName) : TraitUnit + public static function exact($value) { - self::ensureUserDefinedTrait($traitName); - $reflector = self::reflectorForClass($traitName); - return new TraitUnit($traitName, $reflector->getFileName(), range($reflector->getStartLine(), $reflector->getEndLine())); + return new Token\ExactValueToken($value); } /** - * @psalm-param class-string $traitName + * Checks that argument is of specific type or instance of specific class. * - * @throws InvalidCodeUnitException - * @throws ReflectionException + * @param string $type Type name (`integer`, `string`) or full class name + * + * @return Token\TypeToken */ - public static function forTraitMethod(string $traitName, string $methodName) : TraitMethodUnit + public static function type($type) { - self::ensureUserDefinedTrait($traitName); - $reflector = self::reflectorForClassMethod($traitName, $methodName); - return new TraitMethodUnit($traitName . '::' . $methodName, $reflector->getFileName(), range($reflector->getStartLine(), $reflector->getEndLine())); + return new Token\TypeToken($type); } /** - * @psalm-param callable-string $functionName + * Checks that argument object has specific state. * - * @throws InvalidCodeUnitException - * @throws ReflectionException + * @param string $methodName + * @param mixed $value + * + * @return Token\ObjectStateToken */ - public static function forFunction(string $functionName) : FunctionUnit + public static function which($methodName, $value) { - $reflector = self::reflectorForFunction($functionName); - if (!$reflector->isUserDefined()) { - throw new InvalidCodeUnitException(sprintf('"%s" is not a user-defined function', $functionName)); - } - return new FunctionUnit($functionName, $reflector->getFileName(), range($reflector->getStartLine(), $reflector->getEndLine())); + return new Token\ObjectStateToken($methodName, $value); } /** - * @psalm-param list $sourceLines + * Checks that argument matches provided callback. + * + * @param callable $callback + * + * @return Token\CallbackToken */ - private function __construct(string $name, string $sourceFileName, array $sourceLines) - { - $this->name = $name; - $this->sourceFileName = $sourceFileName; - $this->sourceLines = $sourceLines; - } - public function name() : string - { - return $this->name; - } - public function sourceFileName() : string + public static function that($callback) { - return $this->sourceFileName; + return new Token\CallbackToken($callback); } /** - * @psalm-return list + * Matches any single value. + * + * @return Token\AnyValueToken */ - public function sourceLines() : array + public static function any() { - return $this->sourceLines; + return new Token\AnyValueToken(); } - public function isClass() : bool + /** + * Matches all values to the rest of the signature. + * + * @return Token\AnyValuesToken + */ + public static function cetera() { - return \false; + return new Token\AnyValuesToken(); } - public function isClassMethod() : bool + /** + * Checks that argument matches all tokens + * + * @param mixed ... a list of tokens + * + * @return Token\LogicalAndToken + */ + public static function allOf() { - return \false; + return new Token\LogicalAndToken(\func_get_args()); } - public function isInterface() : bool + /** + * Checks that argument array or countable object has exact number of elements. + * + * @param integer $value array elements count + * + * @return Token\ArrayCountToken + */ + public static function size($value) { - return \false; + return new Token\ArrayCountToken($value); } - public function isInterfaceMethod() : bool + /** + * Checks that argument array contains (key, value) pair + * + * @param mixed $key exact value or token + * @param mixed $value exact value or token + * + * @return Token\ArrayEntryToken + */ + public static function withEntry($key, $value) { - return \false; + return new Token\ArrayEntryToken($key, $value); } - public function isTrait() : bool + /** + * Checks that arguments array entries all match value + * + * @param mixed $value + * + * @return Token\ArrayEveryEntryToken + */ + public static function withEveryEntry($value) { - return \false; + return new Token\ArrayEveryEntryToken($value); } - public function isTraitMethod() : bool + /** + * Checks that argument array contains value + * + * @param mixed $value + * + * @return Token\ArrayEntryToken + */ + public static function containing($value) { - return \false; + return new Token\ArrayEntryToken(self::any(), $value); } - public function isFunction() : bool + /** + * Checks that argument array has key + * + * @param mixed $key exact value or token + * + * @return Token\ArrayEntryToken + */ + public static function withKey($key) { - return \false; + return new Token\ArrayEntryToken($key, self::any()); } /** - * @psalm-param class-string $className + * Checks that argument does not match the value|token. * - * @throws InvalidCodeUnitException + * @param mixed $value either exact value or argument token + * + * @return Token\LogicalNotToken */ - private static function ensureUserDefinedClass(string $className) : void + public static function not($value) { - try { - $reflector = new ReflectionClass($className); - if ($reflector->isInterface()) { - throw new InvalidCodeUnitException(sprintf('"%s" is an interface and not a class', $className)); - } - if ($reflector->isTrait()) { - throw new InvalidCodeUnitException(sprintf('"%s" is a trait and not a class', $className)); - } - if (!$reflector->isUserDefined()) { - throw new InvalidCodeUnitException(sprintf('"%s" is not a user-defined class', $className)); - } - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException($e->getMessage(), (int) $e->getCode(), $e); - } - // @codeCoverageIgnoreEnd + return new Token\LogicalNotToken($value); } /** - * @psalm-param class-string $interfaceName + * @param string $value * - * @throws InvalidCodeUnitException + * @return Token\StringContainsToken */ - private static function ensureUserDefinedInterface(string $interfaceName) : void + public static function containingString($value) { - try { - $reflector = new ReflectionClass($interfaceName); - if (!$reflector->isInterface()) { - throw new InvalidCodeUnitException(sprintf('"%s" is not an interface', $interfaceName)); - } - if (!$reflector->isUserDefined()) { - throw new InvalidCodeUnitException(sprintf('"%s" is not a user-defined interface', $interfaceName)); - } - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException($e->getMessage(), (int) $e->getCode(), $e); - } - // @codeCoverageIgnoreEnd + return new Token\StringContainsToken($value); } /** - * @psalm-param class-string $traitName + * Checks that argument is identical value. * - * @throws InvalidCodeUnitException + * @param mixed $value + * + * @return Token\IdenticalValueToken */ - private static function ensureUserDefinedTrait(string $traitName) : void + public static function is($value) { - try { - $reflector = new ReflectionClass($traitName); - if (!$reflector->isTrait()) { - throw new InvalidCodeUnitException(sprintf('"%s" is not a trait', $traitName)); - } - // @codeCoverageIgnoreStart - if (!$reflector->isUserDefined()) { - throw new InvalidCodeUnitException(sprintf('"%s" is not a user-defined trait', $traitName)); - } - } catch (\ReflectionException $e) { - throw new ReflectionException($e->getMessage(), (int) $e->getCode(), $e); - } - // @codeCoverageIgnoreEnd + return new Token\IdenticalValueToken($value); } /** - * @psalm-param class-string $className + * Check that argument is same value when rounding to the + * given precision. * - * @throws ReflectionException + * @param float $value + * @param float $precision + * + * @return Token\ApproximateValueToken */ - private static function reflectorForClass(string $className) : ReflectionClass + public static function approximate($value, $precision = 0) { - try { - return new ReflectionClass($className); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException($e->getMessage(), (int) $e->getCode(), $e); - } - // @codeCoverageIgnoreEnd + return new Token\ApproximateValueToken($value, $precision); } /** - * @psalm-param class-string $className + * Checks that argument is in array. * - * @throws ReflectionException + * @param array $value + * + * @return Token\InArrayToken */ - private static function reflectorForClassMethod(string $className, string $methodName) : ReflectionMethod + public static function in($value) { - try { - return new ReflectionMethod($className, $methodName); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException($e->getMessage(), (int) $e->getCode(), $e); - } - // @codeCoverageIgnoreEnd + return new Token\InArrayToken($value); } /** - * @psalm-param callable-string $functionName + * Checks that argument is not in array. * - * @throws ReflectionException + * @param array $value + * + * @return Token\NotInArrayToken */ - private static function reflectorForFunction(string $functionName) : ReflectionFunction + public static function notIn($value) { - try { - return new ReflectionFunction($functionName); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new ReflectionException($e->getMessage(), (int) $e->getCode(), $e); - } - // @codeCoverageIgnoreEnd + return new Token\NotInArrayToken($value); } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeUnit; +namespace Prophecy\Argument; /** - * @psalm-immutable + * Arguments wildcarding. + * + * @author Konstantin Kudryashov */ -final class TraitUnit extends CodeUnit +class ArgumentsWildcard { /** - * @psalm-assert-if-true TraitUnit $this + * @var Token\TokenInterface[] */ - public function isTrait() : bool + private $tokens = array(); + private $string; + /** + * Initializes wildcard. + * + * @param array $arguments Array of argument tokens or values + */ + public function __construct(array $arguments) { - return \true; + foreach ($arguments as $argument) { + if (!$argument instanceof \Prophecy\Argument\Token\TokenInterface) { + $argument = new \Prophecy\Argument\Token\ExactValueToken($argument); + } + $this->tokens[] = $argument; + } + } + /** + * Calculates wildcard match score for provided arguments. + * + * @param array $arguments + * + * @return false|int False OR integer score (higher - better) + */ + public function scoreArguments(array $arguments) + { + if (0 == \count($arguments) && 0 == \count($this->tokens)) { + return 1; + } + $arguments = \array_values($arguments); + $totalScore = 0; + foreach ($this->tokens as $i => $token) { + $argument = isset($arguments[$i]) ? $arguments[$i] : null; + if (1 >= ($score = $token->scoreArgument($argument))) { + return \false; + } + $totalScore += $score; + if (\true === $token->isLast()) { + return $totalScore; + } + } + if (\count($arguments) > \count($this->tokens)) { + return \false; + } + return $totalScore; + } + /** + * Returns string representation for wildcard. + * + * @return string + */ + public function __toString() + { + if (null === $this->string) { + $this->string = \implode(', ', \array_map(function ($token) { + return (string) $token; + }, $this->tokens)); + } + return $this->string; + } + /** + * @return array + */ + public function getTokens() + { + return $this->tokens; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeUnit; +namespace Prophecy\Argument\Token; /** - * @psalm-immutable + * Any single value token. + * + * @author Konstantin Kudryashov */ -final class InterfaceMethodUnit extends CodeUnit +class AnyValueToken implements \Prophecy\Argument\Token\TokenInterface { /** - * @psalm-assert-if-true InterfaceMethod $this + * Always scores 3 for any argument. + * + * @param $argument + * + * @return int */ - public function isInterfaceMethod() : bool + public function scoreArgument($argument) { - return \true; + return 3; + } + /** + * Returns false. + * + * @return bool + */ + public function isLast() + { + return \false; + } + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return '*'; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeUnit; +namespace Prophecy\Argument\Token; /** - * @psalm-immutable + * Any values token. + * + * @author Konstantin Kudryashov */ -final class ClassMethodUnit extends CodeUnit +class AnyValuesToken implements \Prophecy\Argument\Token\TokenInterface { /** - * @psalm-assert-if-true ClassMethodUnit $this + * Always scores 2 for any argument. + * + * @param $argument + * + * @return int */ - public function isClassMethod() : bool + public function scoreArgument($argument) + { + return 2; + } + /** + * Returns true to stop wildcard from processing other tokens. + * + * @return bool + */ + public function isLast() { return \true; } + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return '* [, ...]'; + } } - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\CodeUnit; - -use RuntimeException; -final class NoTraitException extends RuntimeException implements Exception -{ -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\CodeUnit; - -use RuntimeException; -final class ReflectionException extends RuntimeException implements Exception -{ -} - + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeUnit; - -use Throwable; -interface Exception extends Throwable -{ -} - +/** + * Approximate value token * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @author Daniel Leech */ -namespace PHPUnit\SebastianBergmann\CodeUnit; - -use RuntimeException; -final class InvalidCodeUnitException extends RuntimeException implements Exception +class ApproximateValueToken implements \Prophecy\Argument\Token\TokenInterface { + private $value; + private $precision; + public function __construct($value, $precision = 0) + { + $this->value = $value; + $this->precision = $precision; + } + /** + * {@inheritdoc} + */ + public function scoreArgument($argument) + { + return \round((float) $argument, $this->precision) === \round($this->value, $this->precision) ? 10 : \false; + } + /** + * {@inheritdoc} + */ + public function isLast() + { + return \false; + } + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return \sprintf('≅%s', \round($this->value, $this->precision)); + } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeUnit; +namespace Prophecy\Argument\Token; /** - * @psalm-immutable + * Array elements count token. + * + * @author Boris Mikhaylov */ -final class ClassUnit extends CodeUnit +class ArrayCountToken implements \Prophecy\Argument\Token\TokenInterface { + private $count; + /** + * @param integer $value + */ + public function __construct($value) + { + $this->count = $value; + } + /** + * Scores 6 when argument has preset number of elements. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + return $this->isCountable($argument) && $this->hasProperCount($argument) ? 6 : \false; + } + /** + * Returns false. + * + * @return boolean + */ + public function isLast() + { + return \false; + } + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return \sprintf('count(%s)', $this->count); + } /** - * @psalm-assert-if-true ClassUnit $this + * Returns true if object is either array or instance of \Countable + * + * @param $argument + * @return bool */ - public function isClass() : bool + private function isCountable($argument) { - return \true; + return \is_array($argument) || $argument instanceof \Countable; } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\CodeUnit; - -/** - * @psalm-immutable - */ -final class TraitMethodUnit extends CodeUnit -{ /** - * @psalm-assert-if-true TraitMethodUnit $this + * Returns true if $argument has expected number of elements + * + * @param array|\Countable $argument + * + * @return bool */ - public function isTraitMethod() : bool + private function hasProperCount($argument) { - return \true; + return $this->count === \count($argument); } } -sebastian/code-unit - -Copyright (c) 2020, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeUnit; +namespace Prophecy\Argument\Token; -use function array_merge; -use function count; -use Countable; -use IteratorAggregate; -final class CodeUnitCollection implements Countable, IteratorAggregate +use Prophecy\Exception\InvalidArgumentException; +/** + * Array entry token. + * + * @author Boris Mikhaylov + */ +class ArrayEntryToken implements \Prophecy\Argument\Token\TokenInterface { + /** @var \Prophecy\Argument\Token\TokenInterface */ + private $key; + /** @var \Prophecy\Argument\Token\TokenInterface */ + private $value; /** - * @psalm-var list + * @param mixed $key exact value or token + * @param mixed $value exact value or token */ - private $codeUnits = []; + public function __construct($key, $value) + { + $this->key = $this->wrapIntoExactValueToken($key); + $this->value = $this->wrapIntoExactValueToken($value); + } /** - * @psalm-param list $items + * Scores half of combined scores from key and value tokens for same entry. Capped at 8. + * If argument implements \ArrayAccess without \Traversable, then key token is restricted to ExactValueToken. + * + * @param array|\ArrayAccess|\Traversable $argument + * + * @throws \Prophecy\Exception\InvalidArgumentException + * @return bool|int */ - public static function fromArray(array $items) : self + public function scoreArgument($argument) { - $collection = new self(); - foreach ($items as $item) { - $collection->add($item); + if ($argument instanceof \Traversable) { + $argument = \iterator_to_array($argument); } - return $collection; - } - public static function fromList(CodeUnit ...$items) : self - { - return self::fromArray($items); - } - private function __construct() - { + if ($argument instanceof \ArrayAccess) { + $argument = $this->convertArrayAccessToEntry($argument); + } + if (!\is_array($argument) || empty($argument)) { + return \false; + } + $keyScores = \array_map(array($this->key, 'scoreArgument'), \array_keys($argument)); + $valueScores = \array_map(array($this->value, 'scoreArgument'), $argument); + $scoreEntry = function ($value, $key) { + return $value && $key ? \min(8, ($key + $value) / 2) : \false; + }; + return \max(\array_map($scoreEntry, $valueScores, $keyScores)); } /** - * @psalm-return list + * Returns false. + * + * @return boolean */ - public function asArray() : array + public function isLast() { - return $this->codeUnits; + return \false; } - public function getIterator() : CodeUnitCollectionIterator + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() { - return new CodeUnitCollectionIterator($this); + return \sprintf('[..., %s => %s, ...]', $this->key, $this->value); } - public function count() : int + /** + * Returns key + * + * @return TokenInterface + */ + public function getKey() { - return count($this->codeUnits); + return $this->key; } - public function isEmpty() : bool + /** + * Returns value + * + * @return TokenInterface + */ + public function getValue() { - return empty($this->codeUnits); + return $this->value; } - public function mergeWith(self $other) : self + /** + * Wraps non token $value into ExactValueToken + * + * @param $value + * @return TokenInterface + */ + private function wrapIntoExactValueToken($value) { - return self::fromArray(array_merge($this->asArray(), $other->asArray())); + return $value instanceof \Prophecy\Argument\Token\TokenInterface ? $value : new \Prophecy\Argument\Token\ExactValueToken($value); } - private function add(CodeUnit $item) : void + /** + * Converts instance of \ArrayAccess to key => value array entry + * + * @param \ArrayAccess $object + * + * @return array|null + * @throws \Prophecy\Exception\InvalidArgumentException + */ + private function convertArrayAccessToEntry(\ArrayAccess $object) { - $this->codeUnits[] = $item; + if (!$this->key instanceof \Prophecy\Argument\Token\ExactValueToken) { + throw new InvalidArgumentException(\sprintf('You can only use exact value tokens to match key of ArrayAccess object' . \PHP_EOL . 'But you used `%s`.', $this->key)); + } + $key = $this->key->getValue(); + return $object->offsetExists($key) ? array($key => $object[$key]) : array(); } } "$0"]) - ); - - override( - \PHPUnit\Framework\TestCase::createStub(0), - map([""=>"$0"]) - ); - - override( - \PHPUnit\Framework\TestCase::createConfiguredMock(0), - map([""=>"$0"]) - ); - - override( - \PHPUnit\Framework\TestCase::createPartialMock(0), - map([""=>"$0"]) - ); - - override( - \PHPUnit\Framework\TestCase::createTestProxy(0), - map([""=>"$0"]) - ); - - override( - \PHPUnit\Framework\TestCase::getMockForAbstractClass(0), - map([""=>"$0"]) - ); -} - + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; - -use RuntimeException; -use PHPUnit\SebastianBergmann\CodeCoverage\Exception; -final class WrongXdebugVersionException extends RuntimeException implements Exception -{ -} - +/** + * Array every entry token. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @author Adrien Brault */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; - -use RuntimeException; -use PHPUnit\SebastianBergmann\CodeCoverage\Exception; -final class PhpdbgNotAvailableException extends RuntimeException implements Exception +class ArrayEveryEntryToken implements \Prophecy\Argument\Token\TokenInterface { - public function __construct() + /** + * @var TokenInterface + */ + private $value; + /** + * @param mixed $value exact value or token + */ + public function __construct($value) { - parent::__construct('The PHPDBG SAPI is not available'); + if (!$value instanceof \Prophecy\Argument\Token\TokenInterface) { + $value = new \Prophecy\Argument\Token\ExactValueToken($value); + } + $this->value = $value; } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -use RuntimeException; -final class NoCodeCoverageDriverAvailableException extends RuntimeException implements Exception -{ - public function __construct() + /** + * {@inheritdoc} + */ + public function scoreArgument($argument) { - parent::__construct('No code coverage driver available'); + if (!$argument instanceof \Traversable && !\is_array($argument)) { + return \false; + } + $scores = array(); + foreach ($argument as $key => $argumentEntry) { + $scores[] = $this->value->scoreArgument($argumentEntry); + } + if (empty($scores) || \in_array(\false, $scores, \true)) { + return \false; + } + return \array_sum($scores) / \count($scores); + } + /** + * {@inheritdoc} + */ + public function isLast() + { + return \false; + } + /** + * {@inheritdoc} + */ + public function __toString() + { + return \sprintf('[%s, ..., %s]', $this->value, $this->value); + } + /** + * @return TokenInterface + */ + public function getValue() + { + return $this->value; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -use RuntimeException; -final class XmlException extends RuntimeException implements Exception -{ -} - +use Prophecy\Exception\InvalidArgumentException; +/** + * Callback-verified token. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @author Konstantin Kudryashov */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -use RuntimeException; -final class ReportAlreadyFinalizedException extends RuntimeException implements Exception +class CallbackToken implements \Prophecy\Argument\Token\TokenInterface { - public function __construct() + private $callback; + /** + * Initializes token. + * + * @param callable $callback + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function __construct($callback) { - parent::__construct('The code coverage report has already been finalized'); + if (!\is_callable($callback)) { + throw new InvalidArgumentException(\sprintf('Callable expected as an argument to CallbackToken, but got %s.', \gettype($callback))); + } + $this->callback = $callback; + } + /** + * Scores 7 if callback returns true, false otherwise. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + return \call_user_func($this->callback, $argument) ? 7 : \false; + } + /** + * Returns false. + * + * @return bool + */ + public function isLast() + { + return \false; + } + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return 'callback()'; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; +namespace Prophecy\Argument\Token; -use RuntimeException; -use PHPUnit\SebastianBergmann\CodeCoverage\Exception; -final class XdebugNotAvailableException extends RuntimeException implements Exception +use PHPUnit\SebastianBergmann\Comparator\ComparisonFailure; +use Prophecy\Comparator\Factory as ComparatorFactory; +use Prophecy\Util\StringUtil; +/** + * Exact value token. + * + * @author Konstantin Kudryashov + */ +class ExactValueToken implements \Prophecy\Argument\Token\TokenInterface { - public function __construct() + private $value; + private $string; + private $util; + private $comparatorFactory; + /** + * Initializes token. + * + * @param mixed $value + * @param StringUtil $util + * @param ComparatorFactory $comparatorFactory + */ + public function __construct($value, StringUtil $util = null, ComparatorFactory $comparatorFactory = null) { - parent::__construct('The Xdebug extension is not available'); + $this->value = $value; + $this->util = $util ?: new StringUtil(); + $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); + } + /** + * Scores 10 if argument matches preset value. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + if (\is_object($argument) && \is_object($this->value)) { + $comparator = $this->comparatorFactory->getComparatorFor($argument, $this->value); + try { + $comparator->assertEquals($argument, $this->value); + return 10; + } catch (ComparisonFailure $failure) { + return \false; + } + } + // If either one is an object it should be castable to a string + if (\is_object($argument) xor \is_object($this->value)) { + if (\is_object($argument) && !\method_exists($argument, '__toString')) { + return \false; + } + if (\is_object($this->value) && !\method_exists($this->value, '__toString')) { + return \false; + } + } elseif (\is_numeric($argument) && \is_numeric($this->value)) { + // noop + } elseif (\gettype($argument) !== \gettype($this->value)) { + return \false; + } + return $argument == $this->value ? 10 : \false; + } + /** + * Returns preset value against which token checks arguments. + * + * @return mixed + */ + public function getValue() + { + return $this->value; + } + /** + * Returns false. + * + * @return bool + */ + public function isLast() + { + return \false; + } + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + if (null === $this->string) { + $this->string = \sprintf('exact(%s)', $this->util->stringify($this->value)); + } + return $this->string; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; - -use function sprintf; -use RuntimeException; -use PHPUnit\SebastianBergmann\CodeCoverage\Exception; -final class WriteOperationFailedException extends RuntimeException implements Exception -{ - public function __construct(string $path) - { - parent::__construct(sprintf('Cannot write to "%s"', $path)); - } -} - +use Prophecy\Util\StringUtil; +/** + * Identical value token. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @author Florian Voutzinos */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -use RuntimeException; -final class DirectoryCouldNotBeCreatedException extends RuntimeException implements Exception +class IdenticalValueToken implements \Prophecy\Argument\Token\TokenInterface { + private $value; + private $string; + private $util; + /** + * Initializes token. + * + * @param mixed $value + * @param StringUtil $util + */ + public function __construct($value, StringUtil $util = null) + { + $this->value = $value; + $this->util = $util ?: new StringUtil(); + } + /** + * Scores 11 if argument matches preset value. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + return $argument === $this->value ? 11 : \false; + } + /** + * Returns false. + * + * @return bool + */ + public function isLast() + { + return \false; + } + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + if (null === $this->string) { + $this->string = \sprintf('identical(%s)', $this->util->stringify($this->value)); + } + return $this->string; + } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -use RuntimeException; -final class DeadCodeDetectionNotSupportedException extends RuntimeException implements Exception -{ -} - +/** + * Check if values is in array * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @author Vinícius Alonso */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; - -use RuntimeException; -use PHPUnit\SebastianBergmann\CodeCoverage\Exception; -final class Xdebug2NotEnabledException extends RuntimeException implements Exception +class InArrayToken implements \Prophecy\Argument\Token\TokenInterface { - public function __construct() + private $token = array(); + private $strict; + /** + * @param array $arguments tokens + * @param bool $strict + */ + public function __construct(array $arguments, $strict = \true) { - parent::__construct('xdebug.coverage_enable=On has to be set'); + $this->token = $arguments; + $this->strict = $strict; } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -use RuntimeException; -final class TestIdMissingException extends RuntimeException implements Exception -{ - public function __construct() + /** + * Return scores 8 score if argument is in array. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) { - parent::__construct('Test ID is missing'); + if (\count($this->token) === 0) { + return \false; + } + if (\in_array($argument, $this->token, $this->strict)) { + return 8; + } + return \false; + } + /** + * Returns false. + * + * @return boolean + */ + public function isLast() + { + return \false; + } + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + $arrayAsString = \implode(', ', $this->token); + return "[{$arrayAsString}]"; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -use RuntimeException; -final class ReflectionException extends RuntimeException implements Exception -{ -} - +/** + * Logical AND token. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @author Boris Mikhaylov */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; - -use RuntimeException; -use PHPUnit\SebastianBergmann\CodeCoverage\Exception; -final class Xdebug3NotEnabledException extends RuntimeException implements Exception +class LogicalAndToken implements \Prophecy\Argument\Token\TokenInterface { - public function __construct() + private $tokens = array(); + /** + * @param array $arguments exact values or tokens + */ + public function __construct(array $arguments) { - parent::__construct('XDEBUG_MODE=coverage or xdebug.mode=coverage has to be set'); + foreach ($arguments as $argument) { + if (!$argument instanceof \Prophecy\Argument\Token\TokenInterface) { + $argument = new \Prophecy\Argument\Token\ExactValueToken($argument); + } + $this->tokens[] = $argument; + } } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -use RuntimeException; -final class NoCodeCoverageDriverWithPathCoverageSupportAvailableException extends RuntimeException implements Exception -{ - public function __construct() + /** + * Scores maximum score from scores returned by tokens for this argument if all of them score. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) { - parent::__construct('No code coverage driver with path coverage support available'); + if (0 === \count($this->tokens)) { + return \false; + } + $maxScore = 0; + foreach ($this->tokens as $token) { + $score = $token->scoreArgument($argument); + if (\false === $score) { + return \false; + } + $maxScore = \max($score, $maxScore); + } + return $maxScore; + } + /** + * Returns false. + * + * @return boolean + */ + public function isLast() + { + return \false; + } + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return \sprintf('bool(%s)', \implode(' AND ', $this->tokens)); } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -use Throwable; -interface Exception extends Throwable -{ -} - +/** + * Logical NOT token. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @author Boris Mikhaylov */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; - -use RuntimeException; -use PHPUnit\SebastianBergmann\CodeCoverage\Exception; -final class PcovNotAvailableException extends RuntimeException implements Exception +class LogicalNotToken implements \Prophecy\Argument\Token\TokenInterface { - public function __construct() + /** @var \Prophecy\Argument\Token\TokenInterface */ + private $token; + /** + * @param mixed $value exact value or token + */ + public function __construct($value) { - parent::__construct('The PCOV extension is not available'); + $this->token = $value instanceof \Prophecy\Argument\Token\TokenInterface ? $value : new \Prophecy\Argument\Token\ExactValueToken($value); + } + /** + * Scores 4 when preset token does not match the argument. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + return \false === $this->token->scoreArgument($argument) ? 4 : \false; + } + /** + * Returns true if preset token is last. + * + * @return bool|int + */ + public function isLast() + { + return $this->token->isLast(); + } + /** + * Returns originating token. + * + * @return TokenInterface + */ + public function getOriginatingToken() + { + return $this->token; + } + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return \sprintf('not(%s)', $this->token); } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; +namespace Prophecy\Argument\Token; -use function sprintf; -use RuntimeException; -use PHPUnit\SebastianBergmann\CodeCoverage\Exception; -final class PathExistsButIsNotDirectoryException extends RuntimeException implements Exception +/** + * Check if values is not in array + * + * @author Vinícius Alonso + */ +class NotInArrayToken implements \Prophecy\Argument\Token\TokenInterface { - public function __construct(string $path) + private $token = array(); + private $strict; + /** + * @param array $arguments tokens + * @param bool $strict + */ + public function __construct(array $arguments, $strict = \true) { - parent::__construct(sprintf('"%s" exists but is not a directory', $path)); + $this->token = $arguments; + $this->strict = $strict; + } + /** + * Return scores 8 score if argument is in array. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + if (\count($this->token) === 0) { + return \false; + } + if (!\in_array($argument, $this->token, $this->strict)) { + return 8; + } + return \false; + } + /** + * Returns false. + * + * @return boolean + */ + public function isLast() + { + return \false; + } + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + $arrayAsString = \implode(', ', $this->token); + return "[{$arrayAsString}]"; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -use RuntimeException; -final class StaticAnalysisCacheNotConfiguredException extends RuntimeException implements Exception -{ -} - +use PHPUnit\SebastianBergmann\Comparator\ComparisonFailure; +use Prophecy\Comparator\Factory as ComparatorFactory; +use Prophecy\Util\StringUtil; +/** + * Object state-checker token. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @author Konstantin Kudryashov */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -use RuntimeException; -final class UnintentionallyCoveredCodeException extends RuntimeException implements Exception +class ObjectStateToken implements \Prophecy\Argument\Token\TokenInterface { + private $name; + private $value; + private $util; + private $comparatorFactory; /** - * @var array + * Initializes token. + * + * @param string $methodName + * @param mixed $value Expected return value + * @param null|StringUtil $util + * @param ComparatorFactory $comparatorFactory */ - private $unintentionallyCoveredUnits; - public function __construct(array $unintentionallyCoveredUnits) + public function __construct($methodName, $value, StringUtil $util = null, ComparatorFactory $comparatorFactory = null) { - $this->unintentionallyCoveredUnits = $unintentionallyCoveredUnits; - parent::__construct($this->toString()); + $this->name = $methodName; + $this->value = $value; + $this->util = $util ?: new StringUtil(); + $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); } - public function getUnintentionallyCoveredUnits() : array + /** + * Scores 8 if argument is an object, which method returns expected value. + * + * @param mixed $argument + * + * @return bool|int + */ + public function scoreArgument($argument) { - return $this->unintentionallyCoveredUnits; + if (\is_object($argument) && \method_exists($argument, $this->name)) { + $actual = \call_user_func(array($argument, $this->name)); + $comparator = $this->comparatorFactory->getComparatorFor($this->value, $actual); + try { + $comparator->assertEquals($this->value, $actual); + return 8; + } catch (ComparisonFailure $failure) { + return \false; + } + } + if (\is_object($argument) && \property_exists($argument, $this->name)) { + return $argument->{$this->name} === $this->value ? 8 : \false; + } + return \false; } - private function toString() : string + /** + * Returns false. + * + * @return bool + */ + public function isLast() + { + return \false; + } + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() { - $message = ''; - foreach ($this->unintentionallyCoveredUnits as $unit) { - $message .= '- ' . $unit . "\n"; - } - return $message; + return \sprintf('state(%s(), %s)', $this->name, $this->util->stringify($this->value)); } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -use RuntimeException; -final class BranchAndPathCoverageNotSupportedException extends RuntimeException implements Exception -{ -} - +/** + * String contains token. * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * @author Peter Mitchell */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -final class InvalidArgumentException extends \InvalidArgumentException implements Exception +class StringContainsToken implements \Prophecy\Argument\Token\TokenInterface { + private $value; + /** + * Initializes token. + * + * @param string $value + */ + public function __construct($value) + { + $this->value = $value; + } + public function scoreArgument($argument) + { + return \is_string($argument) && \strpos($argument, $this->value) !== \false ? 6 : \false; + } + /** + * Returns preset value against which token checks arguments. + * + * @return mixed + */ + public function getValue() + { + return $this->value; + } + /** + * Returns false. + * + * @return bool + */ + public function isLast() + { + return \false; + } + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return \sprintf('contains("%s")', $this->value); + } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; +namespace Prophecy\Argument\Token; -use RuntimeException; -final class ParserException extends RuntimeException implements Exception +/** + * Argument token interface. + * + * @author Konstantin Kudryashov + */ +interface TokenInterface { + /** + * Calculates token match score for provided argument. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument); + /** + * Returns true if this token prevents check of other tokens (is last one). + * + * @return bool|int + */ + public function isLast(); + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString(); } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; +namespace Prophecy\Argument\Token; -use function sprintf; +use Prophecy\Exception\InvalidArgumentException; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Value type token. + * + * @author Konstantin Kudryashov */ -final class Percentage +class TypeToken implements \Prophecy\Argument\Token\TokenInterface { + private $type; /** - * @var float - */ - private $fraction; - /** - * @var float + * @param string $type */ - private $total; - public static function fromFractionAndTotal(float $fraction, float $total) : self - { - return new self($fraction, $total); - } - private function __construct(float $fraction, float $total) + public function __construct($type) { - $this->fraction = $fraction; - $this->total = $total; + $checker = "is_{$type}"; + if (!\function_exists($checker) && !\interface_exists($type) && !\class_exists($type)) { + throw new InvalidArgumentException(\sprintf('Type or class name expected as an argument to TypeToken, but got %s.', $type)); + } + $this->type = $type; } - public function asFloat() : float + /** + * Scores 5 if argument has the same type this token was constructed with. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) { - if ($this->total > 0) { - return $this->fraction / $this->total * 100; + $checker = "is_{$this->type}"; + if (\function_exists($checker)) { + return \call_user_func($checker, $argument) ? 5 : \false; } - return 100.0; + return $argument instanceof $this->type ? 5 : \false; } - public function asString() : string + /** + * Returns false. + * + * @return bool + */ + public function isLast() { - if ($this->total > 0) { - return sprintf('%01.2F%%', $this->asFloat()); - } - return ''; + return \false; } - public function asFixedWidthString() : string + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() { - if ($this->total > 0) { - return sprintf('%6.2F%%', $this->asFloat()); - } - return ''; + return \sprintf('type(%s)', $this->type); } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; +namespace Prophecy\Call; -use function array_keys; -use function is_file; -use function realpath; -use function strpos; -use PHPUnit\SebastianBergmann\FileIterator\Facade as FileIteratorFacade; -final class Filter +use Exception; +use Prophecy\Argument\ArgumentsWildcard; +/** + * Call object. + * + * @author Konstantin Kudryashov + */ +class Call { + private $methodName; + private $arguments; + private $returnValue; + private $exception; + private $file; + private $line; + private $scores; /** - * @psalm-var array - */ - private $files = []; - /** - * @psalm-var array + * Initializes call. + * + * @param string $methodName + * @param array $arguments + * @param mixed $returnValue + * @param Exception $exception + * @param null|string $file + * @param null|int $line */ - private $isFileCache = []; - public function includeDirectory(string $directory, string $suffix = '.php', string $prefix = '') : void + public function __construct($methodName, array $arguments, $returnValue, Exception $exception = null, $file, $line) { - foreach ((new FileIteratorFacade())->getFilesAsArray($directory, $suffix, $prefix) as $file) { - $this->includeFile($file); + $this->methodName = $methodName; + $this->arguments = $arguments; + $this->returnValue = $returnValue; + $this->exception = $exception; + $this->scores = new \SplObjectStorage(); + if ($file) { + $this->file = $file; + $this->line = \intval($line); } } /** - * @psalm-param list $files + * Returns called method name. + * + * @return string */ - public function includeFiles(array $filenames) : void - { - foreach ($filenames as $filename) { - $this->includeFile($filename); - } - } - public function includeFile(string $filename) : void - { - $filename = realpath($filename); - if (!$filename) { - return; - } - $this->files[$filename] = \true; - } - public function excludeDirectory(string $directory, string $suffix = '.php', string $prefix = '') : void - { - foreach ((new FileIteratorFacade())->getFilesAsArray($directory, $suffix, $prefix) as $file) { - $this->excludeFile($file); - } - } - public function excludeFile(string $filename) : void + public function getMethodName() { - $filename = realpath($filename); - if (!$filename || !isset($this->files[$filename])) { - return; - } - unset($this->files[$filename]); + return $this->methodName; } - public function isFile(string $filename) : bool + /** + * Returns called method arguments. + * + * @return array + */ + public function getArguments() { - if (isset($this->isFileCache[$filename])) { - return $this->isFileCache[$filename]; - } - if ($filename === '-' || strpos($filename, 'vfs://') === 0 || strpos($filename, 'xdebug://debug-eval') !== \false || strpos($filename, 'eval()\'d code') !== \false || strpos($filename, 'runtime-created function') !== \false || strpos($filename, 'runkit created function') !== \false || strpos($filename, 'assert code') !== \false || strpos($filename, 'regexp code') !== \false || strpos($filename, 'Standard input code') !== \false) { - $isFile = \false; - } else { - $isFile = is_file($filename); - } - $this->isFileCache[$filename] = $isFile; - return $isFile; + return $this->arguments; } - public function isExcluded(string $filename) : bool + /** + * Returns called method return value. + * + * @return null|mixed + */ + public function getReturnValue() { - if (!$this->isFile($filename)) { - return \true; - } - return !isset($this->files[$filename]); + return $this->returnValue; } /** - * @psalm-return list + * Returns exception that call thrown. + * + * @return null|Exception */ - public function files() : array + public function getException() { - return array_keys($this->files); + return $this->exception; } - public function isEmpty() : bool + /** + * Returns callee filename. + * + * @return string + */ + public function getFile() { - return empty($this->files); + return $this->file; } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; - -use function extension_loaded; -use function phpversion; -use PHPUnit\SebastianBergmann\CodeCoverage\Filter; -use PHPUnit\SebastianBergmann\CodeCoverage\RawCodeCoverageData; -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class PcovDriver extends Driver -{ /** - * @var Filter + * Returns callee line number. + * + * @return int */ - private $filter; + public function getLine() + { + return $this->line; + } /** - * @throws PcovNotAvailableException + * Returns short notation for callee place. + * + * @return string */ - public function __construct(Filter $filter) + public function getCallPlace() { - if (!extension_loaded('pcov')) { - throw new PcovNotAvailableException(); + if (null === $this->file) { + return 'unknown'; } - $this->filter = $filter; - } - public function start() : void - { - \pcov\start(); + return \sprintf('%s:%d', $this->file, $this->line); } - public function stop() : RawCodeCoverageData + /** + * Adds the wildcard match score for the provided wildcard. + * + * @param ArgumentsWildcard $wildcard + * @param false|int $score + * + * @return $this + */ + public function addScore(ArgumentsWildcard $wildcard, $score) { - \pcov\stop(); - $collect = \pcov\collect(\pcov\inclusive, !$this->filter->isEmpty() ? $this->filter->files() : \pcov\waiting()); - \pcov\clear(); - return RawCodeCoverageData::fromXdebugWithoutPathCoverage($collect); + $this->scores[$wildcard] = $score; + return $this; } - public function nameAndVersion() : string + /** + * Returns wildcard match score for the provided wildcard. The score is + * calculated if not already done. + * + * @param ArgumentsWildcard $wildcard + * + * @return false|int False OR integer score (higher - better) + */ + public function getScore(ArgumentsWildcard $wildcard) { - return 'PCOV ' . phpversion('pcov'); + if (isset($this->scores[$wildcard])) { + return $this->scores[$wildcard]; + } + return $this->scores[$wildcard] = $wildcard->scoreArguments($this->getArguments()); } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; +namespace Prophecy\Call; -use function sprintf; -use PHPUnit\SebastianBergmann\CodeCoverage\BranchAndPathCoverageNotSupportedException; -use PHPUnit\SebastianBergmann\CodeCoverage\DeadCodeDetectionNotSupportedException; -use PHPUnit\SebastianBergmann\CodeCoverage\Filter; -use PHPUnit\SebastianBergmann\CodeCoverage\NoCodeCoverageDriverAvailableException; -use PHPUnit\SebastianBergmann\CodeCoverage\NoCodeCoverageDriverWithPathCoverageSupportAvailableException; -use PHPUnit\SebastianBergmann\CodeCoverage\RawCodeCoverageData; +use Prophecy\Exception\Prophecy\MethodProphecyException; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Argument\ArgumentsWildcard; +use Prophecy\Util\StringUtil; +use Prophecy\Exception\Call\UnexpectedCallException; +use SplObjectStorage; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Calls receiver & manager. + * + * @author Konstantin Kudryashov */ -abstract class Driver +class CallCenter { + private $util; /** - * @var int - * - * @see http://xdebug.org/docs/code_coverage + * @var Call[] */ - public const LINE_NOT_EXECUTABLE = -2; + private $recordedCalls = array(); /** - * @var int - * - * @see http://xdebug.org/docs/code_coverage + * @var SplObjectStorage */ - public const LINE_NOT_EXECUTED = -1; + private $unexpectedCalls; /** - * @var int + * Initializes call center. * - * @see http://xdebug.org/docs/code_coverage + * @param StringUtil $util */ - public const LINE_EXECUTED = 1; + public function __construct(StringUtil $util = null) + { + $this->util = $util ?: new StringUtil(); + $this->unexpectedCalls = new SplObjectStorage(); + } /** - * @var int + * Makes and records specific method call for object prophecy. * - * @see http://xdebug.org/docs/code_coverage - */ - public const BRANCH_NOT_HIT = 0; - /** - * @var int + * @param ObjectProphecy $prophecy + * @param string $methodName + * @param array $arguments * - * @see http://xdebug.org/docs/code_coverage - */ - public const BRANCH_HIT = 1; - /** - * @var bool - */ - private $collectBranchAndPathCoverage = \false; - /** - * @var bool - */ - private $detectDeadCode = \false; - /** - * @throws NoCodeCoverageDriverAvailableException - * @throws PcovNotAvailableException - * @throws PhpdbgNotAvailableException - * @throws Xdebug2NotEnabledException - * @throws Xdebug3NotEnabledException - * @throws XdebugNotAvailableException + * @return mixed Returns null if no promise for prophecy found or promise return value. * - * @deprecated Use DriverSelector::forLineCoverage() instead + * @throws \Prophecy\Exception\Call\UnexpectedCallException If no appropriate method prophecy found */ - public static function forLineCoverage(Filter $filter) : self + public function makeCall(ObjectProphecy $prophecy, $methodName, array $arguments) { - return (new Selector())->forLineCoverage($filter); + // For efficiency exclude 'args' from the generated backtrace + // Limit backtrace to last 3 calls as we don't use the rest + $backtrace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 3); + $file = $line = null; + if (isset($backtrace[2]) && isset($backtrace[2]['file'])) { + $file = $backtrace[2]['file']; + $line = $backtrace[2]['line']; + } + // If no method prophecies defined, then it's a dummy, so we'll just return null + if ('__destruct' === \strtolower($methodName) || 0 == \count($prophecy->getMethodProphecies())) { + $this->recordedCalls[] = new \Prophecy\Call\Call($methodName, $arguments, null, null, $file, $line); + return null; + } + // There are method prophecies, so it's a fake/stub. Searching prophecy for this call + $matches = $this->findMethodProphecies($prophecy, $methodName, $arguments); + // If fake/stub doesn't have method prophecy for this call - throw exception + if (!\count($matches)) { + $this->unexpectedCalls->attach(new \Prophecy\Call\Call($methodName, $arguments, null, null, $file, $line), $prophecy); + $this->recordedCalls[] = new \Prophecy\Call\Call($methodName, $arguments, null, null, $file, $line); + return null; + } + // Sort matches by their score value + @\usort($matches, function ($match1, $match2) { + return $match2[0] - $match1[0]; + }); + $score = $matches[0][0]; + // If Highest rated method prophecy has a promise - execute it or return null instead + $methodProphecy = $matches[0][1]; + $returnValue = null; + $exception = null; + if ($promise = $methodProphecy->getPromise()) { + try { + $returnValue = $promise->execute($arguments, $prophecy, $methodProphecy); + } catch (\Exception $e) { + $exception = $e; + } + } + if ($methodProphecy->hasReturnVoid() && $returnValue !== null) { + throw new MethodProphecyException("The method \"{$methodName}\" has a void return type, but the promise returned a value", $methodProphecy); + } + $this->recordedCalls[] = $call = new \Prophecy\Call\Call($methodName, $arguments, $returnValue, $exception, $file, $line); + $call->addScore($methodProphecy->getArgumentsWildcard(), $score); + if (null !== $exception) { + throw $exception; + } + return $returnValue; } /** - * @throws NoCodeCoverageDriverWithPathCoverageSupportAvailableException - * @throws Xdebug2NotEnabledException - * @throws Xdebug3NotEnabledException - * @throws XdebugNotAvailableException + * Searches for calls by method name & arguments wildcard. * - * @deprecated Use DriverSelector::forLineAndPathCoverage() instead + * @param string $methodName + * @param ArgumentsWildcard $wildcard + * + * @return Call[] */ - public static function forLineAndPathCoverage(Filter $filter) : self - { - return (new Selector())->forLineAndPathCoverage($filter); - } - public function canCollectBranchAndPathCoverage() : bool - { - return \false; - } - public function collectsBranchAndPathCoverage() : bool + public function findCalls($methodName, ArgumentsWildcard $wildcard) { - return $this->collectBranchAndPathCoverage; + $methodName = \strtolower($methodName); + return \array_values(\array_filter($this->recordedCalls, function (\Prophecy\Call\Call $call) use($methodName, $wildcard) { + return $methodName === \strtolower($call->getMethodName()) && 0 < $call->getScore($wildcard); + })); } /** - * @throws BranchAndPathCoverageNotSupportedException + * @throws UnexpectedCallException */ - public function enableBranchAndPathCoverage() : void + public function checkUnexpectedCalls() { - if (!$this->canCollectBranchAndPathCoverage()) { - throw new BranchAndPathCoverageNotSupportedException(sprintf('%s does not support branch and path coverage', $this->nameAndVersion())); + /** @var Call $call */ + foreach ($this->unexpectedCalls as $call) { + $prophecy = $this->unexpectedCalls[$call]; + // If fake/stub doesn't have method prophecy for this call - throw exception + if (!\count($this->findMethodProphecies($prophecy, $call->getMethodName(), $call->getArguments()))) { + throw $this->createUnexpectedCallException($prophecy, $call->getMethodName(), $call->getArguments()); + } } - $this->collectBranchAndPathCoverage = \true; - } - public function disableBranchAndPathCoverage() : void - { - $this->collectBranchAndPathCoverage = \false; } - public function canDetectDeadCode() : bool + private function createUnexpectedCallException(ObjectProphecy $prophecy, $methodName, array $arguments) { - return \false; + $classname = \get_class($prophecy->reveal()); + $indentationLength = 8; + // looks good + $argstring = \implode(",\n", $this->indentArguments(\array_map(array($this->util, 'stringify'), $arguments), $indentationLength)); + $expected = array(); + foreach (\array_merge(...\array_values($prophecy->getMethodProphecies())) as $methodProphecy) { + $expected[] = \sprintf(" - %s(\n" . "%s\n" . " )", $methodProphecy->getMethodName(), \implode(",\n", $this->indentArguments(\array_map('strval', $methodProphecy->getArgumentsWildcard()->getTokens()), $indentationLength))); + } + return new UnexpectedCallException(\sprintf("Unexpected method call on %s:\n" . " - %s(\n" . "%s\n" . " )\n" . "expected calls were:\n" . "%s", $classname, $methodName, $argstring, \implode("\n", $expected)), $prophecy, $methodName, $arguments); } - public function detectsDeadCode() : bool + private function indentArguments(array $arguments, $indentationLength) { - return $this->detectDeadCode; + return \preg_replace_callback('/^/m', function () use($indentationLength) { + return \str_repeat(' ', $indentationLength); + }, $arguments); } /** - * @throws DeadCodeDetectionNotSupportedException + * @param ObjectProphecy $prophecy + * @param string $methodName + * @param array $arguments + * + * @return array */ - public function enableDeadCodeDetection() : void + private function findMethodProphecies(ObjectProphecy $prophecy, $methodName, array $arguments) { - if (!$this->canDetectDeadCode()) { - throw new DeadCodeDetectionNotSupportedException(sprintf('%s does not support dead code detection', $this->nameAndVersion())); + $matches = array(); + foreach ($prophecy->getMethodProphecies($methodName) as $methodProphecy) { + if (0 < ($score = $methodProphecy->getArgumentsWildcard()->scoreArguments($arguments))) { + $matches[] = array($score, $methodProphecy); + } } - $this->detectDeadCode = \true; - } - public function disableDeadCodeDetection() : void - { - $this->detectDeadCode = \false; + return $matches; } - public abstract function nameAndVersion() : string; - public abstract function start() : void; - public abstract function stop() : RawCodeCoverageData; } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; +namespace Prophecy\Comparator; -use const XDEBUG_CC_BRANCH_CHECK; -use const XDEBUG_CC_DEAD_CODE; -use const XDEBUG_CC_UNUSED; -use const XDEBUG_FILTER_CODE_COVERAGE; -use const PHPUnit\XDEBUG_PATH_INCLUDE; -use function explode; -use function extension_loaded; -use function getenv; -use function in_array; -use function ini_get; -use function phpversion; -use function sprintf; -use function version_compare; -use function xdebug_get_code_coverage; -use function xdebug_set_filter; -use function xdebug_start_code_coverage; -use function xdebug_stop_code_coverage; -use PHPUnit\SebastianBergmann\CodeCoverage\Filter; -use PHPUnit\SebastianBergmann\CodeCoverage\RawCodeCoverageData; +use PHPUnit\SebastianBergmann\Comparator\Comparator; +use PHPUnit\SebastianBergmann\Comparator\ComparisonFailure; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Closure comparator. + * + * @author Konstantin Kudryashov */ -final class Xdebug3Driver extends Driver +final class ClosureComparator extends Comparator { - /** - * @throws WrongXdebugVersionException - * @throws Xdebug3NotEnabledException - * @throws XdebugNotAvailableException - */ - public function __construct(Filter $filter) - { - if (!extension_loaded('xdebug')) { - throw new XdebugNotAvailableException(); - } - if (version_compare(phpversion('xdebug'), '3', '<')) { - throw new WrongXdebugVersionException(sprintf('This driver requires Xdebug 3 but version %s is loaded', phpversion('xdebug'))); - } - $mode = getenv('XDEBUG_MODE'); - if ($mode === \false || $mode === '') { - $mode = ini_get('xdebug.mode'); - } - if ($mode === \false || !in_array('coverage', explode(',', $mode), \true)) { - throw new Xdebug3NotEnabledException(); - } - if (!$filter->isEmpty()) { - xdebug_set_filter(\XDEBUG_FILTER_CODE_COVERAGE, \XDEBUG_PATH_INCLUDE, $filter->files()); - } - } - public function canCollectBranchAndPathCoverage() : bool - { - return \true; - } - public function canDetectDeadCode() : bool - { - return \true; - } - public function start() : void + public function accepts($expected, $actual) : bool { - $flags = \XDEBUG_CC_UNUSED; - if ($this->detectsDeadCode() || $this->collectsBranchAndPathCoverage()) { - $flags |= \XDEBUG_CC_DEAD_CODE; - } - if ($this->collectsBranchAndPathCoverage()) { - $flags |= \XDEBUG_CC_BRANCH_CHECK; - } - xdebug_start_code_coverage($flags); + return \is_object($expected) && $expected instanceof \Closure && \is_object($actual) && $actual instanceof \Closure; } - public function stop() : RawCodeCoverageData + public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = \false, $ignoreCase = \false, array &$processed = array()) : void { - $data = xdebug_get_code_coverage(); - xdebug_stop_code_coverage(); - if ($this->collectsBranchAndPathCoverage()) { - return RawCodeCoverageData::fromXdebugWithPathCoverage($data); + if ($expected !== $actual) { + throw new ComparisonFailure( + $expected, + $actual, + // we don't need a diff + '', + '', + \false, + 'all closures are different if not identical' + ); } - return RawCodeCoverageData::fromXdebugWithoutPathCoverage($data); - } - public function nameAndVersion() : string - { - return 'Xdebug ' . phpversion('xdebug'); } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; +namespace Prophecy\Comparator; -use const XDEBUG_CC_BRANCH_CHECK; -use const XDEBUG_CC_DEAD_CODE; -use const XDEBUG_CC_UNUSED; -use const XDEBUG_FILTER_CODE_COVERAGE; -use const PHPUnit\XDEBUG_PATH_INCLUDE; -use const XDEBUG_PATH_WHITELIST; -use function defined; -use function extension_loaded; -use function ini_get; -use function phpversion; -use function sprintf; -use function version_compare; -use function xdebug_get_code_coverage; -use function xdebug_set_filter; -use function xdebug_start_code_coverage; -use function xdebug_stop_code_coverage; -use PHPUnit\SebastianBergmann\CodeCoverage\Filter; -use PHPUnit\SebastianBergmann\CodeCoverage\RawCodeCoverageData; +use PHPUnit\SebastianBergmann\Comparator\Factory as BaseFactory; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Prophecy comparator factory. + * + * @author Konstantin Kudryashov */ -final class Xdebug2Driver extends Driver +final class Factory extends BaseFactory { /** - * @var bool - */ - private $pathCoverageIsMixedCoverage; - /** - * @throws WrongXdebugVersionException - * @throws Xdebug2NotEnabledException - * @throws XdebugNotAvailableException + * @var Factory */ - public function __construct(Filter $filter) - { - if (!extension_loaded('xdebug')) { - throw new XdebugNotAvailableException(); - } - if (version_compare(phpversion('xdebug'), '3', '>=')) { - throw new WrongXdebugVersionException(sprintf('This driver requires Xdebug 2 but version %s is loaded', phpversion('xdebug'))); - } - if (!ini_get('xdebug.coverage_enable')) { - throw new Xdebug2NotEnabledException(); - } - if (!$filter->isEmpty()) { - if (defined('XDEBUG_PATH_WHITELIST')) { - $listType = \XDEBUG_PATH_WHITELIST; - } else { - $listType = \XDEBUG_PATH_INCLUDE; - } - xdebug_set_filter(\XDEBUG_FILTER_CODE_COVERAGE, $listType, $filter->files()); - } - $this->pathCoverageIsMixedCoverage = version_compare(phpversion('xdebug'), '2.9.6', '<'); - } - public function canCollectBranchAndPathCoverage() : bool - { - return \true; - } - public function canDetectDeadCode() : bool + private static $instance; + public function __construct() { - return \true; + parent::__construct(); + $this->register(new \Prophecy\Comparator\ClosureComparator()); + $this->register(new \Prophecy\Comparator\ProphecyComparator()); } - public function start() : void + /** + * @return Factory + */ + public static function getInstance() { - $flags = \XDEBUG_CC_UNUSED; - if ($this->detectsDeadCode() || $this->collectsBranchAndPathCoverage()) { - $flags |= \XDEBUG_CC_DEAD_CODE; - } - if ($this->collectsBranchAndPathCoverage()) { - $flags |= \XDEBUG_CC_BRANCH_CHECK; + if (self::$instance === null) { + self::$instance = new \Prophecy\Comparator\Factory(); } - xdebug_start_code_coverage($flags); + return self::$instance; } - public function stop() : RawCodeCoverageData +} + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Comparator; + +use Prophecy\Prophecy\ProphecyInterface; +use PHPUnit\SebastianBergmann\Comparator\ObjectComparator; +/** + * @final + */ +class ProphecyComparator extends ObjectComparator +{ + public function accepts($expected, $actual) : bool { - $data = xdebug_get_code_coverage(); - xdebug_stop_code_coverage(); - if ($this->collectsBranchAndPathCoverage()) { - if ($this->pathCoverageIsMixedCoverage) { - return RawCodeCoverageData::fromXdebugWithMixedCoverage($data); - } - return RawCodeCoverageData::fromXdebugWithPathCoverage($data); - } - return RawCodeCoverageData::fromXdebugWithoutPathCoverage($data); + return \is_object($expected) && \is_object($actual) && $actual instanceof ProphecyInterface; } - public function nameAndVersion() : string + public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = \false, $ignoreCase = \false, array &$processed = array()) : void { - return 'Xdebug ' . phpversion('xdebug'); + parent::assertEquals($expected, $actual->reveal(), $delta, $canonicalize, $ignoreCase, $processed); } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; +namespace Prophecy\Doubler; -use const PHP_SAPI; -use const PHP_VERSION; -use function array_diff; -use function array_keys; -use function array_merge; -use function get_included_files; -use function phpdbg_end_oplog; -use function phpdbg_get_executable; -use function phpdbg_start_oplog; -use PHPUnit\SebastianBergmann\CodeCoverage\RawCodeCoverageData; +use ReflectionClass; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Cached class doubler. + * Prevents mirroring/creation of the same structure twice. + * + * @author Konstantin Kudryashov */ -final class PhpdbgDriver extends Driver +class CachedDoubler extends \Prophecy\Doubler\Doubler { + private static $classes = array(); /** - * @throws PhpdbgNotAvailableException + * {@inheritdoc} */ - public function __construct() + protected function createDoubleClass(ReflectionClass $class = null, array $interfaces) { - if (\PHP_SAPI !== 'phpdbg') { - throw new PhpdbgNotAvailableException(); + $classId = $this->generateClassId($class, $interfaces); + if (isset(self::$classes[$classId])) { + return self::$classes[$classId]; } + return self::$classes[$classId] = parent::createDoubleClass($class, $interfaces); } - public function start() : void - { - phpdbg_start_oplog(); - } - public function stop() : RawCodeCoverageData + /** + * @param ReflectionClass $class + * @param ReflectionClass[] $interfaces + * + * @return string + */ + private function generateClassId(ReflectionClass $class = null, array $interfaces) { - static $fetchedLines = []; - $dbgData = phpdbg_end_oplog(); - if ($fetchedLines === []) { - $sourceLines = phpdbg_get_executable(); - } else { - $newFiles = array_diff(get_included_files(), array_keys($fetchedLines)); - $sourceLines = []; - if ($newFiles) { - $sourceLines = phpdbg_get_executable(['files' => $newFiles]); - } + $parts = array(); + if (null !== $class) { + $parts[] = $class->getName(); } - foreach ($sourceLines as $file => $lines) { - foreach ($lines as $lineNo => $numExecuted) { - $sourceLines[$file][$lineNo] = self::LINE_NOT_EXECUTED; - } + foreach ($interfaces as $interface) { + $parts[] = $interface->getName(); } - $fetchedLines = array_merge($fetchedLines, $sourceLines); - return RawCodeCoverageData::fromXdebugWithoutPathCoverage($this->detectExecutedLines($fetchedLines, $dbgData)); - } - public function nameAndVersion() : string - { - return 'PHPDBG ' . \PHP_VERSION; + foreach ($this->getClassPatches() as $patch) { + $parts[] = \get_class($patch); + } + \sort($parts); + return \md5(\implode('', $parts)); } - private function detectExecutedLines(array $sourceLines, array $dbgData) : array + public function resetCache() { - foreach ($dbgData as $file => $coveredLines) { - foreach ($coveredLines as $lineNo => $numExecuted) { - // phpdbg also reports $lineNo=0 when e.g. exceptions get thrown. - // make sure we only mark lines executed which are actually executable. - if (isset($sourceLines[$file][$lineNo])) { - $sourceLines[$file][$lineNo] = self::LINE_EXECUTED; - } - } - } - return $sourceLines; + self::$classes = array(); } } + * Marcello Duarte * - * (c) Sebastian Bergmann + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Doubler\ClassPatch; + +use Prophecy\Doubler\Generator\Node\ClassNode; +/** + * Class patch interface. + * Class patches extend doubles functionality or help + * Prophecy to avoid some internal PHP bugs. + * + * @author Konstantin Kudryashov + */ +interface ClassPatchInterface +{ + /** + * Checks if patch supports specific class node. + * + * @param ClassNode $node + * + * @return bool + */ + public function supports(ClassNode $node); + /** + * Applies patch to the specific class node. + * + * @param ClassNode $node + * @return void + */ + public function apply(ClassNode $node); + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return int Priority number (higher - earlier) + */ + public function getPriority(); +} + + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Driver; +namespace Prophecy\Doubler\ClassPatch; -use function phpversion; -use function version_compare; -use PHPUnit\SebastianBergmann\CodeCoverage\Filter; -use PHPUnit\SebastianBergmann\CodeCoverage\NoCodeCoverageDriverAvailableException; -use PHPUnit\SebastianBergmann\CodeCoverage\NoCodeCoverageDriverWithPathCoverageSupportAvailableException; -use PHPUnit\SebastianBergmann\Environment\Runtime; -final class Selector +use Prophecy\Doubler\Generator\Node\ClassNode; +use Prophecy\Doubler\Generator\Node\MethodNode; +/** + * Disable constructor. + * Makes all constructor arguments optional. + * + * @author Konstantin Kudryashov + */ +class DisableConstructorPatch implements \Prophecy\Doubler\ClassPatch\ClassPatchInterface { /** - * @throws NoCodeCoverageDriverAvailableException - * @throws PcovNotAvailableException - * @throws PhpdbgNotAvailableException - * @throws Xdebug2NotEnabledException - * @throws Xdebug3NotEnabledException - * @throws XdebugNotAvailableException + * Checks if class has `__construct` method. + * + * @param ClassNode $node + * + * @return bool */ - public function forLineCoverage(Filter $filter) : Driver + public function supports(ClassNode $node) { - $runtime = new Runtime(); - if ($runtime->hasPHPDBGCodeCoverage()) { - return new PhpdbgDriver(); - } - if ($runtime->hasPCOV()) { - return new PcovDriver($filter); + return \true; + } + /** + * Makes all class constructor arguments optional. + * + * @param ClassNode $node + */ + public function apply(ClassNode $node) + { + if (!$node->isExtendable('__construct')) { + return; } - if ($runtime->hasXdebug()) { - if (version_compare(phpversion('xdebug'), '3', '>=')) { - $driver = new Xdebug3Driver($filter); - } else { - $driver = new Xdebug2Driver($filter); - } - $driver->enableDeadCodeDetection(); - return $driver; + if (!$node->hasMethod('__construct')) { + $node->addMethod(new MethodNode('__construct', '')); + return; } - throw new NoCodeCoverageDriverAvailableException(); + $constructor = $node->getMethod('__construct'); + foreach ($constructor->getArguments() as $argument) { + $argument->setDefault(null); + } + $constructor->setCode(<<hasXdebug()) { - if (version_compare(phpversion('xdebug'), '3', '>=')) { - $driver = new Xdebug3Driver($filter); - } else { - $driver = new Xdebug2Driver($filter); - } - $driver->enableDeadCodeDetection(); - $driver->enableBranchAndPathCoverage(); - return $driver; - } - throw new NoCodeCoverageDriverWithPathCoverageSupportAvailableException(); + return 100; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; +namespace Prophecy\Doubler\ClassPatch; -use PHPUnit\SebastianBergmann\LinesOfCode\LinesOfCode; +use Prophecy\Doubler\Generator\Node\ClassNode; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Exception patch for HHVM to remove the stubs from special methods + * + * @author Christophe Coevoet */ -final class CachingCoveredFileAnalyser extends Cache implements CoveredFileAnalyser +class HhvmExceptionPatch implements \Prophecy\Doubler\ClassPatch\ClassPatchInterface { /** - * @var CoveredFileAnalyser - */ - private $coveredFileAnalyser; - /** - * @var array + * Supports exceptions on HHVM. + * + * @param ClassNode $node + * + * @return bool */ - private $cache = []; - public function __construct(string $directory, CoveredFileAnalyser $coveredFileAnalyser) - { - parent::__construct($directory); - $this->coveredFileAnalyser = $coveredFileAnalyser; - } - public function classesIn(string $filename) : array - { - if (!isset($this->cache[$filename])) { - $this->process($filename); - } - return $this->cache[$filename]['classesIn']; - } - public function traitsIn(string $filename) : array - { - if (!isset($this->cache[$filename])) { - $this->process($filename); - } - return $this->cache[$filename]['traitsIn']; - } - public function functionsIn(string $filename) : array + public function supports(ClassNode $node) { - if (!isset($this->cache[$filename])) { - $this->process($filename); + if (!\defined('PHPUnit\\HHVM_VERSION')) { + return \false; } - return $this->cache[$filename]['functionsIn']; + return 'Exception' === $node->getParentClass() || \is_subclass_of($node->getParentClass(), 'Exception'); } - public function linesOfCodeFor(string $filename) : LinesOfCode + /** + * Removes special exception static methods from the doubled methods. + * + * @param ClassNode $node + * + * @return void + */ + public function apply(ClassNode $node) { - if (!isset($this->cache[$filename])) { - $this->process($filename); + if ($node->hasMethod('setTraceOptions')) { + $node->getMethod('setTraceOptions')->useParentCode(); } - return $this->cache[$filename]['linesOfCodeFor']; - } - public function ignoredLinesFor(string $filename) : array - { - if (!isset($this->cache[$filename])) { - $this->process($filename); + if ($node->hasMethod('getTraceOptions')) { + $node->getMethod('getTraceOptions')->useParentCode(); } - return $this->cache[$filename]['ignoredLinesFor']; } - public function process(string $filename) : void + /** + * {@inheritdoc} + */ + public function getPriority() { - if ($this->has($filename, __CLASS__)) { - $this->cache[$filename] = $this->read($filename, __CLASS__, [LinesOfCode::class]); - return; - } - $this->cache[$filename] = ['classesIn' => $this->coveredFileAnalyser->classesIn($filename), 'traitsIn' => $this->coveredFileAnalyser->traitsIn($filename), 'functionsIn' => $this->coveredFileAnalyser->functionsIn($filename), 'linesOfCodeFor' => $this->coveredFileAnalyser->linesOfCodeFor($filename), 'ignoredLinesFor' => $this->coveredFileAnalyser->ignoredLinesFor($filename)]; - $this->write($filename, __CLASS__, $this->cache[$filename]); + return -50; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; +namespace Prophecy\Doubler\ClassPatch; +use Prophecy\Doubler\Generator\Node\ClassNode; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Remove method functionality from the double which will clash with php keywords. + * + * @author Milan Magudia */ -interface UncoveredFileAnalyser +class KeywordPatch implements \Prophecy\Doubler\ClassPatch\ClassPatchInterface { - public function executableLinesIn(string $filename) : array; + /** + * Support any class + * + * @param ClassNode $node + * + * @return boolean + */ + public function supports(ClassNode $node) + { + return \true; + } + /** + * Remove methods that clash with php keywords + * + * @param ClassNode $node + */ + public function apply(ClassNode $node) + { + $methodNames = \array_keys($node->getMethods()); + $methodsToRemove = \array_intersect($methodNames, $this->getKeywords()); + foreach ($methodsToRemove as $methodName) { + $node->removeMethod($methodName); + } + } + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return int Priority number (higher - earlier) + */ + public function getPriority() + { + return 49; + } + /** + * Returns array of php keywords. + * + * @return array + */ + private function getKeywords() + { + return ['__halt_compiler']; + } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; +namespace Prophecy\Doubler\ClassPatch; -use function array_unique; -use function assert; -use function file_get_contents; -use function is_array; -use function sprintf; -use function substr_count; -use function token_get_all; -use function trim; -use PHPUnit\PhpParser\Error; -use PHPUnit\PhpParser\Lexer; -use PHPUnit\PhpParser\NodeTraverser; -use PHPUnit\PhpParser\NodeVisitor\NameResolver; -use PHPUnit\PhpParser\NodeVisitor\ParentConnectingVisitor; -use PHPUnit\PhpParser\ParserFactory; -use PHPUnit\SebastianBergmann\CodeCoverage\ParserException; -use PHPUnit\SebastianBergmann\LinesOfCode\LineCountingVisitor; -use PHPUnit\SebastianBergmann\LinesOfCode\LinesOfCode; +use Prophecy\Doubler\Generator\Node\ArgumentNode; +use Prophecy\Doubler\Generator\Node\ClassNode; +use Prophecy\Doubler\Generator\Node\MethodNode; +use Prophecy\PhpDocumentor\ClassAndInterfaceTagRetriever; +use Prophecy\PhpDocumentor\MethodTagRetrieverInterface; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Discover Magical API using "@method" PHPDoc format. + * + * @author Thomas Tourlourat + * @author Kévin Dunglas + * @author Théo FIDRY */ -final class ParsingCoveredFileAnalyser implements CoveredFileAnalyser +class MagicCallPatch implements \Prophecy\Doubler\ClassPatch\ClassPatchInterface { - /** - * @var array - */ - private $classes = []; - /** - * @var array - */ - private $traits = []; - /** - * @var array - */ - private $functions = []; - /** - * @var LinesOfCode[] - */ - private $linesOfCode = []; - /** - * @var array - */ - private $ignoredLines = []; - /** - * @var bool - */ - private $useAnnotationsForIgnoringCode; - /** - * @var bool - */ - private $ignoreDeprecatedCode; - public function __construct(bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecatedCode) - { - $this->useAnnotationsForIgnoringCode = $useAnnotationsForIgnoringCode; - $this->ignoreDeprecatedCode = $ignoreDeprecatedCode; - } - public function classesIn(string $filename) : array - { - $this->analyse($filename); - return $this->classes[$filename]; - } - public function traitsIn(string $filename) : array - { - $this->analyse($filename); - return $this->traits[$filename]; - } - public function functionsIn(string $filename) : array - { - $this->analyse($filename); - return $this->functions[$filename]; - } - public function linesOfCodeFor(string $filename) : LinesOfCode - { - $this->analyse($filename); - return $this->linesOfCode[$filename]; - } - public function ignoredLinesFor(string $filename) : array + const MAGIC_METHODS_WITH_ARGUMENTS = ['__call', '__callStatic', '__get', '__isset', '__set', '__set_state', '__unserialize', '__unset']; + private $tagRetriever; + public function __construct(MethodTagRetrieverInterface $tagRetriever = null) { - $this->analyse($filename); - return $this->ignoredLines[$filename]; + $this->tagRetriever = null === $tagRetriever ? new ClassAndInterfaceTagRetriever() : $tagRetriever; } /** - * @throws ParserException + * Support any class + * + * @param ClassNode $node + * + * @return boolean */ - private function analyse(string $filename) : void + public function supports(ClassNode $node) { - if (isset($this->classes[$filename])) { - return; - } - $source = file_get_contents($filename); - $linesOfCode = substr_count($source, "\n"); - if ($linesOfCode === 0 && !empty($source)) { - $linesOfCode = 1; - } - $parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7, new Lexer()); - try { - $nodes = $parser->parse($source); - assert($nodes !== null); - $traverser = new NodeTraverser(); - $codeUnitFindingVisitor = new CodeUnitFindingVisitor(); - $lineCountingVisitor = new LineCountingVisitor($linesOfCode); - $ignoredLinesFindingVisitor = new IgnoredLinesFindingVisitor($this->useAnnotationsForIgnoringCode, $this->ignoreDeprecatedCode); - $traverser->addVisitor(new NameResolver()); - $traverser->addVisitor(new ParentConnectingVisitor()); - $traverser->addVisitor($codeUnitFindingVisitor); - $traverser->addVisitor($lineCountingVisitor); - $traverser->addVisitor($ignoredLinesFindingVisitor); - /* @noinspection UnusedFunctionResultInspection */ - $traverser->traverse($nodes); - // @codeCoverageIgnoreStart - } catch (Error $error) { - throw new ParserException(sprintf('Cannot parse %s: %s', $filename, $error->getMessage()), (int) $error->getCode(), $error); - } - // @codeCoverageIgnoreEnd - $this->classes[$filename] = $codeUnitFindingVisitor->classes(); - $this->traits[$filename] = $codeUnitFindingVisitor->traits(); - $this->functions[$filename] = $codeUnitFindingVisitor->functions(); - $this->linesOfCode[$filename] = $lineCountingVisitor->result(); - $this->ignoredLines[$filename] = []; - $this->findLinesIgnoredByLineBasedAnnotations($filename, $source, $this->useAnnotationsForIgnoringCode); - $this->ignoredLines[$filename] = array_unique(\array_merge($this->ignoredLines[$filename], $ignoredLinesFindingVisitor->ignoredLines())); - \sort($this->ignoredLines[$filename]); + return \true; } - private function findLinesIgnoredByLineBasedAnnotations(string $filename, string $source, bool $useAnnotationsForIgnoringCode) : void + /** + * Discover Magical API + * + * @param ClassNode $node + */ + public function apply(ClassNode $node) { - $ignore = \false; - $stop = \false; - foreach (token_get_all($source) as $token) { - if (!is_array($token)) { - continue; - } - switch ($token[0]) { - case \T_COMMENT: - case \T_DOC_COMMENT: - if (!$useAnnotationsForIgnoringCode) { - break; + $types = \array_filter($node->getInterfaces(), function ($interface) { + return 0 !== \strpos($interface, 'Prophecy\\'); + }); + $types[] = $node->getParentClass(); + foreach ($types as $type) { + $reflectionClass = new \ReflectionClass($type); + while ($reflectionClass) { + $tagList = $this->tagRetriever->getTagList($reflectionClass); + foreach ($tagList as $tag) { + $methodName = $tag->getMethodName(); + if (empty($methodName)) { + continue; } - $comment = trim($token[1]); - if ($comment === '// @codeCoverageIgnore' || $comment === '//@codeCoverageIgnore') { - $ignore = \true; - $stop = \true; - } elseif ($comment === '// @codeCoverageIgnoreStart' || $comment === '//@codeCoverageIgnoreStart') { - $ignore = \true; - } elseif ($comment === '// @codeCoverageIgnoreEnd' || $comment === '//@codeCoverageIgnoreEnd') { - $stop = \true; + if (!$reflectionClass->hasMethod($methodName)) { + $methodNode = new MethodNode($methodName); + // only magic methods can have a contract that needs to be enforced + if (\in_array($methodName, self::MAGIC_METHODS_WITH_ARGUMENTS)) { + foreach ($tag->getArguments() as $argument) { + $argumentNode = new ArgumentNode($argument['name']); + $methodNode->addArgument($argumentNode); + } + } + $methodNode->setStatic($tag->isStatic()); + $node->addMethod($methodNode); } - break; - } - if ($ignore) { - $this->ignoredLines[$filename][] = $token[2]; - if ($stop) { - $ignore = \false; - $stop = \false; } + $reflectionClass = $reflectionClass->getParentClass(); } } } + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return integer Priority number (higher - earlier) + */ + public function getPriority() + { + return 50; + } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; +namespace Prophecy\Doubler\ClassPatch; -use function array_unique; -use function sort; -use PHPUnit\PhpParser\Node; -use PHPUnit\PhpParser\Node\Stmt\Break_; -use PHPUnit\PhpParser\Node\Stmt\Case_; -use PHPUnit\PhpParser\Node\Stmt\Catch_; -use PHPUnit\PhpParser\Node\Stmt\Continue_; -use PHPUnit\PhpParser\Node\Stmt\Do_; -use PHPUnit\PhpParser\Node\Stmt\Echo_; -use PHPUnit\PhpParser\Node\Stmt\Else_; -use PHPUnit\PhpParser\Node\Stmt\ElseIf_; -use PHPUnit\PhpParser\Node\Stmt\Expression; -use PHPUnit\PhpParser\Node\Stmt\Finally_; -use PHPUnit\PhpParser\Node\Stmt\For_; -use PHPUnit\PhpParser\Node\Stmt\Foreach_; -use PHPUnit\PhpParser\Node\Stmt\Goto_; -use PHPUnit\PhpParser\Node\Stmt\If_; -use PHPUnit\PhpParser\Node\Stmt\Return_; -use PHPUnit\PhpParser\Node\Stmt\Switch_; -use PHPUnit\PhpParser\Node\Stmt\Throw_; -use PHPUnit\PhpParser\Node\Stmt\TryCatch; -use PHPUnit\PhpParser\Node\Stmt\Unset_; -use PHPUnit\PhpParser\Node\Stmt\While_; -use PHPUnit\PhpParser\NodeVisitorAbstract; +use Prophecy\Doubler\Generator\Node\ArgumentTypeNode; +use Prophecy\Doubler\Generator\Node\ClassNode; +use Prophecy\Doubler\Generator\Node\MethodNode; +use Prophecy\Doubler\Generator\Node\ArgumentNode; +use Prophecy\Doubler\Generator\Node\ReturnTypeNode; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Add Prophecy functionality to the double. + * This is a core class patch for Prophecy. + * + * @author Konstantin Kudryashov */ -final class ExecutableLinesFindingVisitor extends NodeVisitorAbstract +class ProphecySubjectPatch implements \Prophecy\Doubler\ClassPatch\ClassPatchInterface { /** - * @psalm-var list + * Always returns true. + * + * @param ClassNode $node + * + * @return bool */ - private $executableLines = []; - public function enterNode(Node $node) : void + public function supports(ClassNode $node) { - if (!$this->isExecutable($node)) { - return; - } - $this->executableLines[] = $node->getStartLine(); + return \true; } /** - * @psalm-return list + * Apply Prophecy functionality to class node. + * + * @param ClassNode $node */ - public function executableLines() : array + public function apply(ClassNode $node) { - $executableLines = array_unique($this->executableLines); - sort($executableLines); - return $executableLines; + $node->addInterface('Prophecy\\Prophecy\\ProphecySubjectInterface'); + $node->addProperty('objectProphecyClosure', 'private'); + foreach ($node->getMethods() as $name => $method) { + if ('__construct' === \strtolower($name)) { + continue; + } + if (!$method->getReturnTypeNode()->hasReturnStatement()) { + $method->setCode('$this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());'); + } else { + $method->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());'); + } + } + $prophecySetter = new MethodNode('setProphecy'); + $prophecyArgument = new ArgumentNode('prophecy'); + $prophecyArgument->setTypeNode(new ArgumentTypeNode('Prophecy\\Prophecy\\ProphecyInterface')); + $prophecySetter->addArgument($prophecyArgument); + $prophecySetter->setCode(<<objectProphecyClosure) { + \$this->objectProphecyClosure = static function () use (\$prophecy) { + return \$prophecy; + }; +} +PHP +); + $prophecyGetter = new MethodNode('getProphecy'); + $prophecyGetter->setCode('return \\call_user_func($this->objectProphecyClosure);'); + if ($node->hasMethod('__call')) { + $__call = $node->getMethod('__call'); + } else { + $__call = new MethodNode('__call'); + $__call->addArgument(new ArgumentNode('name')); + $__call->addArgument(new ArgumentNode('arguments')); + $node->addMethod($__call, \true); + } + $__call->setCode(<<addMethod($prophecySetter, \true); + $node->addMethod($prophecyGetter, \true); } - private function isExecutable(Node $node) : bool + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return int Priority number (higher - earlier) + */ + public function getPriority() { - return $node instanceof Break_ || $node instanceof Case_ || $node instanceof Catch_ || $node instanceof Continue_ || $node instanceof Do_ || $node instanceof Echo_ || $node instanceof ElseIf_ || $node instanceof Else_ || $node instanceof Expression || $node instanceof Finally_ || $node instanceof Foreach_ || $node instanceof For_ || $node instanceof Goto_ || $node instanceof If_ || $node instanceof Return_ || $node instanceof Switch_ || $node instanceof Throw_ || $node instanceof TryCatch || $node instanceof Unset_ || $node instanceof While_; + return 0; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; +namespace Prophecy\Doubler\ClassPatch; -use const DIRECTORY_SEPARATOR; -use function file_get_contents; -use function file_put_contents; -use function filemtime; -use function hash; -use function is_file; -use function serialize; -use function unserialize; -use PHPUnit\SebastianBergmann\CodeCoverage\Directory; +use Prophecy\Doubler\Generator\Node\ClassNode; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * ReflectionClass::newInstance patch. + * Makes first argument of newInstance optional, since it works but signature is misleading + * + * @author Florian Klein */ -abstract class Cache +class ReflectionClassNewInstancePatch implements \Prophecy\Doubler\ClassPatch\ClassPatchInterface { /** - * @var string + * Supports ReflectionClass + * + * @param ClassNode $node + * + * @return bool */ - private $directory; - public function __construct(string $directory) - { - Directory::create($directory); - $this->directory = $directory; - } - protected function has(string $filename, string $key) : bool + public function supports(ClassNode $node) { - $cacheFile = $this->cacheFile($filename, $key); - if (!is_file($cacheFile)) { - return \false; - } - if (filemtime($cacheFile) < filemtime($filename)) { - return \false; - } - return \true; + return 'ReflectionClass' === $node->getParentClass(); } /** - * @psalm-param list $allowedClasses + * Updates newInstance's first argument to make it optional * - * @return mixed + * @param ClassNode $node */ - protected function read(string $filename, string $key, array $allowedClasses = []) + public function apply(ClassNode $node) { - $options = ['allowed_classes' => \false]; - if (!empty($allowedClasses)) { - $options = ['allowed_classes' => $allowedClasses]; + foreach ($node->getMethod('newInstance')->getArguments() as $argument) { + $argument->setDefault(null); } - return unserialize(file_get_contents($this->cacheFile($filename, $key)), $options); } /** - * @param mixed $data + * Returns patch priority, which determines when patch will be applied. + * + * @return int Priority number (higher = earlier) */ - protected function write(string $filename, string $key, $data) : void - { - file_put_contents($this->cacheFile($filename, $key), serialize($data)); - } - private function cacheFile(string $filename, string $key) : string + public function getPriority() { - return $this->directory . \DIRECTORY_SEPARATOR . hash('sha256', $filename . $key); + return 50; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; +namespace Prophecy\Doubler\ClassPatch; -use function implode; -use function rtrim; -use function trim; -use PHPUnit\PhpParser\Node; -use PHPUnit\PhpParser\Node\Identifier; -use PHPUnit\PhpParser\Node\Name; -use PHPUnit\PhpParser\Node\NullableType; -use PHPUnit\PhpParser\Node\Stmt\Class_; -use PHPUnit\PhpParser\Node\Stmt\ClassMethod; -use PHPUnit\PhpParser\Node\Stmt\Function_; -use PHPUnit\PhpParser\Node\Stmt\Interface_; -use PHPUnit\PhpParser\Node\Stmt\Trait_; -use PHPUnit\PhpParser\Node\UnionType; -use PHPUnit\PhpParser\NodeTraverser; -use PHPUnit\PhpParser\NodeVisitorAbstract; -use PHPUnit\SebastianBergmann\Complexity\CyclomaticComplexityCalculatingVisitor; +use Prophecy\Doubler\Generator\Node\ClassNode; +use Prophecy\Doubler\Generator\Node\MethodNode; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * SplFileInfo patch. + * Makes SplFileInfo and derivative classes usable with Prophecy. + * + * @author Konstantin Kudryashov */ -final class CodeUnitFindingVisitor extends NodeVisitorAbstract +class SplFileInfoPatch implements \Prophecy\Doubler\ClassPatch\ClassPatchInterface { /** - * @var array - */ - private $classes = []; - /** - * @var array + * Supports everything that extends SplFileInfo. + * + * @param ClassNode $node + * + * @return bool */ - private $traits = []; + public function supports(ClassNode $node) + { + if (null === $node->getParentClass()) { + return \false; + } + return 'SplFileInfo' === $node->getParentClass() || \is_subclass_of($node->getParentClass(), 'SplFileInfo'); + } /** - * @var array + * Updated constructor code to call parent one with dummy file argument. + * + * @param ClassNode $node */ - private $functions = []; - public function enterNode(Node $node) + public function apply(ClassNode $node) { - if ($node instanceof Class_) { - if ($node->isAnonymous()) { - return; - } - $this->processClass($node); + if ($node->hasMethod('__construct')) { + $constructor = $node->getMethod('__construct'); + } else { + $constructor = new MethodNode('__construct'); + $node->addMethod($constructor); } - if ($node instanceof Trait_) { - $this->processTrait($node); + if ($this->nodeIsDirectoryIterator($node)) { + $constructor->setCode('return parent::__construct("' . __DIR__ . '");'); + return; } - if (!$node instanceof ClassMethod && !$node instanceof Function_) { - return null; + if ($this->nodeIsSplFileObject($node)) { + $filePath = \str_replace('\\', '\\\\', __FILE__); + $constructor->setCode('return parent::__construct("' . $filePath . '");'); + return; } - if ($node instanceof ClassMethod) { - $parentNode = $node->getAttribute('parent'); - if ($parentNode instanceof Class_ && $parentNode->isAnonymous()) { - return; - } - $this->processMethod($node); + if ($this->nodeIsSymfonySplFileInfo($node)) { + $filePath = \str_replace('\\', '\\\\', __FILE__); + $constructor->setCode('return parent::__construct("' . $filePath . '", "", "");'); return; } - $this->processFunction($node); + $constructor->useParentCode(); } - public function classes() : array + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return int Priority number (higher - earlier) + */ + public function getPriority() { - return $this->classes; + return 50; } - public function traits() : array + /** + * @param ClassNode $node + * @return boolean + */ + private function nodeIsDirectoryIterator(ClassNode $node) { - return $this->traits; + $parent = $node->getParentClass(); + return 'DirectoryIterator' === $parent || \is_subclass_of($parent, 'DirectoryIterator'); } - public function functions() : array + /** + * @param ClassNode $node + * @return boolean + */ + private function nodeIsSplFileObject(ClassNode $node) { - return $this->functions; + $parent = $node->getParentClass(); + return 'SplFileObject' === $parent || \is_subclass_of($parent, 'SplFileObject'); } /** - * @psalm-param ClassMethod|Function_ $node + * @param ClassNode $node + * @return boolean */ - private function cyclomaticComplexity(Node $node) : int + private function nodeIsSymfonySplFileInfo(ClassNode $node) { - \assert($node instanceof ClassMethod || $node instanceof Function_); - $nodes = $node->getStmts(); - if ($nodes === null) { - return 0; - } - $traverser = new NodeTraverser(); - $cyclomaticComplexityCalculatingVisitor = new CyclomaticComplexityCalculatingVisitor(); - $traverser->addVisitor($cyclomaticComplexityCalculatingVisitor); - /* @noinspection UnusedFunctionResultInspection */ - $traverser->traverse($nodes); - return $cyclomaticComplexityCalculatingVisitor->cyclomaticComplexity(); + $parent = $node->getParentClass(); + return 'Symfony\\Component\\Finder\\SplFileInfo' === $parent; } +} +returnsByRef() ? '&' : '') . $node->name->toString() . '('; - $parameters = []; - foreach ($node->getParams() as $parameter) { - \assert(isset($parameter->var->name)); - $parameterAsString = ''; - if ($parameter->type !== null) { - $parameterAsString = $this->type($parameter->type) . ' '; - } - $parameterAsString .= '$' . $parameter->var->name; - /* @todo Handle default values */ - $parameters[] = $parameterAsString; - } - $signature .= implode(', ', $parameters) . ')'; - $returnType = $node->getReturnType(); - if ($returnType !== null) { - $signature .= ': ' . $this->type($returnType); - } - return $signature; + return $this->implementsAThrowableInterface($node) && $this->doesNotExtendAThrowableClass($node); } /** - * @psalm-param Identifier|Name|NullableType|UnionType $type + * @param ClassNode $node + * @return bool */ - private function type(Node $type) : string + private function implementsAThrowableInterface(ClassNode $node) { - \assert($type instanceof Identifier || $type instanceof Name || $type instanceof NullableType || $type instanceof UnionType); - if ($type instanceof NullableType) { - return '?' . $type->type; - } - if ($type instanceof UnionType) { - $types = []; - foreach ($type->types as $_type) { - $types[] = $_type->toString(); + foreach ($node->getInterfaces() as $type) { + if (\is_a($type, 'Throwable', \true)) { + return \true; } - return implode('|', $types); } - return $type->toString(); + return \false; } - private function visibility(ClassMethod $node) : string + /** + * @param ClassNode $node + * @return bool + */ + private function doesNotExtendAThrowableClass(ClassNode $node) { - if ($node->isPrivate()) { - return 'private'; - } - if ($node->isProtected()) { - return 'protected'; + return !\is_a($node->getParentClass(), 'Throwable', \true); + } + /** + * Applies patch to the specific class node. + * + * @param ClassNode $node + * + * @return void + */ + public function apply(ClassNode $node) + { + $this->checkItCanBeDoubled($node); + $this->setParentClassToException($node); + } + private function checkItCanBeDoubled(ClassNode $node) + { + $className = $node->getParentClass(); + if ($className !== 'stdClass') { + throw new ClassCreatorException(\sprintf('Cannot double concrete class %s as well as implement Traversable', $className), $node); } - return 'public'; } - private function processClass(Class_ $node) : void + private function setParentClassToException(ClassNode $node) { - $name = $node->name->toString(); - $namespacedName = $node->namespacedName->toString(); - $this->classes[$namespacedName] = ['name' => $name, 'namespacedName' => $namespacedName, 'namespace' => $this->namespace($namespacedName, $name), 'startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine(), 'methods' => []]; + $node->setParentClass('Exception'); + $node->removeMethod('getMessage'); + $node->removeMethod('getCode'); + $node->removeMethod('getFile'); + $node->removeMethod('getLine'); + $node->removeMethod('getTrace'); + $node->removeMethod('getPrevious'); + $node->removeMethod('getNext'); + $node->removeMethod('getTraceAsString'); } - private function processTrait(Trait_ $node) : void + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return int Priority number (higher - earlier) + */ + public function getPriority() { - $name = $node->name->toString(); - $namespacedName = $node->namespacedName->toString(); - $this->traits[$namespacedName] = ['name' => $name, 'namespacedName' => $namespacedName, 'namespace' => $this->namespace($namespacedName, $name), 'startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine(), 'methods' => []]; + return 100; } - private function processMethod(ClassMethod $node) : void +} + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Doubler\ClassPatch; + +use Prophecy\Doubler\Generator\Node\ClassNode; +use Prophecy\Doubler\Generator\Node\MethodNode; +use Prophecy\Doubler\Generator\Node\ReturnTypeNode; +/** + * Traversable interface patch. + * Forces classes that implement interfaces, that extend Traversable to also implement Iterator. + * + * @author Konstantin Kudryashov + */ +class TraversablePatch implements \Prophecy\Doubler\ClassPatch\ClassPatchInterface +{ + /** + * Supports nodetree, that implement Traversable, but not Iterator or IteratorAggregate. + * + * @param ClassNode $node + * + * @return bool + */ + public function supports(ClassNode $node) { - $parentNode = $node->getAttribute('parent'); - if ($parentNode instanceof Interface_) { - return; + if (\in_array('Iterator', $node->getInterfaces())) { + return \false; } - \assert($parentNode instanceof Class_ || $parentNode instanceof Trait_); - \assert(isset($parentNode->name)); - \assert(isset($parentNode->namespacedName)); - \assert($parentNode->namespacedName instanceof Name); - $parentName = $parentNode->name->toString(); - $parentNamespacedName = $parentNode->namespacedName->toString(); - if ($parentNode instanceof Class_) { - $storage =& $this->classes; - } else { - $storage =& $this->traits; + if (\in_array('IteratorAggregate', $node->getInterfaces())) { + return \false; } - if (!isset($storage[$parentNamespacedName])) { - $storage[$parentNamespacedName] = ['name' => $parentName, 'namespacedName' => $parentNamespacedName, 'namespace' => $this->namespace($parentNamespacedName, $parentName), 'startLine' => $parentNode->getStartLine(), 'endLine' => $parentNode->getEndLine(), 'methods' => []]; + foreach ($node->getInterfaces() as $interface) { + if ('Traversable' !== $interface && !\is_subclass_of($interface, 'Traversable')) { + continue; + } + if ('Iterator' === $interface || \is_subclass_of($interface, 'Iterator')) { + continue; + } + if ('IteratorAggregate' === $interface || \is_subclass_of($interface, 'IteratorAggregate')) { + continue; + } + return \true; } - $storage[$parentNamespacedName]['methods'][$node->name->toString()] = ['methodName' => $node->name->toString(), 'signature' => $this->signature($node), 'visibility' => $this->visibility($node), 'startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine(), 'ccn' => $this->cyclomaticComplexity($node)]; + return \false; } - private function processFunction(Function_ $node) : void + /** + * Forces class to implement Iterator interface. + * + * @param ClassNode $node + */ + public function apply(ClassNode $node) { - \assert(isset($node->name)); - \assert(isset($node->namespacedName)); - \assert($node->namespacedName instanceof Name); - $name = $node->name->toString(); - $namespacedName = $node->namespacedName->toString(); - $this->functions[$namespacedName] = ['name' => $name, 'namespacedName' => $namespacedName, 'namespace' => $this->namespace($namespacedName, $name), 'signature' => $this->signature($node), 'startLine' => $node->getStartLine(), 'endLine' => $node->getEndLine(), 'ccn' => $this->cyclomaticComplexity($node)]; + $node->addInterface('Iterator'); + $currentMethod = new MethodNode('current'); + \PHP_VERSION_ID >= 80100 && $currentMethod->setReturnTypeNode(new ReturnTypeNode('mixed')); + $node->addMethod($currentMethod); + $keyMethod = new MethodNode('key'); + \PHP_VERSION_ID >= 80100 && $keyMethod->setReturnTypeNode(new ReturnTypeNode('mixed')); + $node->addMethod($keyMethod); + $nextMethod = new MethodNode('next'); + \PHP_VERSION_ID >= 80100 && $nextMethod->setReturnTypeNode(new ReturnTypeNode('void')); + $node->addMethod($nextMethod); + $rewindMethod = new MethodNode('rewind'); + \PHP_VERSION_ID >= 80100 && $rewindMethod->setReturnTypeNode(new ReturnTypeNode('void')); + $node->addMethod($rewindMethod); + $validMethod = new MethodNode('valid'); + \PHP_VERSION_ID >= 80100 && $validMethod->setReturnTypeNode(new ReturnTypeNode('bool')); + $node->addMethod($validMethod); } - private function namespace(string $namespacedName, string $name) : string + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return int Priority number (higher - earlier) + */ + public function getPriority() { - return trim(rtrim($namespacedName, $name), '\\'); + return 100; } } + * Marcello Duarte * - * (c) Sebastian Bergmann + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Doubler; + +/** + * Core double interface. + * All doubled classes will implement this one. + * + * @author Konstantin Kudryashov + */ +interface DoubleInterface +{ +} + + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; +namespace Prophecy\Doubler; -use PHPUnit\PhpParser\Error; -use PHPUnit\PhpParser\Lexer; -use PHPUnit\PhpParser\NodeTraverser; -use PHPUnit\PhpParser\ParserFactory; +use PHPUnit\Doctrine\Instantiator\Instantiator; +use Prophecy\Doubler\ClassPatch\ClassPatchInterface; +use Prophecy\Doubler\Generator\ClassMirror; +use Prophecy\Doubler\Generator\ClassCreator; +use Prophecy\Exception\InvalidArgumentException; +use ReflectionClass; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Cached class doubler. + * Prevents mirroring/creation of the same structure twice. + * + * @author Konstantin Kudryashov */ -final class ParsingUncoveredFileAnalyser implements UncoveredFileAnalyser +class Doubler { - public function executableLinesIn(string $filename) : array + private $mirror; + private $creator; + private $namer; + /** + * @var ClassPatchInterface[] + */ + private $patches = array(); + /** + * @var \Doctrine\Instantiator\Instantiator + */ + private $instantiator; + /** + * Initializes doubler. + * + * @param ClassMirror $mirror + * @param ClassCreator $creator + * @param NameGenerator $namer + */ + public function __construct(ClassMirror $mirror = null, ClassCreator $creator = null, \Prophecy\Doubler\NameGenerator $namer = null) { - $parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7, new Lexer()); - try { - $nodes = $parser->parse(\file_get_contents($filename)); - \assert($nodes !== null); - $traverser = new NodeTraverser(); - $visitor = new ExecutableLinesFindingVisitor(); - $traverser->addVisitor($visitor); - /* @noinspection UnusedFunctionResultInspection */ - $traverser->traverse($nodes); - return $visitor->executableLines(); - // @codeCoverageIgnoreStart - } catch (Error $error) { + $this->mirror = $mirror ?: new ClassMirror(); + $this->creator = $creator ?: new ClassCreator(); + $this->namer = $namer ?: new \Prophecy\Doubler\NameGenerator(); + } + /** + * Returns list of registered class patches. + * + * @return ClassPatchInterface[] + */ + public function getClassPatches() + { + return $this->patches; + } + /** + * Registers new class patch. + * + * @param ClassPatchInterface $patch + */ + public function registerClassPatch(ClassPatchInterface $patch) + { + $this->patches[] = $patch; + @\usort($this->patches, function (ClassPatchInterface $patch1, ClassPatchInterface $patch2) { + return $patch2->getPriority() - $patch1->getPriority(); + }); + } + /** + * Creates double from specific class or/and list of interfaces. + * + * @param ReflectionClass $class + * @param ReflectionClass[] $interfaces Array of ReflectionClass instances + * @param array $args Constructor arguments + * + * @return DoubleInterface + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function double(ReflectionClass $class = null, array $interfaces, array $args = null) + { + foreach ($interfaces as $interface) { + if (!$interface instanceof ReflectionClass) { + throw new InvalidArgumentException(\sprintf("[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n" . "a second argument to `Doubler::double(...)`, but got %s.", \is_object($interface) ? \get_class($interface) . ' class' : \gettype($interface))); + } + } + $classname = $this->createDoubleClass($class, $interfaces); + $reflection = new ReflectionClass($classname); + if (null !== $args) { + return $reflection->newInstanceArgs($args); + } + if (null === ($constructor = $reflection->getConstructor()) || $constructor->isPublic() && !$constructor->isFinal()) { + return $reflection->newInstance(); + } + if (!$this->instantiator) { + $this->instantiator = new Instantiator(); + } + return $this->instantiator->instantiate($classname); + } + /** + * Creates double class and returns its FQN. + * + * @param ReflectionClass $class + * @param ReflectionClass[] $interfaces + * + * @return string + */ + protected function createDoubleClass(ReflectionClass $class = null, array $interfaces) + { + $name = $this->namer->name($class, $interfaces); + $node = $this->mirror->reflect($class, $interfaces); + foreach ($this->patches as $patch) { + if ($patch->supports($node)) { + $patch->apply($node); + } } - // @codeCoverageIgnoreEnd - return []; + $this->creator->create($name, $node); + return $name; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; +namespace Prophecy\Doubler\Generator; +use Prophecy\Doubler\Generator\Node\ReturnTypeNode; +use Prophecy\Doubler\Generator\Node\TypeNodeAbstract; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Class code creator. + * Generates PHP code for specific class node tree. + * + * @author Konstantin Kudryashov */ -final class CachingUncoveredFileAnalyser extends Cache implements UncoveredFileAnalyser +class ClassCodeGenerator { + public function __construct(\Prophecy\Doubler\Generator\TypeHintReference $typeHintReference = null) + { + } /** - * @var UncoveredFileAnalyser + * Generates PHP code for class node. + * + * @param string $classname + * @param Node\ClassNode $class + * + * @return string */ - private $uncoveredFileAnalyser; - public function __construct(string $directory, UncoveredFileAnalyser $uncoveredFileAnalyser) + public function generate($classname, \Prophecy\Doubler\Generator\Node\ClassNode $class) + { + $parts = \explode('\\', $classname); + $classname = \array_pop($parts); + $namespace = \implode('\\', $parts); + $code = \sprintf("class %s extends \\%s implements %s {\n", $classname, $class->getParentClass(), \implode(', ', \array_map(function ($interface) { + return '\\' . $interface; + }, $class->getInterfaces()))); + foreach ($class->getProperties() as $name => $visibility) { + $code .= \sprintf("%s \$%s;\n", $visibility, $name); + } + $code .= "\n"; + foreach ($class->getMethods() as $method) { + $code .= $this->generateMethod($method) . "\n"; + } + $code .= "\n}"; + return \sprintf("namespace %s {\n%s\n}", $namespace, $code); + } + private function generateMethod(\Prophecy\Doubler\Generator\Node\MethodNode $method) { - parent::__construct($directory); - $this->uncoveredFileAnalyser = $uncoveredFileAnalyser; + $php = \sprintf("%s %s function %s%s(%s)%s {\n", $method->getVisibility(), $method->isStatic() ? 'static' : '', $method->returnsReference() ? '&' : '', $method->getName(), \implode(', ', $this->generateArguments($method->getArguments())), ($ret = $this->generateTypes($method->getReturnTypeNode())) ? ': ' . $ret : ''); + $php .= $method->getCode() . "\n"; + return $php . '}'; } - public function executableLinesIn(string $filename) : array + private function generateTypes(TypeNodeAbstract $typeNode) : string { - if ($this->has($filename, __METHOD__)) { - return $this->read($filename, __METHOD__); + if (!$typeNode->getTypes()) { + return ''; } - $data = $this->uncoveredFileAnalyser->executableLinesIn($filename); - $this->write($filename, __METHOD__, $data); - return $data; + // When we require PHP 8 we can stop generating ?foo nullables and remove this first block + if ($typeNode->canUseNullShorthand()) { + return \sprintf('?%s', $typeNode->getNonNullTypes()[0]); + } else { + return \join('|', $typeNode->getTypes()); + } + } + private function generateArguments(array $arguments) + { + return \array_map(function (\Prophecy\Doubler\Generator\Node\ArgumentNode $argument) { + $php = $this->generateTypes($argument->getTypeNode()); + $php .= ' ' . ($argument->isPassedByReference() ? '&' : ''); + $php .= $argument->isVariadic() ? '...' : ''; + $php .= '$' . $argument->getName(); + if ($argument->isOptional() && !$argument->isVariadic()) { + $php .= ' = ' . \var_export($argument->getDefault(), \true); + } + return $php; + }, $arguments); } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; +namespace Prophecy\Doubler\Generator; -use PHPUnit\SebastianBergmann\LinesOfCode\LinesOfCode; +use Prophecy\Exception\Doubler\ClassCreatorException; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Class creator. + * Creates specific class in current environment. + * + * @author Konstantin Kudryashov */ -interface CoveredFileAnalyser +class ClassCreator { - public function classesIn(string $filename) : array; - public function traitsIn(string $filename) : array; - public function functionsIn(string $filename) : array; - public function linesOfCodeFor(string $filename) : LinesOfCode; - public function ignoredLinesFor(string $filename) : array; + private $generator; + /** + * Initializes creator. + * + * @param ClassCodeGenerator $generator + */ + public function __construct(\Prophecy\Doubler\Generator\ClassCodeGenerator $generator = null) + { + $this->generator = $generator ?: new \Prophecy\Doubler\Generator\ClassCodeGenerator(); + } + /** + * Creates class. + * + * @param string $classname + * @param Node\ClassNode $class + * + * @return mixed + * + * @throws \Prophecy\Exception\Doubler\ClassCreatorException + */ + public function create($classname, \Prophecy\Doubler\Generator\Node\ClassNode $class) + { + $code = $this->generator->generate($classname, $class); + $return = eval($code); + if (!\class_exists($classname, \false)) { + if (\count($class->getInterfaces())) { + throw new ClassCreatorException(\sprintf('Could not double `%s` and implement interfaces: [%s].', $class->getParentClass(), \implode(', ', $class->getInterfaces())), $class); + } + throw new ClassCreatorException(\sprintf('Could not double `%s`.', $class->getParentClass()), $class); + } + return $return; + } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; +namespace Prophecy\Doubler\Generator; -use function array_merge; -use function range; -use function strpos; -use PHPUnit\PhpParser\Node; -use PHPUnit\PhpParser\Node\Stmt\Class_; -use PHPUnit\PhpParser\Node\Stmt\ClassMethod; -use PHPUnit\PhpParser\Node\Stmt\Function_; -use PHPUnit\PhpParser\Node\Stmt\Interface_; -use PHPUnit\PhpParser\Node\Stmt\Trait_; -use PHPUnit\PhpParser\NodeTraverser; -use PHPUnit\PhpParser\NodeVisitorAbstract; +use Prophecy\Doubler\Generator\Node\ArgumentTypeNode; +use Prophecy\Doubler\Generator\Node\ReturnTypeNode; +use Prophecy\Exception\InvalidArgumentException; +use Prophecy\Exception\Doubler\ClassMirrorException; +use ReflectionClass; +use ReflectionIntersectionType; +use ReflectionMethod; +use ReflectionNamedType; +use ReflectionParameter; +use ReflectionType; +use ReflectionUnionType; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Class mirror. + * Core doubler class. Mirrors specific class and/or interfaces into class node tree. + * + * @author Konstantin Kudryashov */ -final class IgnoredLinesFindingVisitor extends NodeVisitorAbstract +class ClassMirror { + private static $reflectableMethods = array('__construct', '__destruct', '__sleep', '__wakeup', '__toString', '__call', '__invoke'); /** - * @psalm-var list - */ - private $ignoredLines = []; - /** - * @var bool - */ - private $useAnnotationsForIgnoringCode; - /** - * @var bool + * Reflects provided arguments into class node. + * + * @param ReflectionClass|null $class + * @param ReflectionClass[] $interfaces + * + * @return Node\ClassNode + * */ - private $ignoreDeprecated; - public function __construct(bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecated) + public function reflect(?ReflectionClass $class, array $interfaces) { - $this->useAnnotationsForIgnoringCode = $useAnnotationsForIgnoringCode; - $this->ignoreDeprecated = $ignoreDeprecated; + $node = new \Prophecy\Doubler\Generator\Node\ClassNode(); + if (null !== $class) { + if (\true === $class->isInterface()) { + throw new InvalidArgumentException(\sprintf("Could not reflect %s as a class, because it\n" . "is interface - use the second argument instead.", $class->getName())); + } + $this->reflectClassToNode($class, $node); + } + foreach ($interfaces as $interface) { + if (!$interface instanceof ReflectionClass) { + throw new InvalidArgumentException(\sprintf("[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n" . "a second argument to `ClassMirror::reflect(...)`, but got %s.", \is_object($interface) ? \get_class($interface) . ' class' : \gettype($interface))); + } + if (\false === $interface->isInterface()) { + throw new InvalidArgumentException(\sprintf("Could not reflect %s as an interface, because it\n" . "is class - use the first argument instead.", $interface->getName())); + } + $this->reflectInterfaceToNode($interface, $node); + } + $node->addInterface('Prophecy\\Doubler\\Generator\\ReflectionInterface'); + return $node; } - public function enterNode(Node $node) : ?int + private function reflectClassToNode(ReflectionClass $class, \Prophecy\Doubler\Generator\Node\ClassNode $node) { - if (!$node instanceof Class_ && !$node instanceof Trait_ && !$node instanceof Interface_ && !$node instanceof ClassMethod && !$node instanceof Function_) { - return null; + if (\true === $class->isFinal()) { + throw new ClassMirrorException(\sprintf('Could not reflect class %s as it is marked final.', $class->getName()), $class); } - if ($node instanceof Class_ && $node->isAnonymous()) { - return null; + $node->setParentClass($class->getName()); + foreach ($class->getMethods(ReflectionMethod::IS_ABSTRACT) as $method) { + if (\false === $method->isProtected()) { + continue; + } + $this->reflectMethodToNode($method, $node); } - // Workaround for https://bugs.xdebug.org/view.php?id=1798 - if ($node instanceof Class_ || $node instanceof Trait_ || $node instanceof Interface_) { - $this->ignoredLines[] = $node->getStartLine(); + foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { + if (0 === \strpos($method->getName(), '_') && !\in_array($method->getName(), self::$reflectableMethods)) { + continue; + } + if (\true === $method->isFinal()) { + $node->addUnextendableMethod($method->getName()); + continue; + } + $this->reflectMethodToNode($method, $node); } - if (!$this->useAnnotationsForIgnoringCode) { - return null; + } + private function reflectInterfaceToNode(ReflectionClass $interface, \Prophecy\Doubler\Generator\Node\ClassNode $node) + { + $node->addInterface($interface->getName()); + foreach ($interface->getMethods() as $method) { + $this->reflectMethodToNode($method, $node); } - if ($node instanceof Interface_) { - return null; + } + private function reflectMethodToNode(ReflectionMethod $method, \Prophecy\Doubler\Generator\Node\ClassNode $classNode) + { + $node = new \Prophecy\Doubler\Generator\Node\MethodNode($method->getName()); + if (\true === $method->isProtected()) { + $node->setVisibility('protected'); } - $docComment = $node->getDocComment(); - if ($docComment === null) { - return null; + if (\true === $method->isStatic()) { + $node->setStatic(); } - if (strpos($docComment->getText(), '@codeCoverageIgnore') !== \false) { - $this->ignoredLines = array_merge($this->ignoredLines, range($node->getStartLine(), $node->getEndLine())); + if (\true === $method->returnsReference()) { + $node->setReturnsReference(); } - if ($this->ignoreDeprecated && strpos($docComment->getText(), '@deprecated') !== \false) { - $this->ignoredLines = array_merge($this->ignoredLines, range($node->getStartLine(), $node->getEndLine())); + if ($method->hasReturnType()) { + $returnTypes = $this->getTypeHints($method->getReturnType(), $method->getDeclaringClass(), $method->getReturnType()->allowsNull()); + $node->setReturnTypeNode(new ReturnTypeNode(...$returnTypes)); + } elseif (\method_exists($method, 'hasTentativeReturnType') && $method->hasTentativeReturnType()) { + $returnTypes = $this->getTypeHints($method->getTentativeReturnType(), $method->getDeclaringClass(), $method->getTentativeReturnType()->allowsNull()); + $node->setReturnTypeNode(new ReturnTypeNode(...$returnTypes)); } - if ($node instanceof ClassMethod || $node instanceof Function_) { - return NodeTraverser::DONT_TRAVERSE_CHILDREN; + if (\is_array($params = $method->getParameters()) && \count($params)) { + foreach ($params as $param) { + $this->reflectArgumentToNode($param, $node); + } } - return null; + $classNode->addMethod($node); } - /** - * @psalm-return list - */ - public function ignoredLines() : array + private function reflectArgumentToNode(ReflectionParameter $parameter, \Prophecy\Doubler\Generator\Node\MethodNode $methodNode) { - return $this->ignoredLines; + $name = $parameter->getName() == '...' ? '__dot_dot_dot__' : $parameter->getName(); + $node = new \Prophecy\Doubler\Generator\Node\ArgumentNode($name); + $typeHints = $this->getTypeHints($parameter->getType(), $parameter->getDeclaringClass(), $parameter->allowsNull()); + $node->setTypeNode(new ArgumentTypeNode(...$typeHints)); + if ($parameter->isVariadic()) { + $node->setAsVariadic(); + } + if ($this->hasDefaultValue($parameter)) { + $node->setDefault($this->getDefaultValue($parameter)); + } + if ($parameter->isPassedByReference()) { + $node->setAsPassedByReference(); + } + $methodNode->addArgument($node); } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis; - -use PHPUnit\SebastianBergmann\CodeCoverage\Filter; -final class CacheWarmer -{ - public function warmCache(string $cacheDirectory, bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecatedCode, Filter $filter) : void + private function hasDefaultValue(ReflectionParameter $parameter) { - $coveredFileAnalyser = new CachingCoveredFileAnalyser($cacheDirectory, new ParsingCoveredFileAnalyser($useAnnotationsForIgnoringCode, $ignoreDeprecatedCode)); - $uncoveredFileAnalyser = new CachingUncoveredFileAnalyser($cacheDirectory, new ParsingUncoveredFileAnalyser()); - foreach ($filter->files() as $file) { - $coveredFileAnalyser->process($file); - /* @noinspection UnusedFunctionResultInspection */ - $uncoveredFileAnalyser->executableLinesIn($file); + if ($parameter->isVariadic()) { + return \false; + } + if ($parameter->isDefaultValueAvailable()) { + return \true; } + return $parameter->isOptional() || $parameter->allowsNull() && $parameter->getType() && \PHP_VERSION_ID < 80100; } -} - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; - -use function dirname; -use PHPUnit\SebastianBergmann\Version as VersionId; -final class Version -{ - /** - * @var string - */ - private static $version; - public static function id() : string + private function getDefaultValue(ReflectionParameter $parameter) { - if (self::$version === null) { - self::$version = (new VersionId('9.2.7', dirname(__DIR__)))->getVersion(); + if (!$parameter->isDefaultValueAvailable()) { + return null; } - return self::$version; + return $parameter->getDefaultValue(); + } + private function getTypeHints(?ReflectionType $type, ?ReflectionClass $class, bool $allowsNull) : array + { + $types = []; + if ($type instanceof ReflectionNamedType) { + $types = [$type->getName()]; + } elseif ($type instanceof ReflectionUnionType) { + $types = $type->getTypes(); + } elseif ($type instanceof ReflectionIntersectionType) { + throw new ClassMirrorException('Doubling intersection types is not supported', $class); + } elseif (\is_object($type)) { + throw new ClassMirrorException('Unknown reflection type ' . \get_class($type), $class); + } + $types = \array_map(function (string $type) use($class) { + if ($type === 'self') { + return $class->getName(); + } + if ($type === 'parent') { + return $class->getParentClass()->getName(); + } + return $type; + }, $types); + if ($types && $types != ['mixed'] && $allowsNull) { + $types[] = 'null'; + } + return $types; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; +namespace Prophecy\Doubler\Generator\Node; -use function array_diff; -use function array_diff_key; -use function array_flip; -use function array_keys; -use function array_merge; -use function array_unique; -use function array_values; -use function count; -use function explode; -use function get_class; -use function is_array; -use function is_file; -use function sort; -use PHPUnit\Framework\TestCase; -use PHPUnit\Runner\PhptTestCase; -use PHPUnit\Util\Test; -use ReflectionClass; -use PHPUnit\SebastianBergmann\CodeCoverage\Driver\Driver; -use PHPUnit\SebastianBergmann\CodeCoverage\Node\Builder; -use PHPUnit\SebastianBergmann\CodeCoverage\Node\Directory; -use PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis\CachingCoveredFileAnalyser; -use PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis\CachingUncoveredFileAnalyser; -use PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis\CoveredFileAnalyser; -use PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis\ParsingCoveredFileAnalyser; -use PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis\ParsingUncoveredFileAnalyser; -use PHPUnit\SebastianBergmann\CodeCoverage\StaticAnalysis\UncoveredFileAnalyser; -use PHPUnit\SebastianBergmann\CodeUnitReverseLookup\Wizard; /** - * Provides collection functionality for PHP code coverage information. + * Argument node. + * + * @author Konstantin Kudryashov */ -final class CodeCoverage +class ArgumentNode { - private const UNCOVERED_FILES = 'UNCOVERED_FILES'; - /** - * @var Driver - */ - private $driver; - /** - * @var Filter - */ - private $filter; - /** - * @var Wizard - */ - private $wizard; - /** - * @var bool - */ - private $checkForUnintentionallyCoveredCode = \false; - /** - * @var bool - */ - private $includeUncoveredFiles = \true; - /** - * @var bool - */ - private $processUncoveredFiles = \false; - /** - * @var bool - */ - private $ignoreDeprecatedCode = \false; - /** - * @var PhptTestCase|string|TestCase - */ - private $currentId; - /** - * Code coverage data. - * - * @var ProcessedCodeCoverageData - */ - private $data; - /** - * @var bool - */ - private $useAnnotationsForIgnoringCode = \true; + private $name; + private $default; + private $optional = \false; + private $byReference = \false; + private $isVariadic = \false; + /** @var ArgumentTypeNode */ + private $typeNode; /** - * Test data. - * - * @var array + * @param string $name */ - private $tests = []; + public function __construct($name) + { + $this->name = $name; + $this->typeNode = new \Prophecy\Doubler\Generator\Node\ArgumentTypeNode(); + } + public function getName() + { + return $this->name; + } + public function setTypeNode(\Prophecy\Doubler\Generator\Node\ArgumentTypeNode $typeNode) + { + $this->typeNode = $typeNode; + } + public function getTypeNode() : \Prophecy\Doubler\Generator\Node\ArgumentTypeNode + { + return $this->typeNode; + } + public function hasDefault() + { + return $this->isOptional() && !$this->isVariadic(); + } + public function getDefault() + { + return $this->default; + } + public function setDefault($default = null) + { + $this->optional = \true; + $this->default = $default; + } + public function isOptional() + { + return $this->optional; + } + public function setAsPassedByReference($byReference = \true) + { + $this->byReference = $byReference; + } + public function isPassedByReference() + { + return $this->byReference; + } + public function setAsVariadic($isVariadic = \true) + { + $this->isVariadic = $isVariadic; + } + public function isVariadic() + { + return $this->isVariadic; + } /** - * @psalm-var list + * @deprecated use getArgumentTypeNode instead + * @return string|null */ - private $parentClassesExcludedFromUnintentionallyCoveredCodeCheck = []; + public function getTypeHint() + { + $type = $this->typeNode->getNonNullTypes() ? $this->typeNode->getNonNullTypes()[0] : null; + return $type ? \ltrim($type, '\\') : null; + } /** - * @var ?CoveredFileAnalyser + * @deprecated use setArgumentTypeNode instead + * @param string|null $typeHint */ - private $coveredFileAnalyser; + public function setTypeHint($typeHint = null) + { + $this->typeNode = $typeHint === null ? new \Prophecy\Doubler\Generator\Node\ArgumentTypeNode() : new \Prophecy\Doubler\Generator\Node\ArgumentTypeNode($typeHint); + } /** - * @var ?UncoveredFileAnalyser + * @deprecated use getArgumentTypeNode instead + * @return bool */ - private $uncoveredFileAnalyser; + public function isNullable() + { + return $this->typeNode->canUseNullShorthand(); + } /** - * @var ?string + * @deprecated use getArgumentTypeNode instead + * @param bool $isNullable */ - private $cacheDirectory; - public function __construct(Driver $driver, Filter $filter) + public function setAsNullable($isNullable = \true) { - $this->driver = $driver; - $this->filter = $filter; - $this->data = new ProcessedCodeCoverageData(); - $this->wizard = new Wizard(); + $nonNullTypes = $this->typeNode->getNonNullTypes(); + $this->typeNode = $isNullable ? new \Prophecy\Doubler\Generator\Node\ArgumentTypeNode('null', ...$nonNullTypes) : new \Prophecy\Doubler\Generator\Node\ArgumentTypeNode(...$nonNullTypes); } +} + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Doubler\Generator\Node; + +use Prophecy\Exception\Doubler\MethodNotExtendableException; +use Prophecy\Exception\InvalidArgumentException; +/** + * Class node. + * + * @author Konstantin Kudryashov + */ +class ClassNode +{ + private $parentClass = 'stdClass'; + private $interfaces = array(); + private $properties = array(); + private $unextendableMethods = array(); /** - * Returns the code coverage information as a graph of node objects. + * @var MethodNode[] */ - public function getReport() : Directory + private $methods = array(); + public function getParentClass() { - return (new Builder($this->coveredFileAnalyser()))->build($this); + return $this->parentClass; } /** - * Clears collected code coverage data. + * @param string $class */ - public function clear() : void + public function setParentClass($class) { - $this->currentId = null; - $this->data = new ProcessedCodeCoverageData(); - $this->tests = []; + $this->parentClass = $class ?: 'stdClass'; } /** - * Returns the filter object used. + * @return string[] */ - public function filter() : Filter + public function getInterfaces() { - return $this->filter; + return $this->interfaces; } /** - * Returns the collected code coverage data. + * @param string $interface */ - public function getData(bool $raw = \false) : ProcessedCodeCoverageData + public function addInterface($interface) { - if (!$raw) { - if ($this->processUncoveredFiles) { - $this->processUncoveredFilesFromFilter(); - } elseif ($this->includeUncoveredFiles) { - $this->addUncoveredFilesFromFilter(); - } + if ($this->hasInterface($interface)) { + return; } - return $this->data; + \array_unshift($this->interfaces, $interface); } /** - * Sets the coverage data. + * @param string $interface + * + * @return bool */ - public function setData(ProcessedCodeCoverageData $data) : void + public function hasInterface($interface) { - $this->data = $data; + return \in_array($interface, $this->interfaces); + } + public function getProperties() + { + return $this->properties; + } + public function addProperty($name, $visibility = 'public') + { + $visibility = \strtolower($visibility); + if (!\in_array($visibility, array('public', 'private', 'protected'))) { + throw new InvalidArgumentException(\sprintf('`%s` property visibility is not supported.', $visibility)); + } + $this->properties[$name] = $visibility; } /** - * Returns the test data. + * @return MethodNode[] */ - public function getTests() : array + public function getMethods() { - return $this->tests; + return $this->methods; + } + public function addMethod(\Prophecy\Doubler\Generator\Node\MethodNode $method, $force = \false) + { + if (!$this->isExtendable($method->getName())) { + $message = \sprintf('Method `%s` is not extendable, so can not be added.', $method->getName()); + throw new MethodNotExtendableException($message, $this->getParentClass(), $method->getName()); + } + if ($force || !isset($this->methods[$method->getName()])) { + $this->methods[$method->getName()] = $method; + } + } + public function removeMethod($name) + { + unset($this->methods[$name]); } /** - * Sets the test data. + * @param string $name + * + * @return MethodNode|null */ - public function setTests(array $tests) : void + public function getMethod($name) { - $this->tests = $tests; + return $this->hasMethod($name) ? $this->methods[$name] : null; } /** - * Start collection of code coverage information. + * @param string $name * - * @param PhptTestCase|string|TestCase $id + * @return bool */ - public function start($id, bool $clear = \false) : void + public function hasMethod($name) { - if ($clear) { - $this->clear(); - } - $this->currentId = $id; - $this->driver->start(); + return isset($this->methods[$name]); } /** - * Stop collection of code coverage information. - * - * @param array|false $linesToBeCovered + * @return string[] */ - public function stop(bool $append = \true, $linesToBeCovered = [], array $linesToBeUsed = []) : RawCodeCoverageData + public function getUnextendableMethods() { - if (!is_array($linesToBeCovered) && $linesToBeCovered !== \false) { - throw new InvalidArgumentException('$linesToBeCovered must be an array or false'); - } - $data = $this->driver->stop(); - $this->append($data, null, $append, $linesToBeCovered, $linesToBeUsed); - $this->currentId = null; - return $data; + return $this->unextendableMethods; } /** - * Appends code coverage data. - * - * @param PhptTestCase|string|TestCase $id - * @param array|false $linesToBeCovered - * - * @throws ReflectionException - * @throws TestIdMissingException - * @throws UnintentionallyCoveredCodeException + * @param string $unextendableMethod */ - public function append(RawCodeCoverageData $rawData, $id = null, bool $append = \true, $linesToBeCovered = [], array $linesToBeUsed = []) : void + public function addUnextendableMethod($unextendableMethod) { - if ($id === null) { - $id = $this->currentId; - } - if ($id === null) { - throw new TestIdMissingException(); - } - $this->applyFilter($rawData); - if ($this->useAnnotationsForIgnoringCode) { - $this->applyIgnoredLinesFilter($rawData); - } - $this->data->initializeUnseenData($rawData); - if (!$append) { + if (!$this->isExtendable($unextendableMethod)) { return; } - if ($id !== self::UNCOVERED_FILES) { - $this->applyCoversAnnotationFilter($rawData, $linesToBeCovered, $linesToBeUsed); - if (empty($rawData->lineCoverage())) { - return; - } - $size = 'unknown'; - $status = -1; - $fromTestcase = \false; - if ($id instanceof TestCase) { - $fromTestcase = \true; - $_size = $id->getSize(); - if ($_size === Test::SMALL) { - $size = 'small'; - } elseif ($_size === Test::MEDIUM) { - $size = 'medium'; - } elseif ($_size === Test::LARGE) { - $size = 'large'; - } - $status = $id->getStatus(); - $id = get_class($id) . '::' . $id->getName(); - } elseif ($id instanceof PhptTestCase) { - $fromTestcase = \true; - $size = 'large'; - $id = $id->getName(); - } - $this->tests[$id] = ['size' => $size, 'status' => $status, 'fromTestcase' => $fromTestcase]; - $this->data->markCodeAsExecutedByTestCase($id, $rawData); - } + $this->unextendableMethods[] = $unextendableMethod; } /** - * Merges the data from another instance. + * @param string $method + * @return bool */ - public function merge(self $that) : void + public function isExtendable($method) { - $this->filter->includeFiles($that->filter()->files()); - $this->data->merge($that->data); - $this->tests = array_merge($this->tests, $that->getTests()); + return !\in_array($method, $this->unextendableMethods); } - public function enableCheckForUnintentionallyCoveredCode() : void +} + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Doubler\Generator\Node; + +use Prophecy\Doubler\Generator\TypeHintReference; +use Prophecy\Exception\InvalidArgumentException; +/** + * Method node. + * + * @author Konstantin Kudryashov + */ +class MethodNode +{ + private $name; + private $code; + private $visibility = 'public'; + private $static = \false; + private $returnsReference = \false; + /** @var ReturnTypeNode */ + private $returnTypeNode; + /** + * @var ArgumentNode[] + */ + private $arguments = array(); + /** + * @param string $name + * @param string $code + */ + public function __construct($name, $code = null, TypeHintReference $typeHintReference = null) { - $this->checkForUnintentionallyCoveredCode = \true; + $this->name = $name; + $this->code = $code; + $this->returnTypeNode = new \Prophecy\Doubler\Generator\Node\ReturnTypeNode(); } - public function disableCheckForUnintentionallyCoveredCode() : void + public function getVisibility() { - $this->checkForUnintentionallyCoveredCode = \false; + return $this->visibility; } - public function includeUncoveredFiles() : void + /** + * @param string $visibility + */ + public function setVisibility($visibility) { - $this->includeUncoveredFiles = \true; + $visibility = \strtolower($visibility); + if (!\in_array($visibility, array('public', 'private', 'protected'))) { + throw new InvalidArgumentException(\sprintf('`%s` method visibility is not supported.', $visibility)); + } + $this->visibility = $visibility; } - public function excludeUncoveredFiles() : void + public function isStatic() { - $this->includeUncoveredFiles = \false; + return $this->static; } - public function processUncoveredFiles() : void + public function setStatic($static = \true) { - $this->processUncoveredFiles = \true; + $this->static = (bool) $static; } - public function doNotProcessUncoveredFiles() : void + public function returnsReference() { - $this->processUncoveredFiles = \false; + return $this->returnsReference; } - public function enableAnnotationsForIgnoringCode() : void + public function setReturnsReference() { - $this->useAnnotationsForIgnoringCode = \true; + $this->returnsReference = \true; } - public function disableAnnotationsForIgnoringCode() : void + public function getName() { - $this->useAnnotationsForIgnoringCode = \false; + return $this->name; } - public function ignoreDeprecatedCode() : void + public function addArgument(\Prophecy\Doubler\Generator\Node\ArgumentNode $argument) { - $this->ignoreDeprecatedCode = \true; + $this->arguments[] = $argument; } - public function doNotIgnoreDeprecatedCode() : void + /** + * @return ArgumentNode[] + */ + public function getArguments() { - $this->ignoreDeprecatedCode = \false; + return $this->arguments; } /** - * @psalm-assert-if-true !null $this->cacheDirectory + * @deprecated use getReturnTypeNode instead + * @return bool */ - public function cachesStaticAnalysis() : bool + public function hasReturnType() { - return $this->cacheDirectory !== null; + return (bool) $this->returnTypeNode->getNonNullTypes(); } - public function cacheStaticAnalysis(string $directory) : void + public function setReturnTypeNode(\Prophecy\Doubler\Generator\Node\ReturnTypeNode $returnTypeNode) : void { - $this->cacheDirectory = $directory; + $this->returnTypeNode = $returnTypeNode; } - public function doNotCacheStaticAnalysis() : void + /** + * @deprecated use setReturnTypeNode instead + * @param string $type + */ + public function setReturnType($type = null) { - $this->cacheDirectory = null; + $this->returnTypeNode = $type === '' || $type === null ? new \Prophecy\Doubler\Generator\Node\ReturnTypeNode() : new \Prophecy\Doubler\Generator\Node\ReturnTypeNode($type); } /** - * @throws StaticAnalysisCacheNotConfiguredException + * @deprecated use setReturnTypeNode instead + * @param bool $bool */ - public function cacheDirectory() : string + public function setNullableReturnType($bool = \true) { - if (!$this->cachesStaticAnalysis()) { - throw new StaticAnalysisCacheNotConfiguredException('The static analysis cache is not configured'); + if ($bool) { + $this->returnTypeNode = new \Prophecy\Doubler\Generator\Node\ReturnTypeNode('null', ...$this->returnTypeNode->getTypes()); + } else { + $this->returnTypeNode = new \Prophecy\Doubler\Generator\Node\ReturnTypeNode(...$this->returnTypeNode->getNonNullTypes()); } - return $this->cacheDirectory; } /** - * @psalm-param class-string $className + * @deprecated use getReturnTypeNode instead + * @return string|null */ - public function excludeSubclassesOfThisClassFromUnintentionallyCoveredCodeCheck(string $className) : void + public function getReturnType() { - $this->parentClassesExcludedFromUnintentionallyCoveredCodeCheck[] = $className; + if ($types = $this->returnTypeNode->getNonNullTypes()) { + return $types[0]; + } + return null; } - public function enableBranchAndPathCoverage() : void + public function getReturnTypeNode() : \Prophecy\Doubler\Generator\Node\ReturnTypeNode { - $this->driver->enableBranchAndPathCoverage(); + return $this->returnTypeNode; } - public function disableBranchAndPathCoverage() : void + /** + * @deprecated use getReturnTypeNode instead + * @return bool + */ + public function hasNullableReturnType() { - $this->driver->disableBranchAndPathCoverage(); + return $this->returnTypeNode->canUseNullShorthand(); } - public function collectsBranchAndPathCoverage() : bool + /** + * @param string $code + */ + public function setCode($code) { - return $this->driver->collectsBranchAndPathCoverage(); + $this->code = $code; } - public function detectsDeadCode() : bool + public function getCode() { - return $this->driver->detectsDeadCode(); + if ($this->returnsReference) { + return "throw new \\Prophecy\\Exception\\Doubler\\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), '{$this->name}');"; + } + return (string) $this->code; } - /** - * Applies the @covers annotation filtering. - * - * @param array|false $linesToBeCovered - * - * @throws ReflectionException - * @throws UnintentionallyCoveredCodeException - */ - private function applyCoversAnnotationFilter(RawCodeCoverageData $rawData, $linesToBeCovered, array $linesToBeUsed) : void + public function useParentCode() { - if ($linesToBeCovered === \false) { - $rawData->clear(); - return; - } - if (empty($linesToBeCovered)) { - return; - } - if ($this->checkForUnintentionallyCoveredCode && (!$this->currentId instanceof TestCase || !$this->currentId->isMedium() && !$this->currentId->isLarge())) { - $this->performUnintentionallyCoveredCodeCheck($rawData, $linesToBeCovered, $linesToBeUsed); - } - $rawLineData = $rawData->lineCoverage(); - $filesWithNoCoverage = array_diff_key($rawLineData, $linesToBeCovered); - foreach (array_keys($filesWithNoCoverage) as $fileWithNoCoverage) { - $rawData->removeCoverageDataForFile($fileWithNoCoverage); - } - if (is_array($linesToBeCovered)) { - foreach ($linesToBeCovered as $fileToBeCovered => $includedLines) { - $rawData->keepCoverageDataOnlyForLines($fileToBeCovered, $includedLines); - } - } + $this->code = \sprintf('return parent::%s(%s);', $this->getName(), \implode(', ', \array_map(array($this, 'generateArgument'), $this->arguments))); } - private function applyFilter(RawCodeCoverageData $data) : void + private function generateArgument(\Prophecy\Doubler\Generator\Node\ArgumentNode $arg) { - if ($this->filter->isEmpty()) { - return; + $argument = '$' . $arg->getName(); + if ($arg->isVariadic()) { + $argument = '...' . $argument; } - foreach (array_keys($data->lineCoverage()) as $filename) { - if ($this->filter->isExcluded($filename)) { - $data->removeCoverageDataForFile($filename); - } + return $argument; + } +} +lineCoverage()) as $filename) { - if (!$this->filter->isFile($filename)) { - continue; - } - $data->removeCoverageDataForLines($filename, $this->coveredFileAnalyser()->ignoredLinesFor($filename)); + if (isset($this->types['void']) && \count($this->types) !== 1) { + throw new DoubleException('void cannot be part of a union'); + } + if (isset($this->types['never']) && \count($this->types) !== 1) { + throw new DoubleException('never cannot be part of a union'); } + parent::guardIsValidType(); } /** - * @throws UnintentionallyCoveredCodeException + * @deprecated use hasReturnStatement */ - private function addUncoveredFilesFromFilter() : void + public function isVoid() { - $uncoveredFiles = array_diff($this->filter->files(), $this->data->coveredFiles()); - foreach ($uncoveredFiles as $uncoveredFile) { - if (is_file($uncoveredFile)) { - $this->append(RawCodeCoverageData::fromUncoveredFile($uncoveredFile, $this->uncoveredFileAnalyser()), self::UNCOVERED_FILES); - } + return $this->types == ['void' => 'void']; + } + public function hasReturnStatement() : bool + { + return $this->types !== ['void' => 'void'] && $this->types !== ['never' => 'never']; + } +} +getRealType($type); + $this->types[$type] = $type; } + $this->guardIsValidType(); + } + public function canUseNullShorthand() : bool + { + return isset($this->types['null']) && \count($this->types) <= 2; + } + public function getTypes() : array + { + return \array_values($this->types); + } + public function getNonNullTypes() : array + { + $nonNullTypes = $this->types; + unset($nonNullTypes['null']); + return \array_values($nonNullTypes); } - /** - * @throws UnintentionallyCoveredCodeException - */ - private function processUncoveredFilesFromFilter() : void + protected function prefixWithNsSeparator(string $type) : string { - $uncoveredFiles = array_diff($this->filter->files(), $this->data->coveredFiles()); - $this->driver->start(); - foreach ($uncoveredFiles as $uncoveredFile) { - if (is_file($uncoveredFile)) { - include_once $uncoveredFile; - } - } - $this->append($this->driver->stop(), self::UNCOVERED_FILES); + return '\\' . \ltrim($type, '\\'); } - /** - * @throws ReflectionException - * @throws UnintentionallyCoveredCodeException - */ - private function performUnintentionallyCoveredCodeCheck(RawCodeCoverageData $data, array $linesToBeCovered, array $linesToBeUsed) : void + protected function getRealType(string $type) : string { - $allowedLines = $this->getAllowedLines($linesToBeCovered, $linesToBeUsed); - $unintentionallyCoveredUnits = []; - foreach ($data->lineCoverage() as $file => $_data) { - foreach ($_data as $line => $flag) { - if ($flag === 1 && !isset($allowedLines[$file][$line])) { - $unintentionallyCoveredUnits[] = $this->wizard->lookup($file, $line); - } - } - } - $unintentionallyCoveredUnits = $this->processUnintentionallyCoveredUnits($unintentionallyCoveredUnits); - if (!empty($unintentionallyCoveredUnits)) { - throw new UnintentionallyCoveredCodeException($unintentionallyCoveredUnits); + switch ($type) { + // type aliases + case 'double': + case 'real': + return 'float'; + case 'boolean': + return 'bool'; + case 'integer': + return 'int'; + // built in types + case 'self': + case 'static': + case 'array': + case 'callable': + case 'bool': + case 'false': + case 'float': + case 'int': + case 'string': + case 'iterable': + case 'object': + case 'null': + return $type; + case 'mixed': + return \PHP_VERSION_ID < 80000 ? $this->prefixWithNsSeparator($type) : $type; + default: + return $this->prefixWithNsSeparator($type); } } - private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed) : array + protected function guardIsValidType() { - $allowedLines = []; - foreach (array_keys($linesToBeCovered) as $file) { - if (!isset($allowedLines[$file])) { - $allowedLines[$file] = []; - } - $allowedLines[$file] = array_merge($allowedLines[$file], $linesToBeCovered[$file]); + if ($this->types == ['null' => 'null']) { + throw new DoubleException('Type cannot be standalone null'); } - foreach (array_keys($linesToBeUsed) as $file) { - if (!isset($allowedLines[$file])) { - $allowedLines[$file] = []; - } - $allowedLines[$file] = array_merge($allowedLines[$file], $linesToBeUsed[$file]); + if ($this->types == ['false' => 'false']) { + throw new DoubleException('Type cannot be standalone false'); } - foreach (array_keys($allowedLines) as $file) { - $allowedLines[$file] = array_flip(array_unique($allowedLines[$file])); + if ($this->types == ['false' => 'false', 'null' => 'null']) { + throw new DoubleException('Type cannot be nullable false'); } - return $allowedLines; - } - /** - * @throws ReflectionException - */ - private function processUnintentionallyCoveredUnits(array $unintentionallyCoveredUnits) : array - { - $unintentionallyCoveredUnits = array_unique($unintentionallyCoveredUnits); - sort($unintentionallyCoveredUnits); - foreach (array_keys($unintentionallyCoveredUnits) as $k => $v) { - $unit = explode('::', $unintentionallyCoveredUnits[$k]); - if (count($unit) !== 2) { - continue; - } - try { - $class = new ReflectionClass($unit[0]); - foreach ($this->parentClassesExcludedFromUnintentionallyCoveredCodeCheck as $parentClass) { - if ($class->isSubclassOf($parentClass)) { - unset($unintentionallyCoveredUnits[$k]); - break; - } - } - } catch (\ReflectionException $e) { - throw new ReflectionException($e->getMessage(), (int) $e->getCode(), $e); - } + if (\PHP_VERSION_ID >= 80000 && isset($this->types['mixed']) && \count($this->types) !== 1) { + throw new DoubleException('mixed cannot be part of a union'); } - return array_values($unintentionallyCoveredUnits); } - private function coveredFileAnalyser() : CoveredFileAnalyser +} + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Doubler\Generator; + +/** + * Reflection interface. + * All reflected classes implement this interface. + * + * @author Konstantin Kudryashov + */ +interface ReflectionInterface +{ +} +coveredFileAnalyser !== null) { - return $this->coveredFileAnalyser; - } - $this->coveredFileAnalyser = new ParsingCoveredFileAnalyser($this->useAnnotationsForIgnoringCode, $this->ignoreDeprecatedCode); - if ($this->cachesStaticAnalysis()) { - $this->coveredFileAnalyser = new CachingCoveredFileAnalyser($this->cacheDirectory, $this->coveredFileAnalyser); + switch ($type) { + case 'self': + case 'array': + case 'callable': + case 'bool': + case 'float': + case 'int': + case 'string': + case 'iterable': + case 'object': + return \true; + case 'mixed': + return \PHP_VERSION_ID >= 80000; + default: + return \false; } - return $this->coveredFileAnalyser; } - private function uncoveredFileAnalyser() : UncoveredFileAnalyser + public function isBuiltInReturnTypeHint($type) { - if ($this->uncoveredFileAnalyser !== null) { - return $this->uncoveredFileAnalyser; - } - $this->uncoveredFileAnalyser = new ParsingUncoveredFileAnalyser(); - if ($this->cachesStaticAnalysis()) { - $this->uncoveredFileAnalyser = new CachingUncoveredFileAnalyser($this->cacheDirectory, $this->uncoveredFileAnalyser); + if ($type === 'void') { + return \true; } - return $this->uncoveredFileAnalyser; + return $this->isBuiltInParamTypeHint($type); } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage; +namespace Prophecy\Doubler; -use function array_key_exists; -use function array_keys; -use function array_merge; -use function array_unique; -use function count; -use function is_array; -use function ksort; -use PHPUnit\SebastianBergmann\CodeCoverage\Driver\Driver; +use Prophecy\Exception\Doubler\DoubleException; +use Prophecy\Exception\Doubler\ClassNotFoundException; +use Prophecy\Exception\Doubler\InterfaceNotFoundException; +use ReflectionClass; /** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage + * Lazy double. + * Gives simple interface to describe double before creating it. + * + * @author Konstantin Kudryashov */ -final class ProcessedCodeCoverageData +class LazyDouble { + private $doubler; + private $class; + private $interfaces = array(); + private $arguments = null; + private $double; /** - * Line coverage data. - * An array of filenames, each having an array of linenumbers, each executable line having an array of testcase ids. + * Initializes lazy double. * - * @var array + * @param Doubler $doubler */ - private $lineCoverage = []; + public function __construct(\Prophecy\Doubler\Doubler $doubler) + { + $this->doubler = $doubler; + } /** - * Function coverage data. - * Maintains base format of raw data (@see https://xdebug.org/docs/code_coverage), but each 'hit' entry is an array - * of testcase ids. + * Tells doubler to use specific class as parent one for double. * - * @var array + * @param string|ReflectionClass $class + * + * @throws \Prophecy\Exception\Doubler\ClassNotFoundException + * @throws \Prophecy\Exception\Doubler\DoubleException */ - private $functionCoverage = []; - public function initializeUnseenData(RawCodeCoverageData $rawData) : void - { - foreach ($rawData->lineCoverage() as $file => $lines) { - if (!isset($this->lineCoverage[$file])) { - $this->lineCoverage[$file] = []; - foreach ($lines as $k => $v) { - $this->lineCoverage[$file][$k] = $v === Driver::LINE_NOT_EXECUTABLE ? null : []; - } - } - } - foreach ($rawData->functionCoverage() as $file => $functions) { - foreach ($functions as $functionName => $functionData) { - if (isset($this->functionCoverage[$file][$functionName])) { - $this->initPreviouslySeenFunction($file, $functionName, $functionData); - } else { - $this->initPreviouslyUnseenFunction($file, $functionName, $functionData); - } - } - } - } - public function markCodeAsExecutedByTestCase(string $testCaseId, RawCodeCoverageData $executedCode) : void - { - foreach ($executedCode->lineCoverage() as $file => $lines) { - foreach ($lines as $k => $v) { - if ($v === Driver::LINE_EXECUTED) { - $this->lineCoverage[$file][$k][] = $testCaseId; - } - } - } - foreach ($executedCode->functionCoverage() as $file => $functions) { - foreach ($functions as $functionName => $functionData) { - foreach ($functionData['branches'] as $branchId => $branchData) { - if ($branchData['hit'] === Driver::BRANCH_HIT) { - $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'][] = $testCaseId; - } - } - foreach ($functionData['paths'] as $pathId => $pathData) { - if ($pathData['hit'] === Driver::BRANCH_HIT) { - $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'][] = $testCaseId; - } - } - } - } - } - public function setLineCoverage(array $lineCoverage) : void - { - $this->lineCoverage = $lineCoverage; - } - public function lineCoverage() : array - { - ksort($this->lineCoverage); - return $this->lineCoverage; - } - public function setFunctionCoverage(array $functionCoverage) : void - { - $this->functionCoverage = $functionCoverage; - } - public function functionCoverage() : array - { - ksort($this->functionCoverage); - return $this->functionCoverage; - } - public function coveredFiles() : array - { - ksort($this->lineCoverage); - return array_keys($this->lineCoverage); - } - public function renameFile(string $oldFile, string $newFile) : void - { - $this->lineCoverage[$newFile] = $this->lineCoverage[$oldFile]; - if (isset($this->functionCoverage[$oldFile])) { - $this->functionCoverage[$newFile] = $this->functionCoverage[$oldFile]; - } - unset($this->lineCoverage[$oldFile], $this->functionCoverage[$oldFile]); - } - public function merge(self $newData) : void + public function setParentClass($class) { - foreach ($newData->lineCoverage as $file => $lines) { - if (!isset($this->lineCoverage[$file])) { - $this->lineCoverage[$file] = $lines; - continue; - } - // we should compare the lines if any of two contains data - $compareLineNumbers = array_unique(array_merge(array_keys($this->lineCoverage[$file]), array_keys($newData->lineCoverage[$file]))); - foreach ($compareLineNumbers as $line) { - $thatPriority = $this->priorityForLine($newData->lineCoverage[$file], $line); - $thisPriority = $this->priorityForLine($this->lineCoverage[$file], $line); - if ($thatPriority > $thisPriority) { - $this->lineCoverage[$file][$line] = $newData->lineCoverage[$file][$line]; - } elseif ($thatPriority === $thisPriority && is_array($this->lineCoverage[$file][$line])) { - $this->lineCoverage[$file][$line] = array_unique(array_merge($this->lineCoverage[$file][$line], $newData->lineCoverage[$file][$line])); - } - } + if (null !== $this->double) { + throw new DoubleException('Can not extend class with already instantiated double.'); } - foreach ($newData->functionCoverage as $file => $functions) { - if (!isset($this->functionCoverage[$file])) { - $this->functionCoverage[$file] = $functions; - continue; - } - foreach ($functions as $functionName => $functionData) { - if (isset($this->functionCoverage[$file][$functionName])) { - $this->initPreviouslySeenFunction($file, $functionName, $functionData); - } else { - $this->initPreviouslyUnseenFunction($file, $functionName, $functionData); - } - foreach ($functionData['branches'] as $branchId => $branchData) { - $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'] = array_unique(array_merge($this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'], $branchData['hit'])); - } - foreach ($functionData['paths'] as $pathId => $pathData) { - $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'] = array_unique(array_merge($this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'], $pathData['hit'])); - } + if (!$class instanceof ReflectionClass) { + if (!\class_exists($class)) { + throw new ClassNotFoundException(\sprintf('Class %s not found.', $class), $class); } + $class = new ReflectionClass($class); } + $this->class = $class; } /** - * Determine the priority for a line. + * Tells doubler to implement specific interface with double. * - * 1 = the line is not set - * 2 = the line has not been tested - * 3 = the line is dead code - * 4 = the line has been tested + * @param string|ReflectionClass $interface * - * During a merge, a higher number is better. + * @throws \Prophecy\Exception\Doubler\InterfaceNotFoundException + * @throws \Prophecy\Exception\Doubler\DoubleException */ - private function priorityForLine(array $data, int $line) : int + public function addInterface($interface) { - if (!array_key_exists($line, $data)) { - return 1; - } - if (is_array($data[$line]) && count($data[$line]) === 0) { - return 2; + if (null !== $this->double) { + throw new DoubleException('Can not implement interface with already instantiated double.'); } - if ($data[$line] === null) { - return 3; + if (!$interface instanceof ReflectionClass) { + if (!\interface_exists($interface)) { + throw new InterfaceNotFoundException(\sprintf('Interface %s not found.', $interface), $interface); + } + $interface = new ReflectionClass($interface); } - return 4; + $this->interfaces[] = $interface; } /** - * For a function we have never seen before, copy all data over and simply init the 'hit' array. + * Sets constructor arguments. + * + * @param array $arguments */ - private function initPreviouslyUnseenFunction(string $file, string $functionName, array $functionData) : void + public function setArguments(array $arguments = null) { - $this->functionCoverage[$file][$functionName] = $functionData; - foreach (array_keys($functionData['branches']) as $branchId) { - $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'] = []; - } - foreach (array_keys($functionData['paths']) as $pathId) { - $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'] = []; - } + $this->arguments = $arguments; } /** - * For a function we have seen before, only copy over and init the 'hit' array for any unseen branches and paths. - * Techniques such as mocking and where the contents of a file are different vary during tests (e.g. compiling - * containers) mean that the functions inside a file cannot be relied upon to be static. + * Creates double instance or returns already created one. + * + * @return DoubleInterface */ - private function initPreviouslySeenFunction(string $file, string $functionName, array $functionData) : void + public function getInstance() { - foreach ($functionData['branches'] as $branchId => $branchData) { - if (!isset($this->functionCoverage[$file][$functionName]['branches'][$branchId])) { - $this->functionCoverage[$file][$functionName]['branches'][$branchId] = $branchData; - $this->functionCoverage[$file][$functionName]['branches'][$branchId]['hit'] = []; - } - } - foreach ($functionData['paths'] as $pathId => $pathData) { - if (!isset($this->functionCoverage[$file][$functionName]['paths'][$pathId])) { - $this->functionCoverage[$file][$functionName]['paths'][$pathId] = $pathData; - $this->functionCoverage[$file][$functionName]['paths'][$pathId]['hit'] = []; + if (null === $this->double) { + if (null !== $this->arguments) { + return $this->double = $this->doubler->double($this->class, $this->interfaces, $this->arguments); } + $this->double = $this->doubler->double($this->class, $this->interfaces); } + return $this->double; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Report; +namespace Prophecy\Doubler; -use function date; -use function dirname; -use function file_put_contents; -use function htmlspecialchars; -use function is_string; -use function round; -use DOMDocument; -use PHPUnit\SebastianBergmann\CodeCoverage\CodeCoverage; -use PHPUnit\SebastianBergmann\CodeCoverage\Directory; -use PHPUnit\SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; -use PHPUnit\SebastianBergmann\CodeCoverage\Node\File; -final class Crap4j +use ReflectionClass; +/** + * Name generator. + * Generates classname for double. + * + * @author Konstantin Kudryashov + */ +class NameGenerator { + private static $counter = 1; /** - * @var int - */ - private $threshold; - public function __construct(int $threshold = 30) - { - $this->threshold = $threshold; - } - /** - * @throws WriteOperationFailedException - */ - public function process(CodeCoverage $coverage, ?string $target = null, ?string $name = null) : string - { - $document = new DOMDocument('1.0', 'UTF-8'); - $document->formatOutput = \true; - $root = $document->createElement('crap_result'); - $document->appendChild($root); - $project = $document->createElement('project', is_string($name) ? $name : ''); - $root->appendChild($project); - $root->appendChild($document->createElement('timestamp', date('Y-m-d H:i:s'))); - $stats = $document->createElement('stats'); - $methodsNode = $document->createElement('methods'); - $report = $coverage->getReport(); - unset($coverage); - $fullMethodCount = 0; - $fullCrapMethodCount = 0; - $fullCrapLoad = 0; - $fullCrap = 0; - foreach ($report as $item) { - $namespace = 'global'; - if (!$item instanceof File) { - continue; - } - $file = $document->createElement('file'); - $file->setAttribute('name', $item->pathAsString()); - $classes = $item->classesAndTraits(); - foreach ($classes as $className => $class) { - foreach ($class['methods'] as $methodName => $method) { - $crapLoad = $this->crapLoad((float) $method['crap'], $method['ccn'], $method['coverage']); - $fullCrap += $method['crap']; - $fullCrapLoad += $crapLoad; - $fullMethodCount++; - if ($method['crap'] >= $this->threshold) { - $fullCrapMethodCount++; - } - $methodNode = $document->createElement('method'); - if (!empty($class['namespace'])) { - $namespace = $class['namespace']; - } - $methodNode->appendChild($document->createElement('package', $namespace)); - $methodNode->appendChild($document->createElement('className', $className)); - $methodNode->appendChild($document->createElement('methodName', $methodName)); - $methodNode->appendChild($document->createElement('methodSignature', htmlspecialchars($method['signature']))); - $methodNode->appendChild($document->createElement('fullMethod', htmlspecialchars($method['signature']))); - $methodNode->appendChild($document->createElement('crap', (string) $this->roundValue((float) $method['crap']))); - $methodNode->appendChild($document->createElement('complexity', (string) $method['ccn'])); - $methodNode->appendChild($document->createElement('coverage', (string) $this->roundValue($method['coverage']))); - $methodNode->appendChild($document->createElement('crapLoad', (string) round($crapLoad))); - $methodsNode->appendChild($methodNode); - } - } - } - $stats->appendChild($document->createElement('name', 'Method Crap Stats')); - $stats->appendChild($document->createElement('methodCount', (string) $fullMethodCount)); - $stats->appendChild($document->createElement('crapMethodCount', (string) $fullCrapMethodCount)); - $stats->appendChild($document->createElement('crapLoad', (string) round($fullCrapLoad))); - $stats->appendChild($document->createElement('totalCrap', (string) $fullCrap)); - $crapMethodPercent = 0; - if ($fullMethodCount > 0) { - $crapMethodPercent = $this->roundValue(100 * $fullCrapMethodCount / $fullMethodCount); - } - $stats->appendChild($document->createElement('crapMethodPercent', (string) $crapMethodPercent)); - $root->appendChild($stats); - $root->appendChild($methodsNode); - $buffer = $document->saveXML(); - if ($target !== null) { - Directory::create(dirname($target)); - if (@file_put_contents($target, $buffer) === \false) { - throw new WriteOperationFailedException($target); + * Generates name. + * + * @param ReflectionClass $class + * @param ReflectionClass[] $interfaces + * + * @return string + */ + public function name(ReflectionClass $class = null, array $interfaces) + { + $parts = array(); + if (null !== $class) { + $parts[] = $class->getName(); + } else { + foreach ($interfaces as $interface) { + $parts[] = $interface->getShortName(); } } - return $buffer; - } - private function crapLoad(float $crapValue, int $cyclomaticComplexity, float $coveragePercent) : float - { - $crapLoad = 0; - if ($crapValue >= $this->threshold) { - $crapLoad += $cyclomaticComplexity * (1.0 - $coveragePercent / 100); - $crapLoad += $cyclomaticComplexity / $this->threshold; + if (!\count($parts)) { + $parts[] = 'stdClass'; } - return $crapLoad; - } - private function roundValue(float $value) : float - { - return round($value, 2); + return \sprintf('Double\\%s\\P%d', \implode('\\', $parts), self::$counter++); } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Report; +namespace Prophecy\Exception\Call; -use const PHP_EOL; -use function array_map; -use function date; -use function ksort; -use function max; -use function sprintf; -use function str_pad; -use function strlen; -use PHPUnit\SebastianBergmann\CodeCoverage\CodeCoverage; -use PHPUnit\SebastianBergmann\CodeCoverage\Node\File; -use PHPUnit\SebastianBergmann\CodeCoverage\Percentage; -final class Text +use Prophecy\Exception\Prophecy\ObjectProphecyException; +use Prophecy\Prophecy\ObjectProphecy; +class UnexpectedCallException extends ObjectProphecyException { - /** - * @var string - */ - private const COLOR_GREEN = "\33[30;42m"; - /** - * @var string - */ - private const COLOR_YELLOW = "\33[30;43m"; - /** - * @var string - */ - private const COLOR_RED = "\33[37;41m"; - /** - * @var string - */ - private const COLOR_HEADER = "\33[1;37;40m"; - /** - * @var string - */ - private const COLOR_RESET = "\33[0m"; - /** - * @var string - */ - private const COLOR_EOL = "\33[2K"; - /** - * @var int - */ - private $lowUpperBound; - /** - * @var int - */ - private $highLowerBound; - /** - * @var bool - */ - private $showUncoveredFiles; - /** - * @var bool - */ - private $showOnlySummary; - public function __construct(int $lowUpperBound = 50, int $highLowerBound = 90, bool $showUncoveredFiles = \false, bool $showOnlySummary = \false) + private $methodName; + private $arguments; + public function __construct($message, ObjectProphecy $objectProphecy, $methodName, array $arguments) { - $this->lowUpperBound = $lowUpperBound; - $this->highLowerBound = $highLowerBound; - $this->showUncoveredFiles = $showUncoveredFiles; - $this->showOnlySummary = $showOnlySummary; + parent::__construct($message, $objectProphecy); + $this->methodName = $methodName; + $this->arguments = $arguments; } - public function process(CodeCoverage $coverage, bool $showColors = \false) : string + public function getMethodName() { - $hasBranchCoverage = !empty($coverage->getData(\true)->functionCoverage()); - $output = \PHP_EOL . \PHP_EOL; - $report = $coverage->getReport(); - $colors = ['header' => '', 'classes' => '', 'methods' => '', 'lines' => '', 'branches' => '', 'paths' => '', 'reset' => '', 'eol' => '']; - if ($showColors) { - $colors['classes'] = $this->coverageColor($report->numberOfTestedClassesAndTraits(), $report->numberOfClassesAndTraits()); - $colors['methods'] = $this->coverageColor($report->numberOfTestedMethods(), $report->numberOfMethods()); - $colors['lines'] = $this->coverageColor($report->numberOfExecutedLines(), $report->numberOfExecutableLines()); - $colors['branches'] = $this->coverageColor($report->numberOfExecutedBranches(), $report->numberOfExecutableBranches()); - $colors['paths'] = $this->coverageColor($report->numberOfExecutedPaths(), $report->numberOfExecutablePaths()); - $colors['reset'] = self::COLOR_RESET; - $colors['header'] = self::COLOR_HEADER; - $colors['eol'] = self::COLOR_EOL; - } - $classes = sprintf(' Classes: %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfTestedClassesAndTraits(), $report->numberOfClassesAndTraits())->asString(), $report->numberOfTestedClassesAndTraits(), $report->numberOfClassesAndTraits()); - $methods = sprintf(' Methods: %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfTestedMethods(), $report->numberOfMethods())->asString(), $report->numberOfTestedMethods(), $report->numberOfMethods()); - $paths = ''; - $branches = ''; - if ($hasBranchCoverage) { - $paths = sprintf(' Paths: %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfExecutedPaths(), $report->numberOfExecutablePaths())->asString(), $report->numberOfExecutedPaths(), $report->numberOfExecutablePaths()); - $branches = sprintf(' Branches: %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfExecutedBranches(), $report->numberOfExecutableBranches())->asString(), $report->numberOfExecutedBranches(), $report->numberOfExecutableBranches()); - } - $lines = sprintf(' Lines: %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfExecutedLines(), $report->numberOfExecutableLines())->asString(), $report->numberOfExecutedLines(), $report->numberOfExecutableLines()); - $padding = max(array_map('strlen', [$classes, $methods, $lines])); - if ($this->showOnlySummary) { - $title = 'Code Coverage Report Summary:'; - $padding = max($padding, strlen($title)); - $output .= $this->format($colors['header'], $padding, $title); - } else { - $date = date(' Y-m-d H:i:s'); - $title = 'Code Coverage Report:'; - $output .= $this->format($colors['header'], $padding, $title); - $output .= $this->format($colors['header'], $padding, $date); - $output .= $this->format($colors['header'], $padding, ''); - $output .= $this->format($colors['header'], $padding, ' Summary:'); - } - $output .= $this->format($colors['classes'], $padding, $classes); - $output .= $this->format($colors['methods'], $padding, $methods); - if ($hasBranchCoverage) { - $output .= $this->format($colors['paths'], $padding, $paths); - $output .= $this->format($colors['branches'], $padding, $branches); - } - $output .= $this->format($colors['lines'], $padding, $lines); - if ($this->showOnlySummary) { - return $output . \PHP_EOL; - } - $classCoverage = []; - foreach ($report as $item) { - if (!$item instanceof File) { - continue; - } - $classes = $item->classesAndTraits(); - foreach ($classes as $className => $class) { - $classExecutableLines = 0; - $classExecutedLines = 0; - $classExecutableBranches = 0; - $classExecutedBranches = 0; - $classExecutablePaths = 0; - $classExecutedPaths = 0; - $coveredMethods = 0; - $classMethods = 0; - foreach ($class['methods'] as $method) { - if ($method['executableLines'] == 0) { - continue; - } - $classMethods++; - $classExecutableLines += $method['executableLines']; - $classExecutedLines += $method['executedLines']; - $classExecutableBranches += $method['executableBranches']; - $classExecutedBranches += $method['executedBranches']; - $classExecutablePaths += $method['executablePaths']; - $classExecutedPaths += $method['executedPaths']; - if ($method['coverage'] == 100) { - $coveredMethods++; - } - } - $classCoverage[$className] = ['namespace' => $class['namespace'], 'className' => $className, 'methodsCovered' => $coveredMethods, 'methodCount' => $classMethods, 'statementsCovered' => $classExecutedLines, 'statementCount' => $classExecutableLines, 'branchesCovered' => $classExecutedBranches, 'branchesCount' => $classExecutableBranches, 'pathsCovered' => $classExecutedPaths, 'pathsCount' => $classExecutablePaths]; - } - } - ksort($classCoverage); - $methodColor = ''; - $pathsColor = ''; - $branchesColor = ''; - $linesColor = ''; - $resetColor = ''; - foreach ($classCoverage as $fullQualifiedPath => $classInfo) { - if ($this->showUncoveredFiles || $classInfo['statementsCovered'] != 0) { - if ($showColors) { - $methodColor = $this->coverageColor($classInfo['methodsCovered'], $classInfo['methodCount']); - $pathsColor = $this->coverageColor($classInfo['pathsCovered'], $classInfo['pathsCount']); - $branchesColor = $this->coverageColor($classInfo['branchesCovered'], $classInfo['branchesCount']); - $linesColor = $this->coverageColor($classInfo['statementsCovered'], $classInfo['statementCount']); - $resetColor = $colors['reset']; - } - $output .= \PHP_EOL . $fullQualifiedPath . \PHP_EOL . ' ' . $methodColor . 'Methods: ' . $this->printCoverageCounts($classInfo['methodsCovered'], $classInfo['methodCount'], 2) . $resetColor . ' '; - if ($hasBranchCoverage) { - $output .= ' ' . $pathsColor . 'Paths: ' . $this->printCoverageCounts($classInfo['pathsCovered'], $classInfo['pathsCount'], 3) . $resetColor . ' ' . ' ' . $branchesColor . 'Branches: ' . $this->printCoverageCounts($classInfo['branchesCovered'], $classInfo['branchesCount'], 3) . $resetColor . ' '; - } - $output .= ' ' . $linesColor . 'Lines: ' . $this->printCoverageCounts($classInfo['statementsCovered'], $classInfo['statementCount'], 3) . $resetColor; - } - } - return $output . \PHP_EOL; + return $this->methodName; } - private function coverageColor(int $numberOfCoveredElements, int $totalNumberOfElements) : string + public function getArguments() { - $coverage = Percentage::fromFractionAndTotal($numberOfCoveredElements, $totalNumberOfElements); - if ($coverage->asFloat() >= $this->highLowerBound) { - return self::COLOR_GREEN; - } - if ($coverage->asFloat() > $this->lowUpperBound) { - return self::COLOR_YELLOW; - } - return self::COLOR_RED; + return $this->arguments; } - private function printCoverageCounts(int $numberOfCoveredElements, int $totalNumberOfElements, int $precision) : string +} + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Exception\Doubler; + +use Prophecy\Doubler\Generator\Node\ClassNode; +class ClassCreatorException extends \RuntimeException implements \Prophecy\Exception\Doubler\DoublerException +{ + private $node; + public function __construct($message, ClassNode $node) { - $format = '%' . $precision . 's'; - return Percentage::fromFractionAndTotal($numberOfCoveredElements, $totalNumberOfElements)->asFixedWidthString() . ' (' . sprintf($format, $numberOfCoveredElements) . '/' . sprintf($format, $totalNumberOfElements) . ')'; + parent::__construct($message); + $this->node = $node; } - /** - * @param false|string $string - */ - private function format(string $color, int $padding, $string) : string + public function getClassNode() { - $reset = $color ? self::COLOR_RESET : ''; - return $color . str_pad((string) $string, $padding) . $reset . \PHP_EOL; + return $this->node; } } + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Html; +namespace Prophecy\Exception\Doubler; -use const DIRECTORY_SEPARATOR; -use function copy; -use function date; -use function dirname; -use function substr; -use PHPUnit\SebastianBergmann\CodeCoverage\CodeCoverage; -use PHPUnit\SebastianBergmann\CodeCoverage\Directory as DirectoryUtil; -use PHPUnit\SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; -final class Facade +use ReflectionClass; +class ClassMirrorException extends \RuntimeException implements \Prophecy\Exception\Doubler\DoublerException { - /** - * @var string - */ - private $templatePath; - /** - * @var string - */ - private $generator; - /** - * @var int - */ - private $lowUpperBound; - /** - * @var int - */ - private $highLowerBound; - public function __construct(int $lowUpperBound = 50, int $highLowerBound = 90, string $generator = '') + private $class; + public function __construct($message, ReflectionClass $class) { - $this->generator = $generator; - $this->highLowerBound = $highLowerBound; - $this->lowUpperBound = $lowUpperBound; - $this->templatePath = __DIR__ . '/Renderer/Template/'; + parent::__construct($message); + $this->class = $class; } - public function process(CodeCoverage $coverage, string $target) : void + public function getReflectedClass() { - $target = $this->directory($target); - $report = $coverage->getReport(); - $date = date('D M j G:i:s T Y'); - $dashboard = new Dashboard($this->templatePath, $this->generator, $date, $this->lowUpperBound, $this->highLowerBound, $coverage->collectsBranchAndPathCoverage()); - $directory = new Directory($this->templatePath, $this->generator, $date, $this->lowUpperBound, $this->highLowerBound, $coverage->collectsBranchAndPathCoverage()); - $file = new File($this->templatePath, $this->generator, $date, $this->lowUpperBound, $this->highLowerBound, $coverage->collectsBranchAndPathCoverage()); - $directory->render($report, $target . 'index.html'); - $dashboard->render($report, $target . 'dashboard.html'); - foreach ($report as $node) { - $id = $node->id(); - if ($node instanceof DirectoryNode) { - DirectoryUtil::create($target . $id); - $directory->render($node, $target . $id . '/index.html'); - $dashboard->render($node, $target . $id . '/dashboard.html'); - } else { - $dir = dirname($target . $id); - DirectoryUtil::create($dir); - $file->render($node, $target . $id); - } - } - $this->copyFiles($target); + return $this->class; } - private function copyFiles(string $target) : void +} + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Exception\Doubler; + +class ClassNotFoundException extends \Prophecy\Exception\Doubler\DoubleException +{ + private $classname; + /** + * @param string $message + * @param string $classname + */ + public function __construct($message, $classname) { - $dir = $this->directory($target . '_css'); - copy($this->templatePath . 'css/bootstrap.min.css', $dir . 'bootstrap.min.css'); - copy($this->templatePath . 'css/nv.d3.min.css', $dir . 'nv.d3.min.css'); - copy($this->templatePath . 'css/style.css', $dir . 'style.css'); - copy($this->templatePath . 'css/custom.css', $dir . 'custom.css'); - copy($this->templatePath . 'css/octicons.css', $dir . 'octicons.css'); - $dir = $this->directory($target . '_icons'); - copy($this->templatePath . 'icons/file-code.svg', $dir . 'file-code.svg'); - copy($this->templatePath . 'icons/file-directory.svg', $dir . 'file-directory.svg'); - $dir = $this->directory($target . '_js'); - copy($this->templatePath . 'js/bootstrap.min.js', $dir . 'bootstrap.min.js'); - copy($this->templatePath . 'js/popper.min.js', $dir . 'popper.min.js'); - copy($this->templatePath . 'js/d3.min.js', $dir . 'd3.min.js'); - copy($this->templatePath . 'js/jquery.min.js', $dir . 'jquery.min.js'); - copy($this->templatePath . 'js/nv.d3.min.js', $dir . 'nv.d3.min.js'); - copy($this->templatePath . 'js/file.js', $dir . 'file.js'); + parent::__construct($message); + $this->classname = $classname; } - private function directory(string $directory) : string + public function getClassname() { - if (substr($directory, -1, 1) != \DIRECTORY_SEPARATOR) { - $directory .= \DIRECTORY_SEPARATOR; - } - DirectoryUtil::create($directory); - return $directory; + return $this->classname; } } + * Marcello Duarte * - * (c) Sebastian Bergmann + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Exception\Doubler; + +use RuntimeException; +class DoubleException extends RuntimeException implements \Prophecy\Exception\Doubler\DoublerException +{ +} + + * Marcello Duarte * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Html; +namespace Prophecy\Exception\Doubler; -use function array_pop; -use function count; -use function sprintf; -use function str_repeat; -use function substr_count; -use PHPUnit\SebastianBergmann\CodeCoverage\Node\AbstractNode; -use PHPUnit\SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; -use PHPUnit\SebastianBergmann\CodeCoverage\Node\File as FileNode; -use PHPUnit\SebastianBergmann\CodeCoverage\Version; -use PHPUnit\SebastianBergmann\Environment\Runtime; -use PHPUnit\SebastianBergmann\Template\Template; -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage +use Prophecy\Exception\Exception; +interface DoublerException extends Exception +{ +} + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. */ -abstract class Renderer +namespace Prophecy\Exception\Doubler; + +class InterfaceNotFoundException extends \Prophecy\Exception\Doubler\ClassNotFoundException { + public function getInterfaceName() + { + return $this->getClassname(); + } +} +templatePath = $templatePath; - $this->generator = $generator; - $this->date = $date; - $this->lowUpperBound = $lowUpperBound; - $this->highLowerBound = $highLowerBound; - $this->version = Version::id(); - $this->hasBranchCoverage = $hasBranchCoverage; + parent::__construct($message); + $this->methodName = $methodName; + $this->className = $className; } - protected function renderItemTemplate(Template $template, array $data) : string + /** + * @return string + */ + public function getMethodName() { - $numSeparator = ' / '; - if (isset($data['numClasses']) && $data['numClasses'] > 0) { - $classesLevel = $this->colorLevel($data['testedClassesPercent']); - $classesNumber = $data['numTestedClasses'] . $numSeparator . $data['numClasses']; - $classesBar = $this->coverageBar($data['testedClassesPercent']); - } else { - $classesLevel = ''; - $classesNumber = '0' . $numSeparator . '0'; - $classesBar = ''; - $data['testedClassesPercentAsString'] = 'n/a'; - } - if ($data['numMethods'] > 0) { - $methodsLevel = $this->colorLevel($data['testedMethodsPercent']); - $methodsNumber = $data['numTestedMethods'] . $numSeparator . $data['numMethods']; - $methodsBar = $this->coverageBar($data['testedMethodsPercent']); - } else { - $methodsLevel = ''; - $methodsNumber = '0' . $numSeparator . '0'; - $methodsBar = ''; - $data['testedMethodsPercentAsString'] = 'n/a'; - } - if ($data['numExecutableLines'] > 0) { - $linesLevel = $this->colorLevel($data['linesExecutedPercent']); - $linesNumber = $data['numExecutedLines'] . $numSeparator . $data['numExecutableLines']; - $linesBar = $this->coverageBar($data['linesExecutedPercent']); - } else { - $linesLevel = ''; - $linesNumber = '0' . $numSeparator . '0'; - $linesBar = ''; - $data['linesExecutedPercentAsString'] = 'n/a'; - } - if ($data['numExecutablePaths'] > 0) { - $pathsLevel = $this->colorLevel($data['pathsExecutedPercent']); - $pathsNumber = $data['numExecutedPaths'] . $numSeparator . $data['numExecutablePaths']; - $pathsBar = $this->coverageBar($data['pathsExecutedPercent']); - } else { - $pathsLevel = ''; - $pathsNumber = '0' . $numSeparator . '0'; - $pathsBar = ''; - $data['pathsExecutedPercentAsString'] = 'n/a'; - } - if ($data['numExecutableBranches'] > 0) { - $branchesLevel = $this->colorLevel($data['branchesExecutedPercent']); - $branchesNumber = $data['numExecutedBranches'] . $numSeparator . $data['numExecutableBranches']; - $branchesBar = $this->coverageBar($data['branchesExecutedPercent']); - } else { - $branchesLevel = ''; - $branchesNumber = '0' . $numSeparator . '0'; - $branchesBar = ''; - $data['branchesExecutedPercentAsString'] = 'n/a'; - } - $template->setVar(['icon' => $data['icon'] ?? '', 'crap' => $data['crap'] ?? '', 'name' => $data['name'], 'lines_bar' => $linesBar, 'lines_executed_percent' => $data['linesExecutedPercentAsString'], 'lines_level' => $linesLevel, 'lines_number' => $linesNumber, 'paths_bar' => $pathsBar, 'paths_executed_percent' => $data['pathsExecutedPercentAsString'], 'paths_level' => $pathsLevel, 'paths_number' => $pathsNumber, 'branches_bar' => $branchesBar, 'branches_executed_percent' => $data['branchesExecutedPercentAsString'], 'branches_level' => $branchesLevel, 'branches_number' => $branchesNumber, 'methods_bar' => $methodsBar, 'methods_tested_percent' => $data['testedMethodsPercentAsString'], 'methods_level' => $methodsLevel, 'methods_number' => $methodsNumber, 'classes_bar' => $classesBar, 'classes_tested_percent' => $data['testedClassesPercentAsString'] ?? '', 'classes_level' => $classesLevel, 'classes_number' => $classesNumber]); - return $template->render(); + return $this->methodName; } - protected function setCommonTemplateVariables(Template $template, AbstractNode $node) : void + /** + * @return string + */ + public function getClassName() { - $template->setVar(['id' => $node->id(), 'full_path' => $node->pathAsString(), 'path_to_root' => $this->pathToRoot($node), 'breadcrumbs' => $this->breadcrumbs($node), 'date' => $this->date, 'version' => $this->version, 'runtime' => $this->runtimeString(), 'generator' => $this->generator, 'low_upper_bound' => $this->lowUpperBound, 'high_lower_bound' => $this->highLowerBound]); + return $this->className; } - protected function breadcrumbs(AbstractNode $node) : string +} + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Exception\Doubler; + +class MethodNotFoundException extends \Prophecy\Exception\Doubler\DoubleException +{ + /** + * @var string|object + */ + private $classname; + /** + * @var string + */ + private $methodName; + /** + * @var array + */ + private $arguments; + /** + * @param string $message + * @param string|object $classname + * @param string $methodName + * @param null|Argument\ArgumentsWildcard|array $arguments + */ + public function __construct($message, $classname, $methodName, $arguments = null) { - $breadcrumbs = ''; - $path = $node->pathAsArray(); - $pathToRoot = []; - $max = count($path); - if ($node instanceof FileNode) { - $max--; - } - for ($i = 0; $i < $max; $i++) { - $pathToRoot[] = str_repeat('../', $i); - } - foreach ($path as $step) { - if ($step !== $node) { - $breadcrumbs .= $this->inactiveBreadcrumb($step, array_pop($pathToRoot)); - } else { - $breadcrumbs .= $this->activeBreadcrumb($step); - } - } - return $breadcrumbs; + parent::__construct($message); + $this->classname = $classname; + $this->methodName = $methodName; + $this->arguments = $arguments; } - protected function activeBreadcrumb(AbstractNode $node) : string + public function getClassname() { - $buffer = sprintf(' ' . "\n", $node->name()); - if ($node instanceof DirectoryNode) { - $buffer .= ' ' . "\n"; - } - return $buffer; + return $this->classname; } - protected function inactiveBreadcrumb(AbstractNode $node, string $pathToRoot) : string + public function getMethodName() { - return sprintf(' ' . "\n", $pathToRoot, $node->name()); + return $this->methodName; } - protected function pathToRoot(AbstractNode $node) : string + public function getArguments() { - $id = $node->id(); - $depth = substr_count($id, '/'); - if ($id !== 'index' && $node instanceof DirectoryNode) { - $depth++; - } - return str_repeat('../', $depth); + return $this->arguments; } - protected function coverageBar(float $percent) : string +} + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Exception\Doubler; + +class ReturnByReferenceException extends \Prophecy\Exception\Doubler\DoubleException +{ + private $classname; + private $methodName; + /** + * @param string $message + * @param string $classname + * @param string $methodName + */ + public function __construct($message, $classname, $methodName) { - $level = $this->colorLevel($percent); - $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'coverage_bar_branch.html' : 'coverage_bar.html'); - $template = new Template($templateName, '{{', '}}'); - $template->setVar(['level' => $level, 'percent' => sprintf('%.2F', $percent)]); - return $template->render(); + parent::__construct($message); + $this->classname = $classname; + $this->methodName = $methodName; } - protected function colorLevel(float $percent) : string + public function getClassname() { - if ($percent <= $this->lowUpperBound) { - return 'danger'; - } - if ($percent > $this->lowUpperBound && $percent < $this->highLowerBound) { - return 'warning'; - } - return 'success'; + return $this->classname; } - private function runtimeString() : string + public function getMethodName() { - $runtime = new Runtime(); - return sprintf('%s %s', $runtime->getVendorUrl(), $runtime->getName(), $runtime->getVersion()); + return $this->methodName; } } - - - - - Code Coverage for {{full_path}} - - - - - - - -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      - - - - - - - - - - - - - - -{{items}} - -
       
      Code Coverage
       
      Classes and Traits
      Functions and Methods
      Lines
      -
      -{{lines}} -{{structure}} - -
      - - - - - - -
      -
      - {{percent}}% covered ({{level}}) -
      -
      - - - - - Dashboard for {{full_path}} - - - - - - - -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      -
      -

      Classes

      -
      -
      -
      -
      -

      Coverage Distribution

      -
      - -
      -
      -
      -

      Complexity

      -
      - -
      -
      -
      -
      -
      -

      Insufficient Coverage

      -
      - - - - - - - - -{{insufficient_coverage_classes}} - -
      ClassCoverage
      -
      -
      -
      -

      Project Risks

      -
      - - - - - - - - -{{project_risks_classes}} - -
      ClassCRAP
      -
      -
      -
      -
      -
      -

      Methods

      -
      -
      -
      -
      -

      Coverage Distribution

      -
      - -
      -
      -
      -

      Complexity

      -
      - -
      -
      -
      -
      -
      -

      Insufficient Coverage

      -
      - - - - - - - - -{{insufficient_coverage_methods}} - -
      MethodCoverage
      -
      -
      -
      -

      Project Risks

      -
      - - - - - - - - -{{project_risks_methods}} - -
      MethodCRAP
      -
      -
      -
      - -
      - - - - - - -
      -

      Paths

      -

      - Below are the source code lines that represent each code path as identified by Xdebug. Please note a path is not - necessarily coterminous with a line, a line may contain multiple paths and therefore show up more than once. - Please also be aware that some paths may include implicit rather than explicit branches, e.g. an if statement - always has an else as part of its logical flow even if you didn't write one. -

      -{{paths}} - - - - - Code Coverage for {{full_path}} - - - - - - - -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      - - - - - - - - - - - - - - -{{items}} - -
       
      Code Coverage
       
      Lines
      Functions and Methods
      Classes and Traits
      -
      -
      -
      -

      Legend

      -

      - Low: 0% to {{low_upper_bound}}% - Medium: {{low_upper_bound}}% to {{high_lower_bound}}% - High: {{high_lower_bound}}% to 100% -

      -

      - Generated by php-code-coverage {{version}} using {{runtime}}{{generator}} at {{date}}. -

      -
      -
      - - -/* nvd3 version 1.8.1 (https://github.com/novus/nvd3) 2015-06-15 */ -!function(){var a={};a.dev=!1,a.tooltip=a.tooltip||{},a.utils=a.utils||{},a.models=a.models||{},a.charts={},a.logs={},a.dom={},a.dispatch=d3.dispatch("render_start","render_end"),Function.prototype.bind||(Function.prototype.bind=function(a){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var b=Array.prototype.slice.call(arguments,1),c=this,d=function(){},e=function(){return c.apply(this instanceof d&&a?this:a,b.concat(Array.prototype.slice.call(arguments)))};return d.prototype=this.prototype,e.prototype=new d,e}),a.dev&&(a.dispatch.on("render_start",function(){a.logs.startTime=+new Date}),a.dispatch.on("render_end",function(){a.logs.endTime=+new Date,a.logs.totalTime=a.logs.endTime-a.logs.startTime,a.log("total",a.logs.totalTime)})),a.log=function(){if(a.dev&&window.console&&console.log&&console.log.apply)console.log.apply(console,arguments);else if(a.dev&&window.console&&"function"==typeof console.log&&Function.prototype.bind){var b=Function.prototype.bind.call(console.log,console);b.apply(console,arguments)}return arguments[arguments.length-1]},a.deprecated=function(a,b){console&&console.warn&&console.warn("nvd3 warning: `"+a+"` has been deprecated. ",b||"")},a.render=function(b){b=b||1,a.render.active=!0,a.dispatch.render_start();var c=function(){for(var d,e,f=0;b>f&&(e=a.render.queue[f]);f++)d=e.generate(),typeof e.callback==typeof Function&&e.callback(d);a.render.queue.splice(0,f),a.render.queue.length?setTimeout(c):(a.dispatch.render_end(),a.render.active=!1)};setTimeout(c)},a.render.active=!1,a.render.queue=[],a.addGraph=function(b){typeof arguments[0]==typeof Function&&(b={generate:arguments[0],callback:arguments[1]}),a.render.queue.push(b),a.render.active||a.render()},"undefined"!=typeof module&&"undefined"!=typeof exports&&(module.exports=a),"undefined"!=typeof window&&(window.nv=a),a.dom.write=function(a){return void 0!==window.fastdom?fastdom.write(a):a()},a.dom.read=function(a){return void 0!==window.fastdom?fastdom.read(a):a()},a.interactiveGuideline=function(){"use strict";function b(l){l.each(function(l){function m(){var a=d3.mouse(this),d=a[0],e=a[1],i=!0,j=!1;if(k&&(d=d3.event.offsetX,e=d3.event.offsetY,"svg"!==d3.event.target.tagName&&(i=!1),d3.event.target.className.baseVal.match("nv-legend")&&(j=!0)),i&&(d-=f.left,e-=f.top),0>d||0>e||d>o||e>p||d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement||j){if(k&&d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement&&(void 0===d3.event.relatedTarget.className||d3.event.relatedTarget.className.match(c.nvPointerEventsClass)))return;return h.elementMouseout({mouseX:d,mouseY:e}),b.renderGuideLine(null),void c.hidden(!0)}c.hidden(!1);var l=g.invert(d);h.elementMousemove({mouseX:d,mouseY:e,pointXValue:l}),"dblclick"===d3.event.type&&h.elementDblclick({mouseX:d,mouseY:e,pointXValue:l}),"click"===d3.event.type&&h.elementClick({mouseX:d,mouseY:e,pointXValue:l})}var n=d3.select(this),o=d||960,p=e||400,q=n.selectAll("g.nv-wrap.nv-interactiveLineLayer").data([l]),r=q.enter().append("g").attr("class"," nv-wrap nv-interactiveLineLayer");r.append("g").attr("class","nv-interactiveGuideLine"),j&&(j.on("touchmove",m).on("mousemove",m,!0).on("mouseout",m,!0).on("dblclick",m).on("click",m),b.guideLine=null,b.renderGuideLine=function(c){i&&(b.guideLine&&b.guideLine.attr("x1")===c||a.dom.write(function(){var b=q.select(".nv-interactiveGuideLine").selectAll("line").data(null!=c?[a.utils.NaNtoZero(c)]:[],String);b.enter().append("line").attr("class","nv-guideline").attr("x1",function(a){return a}).attr("x2",function(a){return a}).attr("y1",p).attr("y2",0),b.exit().remove()}))})})}var c=a.models.tooltip();c.duration(0).hideDelay(0)._isInteractiveLayer(!0).hidden(!1);var d=null,e=null,f={left:0,top:0},g=d3.scale.linear(),h=d3.dispatch("elementMousemove","elementMouseout","elementClick","elementDblclick"),i=!0,j=null,k="ActiveXObject"in window;return b.dispatch=h,b.tooltip=c,b.margin=function(a){return arguments.length?(f.top="undefined"!=typeof a.top?a.top:f.top,f.left="undefined"!=typeof a.left?a.left:f.left,b):f},b.width=function(a){return arguments.length?(d=a,b):d},b.height=function(a){return arguments.length?(e=a,b):e},b.xScale=function(a){return arguments.length?(g=a,b):g},b.showGuideLine=function(a){return arguments.length?(i=a,b):i},b.svgContainer=function(a){return arguments.length?(j=a,b):j},b},a.interactiveBisect=function(a,b,c){"use strict";if(!(a instanceof Array))return null;var d;d="function"!=typeof c?function(a){return a.x}:c;var e=function(a,b){return d(a)-b},f=d3.bisector(e).left,g=d3.max([0,f(a,b)-1]),h=d(a[g]);if("undefined"==typeof h&&(h=g),h===b)return g;var i=d3.min([g+1,a.length-1]),j=d(a[i]);return"undefined"==typeof j&&(j=i),Math.abs(j-b)>=Math.abs(h-b)?g:i},a.nearestValueIndex=function(a,b,c){"use strict";var d=1/0,e=null;return a.forEach(function(a,f){var g=Math.abs(b-a);null!=a&&d>=g&&c>g&&(d=g,e=f)}),e},function(){"use strict";a.models.tooltip=function(){function b(){if(k){var a=d3.select(k);"svg"!==a.node().tagName&&(a=a.select("svg"));var b=a.node()?a.attr("viewBox"):null;if(b){b=b.split(" ");var c=parseInt(a.style("width"),10)/b[2];p.left=p.left*c,p.top=p.top*c}}}function c(){if(!n){var a;a=k?k:document.body,n=d3.select(a).append("div").attr("class","nvtooltip "+(j?j:"xy-tooltip")).attr("id",v),n.style("top",0).style("left",0),n.style("opacity",0),n.selectAll("div, table, td, tr").classed(w,!0),n.classed(w,!0),o=n.node()}}function d(){if(r&&B(e)){b();var f=p.left,g=null!==i?i:p.top;return a.dom.write(function(){c();var b=A(e);b&&(o.innerHTML=b),k&&u?a.dom.read(function(){var a=k.getElementsByTagName("svg")[0],b={left:0,top:0};if(a){var c=a.getBoundingClientRect(),d=k.getBoundingClientRect(),e=c.top;if(0>e){var i=k.getBoundingClientRect();e=Math.abs(e)>i.height?0:e}b.top=Math.abs(e-d.top),b.left=Math.abs(c.left-d.left)}f+=k.offsetLeft+b.left-2*k.scrollLeft,g+=k.offsetTop+b.top-2*k.scrollTop,h&&h>0&&(g=Math.floor(g/h)*h),C([f,g])}):C([f,g])}),d}}var e=null,f="w",g=25,h=0,i=null,j=null,k=null,l=!0,m=400,n=null,o=null,p={left:null,top:null},q={left:0,top:0},r=!0,s=100,t=!0,u=!1,v="nvtooltip-"+Math.floor(1e5*Math.random()),w="nv-pointer-events-none",x=function(a){return a},y=function(a){return a},z=function(a){return a},A=function(a){if(null===a)return"";var b=d3.select(document.createElement("table"));if(t){var c=b.selectAll("thead").data([a]).enter().append("thead");c.append("tr").append("td").attr("colspan",3).append("strong").classed("x-value",!0).html(y(a.value))}var d=b.selectAll("tbody").data([a]).enter().append("tbody"),e=d.selectAll("tr").data(function(a){return a.series}).enter().append("tr").classed("highlight",function(a){return a.highlight});e.append("td").classed("legend-color-guide",!0).append("div").style("background-color",function(a){return a.color}),e.append("td").classed("key",!0).html(function(a,b){return z(a.key,b)}),e.append("td").classed("value",!0).html(function(a,b){return x(a.value,b)}),e.selectAll("td").each(function(a){if(a.highlight){var b=d3.scale.linear().domain([0,1]).range(["#fff",a.color]),c=.6;d3.select(this).style("border-bottom-color",b(c)).style("border-top-color",b(c))}});var f=b.node().outerHTML;return void 0!==a.footer&&(f+=""),f},B=function(a){if(a&&a.series){if(a.series instanceof Array)return!!a.series.length;if(a.series instanceof Object)return a.series=[a.series],!0}return!1},C=function(b){o&&a.dom.read(function(){var c,d,e=parseInt(o.offsetHeight,10),h=parseInt(o.offsetWidth,10),i=a.utils.windowSize().width,j=a.utils.windowSize().height,k=window.pageYOffset,p=window.pageXOffset;j=window.innerWidth>=document.body.scrollWidth?j:j-16,i=window.innerHeight>=document.body.scrollHeight?i:i-16;var r,t,u=function(a){var b=d;do isNaN(a.offsetTop)||(b+=a.offsetTop),a=a.offsetParent;while(a);return b},v=function(a){var b=c;do isNaN(a.offsetLeft)||(b+=a.offsetLeft),a=a.offsetParent;while(a);return b};switch(f){case"e":c=b[0]-h-g,d=b[1]-e/2,r=v(o),t=u(o),p>r&&(c=b[0]+g>p?b[0]+g:p-r+c),k>t&&(d=k-t+d),t+e>k+j&&(d=k+j-t+d-e);break;case"w":c=b[0]+g,d=b[1]-e/2,r=v(o),t=u(o),r+h>i&&(c=b[0]-h-g),k>t&&(d=k+5),t+e>k+j&&(d=k+j-t+d-e);break;case"n":c=b[0]-h/2-5,d=b[1]+g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),t+e>k+j&&(d=k+j-t+d-e);break;case"s":c=b[0]-h/2,d=b[1]-e-g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),k>t&&(d=k);break;case"none":c=b[0],d=b[1]-g,r=v(o),t=u(o)}c-=q.left,d-=q.top;var w=o.getBoundingClientRect(),k=window.pageYOffset||document.documentElement.scrollTop,p=window.pageXOffset||document.documentElement.scrollLeft,x="translate("+(w.left+p)+"px, "+(w.top+k)+"px)",y="translate("+c+"px, "+d+"px)",z=d3.interpolateString(x,y),A=n.style("opacity")<.1;l?n.transition().delay(m).duration(0).style("opacity",0):n.interrupt().transition().duration(A?0:s).styleTween("transform",function(){return z},"important").style("-webkit-transform",y).style("opacity",1)})};return d.nvPointerEventsClass=w,d.options=a.utils.optionsFunc.bind(d),d._options=Object.create({},{duration:{get:function(){return s},set:function(a){s=a}},gravity:{get:function(){return f},set:function(a){f=a}},distance:{get:function(){return g},set:function(a){g=a}},snapDistance:{get:function(){return h},set:function(a){h=a}},classes:{get:function(){return j},set:function(a){j=a}},chartContainer:{get:function(){return k},set:function(a){k=a}},fixedTop:{get:function(){return i},set:function(a){i=a}},enabled:{get:function(){return r},set:function(a){r=a}},hideDelay:{get:function(){return m},set:function(a){m=a}},contentGenerator:{get:function(){return A},set:function(a){A=a}},valueFormatter:{get:function(){return x},set:function(a){x=a}},headerFormatter:{get:function(){return y},set:function(a){y=a}},keyFormatter:{get:function(){return z},set:function(a){z=a}},headerEnabled:{get:function(){return t},set:function(a){t=a}},_isInteractiveLayer:{get:function(){return u},set:function(a){u=!!a}},position:{get:function(){return p},set:function(a){p.left=void 0!==a.left?a.left:p.left,p.top=void 0!==a.top?a.top:p.top}},offset:{get:function(){return q},set:function(a){q.left=void 0!==a.left?a.left:q.left,q.top=void 0!==a.top?a.top:q.top}},hidden:{get:function(){return l},set:function(a){l!=a&&(l=!!a,d())}},data:{get:function(){return e},set:function(a){a.point&&(a.value=a.point.x,a.series=a.series||{},a.series.value=a.point.y,a.series.color=a.point.color||a.series.color),e=a}},tooltipElem:{get:function(){return o},set:function(){}},id:{get:function(){return v},set:function(){}}}),a.utils.initOptions(d),d}}(),a.utils.windowSize=function(){var a={width:640,height:480};return window.innerWidth&&window.innerHeight?(a.width=window.innerWidth,a.height=window.innerHeight,a):"CSS1Compat"==document.compatMode&&document.documentElement&&document.documentElement.offsetWidth?(a.width=document.documentElement.offsetWidth,a.height=document.documentElement.offsetHeight,a):document.body&&document.body.offsetWidth?(a.width=document.body.offsetWidth,a.height=document.body.offsetHeight,a):a},a.utils.windowResize=function(b){return window.addEventListener?window.addEventListener("resize",b):a.log("ERROR: Failed to bind to window.resize with: ",b),{callback:b,clear:function(){window.removeEventListener("resize",b)}}},a.utils.getColor=function(b){if(void 0===b)return a.utils.defaultColor();if(Array.isArray(b)){var c=d3.scale.ordinal().range(b);return function(a,b){var d=void 0===b?a:b;return a.color||c(d)}}return b},a.utils.defaultColor=function(){return a.utils.getColor(d3.scale.category20().range())},a.utils.customTheme=function(a,b,c){b=b||function(a){return a.key},c=c||d3.scale.category20().range();var d=c.length;return function(e){var f=b(e);return"function"==typeof a[f]?a[f]():void 0!==a[f]?a[f]:(d||(d=c.length),d-=1,c[d])}},a.utils.pjax=function(b,c){var d=function(d){d3.html(d,function(d){var e=d3.select(c).node();e.parentNode.replaceChild(d3.select(d).select(c).node(),e),a.utils.pjax(b,c)})};d3.selectAll(b).on("click",function(){history.pushState(this.href,this.textContent,this.href),d(this.href),d3.event.preventDefault()}),d3.select(window).on("popstate",function(){d3.event.state&&d(d3.event.state)})},a.utils.calcApproxTextWidth=function(a){if("function"==typeof a.style&&"function"==typeof a.text){var b=parseInt(a.style("font-size").replace("px",""),10),c=a.text().length;return c*b*.5}return 0},a.utils.NaNtoZero=function(a){return"number"!=typeof a||isNaN(a)||null===a||1/0===a||a===-1/0?0:a},d3.selection.prototype.watchTransition=function(a){var b=[this].concat([].slice.call(arguments,1));return a.transition.apply(a,b)},a.utils.renderWatch=function(b,c){if(!(this instanceof a.utils.renderWatch))return new a.utils.renderWatch(b,c);var d=void 0!==c?c:250,e=[],f=this;this.models=function(a){return a=[].slice.call(arguments,0),a.forEach(function(a){a.__rendered=!1,function(a){a.dispatch.on("renderEnd",function(){a.__rendered=!0,f.renderEnd("model")})}(a),e.indexOf(a)<0&&e.push(a)}),this},this.reset=function(a){void 0!==a&&(d=a),e=[]},this.transition=function(a,b,c){if(b=arguments.length>1?[].slice.call(arguments,1):[],c=b.length>1?b.pop():void 0!==d?d:250,a.__rendered=!1,e.indexOf(a)<0&&e.push(a),0===c)return a.__rendered=!0,a.delay=function(){return this},a.duration=function(){return this},a;a.__rendered=0===a.length?!0:a.every(function(a){return!a.length})?!0:!1;var g=0;return a.transition().duration(c).each(function(){++g}).each("end",function(){0===--g&&(a.__rendered=!0,f.renderEnd.apply(this,b))})},this.renderEnd=function(){e.every(function(a){return a.__rendered})&&(e.forEach(function(a){a.__rendered=!1}),b.renderEnd.apply(this,arguments))}},a.utils.deepExtend=function(b){var c=arguments.length>1?[].slice.call(arguments,1):[];c.forEach(function(c){for(var d in c){var e=b[d]instanceof Array,f="object"==typeof b[d],g="object"==typeof c[d];f&&!e&&g?a.utils.deepExtend(b[d],c[d]):b[d]=c[d]}})},a.utils.state=function(){if(!(this instanceof a.utils.state))return new a.utils.state;var b={},c=function(){},d=function(){return{}},e=null,f=null;this.dispatch=d3.dispatch("change","set"),this.dispatch.on("set",function(a){c(a,!0)}),this.getter=function(a){return d=a,this},this.setter=function(a,b){return b||(b=function(){}),c=function(c,d){a(c),d&&b()},this},this.init=function(b){e=e||{},a.utils.deepExtend(e,b)};var g=function(){var a=d();if(JSON.stringify(a)===JSON.stringify(b))return!1;for(var c in a)void 0===b[c]&&(b[c]={}),b[c]=a[c],f=!0;return!0};this.update=function(){e&&(c(e,!1),e=null),g.call(this)&&this.dispatch.change(b)}},a.utils.optionsFunc=function(a){return a&&d3.map(a).forEach(function(a,b){"function"==typeof this[a]&&this[a](b)}.bind(this)),this},a.utils.calcTicksX=function(b,c){var d=1,e=0;for(e;ed?f:d}return a.log("Requested number of ticks: ",b),a.log("Calculated max values to be: ",d),b=b>d?b=d-1:b,b=1>b?1:b,b=Math.floor(b),a.log("Calculating tick count as: ",b),b},a.utils.calcTicksY=function(b,c){return a.utils.calcTicksX(b,c)},a.utils.initOption=function(a,b){a._calls&&a._calls[b]?a[b]=a._calls[b]:(a[b]=function(c){return arguments.length?(a._overrides[b]=!0,a._options[b]=c,a):a._options[b]},a["_"+b]=function(c){return arguments.length?(a._overrides[b]||(a._options[b]=c),a):a._options[b]})},a.utils.initOptions=function(b){b._overrides=b._overrides||{};var c=Object.getOwnPropertyNames(b._options||{}),d=Object.getOwnPropertyNames(b._calls||{});c=c.concat(d);for(var e in c)a.utils.initOption(b,c[e])},a.utils.inheritOptionsD3=function(a,b,c){a._d3options=c.concat(a._d3options||[]),c.unshift(b),c.unshift(a),d3.rebind.apply(this,c)},a.utils.arrayUnique=function(a){return a.sort().filter(function(b,c){return!c||b!=a[c-1]})},a.utils.symbolMap=d3.map(),a.utils.symbol=function(){function b(b,e){var f=c.call(this,b,e),g=d.call(this,b,e);return-1!==d3.svg.symbolTypes.indexOf(f)?d3.svg.symbol().type(f).size(g)():a.utils.symbolMap.get(f)(g)}var c,d=64;return b.type=function(a){return arguments.length?(c=d3.functor(a),b):c},b.size=function(a){return arguments.length?(d=d3.functor(a),b):d},b},a.utils.inheritOptions=function(b,c){var d=Object.getOwnPropertyNames(c._options||{}),e=Object.getOwnPropertyNames(c._calls||{}),f=c._inherited||[],g=c._d3options||[],h=d.concat(e).concat(f).concat(g);h.unshift(c),h.unshift(b),d3.rebind.apply(this,h),b._inherited=a.utils.arrayUnique(d.concat(e).concat(f).concat(d).concat(b._inherited||[])),b._d3options=a.utils.arrayUnique(g.concat(b._d3options||[]))},a.utils.initSVG=function(a){a.classed({"nvd3-svg":!0})},a.utils.sanitizeHeight=function(a,b){return a||parseInt(b.style("height"),10)||400},a.utils.sanitizeWidth=function(a,b){return a||parseInt(b.style("width"),10)||960},a.utils.availableHeight=function(b,c,d){return a.utils.sanitizeHeight(b,c)-d.top-d.bottom},a.utils.availableWidth=function(b,c,d){return a.utils.sanitizeWidth(b,c)-d.left-d.right},a.utils.noData=function(b,c){var d=b.options(),e=d.margin(),f=d.noData(),g=null==f?["No Data Available."]:[f],h=a.utils.availableHeight(d.height(),c,e),i=a.utils.availableWidth(d.width(),c,e),j=e.left+i/2,k=e.top+h/2;c.selectAll("g").remove();var l=c.selectAll(".nv-noData").data(g);l.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),l.attr("x",j).attr("y",k).text(function(a){return a})},a.models.axis=function(){"use strict";function b(g){return s.reset(),g.each(function(b){var g=d3.select(this);a.utils.initSVG(g);var p=g.selectAll("g.nv-wrap.nv-axis").data([b]),q=p.enter().append("g").attr("class","nvd3 nv-wrap nv-axis"),t=(q.append("g"),p.select("g"));null!==n?c.ticks(n):("top"==c.orient()||"bottom"==c.orient())&&c.ticks(Math.abs(d.range()[1]-d.range()[0])/100),t.watchTransition(s,"axis").call(c),r=r||c.scale();var u=c.tickFormat();null==u&&(u=r.tickFormat());var v=t.selectAll("text.nv-axislabel").data([h||null]);v.exit().remove();var w,x,y;switch(c.orient()){case"top":v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",0).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b))+",0)"}).select("text").attr("dy","-0.5em").attr("y",-c.tickPadding()).attr("text-anchor","middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max top").attr("transform",function(b,c){return"translate("+a.utils.NaNtoZero(d.range()[c])+",0)"}));break;case"bottom":w=o+36;var z=30,A=0,B=t.selectAll("g").select("text"),C="";if(j%360){B.each(function(){var a=this.getBoundingClientRect(),b=a.width;A=a.height,b>z&&(z=b)}),C="rotate("+j+" 0,"+(A/2+c.tickPadding())+")";var D=Math.abs(Math.sin(j*Math.PI/180));w=(D?D*z:z)+30,B.attr("transform",C).style("text-anchor",j%360>0?"start":"end")}v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",w).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data([d.domain()[0],d.domain()[d.domain().length-1]]),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"}).select("text").attr("dy",".71em").attr("y",c.tickPadding()).attr("transform",C).style("text-anchor",j?j%360>0?"start":"end":"middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max bottom").attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"})),l&&B.attr("transform",function(a,b){return"translate(0,"+(b%2==0?"0":"12")+")"});break;case"right":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"begin").attr("transform",k?"rotate(90)":"").attr("y",k?-Math.max(e.right,f)+12:-10).attr("x",k?d3.max(d.range())/2:c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(d(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",c.tickPadding()).style("text-anchor","start").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1));break;case"left":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"end").attr("transform",k?"rotate(-90)":"").attr("y",k?-Math.max(e.left,f)+25-(o||0):-10).attr("x",k?-d3.max(d.range())/2:-c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(r(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",-c.tickPadding()).attr("text-anchor","end").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1))}if(v.text(function(a){return a}),!i||"left"!==c.orient()&&"right"!==c.orient()||(t.selectAll("g").each(function(a){d3.select(this).select("text").attr("opacity",1),(d(a)d.range()[0]-10)&&((a>1e-10||-1e-10>a)&&d3.select(this).attr("opacity",0),d3.select(this).select("text").attr("opacity",0))}),d.domain()[0]==d.domain()[1]&&0==d.domain()[0]&&p.selectAll("g.nv-axisMaxMin").style("opacity",function(a,b){return b?0:1})),i&&("top"===c.orient()||"bottom"===c.orient())){var E=[];p.selectAll("g.nv-axisMaxMin").each(function(a,b){try{E.push(b?d(a)-this.getBoundingClientRect().width-4:d(a)+this.getBoundingClientRect().width+4)}catch(c){E.push(b?d(a)-4:d(a)+4)}}),t.selectAll("g").each(function(a){(d(a)E[1])&&(a>1e-10||-1e-10>a?d3.select(this).remove():d3.select(this).select("text").remove())})}t.selectAll(".tick").filter(function(a){return!parseFloat(Math.round(1e5*a)/1e6)&&void 0!==a}).classed("zero",!0),r=d.copy()}),s.renderEnd("axis immediate"),b}var c=d3.svg.axis(),d=d3.scale.linear(),e={top:0,right:0,bottom:0,left:0},f=75,g=60,h=null,i=!0,j=0,k=!0,l=!1,m=!1,n=null,o=0,p=250,q=d3.dispatch("renderEnd");c.scale(d).orient("bottom").tickFormat(function(a){return a});var r,s=a.utils.renderWatch(q,p);return b.axis=c,b.dispatch=q,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{axisLabelDistance:{get:function(){return o},set:function(a){o=a}},staggerLabels:{get:function(){return l},set:function(a){l=a}},rotateLabels:{get:function(){return j},set:function(a){j=a}},rotateYLabel:{get:function(){return k},set:function(a){k=a}},showMaxMin:{get:function(){return i},set:function(a){i=a}},axisLabel:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return g},set:function(a){g=a}},ticks:{get:function(){return n},set:function(a){n=a}},width:{get:function(){return f},set:function(a){f=a}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},duration:{get:function(){return p},set:function(a){p=a,s.reset(p)}},scale:{get:function(){return d},set:function(e){d=e,c.scale(d),m="function"==typeof d.rangeBands,a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"])}}}),a.utils.initOptions(b),a.utils.inheritOptionsD3(b,c,["orient","tickValues","tickSubdivide","tickSize","tickPadding","tickFormat"]),a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"]),b},a.models.boxPlot=function(){"use strict";function b(l){return v.reset(),l.each(function(b){var l=j-i.left-i.right,p=k-i.top-i.bottom;r=d3.select(this),a.utils.initSVG(r),m.domain(c||b.map(function(a,b){return o(a,b)})).rangeBands(e||[0,l],.1);var w=[];if(!d){var x=d3.min(b.map(function(a){var b=[];return b.push(a.values.Q1),a.values.hasOwnProperty("whisker_low")&&null!==a.values.whisker_low&&b.push(a.values.whisker_low),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.min(b)})),y=d3.max(b.map(function(a){var b=[];return b.push(a.values.Q3),a.values.hasOwnProperty("whisker_high")&&null!==a.values.whisker_high&&b.push(a.values.whisker_high),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.max(b)}));w=[x,y]}n.domain(d||w),n.range(f||[p,0]),g=g||m,h=h||n.copy().range([n(0),n(0)]);{var z=r.selectAll("g.nv-wrap").data([b]);z.enter().append("g").attr("class","nvd3 nv-wrap")}z.attr("transform","translate("+i.left+","+i.top+")");var A=z.selectAll(".nv-boxplot").data(function(a){return a}),B=A.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);A.attr("class","nv-boxplot").attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}).classed("hover",function(a){return a.hover}),A.watchTransition(v,"nv-boxplot: boxplots").style("stroke-opacity",1).style("fill-opacity",.75).delay(function(a,c){return c*t/b.length}).attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}),A.exit().remove(),B.each(function(a,b){var c=d3.select(this);["low","high"].forEach(function(d){a.values.hasOwnProperty("whisker_"+d)&&null!==a.values["whisker_"+d]&&(c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-whisker nv-boxplot-"+d),c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-tick nv-boxplot-"+d))})});var C=A.selectAll(".nv-boxplot-outlier").data(function(a){return a.values.hasOwnProperty("outliers")&&null!==a.values.outliers?a.values.outliers:[]});C.enter().append("circle").style("fill",function(a,b,c){return q(a,c)}).style("stroke",function(a,b,c){return q(a,c)}).on("mouseover",function(a,b,c){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:a,color:q(a,c)},e:d3.event})}).on("mouseout",function(a,b,c){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:a,color:q(a,c)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),C.attr("class","nv-boxplot-outlier"),C.watchTransition(v,"nv-boxplot: nv-boxplot-outlier").attr("cx",.45*m.rangeBand()).attr("cy",function(a){return n(a)}).attr("r","3"),C.exit().remove();var D=function(){return null===u?.9*m.rangeBand():Math.min(75,.9*m.rangeBand())},E=function(){return.45*m.rangeBand()-D()/2},F=function(){return.45*m.rangeBand()+D()/2};["low","high"].forEach(function(a){var b="low"===a?"Q1":"Q3";A.select("line.nv-boxplot-whisker.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",.45*m.rangeBand()).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",.45*m.rangeBand()).attr("y2",function(a){return n(a.values[b])}),A.select("line.nv-boxplot-tick.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",E).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",F).attr("y2",function(b){return n(b.values["whisker_"+a])})}),["low","high"].forEach(function(a){B.selectAll(".nv-boxplot-"+a).on("mouseover",function(b,c,d){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mouseout",function(b,c,d){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})})}),B.append("rect").attr("class","nv-boxplot-box").on("mouseover",function(a,b){d3.select(this).classed("hover",!0),s.elementMouseover({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),s.elementMouseout({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),A.select("rect.nv-boxplot-box").watchTransition(v,"nv-boxplot: boxes").attr("y",function(a){return n(a.values.Q3)}).attr("width",D).attr("x",E).attr("height",function(a){return Math.abs(n(a.values.Q3)-n(a.values.Q1))||1}).style("fill",function(a,b){return a.color||q(a,b)}).style("stroke",function(a,b){return a.color||q(a,b)}),B.append("line").attr("class","nv-boxplot-median"),A.select("line.nv-boxplot-median").watchTransition(v,"nv-boxplot: boxplots line").attr("x1",E).attr("y1",function(a){return n(a.values.Q2)}).attr("x2",F).attr("y2",function(a){return n(a.values.Q2)}),g=m.copy(),h=n.copy()}),v.renderEnd("nv-boxplot immediate"),b}var c,d,e,f,g,h,i={top:0,right:0,bottom:0,left:0},j=960,k=500,l=Math.floor(1e4*Math.random()),m=d3.scale.ordinal(),n=d3.scale.linear(),o=function(a){return a.x},p=function(a){return a.y},q=a.utils.defaultColor(),r=null,s=d3.dispatch("elementMouseover","elementMouseout","elementMousemove","renderEnd"),t=250,u=null,v=a.utils.renderWatch(s,t);return b.dispatch=s,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},maxBoxWidth:{get:function(){return u},set:function(a){u=a}},x:{get:function(){return o},set:function(a){o=a}},y:{get:function(){return p},set:function(a){p=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return l},set:function(a){l=a}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}},duration:{get:function(){return t},set:function(a){t=a,v.reset(t)}}}),a.utils.initOptions(b),b},a.models.boxPlotChart=function(){"use strict";function b(k){return t.reset(),t.models(e),l&&t.models(f),m&&t.models(g),k.each(function(k){var p=d3.select(this);a.utils.initSVG(p);var t=(i||parseInt(p.style("width"))||960)-h.left-h.right,u=(j||parseInt(p.style("height"))||400)-h.top-h.bottom;if(b.update=function(){r.beforeUpdate(),p.transition().duration(s).call(b)},b.container=this,!(k&&k.length&&k.filter(function(a){return a.values.hasOwnProperty("Q1")&&a.values.hasOwnProperty("Q2")&&a.values.hasOwnProperty("Q3")}).length)){var v=p.selectAll(".nv-noData").data([q]);return v.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),v.attr("x",h.left+t/2).attr("y",h.top+u/2).text(function(a){return a}),b}p.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var w=p.selectAll("g.nv-wrap.nv-boxPlotWithAxes").data([k]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-boxPlotWithAxes").append("g"),y=x.append("defs"),z=w.select("g"); -x.append("g").attr("class","nv-x nv-axis"),x.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),x.append("g").attr("class","nv-barsWrap"),z.attr("transform","translate("+h.left+","+h.top+")"),n&&z.select(".nv-y.nv-axis").attr("transform","translate("+t+",0)"),e.width(t).height(u);var A=z.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));if(A.transition().call(e),y.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),z.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(o?2:1)).attr("height",16).attr("x",-c.rangeBand()/(o?1:2)),l){f.scale(c).ticks(a.utils.calcTicksX(t/100,k)).tickSize(-u,0),z.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),z.select(".nv-x.nv-axis").call(f);var B=z.select(".nv-x.nv-axis").selectAll("g");o&&B.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}m&&(g.scale(d).ticks(Math.floor(u/36)).tickSize(-t,0),z.select(".nv-y.nv-axis").call(g)),z.select(".nv-zeroLine line").attr("x1",0).attr("x2",t).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("nv-boxplot chart immediate"),b}var c,d,e=a.models.boxPlot(),f=a.models.axis(),g=a.models.axis(),h={top:15,right:10,bottom:50,left:60},i=null,j=null,k=a.utils.getColor(),l=!0,m=!0,n=!1,o=!1,p=a.models.tooltip(),q="No Data Available.",r=d3.dispatch("tooltipShow","tooltipHide","beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(n?"right":"left").tickFormat(d3.format(",.1f")),p.duration(0);var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){p.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(a){p.data(a).hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){p.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.boxplot=e,b.xAxis=f,b.yAxis=g,b.tooltip=p,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},staggerLabels:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return l},set:function(a){l=a}},showYAxis:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return tooltips},set:function(a){tooltips=a}},tooltipContent:{get:function(){return p},set:function(a){p=a}},noData:{get:function(){return q},set:function(a){q=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!==a.top?a.top:h.top,h.right=void 0!==a.right?a.right:h.right,h.bottom=void 0!==a.bottom?a.bottom:h.bottom,h.left=void 0!==a.left?a.left:h.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}},rightAlignYAxis:{get:function(){return n},set:function(a){n=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.bullet=function(){"use strict";function b(d){return d.each(function(b,d){var p=m-c.left-c.right,s=n-c.top-c.bottom;o=d3.select(this),a.utils.initSVG(o);{var t=f.call(this,b,d).slice().sort(d3.descending),u=g.call(this,b,d).slice().sort(d3.descending),v=h.call(this,b,d).slice().sort(d3.descending),w=i.call(this,b,d).slice(),x=j.call(this,b,d).slice(),y=k.call(this,b,d).slice(),z=d3.scale.linear().domain(d3.extent(d3.merge([l,t]))).range(e?[p,0]:[0,p]);this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range())}this.__chart__=z;var A=d3.min(t),B=d3.max(t),C=t[1],D=o.selectAll("g.nv-wrap.nv-bullet").data([b]),E=D.enter().append("g").attr("class","nvd3 nv-wrap nv-bullet"),F=E.append("g"),G=D.select("g");F.append("rect").attr("class","nv-range nv-rangeMax"),F.append("rect").attr("class","nv-range nv-rangeAvg"),F.append("rect").attr("class","nv-range nv-rangeMin"),F.append("rect").attr("class","nv-measure"),D.attr("transform","translate("+c.left+","+c.top+")");var H=function(a){return Math.abs(z(a)-z(0))},I=function(a){return z(0>a?a:0)};G.select("rect.nv-rangeMax").attr("height",s).attr("width",H(B>0?B:A)).attr("x",I(B>0?B:A)).datum(B>0?B:A),G.select("rect.nv-rangeAvg").attr("height",s).attr("width",H(C)).attr("x",I(C)).datum(C),G.select("rect.nv-rangeMin").attr("height",s).attr("width",H(B)).attr("x",I(B)).attr("width",H(B>0?A:B)).attr("x",I(B>0?A:B)).datum(B>0?A:B),G.select("rect.nv-measure").style("fill",q).attr("height",s/3).attr("y",s/3).attr("width",0>v?z(0)-z(v[0]):z(v[0])-z(0)).attr("x",I(v)).on("mouseover",function(){r.elementMouseover({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mouseout",function(){r.elementMouseout({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})});var J=s/6,K=u.map(function(a,b){return{value:a,label:x[b]}});F.selectAll("path.nv-markerTriangle").data(K).enter().append("path").attr("class","nv-markerTriangle").attr("transform",function(a){return"translate("+z(a.value)+","+s/2+")"}).attr("d","M0,"+J+"L"+J+","+-J+" "+-J+","+-J+"Z").on("mouseover",function(a){r.elementMouseover({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill"),pos:[z(a.value),s/2]})}).on("mousemove",function(a){r.elementMousemove({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a){r.elementMouseout({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}),D.selectAll(".nv-range").on("mouseover",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseover({value:a,label:c,color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseout({value:a,label:c,color:d3.select(this).style("fill")})})}),b}var c={top:0,right:0,bottom:0,left:0},d="left",e=!1,f=function(a){return a.ranges},g=function(a){return a.markers?a.markers:[0]},h=function(a){return a.measures},i=function(a){return a.rangeLabels?a.rangeLabels:[]},j=function(a){return a.markerLabels?a.markerLabels:[]},k=function(a){return a.measureLabels?a.measureLabels:[]},l=[0],m=380,n=30,o=null,p=null,q=a.utils.getColor(["#1f77b4"]),r=d3.dispatch("elementMouseover","elementMouseout","elementMousemove");return b.dispatch=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return f},set:function(a){f=a}},markers:{get:function(){return g},set:function(a){g=a}},measures:{get:function(){return h},set:function(a){h=a}},forceX:{get:function(){return l},set:function(a){l=a}},width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},tickFormat:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},orient:{get:function(){return d},set:function(a){d=a,e="right"==d||"bottom"==d}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.bulletChart=function(){"use strict";function b(d){return d.each(function(e,o){var p=d3.select(this);a.utils.initSVG(p);var q=a.utils.availableWidth(k,p,g),r=l-g.top-g.bottom;if(b.update=function(){b(d)},b.container=this,!e||!h.call(this,e,o))return a.utils.noData(b,p),b;p.selectAll(".nv-noData").remove();var s=h.call(this,e,o).slice().sort(d3.descending),t=i.call(this,e,o).slice().sort(d3.descending),u=j.call(this,e,o).slice().sort(d3.descending),v=p.selectAll("g.nv-wrap.nv-bulletChart").data([e]),w=v.enter().append("g").attr("class","nvd3 nv-wrap nv-bulletChart"),x=w.append("g"),y=v.select("g");x.append("g").attr("class","nv-bulletWrap"),x.append("g").attr("class","nv-titles"),v.attr("transform","translate("+g.left+","+g.top+")");var z=d3.scale.linear().domain([0,Math.max(s[0],t[0],u[0])]).range(f?[q,0]:[0,q]),A=this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range());this.__chart__=z;var B=x.select(".nv-titles").append("g").attr("text-anchor","end").attr("transform","translate(-6,"+(l-g.top-g.bottom)/2+")");B.append("text").attr("class","nv-title").text(function(a){return a.title}),B.append("text").attr("class","nv-subtitle").attr("dy","1em").text(function(a){return a.subtitle}),c.width(q).height(r);var C=y.select(".nv-bulletWrap");d3.transition(C).call(c);var D=m||z.tickFormat(q/100),E=y.selectAll("g.nv-tick").data(z.ticks(n?n:q/50),function(a){return this.textContent||D(a)}),F=E.enter().append("g").attr("class","nv-tick").attr("transform",function(a){return"translate("+A(a)+",0)"}).style("opacity",1e-6);F.append("line").attr("y1",r).attr("y2",7*r/6),F.append("text").attr("text-anchor","middle").attr("dy","1em").attr("y",7*r/6).text(D);var G=d3.transition(E).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1);G.select("line").attr("y1",r).attr("y2",7*r/6),G.select("text").attr("y",7*r/6),d3.transition(E.exit()).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1e-6).remove()}),d3.timer.flush(),b}var c=a.models.bullet(),d=a.models.tooltip(),e="left",f=!1,g={top:5,right:40,bottom:20,left:120},h=function(a){return a.ranges},i=function(a){return a.markers?a.markers:[0]},j=function(a){return a.measures},k=null,l=55,m=null,n=null,o=null,p=d3.dispatch("tooltipShow","tooltipHide");return d.duration(0).headerEnabled(!1),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.label,value:a.value,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.bullet=c,b.dispatch=p,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return h},set:function(a){h=a}},markers:{get:function(){return i},set:function(a){i=a}},measures:{get:function(){return j},set:function(a){j=a}},width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},tickFormat:{get:function(){return m},set:function(a){m=a}},ticks:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return o},set:function(a){o=a}},tooltips:{get:function(){return d.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),d.enabled(!!b)}},tooltipContent:{get:function(){return d.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),d.contentGenerator(b)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},orient:{get:function(){return e},set:function(a){e=a,f="right"==e||"bottom"==e}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.candlestickBar=function(){"use strict";function b(x){return x.each(function(b){c=d3.select(this);var x=a.utils.availableWidth(i,c,h),y=a.utils.availableHeight(j,c,h);a.utils.initSVG(c);var A=x/b[0].values.length*.45;l.domain(d||d3.extent(b[0].values.map(n).concat(t))),l.range(v?f||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:f||[5+A/2,x-A/2-5]),m.domain(e||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(g||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var B=d3.select(this).selectAll("g.nv-wrap.nv-candlestickBar").data([b[0].values]),C=B.enter().append("g").attr("class","nvd3 nv-wrap nv-candlestickBar"),D=C.append("defs"),E=C.append("g"),F=B.select("g");E.append("g").attr("class","nv-ticks"),B.attr("transform","translate("+h.left+","+h.top+")"),c.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:k})}),D.append("clipPath").attr("id","nv-chart-clip-path-"+k).append("rect"),B.select("#nv-chart-clip-path-"+k+" rect").attr("width",x).attr("height",y),F.attr("clip-path",w?"url(#nv-chart-clip-path-"+k+")":"");var G=B.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});G.exit().remove();{var H=G.enter().append("g").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b});H.append("line").attr("class","nv-candlestick-lines").attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),H.append("rect").attr("class","nv-candlestick-rects nv-bars").attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}c.selectAll(".nv-candlestick-lines").transition().attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),c.selectAll(".nv-candlestick-rects").transition().attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}),b}var c,d,e,f,g,h={top:0,right:0,bottom:0,left:0},i=null,j=null,k=Math.floor(1e4*Math.random()),l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,d){b.clearHighlights(),c.select(".nv-candlestickBar .nv-tick-0-"+a).classed("hover",d)},b.clearHighlights=function(){c.select(".nv-candlestickBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return k},set:function(a){k=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!=a.top?a.top:h.top,h.right=void 0!=a.right?a.right:h.right,h.bottom=void 0!=a.bottom?a.bottom:h.bottom,h.left=void 0!=a.left?a.left:h.left}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.cumulativeLineChart=function(){"use strict";function b(l){return H.reset(),H.models(f),r&&H.models(g),s&&H.models(h),l.each(function(l){function A(){d3.select(b.container).style("cursor","ew-resize")}function E(){G.x=d3.event.x,G.i=Math.round(F.invert(G.x)),K()}function H(){d3.select(b.container).style("cursor","auto"),y.index=G.i,C.stateChange(y)}function K(){bb.data([G]);var a=b.duration();b.duration(0),b.update(),b.duration(a)}var L=d3.select(this);a.utils.initSVG(L),L.classed("nv-chart-"+x,!0);var M=this,N=a.utils.availableWidth(o,L,m),O=a.utils.availableHeight(p,L,m);if(b.update=function(){0===D?L.call(b):L.transition().duration(D).call(b)},b.container=this,y.setter(J(l),b.update).getter(I(l)).update(),y.disabled=l.map(function(a){return!!a.disabled}),!z){var P;z={};for(P in y)z[P]=y[P]instanceof Array?y[P].slice(0):y[P]}var Q=d3.behavior.drag().on("dragstart",A).on("drag",E).on("dragend",H);if(!(l&&l.length&&l.filter(function(a){return a.values.length}).length))return a.utils.noData(b,L),b;if(L.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale(),w)f.yDomain(null);else{var R=l.filter(function(a){return!a.disabled}).map(function(a){var b=d3.extent(a.values,f.y());return b[0]<-.95&&(b[0]=-.95),[(b[0]-b[1])/(1+b[1]),(b[1]-b[0])/(1+b[0])]}),S=[d3.min(R,function(a){return a[0]}),d3.max(R,function(a){return a[1]})];f.yDomain(S)}F.domain([0,l[0].values.length-1]).range([0,N]).clamp(!0);var l=c(G.i,l),T=v?"none":"all",U=L.selectAll("g.nv-wrap.nv-cumulativeLine").data([l]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-cumulativeLine").append("g"),W=U.select("g");if(V.append("g").attr("class","nv-interactive"),V.append("g").attr("class","nv-x nv-axis").style("pointer-events","none"),V.append("g").attr("class","nv-y nv-axis"),V.append("g").attr("class","nv-background"),V.append("g").attr("class","nv-linesWrap").style("pointer-events",T),V.append("g").attr("class","nv-avgLinesWrap").style("pointer-events","none"),V.append("g").attr("class","nv-legendWrap"),V.append("g").attr("class","nv-controlsWrap"),q&&(i.width(N),W.select(".nv-legendWrap").datum(l).call(i),m.top!=i.height()&&(m.top=i.height(),O=a.utils.availableHeight(p,L,m)),W.select(".nv-legendWrap").attr("transform","translate(0,"+-m.top+")")),u){var X=[{key:"Re-scale y-axis",disabled:!w}];j.width(140).color(["#444","#444","#444"]).rightAlign(!1).margin({top:5,right:0,bottom:5,left:20}),W.select(".nv-controlsWrap").datum(X).attr("transform","translate(0,"+-m.top+")").call(j)}U.attr("transform","translate("+m.left+","+m.top+")"),t&&W.select(".nv-y.nv-axis").attr("transform","translate("+N+",0)");var Y=l.filter(function(a){return a.tempDisabled});U.select(".tempDisabled").remove(),Y.length&&U.append("text").attr("class","tempDisabled").attr("x",N/2).attr("y","-.71em").style("text-anchor","end").text(Y.map(function(a){return a.key}).join(", ")+" values cannot be calculated for this time period."),v&&(k.width(N).height(O).margin({left:m.left,top:m.top}).svgContainer(L).xScale(d),U.select(".nv-interactive").call(k)),V.select(".nv-background").append("rect"),W.select(".nv-background rect").attr("width",N).attr("height",O),f.y(function(a){return a.display.y}).width(N).height(O).color(l.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!l[b].disabled&&!l[b].tempDisabled}));var Z=W.select(".nv-linesWrap").datum(l.filter(function(a){return!a.disabled&&!a.tempDisabled}));Z.call(f),l.forEach(function(a,b){a.seriesIndex=b});var $=l.filter(function(a){return!a.disabled&&!!B(a)}),_=W.select(".nv-avgLinesWrap").selectAll("line").data($,function(a){return a.key}),ab=function(a){var b=e(B(a));return 0>b?0:b>O?O:b};_.enter().append("line").style("stroke-width",2).style("stroke-dasharray","10,10").style("stroke",function(a){return f.color()(a,a.seriesIndex)}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.style("stroke-opacity",function(a){var b=e(B(a));return 0>b||b>O?0:1}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.exit().remove();var bb=Z.selectAll(".nv-indexLine").data([G]);bb.enter().append("rect").attr("class","nv-indexLine").attr("width",3).attr("x",-2).attr("fill","red").attr("fill-opacity",.5).style("pointer-events","all").call(Q),bb.attr("transform",function(a){return"translate("+F(a.i)+",0)"}).attr("height",O),r&&(g.scale(d)._ticks(a.utils.calcTicksX(N/70,l)).tickSize(-O,0),W.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),W.select(".nv-x.nv-axis").call(g)),s&&(h.scale(e)._ticks(a.utils.calcTicksY(O/36,l)).tickSize(-N,0),W.select(".nv-y.nv-axis").call(h)),W.select(".nv-background rect").on("click",function(){G.x=d3.mouse(this)[0],G.i=Math.round(F.invert(G.x)),y.index=G.i,C.stateChange(y),K()}),f.dispatch.on("elementClick",function(a){G.i=a.pointIndex,G.x=F(G.i),y.index=G.i,C.stateChange(y),K()}),j.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,w=!a.disabled,y.rescaleY=w,C.stateChange(y),b.update()}),i.dispatch.on("stateChange",function(a){for(var c in a)y[c]=a[c];C.stateChange(y),b.update()}),k.dispatch.on("elementMousemove",function(c){f.clearHighlights();var d,e,i,j=[];if(l.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g,h){e=a.interactiveBisect(g.values,c.pointXValue,b.x()),f.highlightPoint(h,e,!0);var k=g.values[e];"undefined"!=typeof k&&("undefined"==typeof d&&(d=k),"undefined"==typeof i&&(i=b.xScale()(b.x()(k,e))),j.push({key:g.key,value:b.y()(k,e),color:n(g,g.seriesIndex)}))}),j.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(j.map(function(a){return a.value}),o,q);null!==r&&(j[r].highlight=!0)}var s=g.tickFormat()(b.x()(d,e),e);k.tooltip.position({left:i+m.left,top:c.mouseY+m.top}).chartContainer(M.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:s,series:j})(),k.renderGuideLine(i)}),k.dispatch.on("elementMouseout",function(){f.clearHighlights()}),C.on("changeState",function(a){"undefined"!=typeof a.disabled&&(l.forEach(function(b,c){b.disabled=a.disabled[c]}),y.disabled=a.disabled),"undefined"!=typeof a.index&&(G.i=a.index,G.x=F(G.i),y.index=a.index,bb.data([G])),"undefined"!=typeof a.rescaleY&&(w=a.rescaleY),b.update()})}),H.renderEnd("cumulativeLineChart immediate"),b}function c(a,b){return K||(K=f.y()),b.map(function(b){if(!b.values)return b;var c=b.values[a];if(null==c)return b;var d=K(c,a);return-.95>d&&!E?(b.tempDisabled=!0,b):(b.tempDisabled=!1,b.values=b.values.map(function(a,b){return a.display={y:(K(a,b)-d)/(1+d)},a}),b)})}var d,e,f=a.models.line(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.models.legend(),k=a.interactiveGuideline(),l=a.models.tooltip(),m={top:30,right:30,bottom:50,left:60},n=a.utils.defaultColor(),o=null,p=null,q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=!0,x=f.id(),y=a.utils.state(),z=null,A=null,B=function(a){return a.average},C=d3.dispatch("stateChange","changeState","renderEnd"),D=250,E=!1;y.index=0,y.rescaleY=w,g.orient("bottom").tickPadding(7),h.orient(t?"right":"left"),l.valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)}),j.updateState(!1);var F=d3.scale.linear(),G={i:0,x:0},H=a.utils.renderWatch(C,D),I=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),index:G.i,rescaleY:w}}},J=function(a){return function(b){void 0!==b.index&&(G.i=b.index),void 0!==b.rescaleY&&(w=b.rescaleY),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};f.dispatch.on("elementMouseover.tooltip",function(a){var c={x:b.x()(a.point),y:b.y()(a.point),color:a.point.color};a.point=c,l.data(a).position(a.pos).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){l.hidden(!0)});var K=null;return b.dispatch=C,b.lines=f,b.legend=i,b.controls=j,b.xAxis=g,b.yAxis=h,b.interactiveLayer=k,b.state=y,b.tooltip=l,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return o},set:function(a){o=a}},height:{get:function(){return p},set:function(a){p=a}},rescaleY:{get:function(){return w},set:function(a){w=a}},showControls:{get:function(){return u},set:function(a){u=a}},showLegend:{get:function(){return q},set:function(a){q=a}},average:{get:function(){return B},set:function(a){B=a}},defaultState:{get:function(){return z},set:function(a){z=a}},noData:{get:function(){return A},set:function(a){A=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},noErrorCheck:{get:function(){return E},set:function(a){E=a}},tooltips:{get:function(){return l.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),l.enabled(!!b)}},tooltipContent:{get:function(){return l.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),l.contentGenerator(b)}},margin:{get:function(){return m},set:function(a){m.top=void 0!==a.top?a.top:m.top,m.right=void 0!==a.right?a.right:m.right,m.bottom=void 0!==a.bottom?a.bottom:m.bottom,m.left=void 0!==a.left?a.left:m.left}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),i.color(n)}},useInteractiveGuideline:{get:function(){return v},set:function(a){v=a,a===!0&&(b.interactive(!1),b.useVoronoi(!1))}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,h.orient(a?"right":"left")}},duration:{get:function(){return D},set:function(a){D=a,f.duration(D),g.duration(D),h.duration(D),H.reset(D)}}}),a.utils.inheritOptions(b,f),a.utils.initOptions(b),b},a.models.discreteBar=function(){"use strict";function b(m){return y.reset(),m.each(function(b){var m=k-j.left-j.right,x=l-j.top-j.bottom;c=d3.select(this),a.utils.initSVG(c),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var z=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),y0:a.y0}})});n.domain(d||d3.merge(z).map(function(a){return a.x})).rangeBands(f||[0,m],.1),o.domain(e||d3.extent(d3.merge(z).map(function(a){return a.y}).concat(r))),o.range(t?g||[x-(o.domain()[0]<0?12:0),o.domain()[1]>0?12:0]:g||[x,0]),h=h||n,i=i||o.copy().range([o(0),o(0)]);{var A=c.selectAll("g.nv-wrap.nv-discretebar").data([b]),B=A.enter().append("g").attr("class","nvd3 nv-wrap nv-discretebar"),C=B.append("g");A.select("g")}C.append("g").attr("class","nv-groups"),A.attr("transform","translate("+j.left+","+j.top+")");var D=A.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});D.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),D.exit().watchTransition(y,"discreteBar: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),D.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),D.watchTransition(y,"discreteBar: groups").style("stroke-opacity",1).style("fill-opacity",.75);var E=D.selectAll("g.nv-bar").data(function(a){return a.values});E.exit().remove();var F=E.enter().append("g").attr("transform",function(a,b){return"translate("+(n(p(a,b))+.05*n.rangeBand())+", "+o(0)+")"}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),v.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),v.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){v.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){v.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()});F.append("rect").attr("height",0).attr("width",.9*n.rangeBand()/b.length),t?(F.append("text").attr("text-anchor","middle"),E.select("text").text(function(a,b){return u(q(a,b))}).watchTransition(y,"discreteBar: bars text").attr("x",.9*n.rangeBand()/2).attr("y",function(a,b){return q(a,b)<0?o(q(a,b))-o(0)+12:-4})):E.selectAll("text").remove(),E.attr("class",function(a,b){return q(a,b)<0?"nv-bar negative":"nv-bar positive"}).style("fill",function(a,b){return a.color||s(a,b)}).style("stroke",function(a,b){return a.color||s(a,b)}).select("rect").attr("class",w).watchTransition(y,"discreteBar: bars rect").attr("width",.9*n.rangeBand()/b.length),E.watchTransition(y,"discreteBar: bars").attr("transform",function(a,b){var c=n(p(a,b))+.05*n.rangeBand(),d=q(a,b)<0?o(0):o(0)-o(q(a,b))<1?o(0)-1:o(q(a,b));return"translate("+c+", "+d+")"}).select("rect").attr("height",function(a,b){return Math.max(Math.abs(o(q(a,b))-o(e&&e[0]||0))||1)}),h=n.copy(),i=o.copy()}),y.renderEnd("discreteBar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=d3.scale.ordinal(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=[0],s=a.utils.defaultColor(),t=!1,u=d3.format(",.2f"),v=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),w="discreteBar",x=250,y=a.utils.renderWatch(v,x);return b.dispatch=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},forceY:{get:function(){return r},set:function(a){r=a}},showValues:{get:function(){return t},set:function(a){t=a}},x:{get:function(){return p},set:function(a){p=a}},y:{get:function(){return q},set:function(a){q=a}},xScale:{get:function(){return n},set:function(a){n=a}},yScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},valueFormat:{get:function(){return u},set:function(a){u=a}},id:{get:function(){return m},set:function(a){m=a}},rectClass:{get:function(){return w},set:function(a){w=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b)}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x)}}}),a.utils.initOptions(b),b},a.models.discreteBarChart=function(){"use strict";function b(h){return t.reset(),t.models(e),m&&t.models(f),n&&t.models(g),h.each(function(h){var l=d3.select(this);a.utils.initSVG(l);var q=a.utils.availableWidth(j,l,i),t=a.utils.availableHeight(k,l,i);if(b.update=function(){r.beforeUpdate(),l.transition().duration(s).call(b)},b.container=this,!(h&&h.length&&h.filter(function(a){return a.values.length}).length))return a.utils.noData(b,l),b;l.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var u=l.selectAll("g.nv-wrap.nv-discreteBarWithAxes").data([h]),v=u.enter().append("g").attr("class","nvd3 nv-wrap nv-discreteBarWithAxes").append("g"),w=v.append("defs"),x=u.select("g");v.append("g").attr("class","nv-x nv-axis"),v.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),v.append("g").attr("class","nv-barsWrap"),x.attr("transform","translate("+i.left+","+i.top+")"),o&&x.select(".nv-y.nv-axis").attr("transform","translate("+q+",0)"),e.width(q).height(t);var y=x.select(".nv-barsWrap").datum(h.filter(function(a){return!a.disabled}));if(y.transition().call(e),w.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),x.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(p?2:1)).attr("height",16).attr("x",-c.rangeBand()/(p?1:2)),m){f.scale(c)._ticks(a.utils.calcTicksX(q/100,h)).tickSize(-t,0),x.select(".nv-x.nv-axis").attr("transform","translate(0,"+(d.range()[0]+(e.showValues()&&d.domain()[0]<0?16:0))+")"),x.select(".nv-x.nv-axis").call(f); -var z=x.select(".nv-x.nv-axis").selectAll("g");p&&z.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}n&&(g.scale(d)._ticks(a.utils.calcTicksY(t/36,h)).tickSize(-q,0),x.select(".nv-y.nv-axis").call(g)),x.select(".nv-zeroLine line").attr("x1",0).attr("x2",q).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("discreteBar chart immediate"),b}var c,d,e=a.models.discreteBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.tooltip(),i={top:15,right:10,bottom:50,left:60},j=null,k=null,l=a.utils.getColor(),m=!0,n=!0,o=!1,p=!1,q=null,r=d3.dispatch("beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(o?"right":"left").tickFormat(d3.format(",.1f")),h.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).keyFormatter(function(a,b){return f.tickFormat()(a,b)});var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},h.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){h.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){h.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.discretebar=e,b.xAxis=f,b.yAxis=g,b.tooltip=h,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},staggerLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return m},set:function(a){m=a}},showYAxis:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return q},set:function(a){q=a}},tooltips:{get:function(){return h.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),h.enabled(!!b)}},tooltipContent:{get:function(){return h.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),h.contentGenerator(b)}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),e.color(l)}},rightAlignYAxis:{get:function(){return o},set:function(a){o=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.distribution=function(){"use strict";function b(k){return m.reset(),k.each(function(b){var k=(e-("x"===g?d.left+d.right:d.top+d.bottom),"x"==g?"y":"x"),l=d3.select(this);a.utils.initSVG(l),c=c||j;var n=l.selectAll("g.nv-distribution").data([b]),o=n.enter().append("g").attr("class","nvd3 nv-distribution"),p=(o.append("g"),n.select("g"));n.attr("transform","translate("+d.left+","+d.top+")");var q=p.selectAll("g.nv-dist").data(function(a){return a},function(a){return a.key});q.enter().append("g"),q.attr("class",function(a,b){return"nv-dist nv-series-"+b}).style("stroke",function(a,b){return i(a,b)});var r=q.selectAll("line.nv-dist"+g).data(function(a){return a.values});r.enter().append("line").attr(g+"1",function(a,b){return c(h(a,b))}).attr(g+"2",function(a,b){return c(h(a,b))}),m.transition(q.exit().selectAll("line.nv-dist"+g),"dist exit").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}).style("stroke-opacity",0).remove(),r.attr("class",function(a,b){return"nv-dist"+g+" nv-dist"+g+"-"+b}).attr(k+"1",0).attr(k+"2",f),m.transition(r,"dist").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}),c=j.copy()}),m.renderEnd("distribution immediate"),b}var c,d={top:0,right:0,bottom:0,left:0},e=400,f=8,g="x",h=function(a){return a[g]},i=a.utils.defaultColor(),j=d3.scale.linear(),k=250,l=d3.dispatch("renderEnd"),m=a.utils.renderWatch(l,k);return b.options=a.utils.optionsFunc.bind(b),b.dispatch=l,b.margin=function(a){return arguments.length?(d.top="undefined"!=typeof a.top?a.top:d.top,d.right="undefined"!=typeof a.right?a.right:d.right,d.bottom="undefined"!=typeof a.bottom?a.bottom:d.bottom,d.left="undefined"!=typeof a.left?a.left:d.left,b):d},b.width=function(a){return arguments.length?(e=a,b):e},b.axis=function(a){return arguments.length?(g=a,b):g},b.size=function(a){return arguments.length?(f=a,b):f},b.getData=function(a){return arguments.length?(h=d3.functor(a),b):h},b.scale=function(a){return arguments.length?(j=a,b):j},b.color=function(c){return arguments.length?(i=a.utils.getColor(c),b):i},b.duration=function(a){return arguments.length?(k=a,m.reset(k),b):k},b},a.models.furiousLegend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?g(a,b):"#fff":m?void 0:a.disabled?g(a,b):"#fff"}function r(a,b){return m&&"furious"==o?a.disengaged?"#fff":g(a,b):a.disabled?"#fff":g(a,b)}return p.each(function(b){var p=d-c.left-c.right,s=d3.select(this);a.utils.initSVG(s);var t=s.selectAll("g.nv-legend").data([b]),u=(t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),t.select("g"));t.attr("transform","translate("+c.left+","+c.top+")");var v,w=u.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),x=w.enter().append("g").attr("class","nv-series");if("classic"==o)x.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),v=w.select("circle");else if("furious"==o){x.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),v=w.select("rect"),x.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var y=w.select(".nv-check-box");y.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}x.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var z=w.select("text.nv-legend-text");w.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=w.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=w.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),w.classed("nv-disabled",function(a){return a.userDisabled}),w.exit().remove(),z.attr("fill",q).text(f);var A;switch(o){case"furious":A=23;break;case"classic":A=20}if(h){var B=[];w.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}B.push(b+i)});for(var C=0,D=0,E=[];p>D&&Cp&&C>1;){E=[],C--;for(var F=0;F(E[F%C]||0)&&(E[F%C]=B[F]);D=E.reduce(function(a,b){return a+b})}for(var G=[],H=0,I=0;C>H;H++)G[H]=I,I+=E[H];w.attr("transform",function(a,b){return"translate("+G[b%C]+","+(5+Math.floor(b/C)*A)+")"}),j?u.attr("transform","translate("+(d-c.right-D)+","+c.top+")"):u.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(B.length/C)*A}else{var J,K=5,L=5,M=0;w.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return J=L,dM&&(M=L),"translate("+J+","+K+")"}),u.attr("transform","translate("+(d-c.right-M)+","+c.top+")"),e=c.top+c.bottom+K+15}"furious"==o&&v.attr("width",function(a,b){return z[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),v.style("fill",r).style("stroke",function(a,b){return a.color||g(a,b)})}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=28,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBar=function(){"use strict";function b(x){return x.each(function(b){w.reset(),k=d3.select(this);var x=a.utils.availableWidth(h,k,g),y=a.utils.availableHeight(i,k,g);a.utils.initSVG(k),l.domain(c||d3.extent(b[0].values.map(n).concat(p))),l.range(r?e||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:e||[0,x]),m.domain(d||d3.extent(b[0].values.map(o).concat(q))).range(f||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var z=k.selectAll("g.nv-wrap.nv-historicalBar-"+j).data([b[0].values]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBar-"+j),B=A.append("defs"),C=A.append("g"),D=z.select("g");C.append("g").attr("class","nv-bars"),z.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){u.chartClick({data:a,index:b,pos:d3.event,id:j})}),B.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),z.select("#nv-chart-clip-path-"+j+" rect").attr("width",x).attr("height",y),D.attr("clip-path",s?"url(#nv-chart-clip-path-"+j+")":"");var E=z.select(".nv-bars").selectAll(".nv-bar").data(function(a){return a},function(a,b){return n(a,b)});E.exit().remove(),E.enter().append("rect").attr("x",0).attr("y",function(b,c){return a.utils.NaNtoZero(m(Math.max(0,o(b,c))))}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.abs(m(o(b,c))-m(0)))}).attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).on("mouseover",function(a,b){v&&(d3.select(this).classed("hover",!0),u.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mouseout",function(a,b){v&&(d3.select(this).classed("hover",!1),u.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mousemove",function(a,b){v&&u.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v&&(u.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}).on("dblclick",function(a,b){v&&(u.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}),E.attr("fill",function(a,b){return t(a,b)}).attr("class",function(a,b,c){return(o(a,b)<0?"nv-bar negative":"nv-bar positive")+" nv-bar-"+c+"-"+b}).watchTransition(w,"bars").attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).attr("width",x/b[0].values.length*.9),E.watchTransition(w,"bars").attr("y",function(b,c){var d=o(b,c)<0?m(0):m(0)-m(o(b,c))<1?m(0)-1:m(o(b,c));return a.utils.NaNtoZero(d)}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.max(Math.abs(m(o(b,c))-m(0)),1))})}),w.renderEnd("historicalBar immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=[],q=[0],r=!1,s=!0,t=a.utils.defaultColor(),u=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),v=!0,w=a.utils.renderWatch(u,0);return b.highlightPoint=function(a,b){k.select(".nv-bars .nv-bar-0-"+a).classed("hover",b)},b.clearHighlights=function(){k.select(".nv-bars .nv-bar.hover").classed("hover",!1)},b.dispatch=u,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},forceX:{get:function(){return p},set:function(a){p=a}},forceY:{get:function(){return q},set:function(a){q=a}},padData:{get:function(){return r},set:function(a){r=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},clipEdge:{get:function(){return s},set:function(a){s=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return v},set:function(a){v=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return t},set:function(b){t=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBarChart=function(b){"use strict";function c(b){return b.each(function(k){z.reset(),z.models(f),q&&z.models(g),r&&z.models(h);var w=d3.select(this),A=this;a.utils.initSVG(w);var B=a.utils.availableWidth(n,w,l),C=a.utils.availableHeight(o,w,l);if(c.update=function(){w.transition().duration(y).call(c)},c.container=this,u.disabled=k.map(function(a){return!!a.disabled}),!v){var D;v={};for(D in u)v[D]=u[D]instanceof Array?u[D].slice(0):u[D]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(c,w),c;w.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale();var E=w.selectAll("g.nv-wrap.nv-historicalBarChart").data([k]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBarChart").append("g"),G=E.select("g");F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-barsWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),p&&(i.width(B),G.select(".nv-legendWrap").datum(k).call(i),l.top!=i.height()&&(l.top=i.height(),C=a.utils.availableHeight(o,w,l)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-l.top+")")),E.attr("transform","translate("+l.left+","+l.top+")"),s&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),t&&(j.width(B).height(C).margin({left:l.left,top:l.top}).svgContainer(w).xScale(d),E.select(".nv-interactive").call(j)),f.width(B).height(C).color(k.map(function(a,b){return a.color||m(a,b)}).filter(function(a,b){return!k[b].disabled}));var H=G.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));H.transition().call(f),q&&(g.scale(d)._ticks(a.utils.calcTicksX(B/100,k)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),G.select(".nv-x.nv-axis").transition().call(g)),r&&(h.scale(e)._ticks(a.utils.calcTicksY(C/36,k)).tickSize(-B,0),G.select(".nv-y.nv-axis").transition().call(h)),j.dispatch.on("elementMousemove",function(b){f.clearHighlights();var d,e,i,n=[];k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g){e=a.interactiveBisect(g.values,b.pointXValue,c.x()),f.highlightPoint(e,!0);var h=g.values[e];void 0!==h&&(void 0===d&&(d=h),void 0===i&&(i=c.xScale()(c.x()(h,e))),n.push({key:g.key,value:c.y()(h,e),color:m(g,g.seriesIndex),data:g.values[e]}))});var o=g.tickFormat()(c.x()(d,e));j.tooltip.position({left:i+l.left,top:b.mouseY+l.top}).chartContainer(A.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:o,index:e,series:n})(),j.renderGuideLine(i)}),j.dispatch.on("elementMouseout",function(){x.tooltipHide(),f.clearHighlights()}),i.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,k.filter(function(a){return!a.disabled}).length||k.map(function(a){return a.disabled=!1,E.selectAll(".nv-series").classed("disabled",!1),a}),u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),b.transition().call(c)}),i.dispatch.on("legendDblclick",function(a){k.forEach(function(a){a.disabled=!0}),a.disabled=!1,u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),c.update()}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),c.update()})}),z.renderEnd("historicalBarChart immediate"),c}var d,e,f=b||a.models.historicalBar(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:90,bottom:50,left:90},m=a.utils.defaultColor(),n=null,o=null,p=!1,q=!0,r=!0,s=!1,t=!1,u={},v=null,w=null,x=d3.dispatch("tooltipHide","stateChange","changeState","renderEnd"),y=250;g.orient("bottom").tickPadding(7),h.orient(s?"right":"left"),k.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)});var z=a.utils.renderWatch(x,0);return f.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:c.x()(a.data),value:c.y()(a.data),color:a.color},k.data(a).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),f.dispatch.on("elementMousemove.tooltip",function(){k.position({top:d3.event.pageY,left:d3.event.pageX})()}),c.dispatch=x,c.bars=f,c.legend=i,c.xAxis=g,c.yAxis=h,c.interactiveLayer=j,c.tooltip=k,c.options=a.utils.optionsFunc.bind(c),c._options=Object.create({},{width:{get:function(){return n},set:function(a){n=a}},height:{get:function(){return o},set:function(a){o=a}},showLegend:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return q},set:function(a){q=a}},showYAxis:{get:function(){return r},set:function(a){r=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b),i.color(m),f.color(m)}},duration:{get:function(){return y},set:function(a){y=a,z.reset(y),h.duration(y),g.duration(y)}},rightAlignYAxis:{get:function(){return s},set:function(a){s=a,h.orient(a?"right":"left")}},useInteractiveGuideline:{get:function(){return t},set:function(a){t=a,a===!0&&c.interactive(!1)}}}),a.utils.inheritOptions(c,f),a.utils.initOptions(c),c},a.models.ohlcBarChart=function(){var b=a.models.historicalBarChart(a.models.ohlcBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
      open:"+b.yAxis.tickFormat()(c.open)+"
      close:"+b.yAxis.tickFormat()(c.close)+"
      high"+b.yAxis.tickFormat()(c.high)+"
      low:"+b.yAxis.tickFormat()(c.low)+"
      "}),b},a.models.candlestickBarChart=function(){var b=a.models.historicalBarChart(a.models.candlestickBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
      open:"+b.yAxis.tickFormat()(c.open)+"
      close:"+b.yAxis.tickFormat()(c.close)+"
      high"+b.yAxis.tickFormat()(c.high)+"
      low:"+b.yAxis.tickFormat()(c.low)+"
      "}),b},a.models.legend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?"#000":"#fff":m?void 0:(a.color||(a.color=g(a,b)),a.disabled?a.color:"#fff")}function r(a,b){return m&&"furious"==o&&a.disengaged?"#eee":a.color||g(a,b)}function s(a){return m&&"furious"==o?1:a.disabled?0:1}return p.each(function(b){var g=d-c.left-c.right,p=d3.select(this);a.utils.initSVG(p);var t=p.selectAll("g.nv-legend").data([b]),u=t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),v=t.select("g");t.attr("transform","translate("+c.left+","+c.top+")");var w,x,y=v.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),z=y.enter().append("g").attr("class","nv-series");switch(o){case"furious":x=23;break;case"classic":x=20}if("classic"==o)z.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),w=y.select("circle");else if("furious"==o){z.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),w=y.select(".nv-legend-symbol"),z.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var A=y.select(".nv-check-box");A.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}z.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var B=y.select("text.nv-legend-text");y.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=y.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=y.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),y.classed("nv-disabled",function(a){return a.userDisabled}),y.exit().remove(),B.attr("fill",q).text(f);var C=0;if(h){var D=[];y.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}D.push(b+i)});var E=0,F=[];for(C=0;g>C&&Eg&&E>1;){F=[],E--;for(var G=0;G(F[G%E]||0)&&(F[G%E]=D[G]);C=F.reduce(function(a,b){return a+b})}for(var H=[],I=0,J=0;E>I;I++)H[I]=J,J+=F[I];y.attr("transform",function(a,b){return"translate("+H[b%E]+","+(5+Math.floor(b/E)*x)+")"}),j?v.attr("transform","translate("+(d-c.right-C)+","+c.top+")"):v.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(D.length/E)*x}else{var K,L=5,M=5,N=0;y.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return K=M,dN&&(N=M),K+N>C&&(C=K+N),"translate("+K+","+L+")"}),v.attr("transform","translate("+(d-c.right-N)+","+c.top+")"),e=c.top+c.bottom+L+15}if("furious"==o){w.attr("width",function(a,b){return B[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),u.insert("rect",":first-child").attr("class","nv-legend-bg").attr("fill","#eee").attr("opacity",0);var O=v.select(".nv-legend-bg");O.transition().duration(300).attr("x",-x).attr("width",C+x-12).attr("height",e+10).attr("y",-c.top-10).attr("opacity",m?1:0)}w.style("fill",r).style("fill-opacity",s).style("stroke",r)}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=32,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.line=function(){"use strict";function b(r){return v.reset(),v.models(e),r.each(function(b){i=d3.select(this);var r=a.utils.availableWidth(g,i,f),s=a.utils.availableHeight(h,i,f);a.utils.initSVG(i),c=e.xScale(),d=e.yScale(),t=t||c,u=u||d;var w=i.selectAll("g.nv-wrap.nv-line").data([b]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-line"),y=x.append("defs"),z=x.append("g"),A=w.select("g");z.append("g").attr("class","nv-groups"),z.append("g").attr("class","nv-scatterWrap"),w.attr("transform","translate("+f.left+","+f.top+")"),e.width(r).height(s);var B=w.select(".nv-scatterWrap");B.call(e),y.append("clipPath").attr("id","nv-edge-clip-"+e.id()).append("rect"),w.select("#nv-edge-clip-"+e.id()+" rect").attr("width",r).attr("height",s>0?s:0),A.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":""),B.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":"");var C=w.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});C.enter().append("g").style("stroke-opacity",1e-6).style("stroke-width",function(a){return a.strokeWidth||j}).style("fill-opacity",1e-6),C.exit().remove(),C.attr("class",function(a,b){return(a.classed||"")+" nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return k(a,b)}).style("stroke",function(a,b){return k(a,b)}),C.watchTransition(v,"line: groups").style("stroke-opacity",1).style("fill-opacity",function(a){return a.fillOpacity||.5});var D=C.selectAll("path.nv-area").data(function(a){return o(a)?[a]:[]});D.enter().append("path").attr("class","nv-area").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y0(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))}).y1(function(){return u(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])}),C.exit().selectAll("path.nv-area").remove(),D.watchTransition(v,"line: areaPaths").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y0(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))}).y1(function(){return d(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])});var E=C.selectAll("path.nv-line").data(function(a){return[a.values]});E.enter().append("path").attr("class","nv-line").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))})),E.watchTransition(v,"line: linePaths").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))})),t=c.copy(),u=d.copy()}),v.renderEnd("line immediate"),b}var c,d,e=a.models.scatter(),f={top:0,right:0,bottom:0,left:0},g=960,h=500,i=null,j=1.5,k=a.utils.defaultColor(),l=function(a){return a.x},m=function(a){return a.y},n=function(a,b){return!isNaN(m(a,b))&&null!==m(a,b)},o=function(a){return a.area},p=!1,q="linear",r=250,s=d3.dispatch("elementClick","elementMouseover","elementMouseout","renderEnd");e.pointSize(16).pointDomain([16,256]);var t,u,v=a.utils.renderWatch(s,r);return b.dispatch=s,b.scatter=e,e.dispatch.on("elementClick",function(){s.elementClick.apply(this,arguments)}),e.dispatch.on("elementMouseover",function(){s.elementMouseover.apply(this,arguments)}),e.dispatch.on("elementMouseout",function(){s.elementMouseout.apply(this,arguments)}),b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},defined:{get:function(){return n},set:function(a){n=a}},interpolate:{get:function(){return q},set:function(a){q=a}},clipEdge:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},duration:{get:function(){return r},set:function(a){r=a,v.reset(r),e.duration(r)}},isArea:{get:function(){return o},set:function(a){o=d3.functor(a)}},x:{get:function(){return l},set:function(a){l=a,e.x(a)}},y:{get:function(){return m},set:function(a){m=a,e.y(a)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.lineChart=function(){"use strict";function b(j){return y.reset(),y.models(e),p&&y.models(f),q&&y.models(g),j.each(function(j){var v=d3.select(this),y=this;a.utils.initSVG(v);var B=a.utils.availableWidth(m,v,k),C=a.utils.availableHeight(n,v,k);if(b.update=function(){0===x?v.call(b):v.transition().duration(x).call(b)},b.container=this,t.setter(A(j),b.update).getter(z(j)).update(),t.disabled=j.map(function(a){return!!a.disabled}),!u){var D;u={};for(D in t)u[D]=t[D]instanceof Array?t[D].slice(0):t[D] -}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,v),b;v.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var E=v.selectAll("g.nv-wrap.nv-lineChart").data([j]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-lineChart").append("g"),G=E.select("g");F.append("rect").style("opacity",0),F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-linesWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),G.select("rect").attr("width",B).attr("height",C>0?C:0),o&&(h.width(B),G.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),C=a.utils.availableHeight(n,v,k)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-k.top+")")),E.attr("transform","translate("+k.left+","+k.top+")"),r&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),s&&(i.width(B).height(C).margin({left:k.left,top:k.top}).svgContainer(v).xScale(c),E.select(".nv-interactive").call(i)),e.width(B).height(C).color(j.map(function(a,b){return a.color||l(a,b)}).filter(function(a,b){return!j[b].disabled}));var H=G.select(".nv-linesWrap").datum(j.filter(function(a){return!a.disabled}));H.call(e),p&&(f.scale(c)._ticks(a.utils.calcTicksX(B/100,j)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),G.select(".nv-x.nv-axis").call(f)),q&&(g.scale(d)._ticks(a.utils.calcTicksY(C/36,j)).tickSize(-B,0),G.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)t[c]=a[c];w.stateChange(t),b.update()}),i.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,h,m,n=[];if(j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,g){h=a.interactiveBisect(f.values,c.pointXValue,b.x());var i=f.values[h],j=b.y()(i,h);null!=j&&e.highlightPoint(g,h,!0),void 0!==i&&(void 0===d&&(d=i),void 0===m&&(m=b.xScale()(b.x()(i,h))),n.push({key:f.key,value:j,color:l(f,f.seriesIndex)}))}),n.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(n.map(function(a){return a.value}),o,q);null!==r&&(n[r].highlight=!0)}var s=f.tickFormat()(b.x()(d,h));i.tooltip.position({left:c.mouseX+k.left,top:c.mouseY+k.top}).chartContainer(y.parentNode).valueFormatter(function(a){return null==a?"N/A":g.tickFormat()(a)}).data({value:s,index:h,series:n})(),i.renderGuideLine(m)}),i.dispatch.on("elementClick",function(c){var d,f=[];j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(e){var g=a.interactiveBisect(e.values,c.pointXValue,b.x()),h=e.values[g];if("undefined"!=typeof h){"undefined"==typeof d&&(d=b.xScale()(b.x()(h,g)));var i=b.yScale()(b.y()(h,g));f.push({point:h,pointIndex:g,pos:[d,i],seriesIndex:e.seriesIndex,series:e})}}),e.dispatch.elementClick(f)}),i.dispatch.on("elementMouseout",function(){e.clearHighlights()}),w.on("changeState",function(a){"undefined"!=typeof a.disabled&&j.length===a.disabled.length&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),t.disabled=a.disabled),b.update()})}),y.renderEnd("lineChart immediate"),b}var c,d,e=a.models.line(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.interactiveGuideline(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=a.utils.defaultColor(),m=null,n=null,o=!0,p=!0,q=!0,r=!1,s=!1,t=a.utils.state(),u=null,v=null,w=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),x=250;f.orient("bottom").tickPadding(7),g.orient(r?"right":"left"),j.valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)});var y=a.utils.renderWatch(w,x),z=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},A=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){j.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),b.dispatch=w,b.lines=e,b.legend=h,b.xAxis=f,b.yAxis=g,b.interactiveLayer=i,b.tooltip=j,b.dispatch=w,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return p},set:function(a){p=a}},showYAxis:{get:function(){return q},set:function(a){q=a}},defaultState:{get:function(){return u},set:function(a){u=a}},noData:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x),e.duration(x),f.duration(x),g.duration(x)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),h.color(l),e.color(l)}},rightAlignYAxis:{get:function(){return r},set:function(a){r=a,g.orient(r?"right":"left")}},useInteractiveGuideline:{get:function(){return s},set:function(a){s=a,s&&(e.interactive(!1),e.useVoronoi(!1))}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.linePlusBarChart=function(){"use strict";function b(v){return v.each(function(v){function J(a){var b=+("e"==a),c=b?1:-1,d=X/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function S(){u.empty()||u.extent(I),kb.data([u.empty()?e.domain():I]).each(function(a){var b=e(a[0])-e.range()[0],c=e.range()[1]-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>c?0:c)})}function T(){I=u.empty()?null:u.extent(),c=u.empty()?e.domain():u.extent(),K.brush({extent:c,brush:u}),S(),l.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),j.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var b=db.select(".nv-focus .nv-barsWrap").datum(Z.length?Z.map(function(a){return{key:a.key,values:a.values.filter(function(a,b){return l.x()(a,b)>=c[0]&&l.x()(a,b)<=c[1]})}}):[{values:[]}]),h=db.select(".nv-focus .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$.map(function(a){return{area:a.area,fillOpacity:a.fillOpacity,key:a.key,values:a.values.filter(function(a,b){return j.x()(a,b)>=c[0]&&j.x()(a,b)<=c[1]})}}));d=Z.length?l.xScale():j.xScale(),n.scale(d)._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-W,0),n.domain([Math.ceil(c[0]),Math.floor(c[1])]),db.select(".nv-x.nv-axis").transition().duration(L).call(n),b.transition().duration(L).call(l),h.transition().duration(L).call(j),db.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),p.scale(f)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(-V,0),q.scale(g)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(Z.length?0:-V,0),db.select(".nv-focus .nv-y1.nv-axis").style("opacity",Z.length?1:0),db.select(".nv-focus .nv-y2.nv-axis").style("opacity",$.length&&!$[0].disabled?1:0).attr("transform","translate("+d.range()[1]+",0)"),db.select(".nv-focus .nv-y1.nv-axis").transition().duration(L).call(p),db.select(".nv-focus .nv-y2.nv-axis").transition().duration(L).call(q)}var U=d3.select(this);a.utils.initSVG(U);var V=a.utils.availableWidth(y,U,w),W=a.utils.availableHeight(z,U,w)-(E?H:0),X=H-x.top-x.bottom;if(b.update=function(){U.transition().duration(L).call(b)},b.container=this,M.setter(R(v),b.update).getter(Q(v)).update(),M.disabled=v.map(function(a){return!!a.disabled}),!N){var Y;N={};for(Y in M)N[Y]=M[Y]instanceof Array?M[Y].slice(0):M[Y]}if(!(v&&v.length&&v.filter(function(a){return a.values.length}).length))return a.utils.noData(b,U),b;U.selectAll(".nv-noData").remove();var Z=v.filter(function(a){return!a.disabled&&a.bar}),$=v.filter(function(a){return!a.bar});d=l.xScale(),e=o.scale(),f=l.yScale(),g=j.yScale(),h=m.yScale(),i=k.yScale();var _=v.filter(function(a){return!a.disabled&&a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})}),ab=v.filter(function(a){return!a.disabled&&!a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})});d.range([0,V]),e.domain(d3.extent(d3.merge(_.concat(ab)),function(a){return a.x})).range([0,V]);var bb=U.selectAll("g.nv-wrap.nv-linePlusBar").data([v]),cb=bb.enter().append("g").attr("class","nvd3 nv-wrap nv-linePlusBar").append("g"),db=bb.select("g");cb.append("g").attr("class","nv-legendWrap");var eb=cb.append("g").attr("class","nv-focus");eb.append("g").attr("class","nv-x nv-axis"),eb.append("g").attr("class","nv-y1 nv-axis"),eb.append("g").attr("class","nv-y2 nv-axis"),eb.append("g").attr("class","nv-barsWrap"),eb.append("g").attr("class","nv-linesWrap");var fb=cb.append("g").attr("class","nv-context");if(fb.append("g").attr("class","nv-x nv-axis"),fb.append("g").attr("class","nv-y1 nv-axis"),fb.append("g").attr("class","nv-y2 nv-axis"),fb.append("g").attr("class","nv-barsWrap"),fb.append("g").attr("class","nv-linesWrap"),fb.append("g").attr("class","nv-brushBackground"),fb.append("g").attr("class","nv-x nv-brush"),D){var gb=t.align()?V/2:V,hb=t.align()?gb:0;t.width(gb),db.select(".nv-legendWrap").datum(v.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(a.bar?O:P),a})).call(t),w.top!=t.height()&&(w.top=t.height(),W=a.utils.availableHeight(z,U,w)-H),db.select(".nv-legendWrap").attr("transform","translate("+hb+","+-w.top+")")}bb.attr("transform","translate("+w.left+","+w.top+")"),db.select(".nv-context").style("display",E?"initial":"none"),m.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),k.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var ib=db.select(".nv-context .nv-barsWrap").datum(Z.length?Z:[{values:[]}]),jb=db.select(".nv-context .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$);db.select(".nv-context").attr("transform","translate(0,"+(W+w.bottom+x.top)+")"),ib.transition().call(m),jb.transition().call(k),G&&(o._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-X,0),db.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+h.range()[0]+")"),db.select(".nv-context .nv-x.nv-axis").transition().call(o)),F&&(r.scale(h)._ticks(X/36).tickSize(-V,0),s.scale(i)._ticks(X/36).tickSize(Z.length?0:-V,0),db.select(".nv-context .nv-y3.nv-axis").style("opacity",Z.length?1:0).attr("transform","translate(0,"+e.range()[0]+")"),db.select(".nv-context .nv-y2.nv-axis").style("opacity",$.length?1:0).attr("transform","translate("+e.range()[1]+",0)"),db.select(".nv-context .nv-y1.nv-axis").transition().call(r),db.select(".nv-context .nv-y2.nv-axis").transition().call(s)),u.x(e).on("brush",T),I&&u.extent(I);var kb=db.select(".nv-brushBackground").selectAll("g").data([I||u.extent()]),lb=kb.enter().append("g");lb.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",X),lb.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",X);var mb=db.select(".nv-x.nv-brush").call(u);mb.selectAll("rect").attr("height",X),mb.selectAll(".resize").append("path").attr("d",J),t.dispatch.on("stateChange",function(a){for(var c in a)M[c]=a[c];K.stateChange(M),b.update()}),K.on("changeState",function(a){"undefined"!=typeof a.disabled&&(v.forEach(function(b,c){b.disabled=a.disabled[c]}),M.disabled=a.disabled),b.update()}),T()}),b}var c,d,e,f,g,h,i,j=a.models.line(),k=a.models.line(),l=a.models.historicalBar(),m=a.models.historicalBar(),n=a.models.axis(),o=a.models.axis(),p=a.models.axis(),q=a.models.axis(),r=a.models.axis(),s=a.models.axis(),t=a.models.legend(),u=d3.svg.brush(),v=a.models.tooltip(),w={top:30,right:30,bottom:30,left:60},x={top:0,right:30,bottom:20,left:60},y=null,z=null,A=function(a){return a.x},B=function(a){return a.y},C=a.utils.defaultColor(),D=!0,E=!0,F=!1,G=!0,H=50,I=null,J=null,K=d3.dispatch("brush","stateChange","changeState"),L=0,M=a.utils.state(),N=null,O=" (left axis)",P=" (right axis)";j.clipEdge(!0),k.interactive(!1),n.orient("bottom").tickPadding(5),p.orient("left"),q.orient("right"),o.orient("bottom").tickPadding(5),r.orient("left"),s.orient("right"),v.headerEnabled(!0).headerFormatter(function(a,b){return n.tickFormat()(a,b)});var Q=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},R=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return j.dispatch.on("elementMouseover.tooltip",function(a){v.duration(100).valueFormatter(function(a,b){return q.tickFormat()(a,b)}).data(a).position(a.pos).hidden(!1)}),j.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={value:b.y()(a.data),color:a.color},v.duration(0).valueFormatter(function(a,b){return p.tickFormat()(a,b)}).data(a).hidden(!1)}),l.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMousemove.tooltip",function(){v.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=K,b.legend=t,b.lines=j,b.lines2=k,b.bars=l,b.bars2=m,b.xAxis=n,b.x2Axis=o,b.y1Axis=p,b.y2Axis=q,b.y3Axis=r,b.y4Axis=s,b.tooltip=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return y},set:function(a){y=a}},height:{get:function(){return z},set:function(a){z=a}},showLegend:{get:function(){return D},set:function(a){D=a}},brushExtent:{get:function(){return I},set:function(a){I=a}},noData:{get:function(){return J},set:function(a){J=a}},focusEnable:{get:function(){return E},set:function(a){E=a}},focusHeight:{get:function(){return H},set:function(a){H=a}},focusShowAxisX:{get:function(){return G},set:function(a){G=a}},focusShowAxisY:{get:function(){return F},set:function(a){F=a}},legendLeftAxisHint:{get:function(){return O},set:function(a){O=a}},legendRightAxisHint:{get:function(){return P},set:function(a){P=a}},tooltips:{get:function(){return v.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),v.enabled(!!b)}},tooltipContent:{get:function(){return v.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),v.contentGenerator(b)}},margin:{get:function(){return w},set:function(a){w.top=void 0!==a.top?a.top:w.top,w.right=void 0!==a.right?a.right:w.right,w.bottom=void 0!==a.bottom?a.bottom:w.bottom,w.left=void 0!==a.left?a.left:w.left}},duration:{get:function(){return L},set:function(a){L=a}},color:{get:function(){return C},set:function(b){C=a.utils.getColor(b),t.color(C)}},x:{get:function(){return A},set:function(a){A=a,j.x(a),k.x(a),l.x(a),m.x(a)}},y:{get:function(){return B},set:function(a){B=a,j.y(a),k.y(a),l.y(a),m.y(a)}}}),a.utils.inheritOptions(b,j),a.utils.initOptions(b),b},a.models.lineWithFocusChart=function(){"use strict";function b(o){return o.each(function(o){function z(a){var b=+("e"==a),c=b?1:-1,d=M/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function G(){n.empty()||n.extent(y),U.data([n.empty()?e.domain():y]).each(function(a){var b=e(a[0])-c.range()[0],d=K-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>d?0:d)})}function H(){y=n.empty()?null:n.extent();var a=n.empty()?e.domain():n.extent();if(!(Math.abs(a[0]-a[1])<=1)){A.brush({extent:a,brush:n}),G();var b=Q.select(".nv-focus .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}).map(function(b){return{key:b.key,area:b.area,values:b.values.filter(function(b,c){return g.x()(b,c)>=a[0]&&g.x()(b,c)<=a[1]})}}));b.transition().duration(B).call(g),Q.select(".nv-focus .nv-x.nv-axis").transition().duration(B).call(i),Q.select(".nv-focus .nv-y.nv-axis").transition().duration(B).call(j)}}var I=d3.select(this),J=this;a.utils.initSVG(I);var K=a.utils.availableWidth(t,I,q),L=a.utils.availableHeight(u,I,q)-v,M=v-r.top-r.bottom;if(b.update=function(){I.transition().duration(B).call(b)},b.container=this,C.setter(F(o),b.update).getter(E(o)).update(),C.disabled=o.map(function(a){return!!a.disabled}),!D){var N;D={};for(N in C)D[N]=C[N]instanceof Array?C[N].slice(0):C[N]}if(!(o&&o.length&&o.filter(function(a){return a.values.length}).length))return a.utils.noData(b,I),b;I.selectAll(".nv-noData").remove(),c=g.xScale(),d=g.yScale(),e=h.xScale(),f=h.yScale();var O=I.selectAll("g.nv-wrap.nv-lineWithFocusChart").data([o]),P=O.enter().append("g").attr("class","nvd3 nv-wrap nv-lineWithFocusChart").append("g"),Q=O.select("g");P.append("g").attr("class","nv-legendWrap");var R=P.append("g").attr("class","nv-focus");R.append("g").attr("class","nv-x nv-axis"),R.append("g").attr("class","nv-y nv-axis"),R.append("g").attr("class","nv-linesWrap"),R.append("g").attr("class","nv-interactive");var S=P.append("g").attr("class","nv-context");S.append("g").attr("class","nv-x nv-axis"),S.append("g").attr("class","nv-y nv-axis"),S.append("g").attr("class","nv-linesWrap"),S.append("g").attr("class","nv-brushBackground"),S.append("g").attr("class","nv-x nv-brush"),x&&(m.width(K),Q.select(".nv-legendWrap").datum(o).call(m),q.top!=m.height()&&(q.top=m.height(),L=a.utils.availableHeight(u,I,q)-v),Q.select(".nv-legendWrap").attr("transform","translate(0,"+-q.top+")")),O.attr("transform","translate("+q.left+","+q.top+")"),w&&(p.width(K).height(L).margin({left:q.left,top:q.top}).svgContainer(I).xScale(c),O.select(".nv-interactive").call(p)),g.width(K).height(L).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),h.defined(g.defined()).width(K).height(M).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),Q.select(".nv-context").attr("transform","translate(0,"+(L+q.bottom+r.top)+")");var T=Q.select(".nv-context .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}));d3.transition(T).call(h),i.scale(c)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-L,0),j.scale(d)._ticks(a.utils.calcTicksY(L/36,o)).tickSize(-K,0),Q.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+L+")"),n.x(e).on("brush",function(){H()}),y&&n.extent(y);var U=Q.select(".nv-brushBackground").selectAll("g").data([y||n.extent()]),V=U.enter().append("g");V.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",M),V.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",M);var W=Q.select(".nv-x.nv-brush").call(n);W.selectAll("rect").attr("height",M),W.selectAll(".resize").append("path").attr("d",z),H(),k.scale(e)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-M,0),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),d3.transition(Q.select(".nv-context .nv-x.nv-axis")).call(k),l.scale(f)._ticks(a.utils.calcTicksY(M/36,o)).tickSize(-K,0),d3.transition(Q.select(".nv-context .nv-y.nv-axis")).call(l),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),m.dispatch.on("stateChange",function(a){for(var c in a)C[c]=a[c];A.stateChange(C),b.update()}),p.dispatch.on("elementMousemove",function(c){g.clearHighlights();var d,f,h,k=[];if(o.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(i,j){var l=n.empty()?e.domain():n.extent(),m=i.values.filter(function(a,b){return g.x()(a,b)>=l[0]&&g.x()(a,b)<=l[1]});f=a.interactiveBisect(m,c.pointXValue,g.x());var o=m[f],p=b.y()(o,f);null!=p&&g.highlightPoint(j,f,!0),void 0!==o&&(void 0===d&&(d=o),void 0===h&&(h=b.xScale()(b.x()(o,f))),k.push({key:i.key,value:b.y()(o,f),color:s(i,i.seriesIndex)}))}),k.length>2){var l=b.yScale().invert(c.mouseY),m=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),r=.03*m,t=a.nearestValueIndex(k.map(function(a){return a.value}),l,r);null!==t&&(k[t].highlight=!0)}var u=i.tickFormat()(b.x()(d,f));p.tooltip.position({left:c.mouseX+q.left,top:c.mouseY+q.top}).chartContainer(J.parentNode).valueFormatter(function(a){return null==a?"N/A":j.tickFormat()(a)}).data({value:u,index:f,series:k})(),p.renderGuideLine(h)}),p.dispatch.on("elementMouseout",function(){g.clearHighlights()}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&o.forEach(function(b,c){b.disabled=a.disabled[c]}),b.update()})}),b}var c,d,e,f,g=a.models.line(),h=a.models.line(),i=a.models.axis(),j=a.models.axis(),k=a.models.axis(),l=a.models.axis(),m=a.models.legend(),n=d3.svg.brush(),o=a.models.tooltip(),p=a.interactiveGuideline(),q={top:30,right:30,bottom:30,left:60},r={top:0,right:30,bottom:20,left:60},s=a.utils.defaultColor(),t=null,u=null,v=50,w=!1,x=!0,y=null,z=null,A=d3.dispatch("brush","stateChange","changeState"),B=250,C=a.utils.state(),D=null;g.clipEdge(!0).duration(0),h.interactive(!1),i.orient("bottom").tickPadding(5),j.orient("left"),k.orient("bottom").tickPadding(5),l.orient("left"),o.valueFormatter(function(a,b){return j.tickFormat()(a,b)}).headerFormatter(function(a,b){return i.tickFormat()(a,b)});var E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return g.dispatch.on("elementMouseover.tooltip",function(a){o.data(a).position(a.pos).hidden(!1)}),g.dispatch.on("elementMouseout.tooltip",function(){o.hidden(!0)}),b.dispatch=A,b.legend=m,b.lines=g,b.lines2=h,b.xAxis=i,b.yAxis=j,b.x2Axis=k,b.y2Axis=l,b.interactiveLayer=p,b.tooltip=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return t},set:function(a){t=a}},height:{get:function(){return u},set:function(a){u=a}},focusHeight:{get:function(){return v},set:function(a){v=a}},showLegend:{get:function(){return x},set:function(a){x=a}},brushExtent:{get:function(){return y},set:function(a){y=a}},defaultState:{get:function(){return D},set:function(a){D=a}},noData:{get:function(){return z},set:function(a){z=a}},tooltips:{get:function(){return o.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),o.enabled(!!b)}},tooltipContent:{get:function(){return o.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),o.contentGenerator(b)}},margin:{get:function(){return q},set:function(a){q.top=void 0!==a.top?a.top:q.top,q.right=void 0!==a.right?a.right:q.right,q.bottom=void 0!==a.bottom?a.bottom:q.bottom,q.left=void 0!==a.left?a.left:q.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b),m.color(s)}},interpolate:{get:function(){return g.interpolate()},set:function(a){g.interpolate(a),h.interpolate(a)}},xTickFormat:{get:function(){return i.tickFormat()},set:function(a){i.tickFormat(a),k.tickFormat(a)}},yTickFormat:{get:function(){return j.tickFormat()},set:function(a){j.tickFormat(a),l.tickFormat(a)}},duration:{get:function(){return B},set:function(a){B=a,j.duration(B),l.duration(B),i.duration(B),k.duration(B)}},x:{get:function(){return g.x()},set:function(a){g.x(a),h.x(a)}},y:{get:function(){return g.y()},set:function(a){g.y(a),h.y(a)}},useInteractiveGuideline:{get:function(){return w},set:function(a){w=a,w&&(g.interactive(!1),g.useVoronoi(!1))}}}),a.utils.inheritOptions(b,g),a.utils.initOptions(b),b},a.models.multiBar=function(){"use strict";function b(E){return C.reset(),E.each(function(b){var E=k-j.left-j.right,F=l-j.top-j.bottom;p=d3.select(this),a.utils.initSVG(p);var G=0;if(x&&b.length&&(x=[{values:b[0].values.map(function(a){return{x:a.x,y:0,series:a.series,size:.01}})}]),u){var H=d3.layout.stack().offset(v).values(function(a){return a.values}).y(r)(!b.length&&x?x:b);H.forEach(function(a,c){a.nonStackable?(b[c].nonStackableSeries=G++,H[c]=b[c]):c>0&&H[c-1].nonStackable&&H[c].values.map(function(a,b){a.y0-=H[c-1].values[b].y,a.y1=a.y0+a.y})}),b=H}b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),u&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a,f){if(!b[f].nonStackable){var g=a.values[c];g.size=Math.abs(g.y),g.y<0?(g.y1=e,e-=g.size):(g.y1=g.size+d,d+=g.size)}})});var I=d&&e?[]:b.map(function(a,b){return a.values.map(function(a,c){return{x:q(a,c),y:r(a,c),y0:a.y0,y1:a.y1,idx:b}})});m.domain(d||d3.merge(I).map(function(a){return a.x})).rangeBands(f||[0,E],A),n.domain(e||d3.extent(d3.merge(I).map(function(a){var c=a.y;return u&&!b[a.idx].nonStackable&&(c=a.y>0?a.y1:a.y1+a.y),c}).concat(s))).range(g||[F,0]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]+.01*n.domain()[0],n.domain()[1]-.01*n.domain()[1]]:[-1,1]),h=h||m,i=i||n;var J=p.selectAll("g.nv-wrap.nv-multibar").data([b]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-multibar"),L=K.append("defs"),M=K.append("g"),N=J.select("g");M.append("g").attr("class","nv-groups"),J.attr("transform","translate("+j.left+","+j.top+")"),L.append("clipPath").attr("id","nv-edge-clip-"+o).append("rect"),J.select("#nv-edge-clip-"+o+" rect").attr("width",E).attr("height",F),N.attr("clip-path",t?"url(#nv-edge-clip-"+o+")":"");var O=J.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});O.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);var P=C.transition(O.exit().selectAll("rect.nv-bar"),"multibarExit",Math.min(100,z)).attr("y",function(a){var c=i(0)||0;return u&&b[a.series]&&!b[a.series].nonStackable&&(c=i(a.y0)),c}).attr("height",0).remove();P.delay&&P.delay(function(a,b){var c=b*(z/(D+1))-b;return c}),O.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return w(a,b)}).style("stroke",function(a,b){return w(a,b)}),O.style("stroke-opacity",1).style("fill-opacity",.75);var Q=O.selectAll("rect.nv-bar").data(function(a){return x&&!b.length?x.values:a.values});Q.exit().remove();Q.enter().append("rect").attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("x",function(a,c,d){return u&&!b[d].nonStackable?0:d*m.rangeBand()/b.length}).attr("y",function(a,c,d){return i(u&&!b[d].nonStackable?a.y0:0)||0}).attr("height",0).attr("width",function(a,c,d){return m.rangeBand()/(u&&!b[d].nonStackable?1:b.length)}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"});Q.style("fill",function(a,b,c){return w(a,c,b)}).style("stroke",function(a,b,c){return w(a,c,b)}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),B.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),B.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){B.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){B.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){B.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),Q.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"}),y&&(c||(c=b.map(function(){return!0})),Q.style("fill",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}));var R=Q.watchTransition(C,"multibar",Math.min(250,z)).delay(function(a,c){return c*z/b[0].values.length});u?R.attr("y",function(a,c,d){var e=0;return e=b[d].nonStackable?r(a,c)<0?n(0):n(0)-n(r(a,c))<-1?n(0)-1:n(r(a,c))||0:n(a.y1)}).attr("height",function(a,c,d){return b[d].nonStackable?Math.max(Math.abs(n(r(a,c))-n(0)),1)||0:Math.max(Math.abs(n(a.y+a.y0)-n(a.y0)),1)}).attr("x",function(a,c,d){var e=0;return b[d].nonStackable&&(e=a.series*m.rangeBand()/b.length,b.length!==G&&(e=b[d].nonStackableSeries*m.rangeBand()/(2*G))),e}).attr("width",function(a,c,d){if(b[d].nonStackable){var e=m.rangeBand()/G;return b.length!==G&&(e=m.rangeBand()/(2*G)),e}return m.rangeBand()}):R.attr("x",function(a){return a.series*m.rangeBand()/b.length}).attr("width",m.rangeBand()/b.length).attr("y",function(a,b){return r(a,b)<0?n(0):n(0)-n(r(a,b))<1?n(0)-1:n(r(a,b))||0}).attr("height",function(a,b){return Math.max(Math.abs(n(r(a,b))-n(0)),1)||0}),h=m.copy(),i=n.copy(),b[0]&&b[0].values&&(D=b[0].values.length)}),C.renderEnd("multibar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=d3.scale.ordinal(),n=d3.scale.linear(),o=Math.floor(1e4*Math.random()),p=null,q=function(a){return a.x},r=function(a){return a.y},s=[0],t=!0,u=!1,v="zero",w=a.utils.defaultColor(),x=!1,y=null,z=500,A=.1,B=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),C=a.utils.renderWatch(B,z),D=0;return b.dispatch=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return s},set:function(a){s=a}},stacked:{get:function(){return u},set:function(a){u=a}},stackOffset:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return t},set:function(a){t=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return o},set:function(a){o=a}},hideable:{get:function(){return x},set:function(a){x=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return z},set:function(a){z=a,C.reset(z)}},color:{get:function(){return w},set:function(b){w=a.utils.getColor(b)}},barColor:{get:function(){return y},set:function(b){y=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarChart=function(){"use strict";function b(j){return D.reset(),D.models(e),r&&D.models(f),s&&D.models(g),j.each(function(j){var z=d3.select(this);a.utils.initSVG(z);var D=a.utils.availableWidth(l,z,k),H=a.utils.availableHeight(m,z,k);if(b.update=function(){0===C?z.call(b):z.transition().duration(C).call(b)},b.container=this,x.setter(G(j),b.update).getter(F(j)).update(),x.disabled=j.map(function(a){return!!a.disabled}),!y){var I;y={};for(I in x)y[I]=x[I]instanceof Array?x[I].slice(0):x[I]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,z),b;z.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale(); -var J=z.selectAll("g.nv-wrap.nv-multiBarWithLegend").data([j]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarWithLegend").append("g"),L=J.select("g");if(K.append("g").attr("class","nv-x nv-axis"),K.append("g").attr("class","nv-y nv-axis"),K.append("g").attr("class","nv-barsWrap"),K.append("g").attr("class","nv-legendWrap"),K.append("g").attr("class","nv-controlsWrap"),q&&(h.width(D-B()),L.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),H=a.utils.availableHeight(m,z,k)),L.select(".nv-legendWrap").attr("transform","translate("+B()+","+-k.top+")")),o){var M=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(B()).color(["#444","#444","#444"]),L.select(".nv-controlsWrap").datum(M).attr("transform","translate(0,"+-k.top+")").call(i)}J.attr("transform","translate("+k.left+","+k.top+")"),t&&L.select(".nv-y.nv-axis").attr("transform","translate("+D+",0)"),e.disabled(j.map(function(a){return a.disabled})).width(D).height(H).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var N=L.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(N.call(e),r){f.scale(c)._ticks(a.utils.calcTicksX(D/100,j)).tickSize(-H,0),L.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),L.select(".nv-x.nv-axis").call(f);var O=L.select(".nv-x.nv-axis > g").selectAll("g");if(O.selectAll("line, text").style("opacity",1),v){var P=function(a,b){return"translate("+a+","+b+")"},Q=5,R=17;O.selectAll("text").attr("transform",function(a,b,c){return P(0,c%2==0?Q:R)});var S=d3.selectAll(".nv-x.nv-axis .nv-wrap g g text")[0].length;L.selectAll(".nv-x.nv-axis .nv-axisMaxMin text").attr("transform",function(a,b){return P(0,0===b||S%2!==0?R:Q)})}u&&O.filter(function(a,b){return b%Math.ceil(j[0].values.length/(D/100))!==0}).selectAll("text, line").style("opacity",0),w&&O.selectAll(".tick text").attr("transform","rotate("+w+" 0,0)").style("text-anchor",w>0?"start":"end"),L.select(".nv-x.nv-axis").selectAll("g.nv-axisMaxMin text").style("opacity",1)}s&&(g.scale(d)._ticks(a.utils.calcTicksY(H/36,j)).tickSize(-D,0),L.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)x[c]=a[c];A.stateChange(x),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(M=M.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":case p.grouped:e.stacked(!1);break;case"Stacked":case p.stacked:e.stacked(!0)}x.stacked=e.stacked(),A.stateChange(x),b.update()}}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),x.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),x.stacked=a.stacked,E=a.stacked),b.update()})}),D.renderEnd("multibarchart immediate"),b}var c,d,e=a.models.multiBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=0,x=a.utils.state(),y=null,z=null,A=d3.dispatch("stateChange","changeState","renderEnd"),B=function(){return o?180:0},C=250;x.stacked=!1,e.stacked(!1),f.orient("bottom").tickPadding(7).showMaxMin(!1).tickFormat(function(a){return a}),g.orient(t?"right":"left").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var D=a.utils.renderWatch(A),E=!1,F=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:E}}},G=function(a){return function(b){void 0!==b.stacked&&(E=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=A,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=x,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return y},set:function(a){y=a}},noData:{get:function(){return z},set:function(a){z=a}},reduceXTicks:{get:function(){return u},set:function(a){u=a}},rotateLabels:{get:function(){return w},set:function(a){w=a}},staggerLabels:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return C},set:function(a){C=a,e.duration(C),f.duration(C),g.duration(C),D.reset(C)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiBarHorizontal=function(){"use strict";function b(m){return E.reset(),m.each(function(b){var m=k-j.left-j.right,C=l-j.top-j.bottom;n=d3.select(this),a.utils.initSVG(n),w&&(b=d3.layout.stack().offset("zero").values(function(a){return a.values}).y(r)(b)),b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),w&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a){var b=a.values[c];b.size=Math.abs(b.y),b.y<0?(b.y1=e-b.size,e-=b.size):(b.y1=d,d+=b.size)})});var F=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:q(a,b),y:r(a,b),y0:a.y0,y1:a.y1}})});o.domain(d||d3.merge(F).map(function(a){return a.x})).rangeBands(f||[0,C],A),p.domain(e||d3.extent(d3.merge(F).map(function(a){return w?a.y>0?a.y1+a.y:a.y1:a.y}).concat(t))),p.range(x&&!w?g||[p.domain()[0]<0?z:0,m-(p.domain()[1]>0?z:0)]:g||[0,m]),h=h||o,i=i||d3.scale.linear().domain(p.domain()).range([p(0),p(0)]);{var G=d3.select(this).selectAll("g.nv-wrap.nv-multibarHorizontal").data([b]),H=G.enter().append("g").attr("class","nvd3 nv-wrap nv-multibarHorizontal"),I=(H.append("defs"),H.append("g"));G.select("g")}I.append("g").attr("class","nv-groups"),G.attr("transform","translate("+j.left+","+j.top+")");var J=G.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});J.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),J.exit().watchTransition(E,"multibarhorizontal: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),J.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return u(a,b)}).style("stroke",function(a,b){return u(a,b)}),J.watchTransition(E,"multibarhorizontal: groups").style("stroke-opacity",1).style("fill-opacity",.75);var K=J.selectAll("g.nv-bar").data(function(a){return a.values});K.exit().remove();var L=K.enter().append("g").attr("transform",function(a,c,d){return"translate("+i(w?a.y0:0)+","+(w?0:d*o.rangeBand()/b.length+o(q(a,c)))+")"});L.append("rect").attr("width",0).attr("height",o.rangeBand()/(w?1:b.length)),K.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),D.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),D.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){D.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){D.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){D.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){D.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),s(b[0],0)&&(L.append("polyline"),K.select("polyline").attr("fill","none").attr("points",function(a,c){var d=s(a,c),e=.8*o.rangeBand()/(2*(w?1:b.length));d=d.length?d:[-Math.abs(d),Math.abs(d)],d=d.map(function(a){return p(a)-p(0)});var f=[[d[0],-e],[d[0],e],[d[0],0],[d[1],0],[d[1],-e],[d[1],e]];return f.map(function(a){return a.join(",")}).join(" ")}).attr("transform",function(a,c){var d=o.rangeBand()/(2*(w?1:b.length));return"translate("+(r(a,c)<0?0:p(r(a,c))-p(0))+", "+d+")"})),L.append("text"),x&&!w?(K.select("text").attr("text-anchor",function(a,b){return r(a,b)<0?"end":"start"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){var c=B(r(a,b)),d=s(a,b);return void 0===d?c:d.length?c+"+"+B(Math.abs(d[1]))+"-"+B(Math.abs(d[0])):c+"±"+B(Math.abs(d))}),K.watchTransition(E,"multibarhorizontal: bars").select("text").attr("x",function(a,b){return r(a,b)<0?-4:p(r(a,b))-p(0)+4})):K.selectAll("text").text(""),y&&!w?(L.append("text").classed("nv-bar-label",!0),K.select("text.nv-bar-label").attr("text-anchor",function(a,b){return r(a,b)<0?"start":"end"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){return q(a,b)}),K.watchTransition(E,"multibarhorizontal: bars").select("text.nv-bar-label").attr("x",function(a,b){return r(a,b)<0?p(0)-p(r(a,b))+4:-4})):K.selectAll("text.nv-bar-label").text(""),K.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}),v&&(c||(c=b.map(function(){return!0})),K.style("fill",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()})),w?K.watchTransition(E,"multibarhorizontal: bars").attr("transform",function(a,b){return"translate("+p(a.y1)+","+o(q(a,b))+")"}).select("rect").attr("width",function(a,b){return Math.abs(p(r(a,b)+a.y0)-p(a.y0))}).attr("height",o.rangeBand()):K.watchTransition(E,"multibarhorizontal: bars").attr("transform",function(a,c){return"translate("+p(r(a,c)<0?r(a,c):0)+","+(a.series*o.rangeBand()/b.length+o(q(a,c)))+")"}).select("rect").attr("height",o.rangeBand()/b.length).attr("width",function(a,b){return Math.max(Math.abs(p(r(a,b))-p(0)),1)}),h=o.copy(),i=p.copy()}),E.renderEnd("multibarHorizontal immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=null,o=d3.scale.ordinal(),p=d3.scale.linear(),q=function(a){return a.x},r=function(a){return a.y},s=function(a){return a.yErr},t=[0],u=a.utils.defaultColor(),v=null,w=!1,x=!1,y=!1,z=60,A=.1,B=d3.format(",.2f"),C=250,D=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),E=a.utils.renderWatch(D,C);return b.dispatch=D,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},yErr:{get:function(){return s},set:function(a){s=a}},xScale:{get:function(){return o},set:function(a){o=a}},yScale:{get:function(){return p},set:function(a){p=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return t},set:function(a){t=a}},stacked:{get:function(){return w},set:function(a){w=a}},showValues:{get:function(){return x},set:function(a){x=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return m},set:function(a){m=a}},valueFormat:{get:function(){return B},set:function(a){B=a}},valuePadding:{get:function(){return z},set:function(a){z=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return C},set:function(a){C=a,E.reset(C)}},color:{get:function(){return u},set:function(b){u=a.utils.getColor(b)}},barColor:{get:function(){return v},set:function(b){v=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarHorizontalChart=function(){"use strict";function b(j){return C.reset(),C.models(e),r&&C.models(f),s&&C.models(g),j.each(function(j){var w=d3.select(this);a.utils.initSVG(w);var C=a.utils.availableWidth(l,w,k),D=a.utils.availableHeight(m,w,k);if(b.update=function(){w.transition().duration(z).call(b)},b.container=this,t=e.stacked(),u.setter(B(j),b.update).getter(A(j)).update(),u.disabled=j.map(function(a){return!!a.disabled}),!v){var E;v={};for(E in u)v[E]=u[E]instanceof Array?u[E].slice(0):u[E]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,w),b;w.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var F=w.selectAll("g.nv-wrap.nv-multiBarHorizontalChart").data([j]),G=F.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarHorizontalChart").append("g"),H=F.select("g");if(G.append("g").attr("class","nv-x nv-axis"),G.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),G.append("g").attr("class","nv-barsWrap"),G.append("g").attr("class","nv-legendWrap"),G.append("g").attr("class","nv-controlsWrap"),q&&(h.width(C-y()),H.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),D=a.utils.availableHeight(m,w,k)),H.select(".nv-legendWrap").attr("transform","translate("+y()+","+-k.top+")")),o){var I=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(y()).color(["#444","#444","#444"]),H.select(".nv-controlsWrap").datum(I).attr("transform","translate(0,"+-k.top+")").call(i)}F.attr("transform","translate("+k.left+","+k.top+")"),e.disabled(j.map(function(a){return a.disabled})).width(C).height(D).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var J=H.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(J.transition().call(e),r){f.scale(c)._ticks(a.utils.calcTicksY(D/24,j)).tickSize(-C,0),H.select(".nv-x.nv-axis").call(f);var K=H.select(".nv-x.nv-axis").selectAll("g");K.selectAll("line, text")}s&&(g.scale(d)._ticks(a.utils.calcTicksX(C/100,j)).tickSize(-D,0),H.select(".nv-y.nv-axis").attr("transform","translate(0,"+D+")"),H.select(".nv-y.nv-axis").call(g)),H.select(".nv-zeroLine line").attr("x1",d(0)).attr("x2",d(0)).attr("y1",0).attr("y2",-D),h.dispatch.on("stateChange",function(a){for(var c in a)u[c]=a[c];x.stateChange(u),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(I=I.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":e.stacked(!1);break;case"Stacked":e.stacked(!0)}u.stacked=e.stacked(),x.stateChange(u),t=e.stacked(),b.update()}}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),u.stacked=a.stacked,t=a.stacked),b.update()})}),C.renderEnd("multibar horizontal chart immediate"),b}var c,d,e=a.models.multiBarHorizontal(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend().height(30),i=a.models.legend().height(30),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=a.utils.state(),v=null,w=null,x=d3.dispatch("stateChange","changeState","renderEnd"),y=function(){return o?180:0},z=250;u.stacked=!1,e.stacked(t),f.orient("left").tickPadding(5).showMaxMin(!1).tickFormat(function(a){return a}),g.orient("bottom").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var A=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:t}}},B=function(a){return function(b){void 0!==b.stacked&&(t=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},C=a.utils.renderWatch(x,z);return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=x,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=u,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return z},set:function(a){z=a,C.reset(z),e.duration(z),f.duration(z),g.duration(z)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiChart=function(){"use strict";function b(j){return j.each(function(j){function k(a){var b=2===j[a.seriesIndex].yAxis?z:y;a.value=a.point.x,a.series={value:a.point.y,color:a.point.color},B.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function l(a){var b=2===j[a.seriesIndex].yAxis?z:y;a.point.x=v.x()(a.point),a.point.y=v.y()(a.point),B.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function n(a){var b=2===j[a.data.series].yAxis?z:y;a.value=t.x()(a.data),a.series={value:t.y()(a.data),color:a.color},B.duration(0).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).hidden(!1)}var C=d3.select(this);a.utils.initSVG(C),b.update=function(){C.transition().call(b)},b.container=this;var D=a.utils.availableWidth(g,C,e),E=a.utils.availableHeight(h,C,e),F=j.filter(function(a){return"line"==a.type&&1==a.yAxis}),G=j.filter(function(a){return"line"==a.type&&2==a.yAxis}),H=j.filter(function(a){return"bar"==a.type&&1==a.yAxis}),I=j.filter(function(a){return"bar"==a.type&&2==a.yAxis}),J=j.filter(function(a){return"area"==a.type&&1==a.yAxis}),K=j.filter(function(a){return"area"==a.type&&2==a.yAxis});if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,C),b;C.selectAll(".nv-noData").remove();var L=j.filter(function(a){return!a.disabled&&1==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})}),M=j.filter(function(a){return!a.disabled&&2==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})});o.domain(d3.extent(d3.merge(L.concat(M)),function(a){return a.x})).range([0,D]);var N=C.selectAll("g.wrap.multiChart").data([j]),O=N.enter().append("g").attr("class","wrap nvd3 multiChart").append("g");O.append("g").attr("class","nv-x nv-axis"),O.append("g").attr("class","nv-y1 nv-axis"),O.append("g").attr("class","nv-y2 nv-axis"),O.append("g").attr("class","lines1Wrap"),O.append("g").attr("class","lines2Wrap"),O.append("g").attr("class","bars1Wrap"),O.append("g").attr("class","bars2Wrap"),O.append("g").attr("class","stack1Wrap"),O.append("g").attr("class","stack2Wrap"),O.append("g").attr("class","legendWrap");var P=N.select("g"),Q=j.map(function(a,b){return j[b].color||f(a,b)});if(i){var R=A.align()?D/2:D,S=A.align()?R:0;A.width(R),A.color(Q),P.select(".legendWrap").datum(j.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(1==a.yAxis?"":" (right axis)"),a})).call(A),e.top!=A.height()&&(e.top=A.height(),E=a.utils.availableHeight(h,C,e)),P.select(".legendWrap").attr("transform","translate("+S+","+-e.top+")")}r.width(D).height(E).interpolate(m).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"line"==j[b].type})),s.width(D).height(E).interpolate(m).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"line"==j[b].type})),t.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"bar"==j[b].type})),u.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"bar"==j[b].type})),v.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"area"==j[b].type})),w.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"area"==j[b].type})),P.attr("transform","translate("+e.left+","+e.top+")");var T=P.select(".lines1Wrap").datum(F.filter(function(a){return!a.disabled})),U=P.select(".bars1Wrap").datum(H.filter(function(a){return!a.disabled})),V=P.select(".stack1Wrap").datum(J.filter(function(a){return!a.disabled})),W=P.select(".lines2Wrap").datum(G.filter(function(a){return!a.disabled})),X=P.select(".bars2Wrap").datum(I.filter(function(a){return!a.disabled})),Y=P.select(".stack2Wrap").datum(K.filter(function(a){return!a.disabled})),Z=J.length?J.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[],$=K.length?K.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[];p.domain(c||d3.extent(d3.merge(L).concat(Z),function(a){return a.y})).range([0,E]),q.domain(d||d3.extent(d3.merge(M).concat($),function(a){return a.y})).range([0,E]),r.yDomain(p.domain()),t.yDomain(p.domain()),v.yDomain(p.domain()),s.yDomain(q.domain()),u.yDomain(q.domain()),w.yDomain(q.domain()),J.length&&d3.transition(V).call(v),K.length&&d3.transition(Y).call(w),H.length&&d3.transition(U).call(t),I.length&&d3.transition(X).call(u),F.length&&d3.transition(T).call(r),G.length&&d3.transition(W).call(s),x._ticks(a.utils.calcTicksX(D/100,j)).tickSize(-E,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+E+")"),d3.transition(P.select(".nv-x.nv-axis")).call(x),y._ticks(a.utils.calcTicksY(E/36,j)).tickSize(-D,0),d3.transition(P.select(".nv-y1.nv-axis")).call(y),z._ticks(a.utils.calcTicksY(E/36,j)).tickSize(-D,0),d3.transition(P.select(".nv-y2.nv-axis")).call(z),P.select(".nv-y1.nv-axis").classed("nv-disabled",L.length?!1:!0).attr("transform","translate("+o.range()[0]+",0)"),P.select(".nv-y2.nv-axis").classed("nv-disabled",M.length?!1:!0).attr("transform","translate("+o.range()[1]+",0)"),A.dispatch.on("stateChange",function(){b.update()}),r.dispatch.on("elementMouseover.tooltip",k),s.dispatch.on("elementMouseover.tooltip",k),r.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),s.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),v.dispatch.on("elementMouseover.tooltip",l),w.dispatch.on("elementMouseover.tooltip",l),v.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),w.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),t.dispatch.on("elementMouseover.tooltip",n),u.dispatch.on("elementMouseover.tooltip",n),t.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),u.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),t.dispatch.on("elementMousemove.tooltip",function(){B.position({top:d3.event.pageY,left:d3.event.pageX})()}),u.dispatch.on("elementMousemove.tooltip",function(){B.position({top:d3.event.pageY,left:d3.event.pageX})()})}),b}var c,d,e={top:30,right:20,bottom:50,left:60},f=a.utils.defaultColor(),g=null,h=null,i=!0,j=null,k=function(a){return a.x},l=function(a){return a.y},m="monotone",n=!0,o=d3.scale.linear(),p=d3.scale.linear(),q=d3.scale.linear(),r=a.models.line().yScale(p),s=a.models.line().yScale(q),t=a.models.multiBar().stacked(!1).yScale(p),u=a.models.multiBar().stacked(!1).yScale(q),v=a.models.stackedArea().yScale(p),w=a.models.stackedArea().yScale(q),x=a.models.axis().scale(o).orient("bottom").tickPadding(5),y=a.models.axis().scale(p).orient("left"),z=a.models.axis().scale(q).orient("right"),A=a.models.legend().height(30),B=a.models.tooltip(),C=d3.dispatch();return b.dispatch=C,b.lines1=r,b.lines2=s,b.bars1=t,b.bars2=u,b.stack1=v,b.stack2=w,b.xAxis=x,b.yAxis1=y,b.yAxis2=z,b.tooltip=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},showLegend:{get:function(){return i},set:function(a){i=a}},yDomain1:{get:function(){return c},set:function(a){c=a}},yDomain2:{get:function(){return d},set:function(a){d=a}},noData:{get:function(){return j},set:function(a){j=a}},interpolate:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return B.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),B.enabled(!!b)}},tooltipContent:{get:function(){return B.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),B.contentGenerator(b)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return f},set:function(b){f=a.utils.getColor(b)}},x:{get:function(){return k},set:function(a){k=a,r.x(a),s.x(a),t.x(a),u.x(a),v.x(a),w.x(a)}},y:{get:function(){return l},set:function(a){l=a,r.y(a),s.y(a),v.y(a),w.y(a),t.y(a),u.y(a)}},useVoronoi:{get:function(){return n},set:function(a){n=a,r.useVoronoi(a),s.useVoronoi(a),v.useVoronoi(a),w.useVoronoi(a)}}}),a.utils.initOptions(b),b},a.models.ohlcBar=function(){"use strict";function b(y){return y.each(function(b){k=d3.select(this);var y=a.utils.availableWidth(h,k,g),A=a.utils.availableHeight(i,k,g);a.utils.initSVG(k);var B=y/b[0].values.length*.9;l.domain(c||d3.extent(b[0].values.map(n).concat(t))),l.range(v?e||[.5*y/b[0].values.length,y*(b[0].values.length-.5)/b[0].values.length]:e||[5+B/2,y-B/2-5]),m.domain(d||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(f||[A,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var C=d3.select(this).selectAll("g.nv-wrap.nv-ohlcBar").data([b[0].values]),D=C.enter().append("g").attr("class","nvd3 nv-wrap nv-ohlcBar"),E=D.append("defs"),F=D.append("g"),G=C.select("g");F.append("g").attr("class","nv-ticks"),C.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:j})}),E.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),C.select("#nv-chart-clip-path-"+j+" rect").attr("width",y).attr("height",A),G.attr("clip-path",w?"url(#nv-chart-clip-path-"+j+")":"");var H=C.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});H.exit().remove(),H.enter().append("path").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}).attr("d",function(a,b){return"m0,0l0,"+(m(p(a,b))-m(r(a,b)))+"l"+-B/2+",0l"+B/2+",0l0,"+(m(s(a,b))-m(p(a,b)))+"l0,"+(m(q(a,b))-m(s(a,b)))+"l"+B/2+",0l"+-B/2+",0z"}).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("fill",function(){return x[0]}).attr("stroke",function(){return x[0]}).attr("x",0).attr("y",function(a,b){return m(Math.max(0,o(a,b)))}).attr("height",function(a,b){return Math.abs(m(o(a,b))-m(0))}),H.attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}),d3.transition(H).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("d",function(a,c){var d=y/b[0].values.length*.9;return"m0,0l0,"+(m(p(a,c))-m(r(a,c)))+"l"+-d/2+",0l"+d/2+",0l0,"+(m(s(a,c))-m(p(a,c)))+"l0,"+(m(q(a,c))-m(s(a,c)))+"l"+d/2+",0l"+-d/2+",0z"})}),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,c){b.clearHighlights(),k.select(".nv-ohlcBar .nv-tick-0-"+a).classed("hover",c)},b.clearHighlights=function(){k.select(".nv-ohlcBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!=a.top?a.top:g.top,g.right=void 0!=a.right?a.right:g.right,g.bottom=void 0!=a.bottom?a.bottom:g.bottom,g.left=void 0!=a.left?a.left:g.left -}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.parallelCoordinates=function(){"use strict";function b(p){return p.each(function(b){function p(a){return F(h.map(function(b){if(isNaN(a[b])||isNaN(parseFloat(a[b]))){var c=g[b].domain(),d=g[b].range(),e=c[0]-(c[1]-c[0])/9;if(J.indexOf(b)<0){var h=d3.scale.linear().domain([e,c[1]]).range([x-12,d[1]]);g[b].brush.y(h),J.push(b)}return[f(b),g[b](e)]}return J.length>0?(D.style("display","inline"),E.style("display","inline")):(D.style("display","none"),E.style("display","none")),[f(b),g[b](a[b])]}))}function q(){var a=h.filter(function(a){return!g[a].brush.empty()}),b=a.map(function(a){return g[a].brush.extent()});k=[],a.forEach(function(a,c){k[c]={dimension:a,extent:b[c]}}),l=[],M.style("display",function(c){var d=a.every(function(a,d){return isNaN(c[a])&&b[d][0]==g[a].brush.y().domain()[0]?!0:b[d][0]<=c[a]&&c[a]<=b[d][1]});return d&&l.push(c),d?null:"none"}),o.brush({filters:k,active:l})}function r(a){m[a]=this.parentNode.__origin__=f(a),L.attr("visibility","hidden")}function s(a){m[a]=Math.min(w,Math.max(0,this.parentNode.__origin__+=d3.event.x)),M.attr("d",p),h.sort(function(a,b){return u(a)-u(b)}),f.domain(h),N.attr("transform",function(a){return"translate("+u(a)+")"})}function t(a){delete this.parentNode.__origin__,delete m[a],d3.select(this.parentNode).attr("transform","translate("+f(a)+")"),M.attr("d",p),L.attr("d",p).attr("visibility",null)}function u(a){var b=m[a];return null==b?f(a):b}var v=d3.select(this),w=a.utils.availableWidth(d,v,c),x=a.utils.availableHeight(e,v,c);a.utils.initSVG(v),l=b,f.rangePoints([0,w],1).domain(h);var y={};h.forEach(function(a){var c=d3.extent(b,function(b){return+b[a]});return y[a]=!1,void 0===c[0]&&(y[a]=!0,c[0]=0,c[1]=0),c[0]===c[1]&&(c[0]=c[0]-1,c[1]=c[1]+1),g[a]=d3.scale.linear().domain(c).range([.9*(x-12),0]),g[a].brush=d3.svg.brush().y(g[a]).on("brush",q),"name"!=a});var z=v.selectAll("g.nv-wrap.nv-parallelCoordinates").data([b]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-parallelCoordinates"),B=A.append("g"),C=z.select("g");B.append("g").attr("class","nv-parallelCoordinates background"),B.append("g").attr("class","nv-parallelCoordinates foreground"),B.append("g").attr("class","nv-parallelCoordinates missingValuesline"),z.attr("transform","translate("+c.left+","+c.top+")");var D,E,F=d3.svg.line().interpolate("cardinal").tension(n),G=d3.svg.axis().orient("left"),H=d3.behavior.drag().on("dragstart",r).on("drag",s).on("dragend",t),I=f.range()[1]-f.range()[0],J=[],K=[0+I/2,x-12,w-I/2,x-12];D=z.select(".missingValuesline").selectAll("line").data([K]),D.enter().append("line"),D.exit().remove(),D.attr("x1",function(a){return a[0]}).attr("y1",function(a){return a[1]}).attr("x2",function(a){return a[2]}).attr("y2",function(a){return a[3]}),E=z.select(".missingValuesline").selectAll("text").data(["undefined values"]),E.append("text").data(["undefined values"]),E.enter().append("text"),E.exit().remove(),E.attr("y",x).attr("x",w-92-I/2).text(function(a){return a});var L=z.select(".background").selectAll("path").data(b);L.enter().append("path"),L.exit().remove(),L.attr("d",p);var M=z.select(".foreground").selectAll("path").data(b);M.enter().append("path"),M.exit().remove(),M.attr("d",p).attr("stroke",j),M.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),o.elementMouseover({label:a.name,data:a.data,index:b,pos:[d3.mouse(this.parentNode)[0],d3.mouse(this.parentNode)[1]]})}),M.on("mouseout",function(a,b){d3.select(this).classed("hover",!1),o.elementMouseout({label:a.name,data:a.data,index:b})});var N=C.selectAll(".dimension").data(h),O=N.enter().append("g").attr("class","nv-parallelCoordinates dimension");O.append("g").attr("class","nv-parallelCoordinates nv-axis"),O.append("g").attr("class","nv-parallelCoordinates-brush"),O.append("text").attr("class","nv-parallelCoordinates nv-label"),N.attr("transform",function(a){return"translate("+f(a)+",0)"}),N.exit().remove(),N.select(".nv-label").style("cursor","move").attr("dy","-1em").attr("text-anchor","middle").text(String).on("mouseover",function(a){o.elementMouseover({dim:a,pos:[d3.mouse(this.parentNode.parentNode)[0],d3.mouse(this.parentNode.parentNode)[1]]})}).on("mouseout",function(a){o.elementMouseout({dim:a})}).call(H),N.select(".nv-axis").each(function(a,b){d3.select(this).call(G.scale(g[a]).tickFormat(d3.format(i[b])))}),N.select(".nv-parallelCoordinates-brush").each(function(a){d3.select(this).call(g[a].brush)}).selectAll("rect").attr("x",-8).attr("width",16)}),b}var c={top:30,right:0,bottom:10,left:0},d=null,e=null,f=d3.scale.ordinal(),g={},h=[],i=[],j=a.utils.defaultColor(),k=[],l=[],m=[],n=1,o=d3.dispatch("brush","elementMouseover","elementMouseout");return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},dimensionNames:{get:function(){return h},set:function(a){h=a}},dimensionFormats:{get:function(){return i},set:function(a){i=a}},lineTension:{get:function(){return n},set:function(a){n=a}},dimensions:{get:function(){return h},set:function(b){a.deprecated("dimensions","use dimensionNames instead"),h=b}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.pie=function(){"use strict";function b(E){return D.reset(),E.each(function(b){function E(a,b){a.endAngle=isNaN(a.endAngle)?0:a.endAngle,a.startAngle=isNaN(a.startAngle)?0:a.startAngle,p||(a.innerRadius=0);var c=d3.interpolate(this._current,a);return this._current=c(0),function(a){return B[b](c(a))}}var F=d-c.left-c.right,G=e-c.top-c.bottom,H=Math.min(F,G)/2,I=[],J=[];if(i=d3.select(this),0===z.length)for(var K=H-H/5,L=y*H,M=0;Mc)return"";if("function"==typeof n)d=n(a,b,{key:f(a.data),value:g(a.data),percent:k(c)});else switch(n){case"key":d=f(a.data);break;case"value":d=k(g(a.data));break;case"percent":d=d3.format("%")(c)}return d})}}),D.renderEnd("pie immediate"),b}var c={top:0,right:0,bottom:0,left:0},d=500,e=500,f=function(a){return a.x},g=function(a){return a.y},h=Math.floor(1e4*Math.random()),i=null,j=a.utils.defaultColor(),k=d3.format(",.2f"),l=!0,m=!1,n="key",o=.02,p=!1,q=!1,r=!0,s=0,t=!1,u=!1,v=!1,w=!1,x=0,y=.5,z=[],A=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),B=[],C=[],D=a.utils.renderWatch(A);return b.dispatch=A,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{arcsRadius:{get:function(){return z},set:function(a){z=a}},width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},showLabels:{get:function(){return l},set:function(a){l=a}},title:{get:function(){return q},set:function(a){q=a}},titleOffset:{get:function(){return s},set:function(a){s=a}},labelThreshold:{get:function(){return o},set:function(a){o=a}},valueFormat:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return h},set:function(a){h=a}},endAngle:{get:function(){return w},set:function(a){w=a}},startAngle:{get:function(){return u},set:function(a){u=a}},padAngle:{get:function(){return v},set:function(a){v=a}},cornerRadius:{get:function(){return x},set:function(a){x=a}},donutRatio:{get:function(){return y},set:function(a){y=a}},labelsOutside:{get:function(){return m},set:function(a){m=a}},labelSunbeamLayout:{get:function(){return t},set:function(a){t=a}},donut:{get:function(){return p},set:function(a){p=a}},growOnHover:{get:function(){return r},set:function(a){r=a}},pieLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("pieLabelsOutside","use labelsOutside instead")}},donutLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("donutLabelsOutside","use labelsOutside instead")}},labelFormat:{get:function(){return k},set:function(b){k=b,a.deprecated("labelFormat","use valueFormat instead")}},margin:{get:function(){return c},set:function(a){c.top="undefined"!=typeof a.top?a.top:c.top,c.right="undefined"!=typeof a.right?a.right:c.right,c.bottom="undefined"!=typeof a.bottom?a.bottom:c.bottom,c.left="undefined"!=typeof a.left?a.left:c.left}},y:{get:function(){return g},set:function(a){g=d3.functor(a)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},labelType:{get:function(){return n},set:function(a){n=a||"key"}}}),a.utils.initOptions(b),b},a.models.pieChart=function(){"use strict";function b(e){return q.reset(),q.models(c),e.each(function(e){var k=d3.select(this);a.utils.initSVG(k);var n=a.utils.availableWidth(g,k,f),o=a.utils.availableHeight(h,k,f);if(b.update=function(){k.transition().call(b)},b.container=this,l.setter(s(e),b.update).getter(r(e)).update(),l.disabled=e.map(function(a){return!!a.disabled}),!m){var q;m={};for(q in l)m[q]=l[q]instanceof Array?l[q].slice(0):l[q]}if(!e||!e.length)return a.utils.noData(b,k),b;k.selectAll(".nv-noData").remove();var t=k.selectAll("g.nv-wrap.nv-pieChart").data([e]),u=t.enter().append("g").attr("class","nvd3 nv-wrap nv-pieChart").append("g"),v=t.select("g");if(u.append("g").attr("class","nv-pieWrap"),u.append("g").attr("class","nv-legendWrap"),i)if("top"===j)d.width(n).key(c.x()),t.select(".nv-legendWrap").datum(e).call(d),f.top!=d.height()&&(f.top=d.height(),o=a.utils.availableHeight(h,k,f)),t.select(".nv-legendWrap").attr("transform","translate(0,"+-f.top+")");else if("right"===j){var w=a.models.legend().width();w>n/2&&(w=n/2),d.height(o).key(c.x()),d.width(w),n-=d.width(),t.select(".nv-legendWrap").datum(e).call(d).attr("transform","translate("+n+",0)")}t.attr("transform","translate("+f.left+","+f.top+")"),c.width(n).height(o);var x=v.select(".nv-pieWrap").datum([e]);d3.transition(x).call(c),d.dispatch.on("stateChange",function(a){for(var c in a)l[c]=a[c];p.stateChange(l),b.update()}),p.on("changeState",function(a){"undefined"!=typeof a.disabled&&(e.forEach(function(b,c){b.disabled=a.disabled[c]}),l.disabled=a.disabled),b.update()})}),q.renderEnd("pieChart immediate"),b}var c=a.models.pie(),d=a.models.legend(),e=a.models.tooltip(),f={top:30,right:20,bottom:20,left:20},g=null,h=null,i=!0,j="top",k=a.utils.defaultColor(),l=a.utils.state(),m=null,n=null,o=250,p=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd");e.headerEnabled(!1).duration(0).valueFormatter(function(a,b){return c.valueFormat()(a,b)});var q=a.utils.renderWatch(p),r=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},s=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},e.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){e.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){e.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.legend=d,b.dispatch=p,b.pie=c,b.tooltip=e,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return i},set:function(a){i=a}},legendPosition:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return e.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),e.enabled(!!b)}},tooltipContent:{get:function(){return e.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),e.contentGenerator(b)}},color:{get:function(){return k},set:function(a){k=a,d.color(k),c.color(k)}},duration:{get:function(){return o},set:function(a){o=a,q.reset(o)}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.scatter=function(){"use strict";function b(N){return P.reset(),N.each(function(b){function N(){if(O=!1,!w)return!1;if(M===!0){var a=d3.merge(b.map(function(a,b){return a.values.map(function(a,c){var d=p(a,c),e=q(a,c);return[m(d)+1e-4*Math.random(),n(e)+1e-4*Math.random(),b,c,a]}).filter(function(a,b){return x(a[4],b)})}));if(0==a.length)return!1;a.length<3&&(a.push([m.range()[0]-20,n.range()[0]-20,null,null]),a.push([m.range()[1]+20,n.range()[1]+20,null,null]),a.push([m.range()[0]-20,n.range()[0]+20,null,null]),a.push([m.range()[1]+20,n.range()[1]-20,null,null]));var c=d3.geom.polygon([[-10,-10],[-10,i+10],[h+10,i+10],[h+10,-10]]),d=d3.geom.voronoi(a).map(function(b,d){return{data:c.clip(b),series:a[d][2],point:a[d][3]}});U.select(".nv-point-paths").selectAll("path").remove();var e=U.select(".nv-point-paths").selectAll("path").data(d),f=e.enter().append("svg:path").attr("d",function(a){return a&&a.data&&0!==a.data.length?"M"+a.data.join(",")+"Z":"M 0 0"}).attr("id",function(a,b){return"nv-path-"+b}).attr("clip-path",function(a,b){return"url(#nv-clip-"+b+")"});C&&f.style("fill",d3.rgb(230,230,230)).style("fill-opacity",.4).style("stroke-opacity",1).style("stroke",d3.rgb(200,200,200)),B&&(U.select(".nv-point-clips").selectAll("clipPath").remove(),U.select(".nv-point-clips").selectAll("clipPath").data(a).enter().append("svg:clipPath").attr("id",function(a,b){return"nv-clip-"+b}).append("svg:circle").attr("cx",function(a){return a[0]}).attr("cy",function(a){return a[1]}).attr("r",D));var k=function(a,c){if(O)return 0;var d=b[a.series];if(void 0!==d){var e=d.values[a.point];e.color=j(d,a.series),e.x=p(e),e.y=q(e);var f=l.node().getBoundingClientRect(),h=window.pageYOffset||document.documentElement.scrollTop,i=window.pageXOffset||document.documentElement.scrollLeft,k={left:m(p(e,a.point))+f.left+i+g.left+10,top:n(q(e,a.point))+f.top+h+g.top+10};c({point:e,series:d,pos:k,seriesIndex:a.series,pointIndex:a.point})}};e.on("click",function(a){k(a,L.elementClick)}).on("dblclick",function(a){k(a,L.elementDblClick)}).on("mouseover",function(a){k(a,L.elementMouseover)}).on("mouseout",function(a){k(a,L.elementMouseout)})}else U.select(".nv-groups").selectAll(".nv-group").selectAll(".nv-point").on("click",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("dblclick",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementDblClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("mouseover",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseover({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c,color:j(a,c)})}).on("mouseout",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseout({point:e,series:d,seriesIndex:a.series,pointIndex:c,color:j(a,c)})})}l=d3.select(this);var R=a.utils.availableWidth(h,l,g),S=a.utils.availableHeight(i,l,g);a.utils.initSVG(l),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var T=E&&F&&I?[]:d3.merge(b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),size:r(a,b)}})}));m.domain(E||d3.extent(T.map(function(a){return a.x}).concat(t))),m.range(y&&b[0]?G||[(R*z+R)/(2*b[0].values.length),R-R*(1+z)/(2*b[0].values.length)]:G||[0,R]),n.domain(F||d3.extent(T.map(function(a){return a.y}).concat(u))).range(H||[S,0]),o.domain(I||d3.extent(T.map(function(a){return a.size}).concat(v))).range(J||Q),K=m.domain()[0]===m.domain()[1]||n.domain()[0]===n.domain()[1],m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]-.01*n.domain()[0],n.domain()[1]+.01*n.domain()[1]]:[-1,1]),isNaN(m.domain()[0])&&m.domain([-1,1]),isNaN(n.domain()[0])&&n.domain([-1,1]),c=c||m,d=d||n,e=e||o;var U=l.selectAll("g.nv-wrap.nv-scatter").data([b]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-scatter nv-chart-"+k),W=V.append("defs"),X=V.append("g"),Y=U.select("g");U.classed("nv-single-point",K),X.append("g").attr("class","nv-groups"),X.append("g").attr("class","nv-point-paths"),V.append("g").attr("class","nv-point-clips"),U.attr("transform","translate("+g.left+","+g.top+")"),W.append("clipPath").attr("id","nv-edge-clip-"+k).append("rect"),U.select("#nv-edge-clip-"+k+" rect").attr("width",R).attr("height",S>0?S:0),Y.attr("clip-path",A?"url(#nv-edge-clip-"+k+")":""),O=!0;var Z=U.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});Z.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),Z.exit().remove(),Z.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),Z.watchTransition(P,"scatter: groups").style("fill",function(a,b){return j(a,b)}).style("stroke",function(a,b){return j(a,b)}).style("stroke-opacity",1).style("fill-opacity",.5);var $=Z.selectAll("path.nv-point").data(function(a){return a.values.map(function(a,b){return[a,b]}).filter(function(a,b){return x(a[0],b)})});$.enter().append("path").style("fill",function(a){return a.color}).style("stroke",function(a){return a.color}).attr("transform",function(a){return"translate("+c(p(a[0],a[1]))+","+d(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),$.exit().remove(),Z.exit().selectAll("path.nv-point").watchTransition(P,"scatter exit").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).remove(),$.each(function(a){d3.select(this).classed("nv-point",!0).classed("nv-point-"+a[1],!0).classed("nv-noninteractive",!w).classed("hover",!1)}),$.watchTransition(P,"scatter points").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),clearTimeout(f),f=setTimeout(N,300),c=m.copy(),d=n.copy(),e=o.copy()}),P.renderEnd("scatter immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=a.utils.defaultColor(),k=Math.floor(1e5*Math.random()),l=null,m=d3.scale.linear(),n=d3.scale.linear(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=function(a){return a.size||1},s=function(a){return a.shape||"circle"},t=[],u=[],v=[],w=!0,x=function(a){return!a.notActive},y=!1,z=.1,A=!1,B=!0,C=!1,D=function(){return 25},E=null,F=null,G=null,H=null,I=null,J=null,K=!1,L=d3.dispatch("elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),M=!0,N=250,O=!1,P=a.utils.renderWatch(L,N),Q=[16,256];return b.dispatch=L,b.options=a.utils.optionsFunc.bind(b),b._calls=new function(){this.clearHighlights=function(){return a.dom.write(function(){l.selectAll(".nv-point.hover").classed("hover",!1)}),null},this.highlightPoint=function(b,c,d){a.dom.write(function(){l.select(" .nv-series-"+b+" .nv-point-"+c).classed("hover",d)})}},L.on("elementMouseover.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!0)}),L.on("elementMouseout.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!1)}),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},pointScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return E},set:function(a){E=a}},yDomain:{get:function(){return F},set:function(a){F=a}},pointDomain:{get:function(){return I},set:function(a){I=a}},xRange:{get:function(){return G},set:function(a){G=a}},yRange:{get:function(){return H},set:function(a){H=a}},pointRange:{get:function(){return J},set:function(a){J=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},forcePoint:{get:function(){return v},set:function(a){v=a}},interactive:{get:function(){return w},set:function(a){w=a}},pointActive:{get:function(){return x},set:function(a){x=a}},padDataOuter:{get:function(){return z},set:function(a){z=a}},padData:{get:function(){return y},set:function(a){y=a}},clipEdge:{get:function(){return A},set:function(a){A=a}},clipVoronoi:{get:function(){return B},set:function(a){B=a}},clipRadius:{get:function(){return D},set:function(a){D=a}},showVoronoi:{get:function(){return C},set:function(a){C=a}},id:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return p},set:function(a){p=d3.functor(a)}},y:{get:function(){return q},set:function(a){q=d3.functor(a)}},pointSize:{get:function(){return r},set:function(a){r=d3.functor(a)}},pointShape:{get:function(){return s},set:function(a){s=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},duration:{get:function(){return N},set:function(a){N=a,P.reset(N)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},useVoronoi:{get:function(){return M},set:function(a){M=a,M===!1&&(B=!1)}}}),a.utils.initOptions(b),b},a.models.scatterChart=function(){"use strict";function b(z){return D.reset(),D.models(c),t&&D.models(d),u&&D.models(e),q&&D.models(g),r&&D.models(h),z.each(function(z){m=d3.select(this),a.utils.initSVG(m);var G=a.utils.availableWidth(k,m,j),H=a.utils.availableHeight(l,m,j);if(b.update=function(){0===A?m.call(b):m.transition().duration(A).call(b)},b.container=this,w.setter(F(z),b.update).getter(E(z)).update(),w.disabled=z.map(function(a){return!!a.disabled}),!x){var I;x={};for(I in w)x[I]=w[I]instanceof Array?w[I].slice(0):w[I]}if(!(z&&z.length&&z.filter(function(a){return a.values.length}).length))return a.utils.noData(b,m),D.renderEnd("scatter immediate"),b;m.selectAll(".nv-noData").remove(),o=c.xScale(),p=c.yScale();var J=m.selectAll("g.nv-wrap.nv-scatterChart").data([z]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-scatterChart nv-chart-"+c.id()),L=K.append("g"),M=J.select("g");if(L.append("rect").attr("class","nvd3 nv-background").style("pointer-events","none"),L.append("g").attr("class","nv-x nv-axis"),L.append("g").attr("class","nv-y nv-axis"),L.append("g").attr("class","nv-scatterWrap"),L.append("g").attr("class","nv-regressionLinesWrap"),L.append("g").attr("class","nv-distWrap"),L.append("g").attr("class","nv-legendWrap"),v&&M.select(".nv-y.nv-axis").attr("transform","translate("+G+",0)"),s){var N=G;f.width(N),J.select(".nv-legendWrap").datum(z).call(f),j.top!=f.height()&&(j.top=f.height(),H=a.utils.availableHeight(l,m,j)),J.select(".nv-legendWrap").attr("transform","translate(0,"+-j.top+")")}J.attr("transform","translate("+j.left+","+j.top+")"),c.width(G).height(H).color(z.map(function(a,b){return a.color=a.color||n(a,b),a.color}).filter(function(a,b){return!z[b].disabled})),J.select(".nv-scatterWrap").datum(z.filter(function(a){return!a.disabled})).call(c),J.select(".nv-regressionLinesWrap").attr("clip-path","url(#nv-edge-clip-"+c.id()+")");var O=J.select(".nv-regressionLinesWrap").selectAll(".nv-regLines").data(function(a){return a});O.enter().append("g").attr("class","nv-regLines");var P=O.selectAll(".nv-regLine").data(function(a){return[a]});P.enter().append("line").attr("class","nv-regLine").style("stroke-opacity",0),P.filter(function(a){return a.intercept&&a.slope}).watchTransition(D,"scatterPlusLineChart: regline").attr("x1",o.range()[0]).attr("x2",o.range()[1]).attr("y1",function(a){return p(o.domain()[0]*a.slope+a.intercept)}).attr("y2",function(a){return p(o.domain()[1]*a.slope+a.intercept)}).style("stroke",function(a,b,c){return n(a,c)}).style("stroke-opacity",function(a){return a.disabled||"undefined"==typeof a.slope||"undefined"==typeof a.intercept?0:1}),t&&(d.scale(o)._ticks(a.utils.calcTicksX(G/100,z)).tickSize(-H,0),M.select(".nv-x.nv-axis").attr("transform","translate(0,"+p.range()[0]+")").call(d)),u&&(e.scale(p)._ticks(a.utils.calcTicksY(H/36,z)).tickSize(-G,0),M.select(".nv-y.nv-axis").call(e)),q&&(g.getData(c.x()).scale(o).width(G).color(z.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionX"),M.select(".nv-distributionX").attr("transform","translate(0,"+p.range()[0]+")").datum(z.filter(function(a){return!a.disabled})).call(g)),r&&(h.getData(c.y()).scale(p).width(H).color(z.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionY"),M.select(".nv-distributionY").attr("transform","translate("+(v?G:-h.size())+",0)").datum(z.filter(function(a){return!a.disabled})).call(h)),f.dispatch.on("stateChange",function(a){for(var c in a)w[c]=a[c];y.stateChange(w),b.update()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&(z.forEach(function(b,c){b.disabled=a.disabled[c]}),w.disabled=a.disabled),b.update()}),c.dispatch.on("elementMouseout.tooltip",function(a){i.hidden(!0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",h.size())}),c.dispatch.on("elementMouseover.tooltip",function(a){m.select(".nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",a.pos.top-H-j.top),m.select(".nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",a.pos.left+g.size()-j.left),i.position(a.pos).data(a).hidden(!1)}),B=o.copy(),C=p.copy()}),D.renderEnd("scatter with line immediate"),b}var c=a.models.scatter(),d=a.models.axis(),e=a.models.axis(),f=a.models.legend(),g=a.models.distribution(),h=a.models.distribution(),i=a.models.tooltip(),j={top:30,right:20,bottom:50,left:75},k=null,l=null,m=null,n=a.utils.defaultColor(),o=c.xScale(),p=c.yScale(),q=!1,r=!1,s=!0,t=!0,u=!0,v=!1,w=a.utils.state(),x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=null,A=250;c.xScale(o).yScale(p),d.orient("bottom").tickPadding(10),e.orient(v?"right":"left").tickPadding(10),g.axis("x"),h.axis("y"),i.headerFormatter(function(a,b){return d.tickFormat()(a,b)}).valueFormatter(function(a,b){return e.tickFormat()(a,b)});var B,C,D=a.utils.renderWatch(y,A),E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return b.dispatch=y,b.scatter=c,b.legend=f,b.xAxis=d,b.yAxis=e,b.distX=g,b.distY=h,b.tooltip=i,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},container:{get:function(){return m},set:function(a){m=a}},showDistX:{get:function(){return q},set:function(a){q=a}},showDistY:{get:function(){return r},set:function(a){r=a}},showLegend:{get:function(){return s},set:function(a){s=a}},showXAxis:{get:function(){return t},set:function(a){t=a}},showYAxis:{get:function(){return u},set:function(a){u=a}},defaultState:{get:function(){return x},set:function(a){x=a}},noData:{get:function(){return z},set:function(a){z=a}},duration:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return i.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),i.enabled(!!b) -}},tooltipContent:{get:function(){return i.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),i.contentGenerator(b)}},tooltipXContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},tooltipYContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},rightAlignYAxis:{get:function(){return v},set:function(a){v=a,e.orient(a?"right":"left")}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),f.color(n),g.color(n),h.color(n)}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.sparkline=function(){"use strict";function b(k){return k.each(function(b){var k=h-g.left-g.right,q=i-g.top-g.bottom;j=d3.select(this),a.utils.initSVG(j),l.domain(c||d3.extent(b,n)).range(e||[0,k]),m.domain(d||d3.extent(b,o)).range(f||[q,0]);{var r=j.selectAll("g.nv-wrap.nv-sparkline").data([b]),s=r.enter().append("g").attr("class","nvd3 nv-wrap nv-sparkline");s.append("g"),r.select("g")}r.attr("transform","translate("+g.left+","+g.top+")");var t=r.selectAll("path").data(function(a){return[a]});t.enter().append("path"),t.exit().remove(),t.style("stroke",function(a,b){return a.color||p(a,b)}).attr("d",d3.svg.line().x(function(a,b){return l(n(a,b))}).y(function(a,b){return m(o(a,b))}));var u=r.selectAll("circle.nv-point").data(function(a){function b(b){if(-1!=b){var c=a[b];return c.pointIndex=b,c}return null}var c=a.map(function(a,b){return o(a,b)}),d=b(c.lastIndexOf(m.domain()[1])),e=b(c.indexOf(m.domain()[0])),f=b(c.length-1);return[e,d,f].filter(function(a){return null!=a})});u.enter().append("circle"),u.exit().remove(),u.attr("cx",function(a){return l(n(a,a.pointIndex))}).attr("cy",function(a){return m(o(a,a.pointIndex))}).attr("r",2).attr("class",function(a){return n(a,a.pointIndex)==l.domain()[1]?"nv-point nv-currentValue":o(a,a.pointIndex)==m.domain()[0]?"nv-point nv-minValue":"nv-point nv-maxValue"})}),b}var c,d,e,f,g={top:2,right:0,bottom:2,left:0},h=400,i=32,j=null,k=!0,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=a.utils.getColor(["#000"]);return b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},animate:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return n},set:function(a){n=d3.functor(a)}},y:{get:function(){return o},set:function(a){o=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return p},set:function(b){p=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sparklinePlus=function(){"use strict";function b(p){return p.each(function(p){function q(){if(!j){var a=z.selectAll(".nv-hoverValue").data(i),b=a.enter().append("g").attr("class","nv-hoverValue").style("stroke-opacity",0).style("fill-opacity",0);a.exit().transition().duration(250).style("stroke-opacity",0).style("fill-opacity",0).remove(),a.attr("transform",function(a){return"translate("+c(e.x()(p[a],a))+",0)"}).transition().duration(250).style("stroke-opacity",1).style("fill-opacity",1),i.length&&(b.append("line").attr("x1",0).attr("y1",-f.top).attr("x2",0).attr("y2",u),b.append("text").attr("class","nv-xValue").attr("x",-6).attr("y",-f.top).attr("text-anchor","end").attr("dy",".9em"),z.select(".nv-hoverValue .nv-xValue").text(k(e.x()(p[i[0]],i[0]))),b.append("text").attr("class","nv-yValue").attr("x",6).attr("y",-f.top).attr("text-anchor","start").attr("dy",".9em"),z.select(".nv-hoverValue .nv-yValue").text(l(e.y()(p[i[0]],i[0]))))}}function r(){function a(a,b){for(var c=Math.abs(e.x()(a[0],0)-b),d=0,f=0;fc;++c){for(b=0,d=0;bb;b++)a[b][c][1]/=d;else for(b=0;e>b;b++)a[b][c][1]=0}for(c=0;f>c;++c)g[c]=0;return g}}),u.renderEnd("stackedArea immediate"),b}var c,d,e={top:0,right:0,bottom:0,left:0},f=960,g=500,h=a.utils.defaultColor(),i=Math.floor(1e5*Math.random()),j=null,k=function(a){return a.x},l=function(a){return a.y},m="stack",n="zero",o="default",p="linear",q=!1,r=a.models.scatter(),s=250,t=d3.dispatch("areaClick","areaMouseover","areaMouseout","renderEnd","elementClick","elementMouseover","elementMouseout");r.pointSize(2.2).pointDomain([2.2,2.2]);var u=a.utils.renderWatch(t,s);return b.dispatch=t,b.scatter=r,r.dispatch.on("elementClick",function(){t.elementClick.apply(this,arguments)}),r.dispatch.on("elementMouseover",function(){t.elementMouseover.apply(this,arguments)}),r.dispatch.on("elementMouseout",function(){t.elementMouseout.apply(this,arguments)}),b.interpolate=function(a){return arguments.length?(p=a,b):p},b.duration=function(a){return arguments.length?(s=a,u.reset(s),r.duration(s),b):s},b.dispatch=t,b.scatter=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return f},set:function(a){f=a}},height:{get:function(){return g},set:function(a){g=a}},clipEdge:{get:function(){return q},set:function(a){q=a}},offset:{get:function(){return n},set:function(a){n=a}},order:{get:function(){return o},set:function(a){o=a}},interpolate:{get:function(){return p},set:function(a){p=a}},x:{get:function(){return k},set:function(a){k=d3.functor(a)}},y:{get:function(){return l},set:function(a){l=d3.functor(a)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return h},set:function(b){h=a.utils.getColor(b)}},style:{get:function(){return m},set:function(a){switch(m=a){case"stack":b.offset("zero"),b.order("default");break;case"stream":b.offset("wiggle"),b.order("inside-out");break;case"stream-center":b.offset("silhouette"),b.order("inside-out");break;case"expand":b.offset("expand"),b.order("default");break;case"stack_percent":b.offset(b.d3_stackedOffset_stackPercent),b.order("default")}}},duration:{get:function(){return s},set:function(a){s=a,u.reset(s),r.duration(s)}}}),a.utils.inheritOptions(b,r),a.utils.initOptions(b),b},a.models.stackedAreaChart=function(){"use strict";function b(k){return F.reset(),F.models(e),r&&F.models(f),s&&F.models(g),k.each(function(k){var x=d3.select(this),F=this;a.utils.initSVG(x);var K=a.utils.availableWidth(m,x,l),L=a.utils.availableHeight(n,x,l);if(b.update=function(){x.transition().duration(C).call(b)},b.container=this,v.setter(I(k),b.update).getter(H(k)).update(),v.disabled=k.map(function(a){return!!a.disabled}),!w){var M;w={};for(M in v)w[M]=v[M]instanceof Array?v[M].slice(0):v[M]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(b,x),b;x.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var N=x.selectAll("g.nv-wrap.nv-stackedAreaChart").data([k]),O=N.enter().append("g").attr("class","nvd3 nv-wrap nv-stackedAreaChart").append("g"),P=N.select("g");if(O.append("rect").style("opacity",0),O.append("g").attr("class","nv-x nv-axis"),O.append("g").attr("class","nv-y nv-axis"),O.append("g").attr("class","nv-stackedWrap"),O.append("g").attr("class","nv-legendWrap"),O.append("g").attr("class","nv-controlsWrap"),O.append("g").attr("class","nv-interactive"),P.select("rect").attr("width",K).attr("height",L),q){var Q=p?K-z:K;h.width(Q),P.select(".nv-legendWrap").datum(k).call(h),l.top!=h.height()&&(l.top=h.height(),L=a.utils.availableHeight(n,x,l)),P.select(".nv-legendWrap").attr("transform","translate("+(K-Q)+","+-l.top+")")}if(p){var R=[{key:B.stacked||"Stacked",metaKey:"Stacked",disabled:"stack"!=e.style(),style:"stack"},{key:B.stream||"Stream",metaKey:"Stream",disabled:"stream"!=e.style(),style:"stream"},{key:B.expanded||"Expanded",metaKey:"Expanded",disabled:"expand"!=e.style(),style:"expand"},{key:B.stack_percent||"Stack %",metaKey:"Stack_Percent",disabled:"stack_percent"!=e.style(),style:"stack_percent"}];z=A.length/3*260,R=R.filter(function(a){return-1!==A.indexOf(a.metaKey)}),i.width(z).color(["#444","#444","#444"]),P.select(".nv-controlsWrap").datum(R).call(i),l.top!=Math.max(i.height(),h.height())&&(l.top=Math.max(i.height(),h.height()),L=a.utils.availableHeight(n,x,l)),P.select(".nv-controlsWrap").attr("transform","translate(0,"+-l.top+")")}N.attr("transform","translate("+l.left+","+l.top+")"),t&&P.select(".nv-y.nv-axis").attr("transform","translate("+K+",0)"),u&&(j.width(K).height(L).margin({left:l.left,top:l.top}).svgContainer(x).xScale(c),N.select(".nv-interactive").call(j)),e.width(K).height(L);var S=P.select(".nv-stackedWrap").datum(k);if(S.transition().call(e),r&&(f.scale(c)._ticks(a.utils.calcTicksX(K/100,k)).tickSize(-L,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+L+")"),P.select(".nv-x.nv-axis").transition().duration(0).call(f)),s){var T;if(T="wiggle"===e.offset()?0:a.utils.calcTicksY(L/36,k),g.scale(d)._ticks(T).tickSize(-K,0),"expand"===e.style()||"stack_percent"===e.style()){var U=g.tickFormat();D&&U===J||(D=U),g.tickFormat(J)}else D&&(g.tickFormat(D),D=null);P.select(".nv-y.nv-axis").transition().duration(0).call(g)}e.dispatch.on("areaClick.toggle",function(a){k.forEach(1===k.filter(function(a){return!a.disabled}).length?function(a){a.disabled=!1}:function(b,c){b.disabled=c!=a.seriesIndex}),v.disabled=k.map(function(a){return!!a.disabled}),y.stateChange(v),b.update()}),h.dispatch.on("stateChange",function(a){for(var c in a)v[c]=a[c];y.stateChange(v),b.update()}),i.dispatch.on("legendClick",function(a){a.disabled&&(R=R.map(function(a){return a.disabled=!0,a}),a.disabled=!1,e.style(a.style),v.style=e.style(),y.stateChange(v),b.update())}),j.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,g,h,i=[];if(k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,j){g=a.interactiveBisect(f.values,c.pointXValue,b.x());var k=f.values[g],l=b.y()(k,g);if(null!=l&&e.highlightPoint(j,g,!0),"undefined"!=typeof k){"undefined"==typeof d&&(d=k),"undefined"==typeof h&&(h=b.xScale()(b.x()(k,g)));var m="expand"==e.style()?k.display.y:b.y()(k,g);i.push({key:f.key,value:m,color:o(f,f.seriesIndex),stackedValue:k.display})}}),i.reverse(),i.length>2){var m=b.yScale().invert(c.mouseY),n=null;i.forEach(function(a,b){m=Math.abs(m);var c=Math.abs(a.stackedValue.y0),d=Math.abs(a.stackedValue.y);return m>=c&&d+c>=m?void(n=b):void 0}),null!=n&&(i[n].highlight=!0)}var p=f.tickFormat()(b.x()(d,g)),q=j.tooltip.valueFormatter();"expand"===e.style()||"stack_percent"===e.style()?(E||(E=q),q=d3.format(".1%")):E&&(q=E,E=null),j.tooltip.position({left:h+l.left,top:c.mouseY+l.top}).chartContainer(F.parentNode).valueFormatter(q).data({value:p,series:i})(),j.renderGuideLine(h)}),j.dispatch.on("elementMouseout",function(){e.clearHighlights()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&k.length===a.disabled.length&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),v.disabled=a.disabled),"undefined"!=typeof a.style&&(e.style(a.style),G=a.style),b.update()})}),F.renderEnd("stacked Area chart immediate"),b}var c,d,e=a.models.stackedArea(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:25,bottom:50,left:60},m=null,n=null,o=a.utils.defaultColor(),p=!0,q=!0,r=!0,s=!0,t=!1,u=!1,v=a.utils.state(),w=null,x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=250,A=["Stacked","Stream","Expanded"],B={},C=250;v.style=e.style(),f.orient("bottom").tickPadding(7),g.orient(t?"right":"left"),k.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)}),j.tooltip.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)});var D=null,E=null;i.updateState(!1);var F=a.utils.renderWatch(y),G=e.style(),H=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),style:e.style()}}},I=function(a){return function(b){void 0!==b.style&&(G=b.style),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},J=d3.format("%");return e.dispatch.on("elementMouseover.tooltip",function(a){a.point.x=e.x()(a.point),a.point.y=e.y()(a.point),k.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),b.dispatch=y,b.stacked=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.interactiveLayer=j,b.tooltip=k,b.dispatch=y,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return w},set:function(a){w=a}},noData:{get:function(){return x},set:function(a){x=a}},showControls:{get:function(){return p},set:function(a){p=a}},controlLabels:{get:function(){return B},set:function(a){B=a}},controlOptions:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},duration:{get:function(){return C},set:function(a){C=a,F.reset(C),e.duration(C),f.duration(C),g.duration(C)}},color:{get:function(){return o},set:function(b){o=a.utils.getColor(b),h.color(o),e.color(o)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},useInteractiveGuideline:{get:function(){return u},set:function(a){u=!!a,b.interactive(!a),b.useVoronoi(!a),e.scatter.interactive(!a)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.sunburst=function(){"use strict";function b(u){return t.reset(),u.each(function(b){function t(a){a.x0=a.x,a.dx0=a.dx}function u(a){var b=d3.interpolate(p.domain(),[a.x,a.x+a.dx]),c=d3.interpolate(q.domain(),[a.y,1]),d=d3.interpolate(q.range(),[a.y?20:0,y]);return function(a,e){return e?function(){return s(a)}:function(e){return p.domain(b(e)),q.domain(c(e)).range(d(e)),s(a)}}}l=d3.select(this);var v,w=a.utils.availableWidth(g,l,f),x=a.utils.availableHeight(h,l,f),y=Math.min(w,x)/2;a.utils.initSVG(l);var z=l.selectAll(".nv-wrap.nv-sunburst").data(b),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburst nv-chart-"+k),B=A.selectAll("nv-sunburst");z.attr("transform","translate("+w/2+","+x/2+")"),l.on("click",function(a,b){o.chartClick({data:a,index:b,pos:d3.event,id:k})}),q.range([0,y]),c=c||b,e=b[0],r.value(j[i]||j.count),v=B.data(r.nodes).enter().append("path").attr("d",s).style("fill",function(a){return m((a.children?a:a.parent).name)}).style("stroke","#FFF").on("click",function(a){d!==c&&c!==a&&(d=c),c=a,v.transition().duration(n).attrTween("d",u(a))}).each(t).on("dblclick",function(a){d.parent==a&&v.transition().duration(n).attrTween("d",u(e))}).each(t).on("mouseover",function(a){d3.select(this).classed("hover",!0).style("opacity",.8),o.elementMouseover({data:a,color:d3.select(this).style("fill")})}).on("mouseout",function(a){d3.select(this).classed("hover",!1).style("opacity",1),o.elementMouseout({data:a})}).on("mousemove",function(a){o.elementMousemove({data:a})})}),t.renderEnd("sunburst immediate"),b}var c,d,e,f={top:0,right:0,bottom:0,left:0},g=null,h=null,i="count",j={count:function(){return 1},size:function(a){return a.size}},k=Math.floor(1e4*Math.random()),l=null,m=a.utils.defaultColor(),n=500,o=d3.dispatch("chartClick","elementClick","elementDblClick","elementMousemove","elementMouseover","elementMouseout","renderEnd"),p=d3.scale.linear().range([0,2*Math.PI]),q=d3.scale.sqrt(),r=d3.layout.partition().sort(null).value(function(){return 1}),s=d3.svg.arc().startAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x)))}).endAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x+a.dx)))}).innerRadius(function(a){return Math.max(0,q(a.y))}).outerRadius(function(a){return Math.max(0,q(a.y+a.dy))}),t=a.utils.renderWatch(o);return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},mode:{get:function(){return i},set:function(a){i=a}},id:{get:function(){return k},set:function(a){k=a}},duration:{get:function(){return n},set:function(a){n=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!=a.top?a.top:f.top,f.right=void 0!=a.right?a.right:f.right,f.bottom=void 0!=a.bottom?a.bottom:f.bottom,f.left=void 0!=a.left?a.left:f.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sunburstChart=function(){"use strict";function b(d){return m.reset(),m.models(c),d.each(function(d){var h=d3.select(this);a.utils.initSVG(h);var i=a.utils.availableWidth(f,h,e),j=a.utils.availableHeight(g,h,e);if(b.update=function(){0===k?h.call(b):h.transition().duration(k).call(b)},b.container=this,!d||!d.length)return a.utils.noData(b,h),b;h.selectAll(".nv-noData").remove();var l=h.selectAll("g.nv-wrap.nv-sunburstChart").data(d),m=l.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburstChart").append("g"),n=l.select("g");m.append("g").attr("class","nv-sunburstWrap"),l.attr("transform","translate("+e.left+","+e.top+")"),c.width(i).height(j);var o=n.select(".nv-sunburstWrap").datum(d);d3.transition(o).call(c)}),m.renderEnd("sunburstChart immediate"),b}var c=a.models.sunburst(),d=a.models.tooltip(),e={top:30,right:20,bottom:20,left:20},f=null,g=null,h=a.utils.defaultColor(),i=(Math.round(1e5*Math.random()),null),j=null,k=250,l=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),m=a.utils.renderWatch(l);return d.headerEnabled(!1).duration(0).valueFormatter(function(a){return a}),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.data.name,value:a.data.size,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=l,b.sunburst=c,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return i},set:function(a){i=a}},color:{get:function(){return h},set:function(a){h=a,c.color(h)}},duration:{get:function(){return k},set:function(a){k=a,m.reset(k),c.duration(k)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.version="1.8.1"}(); $(function() { - var $window = $(window) - , $top_link = $('#toplink') - , $body = $('body, html') - , offset = $('#code').offset().top - , hidePopover = function ($target) { - $target.data('popover-hover', false); +/* + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Exception\Prediction; - setTimeout(function () { - if (!$target.data('popover-hover')) { - $target.popover('hide'); - } - }, 300); - }; +use Prophecy\Exception\Exception; +interface PredictionException extends Exception +{ +} + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Exception\Prediction; - $window.scroll(function() { - if($window.scrollTop() > offset) { - $top_link.fadeIn(); - } else { - $top_link.fadeOut(); +use Prophecy\Prophecy\MethodProphecy; +class UnexpectedCallsCountException extends \Prophecy\Exception\Prediction\UnexpectedCallsException +{ + private $expectedCount; + public function __construct($message, MethodProphecy $methodProphecy, $count, array $calls) + { + parent::__construct($message, $methodProphecy, $calls); + $this->expectedCount = \intval($count); } - }).scroll(); + public function getExpectedCount() + { + return $this->expectedCount; + } +} + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Exception\Prediction; - $target.data('popover-hover', true); +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Exception\Prophecy\MethodProphecyException; +class UnexpectedCallsException extends MethodProphecyException implements \Prophecy\Exception\Prediction\PredictionException +{ + private $calls = array(); + public function __construct($message, MethodProphecy $methodProphecy, array $calls) + { + parent::__construct($message, $methodProphecy); + $this->calls = $calls; + } + public function getCalls() + { + return $this->calls; + } +} + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Exception\Prophecy; - // show the popover - $container.popover('show'); +use Prophecy\Prophecy\MethodProphecy; +class MethodProphecyException extends \Prophecy\Exception\Prophecy\ObjectProphecyException +{ + private $methodProphecy; + public function __construct($message, MethodProphecy $methodProphecy) + { + parent::__construct($message, $methodProphecy->getObjectProphecy()); + $this->methodProphecy = $methodProphecy; + } + /** + * @return MethodProphecy + */ + public function getMethodProphecy() + { + return $this->methodProphecy; + } +} +n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function i(n){return!isNaN(n)}function u(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)<0?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)>0?i=u:r=u+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function f(n){return(n+="")===bo||n[0]===_o?_o+n:n}function s(n){return(n+="")[0]===_o?n.slice(1):n}function h(n){return f(n)in this._}function p(n){return(n=f(n))in this._&&delete this._[n]}function g(){var n=[];for(var t in this._)n.push(s(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function y(){this._=Object.create(null)}function m(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=wo.length;r>e;++e){var i=wo[e]+t;if(i in n)return i}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,i=-1,u=r.length;++ie;e++)for(var i,u=n[e],o=0,a=u.length;a>o;o++)(i=u[o])&&t(i,o,e);return n}function Z(n){return ko(n,qo),n}function V(n){var t,e;return function(r,i,u){var o,a=n[u].update,l=a.length;for(u!=e&&(e=u,t=0),i>=t&&(t=i+1);!(o=a[t])&&++t0&&(n=n.slice(0,a));var c=To.get(n);return c&&(n=c,l=B),a?t?i:r:t?b:u}function $(n,t){return function(e){var r=ao.event;ao.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ao.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Do,i="click"+r,u=ao.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ro&&(Ro="onselectstart"in e?!1:x(e.style,"userSelect")),Ro){var o=n(e).style,a=o[Ro];o[Ro]="none"}return function(n){if(u.on(r,null),Ro&&(o[Ro]=a),n){var t=function(){u.on(i,null)};u.on(i,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var i=r.createSVGPoint();if(0>Po){var u=t(n);if(u.scrollX||u.scrollY){r=ao.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Po=!(o.f||o.e),r.remove()}}return Po?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(n.getScreenCTM().inverse()),[i.x,i.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ao.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?Fo:Math.acos(n)}function tn(n){return n>1?Io:-1>n?-Io:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function on(n){return(n=Math.sin(n/2))*n}function an(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?u+(o-u)*n/60:180>n?o:240>n?u+(o-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,u=2*e-o,new mn(i(n+120),i(n),i(n-120))}function fn(n,t,e){return this instanceof fn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof fn?new fn(n.h,n.c,n.l):n instanceof hn?gn(n.l,n.a,n.b):gn((n=Sn((n=ao.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new fn(n,t,e)}function sn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Yo)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof fn?sn(n.h,n.c,n.l):Sn((n=mn(n)).r,n.g,n.b):new hn(n,t,e)}function pn(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=vn(i)*na,r=vn(r)*ta,u=vn(u)*ea,new mn(yn(3.2404542*i-1.5371385*r-.4985314*u),yn(-.969266*i+1.8760108*r+.041556*u),yn(.0556434*i-.2040259*r+1.0572252*u))}function gn(n,t,e){return n>0?new fn(Math.atan2(e,t)*Zo,Math.sqrt(t*t+e*e),n):new fn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function yn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mn(n,t,e){return this instanceof mn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mn?new mn(n.r,n.g,n.b):_n(""+n,mn,cn):new mn(n,t,e)}function Mn(n){return new mn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,i,u,o=0,a=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Nn(i[0]),Nn(i[1]),Nn(i[2]))}return(u=ua.get(n))?t(u.r,u.g,u.b):(null==n||"#"!==n.charAt(0)||isNaN(u=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&u)>>4,o=o>>4|o,a=240&u,a=a>>4|a,l=15&u,l=l<<4|l):7===n.length&&(o=(16711680&u)>>16,a=(65280&u)>>8,l=255&u)),t(o,a,l))}function wn(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-u,l=(o+u)/2;return a?(i=.5>l?a/(o+u):a/(2-o-u),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=NaN,i=l>0&&1>l?0:r),new ln(r,i,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/na),i=dn((.2126729*n+.7151522*t+.072175*e)/ta),u=dn((.0193339*n+.119192*t+.9503041*e)/ea);return hn(116*i-16,500*(r-i),200*(i-u))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function i(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(u,l)}catch(r){return void o.error.call(u,r)}o.load.call(u,n)}else o.error.call(u,l)}var u={},o=ao.dispatch("beforesend","progress","load","error"),a={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=i:l.onreadystatechange=function(){l.readyState>3&&i()},l.onprogress=function(n){var t=ao.event;ao.event=n;try{o.progress.call(u,l)}finally{ao.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(c=n,u):c},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(co(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),l.setRequestHeader)for(var f in a)l.setRequestHeader(f,a[f]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),o.beforesend.call(u,l),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},ao.rebind(u,o,"on"),null==r?u:u.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var i=e+t,u={c:n,t:i,n:null};return aa?aa.n=u:oa=u,aa=u,la||(ca=clearTimeout(ca),la=1,fa(Tn)),u}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(ca),ca=setTimeout(Tn,t)),la=0):(la=1,fa(Tn))}function Rn(){for(var n=Date.now(),t=oa;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=oa,e=1/0;t;)t.c?(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function jn(n){var t=n.decimal,e=n.thousands,r=n.grouping,i=n.currency,u=r&&e?function(n,t){for(var i=n.length,u=[],o=0,a=r[0],l=0;i>0&&a>0&&(l+a+1>t&&(a=Math.max(1,t-l)),u.push(n.substring(i-=a,i+a)),!((l+=a+1)>t));)a=r[o=(o+1)%r.length];return u.reverse().join(e)}:m;return function(n){var e=ha.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",l=e[4]||"",c=e[5],f=+e[6],s=e[7],h=e[8],p=e[9],g=1,v="",d="",y=!1,m=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===o)&&(c=r="0",o="="),p){case"n":s=!0,p="g";break;case"%":g=100,d="%",p="f";break;case"p":g=100,d="%",p="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+p.toLowerCase());case"c":m=!1;case"d":y=!0,h=0;break;case"s":g=-1,p="r"}"$"===l&&(v=i[0],d=i[1]),"r"!=p||h||(p="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=pa.get(p)||Fn;var M=c&&s;return function(n){var e=d;if(y&&n%1)return"";var i=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>g){var l=ao.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=g;n=p(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=m?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&s&&(x=u(x,1/0));var S=v.length+x.length+b.length+(M?0:i.length),k=f>S?new Array(S=f-S+1).join(r):"";return M&&(x=u(k+x,k.length?f-b.length:1/0)),i+=v,n=x+b,("<"===o?i+n+k:">"===o?k+i+n:"^"===o?k.substring(0,S>>=1)+i+n+k.substring(S):i+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=u(e,1);return r-t>t-e?e:r}function i(e){return t(e=n(new va(e-1)),1),e}function u(n,e){return t(n=new va(+n),e),n}function o(n,r,u){var o=i(n),a=[];if(u>1)for(;r>o;)e(o)%u||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{va=Hn;var r=new Hn;return r._=n,o(r,t,e)}finally{va=Date}}n.floor=n,n.round=r,n.ceil=i,n.offset=u,n.range=o;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(i),l.offset=In(u),l.range=a,n}function In(n){return function(t,e){try{va=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{va=Date}}}function Yn(n){function t(n){function t(t){for(var e,i,u,o=[],a=-1,l=0;++aa;){if(r>=c)return-1;if(i=t.charCodeAt(a++),37===i){if(o=t.charAt(a++),u=C[o in ya?t.charAt(a++):o],!u||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function f(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var s=n.dateTime,h=n.date,p=n.time,g=n.periods,v=n.days,d=n.shortDays,y=n.months,m=n.shortMonths;t.utc=function(n){function e(n){try{va=Hn;var t=new va;return t._=n,r(t)}finally{va=Date}}var r=t(n);return e.parse=function(n){try{va=Hn;var t=r.parse(n);return t&&t._}finally{va=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=ao.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(y),k=Xn(y),N=Vn(m),E=Xn(m);g.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return m[n.getMonth()]},B:function(n){return y[n.getMonth()]},c:t(s),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ga.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return g[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ga.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ga.mondayOfYear(n),t,2)},x:t(h),X:t(p),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:at,"%":function(){return"%"}},C={a:r,A:i,b:u,B:o,c:a,d:tt,e:tt,H:rt,I:rt,j:et,L:ot,m:nt,M:it,p:f,S:ut,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",i=(r?-n:n)+"",u=i.length;return r+(e>u?new Array(e-u+1).join(t)+i:i)}function Vn(n){return new RegExp("^(?:"+n.map(ao.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e68?1900:2e3)}function nt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function it(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ut(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ot(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function at(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=xo(t)/60|0,i=xo(t)%60;return e+Zn(r,"0",2)+Zn(i,"0",2)}function lt(n,t,e){Ma.lastIndex=0;var r=Ma.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e=0?1:-1,a=o*e,l=Math.cos(t),c=Math.sin(t),f=u*c,s=i*l+f*Math.cos(a),h=f*o*Math.sin(a);ka.add(Math.atan2(h,s)),r=n,i=l,u=c}var t,e,r,i,u;Na.point=function(o,a){Na.point=n,r=(t=o)*Yo,i=Math.cos(a=(e=a)*Yo/2+Fo/4),u=Math.sin(a)},Na.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function yt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function mt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return xo(n[0]-t[0])a;++a)i.point((e=n[a])[0],e[1]);return void i.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,u.push(l),o.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,u.push(l),o.push(c)}}),o.sort(t),qt(u),qt(o),u.length){for(var a=0,l=e,c=o.length;c>a;++a)o[a].e=l=!l;for(var f,s,h=u[0];;){for(var p=h,g=!0;p.v;)if((p=p.n)===h)return;f=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(g)for(var a=0,c=f.length;c>a;++a)i.point((s=f[a])[0],s[1]);else r(p.x,p.n.x,1,i);p=p.n}else{if(g){f=p.p.z;for(var a=f.length-1;a>=0;--a)i.point((s=f[a])[0],s[1])}else r(p.x,p.p.x,-1,i);p=p.p}p=p.o,f=p.z,g=!g}while(!p.v);i.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r0){for(b||(u.polygonStart(),b=!0),u.lineStart();++o1&&2&t&&e.push(e.pop().concat(e.shift())),p.push(e.filter(Dt))}var p,g,v,d=t(u),y=i.invert(r[0],r[1]),m={point:o,lineStart:l,lineEnd:c,polygonStart:function(){m.point=f,m.lineStart=s,m.lineEnd=h,p=[],g=[]},polygonEnd:function(){m.point=o,m.lineStart=l,m.lineEnd=c,p=ao.merge(p);var n=Ot(y,g);p.length?(b||(u.polygonStart(),b=!0),Lt(p,Ut,n,e,u)):n&&(b||(u.polygonStart(),b=!0),u.lineStart(),e(null,null,1,u),u.lineEnd()),b&&(u.polygonEnd(),b=!1),p=g=null},sphere:function(){u.polygonStart(),u.lineStart(),e(null,null,1,u),u.lineEnd(),u.polygonEnd()}},M=Pt(),x=t(M),b=!1;return m}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ut(n,t){return((n=n.x)[0]<0?n[1]-Io-Uo:Io-n[1])-((t=t.x)[0]<0?t[1]-Io-Uo:Io-t[1])}function jt(n){var t,e=NaN,r=NaN,i=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(u,o){var a=u>0?Fo:-Fo,l=xo(u-e);xo(l-Fo)0?Io:-Io),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(u,r),t=0):i!==a&&l>=Fo&&(xo(e-i)Uo?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*o)):(t+r)/2}function Ht(n,t,e,r){var i;if(null==n)i=e*Io,r.point(-Fo,i),r.point(0,i),r.point(Fo,i),r.point(Fo,0),r.point(Fo,-i),r.point(0,-i),r.point(-Fo,-i),r.point(-Fo,0),r.point(-Fo,i);else if(xo(n[0]-t[0])>Uo){var u=n[0]a;++a){var c=t[a],f=c.length;if(f)for(var s=c[0],h=s[0],p=s[1]/2+Fo/4,g=Math.sin(p),v=Math.cos(p),d=1;;){d===f&&(d=0),n=c[d];var y=n[0],m=n[1]/2+Fo/4,M=Math.sin(m),x=Math.cos(m),b=y-h,_=b>=0?1:-1,w=_*b,S=w>Fo,k=g*M;if(ka.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),u+=S?b+_*Ho:b,S^h>=e^y>=e){var N=mt(dt(s),dt(n));bt(N);var E=mt(i,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=y,g=M,v=x,s=n}}return(-Uo>u||Uo>u&&-Uo>ka)^1&o}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>u}function e(n){var e,u,l,c,f;return{lineStart:function(){c=l=!1,f=1},point:function(s,h){var p,g=[s,h],v=t(s,h),d=o?v?0:i(s,h):v?i(s+(0>s?Fo:-Fo),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(p=r(e,g),(wt(e,p)||wt(g,p))&&(g[0]+=Uo,g[1]+=Uo,v=t(g[0],g[1]))),v!==l)f=0,v?(n.lineStart(),p=r(g,e),n.point(p[0],p[1])):(p=r(e,g),n.point(p[0],p[1]),n.lineEnd()),e=p;else if(a&&e&&o^v){var y;d&u||!(y=r(g,e,!0))||(f=0,o?(n.lineStart(),n.point(y[0][0],y[0][1]),n.point(y[1][0],y[1][1]),n.lineEnd()):(n.point(y[1][0],y[1][1]),n.lineEnd(),n.lineStart(),n.point(y[0][0],y[0][1])))}!v||e&&wt(e,g)||n.point(g[0],g[1]),e=g,l=v,u=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return f|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),i=dt(t),o=[1,0,0],a=mt(r,i),l=yt(a,a),c=a[0],f=l-c*c;if(!f)return!e&&n;var s=u*l/f,h=-u*c/f,p=mt(o,a),g=xt(o,s),v=xt(a,h);Mt(g,v);var d=p,y=yt(g,d),m=yt(d,d),M=y*y-m*(yt(g,g)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-y-x)/m);if(Mt(b,g),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=xo(E-Fo)E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(xo(b[0]-w)Fo^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-y+x)/m);return Mt(z,g),[b,_t(z)]}}}function i(t,e){var r=o?n:Fo-n,i=0;return-r>t?i|=1:t>r&&(i|=2),-r>e?i|=4:e>r&&(i|=8),i}var u=Math.cos(n),o=u>0,a=xo(u)>Uo,l=ve(n,6*Yo);return Rt(t,e,l,o?[0,-n]:[-Fo,n-Fo])}function Yt(n,t,e,r){return function(i){var u,o=i.a,a=i.b,l=o.x,c=o.y,f=a.x,s=a.y,h=0,p=1,g=f-l,v=s-c;if(u=n-l,g||!(u>0)){if(u/=g,0>g){if(h>u)return;p>u&&(p=u)}else if(g>0){if(u>p)return;u>h&&(h=u)}if(u=e-l,g||!(0>u)){if(u/=g,0>g){if(u>p)return;u>h&&(h=u)}else if(g>0){if(h>u)return;p>u&&(p=u)}if(u=t-c,v||!(u>0)){if(u/=v,0>v){if(h>u)return;p>u&&(p=u)}else if(v>0){if(u>p)return;u>h&&(h=u)}if(u=r-c,v||!(0>u)){if(u/=v,0>v){if(u>p)return;u>h&&(h=u)}else if(v>0){if(h>u)return;p>u&&(p=u)}return h>0&&(i.a={x:l+h*g,y:c+h*v}),1>p&&(i.b={x:l+p*g,y:c+p*v}),i}}}}}}function Zt(n,t,e,r){function i(r,i){return xo(r[0]-n)0?0:3:xo(r[0]-e)0?2:1:xo(r[1]-t)0?1:0:i>0?3:2}function u(n,t){return o(n.x,t.x)}function o(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function l(n){for(var t=0,e=d.length,r=n[1],i=0;e>i;++i)for(var u,o=1,a=d[i],l=a.length,c=a[0];l>o;++o)u=a[o],c[1]<=r?u[1]>r&&Q(c,u,n)>0&&++t:u[1]<=r&&Q(c,u,n)<0&&--t,c=u;return 0!==t}function c(u,a,l,c){var f=0,s=0;if(null==u||(f=i(u,l))!==(s=i(a,l))||o(u,a)<0^l>0){do c.point(0===f||3===f?n:e,f>1?r:t);while((f=(f+l+4)%4)!==s)}else c.point(a[0],a[1])}function f(i,u){return i>=n&&e>=i&&u>=t&&r>=u}function s(n,t){f(n,t)&&a.point(n,t)}function h(){C.point=g,d&&d.push(y=[]),S=!0,w=!1,b=_=NaN}function p(){v&&(g(m,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=s,w&&a.lineEnd()}function g(n,t){n=Math.max(-Ha,Math.min(Ha,n)),t=Math.max(-Ha,Math.min(Ha,t));var e=f(n,t);if(d&&y.push([n,t]),S)m=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,y,m,M,x,b,_,w,S,k,N=a,E=Pt(),A=Yt(n,t,e,r),C={point:s,lineStart:h,lineEnd:p,polygonStart:function(){a=E,v=[],d=[],k=!0},polygonEnd:function(){a=N,v=ao.merge(v);var t=l([n,r]),e=k&&t,i=v.length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),c(null,null,1,a),a.lineEnd()),i&&Lt(v,u,t,c,a),a.polygonEnd()),v=d=y=null}};return C}}function Vt(n){var t=0,e=Fo/3,r=ae(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Fo/180,e=n[1]*Fo/180):[t/Fo*180,e/Fo*180]},i}function Xt(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),o-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),o=Math.sqrt(u)/i;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/i,tn((u-(n*n+e*e)*i*i)/(2*i))]},e}function $t(){function n(n,t){Ia+=i*n-r*t,r=n,i=t}var t,e,r,i;$a.point=function(u,o){$a.point=n,t=r=u,e=i=o},$a.lineEnd=function(){n(t,e)}}function Bt(n,t){Ya>n&&(Ya=n),n>Va&&(Va=n),Za>t&&(Za=t),t>Xa&&(Xa=t)}function Wt(){function n(n,t){o.push("M",n,",",t,u)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function i(){o.push("Z")}var u=Jt(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return u=Jt(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ca+=n,za+=t,++La}function Kt(){function n(n,r){var i=n-t,u=r-e,o=Math.sqrt(i*i+u*u);qa+=o*(t+n)/2,Ta+=o*(e+r)/2,Ra+=o,Gt(t=n,e=r)}var t,e;Wa.point=function(r,i){Wa.point=n,Gt(t=r,e=i)}}function Qt(){Wa.point=Gt}function ne(){function n(n,t){var e=n-r,u=t-i,o=Math.sqrt(e*e+u*u);qa+=o*(r+n)/2,Ta+=o*(i+t)/2,Ra+=o,o=i*n-r*t,Da+=o*(r+n),Pa+=o*(i+t),Ua+=3*o,Gt(r=n,i=t)}var t,e,r,i;Wa.point=function(u,o){Wa.point=n,Gt(t=r=u,e=i=o)},Wa.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,Ho)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function i(){a.point=t}function u(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:i,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=i,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function ee(n){function t(n){return(a?r:e)(n)}function e(t){return ue(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=u,t.lineStart()}function u(e,r){var u=dt([e,r]),o=n(e,r);i(M,x,m,b,_,w,M=o[0],x=o[1],m=e,b=u[0],_=u[1],w=u[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function l(){ -r(),S.point=c,S.lineEnd=f}function c(n,t){u(s=n,h=t),p=M,g=x,v=b,d=_,y=w,S.point=u}function f(){i(M,x,m,b,_,w,p,g,s,v,d,y,a,t),S.lineEnd=o,o()}var s,h,p,g,v,d,y,m,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function i(t,e,r,a,l,c,f,s,h,p,g,v,d,y){var m=f-t,M=s-e,x=m*m+M*M;if(x>4*u&&d--){var b=a+p,_=l+g,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=xo(xo(w)-1)u||xo((m*z+M*L)/x-.5)>.3||o>a*p+l*g+c*v)&&(i(t,e,r,a,l,c,A,C,N,b/=S,_/=S,w,d,y),y.point(A,C),i(A,C,N,b,_,w,f,s,h,p,g,v,d,y))}}var u=.5,o=Math.cos(30*Yo),a=16;return t.precision=function(n){return arguments.length?(a=(u=n*n)>0&&16,t):Math.sqrt(u)},t}function re(n){var t=ee(function(t,e){return n([t*Zo,e*Zo])});return function(n){return le(t(n))}}function ie(n){this.stream=n}function ue(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function oe(n){return ae(function(){return n})()}function ae(n){function t(n){return n=a(n[0]*Yo,n[1]*Yo),[n[0]*h+l,c-n[1]*h]}function e(n){return n=a.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Zo,n[1]*Zo]}function r(){a=Ct(o=se(y,M,x),u);var n=u(v,d);return l=p-n[0]*h,c=g+n[1]*h,i()}function i(){return f&&(f.valid=!1,f=null),t}var u,o,a,l,c,f,s=ee(function(n,t){return n=u(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,p=480,g=250,v=0,d=0,y=0,M=0,x=0,b=Fa,_=m,w=null,S=null;return t.stream=function(n){return f&&(f.valid=!1),f=le(b(o,s(_(n)))),f.valid=!0,f},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Fa):It((w=+n)*Yo),i()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):m,i()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(p=+n[0],g=+n[1],r()):[p,g]},t.center=function(n){return arguments.length?(v=n[0]%360*Yo,d=n[1]%360*Yo,r()):[v*Zo,d*Zo]},t.rotate=function(n){return arguments.length?(y=n[0]%360*Yo,M=n[1]%360*Yo,x=n.length>2?n[2]%360*Yo:0,r()):[y*Zo,M*Zo,x*Zo]},ao.rebind(t,s,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function le(n){return ue(n,function(t,e){n.point(t*Yo,e*Yo)})}function ce(n,t){return[n,t]}function fe(n,t){return[n>Fo?n-Ho:-Fo>n?n+Ho:n,t]}function se(n,t,e){return n?t||e?Ct(pe(n),ge(t,e)):pe(n):t||e?ge(t,e):fe}function he(n){return function(t,e){return t+=n,[t>Fo?t-Ho:-Fo>t?t+Ho:t,e]}}function pe(n){var t=he(n);return t.invert=he(-n),t}function ge(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*r+a*i;return[Math.atan2(l*u-f*o,a*r-c*i),tn(f*u+l*o)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*u-l*o;return[Math.atan2(l*u+c*o,a*r+f*i),tn(f*r-a*i)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,o,a){var l=o*t;null!=i?(i=de(e,i),u=de(e,u),(o>0?u>i:i>u)&&(i+=o*Ho)):(i=n+o*Ho,u=n-.5*l);for(var c,f=i;o>0?f>u:u>f;f-=l)a.point((c=_t([e,-r*Math.cos(f),-r*Math.sin(f)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Uo)%(2*Math.PI)}function ye(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function me(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var i=Math.cos(t),u=Math.sin(t),o=Math.cos(r),a=Math.sin(r),l=i*Math.cos(n),c=i*Math.sin(n),f=o*Math.cos(e),s=o*Math.sin(e),h=2*Math.asin(Math.sqrt(on(r-t)+i*o*on(e-n))),p=1/Math.sin(h),g=h?function(n){var t=Math.sin(n*=h)*p,e=Math.sin(h-n)*p,r=e*l+t*f,i=e*c+t*s,o=e*u+t*a;return[Math.atan2(i,r)*Zo,Math.atan2(o,Math.sqrt(r*r+i*i))*Zo]}:function(){return[n*Zo,t*Zo]};return g.distance=h,g}function _e(){function n(n,i){var u=Math.sin(i*=Yo),o=Math.cos(i),a=xo((n*=Yo)-t),l=Math.cos(a);Ja+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*u-e*o*l)*a),e*u+r*o*l),t=n,e=u,r=o}var t,e,r;Ga.point=function(i,u){t=i*Yo,e=Math.sin(u*=Yo),r=Math.cos(u),Ga.point=n},Ga.lineEnd=function(){Ga.point=Ga.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),i=Math.cos(e),u=n(r*i);return[u*i*Math.sin(t),u*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),i=t(r),u=Math.sin(i),o=Math.cos(i);return[Math.atan2(n*u,r*o),Math.asin(r&&e*u/r)]},e}function Se(n,t){function e(n,t){o>0?-Io+Uo>t&&(t=-Io+Uo):t>Io-Uo&&(t=Io-Uo);var e=o/Math.pow(i(t),u);return[e*Math.sin(u*n),o-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Fo/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),o=r*Math.pow(i(n),u)/u;return u?(e.invert=function(n,t){var e=o-t,r=K(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(o/r,1/u))-Io]},e):Ne}function ke(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return xo(i)i;i++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var i=n[0],u=e[0],o=t[0]-i,a=r[0]-u,l=n[1],c=e[1],f=t[1]-l,s=r[1]-c,h=(a*(l-c)-s*(i-u))/(s*o-a*f);return[i+h*o,l+h*f]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function Ue(n){var t=cl.pop()||new Pe;return t.site=n,t}function je(n){Be(n),ol.remove(n),cl.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,i={x:e,y:r},u=n.P,o=n.N,a=[n];je(n);for(var l=u;l.circle&&xo(e-l.circle.x)f;++f)c=a[f],l=a[f-1],nr(c.edge,l.site,c.site,i);l=a[0],c=a[s-1],c.edge=Ke(l.site,c.site,null,i),$e(l),$e(c)}function He(n){for(var t,e,r,i,u=n.x,o=n.y,a=ol._;a;)if(r=Oe(a,o)-u,r>Uo)a=a.L;else{if(i=u-Ie(a,o),!(i>Uo)){r>-Uo?(t=a.P,e=a):i>-Uo?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var l=Ue(n);if(ol.insert(t,l),t||e){if(t===e)return Be(t),e=Ue(t.site),ol.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,f=c.x,s=c.y,h=n.x-f,p=n.y-s,g=e.site,v=g.x-f,d=g.y-s,y=2*(h*d-p*v),m=h*h+p*p,M=v*v+d*d,x={x:(d*m-p*M)/y+f,y:(h*M-v*m)/y+s};nr(e.edge,c,g,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,g,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,i=e.y,u=i-t;if(!u)return r;var o=n.P;if(!o)return-(1/0);e=o.site;var a=e.x,l=e.y,c=l-t;if(!c)return a;var f=a-r,s=1/u-1/c,h=f/c;return s?(-h+Math.sqrt(h*h-2*s*(f*f/(-2*c)-l+c/2+i-u/2)))/s+r:(r+a)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,i,u,o,a,l,c,f,s=n[0][0],h=n[1][0],p=n[0][1],g=n[1][1],v=ul,d=v.length;d--;)if(u=v[d],u&&u.prepare())for(a=u.edges,l=a.length,o=0;l>o;)f=a[o].end(),r=f.x,i=f.y,c=a[++o%l].start(),t=c.x,e=c.y,(xo(r-t)>Uo||xo(i-e)>Uo)&&(a.splice(o,0,new tr(Qe(u.site,f,xo(r-s)Uo?{x:s,y:xo(t-s)Uo?{x:xo(e-g)Uo?{x:h,y:xo(t-h)Uo?{x:xo(e-p)=-jo)){var p=l*l+c*c,g=f*f+s*s,v=(s*p-c*g)/h,d=(l*g-f*p)/h,s=d+a,y=fl.pop()||new Xe;y.arc=n,y.site=i,y.x=v+o,y.y=s+Math.sqrt(v*v+d*d),y.cy=s,n.circle=y;for(var m=null,M=ll._;M;)if(y.yd||d>=a)return;if(h>g){if(u){if(u.y>=c)return}else u={x:d,y:l};e={x:d,y:c}}else{if(u){if(u.yr||r>1)if(h>g){if(u){if(u.y>=c)return}else u={x:(l-i)/r,y:l};e={x:(c-i)/r,y:c}}else{if(u){if(u.yp){if(u){if(u.x>=a)return}else u={x:o,y:r*o+i};e={x:a,y:r*a+i}}else{if(u){if(u.xu||s>o||r>h||i>p)){if(g=n.point){var g,v=t-n.x,d=e-n.y,y=v*v+d*d;if(l>y){var m=Math.sqrt(l=y);r=t-m,i=e-m,u=t+m,o=e+m,a=g}}for(var M=n.nodes,x=.5*(f+h),b=.5*(s+p),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,f,s,x,b);break;case 1:c(n,x,s,h,b);break;case 2:c(n,f,b,x,p);break;case 3:c(n,x,b,h,p)}}}(n,r,i,u,o),a}function vr(n,t){n=ao.rgb(n),t=ao.rgb(t);var e=n.r,r=n.g,i=n.b,u=t.r-e,o=t.g-r,a=t.b-i;return function(n){return"#"+bn(Math.round(e+u*n))+bn(Math.round(r+o*n))+bn(Math.round(i+a*n))}}function dr(n,t){var e,r={},i={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):i[e]=n[e];for(e in t)e in n||(i[e]=t[e]);return function(n){for(e in r)i[e]=r[e](n);return i}}function yr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function mr(n,t){var e,r,i,u=hl.lastIndex=pl.lastIndex=0,o=-1,a=[],l=[];for(n+="",t+="";(e=hl.exec(n))&&(r=pl.exec(t));)(i=r.index)>u&&(i=t.slice(u,i),a[o]?a[o]+=i:a[++o]=i),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,l.push({i:o,x:yr(e,r)})),u=pl.lastIndex;return ur;++r)a[(e=l[r]).i]=e.x(n);return a.join("")})}function Mr(n,t){for(var e,r=ao.interpolators.length;--r>=0&&!(e=ao.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],i=[],u=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(Mr(n[e],t[e]));for(;u>e;++e)i[e]=n[e];for(;o>e;++e)i[e]=t[e];return function(n){for(e=0;a>e;++e)i[e]=r[e](n);return i}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Io)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ho*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ho/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=ao.hcl(n),t=ao.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,o=t.c-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return sn(e+u*n,r+o*n,i+a*n)+""}}function Dr(n,t){n=ao.hsl(n),t=ao.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,o=t.s-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return cn(e+u*n,r+o*n,i+a*n)+""}}function Pr(n,t){n=ao.lab(n),t=ao.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,o=t.a-r,a=t.b-i;return function(n){return pn(e+u*n,r+o*n,i+a*n)+""}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function jr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),i=Fr(t,e),u=Hr(Or(e,t,-i))||0;t[0]*e[1]180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:yr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:yr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:i-4,x:yr(n[0],t[0])},{i:i-2,x:yr(n[1],t[1])})}else 1===t[0]&&1===t[1]||e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=ao.transform(n),t=ao.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,i=-1,u=r.length;++i=0;)e.push(i[r])}function oi(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(u=n.children)&&(i=u.length))for(var i,u,o=-1;++oe;++e)(t=n[e][1])>i&&(r=e,i=t);return r}function yi(n){return n.reduce(mi,0)}function mi(n,t){return n+t[1]}function Mi(n,t){return xi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function bi(n){return[ao.min(n),ao.max(n)]}function _i(n,t){return n.value-t.value}function wi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Si(n,t){n._pack_next=t,t._pack_prev=n}function ki(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function Ni(n){function t(n){f=Math.min(n.x-n.r,f),s=Math.max(n.x+n.r,s),h=Math.min(n.y-n.r,h),p=Math.max(n.y+n.r,p)}if((e=n.children)&&(c=e.length)){var e,r,i,u,o,a,l,c,f=1/0,s=-(1/0),h=1/0,p=-(1/0);if(e.forEach(Ei),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(i=e[1],i.x=i.r,i.y=0,t(i),c>2))for(u=e[2],zi(r,i,u),t(u),wi(r,u),r._pack_prev=u,wi(u,i),i=r._pack_next,o=3;c>o;o++){zi(r,i,u=e[o]);var g=0,v=1,d=1;for(a=i._pack_next;a!==i;a=a._pack_next,v++)if(ki(a,u)){g=1;break}if(1==g)for(l=r._pack_prev;l!==a._pack_prev&&!ki(l,u);l=l._pack_prev,d++);g?(d>v||v==d&&i.ro;o++)u=e[o],u.x-=y,u.y-=m,M=Math.max(M,u.r+Math.sqrt(u.x*u.x+u.y*u.y));n.r=M,e.forEach(Ai)}}function Ei(n){n._pack_next=n._pack_prev=n}function Ai(n){delete n._pack_next,delete n._pack_prev}function Ci(n,t,e,r){var i=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,i)for(var u=-1,o=i.length;++u=0;)t=i[u],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pi(n,t,e){return n.a.parent===t.parent?n.a:e}function Ui(n){return 1+ao.max(n,function(n){return n.y})}function ji(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fi(n){var t=n.children;return t&&t.length?Fi(t[0]):n}function Hi(n){var t,e=n.children;return e&&(t=e.length)?Hi(e[t-1]):n}function Oi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Ii(n,t){var e=n.x+t[3],r=n.y+t[0],i=n.dx-t[1]-t[3],u=n.dy-t[0]-t[2];return 0>i&&(e+=i/2,i=0),0>u&&(r+=u/2,u=0),{x:e,y:r,dx:i,dy:u}}function Yi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zi(n){return n.rangeExtent?n.rangeExtent():Yi(n.range())}function Vi(n,t,e,r){var i=e(n[0],n[1]),u=r(t[0],t[1]);return function(n){return u(i(n))}}function Xi(n,t){var e,r=0,i=n.length-1,u=n[r],o=n[i];return u>o&&(e=r,r=i,i=e,e=u,u=o,o=e),n[r]=t.floor(u),n[i]=t.ceil(o),n}function $i(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:Sl}function Bi(n,t,e,r){var i=[],u=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?Bi:Vi,l=r?Wr:Br;return o=i(n,t,l,e),a=i(t,n,l,Mr),u}function u(n){return o(n)}var o,a;return u.invert=function(n){return a(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Ur)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return Qi(n,t)},u.tickFormat=function(t,e){return nu(n,t,e)},u.nice=function(t){return Gi(n,t),i()},u.copy=function(){return Wi(n,t,e,r)},i()}function Ji(n,t){return ao.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gi(n,t){return Xi(n,$i(Ki(n,t)[2])),Xi(n,$i(Ki(n,t)[2])),n}function Ki(n,t){null==t&&(t=10);var e=Yi(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return.15>=u?i*=10:.35>=u?i*=5:.75>=u&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function Qi(n,t){return ao.range.apply(ao,Ki(n,t))}function nu(n,t,e){var r=Ki(n,t);if(e){var i=ha.exec(e);if(i.shift(),"s"===i[8]){var u=ao.formatPrefix(Math.max(xo(r[0]),xo(r[1])));return i[7]||(i[7]="."+tu(u.scale(r[2]))),i[8]="f",e=ao.format(i.join("")),function(n){return e(u.scale(n))+u.symbol}}i[7]||(i[7]="."+eu(i[8],r)),e=i.join("")}else e=",."+tu(r[2])+"f";return ao.format(e)}function tu(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function eu(n,t){var e=tu(t[2]);return n in kl?Math.abs(e-tu(Math.max(xo(t[0]),xo(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ru(n,t,e,r){function i(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(i(t))}return o.invert=function(t){return u(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),o):t},o.nice=function(){var t=Xi(r.map(i),e?Math:El);return n.domain(t),r=t.map(u),o},o.ticks=function(){var n=Yi(r),o=[],a=n[0],l=n[1],c=Math.floor(i(a)),f=Math.ceil(i(l)),s=t%1?2:t;if(isFinite(f-c)){if(e){for(;f>c;c++)for(var h=1;s>h;h++)o.push(u(c)*h);o.push(u(c))}else for(o.push(u(c));c++0;h--)o.push(u(c)*h);for(c=0;o[c]l;f--);o=o.slice(c,f)}return o},o.tickFormat=function(n,e){if(!arguments.length)return Nl;arguments.length<2?e=Nl:"function"!=typeof e&&(e=ao.format(e));var r=Math.max(1,t*n/o.ticks().length);return function(n){var o=n/u(Math.round(i(n)));return t-.5>o*t&&(o*=t),r>=o?e(n):""}},o.copy=function(){return ru(n.copy(),t,e,r)},Ji(o,n)}function iu(n,t,e){function r(t){return n(i(t))}var i=uu(t),u=uu(1/t);return r.invert=function(t){return u(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(i)),r):e},r.ticks=function(n){return Qi(e,n)},r.tickFormat=function(n,t){return nu(e,n,t)},r.nice=function(n){return r.domain(Gi(e,n))},r.exponent=function(o){return arguments.length?(i=uu(t=o),u=uu(1/t),n.domain(e.map(i)),r):t},r.copy=function(){return iu(n.copy(),t,e)},Ji(r,n)}function uu(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ou(n,t){function e(e){return u[((i.get(e)||("range"===t.t?i.set(e,n.push(e)):NaN))-1)%u.length]}function r(t,e){return ao.range(n.length).map(function(n){return t+e*n})}var i,u,o;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new c;for(var u,o=-1,a=r.length;++oe?[NaN,NaN]:[e>0?a[e-1]:n[0],et?NaN:t/u+n,[t,t+1/u]},r.copy=function(){return lu(n,t,e)},i()}function cu(n,t){function e(e){return e>=e?t[ao.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return cu(n,t)},e}function fu(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qi(n,t)},t.tickFormat=function(t,e){return nu(n,t,e)},t.copy=function(){return fu(n)},t}function su(){return 0}function hu(n){return n.innerRadius}function pu(n){return n.outerRadius}function gu(n){return n.startAngle}function vu(n){return n.endAngle}function du(n){return n&&n.padAngle}function yu(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function mu(n,t,e,r,i){var u=n[0]-t[0],o=n[1]-t[1],a=(i?r:-r)/Math.sqrt(u*u+o*o),l=a*o,c=-a*u,f=n[0]+l,s=n[1]+c,h=t[0]+l,p=t[1]+c,g=(f+h)/2,v=(s+p)/2,d=h-f,y=p-s,m=d*d+y*y,M=e-r,x=f*p-h*s,b=(0>y?-1:1)*Math.sqrt(Math.max(0,M*M*m-x*x)),_=(x*y-d*b)/m,w=(-x*d-y*b)/m,S=(x*y+d*b)/m,k=(-x*d+y*b)/m,N=_-g,E=w-v,A=S-g,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mu(n){function t(t){function o(){c.push("M",u(n(f),a))}for(var l,c=[],f=[],s=-1,h=t.length,p=En(e),g=En(r);++s1?n.join("L"):n+"Z"}function bu(n){return n.join("L")+"Z"}function _u(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1&&i.push("H",r[0]),i.join("")}function wu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1){a=t[1],u=n[l],l++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1];for(var c=2;c9&&(i=3*t/Math.sqrt(i),o[a]=i*e,o[a+1]=i*r));for(a=-1;++a<=l;)i=(n[Math.min(l,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),u.push([i||0,o[a]*i||0]);return u}function Fu(n){return n.length<3?xu(n):n[0]+Au(n,ju(n))}function Hu(n){for(var t,e,r,i=-1,u=n.length;++i=t?o(n-t):void(f.c=o)}function o(e){var i=g.active,u=g[i];u&&(u.timer.c=null,u.timer.t=NaN,--g.count,delete g[i],u.event&&u.event.interrupt.call(n,n.__data__,u.index));for(var o in g)if(r>+o){var c=g[o];c.timer.c=null,c.timer.t=NaN,--g.count,delete g[o]}f.c=a,qn(function(){return f.c&&a(e||1)&&(f.c=null,f.t=NaN),1},0,l),g.active=r,v.event&&v.event.start.call(n,n.__data__,t),p=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&p.push(r)}),h=v.ease,s=v.duration}function a(i){for(var u=i/s,o=h(u),a=p.length;a>0;)p[--a].call(n,o);return u>=1?(v.event&&v.event.end.call(n,n.__data__,t),--g.count?delete g[r]:delete n[e],1):void 0}var l,f,s,h,p,g=n[e]||(n[e]={active:0,count:0}),v=g[r];v||(l=i.time,f=qn(u,0,l),v=g[r]={tween:new c,time:l,timer:f,delay:i.delay,duration:i.duration,ease:i.ease,index:t},i=null,++g.count)}function no(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function to(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function eo(n){return n.toISOString()}function ro(n,t,e){function r(t){return n(t)}function i(n,e){var r=n[1]-n[0],i=r/e,u=ao.bisect(Kl,i);return u==Kl.length?[t.year,Ki(n.map(function(n){return n/31536e6}),e)[2]]:u?t[i/Kl[u-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yi(r.domain()),u=null==n?i(e,10):"number"==typeof n?i(e,n):!n.range&&[{range:n},t];return u&&(n=u[0],t=u[1]),n.range(e[0],io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ro(n.copy(),t,e)},Ji(r,n)}function io(n){return new Date(n)}function uo(n){return JSON.parse(n.responseText)}function oo(n){var t=fo.createRange();return t.selectNode(fo.body),t.createContextualFragment(n.responseText)}var ao={version:"3.5.17"},lo=[].slice,co=function(n){return lo.call(n)},fo=this.document;if(fo)try{co(fo.documentElement.childNodes)[0].nodeType}catch(so){co=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),fo)try{fo.createElement("DIV").style.setProperty("opacity",0,"")}catch(ho){var po=this.Element.prototype,go=po.setAttribute,vo=po.setAttributeNS,yo=this.CSSStyleDeclaration.prototype,mo=yo.setProperty;po.setAttribute=function(n,t){go.call(this,n,t+"")},po.setAttributeNS=function(n,t,e){vo.call(this,n,t,e+"")},yo.setProperty=function(n,t,e){mo.call(this,n,t+"",e)}}ao.ascending=e,ao.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},ao.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ir&&(e=r)}else{for(;++i=r){e=r;break}for(;++ir&&(e=r)}return e},ao.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ie&&(e=r)}else{for(;++i=r){e=r;break}for(;++ie&&(e=r)}return e},ao.extent=function(n,t){var e,r,i,u=-1,o=n.length;if(1===arguments.length){for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}else{for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}return[e,i]},ao.sum=function(n,t){var e,r=0,u=n.length,o=-1;if(1===arguments.length)for(;++o1?l/(f-1):void 0},ao.deviation=function(){var n=ao.variance.apply(this,arguments);return n?Math.sqrt(n):n};var Mo=u(e);ao.bisectLeft=Mo.left,ao.bisect=ao.bisectRight=Mo.right,ao.bisector=function(n){return u(1===n.length?function(t,r){return e(n(t),r)}:n)},ao.shuffle=function(n,t,e){(u=arguments.length)<3&&(e=n.length,2>u&&(t=0));for(var r,i,u=e-t;u;)i=Math.random()*u--|0,r=n[u+t],n[u+t]=n[i+t],n[i+t]=r;return n},ao.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ao.pairs=function(n){for(var t,e=0,r=n.length-1,i=n[0],u=new Array(0>r?0:r);r>e;)u[e]=[t=i,i=n[++e]];return u},ao.transpose=function(n){if(!(i=n.length))return[];for(var t=-1,e=ao.min(n,o),r=new Array(e);++t=0;)for(r=n[i],t=r.length;--t>=0;)e[--o]=r[t];return e};var xo=Math.abs;ao.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,i=[],u=a(xo(e)),o=-1;if(n*=u,t*=u,e*=u,0>e)for(;(r=n+e*++o)>t;)i.push(r/u);else for(;(r=n+e*++o)=u.length)return r?r.call(i,o):e?o.sort(e):o;for(var l,f,s,h,p=-1,g=o.length,v=u[a++],d=new c;++p=u.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,i={},u=[],o=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(ao.map,e,0),0)},i.key=function(n){return u.push(n),i},i.sortKeys=function(n){return o[u.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},ao.set=function(n){var t=new y;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(y,{has:h,add:function(n){return this._[f(n+="")]=!0,n},remove:p,values:g,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,s(t))}}),ao.behavior={},ao.rebind=function(n,t){for(var e,r=1,i=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ao.event=null,ao.requote=function(n){return n.replace(So,"\\$&")};var So=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ko={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},No=function(n,t){return t.querySelector(n)},Eo=function(n,t){return t.querySelectorAll(n)},Ao=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ao=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(No=function(n,t){return Sizzle(n,t)[0]||null},Eo=Sizzle,Ao=Sizzle.matchesSelector),ao.selection=function(){return ao.select(fo.documentElement)};var Co=ao.selection.prototype=[];Co.select=function(n){var t,e,r,i,u=[];n=A(n);for(var o=-1,a=this.length;++o=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Lo.hasOwnProperty(e)?{space:Lo[e],local:n}:n}},Co.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ao.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Co.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,i=-1;if(t=e.classList){for(;++ii){if("string"!=typeof n){2>i&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>i){var u=this.node();return t(u).getComputedStyle(u,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Co.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},Co.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Co.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Co.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Co.insert=function(n,t){return n=j(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Co.remove=function(){return this.each(F)},Co.data=function(n,t){function e(n,e){var r,i,u,o=n.length,s=e.length,h=Math.min(o,s),p=new Array(s),g=new Array(s),v=new Array(o);if(t){var d,y=new c,m=new Array(o);for(r=-1;++rr;++r)g[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}g.update=p,g.parentNode=p.parentNode=v.parentNode=n.parentNode,a.push(g),l.push(p),f.push(v)}var r,i,u=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++uu;u++){i.push(t=[]),t.parentNode=(e=this[u]).parentNode;for(var a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return E(i)},Co.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},Co.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,i=e.length;i>r;r++){var u=e[r];if(u)return u}return null},Co.size=function(){var n=0;return Y(this,function(){++n}),n};var qo=[];ao.selection.enter=Z,ao.selection.enter.prototype=qo,qo.append=Co.append,qo.empty=Co.empty,qo.node=Co.node,qo.call=Co.call,qo.size=Co.size,qo.select=function(n){for(var t,e,r,i,u,o=[],a=-1,l=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var To=ao.map({mouseenter:"mouseover",mouseleave:"mouseout"});fo&&To.forEach(function(n){"on"+n in fo&&To.remove(n)});var Ro,Do=0;ao.mouse=function(n){return J(n,k())};var Po=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ao.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,i=0,u=t.length;u>i;++i)if((r=t[i]).identifier===e)return J(n,r)},ao.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",o)}function e(n,t,e,u,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],g|=n|e,M=r,p({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(y.on(u+d,null).on(o+d,null),m(g),p({type:"dragend"}))}var c,f=this,s=ao.event.target.correspondingElement||ao.event.target,h=f.parentNode,p=r.of(f,arguments),g=0,v=n(),d=".drag"+(null==v?"":"-"+v),y=ao.select(e(s)).on(u+d,a).on(o+d,l),m=W(s),M=t(h,v);i?(c=i.apply(f,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],p({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),i=null,u=e(b,ao.mouse,t,"mousemove","mouseup"),o=e(G,ao.touch,m,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},ao.rebind(n,r,"on")},ao.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?co(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Uo=1e-6,jo=Uo*Uo,Fo=Math.PI,Ho=2*Fo,Oo=Ho-Uo,Io=Fo/2,Yo=Fo/180,Zo=180/Fo,Vo=Math.SQRT2,Xo=2,$o=4;ao.interpolateZoom=function(n,t){var e,r,i=n[0],u=n[1],o=n[2],a=t[0],l=t[1],c=t[2],f=a-i,s=l-u,h=f*f+s*s;if(jo>h)r=Math.log(c/o)/Vo,e=function(n){return[i+n*f,u+n*s,o*Math.exp(Vo*n*r)]};else{var p=Math.sqrt(h),g=(c*c-o*o+$o*h)/(2*o*Xo*p),v=(c*c-o*o-$o*h)/(2*c*Xo*p),d=Math.log(Math.sqrt(g*g+1)-g),y=Math.log(Math.sqrt(v*v+1)-v);r=(y-d)/Vo,e=function(n){var t=n*r,e=rn(d),a=o/(Xo*p)*(e*un(Vo*t+d)-en(d));return[i+a*f,u+a*s,o*e/rn(Vo*t+d)]}}return e.duration=1e3*r,e},ao.behavior.zoom=function(){function n(n){n.on(L,s).on(Wo+".zoom",p).on("dblclick.zoom",g).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function i(n){k.k=Math.max(A[0],Math.min(A[1],n))}function u(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},i(Math.pow(2,o)),u(d=e,r),t=ao.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function f(n){--z||(n({type:"zoomend"}),d=null)}function s(){function n(){a=1,u(ao.mouse(i),h),c(o)}function r(){s.on(q,null).on(T,null),p(a),f(o)}var i=this,o=D.of(i,arguments),a=0,s=ao.select(t(i)).on(q,n).on(T,r),h=e(ao.mouse(i)),p=W(i);Il.call(i),l(o)}function h(){function n(){var n=ao.touches(g);return p=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ao.event.target;ao.select(t).on(x,r).on(b,a),_.push(t);for(var e=ao.event.changedTouches,i=0,u=e.length;u>i;++i)d[e[i].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var f=l[0];o(g,f,d[f.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var f=l[0],s=l[1],h=f[0]-s[0],p=f[1]-s[1];y=h*h+p*p}}function r(){var n,t,e,r,o=ao.touches(g);Il.call(g);for(var a=0,l=o.length;l>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var f=(f=e[0]-n[0])*f+(f=e[1]-n[1])*f,s=y&&Math.sqrt(f/y);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],i(s*p)}M=null,u(n,t),c(v)}function a(){if(ao.event.touches.length){for(var t=ao.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var i in d)return void n()}ao.selectAll(_).on(m,null),w.on(L,s).on(R,h),N(),f(v)}var p,g=this,v=D.of(g,arguments),d={},y=0,m=".zoom-"+ao.event.changedTouches[0].identifier,x="touchmove"+m,b="touchend"+m,_=[],w=ao.select(g),N=W(g);t(),l(v),w.on(L,null).on(R,t)}function p(){var n=D.of(this,arguments);m?clearTimeout(m):(Il.call(this),v=e(d=y||ao.mouse(this)),l(n)),m=setTimeout(function(){m=null,f(n)},50),S(),i(Math.pow(2,.002*Bo())*k.k),u(d,v),c(n)}function g(){var n=ao.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ao.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,y,m,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Jo,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=N(n,"zoomstart","zoom","zoomend");return Wo||(Wo="onwheel"in fo?(Bo=function(){return-ao.event.deltaY*(ao.event.deltaMode?120:1)},"wheel"):"onmousewheel"in fo?(Bo=function(){return ao.event.wheelDelta},"mousewheel"):(Bo=function(){return-ao.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Hl?ao.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],i=d?d[0]:e/2,u=d?d[1]:r/2,o=ao.interpolateZoom([(i-k.x)/k.k,(u-k.y)/k.k,e/k.k],[(i-t.x)/t.k,(u-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:i-r[0]*a,y:u-r[1]*a,k:a},c(n)}}).each("interrupt.zoom",function(){f(n)}).each("end.zoom",function(){f(n)}):(this.__chart__=k,l(n),c(n),f(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},i(+t),a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Jo:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(y=t&&[+t[0],+t[1]],n):y},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ao.rebind(n,D,"on")};var Bo,Wo,Jo=[0,1/0];ao.color=an,an.prototype.toString=function(){return this.rgb()+""},ao.hsl=ln;var Go=ln.prototype=new an;Go.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Go.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Go.rgb=function(){return cn(this.h,this.s,this.l)},ao.hcl=fn;var Ko=fn.prototype=new an;Ko.brighter=function(n){return new fn(this.h,this.c,Math.min(100,this.l+Qo*(arguments.length?n:1)))},Ko.darker=function(n){return new fn(this.h,this.c,Math.max(0,this.l-Qo*(arguments.length?n:1)))},Ko.rgb=function(){return sn(this.h,this.c,this.l).rgb()},ao.lab=hn;var Qo=18,na=.95047,ta=1,ea=1.08883,ra=hn.prototype=new an;ra.brighter=function(n){return new hn(Math.min(100,this.l+Qo*(arguments.length?n:1)),this.a,this.b)},ra.darker=function(n){return new hn(Math.max(0,this.l-Qo*(arguments.length?n:1)),this.a,this.b)},ra.rgb=function(){return pn(this.l,this.a,this.b)},ao.rgb=mn;var ia=mn.prototype=new an;ia.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,i=30;return t||e||r?(t&&i>t&&(t=i),e&&i>e&&(e=i),r&&i>r&&(r=i),new mn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mn(i,i,i)},ia.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mn(n*this.r,n*this.g,n*this.b)},ia.hsl=function(){return wn(this.r,this.g,this.b)},ia.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ua=ao.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ua.forEach(function(n,t){ua.set(n,Mn(t))}),ao.functor=En,ao.xhr=An(m),ao.dsv=function(n,t){function e(n,e,u){arguments.length<3&&(u=e,e=null);var o=Cn(n,t,null==e?r:i(e),u);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:i(n)):e},o}function r(n){return e.parse(n.responseText)}function i(n){return function(t){return e.parse(t.responseText,n)}}function u(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var i=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(i(n),e)}:i})},e.parseRows=function(n,t){function e(){if(f>=c)return o;if(i)return i=!1,u;var t=f;if(34===n.charCodeAt(t)){for(var e=t;e++f;){var r=n.charCodeAt(f++),a=1;if(10===r)i=!0;else if(13===r)i=!0,10===n.charCodeAt(f)&&(++f,++a);else if(r!==l)continue;return n.slice(t,f-a)}return n.slice(t)}for(var r,i,u={},o={},a=[],c=n.length,f=0,s=0;(r=e())!==o;){for(var h=[];r!==u&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,s++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new y,i=[];return t.forEach(function(n){for(var t in n)r.has(t)||i.push(r.add(t))}),[i.map(o).join(n)].concat(t.map(function(t){return i.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(u).join("\n")},e},ao.csv=ao.dsv(",","text/csv"),ao.tsv=ao.dsv(" ","text/tab-separated-values");var oa,aa,la,ca,fa=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ao.timer=function(){qn.apply(this,arguments)},ao.timer.flush=function(){Rn(),Dn()},ao.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var sa=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Un);ao.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=ao.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),sa[8+e/3]};var ha=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,pa=ao.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ao.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ga=ao.time={},va=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){da.setUTCDate.apply(this._,arguments)},setDay:function(){da.setUTCDay.apply(this._,arguments)},setFullYear:function(){da.setUTCFullYear.apply(this._,arguments)},setHours:function(){da.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){da.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){da.setUTCMinutes.apply(this._,arguments)},setMonth:function(){da.setUTCMonth.apply(this._,arguments)},setSeconds:function(){da.setUTCSeconds.apply(this._,arguments)},setTime:function(){da.setTime.apply(this._,arguments)}};var da=Date.prototype;ga.year=On(function(n){return n=ga.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ga.years=ga.year.range,ga.years.utc=ga.year.utc.range,ga.day=On(function(n){var t=new va(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ga.days=ga.day.range,ga.days.utc=ga.day.utc.range,ga.dayOfYear=function(n){var t=ga.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ga[n]=On(function(n){return(n=ga.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ga[n+"s"]=e.range,ga[n+"s"].utc=e.utc.range,ga[n+"OfYear"]=function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)}}),ga.week=ga.sunday,ga.weeks=ga.sunday.range,ga.weeks.utc=ga.sunday.utc.range,ga.weekOfYear=ga.sundayOfYear;var ya={"-":"",_:" ",0:"0"},ma=/^\s*\d+/,Ma=/^%/;ao.locale=function(n){return{numberFormat:jn(n),timeFormat:Yn(n)}};var xa=ao.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], -shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ao.format=xa.numberFormat,ao.geo={},ft.prototype={s:0,t:0,add:function(n){st(n,this.t,ba),st(ba.s,this.s,this),this.s?this.t+=ba.t:this.s=ba.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var ba=new ft;ao.geo.stream=function(n,t){n&&_a.hasOwnProperty(n.type)?_a[n.type](n,t):ht(n,t)};var _a={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,i=e.length;++rn?4*Fo+n:n,Na.lineStart=Na.lineEnd=Na.point=b}};ao.geo.bounds=function(){function n(n,t){M.push(x=[f=n,h=n]),s>t&&(s=t),t>p&&(p=t)}function t(t,e){var r=dt([t*Yo,e*Yo]);if(y){var i=mt(y,r),u=[i[1],-i[0],0],o=mt(u,i);bt(o),o=_t(o);var l=t-g,c=l>0?1:-1,v=o[0]*Zo*c,d=xo(l)>180;if(d^(v>c*g&&c*t>v)){var m=o[1]*Zo;m>p&&(p=m)}else if(v=(v+360)%360-180,d^(v>c*g&&c*t>v)){var m=-o[1]*Zo;s>m&&(s=m)}else s>e&&(s=e),e>p&&(p=e);d?g>t?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t):h>=f?(f>t&&(f=t),t>h&&(h=t)):t>g?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t)}else n(t,e);y=r,g=t}function e(){b.point=t}function r(){x[0]=f,x[1]=h,b.point=n,y=null}function i(n,e){if(y){var r=n-g;m+=xo(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Na.point(n,e),t(n,e)}function u(){Na.lineStart()}function o(){i(v,d),Na.lineEnd(),xo(m)>Uo&&(f=-(h=180)),x[0]=f,x[1]=h,y=null}function a(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nka?(f=-(h=180),s=-(p=90)):m>Uo?p=90:-Uo>m&&(s=-90),x[0]=f,x[1]=h}};return function(n){p=h=-(f=s=1/0),M=[],ao.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,i=M[0],u=[i];t>r;++r)e=M[r],c(e[0],i)||c(e[1],i)?(a(i[0],e[1])>a(i[0],i[1])&&(i[1]=e[1]),a(e[0],i[1])>a(i[0],i[1])&&(i[0]=e[0])):u.push(i=e);for(var o,e,g=-(1/0),t=u.length-1,r=0,i=u[t];t>=r;i=e,++r)e=u[r],(o=a(i[1],e[0]))>g&&(g=o,f=e[0],h=i[1])}return M=x=null,f===1/0||s===1/0?[[NaN,NaN],[NaN,NaN]]:[[f,s],[h,p]]}}(),ao.geo.centroid=function(n){Ea=Aa=Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,ja);var t=Da,e=Pa,r=Ua,i=t*t+e*e+r*r;return jo>i&&(t=qa,e=Ta,r=Ra,Uo>Aa&&(t=Ca,e=za,r=La),i=t*t+e*e+r*r,jo>i)?[NaN,NaN]:[Math.atan2(e,t)*Zo,tn(r/Math.sqrt(i))*Zo]};var Ea,Aa,Ca,za,La,qa,Ta,Ra,Da,Pa,Ua,ja={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){ja.lineStart=At},polygonEnd:function(){ja.lineStart=Nt}},Fa=Rt(zt,jt,Ht,[-Fo,-Fo/2]),Ha=1e9;ao.geo.clipExtent=function(){var n,t,e,r,i,u,o={stream:function(n){return i&&(i.valid=!1),i=u(n),i.valid=!0,i},extent:function(a){return arguments.length?(u=Zt(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),i&&(i.valid=!1,i=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ao.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,ao.geo.albers=function(){return ao.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ao.geo.albersUsa=function(){function n(n){var u=n[0],o=n[1];return t=null,e(u,o),t||(r(u,o),t)||i(u,o),t}var t,e,r,i,u=ao.geo.albers(),o=ao.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ao.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=u.scale(),e=u.translate(),r=(n[0]-e[0])/t,i=(n[1]-e[1])/t;return(i>=.12&&.234>i&&r>=-.425&&-.214>r?o:i>=.166&&.234>i&&r>=-.214&&-.115>r?a:u).invert(n)},n.stream=function(n){var t=u.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,i){t.point(n,i),e.point(n,i),r.point(n,i)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(u.precision(t),o.precision(t),a.precision(t),n):u.precision()},n.scale=function(t){return arguments.length?(u.scale(t),o.scale(.35*t),a.scale(t),n.translate(u.translate())):u.scale()},n.translate=function(t){if(!arguments.length)return u.translate();var c=u.scale(),f=+t[0],s=+t[1];return e=u.translate(t).clipExtent([[f-.455*c,s-.238*c],[f+.455*c,s+.238*c]]).stream(l).point,r=o.translate([f-.307*c,s+.201*c]).clipExtent([[f-.425*c+Uo,s+.12*c+Uo],[f-.214*c-Uo,s+.234*c-Uo]]).stream(l).point,i=a.translate([f-.205*c,s+.212*c]).clipExtent([[f-.214*c+Uo,s+.166*c+Uo],[f-.115*c-Uo,s+.234*c-Uo]]).stream(l).point,n},n.scale(1070)};var Oa,Ia,Ya,Za,Va,Xa,$a={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Ia=0,$a.lineStart=$t},polygonEnd:function(){$a.lineStart=$a.lineEnd=$a.point=b,Oa+=xo(Ia/2)}},Ba={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Wa={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Wa.lineStart=ne},polygonEnd:function(){Wa.point=Gt,Wa.lineStart=Kt,Wa.lineEnd=Qt}};ao.geo.path=function(){function n(n){return n&&("function"==typeof a&&u.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=i(u)),ao.geo.stream(n,o)),u.result()}function t(){return o=null,n}var e,r,i,u,o,a=4.5;return n.area=function(n){return Oa=0,ao.geo.stream(n,i($a)),Oa},n.centroid=function(n){return Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,i(Wa)),Ua?[Da/Ua,Pa/Ua]:Ra?[qa/Ra,Ta/Ra]:La?[Ca/La,za/La]:[NaN,NaN]},n.bounds=function(n){return Va=Xa=-(Ya=Za=1/0),ao.geo.stream(n,i(Ba)),[[Ya,Za],[Va,Xa]]},n.projection=function(n){return arguments.length?(i=(e=n)?n.stream||re(n):m,t()):e},n.context=function(n){return arguments.length?(u=null==(r=n)?new Wt:new te(n),"function"!=typeof a&&u.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(u.pointRadius(+t),+t),n):a},n.projection(ao.geo.albersUsa()).context(null)},ao.geo.transform=function(n){return{stream:function(t){var e=new ie(t);for(var r in n)e[r]=n[r];return e}}},ie.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ao.geo.projection=oe,ao.geo.projectionMutator=ae,(ao.geo.equirectangular=function(){return oe(ce)}).raw=ce.invert=ce,ao.geo.rotation=function(n){function t(t){return t=n(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t}return n=se(n[0]%360*Yo,n[1]*Yo,n.length>2?n[2]*Yo:0),t.invert=function(t){return t=n.invert(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t},t},fe.invert=ce,ao.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=se(-n[0]*Yo,-n[1]*Yo,0).invert,i=[];return e(null,null,1,{point:function(n,e){i.push(n=t(n,e)),n[0]*=Zo,n[1]*=Zo}}),{type:"Polygon",coordinates:[i]}}var t,e,r=[0,0],i=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Yo,i*Yo),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Yo,(i=+r)*Yo),n):i},n.angle(90)},ao.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Yo,i=n[1]*Yo,u=t[1]*Yo,o=Math.sin(r),a=Math.cos(r),l=Math.sin(i),c=Math.cos(i),f=Math.sin(u),s=Math.cos(u);return Math.atan2(Math.sqrt((e=s*o)*e+(e=c*f-l*s*a)*e),l*f+c*s*a)},ao.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ao.range(Math.ceil(u/d)*d,i,d).map(h).concat(ao.range(Math.ceil(c/y)*y,l,y).map(p)).concat(ao.range(Math.ceil(r/g)*g,e,g).filter(function(n){return xo(n%d)>Uo}).map(f)).concat(ao.range(Math.ceil(a/v)*v,o,v).filter(function(n){return xo(n%y)>Uo}).map(s))}var e,r,i,u,o,a,l,c,f,s,h,p,g=10,v=g,d=90,y=360,m=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(p(l).slice(1),h(i).reverse().slice(1),p(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(u=+t[0][0],i=+t[1][0],c=+t[0][1],l=+t[1][1],u>i&&(t=u,u=i,i=t),c>l&&(t=c,c=l,l=t),n.precision(m)):[[u,c],[i,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(m)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],y=+t[1],n):[d,y]},n.minorStep=function(t){return arguments.length?(g=+t[0],v=+t[1],n):[g,v]},n.precision=function(t){return arguments.length?(m=+t,f=ye(a,o,90),s=me(r,e,m),h=ye(c,l,90),p=me(u,i,m),n):m},n.majorExtent([[-180,-90+Uo],[180,90-Uo]]).minorExtent([[-180,-80-Uo],[180,80+Uo]])},ao.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||i.apply(this,arguments)]}}var t,e,r=Me,i=xe;return n.distance=function(){return ao.geo.distance(t||r.apply(this,arguments),e||i.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(i=t,e="function"==typeof t?null:t,n):i},n.precision=function(){return arguments.length?n:0},n},ao.geo.interpolate=function(n,t){return be(n[0]*Yo,n[1]*Yo,t[0]*Yo,t[1]*Yo)},ao.geo.length=function(n){return Ja=0,ao.geo.stream(n,Ga),Ja};var Ja,Ga={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Ka=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ao.geo.azimuthalEqualArea=function(){return oe(Ka)}).raw=Ka;var Qa=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},m);(ao.geo.azimuthalEquidistant=function(){return oe(Qa)}).raw=Qa,(ao.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(ao.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var nl=we(function(n){return 1/n},Math.atan);(ao.geo.gnomonic=function(){return oe(nl)}).raw=nl,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Io]},(ao.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var tl=we(function(){return 1},Math.asin);(ao.geo.orthographic=function(){return oe(tl)}).raw=tl;var el=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ao.geo.stereographic=function(){return oe(el)}).raw=el,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Io]},(ao.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,ao.geom={},ao.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,i=En(e),u=En(r),o=n.length,a=[],l=[];for(t=0;o>t;t++)a.push([+i.call(this,n[t],t),+u.call(this,n[t],t),t]);for(a.sort(qe),t=0;o>t;t++)l.push([a[t][0],-a[t][1]]);var c=Le(a),f=Le(l),s=f[0]===c[0],h=f[f.length-1]===c[c.length-1],p=[];for(t=c.length-1;t>=0;--t)p.push(n[a[c[t]][2]]);for(t=+s;t=r&&c.x<=u&&c.y>=i&&c.y<=o?[[r,o],[u,o],[u,i],[r,i]]:[];f.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(u(n,t)/Uo)*Uo,y:Math.round(o(n,t)/Uo)*Uo,i:t}})}var r=Ce,i=ze,u=r,o=i,a=sl;return n?t(n):(t.links=function(n){return ar(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return ar(e(n)).cells.forEach(function(e,r){for(var i,u,o=e.site,a=e.edges.sort(Ve),l=-1,c=a.length,f=a[c-1].edge,s=f.l===o?f.r:f.l;++l=c,h=r>=f,p=h<<1|s;n.leaf=!1,n=n.nodes[p]||(n.nodes[p]=hr()),s?i=c:a=c,h?o=f:l=f,u(n,t,e,r,i,o,a,l)}var f,s,h,p,g,v,d,y,m,M=En(a),x=En(l);if(null!=t)v=t,d=e,y=r,m=i;else if(y=m=-(v=d=1/0),s=[],h=[],g=n.length,o)for(p=0;g>p;++p)f=n[p],f.xy&&(y=f.x),f.y>m&&(m=f.y),s.push(f.x),h.push(f.y);else for(p=0;g>p;++p){var b=+M(f=n[p],p),_=+x(f,p);v>b&&(v=b),d>_&&(d=_),b>y&&(y=b),_>m&&(m=_),s.push(b),h.push(_)}var w=y-v,S=m-d;w>S?m=d+w:y=v+S;var k=hr();if(k.add=function(n){u(k,n,+M(n,++p),+x(n,p),v,d,y,m)},k.visit=function(n){pr(n,k,v,d,y,m)},k.find=function(n){return gr(k,n[0],n[1],v,d,y,m)},p=-1,null==t){for(;++p=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=vl.get(e)||gl,r=dl.get(r)||m,br(r(e.apply(null,lo.call(arguments,1))))},ao.interpolateHcl=Rr,ao.interpolateHsl=Dr,ao.interpolateLab=Pr,ao.interpolateRound=Ur,ao.transform=function(n){var t=fo.createElementNS(ao.ns.prefix.svg,"g");return(ao.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new jr(e?e.matrix:yl)})(n)},jr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var yl={a:1,b:0,c:0,d:1,e:0,f:0};ao.interpolateTransform=$r,ao.layout={},ao.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/y){if(v>l){var c=t.charge/l;n.px-=u*c,n.py-=o*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=u*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=ao.event.x,n.py=ao.event.y,l.resume()}var e,r,i,u,o,a,l={},c=ao.dispatch("start","tick","end"),f=[1,1],s=.9,h=ml,p=Ml,g=-30,v=xl,d=.1,y=.64,M=[],x=[];return l.tick=function(){if((i*=.99)<.005)return e=null,c.end({type:"end",alpha:i=0}),!0;var t,r,l,h,p,v,y,m,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,p=l.target,m=p.x-h.x,b=p.y-h.y,(v=m*m+b*b)&&(v=i*o[r]*((v=Math.sqrt(v))-u[r])/v,m*=v,b*=v,p.x-=m*(y=h.weight+p.weight?h.weight/(h.weight+p.weight):.5),p.y-=b*y,h.x+=m*(y=1-y),h.y+=b*y);if((y=i*d)&&(m=f[0]/2,b=f[1]/2,r=-1,y))for(;++r<_;)l=M[r],l.x+=(m-l.x)*y,l.y+=(b-l.y)*y;if(g)for(ri(t=ao.geom.quadtree(M),i,a),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*s,l.y-=(l.py-(l.py=l.y))*s);c.tick({type:"tick",alpha:i})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(f=n,l):f},l.linkDistance=function(n){return arguments.length?(h="function"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(p="function"==typeof n?n:+n,l):p},l.friction=function(n){return arguments.length?(s=+n,l):s},l.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,l):g},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(y=n*n,l):Math.sqrt(y)},l.alpha=function(n){return arguments.length?(n=+n,i?n>0?i=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:i=0})):n>0&&(c.start({type:"start",alpha:i=n}),e=qn(l.tick)),l):i},l.start=function(){function n(n,r){if(!e){for(e=new Array(i),l=0;i>l;++l)e[l]=[];for(l=0;c>l;++l){var u=x[l];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var o,a=e[t],l=-1,f=a.length;++lt;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],"number"==typeof r.source&&(r.source=M[r.source]),"number"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;i>t;++t)r=M[t],isNaN(r.x)&&(r.x=n("x",s)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof h)for(t=0;c>t;++t)u[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)u[t]=h;if(o=[],"function"==typeof p)for(t=0;c>t;++t)o[t]=+p.call(this,x[t],t);else for(t=0;c>t;++t)o[t]=p;if(a=[],"function"==typeof g)for(t=0;i>t;++t)a[t]=+g.call(this,M[t],t);else for(t=0;i>t;++t)a[t]=g;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=ao.behavior.drag().origin(m).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",ni)),arguments.length?void this.on("mouseover.force",ti).on("mouseout.force",ei).call(r):r},ao.rebind(l,c,"on")};var ml=20,Ml=1,xl=1/0;ao.layout.hierarchy=function(){function n(i){var u,o=[i],a=[];for(i.depth=0;null!=(u=o.pop());)if(a.push(u),(c=e.call(n,u,u.depth))&&(l=c.length)){for(var l,c,f;--l>=0;)o.push(f=c[l]),f.parent=u,f.depth=u.depth+1;r&&(u.value=0),u.children=c}else r&&(u.value=+r.call(n,u,u.depth)||0),delete u.children;return oi(i,function(n){var e,i;t&&(e=n.children)&&e.sort(t),r&&(i=n.parent)&&(i.value+=n.value)}),a}var t=ci,e=ai,r=li;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(ui(t,function(n){n.children&&(n.value=0)}),oi(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ao.layout.partition=function(){function n(t,e,r,i){var u=t.children;if(t.x=e,t.y=t.depth*i,t.dx=r,t.dy=i,u&&(o=u.length)){var o,a,l,c=-1;for(r=t.value?r/t.value:0;++cs?-1:1),g=ao.sum(c),v=g?(s-l*p)/g:0,d=ao.range(l),y=[];return null!=e&&d.sort(e===bl?function(n,t){return c[t]-c[n]}:function(n,t){return e(o[n],o[t])}),d.forEach(function(n){y[n]={data:o[n],value:a=c[n],startAngle:f,endAngle:f+=a*v+p,padAngle:h}}),y}var t=Number,e=bl,r=0,i=Ho,u=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(i=t,n):i},n.padAngle=function(t){return arguments.length?(u=t,n):u},n};var bl={};ao.layout.stack=function(){function n(a,l){if(!(h=a.length))return a;var c=a.map(function(e,r){return t.call(n,e,r)}),f=c.map(function(t){return t.map(function(t,e){return[u.call(n,t,e),o.call(n,t,e)]})}),s=e.call(n,f,l);c=ao.permute(c,s),f=ao.permute(f,s);var h,p,g,v,d=r.call(n,f,l),y=c[0].length;for(g=0;y>g;++g)for(i.call(n,c[0][g],v=d[g],f[0][g][1]),p=1;h>p;++p)i.call(n,c[p][g],v+=f[p-1][g][1],f[p][g][1]);return a}var t=m,e=gi,r=vi,i=pi,u=si,o=hi;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:_l.get(t)||gi,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:wl.get(t)||vi,n):r},n.x=function(t){return arguments.length?(u=t,n):u},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(i=t,n):i},n};var _l=ao.map({"inside-out":function(n){var t,e,r=n.length,i=n.map(di),u=n.map(yi),o=ao.range(r).sort(function(n,t){return i[n]-i[t]}),a=0,l=0,c=[],f=[];for(t=0;r>t;++t)e=o[t],l>a?(a+=u[e],c.push(e)):(l+=u[e],f.push(e));return f.reverse().concat(c)},reverse:function(n){return ao.range(n.length).reverse()},"default":gi}),wl=ao.map({silhouette:function(n){var t,e,r,i=n.length,u=n[0].length,o=[],a=0,l=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;u>e;++e)l[e]=(a-o[e])/2;return l},wiggle:function(n){var t,e,r,i,u,o,a,l,c,f=n.length,s=n[0],h=s.length,p=[];for(p[0]=l=c=0,e=1;h>e;++e){for(t=0,i=0;f>t;++t)i+=n[t][e][1];for(t=0,u=0,a=s[e][0]-s[e-1][0];f>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;u+=o*n[t][e][1]}p[e]=l-=i?u/i*a:0,c>l&&(c=l)}for(e=0;h>e;++e)p[e]-=c;return p},expand:function(n){var t,e,r,i=n.length,u=n[0].length,o=1/i,a=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];if(r)for(t=0;i>t;t++)n[t][e][1]/=r;else for(t=0;i>t;t++)n[t][e][1]=o}for(e=0;u>e;++e)a[e]=0;return a},zero:vi});ao.layout.histogram=function(){function n(n,u){for(var o,a,l=[],c=n.map(e,this),f=r.call(this,c,u),s=i.call(this,f,c,u),u=-1,h=c.length,p=s.length-1,g=t?1:1/h;++u0)for(u=-1;++u=f[0]&&a<=f[1]&&(o=l[ao.bisect(s,a,1,p)-1],o.y+=g,o.push(n[u]));return l}var t=!0,e=Number,r=bi,i=Mi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(i="number"==typeof t?function(n){return xi(n,t)}:En(t),n):i},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ao.layout.pack=function(){function n(n,u){var o=e.call(this,n,u),a=o[0],l=i[0],c=i[1],f=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,oi(a,function(n){n.r=+f(n.value)}),oi(a,Ni),r){var s=r*(t?1:Math.max(2*a.r/l,2*a.r/c))/2;oi(a,function(n){n.r+=s}),oi(a,Ni),oi(a,function(n){n.r-=s})}return Ci(a,l/2,c/2,t?1:1/Math.max(2*a.r/l,2*a.r/c)),o}var t,e=ao.layout.hierarchy().sort(_i),r=0,i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},ii(n,e)},ao.layout.tree=function(){function n(n,i){var f=o.call(this,n,i),s=f[0],h=t(s);if(oi(h,e),h.parent.m=-h.z,ui(h,r),c)ui(s,u);else{var p=s,g=s,v=s;ui(s,function(n){n.xg.x&&(g=n),n.depth>v.depth&&(v=n)});var d=a(p,g)/2-p.x,y=l[0]/(g.x+a(g,p)/2+d),m=l[1]/(v.depth||1);ui(s,function(n){n.x=(n.x+d)*y,n.y=n.depth*m})}return f}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var i,u=t.children,o=0,a=u.length;a>o;++o)r.push((u[o]=i={_:u[o],parent:t,children:(i=u[o].children)&&i.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=i);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Di(n);var u=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-u):n.z=u}else r&&(n.z=r.z+a(n._,r._));n.parent.A=i(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function i(n,t,e){if(t){for(var r,i=n,u=n,o=t,l=i.parent.children[0],c=i.m,f=u.m,s=o.m,h=l.m;o=Ti(o),i=qi(i),o&&i;)l=qi(l),u=Ti(u),u.a=n,r=o.z+s-i.z-c+a(o._,i._),r>0&&(Ri(Pi(o,n,e),n,r),c+=r,f+=r),s+=o.m,c+=i.m,h+=l.m,f+=u.m;o&&!Ti(u)&&(u.t=o,u.m+=s-f),i&&!qi(l)&&(l.t=i,l.m+=c-h,e=n)}return e}function u(n){n.x*=l[0],n.y=n.depth*l[1]}var o=ao.layout.hierarchy().sort(null).value(null),a=Li,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(c=null==(l=t)?u:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:u,n):c?l:null},ii(n,o)},ao.layout.cluster=function(){function n(n,u){var o,a=t.call(this,n,u),l=a[0],c=0;oi(l,function(n){var t=n.children;t&&t.length?(n.x=ji(t),n.y=Ui(t)):(n.x=o?c+=e(n,o):0,n.y=0,o=n)});var f=Fi(l),s=Hi(l),h=f.x-e(f,s)/2,p=s.x+e(s,f)/2;return oi(l,i?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(p-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),a}var t=ao.layout.hierarchy().sort(null).value(null),e=Li,r=[1,1],i=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(i=null==(r=t),n):i?null:r},n.nodeSize=function(t){return arguments.length?(i=null!=(r=t),n):i?r:null},ii(n,t)},ao.layout.treemap=function(){function n(n,t){for(var e,r,i=-1,u=n.length;++it?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var u=e.children;if(u&&u.length){var o,a,l,c=s(e),f=[],h=u.slice(),g=1/0,v="slice"===p?c.dx:"dice"===p?c.dy:"slice-dice"===p?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),f.area=0;(l=h.length)>0;)f.push(o=h[l-1]),f.area+=o.area,"squarify"!==p||(a=r(f,v))<=g?(h.pop(),g=a):(f.area-=f.pop().area,i(f,v,c,!1),v=Math.min(c.dx,c.dy),f.length=f.area=0,g=1/0);f.length&&(i(f,v,c,!0),f.length=f.area=0),u.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var u,o=s(t),a=r.slice(),l=[];for(n(a,o.dx*o.dy/t.value),l.area=0;u=a.pop();)l.push(u),l.area+=u.area,null!=u.z&&(i(l,u.z?o.dx:o.dy,o,!a.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,i=0,u=1/0,o=-1,a=n.length;++oe&&(u=e),e>i&&(i=e));return r*=r,t*=t,r?Math.max(t*i*g/r,r/(t*u*g)):1/0}function i(n,t,e,r){var i,u=-1,o=n.length,a=e.x,c=e.y,f=t?l(n.area/t):0; -if(t==e.dx){for((r||f>e.dy)&&(f=e.dy);++ue.dx)&&(f=e.dx);++ue&&(t=1),1>e&&(n=0),function(){var e,r,i;do e=2*Math.random()-1,r=2*Math.random()-1,i=e*e+r*r;while(!i||i>1);return n+t*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var n=ao.random.normal.apply(ao,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ao.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ao.scale={};var Sl={floor:m,ceil:m};ao.scale.linear=function(){return Wi([0,1],[0,1],Mr,!1)};var kl={s:1,g:1,p:1,r:1,e:1};ao.scale.log=function(){return ru(ao.scale.linear().domain([0,1]),10,!0,[1,10])};var Nl=ao.format(".0e"),El={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ao.scale.pow=function(){return iu(ao.scale.linear(),1,[0,1])},ao.scale.sqrt=function(){return ao.scale.pow().exponent(.5)},ao.scale.ordinal=function(){return ou([],{t:"range",a:[[]]})},ao.scale.category10=function(){return ao.scale.ordinal().range(Al)},ao.scale.category20=function(){return ao.scale.ordinal().range(Cl)},ao.scale.category20b=function(){return ao.scale.ordinal().range(zl)},ao.scale.category20c=function(){return ao.scale.ordinal().range(Ll)};var Al=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Cl=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),zl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),Ll=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);ao.scale.quantile=function(){return au([],[])},ao.scale.quantize=function(){return lu(0,1,[0,1])},ao.scale.threshold=function(){return cu([.5],[0,1])},ao.scale.identity=function(){return fu([0,1])},ao.svg={},ao.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),f=o.apply(this,arguments)-Io,s=a.apply(this,arguments)-Io,h=Math.abs(s-f),p=f>s?0:1;if(n>c&&(g=c,c=n,n=g),h>=Oo)return t(c,p)+(n?t(n,1-p):"")+"Z";var g,v,d,y,m,M,x,b,_,w,S,k,N=0,E=0,A=[];if((y=(+l.apply(this,arguments)||0)/2)&&(d=u===ql?Math.sqrt(n*n+c*c):+u.apply(this,arguments),p||(E*=-1),c&&(E=tn(d/c*Math.sin(y))),n&&(N=tn(d/n*Math.sin(y)))),c){m=c*Math.cos(f+E),M=c*Math.sin(f+E),x=c*Math.cos(s-E),b=c*Math.sin(s-E);var C=Math.abs(s-f-2*E)<=Fo?0:1;if(E&&yu(m,M,x,b)===p^C){var z=(f+s)/2;m=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else m=M=0;if(n){_=n*Math.cos(s-N),w=n*Math.sin(s-N),S=n*Math.cos(f+N),k=n*Math.sin(f+N);var L=Math.abs(f-s+2*N)<=Fo?0:1;if(N&&yu(_,w,S,k)===1-p^L){var q=(f+s)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Uo&&(g=Math.min(Math.abs(c-n)/2,+i.apply(this,arguments)))>.001){v=c>n^p?0:1;var T=g,R=g;if(Fo>h){var D=null==S?[_,w]:null==x?[m,M]:Re([m,M],[S,k],[x,b],[_,w]),P=m-D[0],U=M-D[1],j=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*j+U*F)/(Math.sqrt(P*P+U*U)*Math.sqrt(j*j+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(g,(n-O)/(H-1)),T=Math.min(g,(c-O)/(H+1))}if(null!=x){var I=mu(null==S?[_,w]:[S,k],[m,M],c,T,p),Y=mu([x,b],[_,w],c,T,p);g===T?A.push("M",I[0],"A",T,",",T," 0 0,",v," ",I[1],"A",c,",",c," 0 ",1-p^yu(I[1][0],I[1][1],Y[1][0],Y[1][1]),",",p," ",Y[1],"A",T,",",T," 0 0,",v," ",Y[0]):A.push("M",I[0],"A",T,",",T," 0 1,",v," ",Y[0])}else A.push("M",m,",",M);if(null!=S){var Z=mu([m,M],[S,k],n,-R,p),V=mu([_,w],null==x?[m,M]:[x,b],n,-R,p);g===R?A.push("L",V[0],"A",R,",",R," 0 0,",v," ",V[1],"A",n,",",n," 0 ",p^yu(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-p," ",Z[1],"A",R,",",R," 0 0,",v," ",Z[0]):A.push("L",V[0],"A",R,",",R," 0 0,",v," ",Z[0])}else A.push("L",_,",",w)}else A.push("M",m,",",M),null!=x&&A.push("A",c,",",c," 0 ",C,",",p," ",x,",",b),A.push("L",_,",",w),null!=S&&A.push("A",n,",",n," 0 ",L,",",1-p," ",S,",",k);return A.push("Z"),A.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=hu,r=pu,i=su,u=ql,o=gu,a=vu,l=du;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(i=En(t),n):i},n.padRadius=function(t){return arguments.length?(u=t==ql?ql:En(t),n):u},n.startAngle=function(t){return arguments.length?(o=En(t),n):o},n.endAngle=function(t){return arguments.length?(a=En(t),n):a},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Io;return[Math.cos(t)*n,Math.sin(t)*n]},n};var ql="auto";ao.svg.line=function(){return Mu(m)};var Tl=ao.map({linear:xu,"linear-closed":bu,step:_u,"step-before":wu,"step-after":Su,basis:zu,"basis-open":Lu,"basis-closed":qu,bundle:Tu,cardinal:Eu,"cardinal-open":ku,"cardinal-closed":Nu,monotone:Fu});Tl.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Rl=[0,2/3,1/3,0],Dl=[0,1/3,2/3,0],Pl=[0,1/6,2/3,1/6];ao.svg.line.radial=function(){var n=Mu(Hu);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wu.reverse=Su,Su.reverse=wu,ao.svg.area=function(){return Ou(m)},ao.svg.area.radial=function(){var n=Ou(Hu);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ao.svg.chord=function(){function n(n,a){var l=t(this,u,n,a),c=t(this,o,n,a);return"M"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?i(l.r,l.p1,l.r,l.p0):i(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+i(c.r,c.p1,l.r,l.p0))+"Z"}function t(n,t,e,r){var i=t.call(n,e,r),u=a.call(n,i,r),o=l.call(n,i,r)-Io,f=c.call(n,i,r)-Io;return{r:u,a0:o,a1:f,p0:[u*Math.cos(o),u*Math.sin(o)],p1:[u*Math.cos(f),u*Math.sin(f)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Fo)+",1 "+t}function i(n,t,e,r){return"Q 0,0 "+r}var u=Me,o=xe,a=Iu,l=gu,c=vu;return n.radius=function(t){return arguments.length?(a=En(t),n):a},n.source=function(t){return arguments.length?(u=En(t),n):u},n.target=function(t){return arguments.length?(o=En(t),n):o},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},ao.svg.diagonal=function(){function n(n,i){var u=t.call(this,n,i),o=e.call(this,n,i),a=(u.y+o.y)/2,l=[u,{x:u.x,y:a},{x:o.x,y:a},o];return l=l.map(r),"M"+l[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=Me,e=xe,r=Yu;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ao.svg.diagonal.radial=function(){var n=ao.svg.diagonal(),t=Yu,e=n.projection;return n.projection=function(n){return arguments.length?e(Zu(t=n)):t},n},ao.svg.symbol=function(){function n(n,r){return(Ul.get(t.call(this,n,r))||$u)(e.call(this,n,r))}var t=Xu,e=Vu;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Ul=ao.map({circle:$u,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Fl)),e=t*Fl;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ao.svg.symbolTypes=Ul.keys();var jl=Math.sqrt(3),Fl=Math.tan(30*Yo);Co.transition=function(n){for(var t,e,r=Hl||++Zl,i=Ku(n),u=[],o=Ol||{time:Date.now(),ease:Nr,delay:0,duration:250},a=-1,l=this.length;++au;u++){i.push(t=[]);for(var e=this[u],a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return Wu(i,this.namespace,this.id)},Yl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(i){i[r][e].tween.set(n,t)})},Yl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function i(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function u(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?$r:Mr,a=ao.ns.qualify(n);return Ju(this,"attr."+n,t,a.local?u:i)},Yl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(i));return r&&function(n){this.setAttribute(i,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(i.space,i.local));return r&&function(n){this.setAttributeNS(i.space,i.local,r(n))}}var i=ao.ns.qualify(n);return this.tween("attr."+n,i.local?r:e)},Yl.style=function(n,e,r){function i(){this.style.removeProperty(n)}function u(e){return null==e?i:(e+="",function(){var i,u=t(this).getComputedStyle(this,null).getPropertyValue(n);return u!==e&&(i=Mr(u,e),function(t){this.style.setProperty(n,i(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Ju(this,"style."+n,e,u)},Yl.styleTween=function(n,e,r){function i(i,u){var o=e.call(this,i,u,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,i)},Yl.text=function(n){return Ju(this,"text",n,Gu)},Yl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Yl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ao.ease.apply(ao,arguments)),Y(this,function(r){r[e][t].ease=n}))},Yl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,i,u){r[e][t].delay=+n.call(r,r.__data__,i,u)}:(n=+n,function(r){r[e][t].delay=n}))},Yl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,i,u){r[e][t].duration=Math.max(1,n.call(r,r.__data__,i,u))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Yl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var i=Ol,u=Hl;try{Hl=e,Y(this,function(t,i,u){Ol=t[r][e],n.call(t,t.__data__,i,u)})}finally{Ol=i,Hl=u}}else Y(this,function(i){var u=i[r][e];(u.event||(u.event=ao.dispatch("start","end","interrupt"))).on(n,t)});return this},Yl.transition=function(){for(var n,t,e,r,i=this.id,u=++Zl,o=this.namespace,a=[],l=0,c=this.length;c>l;l++){a.push(n=[]);for(var t=this[l],f=0,s=t.length;s>f;f++)(e=t[f])&&(r=e[o][i],Qu(e,f,o,u,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wu(a,o,u)},ao.svg.axis=function(){function n(n){n.each(function(){var n,c=ao.select(this),f=this.__chart__||e,s=this.__chart__=e.copy(),h=null==l?s.ticks?s.ticks.apply(s,a):s.domain():l,p=null==t?s.tickFormat?s.tickFormat.apply(s,a):m:t,g=c.selectAll(".tick").data(h,s),v=g.enter().insert("g",".domain").attr("class","tick").style("opacity",Uo),d=ao.transition(g.exit()).style("opacity",Uo).remove(),y=ao.transition(g.order()).style("opacity",1),M=Math.max(i,0)+o,x=Zi(s),b=c.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ao.transition(b));v.append("line"),v.append("text");var w,S,k,N,E=v.select("line"),A=y.select("line"),C=g.select("text").text(p),z=v.select("text"),L=y.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=no,w="x",k="y",S="x2",N="y2",C.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+q*u+"V0H"+x[1]+"V"+q*u)):(n=to,w="y",k="x",S="y2",N="x2",C.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),_.attr("d","M"+q*u+","+x[0]+"H0V"+x[1]+"H"+q*u)),E.attr(N,q*i),z.attr(k,q*M),A.attr(S,0).attr(N,q*i),L.attr(w,0).attr(k,q*M),s.rangeBand){var T=s,R=T.rangeBand()/2;f=s=function(n){return T(n)+R}}else f.rangeBand?f=s:d.call(n,s,f);v.call(n,f,s),y.call(n,s,s)})}var t,e=ao.scale.linear(),r=Vl,i=6,u=6,o=3,a=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Xl?t+"":Vl,n):r},n.ticks=function(){return arguments.length?(a=co(arguments),n):a},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(i=+t,u=+arguments[e-1],n):i},n.innerTickSize=function(t){return arguments.length?(i=+t,n):i},n.outerTickSize=function(t){return arguments.length?(u=+t,n):u},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Vl="bottom",Xl={top:1,right:1,bottom:1,left:1};ao.svg.brush=function(){function n(t){t.each(function(){var t=ao.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,m);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return $l[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,s=ao.transition(t),h=ao.transition(o);c&&(l=Zi(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),r(s)),f&&(l=Zi(f),h.attr("y",l[0]).attr("height",l[1]-l[0]),i(s)),e(s)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",s[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function i(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==ao.event.keyCode&&(C||(M=null,L[0]-=s[1],L[1]-=h[1],C=2),S())}function v(){32==ao.event.keyCode&&2==C&&(L[0]+=s[1],L[1]+=h[1],C=0,S())}function d(){var n=ao.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ao.event.altKey?(M||(M=[(s[0]+s[1])/2,(h[0]+h[1])/2]),L[0]=s[+(n[0]f?(i=r,r=f):i=f),v[0]!=r||v[1]!=i?(e?a=null:o=null,v[0]=r,v[1]=i,!0):void 0}function m(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ao.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ao.select(ao.event.target),w=l.of(b,arguments),k=ao.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&f,C=_.classed("extent"),z=W(b),L=ao.mouse(b),q=ao.select(t(b)).on("keydown.brush",u).on("keyup.brush",v);if(ao.event.changedTouches?q.on("touchmove.brush",d).on("touchend.brush",m):q.on("mousemove.brush",d).on("mouseup.brush",m),k.interrupt().selectAll("*").interrupt(),C)L[0]=s[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[s[1-T]-L[0],h[1-R]-L[1]],L[0]=s[T],L[1]=h[R]}else ao.event.altKey&&(M=L.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ao.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,l=N(n,"brushstart","brush","brushend"),c=null,f=null,s=[0,0],h=[0,0],p=!0,g=!0,v=Bl[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:s,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Hl?ao.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,s=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=xr(s,t.x),r=xr(h,t.y);return o=a=null,function(i){s=t.x=e(i),h=t.y=r(i),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=Bl[!c<<1|!f],n):c},n.y=function(t){return arguments.length?(f=t,v=Bl[!c<<1|!f],n):f},n.clamp=function(t){return arguments.length?(c&&f?(p=!!t[0],g=!!t[1]):c?p=!!t:f&&(g=!!t),n):c&&f?[p,g]:c?p:f?g:null},n.extent=function(t){var e,r,i,u,l;return arguments.length?(c&&(e=t[0],r=t[1],f&&(e=e[0],r=r[0]),o=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),e==s[0]&&r==s[1]||(s=[e,r])),f&&(i=t[0],u=t[1],c&&(i=i[1],u=u[1]),a=[i,u],f.invert&&(i=f(i),u=f(u)),i>u&&(l=i,i=u,u=l),i==h[0]&&u==h[1]||(h=[i,u])),n):(c&&(o?(e=o[0],r=o[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),f&&(a?(i=a[0],u=a[1]):(i=h[0],u=h[1],f.invert&&(i=f.invert(i),u=f.invert(u)),i>u&&(l=i,i=u,u=l))),c&&f?[[e,i],[r,u]]:c?[e,r]:f&&[i,u])},n.clear=function(){return n.empty()||(s=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!f&&h[0]==h[1]},ao.rebind(n,l,"on")};var $l={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Bl=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Wl=ga.format=xa.timeFormat,Jl=Wl.utc,Gl=Jl("%Y-%m-%dT%H:%M:%S.%LZ");Wl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?eo:Gl,eo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},eo.toString=Gl.toString,ga.second=On(function(n){return new va(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ga.seconds=ga.second.range,ga.seconds.utc=ga.second.utc.range,ga.minute=On(function(n){return new va(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ga.minutes=ga.minute.range,ga.minutes.utc=ga.minute.utc.range,ga.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new va(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ga.hours=ga.hour.range,ga.hours.utc=ga.hour.utc.range,ga.month=On(function(n){return n=ga.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ga.months=ga.month.range,ga.months.utc=ga.month.utc.range;var Kl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Ql=[[ga.second,1],[ga.second,5],[ga.second,15],[ga.second,30],[ga.minute,1],[ga.minute,5],[ga.minute,15],[ga.minute,30],[ga.hour,1],[ga.hour,3],[ga.hour,6],[ga.hour,12],[ga.day,1],[ga.day,2],[ga.week,1],[ga.month,1],[ga.month,3],[ga.year,1]],nc=Wl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",zt]]),tc={range:function(n,t,e){return ao.range(Math.ceil(n/e)*e,+t,e).map(io)},floor:m,ceil:m};Ql.year=ga.year,ga.scale=function(){return ro(ao.scale.linear(),Ql,nc)};var ec=Ql.map(function(n){return[n[0].utc,n[1]]}),rc=Jl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",zt]]);ec.year=ga.year.utc,ga.scale.utc=function(){return ro(ao.scale.linear(),ec,rc)},ao.text=An(function(n){return n.responseText}),ao.json=function(n,t){return Cn(n,"application/json",uo,t)},ao.html=function(n,t){return Cn(n,"text/html",oo,t)},ao.xml=An(function(n){return n.responseXML}),"function"==typeof define&&define.amd?(this.d3=ao,define(ao)):"object"==typeof module&&module.exports?module.exports=ao:this.d3=ao}();/* - Copyright (C) Federico Zivolo 2019 - Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). - */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?pe:10===e?se:pe||se}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),le({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=fe({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},le(n,m,$(v)),le(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ge.FLIP:p=[n,i];break;case ge.CLOCKWISE:p=G(n);break;case ge.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u),E=!!t.flipVariationsByContent&&(w&&'start'===r&&c||w&&'end'===r&&h||!w&&'start'===r&&u||!w&&'end'===r&&g),v=y||E;(m||b||v)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),v&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=fe({},e.offsets.popper,C(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport',flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=D(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!me),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=B('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=fe({},E,e.attributes),e.styles=fe({},m,e.styles),e.arrowStyles=fe({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return V(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&V(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),V(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ue}); -//# sourceMappingURL=popper.min.js.map -/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
      ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.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(e,n){S.fn[n]=function(e,t){return 0=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};c.jQueryDetection(),e.fn.emulateTransitionEnd=l,e.event.special[c.TRANSITION_END]={bindType:"transitionend",delegateType:"transitionend",handle:function(t){if(e(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var h="alert",u=e.fn[h],d=function(){function t(t){this._element=t}var n=t.prototype;return n.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},n.dispose=function(){e.removeData(this._element,"bs.alert"),this._element=null},n._getRootElement=function(t){var n=c.getSelectorFromElement(t),i=!1;return n&&(i=document.querySelector(n)),i||(i=e(t).closest(".alert")[0]),i},n._triggerCloseEvent=function(t){var n=e.Event("close.bs.alert");return e(t).trigger(n),n},n._removeElement=function(t){var n=this;if(e(t).removeClass("show"),e(t).hasClass("fade")){var i=c.getTransitionDurationFromElement(t);e(t).one(c.TRANSITION_END,(function(e){return n._destroyElement(t,e)})).emulateTransitionEnd(i)}else this._destroyElement(t)},n._destroyElement=function(t){e(t).detach().trigger("closed.bs.alert").remove()},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.alert");o||(o=new t(this),i.data("bs.alert",o)),"close"===n&&o[n](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}}]),t}();e(document).on("click.bs.alert.data-api",'[data-dismiss="alert"]',d._handleDismiss(new d)),e.fn[h]=d._jQueryInterface,e.fn[h].Constructor=d,e.fn[h].noConflict=function(){return e.fn[h]=u,d._jQueryInterface};var f=e.fn.button,g=function(){function t(t){this._element=t}var n=t.prototype;return n.toggle=function(){var t=!0,n=!0,i=e(this._element).closest('[data-toggle="buttons"]')[0];if(i){var o=this._element.querySelector('input:not([type="hidden"])');if(o){if("radio"===o.type)if(o.checked&&this._element.classList.contains("active"))t=!1;else{var s=i.querySelector(".active");s&&e(s).removeClass("active")}t&&("checkbox"!==o.type&&"radio"!==o.type||(o.checked=!this._element.classList.contains("active")),e(o).trigger("change")),o.focus(),n=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(n&&this._element.setAttribute("aria-pressed",!this._element.classList.contains("active")),t&&e(this._element).toggleClass("active"))},n.dispose=function(){e.removeData(this._element,"bs.button"),this._element=null},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.button");i||(i=new t(this),e(this).data("bs.button",i)),"toggle"===n&&i[n]()}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}}]),t}();e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',(function(t){var n=t.target,i=n;if(e(n).hasClass("btn")||(n=e(n).closest(".btn")[0]),!n||n.hasAttribute("disabled")||n.classList.contains("disabled"))t.preventDefault();else{var o=n.querySelector('input:not([type="hidden"])');if(o&&(o.hasAttribute("disabled")||o.classList.contains("disabled")))return void t.preventDefault();"LABEL"===i.tagName&&o&&"checkbox"===o.type&&t.preventDefault(),g._jQueryInterface.call(e(n),"toggle")}})).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',(function(t){var n=e(t.target).closest(".btn")[0];e(n).toggleClass("focus",/^focus(in)?$/.test(t.type))})),e(window).on("load.bs.button.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-toggle="buttons"] .btn')),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var n=t.prototype;return n.next=function(){this._isSliding||this._slide("next")},n.nextWhenVisible=function(){!document.hidden&&e(this._element).is(":visible")&&"hidden"!==e(this._element).css("visibility")&&this.next()},n.prev=function(){this._isSliding||this._slide("prev")},n.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(".carousel-item-next, .carousel-item-prev")&&(c.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},n.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},n.to=function(t){var n=this;this._activeElement=this._element.querySelector(".active.carousel-item");var i=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)e(this._element).one("slid.bs.carousel",(function(){return n.to(t)}));else{if(i===t)return this.pause(),void this.cycle();var o=t>i?"next":"prev";this._slide(o,this._items[t])}},n.dispose=function(){e(this._element).off(p),e.removeData(this._element,"bs.carousel"),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},n._getConfig=function(t){return t=a(a({},v),t),c.typeCheckConfig(m,t,b),t},n._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},n._addEventListeners=function(){var t=this;this._config.keyboard&&e(this._element).on("keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&e(this._element).on("mouseenter.bs.carousel",(function(e){return t.pause(e)})).on("mouseleave.bs.carousel",(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},n._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var n=function(e){t._pointerEvent&&y[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},i=function(e){t._pointerEvent&&y[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};e(this._element.querySelectorAll(".carousel-item img")).on("dragstart.bs.carousel",(function(t){return t.preventDefault()})),this._pointerEvent?(e(this._element).on("pointerdown.bs.carousel",(function(t){return n(t)})),e(this._element).on("pointerup.bs.carousel",(function(t){return i(t)})),this._element.classList.add("pointer-event")):(e(this._element).on("touchstart.bs.carousel",(function(t){return n(t)})),e(this._element).on("touchmove.bs.carousel",(function(e){return function(e){e.originalEvent.touches&&e.originalEvent.touches.length>1?t.touchDeltaX=0:t.touchDeltaX=e.originalEvent.touches[0].clientX-t.touchStartX}(e)})),e(this._element).on("touchend.bs.carousel",(function(t){return i(t)})))}},n._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},n._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(".carousel-item")):[],this._items.indexOf(t)},n._getItemByDirection=function(t,e){var n="next"===t,i="prev"===t,o=this._getItemIndex(e),s=this._items.length-1;if((i&&0===o||n&&o===s)&&!this._config.wrap)return e;var r=(o+("prev"===t?-1:1))%this._items.length;return-1===r?this._items[this._items.length-1]:this._items[r]},n._triggerSlideEvent=function(t,n){var i=this._getItemIndex(t),o=this._getItemIndex(this._element.querySelector(".active.carousel-item")),s=e.Event("slide.bs.carousel",{relatedTarget:t,direction:n,from:o,to:i});return e(this._element).trigger(s),s},n._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var n=[].slice.call(this._indicatorsElement.querySelectorAll(".active"));e(n).removeClass("active");var i=this._indicatorsElement.children[this._getItemIndex(t)];i&&e(i).addClass("active")}},n._slide=function(t,n){var i,o,s,r=this,a=this._element.querySelector(".active.carousel-item"),l=this._getItemIndex(a),h=n||a&&this._getItemByDirection(t,a),u=this._getItemIndex(h),d=Boolean(this._interval);if("next"===t?(i="carousel-item-left",o="carousel-item-next",s="left"):(i="carousel-item-right",o="carousel-item-prev",s="right"),h&&e(h).hasClass("active"))this._isSliding=!1;else if(!this._triggerSlideEvent(h,s).isDefaultPrevented()&&a&&h){this._isSliding=!0,d&&this.pause(),this._setActiveIndicatorElement(h);var f=e.Event("slid.bs.carousel",{relatedTarget:h,direction:s,from:l,to:u});if(e(this._element).hasClass("slide")){e(h).addClass(o),c.reflow(h),e(a).addClass(i),e(h).addClass(i);var g=parseInt(h.getAttribute("data-interval"),10);g?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=g):this._config.interval=this._config.defaultInterval||this._config.interval;var m=c.getTransitionDurationFromElement(a);e(a).one(c.TRANSITION_END,(function(){e(h).removeClass(i+" "+o).addClass("active"),e(a).removeClass("active "+o+" "+i),r._isSliding=!1,setTimeout((function(){return e(r._element).trigger(f)}),0)})).emulateTransitionEnd(m)}else e(a).removeClass("active"),e(h).addClass("active"),this._isSliding=!1,e(this._element).trigger(f);d&&this.cycle()}},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.carousel"),o=a(a({},v),e(this).data());"object"==typeof n&&(o=a(a({},o),n));var s="string"==typeof n?n:o.slide;if(i||(i=new t(this,o),e(this).data("bs.carousel",i)),"number"==typeof n)i.to(n);else if("string"==typeof s){if("undefined"==typeof i[s])throw new TypeError('No method named "'+s+'"');i[s]()}else o.interval&&o.ride&&(i.pause(),i.cycle())}))},t._dataApiClickHandler=function(n){var i=c.getSelectorFromElement(this);if(i){var o=e(i)[0];if(o&&e(o).hasClass("carousel")){var s=a(a({},e(o).data()),e(this).data()),r=this.getAttribute("data-slide-to");r&&(s.interval=!1),t._jQueryInterface.call(e(o),s),r&&e(o).data("bs.carousel").to(r),n.preventDefault()}}},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"Default",get:function(){return v}}]),t}();e(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",E._dataApiClickHandler),e(window).on("load.bs.carousel.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-ride="carousel"]')),n=0,i=t.length;n0&&(this._selector=r,this._triggerArray.push(s))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var n=t.prototype;return n.toggle=function(){e(this._element).hasClass("show")?this.hide():this.show()},n.show=function(){var n,i,o=this;if(!this._isTransitioning&&!e(this._element).hasClass("show")&&(this._parent&&0===(n=[].slice.call(this._parent.querySelectorAll(".show, .collapsing")).filter((function(t){return"string"==typeof o._config.parent?t.getAttribute("data-parent")===o._config.parent:t.classList.contains("collapse")}))).length&&(n=null),!(n&&(i=e(n).not(this._selector).data("bs.collapse"))&&i._isTransitioning))){var s=e.Event("show.bs.collapse");if(e(this._element).trigger(s),!s.isDefaultPrevented()){n&&(t._jQueryInterface.call(e(n).not(this._selector),"hide"),i||e(n).data("bs.collapse",null));var r=this._getDimension();e(this._element).removeClass("collapse").addClass("collapsing"),this._element.style[r]=0,this._triggerArray.length&&e(this._triggerArray).removeClass("collapsed").attr("aria-expanded",!0),this.setTransitioning(!0);var a="scroll"+(r[0].toUpperCase()+r.slice(1)),l=c.getTransitionDurationFromElement(this._element);e(this._element).one(c.TRANSITION_END,(function(){e(o._element).removeClass("collapsing").addClass("collapse show"),o._element.style[r]="",o.setTransitioning(!1),e(o._element).trigger("shown.bs.collapse")})).emulateTransitionEnd(l),this._element.style[r]=this._element[a]+"px"}}},n.hide=function(){var t=this;if(!this._isTransitioning&&e(this._element).hasClass("show")){var n=e.Event("hide.bs.collapse");if(e(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",c.reflow(this._element),e(this._element).addClass("collapsing").removeClass("collapse show");var o=this._triggerArray.length;if(o>0)for(var s=0;s0},i._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=a(a({},e.offsets),t._config.offset(e.offsets,t._element)||{}),e}:e.offset=this._config.offset,e},i._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),a(a({},t),this._config.popperConfig)},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.dropdown");if(i||(i=new t(this,"object"==typeof n?n:null),e(this).data("bs.dropdown",i)),"string"==typeof n){if("undefined"==typeof i[n])throw new TypeError('No method named "'+n+'"');i[n]()}}))},t._clearMenus=function(n){if(!n||3!==n.which&&("keyup"!==n.type||9===n.which))for(var i=[].slice.call(document.querySelectorAll('[data-toggle="dropdown"]')),o=0,s=i.length;o0&&r--,40===n.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},n._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},n._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
      ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:F,popperConfig:null},Y={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},$=function(){function t(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var i=t.prototype;return i.enable=function(){this._isEnabled=!0},i.disable=function(){this._isEnabled=!1},i.toggleEnabled=function(){this._isEnabled=!this._isEnabled},i.toggle=function(t){if(this._isEnabled)if(t){var n=this.constructor.DATA_KEY,i=e(t.currentTarget).data(n);i||(i=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(e(this.getTipElement()).hasClass("show"))return void this._leave(null,this);this._enter(null,this)}},i.dispose=function(){clearTimeout(this._timeout),e.removeData(this.element,this.constructor.DATA_KEY),e(this.element).off(this.constructor.EVENT_KEY),e(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&e(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},i.show=function(){var t=this;if("none"===e(this.element).css("display"))throw new Error("Please use show on visible elements");var i=e.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){e(this.element).trigger(i);var o=c.findShadowRoot(this.element),s=e.contains(null!==o?o:this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),a=c.getUID(this.constructor.NAME);r.setAttribute("id",a),this.element.setAttribute("aria-describedby",a),this.setContent(),this.config.animation&&e(r).addClass("fade");var l="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var u=this._getContainer();e(r).data(this.constructor.DATA_KEY,this),e.contains(this.element.ownerDocument.documentElement,this.tip)||e(r).appendTo(u),e(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,this._getPopperConfig(h)),e(r).addClass("show"),"ontouchstart"in document.documentElement&&e(document.body).children().on("mouseover",null,e.noop);var d=function(){t.config.animation&&t._fixTransition();var n=t._hoverState;t._hoverState=null,e(t.element).trigger(t.constructor.Event.SHOWN),"out"===n&&t._leave(null,t)};if(e(this.tip).hasClass("fade")){var f=c.getTransitionDurationFromElement(this.tip);e(this.tip).one(c.TRANSITION_END,d).emulateTransitionEnd(f)}else d()}},i.hide=function(t){var n=this,i=this.getTipElement(),o=e.Event(this.constructor.Event.HIDE),s=function(){"show"!==n._hoverState&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),e(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),t&&t()};if(e(this.element).trigger(o),!o.isDefaultPrevented()){if(e(i).removeClass("show"),"ontouchstart"in document.documentElement&&e(document.body).children().off("mouseover",null,e.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,e(this.tip).hasClass("fade")){var r=c.getTransitionDurationFromElement(i);e(i).one(c.TRANSITION_END,s).emulateTransitionEnd(r)}else s();this._hoverState=""}},i.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},i.isWithContent=function(){return Boolean(this.getTitle())},i.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-tooltip-"+t)},i.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},i.setContent=function(){var t=this.getTipElement();this.setElementContent(e(t.querySelectorAll(".tooltip-inner")),this.getTitle()),e(t).removeClass("fade show")},i.setElementContent=function(t,n){"object"!=typeof n||!n.nodeType&&!n.jquery?this.config.html?(this.config.sanitize&&(n=H(n,this.config.whiteList,this.config.sanitizeFn)),t.html(n)):t.text(n):this.config.html?e(n).parent().is(t)||t.empty().append(n):t.text(e(n).text())},i.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},i._getPopperConfig=function(t){var e=this;return a(a({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),this.config.popperConfig)},i._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=a(a({},e.offsets),t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},i._getContainer=function(){return!1===this.config.container?document.body:c.isElement(this.config.container)?e(this.config.container):e(document).find(this.config.container)},i._getAttachment=function(t){return K[t.toUpperCase()]},i._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(n){if("click"===n)e(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==n){var i="hover"===n?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,o="hover"===n?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;e(t.element).on(i,t.config.selector,(function(e){return t._enter(e)})).on(o,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},e(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=a(a({},this.config),{},{trigger:"manual",selector:""}):this._fixTitle()},i._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},i._enter=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e(n.getTipElement()).hasClass("show")||"show"===n._hoverState?n._hoverState="show":(clearTimeout(n._timeout),n._hoverState="show",n.config.delay&&n.config.delay.show?n._timeout=setTimeout((function(){"show"===n._hoverState&&n.show()}),n.config.delay.show):n.show())},i._leave=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState="out",n.config.delay&&n.config.delay.hide?n._timeout=setTimeout((function(){"out"===n._hoverState&&n.hide()}),n.config.delay.hide):n.hide())},i._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},i._getConfig=function(t){var n=e(this.element).data();return Object.keys(n).forEach((function(t){-1!==V.indexOf(t)&&delete n[t]})),"number"==typeof(t=a(a(a({},this.constructor.Default),n),"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),c.typeCheckConfig(U,t,this.constructor.DefaultType),t.sanitize&&(t.template=H(t.template,t.whiteList,t.sanitizeFn)),t},i._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},i._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(W);null!==n&&n.length&&t.removeClass(n.join(""))},i._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},i._fixTransition=function(){var t=this.getTipElement(),n=this.config.animation;null===t.getAttribute("x-placement")&&(e(t).removeClass("fade"),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.tooltip"),o="object"==typeof n&&n;if((i||!/dispose|hide/.test(n))&&(i||(i=new t(this,o),e(this).data("bs.tooltip",i)),"string"==typeof n)){if("undefined"==typeof i[n])throw new TypeError('No method named "'+n+'"');i[n]()}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"Default",get:function(){return X}},{key:"NAME",get:function(){return U}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return Y}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return z}}]),t}();e.fn[U]=$._jQueryInterface,e.fn[U].Constructor=$,e.fn[U].noConflict=function(){return e.fn[U]=M,$._jQueryInterface};var J="popover",G=e.fn[J],Z=new RegExp("(^|\\s)bs-popover\\S+","g"),tt=a(a({},$.Default),{},{placement:"right",trigger:"click",content:"",template:''}),et=a(a({},$.DefaultType),{},{content:"(string|element|function)"}),nt={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},it=function(t){var n,i;function s(){return t.apply(this,arguments)||this}i=t,(n=s).prototype=Object.create(i.prototype),n.prototype.constructor=n,n.__proto__=i;var r=s.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-popover-"+t)},r.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},r.setContent=function(){var t=e(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(t.find(".popover-body"),n),t.removeClass("fade show")},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(Z);null!==n&&n.length>0&&t.removeClass(n.join(""))},s._jQueryInterface=function(t){return this.each((function(){var n=e(this).data("bs.popover"),i="object"==typeof t?t:null;if((n||!/dispose|hide/.test(t))&&(n||(n=new s(this,i),e(this).data("bs.popover",n)),"string"==typeof t)){if("undefined"==typeof n[t])throw new TypeError('No method named "'+t+'"');n[t]()}}))},o(s,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"Default",get:function(){return tt}},{key:"NAME",get:function(){return J}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return nt}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return et}}]),s}($);e.fn[J]=it._jQueryInterface,e.fn[J].Constructor=it,e.fn[J].noConflict=function(){return e.fn[J]=G,it._jQueryInterface};var ot="scrollspy",st=e.fn[ot],rt={offset:10,method:"auto",target:""},at={offset:"number",method:"string",target:"(string|element)"},lt=function(){function t(t,n){var i=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(n),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,e(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return i._process(t)})),this.refresh(),this._process()}var n=t.prototype;return n.refresh=function(){var t=this,n=this._scrollElement===this._scrollElement.window?"offset":"position",i="auto"===this._config.method?n:this._config.method,o="position"===i?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var n,s=c.getSelectorFromElement(t);if(s&&(n=document.querySelector(s)),n){var r=n.getBoundingClientRect();if(r.width||r.height)return[e(n)[i]().top+o,s]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},n.dispose=function(){e.removeData(this._element,"bs.scrollspy"),e(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},n._getConfig=function(t){if("string"!=typeof(t=a(a({},rt),"object"==typeof t&&t?t:{})).target&&c.isElement(t.target)){var n=e(t.target).attr("id");n||(n=c.getUID(ot),e(t.target).attr("id",n)),t.target="#"+n}return c.typeCheckConfig(ot,t,at),t},n._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},n._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},n._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},n._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active":".active";i=(i=e.makeArray(e(o).find(r)))[i.length-1]}var a=e.Event("hide.bs.tab",{relatedTarget:this._element}),l=e.Event("show.bs.tab",{relatedTarget:i});if(i&&e(i).trigger(a),e(this._element).trigger(l),!l.isDefaultPrevented()&&!a.isDefaultPrevented()){s&&(n=document.querySelector(s)),this._activate(this._element,o);var h=function(){var n=e.Event("hidden.bs.tab",{relatedTarget:t._element}),o=e.Event("shown.bs.tab",{relatedTarget:i});e(i).trigger(n),e(t._element).trigger(o)};n?this._activate(n,n.parentNode,h):h()}}},n.dispose=function(){e.removeData(this._element,"bs.tab"),this._element=null},n._activate=function(t,n,i){var o=this,s=(!n||"UL"!==n.nodeName&&"OL"!==n.nodeName?e(n).children(".active"):e(n).find("> li > .active"))[0],r=i&&s&&e(s).hasClass("fade"),a=function(){return o._transitionComplete(t,s,i)};if(s&&r){var l=c.getTransitionDurationFromElement(s);e(s).removeClass("show").one(c.TRANSITION_END,a).emulateTransitionEnd(l)}else a()},n._transitionComplete=function(t,n,i){if(n){e(n).removeClass("active");var o=e(n.parentNode).find("> .dropdown-menu .active")[0];o&&e(o).removeClass("active"),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(e(t).addClass("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),c.reflow(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&e(t.parentNode).hasClass("dropdown-menu")){var s=e(t).closest(".dropdown")[0];if(s){var r=[].slice.call(s.querySelectorAll(".dropdown-toggle"));e(r).addClass("active")}t.setAttribute("aria-expanded",!0)}i&&i()},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.tab");if(o||(o=new t(this),i.data("bs.tab",o)),"string"==typeof n){if("undefined"==typeof o[n])throw new TypeError('No method named "'+n+'"');o[n]()}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}}]),t}();e(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),ht._jQueryInterface.call(e(this),"show")})),e.fn.tab=ht._jQueryInterface,e.fn.tab.Constructor=ht,e.fn.tab.noConflict=function(){return e.fn.tab=ct,ht._jQueryInterface};var ut=e.fn.toast,dt={animation:"boolean",autohide:"boolean",delay:"number"},ft={animation:!0,autohide:!0,delay:500},gt=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var n=t.prototype;return n.show=function(){var t=this,n=e.Event("show.bs.toast");if(e(this._element).trigger(n),!n.isDefaultPrevented()){this._config.animation&&this._element.classList.add("fade");var i=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),e(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),c.reflow(this._element),this._element.classList.add("showing"),this._config.animation){var o=c.getTransitionDurationFromElement(this._element);e(this._element).one(c.TRANSITION_END,i).emulateTransitionEnd(o)}else i()}},n.hide=function(){if(this._element.classList.contains("show")){var t=e.Event("hide.bs.toast");e(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},n.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains("show")&&this._element.classList.remove("show"),e(this._element).off("click.dismiss.bs.toast"),e.removeData(this._element,"bs.toast"),this._element=null,this._config=null},n._getConfig=function(t){return t=a(a(a({},ft),e(this._element).data()),"object"==typeof t&&t?t:{}),c.typeCheckConfig("toast",t,this.constructor.DefaultType),t},n._setListeners=function(){var t=this;e(this._element).on("click.dismiss.bs.toast",'[data-dismiss="toast"]',(function(){return t.hide()}))},n._close=function(){var t=this,n=function(){t._element.classList.add("hide"),e(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var i=c.getTransitionDurationFromElement(this._element);e(this._element).one(c.TRANSITION_END,n).emulateTransitionEnd(i)}else n()},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.toast");if(o||(o=new t(this,"object"==typeof n&&n),i.data("bs.toast",o)),"string"==typeof n){if("undefined"==typeof o[n])throw new TypeError('No method named "'+n+'"');o[n](this)}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.0"}},{key:"DefaultType",get:function(){return dt}},{key:"Default",get:function(){return ft}}]),t}();e.fn.toast=gt._jQueryInterface,e.fn.toast.Constructor=gt,e.fn.toast.noConflict=function(){return e.fn.toast=ut,gt._jQueryInterface},t.Alert=d,t.Button=g,t.Carousel=E,t.Collapse=D,t.Dropdown=j,t.Modal=R,t.Popover=it,t.Scrollspy=lt,t.Tab=ht,t.Toast=gt,t.Tooltip=$,t.Util=c,Object.defineProperty(t,"__esModule",{value:!0})})); -//# sourceMappingURL=bootstrap.min.js.map - {{name}} - {{methods_bar}} -
      {{methods_tested_percent}}
      -
      {{methods_number}}
      - {{crap}} - {{paths_bar}} -
      {{paths_executed_percent}}
      -
      {{paths_number}}
      - {{branches_bar}} -
      {{branches_executed_percent}}
      -
      {{branches_number}}
      - {{lines_bar}} -
      {{lines_executed_percent}}
      -
      {{lines_number}}
      - +/* + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Exception\Prophecy; - - - - - Code Coverage for {{full_path}} - - - - - - - -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      - - - - - - - - - - - - - - - - -{{items}} - -
       
      Code Coverage
       
      Classes and Traits
      Functions and Methods
      Paths
      Branches
      Lines
      -
      -{{lines}} -{{structure}} - -
      - - - - - - - - {{name}} - {{classes_bar}} -
      {{classes_tested_percent}}
      -
      {{classes_number}}
      - {{methods_bar}} -
      {{methods_tested_percent}}
      -
      {{methods_number}}
      - {{crap}} - {{paths_bar}} -
      {{paths_executed_percent}}
      -
      {{paths_number}}
      - {{branches_bar}} -
      {{branches_executed_percent}}
      -
      {{branches_number}}
      - {{lines_bar}} -
      {{lines_executed_percent}}
      -
      {{lines_number}}
      - +use Prophecy\Prophecy\ObjectProphecy; +class ObjectProphecyException extends \RuntimeException implements \Prophecy\Exception\Prophecy\ProphecyException +{ + private $objectProphecy; + public function __construct($message, ObjectProphecy $objectProphecy) + { + parent::__construct($message); + $this->objectProphecy = $objectProphecy; + } + /** + * @return ObjectProphecy + */ + public function getObjectProphecy() + { + return $this->objectProphecy; + } +} + - -{{lines}} - - - {{lineNumber}}{{lineContent}} - - {{icon}}{{name}} - {{lines_bar}} -
      {{lines_executed_percent}}
      -
      {{lines_number}}
      - {{methods_bar}} -
      {{methods_tested_percent}}
      -
      {{methods_number}}
      - {{classes_bar}} -
      {{classes_tested_percent}}
      -
      {{classes_number}}
      - +/* + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Exception\Prophecy; -
      -
      - {{percent}}% covered ({{level}}) -
      -
      - - {{name}} - {{methods_bar}} -
      {{methods_tested_percent}}
      -
      {{methods_number}}
      - {{crap}} - {{lines_bar}} -
      {{lines_executed_percent}}
      -
      {{lines_number}}
      - +use Prophecy\Exception\Exception; +interface ProphecyException extends Exception +{ +} +code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:0;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item{display:-ms-flexbox;display:flex}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;-ms-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} -/*# sourceMappingURL=bootstrap.min.css.map */body { - padding-top: 10px; +/* + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\PhpDocumentor; + +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Method; +/** + * @author Théo FIDRY + * + * @internal + */ +final class ClassAndInterfaceTagRetriever implements \Prophecy\PhpDocumentor\MethodTagRetrieverInterface +{ + private $classRetriever; + public function __construct(\Prophecy\PhpDocumentor\MethodTagRetrieverInterface $classRetriever = null) + { + if (null !== $classRetriever) { + $this->classRetriever = $classRetriever; + return; + } + $this->classRetriever = \class_exists('PHPUnit\\phpDocumentor\\Reflection\\DocBlockFactory') && \class_exists('PHPUnit\\phpDocumentor\\Reflection\\Types\\ContextFactory') ? new \Prophecy\PhpDocumentor\ClassTagRetriever() : new \Prophecy\PhpDocumentor\LegacyClassTagRetriever(); + } + /** + * @param \ReflectionClass $reflectionClass + * + * @return LegacyMethodTag[]|Method[] + */ + public function getTagList(\ReflectionClass $reflectionClass) + { + return \array_merge($this->classRetriever->getTagList($reflectionClass), $this->getInterfacesTagList($reflectionClass)); + } + /** + * @param \ReflectionClass $reflectionClass + * + * @return LegacyMethodTag[]|Method[] + */ + private function getInterfacesTagList(\ReflectionClass $reflectionClass) + { + $interfaces = $reflectionClass->getInterfaces(); + $tagList = array(); + foreach ($interfaces as $interface) { + $tagList = \array_merge($tagList, $this->classRetriever->getTagList($interface)); + } + return $tagList; + } } + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\PhpDocumentor; -.octicon { - margin-right:.25em; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Method; +use PHPUnit\phpDocumentor\Reflection\DocBlockFactory; +use PHPUnit\phpDocumentor\Reflection\Types\ContextFactory; +/** + * @author Théo FIDRY + * + * @internal + */ +final class ClassTagRetriever implements \Prophecy\PhpDocumentor\MethodTagRetrieverInterface +{ + private $docBlockFactory; + private $contextFactory; + public function __construct() + { + $this->docBlockFactory = DocBlockFactory::createInstance(); + $this->contextFactory = new ContextFactory(); + } + /** + * @param \ReflectionClass $reflectionClass + * + * @return Method[] + */ + public function getTagList(\ReflectionClass $reflectionClass) + { + try { + $phpdoc = $this->docBlockFactory->create($reflectionClass, $this->contextFactory->createFromReflector($reflectionClass)); + $methods = array(); + foreach ($phpdoc->getTagsByName('method') as $tag) { + if ($tag instanceof Method) { + $methods[] = $tag; + } + } + return $methods; + } catch (\InvalidArgumentException $e) { + return array(); + } + } } +thead>tr>td { - border-bottom-width: 1px; -} +/* + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\PhpDocumentor; -.table tbody>tr>td, .table thead>tr>td { - padding-top: 3px; - padding-bottom: 3px; +use PHPUnit\phpDocumentor\Reflection\DocBlock; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; +/** + * @author Théo FIDRY + * + * @internal + */ +final class LegacyClassTagRetriever implements \Prophecy\PhpDocumentor\MethodTagRetrieverInterface +{ + /** + * @param \ReflectionClass $reflectionClass + * + * @return LegacyMethodTag[] + */ + public function getTagList(\ReflectionClass $reflectionClass) + { + $phpdoc = new DocBlock($reflectionClass->getDocComment()); + return $phpdoc->getTagsByName('method'); + } } +tr>td { - padding-top: 0; - padding-bottom: 0; -} +/* + * This file is part of the Prophecy. + * (c) Konstantin Kudryashov + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\PhpDocumentor; -.table .progress { - margin-bottom: inherit; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; +use PHPUnit\phpDocumentor\Reflection\DocBlock\Tags\Method; +/** + * @author Théo FIDRY + * + * @internal + */ +interface MethodTagRetrieverInterface +{ + /** + * @param \ReflectionClass $reflectionClass + * + * @return LegacyMethodTag[]|Method[] + */ + public function getTagList(\ReflectionClass $reflectionClass); } + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Prediction; -.table tbody tr.covered-by-large-tests, li.covered-by-large-tests, tr.success, td.success, li.success, span.success { - background-color: #dff0d8; +use Prophecy\Call\Call; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Argument\ArgumentsWildcard; +use Prophecy\Argument\Token\AnyValuesToken; +use Prophecy\Util\StringUtil; +use Prophecy\Exception\Prediction\NoCallsException; +/** + * Call prediction. + * + * @author Konstantin Kudryashov + */ +class CallPrediction implements \Prophecy\Prediction\PredictionInterface +{ + private $util; + /** + * Initializes prediction. + * + * @param StringUtil $util + */ + public function __construct(StringUtil $util = null) + { + $this->util = $util ?: new StringUtil(); + } + /** + * Tests that there was at least one call. + * + * @param Call[] $calls + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @throws \Prophecy\Exception\Prediction\NoCallsException + */ + public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) + { + if (\count($calls)) { + return; + } + $methodCalls = $object->findProphecyMethodCalls($method->getMethodName(), new ArgumentsWildcard(array(new AnyValuesToken()))); + if (\count($methodCalls)) { + throw new NoCallsException(\sprintf("No calls have been made that match:\n" . " %s->%s(%s)\n" . "but expected at least one.\n" . "Recorded `%s(...)` calls:\n%s", \get_class($object->reveal()), $method->getMethodName(), $method->getArgumentsWildcard(), $method->getMethodName(), $this->util->stringifyCalls($methodCalls)), $method); + } + throw new NoCallsException(\sprintf("No calls have been made that match:\n" . " %s->%s(%s)\n" . "but expected at least one.", \get_class($object->reveal()), $method->getMethodName(), $method->getArgumentsWildcard()), $method); + } } + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Prediction; -.table tbody tr.covered-by-small-tests, li.covered-by-small-tests { - background-color: #99cb84; +use Prophecy\Call\Call; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Argument\ArgumentsWildcard; +use Prophecy\Argument\Token\AnyValuesToken; +use Prophecy\Util\StringUtil; +use Prophecy\Exception\Prediction\UnexpectedCallsCountException; +/** + * Prediction interface. + * Predictions are logical test blocks, tied to `should...` keyword. + * + * @author Konstantin Kudryashov + */ +class CallTimesPrediction implements \Prophecy\Prediction\PredictionInterface +{ + private $times; + private $util; + /** + * Initializes prediction. + * + * @param int $times + * @param StringUtil $util + */ + public function __construct($times, StringUtil $util = null) + { + $this->times = \intval($times); + $this->util = $util ?: new StringUtil(); + } + /** + * Tests that there was exact amount of calls made. + * + * @param Call[] $calls + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @throws \Prophecy\Exception\Prediction\UnexpectedCallsCountException + */ + public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) + { + if ($this->times == \count($calls)) { + return; + } + $methodCalls = $object->findProphecyMethodCalls($method->getMethodName(), new ArgumentsWildcard(array(new AnyValuesToken()))); + if (\count($calls)) { + $message = \sprintf("Expected exactly %d calls that match:\n" . " %s->%s(%s)\n" . "but %d were made:\n%s", $this->times, \get_class($object->reveal()), $method->getMethodName(), $method->getArgumentsWildcard(), \count($calls), $this->util->stringifyCalls($calls)); + } elseif (\count($methodCalls)) { + $message = \sprintf("Expected exactly %d calls that match:\n" . " %s->%s(%s)\n" . "but none were made.\n" . "Recorded `%s(...)` calls:\n%s", $this->times, \get_class($object->reveal()), $method->getMethodName(), $method->getArgumentsWildcard(), $method->getMethodName(), $this->util->stringifyCalls($methodCalls)); + } else { + $message = \sprintf("Expected exactly %d calls that match:\n" . " %s->%s(%s)\n" . "but none were made.", $this->times, \get_class($object->reveal()), $method->getMethodName(), $method->getArgumentsWildcard()); + } + throw new UnexpectedCallsCountException($message, $method, $this->times, $calls); + } } + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Prediction; -.table tbody tr.warning, .table tbody td.warning, li.warning, span.warning { - background-color: #fcf8e3; +use Prophecy\Call\Call; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Exception\InvalidArgumentException; +use Closure; +use ReflectionFunction; +/** + * Callback prediction. + * + * @author Konstantin Kudryashov + */ +class CallbackPrediction implements \Prophecy\Prediction\PredictionInterface +{ + private $callback; + /** + * Initializes callback prediction. + * + * @param callable $callback Custom callback + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function __construct($callback) + { + if (!\is_callable($callback)) { + throw new InvalidArgumentException(\sprintf('Callable expected as an argument to CallbackPrediction, but got %s.', \gettype($callback))); + } + $this->callback = $callback; + } + /** + * Executes preset callback. + * + * @param Call[] $calls + * @param ObjectProphecy $object + * @param MethodProphecy $method + */ + public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) + { + $callback = $this->callback; + if ($callback instanceof Closure && \method_exists('Closure', 'bind') && (new ReflectionFunction($callback))->getClosureThis() !== null) { + $callback = Closure::bind($callback, $object); + } + \call_user_func($callback, $calls, $object, $method); + } } + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Prediction; -td.big { - width: 117px; +use Prophecy\Call\Call; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Util\StringUtil; +use Prophecy\Exception\Prediction\UnexpectedCallsException; +/** + * No calls prediction. + * + * @author Konstantin Kudryashov + */ +class NoCallsPrediction implements \Prophecy\Prediction\PredictionInterface +{ + private $util; + /** + * Initializes prediction. + * + * @param null|StringUtil $util + */ + public function __construct(StringUtil $util = null) + { + $this->util = $util ?: new StringUtil(); + } + /** + * Tests that there were no calls made. + * + * @param Call[] $calls + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @throws \Prophecy\Exception\Prediction\UnexpectedCallsException + */ + public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) + { + if (!\count($calls)) { + return; + } + $verb = \count($calls) === 1 ? 'was' : 'were'; + throw new UnexpectedCallsException(\sprintf("No calls expected that match:\n" . " %s->%s(%s)\n" . "but %d %s made:\n%s", \get_class($object->reveal()), $method->getMethodName(), $method->getArgumentsWildcard(), \count($calls), $verb, $this->util->stringifyCalls($calls)), $method, $calls); + } } + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Prediction; -td.codeLine { - font-family: "Source Code Pro", "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - white-space: pre-wrap; +use Prophecy\Call\Call; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +/** + * Prediction interface. + * Predictions are logical test blocks, tied to `should...` keyword. + * + * @author Konstantin Kudryashov + */ +interface PredictionInterface +{ + /** + * Tests that double fulfilled prediction. + * + * @param Call[] $calls + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @throws object + * @return void + */ + public function check(array $calls, ObjectProphecy $object, MethodProphecy $method); } + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Promise; -td span.default { - color: #2e3436; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Exception\InvalidArgumentException; +use Closure; +use ReflectionFunction; +/** + * Callback promise. + * + * @author Konstantin Kudryashov + */ +class CallbackPromise implements \Prophecy\Promise\PromiseInterface +{ + private $callback; + /** + * Initializes callback promise. + * + * @param callable $callback Custom callback + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function __construct($callback) + { + if (!\is_callable($callback)) { + throw new InvalidArgumentException(\sprintf('Callable expected as an argument to CallbackPromise, but got %s.', \gettype($callback))); + } + $this->callback = $callback; + } + /** + * Evaluates promise callback. + * + * @param array $args + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @return mixed + */ + public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) + { + $callback = $this->callback; + if ($callback instanceof Closure && \method_exists('Closure', 'bind') && (new ReflectionFunction($callback))->getClosureThis() !== null) { + $callback = Closure::bind($callback, $object); + } + return \call_user_func($callback, $args, $object, $method); + } } + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Promise; -td span.keyword { - color: #2e3436; - font-weight: bold; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +/** + * Promise interface. + * Promises are logical blocks, tied to `will...` keyword. + * + * @author Konstantin Kudryashov + */ +interface PromiseInterface +{ + /** + * Evaluates promise. + * + * @param array $args + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @return mixed + */ + public function execute(array $args, ObjectProphecy $object, MethodProphecy $method); } + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Promise; + +use Prophecy\Exception\InvalidArgumentException; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +/** + * Return argument promise. + * + * @author Konstantin Kudryashov + */ +class ReturnArgumentPromise implements \Prophecy\Promise\PromiseInterface +{ + /** + * @var int + */ + private $index; + /** + * Initializes callback promise. + * + * @param int $index The zero-indexed number of the argument to return + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function __construct($index = 0) + { + if (!\is_int($index) || $index < 0) { + throw new InvalidArgumentException(\sprintf('Zero-based index expected as argument to ReturnArgumentPromise, but got %s.', $index)); + } + $this->index = $index; + } + /** + * Returns nth argument if has one, null otherwise. + * + * @param array $args + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @return null|mixed + */ + public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) + { + return \count($args) > $this->index ? $args[$this->index] : null; + } } + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Promise; -#classCoverageDistribution, #classComplexity { - height: 200px; - width: 475px; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +/** + * Return promise. + * + * @author Konstantin Kudryashov + */ +class ReturnPromise implements \Prophecy\Promise\PromiseInterface +{ + private $returnValues = array(); + /** + * Initializes promise. + * + * @param array $returnValues Array of values + */ + public function __construct(array $returnValues) + { + $this->returnValues = $returnValues; + } + /** + * Returns saved values one by one until last one, then continuously returns last value. + * + * @param array $args + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @return mixed + */ + public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) + { + $value = \array_shift($this->returnValues); + if (!\count($this->returnValues)) { + $this->returnValues[] = $value; + } + return $value; + } } + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Promise; -svg text { - font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif; - font-size: 11px; - color: #666; - fill: #666; +use PHPUnit\Doctrine\Instantiator\Instantiator; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Exception\InvalidArgumentException; +use ReflectionClass; +/** + * Throw promise. + * + * @author Konstantin Kudryashov + */ +class ThrowPromise implements \Prophecy\Promise\PromiseInterface +{ + private $exception; + /** + * @var \Doctrine\Instantiator\Instantiator + */ + private $instantiator; + /** + * Initializes promise. + * + * @param string|\Exception|\Throwable $exception Exception class name or instance + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function __construct($exception) + { + if (\is_string($exception)) { + if (!\class_exists($exception) && !\interface_exists($exception) || !$this->isAValidThrowable($exception)) { + throw new InvalidArgumentException(\sprintf('Exception / Throwable class or instance expected as argument to ThrowPromise, but got %s.', $exception)); + } + } elseif (!$exception instanceof \Exception && !$exception instanceof \Throwable) { + throw new InvalidArgumentException(\sprintf('Exception / Throwable class or instance expected as argument to ThrowPromise, but got %s.', \is_object($exception) ? \get_class($exception) : \gettype($exception))); + } + $this->exception = $exception; + } + /** + * Throws predefined exception. + * + * @param array $args + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @throws object + */ + public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) + { + if (\is_string($this->exception)) { + $classname = $this->exception; + $reflection = new ReflectionClass($classname); + $constructor = $reflection->getConstructor(); + if ($constructor->isPublic() && 0 == $constructor->getNumberOfRequiredParameters()) { + throw $reflection->newInstance(); + } + if (!$this->instantiator) { + $this->instantiator = new Instantiator(); + } + throw $this->instantiator->instantiate($classname); + } + throw $this->exception; + } + /** + * @param string $exception + * + * @return bool + */ + private function isAValidThrowable($exception) + { + return \is_a($exception, 'Exception', \true) || \is_a($exception, 'Throwable', \true); + } } + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Prophecy\Prophecy; -table + .structure-heading { - border-top: 1px solid lightgrey; - padding-top: 0.5em; -} -.octicon { - display: inline-block; - vertical-align: text-top; - fill: currentColor; +use Prophecy\Argument; +use Prophecy\Prophet; +use Prophecy\Promise; +use Prophecy\Prediction; +use Prophecy\Exception\Doubler\MethodNotFoundException; +use Prophecy\Exception\InvalidArgumentException; +use Prophecy\Exception\Prophecy\MethodProphecyException; +use ReflectionNamedType; +use ReflectionType; +use ReflectionUnionType; +/** + * Method prophecy. + * + * @author Konstantin Kudryashov + */ +class MethodProphecy +{ + private $objectProphecy; + private $methodName; + private $argumentsWildcard; + private $promise; + private $prediction; + private $checkedPredictions = array(); + private $bound = \false; + private $voidReturnType = \false; + /** + * Initializes method prophecy. + * + * @param ObjectProphecy $objectProphecy + * @param string $methodName + * @param null|Argument\ArgumentsWildcard|array $arguments + * + * @throws \Prophecy\Exception\Doubler\MethodNotFoundException If method not found + */ + public function __construct(\Prophecy\Prophecy\ObjectProphecy $objectProphecy, $methodName, $arguments = null) + { + $double = $objectProphecy->reveal(); + if (!\method_exists($double, $methodName)) { + throw new MethodNotFoundException(\sprintf('Method `%s::%s()` is not defined.', \get_class($double), $methodName), \get_class($double), $methodName, $arguments); + } + $this->objectProphecy = $objectProphecy; + $this->methodName = $methodName; + $reflectedMethod = new \ReflectionMethod($double, $methodName); + if ($reflectedMethod->isFinal()) { + throw new MethodProphecyException(\sprintf("Can not add prophecy for a method `%s::%s()`\n" . "as it is a final method.", \get_class($double), $methodName), $this); + } + if (null !== $arguments) { + $this->withArguments($arguments); + } + $hasTentativeReturnType = \method_exists($reflectedMethod, 'hasTentativeReturnType') && $reflectedMethod->hasTentativeReturnType(); + if (\true === $reflectedMethod->hasReturnType() || $hasTentativeReturnType) { + if ($hasTentativeReturnType) { + $reflectionType = $reflectedMethod->getTentativeReturnType(); + } else { + $reflectionType = $reflectedMethod->getReturnType(); + } + if ($reflectionType instanceof ReflectionNamedType) { + $types = [$reflectionType]; + } elseif ($reflectionType instanceof ReflectionUnionType) { + $types = $reflectionType->getTypes(); + } + $types = \array_map(function (ReflectionType $type) { + return $type->getName(); + }, $types); + \usort($types, static function (string $type1, string $type2) { + // null is lowest priority + if ($type2 == 'null') { + return -1; + } elseif ($type1 == 'null') { + return 1; + } + // objects are higher priority than scalars + $isObject = static function ($type) { + return \class_exists($type) || \interface_exists($type); + }; + if ($isObject($type1) && !$isObject($type2)) { + return -1; + } elseif (!$isObject($type1) && $isObject($type2)) { + return 1; + } + // don't sort both-scalars or both-objects + return 0; + }); + $defaultType = $types[0]; + if ('void' === $defaultType) { + $this->voidReturnType = \true; + } + $this->will(function () use($defaultType) { + switch ($defaultType) { + case 'void': + return; + case 'string': + return ''; + case 'float': + return 0.0; + case 'int': + return 0; + case 'bool': + return \false; + case 'array': + return array(); + case 'callable': + case 'Closure': + return function () { + }; + case 'Traversable': + case 'Generator': + return (function () { + yield; + })(); + default: + $prophet = new Prophet(); + return $prophet->prophesize($defaultType)->reveal(); + } + }); + } + } + /** + * Sets argument wildcard. + * + * @param array|Argument\ArgumentsWildcard $arguments + * + * @return $this + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function withArguments($arguments) + { + if (\is_array($arguments)) { + $arguments = new Argument\ArgumentsWildcard($arguments); + } + if (!$arguments instanceof Argument\ArgumentsWildcard) { + throw new InvalidArgumentException(\sprintf("Either an array or an instance of ArgumentsWildcard expected as\n" . 'a `MethodProphecy::withArguments()` argument, but got %s.', \gettype($arguments))); + } + $this->argumentsWildcard = $arguments; + return $this; + } + /** + * Sets custom promise to the prophecy. + * + * @param callable|Promise\PromiseInterface $promise + * + * @return $this + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function will($promise) + { + if (\is_callable($promise)) { + $promise = new Promise\CallbackPromise($promise); + } + if (!$promise instanceof Promise\PromiseInterface) { + throw new InvalidArgumentException(\sprintf('Expected callable or instance of PromiseInterface, but got %s.', \gettype($promise))); + } + $this->bindToObjectProphecy(); + $this->promise = $promise; + return $this; + } + /** + * Sets return promise to the prophecy. + * + * @see \Prophecy\Promise\ReturnPromise + * + * @return $this + */ + public function willReturn() + { + if ($this->voidReturnType) { + throw new MethodProphecyException("The method \"{$this->methodName}\" has a void return type, and so cannot return anything", $this); + } + return $this->will(new Promise\ReturnPromise(\func_get_args())); + } + /** + * @param array $items + * @param mixed $return + * + * @return $this + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function willYield($items, $return = null) + { + if ($this->voidReturnType) { + throw new MethodProphecyException("The method \"{$this->methodName}\" has a void return type, and so cannot yield anything", $this); + } + if (!\is_array($items)) { + throw new InvalidArgumentException(\sprintf('Expected array, but got %s.', \gettype($items))); + } + $generator = function () use($items, $return) { + yield from $items; + return $return; + }; + return $this->will($generator); + } + /** + * Sets return argument promise to the prophecy. + * + * @param int $index The zero-indexed number of the argument to return + * + * @see \Prophecy\Promise\ReturnArgumentPromise + * + * @return $this + */ + public function willReturnArgument($index = 0) + { + if ($this->voidReturnType) { + throw new MethodProphecyException("The method \"{$this->methodName}\" has a void return type", $this); + } + return $this->will(new Promise\ReturnArgumentPromise($index)); + } + /** + * Sets throw promise to the prophecy. + * + * @see \Prophecy\Promise\ThrowPromise + * + * @param string|\Exception $exception Exception class or instance + * + * @return $this + */ + public function willThrow($exception) + { + return $this->will(new Promise\ThrowPromise($exception)); + } + /** + * Sets custom prediction to the prophecy. + * + * @param callable|Prediction\PredictionInterface $prediction + * + * @return $this + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function should($prediction) + { + if (\is_callable($prediction)) { + $prediction = new Prediction\CallbackPrediction($prediction); + } + if (!$prediction instanceof Prediction\PredictionInterface) { + throw new InvalidArgumentException(\sprintf('Expected callable or instance of PredictionInterface, but got %s.', \gettype($prediction))); + } + $this->bindToObjectProphecy(); + $this->prediction = $prediction; + return $this; + } + /** + * Sets call prediction to the prophecy. + * + * @see \Prophecy\Prediction\CallPrediction + * + * @return $this + */ + public function shouldBeCalled() + { + return $this->should(new Prediction\CallPrediction()); + } + /** + * Sets no calls prediction to the prophecy. + * + * @see \Prophecy\Prediction\NoCallsPrediction + * + * @return $this + */ + public function shouldNotBeCalled() + { + return $this->should(new Prediction\NoCallsPrediction()); + } + /** + * Sets call times prediction to the prophecy. + * + * @see \Prophecy\Prediction\CallTimesPrediction + * + * @param $count + * + * @return $this + */ + public function shouldBeCalledTimes($count) + { + return $this->should(new Prediction\CallTimesPrediction($count)); + } + /** + * Sets call times prediction to the prophecy. + * + * @see \Prophecy\Prediction\CallTimesPrediction + * + * @return $this + */ + public function shouldBeCalledOnce() + { + return $this->shouldBeCalledTimes(1); + } + /** + * Checks provided prediction immediately. + * + * @param callable|Prediction\PredictionInterface $prediction + * + * @return $this + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function shouldHave($prediction) + { + if (\is_callable($prediction)) { + $prediction = new Prediction\CallbackPrediction($prediction); + } + if (!$prediction instanceof Prediction\PredictionInterface) { + throw new InvalidArgumentException(\sprintf('Expected callable or instance of PredictionInterface, but got %s.', \gettype($prediction))); + } + if (null === $this->promise && !$this->voidReturnType) { + $this->willReturn(); + } + $calls = $this->getObjectProphecy()->findProphecyMethodCalls($this->getMethodName(), $this->getArgumentsWildcard()); + try { + $prediction->check($calls, $this->getObjectProphecy(), $this); + $this->checkedPredictions[] = $prediction; + } catch (\Exception $e) { + $this->checkedPredictions[] = $prediction; + throw $e; + } + return $this; + } + /** + * Checks call prediction. + * + * @see \Prophecy\Prediction\CallPrediction + * + * @return $this + */ + public function shouldHaveBeenCalled() + { + return $this->shouldHave(new Prediction\CallPrediction()); + } + /** + * Checks no calls prediction. + * + * @see \Prophecy\Prediction\NoCallsPrediction + * + * @return $this + */ + public function shouldNotHaveBeenCalled() + { + return $this->shouldHave(new Prediction\NoCallsPrediction()); + } + /** + * Checks no calls prediction. + * + * @see \Prophecy\Prediction\NoCallsPrediction + * @deprecated + * + * @return $this + */ + public function shouldNotBeenCalled() + { + return $this->shouldNotHaveBeenCalled(); + } + /** + * Checks call times prediction. + * + * @see \Prophecy\Prediction\CallTimesPrediction + * + * @param int $count + * + * @return $this + */ + public function shouldHaveBeenCalledTimes($count) + { + return $this->shouldHave(new Prediction\CallTimesPrediction($count)); + } + /** + * Checks call times prediction. + * + * @see \Prophecy\Prediction\CallTimesPrediction + * + * @return $this + */ + public function shouldHaveBeenCalledOnce() + { + return $this->shouldHaveBeenCalledTimes(1); + } + /** + * Checks currently registered [with should(...)] prediction. + */ + public function checkPrediction() + { + if (null === $this->prediction) { + return; + } + $this->shouldHave($this->prediction); + } + /** + * Returns currently registered promise. + * + * @return null|Promise\PromiseInterface + */ + public function getPromise() + { + return $this->promise; + } + /** + * Returns currently registered prediction. + * + * @return null|Prediction\PredictionInterface + */ + public function getPrediction() + { + return $this->prediction; + } + /** + * Returns predictions that were checked on this object. + * + * @return Prediction\PredictionInterface[] + */ + public function getCheckedPredictions() + { + return $this->checkedPredictions; + } + /** + * Returns object prophecy this method prophecy is tied to. + * + * @return ObjectProphecy + */ + public function getObjectProphecy() + { + return $this->objectProphecy; + } + /** + * Returns method name. + * + * @return string + */ + public function getMethodName() + { + return $this->methodName; + } + /** + * Returns arguments wildcard. + * + * @return Argument\ArgumentsWildcard + */ + public function getArgumentsWildcard() + { + return $this->argumentsWildcard; + } + /** + * @return bool + */ + public function hasReturnVoid() + { + return $this->voidReturnType; + } + private function bindToObjectProphecy() + { + if ($this->bound) { + return; + } + $this->getObjectProphecy()->addMethodProphecy($this); + $this->bound = \true; + } } -.nvd3 .nv-axis{pointer-events:none;opacity:1}.nvd3 .nv-axis path{fill:none;stroke:#000;stroke-opacity:.75;shape-rendering:crispEdges}.nvd3 .nv-axis path.domain{stroke-opacity:.75}.nvd3 .nv-axis.nv-x path.domain{stroke-opacity:0}.nvd3 .nv-axis line{fill:none;stroke:#e5e5e5;shape-rendering:crispEdges}.nvd3 .nv-axis .zero line,.nvd3 .nv-axis line.zero{stroke-opacity:.75}.nvd3 .nv-axis .nv-axisMaxMin text{font-weight:700}.nvd3 .x .nv-axis .nv-axisMaxMin text,.nvd3 .x2 .nv-axis .nv-axisMaxMin text,.nvd3 .x3 .nv-axis .nv-axisMaxMin text{text-anchor:middle}.nvd3 .nv-axis.nv-disabled{opacity:0}.nvd3 .nv-bars rect{fill-opacity:.75;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-bars rect.hover{fill-opacity:1}.nvd3 .nv-bars .hover rect{fill:#add8e6}.nvd3 .nv-bars text{fill:rgba(0,0,0,0)}.nvd3 .nv-bars .hover text{fill:rgba(0,0,0,1)}.nvd3 .nv-multibar .nv-groups rect,.nvd3 .nv-multibarHorizontal .nv-groups rect,.nvd3 .nv-discretebar .nv-groups rect{stroke-opacity:0;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-multibar .nv-groups rect:hover,.nvd3 .nv-multibarHorizontal .nv-groups rect:hover,.nvd3 .nv-candlestickBar .nv-ticks rect:hover,.nvd3 .nv-discretebar .nv-groups rect:hover{fill-opacity:1}.nvd3 .nv-discretebar .nv-groups text,.nvd3 .nv-multibarHorizontal .nv-groups text{font-weight:700;fill:rgba(0,0,0,1);stroke:rgba(0,0,0,0)}.nvd3 .nv-boxplot circle{fill-opacity:.5}.nvd3 .nv-boxplot circle:hover{fill-opacity:1}.nvd3 .nv-boxplot rect:hover{fill-opacity:1}.nvd3 line.nv-boxplot-median{stroke:#000}.nv-boxplot-tick:hover{stroke-width:2.5px}.nvd3.nv-bullet{font:10px sans-serif}.nvd3.nv-bullet .nv-measure{fill-opacity:.8}.nvd3.nv-bullet .nv-measure:hover{fill-opacity:1}.nvd3.nv-bullet .nv-marker{stroke:#000;stroke-width:2px}.nvd3.nv-bullet .nv-markerTriangle{stroke:#000;fill:#fff;stroke-width:1.5px}.nvd3.nv-bullet .nv-tick line{stroke:#666;stroke-width:.5px}.nvd3.nv-bullet .nv-range.nv-s0{fill:#eee}.nvd3.nv-bullet .nv-range.nv-s1{fill:#ddd}.nvd3.nv-bullet .nv-range.nv-s2{fill:#ccc}.nvd3.nv-bullet .nv-title{font-size:14px;font-weight:700}.nvd3.nv-bullet .nv-subtitle{fill:#999}.nvd3.nv-bullet .nv-range{fill:#bababa;fill-opacity:.4}.nvd3.nv-bullet .nv-range:hover{fill-opacity:.7}.nvd3.nv-candlestickBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.positive rect{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.negative rect{stroke:#d62728;fill:#d62728}.with-transitions .nv-candlestickBar .nv-ticks .nv-tick{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-candlestickBar .nv-ticks line{stroke:#333}.nvd3 .nv-legend .nv-disabled rect{}.nvd3 .nv-check-box .nv-box{fill-opacity:0;stroke-width:2}.nvd3 .nv-check-box .nv-check{fill-opacity:0;stroke-width:4}.nvd3 .nv-series.nv-disabled .nv-check-box .nv-check{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-controlsWrap .nv-legend .nv-check-box .nv-check{opacity:0}.nvd3.nv-linePlusBar .nv-bar rect{fill-opacity:.75}.nvd3.nv-linePlusBar .nv-bar rect:hover{fill-opacity:1}.nvd3 .nv-groups path.nv-line{fill:none}.nvd3 .nv-groups path.nv-area{stroke:none}.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point{fill-opacity:0;stroke-opacity:0}.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point{fill-opacity:.5!important;stroke-opacity:.5!important}.with-transitions .nvd3 .nv-groups .nv-point{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-scatter .nv-groups .nv-point.hover,.nvd3 .nv-groups .nv-point.hover{stroke-width:7px;fill-opacity:.95!important;stroke-opacity:.95!important}.nvd3 .nv-point-paths path{stroke:#aaa;stroke-opacity:0;fill:#eee;fill-opacity:0}.nvd3 .nv-indexLine{cursor:ew-resize}svg.nvd3-svg{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-ms-user-select:none;-moz-user-select:none;user-select:none;display:block;width:100%;height:100%}.nvtooltip.with-3d-shadow,.with-3d-shadow .nvtooltip{-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nvd3 text{font:400 12px Arial}.nvd3 .title{font:700 14px Arial}.nvd3 .nv-background{fill:#fff;fill-opacity:0}.nvd3.nv-noData{font-size:18px;font-weight:700}.nv-brush .extent{fill-opacity:.125;shape-rendering:crispEdges}.nv-brush .resize path{fill:#eee;stroke:#666}.nvd3 .nv-legend .nv-series{cursor:pointer}.nvd3 .nv-legend .nv-disabled circle{fill-opacity:0}.nvd3 .nv-brush .extent{fill-opacity:0!important}.nvd3 .nv-brushBackground rect{stroke:#000;stroke-width:.4;fill:#fff;fill-opacity:.7}.nvd3.nv-ohlcBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.positive{stroke:#2ca02c}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.negative{stroke:#d62728}.nvd3 .background path{fill:none;stroke:#EEE;stroke-opacity:.4;shape-rendering:crispEdges}.nvd3 .foreground path{fill:none;stroke-opacity:.7}.nvd3 .nv-parallelCoordinates-brush .extent{fill:#fff;fill-opacity:.6;stroke:gray;shape-rendering:crispEdges}.nvd3 .nv-parallelCoordinates .hover{fill-opacity:1;stroke-width:3px}.nvd3 .missingValuesline line{fill:none;stroke:#000;stroke-width:1;stroke-opacity:1;stroke-dasharray:5,5}.nvd3.nv-pie path{stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-pie .nv-pie-title{font-size:24px;fill:rgba(19,196,249,.59)}.nvd3.nv-pie .nv-slice text{stroke:#000;stroke-width:0}.nvd3.nv-pie path{stroke:#fff;stroke-width:1px;stroke-opacity:1}.nvd3.nv-pie .hover path{fill-opacity:.7}.nvd3.nv-pie .nv-label{pointer-events:none}.nvd3.nv-pie .nv-label rect{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-groups .nv-point.hover{stroke-width:20px;stroke-opacity:.5}.nvd3 .nv-scatter .nv-point.hover{fill-opacity:1}.nv-noninteractive{pointer-events:none}.nv-distx,.nv-disty{pointer-events:none}.nvd3.nv-sparkline path{fill:none}.nvd3.nv-sparklineplus g.nv-hoverValue{pointer-events:none}.nvd3.nv-sparklineplus .nv-hoverValue line{stroke:#333;stroke-width:1.5px}.nvd3.nv-sparklineplus,.nvd3.nv-sparklineplus g{pointer-events:all}.nvd3 .nv-hoverArea{fill-opacity:0;stroke-opacity:0}.nvd3.nv-sparklineplus .nv-xValue,.nvd3.nv-sparklineplus .nv-yValue{stroke-width:0;font-size:.9em;font-weight:400}.nvd3.nv-sparklineplus .nv-yValue{stroke:#f66}.nvd3.nv-sparklineplus .nv-maxValue{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-sparklineplus .nv-minValue{stroke:#d62728;fill:#d62728}.nvd3.nv-sparklineplus .nv-currentValue{font-weight:700;font-size:1.1em}.nvd3.nv-stackedarea path.nv-area{fill-opacity:.7;stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-stackedarea path.nv-area.hover{fill-opacity:.9}.nvd3.nv-stackedarea .nv-groups .nv-point{stroke-opacity:0;fill-opacity:0}.nvtooltip{position:absolute;background-color:rgba(255,255,255,1);color:rgba(0,0,0,1);padding:1px;border:1px solid rgba(0,0,0,.2);z-index:10000;display:block;font-family:Arial;font-size:13px;text-align:left;pointer-events:none;white-space:nowrap;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.nvtooltip{background:rgba(255,255,255,.8);border:1px solid rgba(0,0,0,.5);border-radius:4px}.nvtooltip.with-transitions,.with-transitions .nvtooltip{transition:opacity 50ms linear;-moz-transition:opacity 50ms linear;-webkit-transition:opacity 50ms linear;transition-delay:200ms;-moz-transition-delay:200ms;-webkit-transition-delay:200ms}.nvtooltip.x-nvtooltip,.nvtooltip.y-nvtooltip{padding:8px}.nvtooltip h3{margin:0;padding:4px 14px;line-height:18px;font-weight:400;background-color:rgba(247,247,247,.75);color:rgba(0,0,0,1);text-align:center;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.nvtooltip p{margin:0;padding:5px 14px;text-align:center}.nvtooltip span{display:inline-block;margin:2px 0}.nvtooltip table{margin:6px;border-spacing:0}.nvtooltip table td{padding:2px 9px 2px 0;vertical-align:middle}.nvtooltip table td.key{font-weight:400}.nvtooltip table td.value{text-align:right;font-weight:700}.nvtooltip table tr.highlight td{padding:1px 9px 1px 0;border-bottom-style:solid;border-bottom-width:1px;border-top-style:solid;border-top-width:1px}.nvtooltip table td.legend-color-guide div{width:8px;height:8px;vertical-align:middle}.nvtooltip table td.legend-color-guide div{width:12px;height:12px;border:1px solid #999}.nvtooltip .footer{padding:3px;text-align:center}.nvtooltip-pending-removal{pointer-events:none;display:none}.nvd3 .nv-interactiveGuideLine{pointer-events:none}.nvd3 line.nv-guideline{stroke:#ccc} - - - - Code Coverage for {{full_path}} - - - - - - - -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      - - - - - - - - - - - - - - - - -{{items}} - -
       
      Code Coverage
       
      Lines
      Branches
      Paths
      Functions and Methods
      Classes and Traits
      -
      -
      -
      -

      Legend

      -

      - Low: 0% to {{low_upper_bound}}% - Medium: {{low_upper_bound}}% to {{high_lower_bound}}% - High: {{high_lower_bound}}% to 100% -

      -

      - Generated by php-code-coverage {{version}} using {{runtime}}{{generator}} at {{date}}. -

      -
      -
      - - -
      -

      Branches

      -

      - Below are the source code lines that represent each code branch as identified by Xdebug. Please note a branch is not - necessarily coterminous with a line, a line may contain multiple branches and therefore show up more than once. - Please also be aware that some branches may be implicit rather than explicit, e.g. an if statement - always has an else as part of its logical flow even if you didn't write one. -

      -{{branches}} - - {{name}} - {{classes_bar}} -
      {{classes_tested_percent}}
      -
      {{classes_number}}
      - {{methods_bar}} -
      {{methods_tested_percent}}
      -
      {{methods_number}}
      - {{crap}} - {{lines_bar}} -
      {{lines_executed_percent}}
      -
      {{lines_number}}
      - - - - {{icon}}{{name}} - {{lines_bar}} -
      {{lines_executed_percent}}
      -
      {{lines_number}}
      - {{branches_bar}} -
      {{branches_executed_percent}}
      -
      {{branches_number}}
      - {{paths_bar}} -
      {{paths_executed_percent}}
      -
      {{paths_number}}
      - {{methods_bar}} -
      {{methods_tested_percent}}
      -
      {{methods_number}}
      - {{classes_bar}} -
      {{classes_tested_percent}}
      -
      {{classes_number}}
      - - - - - - - Dashboard for {{full_path}} - - - - - - - -
      -
      -
      -
      - -
      -
      -
      -
      -
      -
      -
      -

      Classes

      -
      -
      -
      -
      -

      Coverage Distribution

      -
      - -
      -
      -
      -

      Complexity

      -
      - -
      -
      -
      -
      -
      -

      Insufficient Coverage

      -
      - - - - - - - - -{{insufficient_coverage_classes}} - -
      ClassCoverage
      -
      -
      -
      -

      Project Risks

      -
      - - - - - - - - -{{project_risks_classes}} - -
      ClassCRAP
      -
      -
      -
      -
      -
      -

      Methods

      -
      -
      -
      -
      -

      Coverage Distribution

      -
      - -
      -
      -
      -

      Complexity

      -
      - -
      -
      -
      -
      -
      -

      Insufficient Coverage

      -
      - - - - - - - - -{{insufficient_coverage_methods}} - -
      MethodCoverage
      -
      -
      -
      -

      Project Risks

      -
      - - - - - - - - -{{project_risks_methods}} - -
      MethodCRAP
      -
      -
      -
      - -
      - - - - - - - $expected + * + * @psalm-assert =ExpectedType $actual + */ + public static function assertInstanceOf(string $expected, $actual, string $message = '') : void + { + if (!class_exists($expected) && !interface_exists($expected)) { + throw \PHPUnit\Framework\InvalidArgumentException::create(1, 'class or interface name'); + } + static::assertThat($actual, new IsInstanceOf($expected), $message); + } + /** + * Asserts that a variable is not of a given type. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @psalm-template ExpectedType of object + * + * @psalm-param class-string $expected + * + * @psalm-assert !ExpectedType $actual + */ + public static function assertNotInstanceOf(string $expected, $actual, string $message = '') : void + { + if (!class_exists($expected) && !interface_exists($expected)) { + throw \PHPUnit\Framework\InvalidArgumentException::create(1, 'class or interface name'); + } + static::assertThat($actual, new LogicalNot(new IsInstanceOf($expected)), $message); + } + /** + * Asserts that a variable is of type array. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert array $actual + */ + public static function assertIsArray($actual, string $message = '') : void + { + static::assertThat($actual, new IsType(IsType::TYPE_ARRAY), $message); + } + /** + * Asserts that a variable is of type bool. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert bool $actual + */ + public static function assertIsBool($actual, string $message = '') : void + { + static::assertThat($actual, new IsType(IsType::TYPE_BOOL), $message); + } + /** + * Asserts that a variable is of type float. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert float $actual + */ + public static function assertIsFloat($actual, string $message = '') : void + { + static::assertThat($actual, new IsType(IsType::TYPE_FLOAT), $message); + } + /** + * Asserts that a variable is of type int. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert int $actual + */ + public static function assertIsInt($actual, string $message = '') : void + { + static::assertThat($actual, new IsType(IsType::TYPE_INT), $message); + } + /** + * Asserts that a variable is of type numeric. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert numeric $actual + */ + public static function assertIsNumeric($actual, string $message = '') : void + { + static::assertThat($actual, new IsType(IsType::TYPE_NUMERIC), $message); + } + /** + * Asserts that a variable is of type object. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert object $actual + */ + public static function assertIsObject($actual, string $message = '') : void + { + static::assertThat($actual, new IsType(IsType::TYPE_OBJECT), $message); + } + /** + * Asserts that a variable is of type resource. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert resource $actual + */ + public static function assertIsResource($actual, string $message = '') : void + { + static::assertThat($actual, new IsType(IsType::TYPE_RESOURCE), $message); + } + /** + * Asserts that a variable is of type resource and is closed. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert resource $actual + */ + public static function assertIsClosedResource($actual, string $message = '') : void + { + static::assertThat($actual, new IsType(IsType::TYPE_CLOSED_RESOURCE), $message); + } + /** + * Asserts that a variable is of type string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert string $actual + */ + public static function assertIsString($actual, string $message = '') : void + { + static::assertThat($actual, new IsType(IsType::TYPE_STRING), $message); + } + /** + * Asserts that a variable is of type scalar. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert scalar $actual + */ + public static function assertIsScalar($actual, string $message = '') : void + { + static::assertThat($actual, new IsType(IsType::TYPE_SCALAR), $message); + } + /** + * Asserts that a variable is of type callable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert callable $actual + */ + public static function assertIsCallable($actual, string $message = '') : void + { + static::assertThat($actual, new IsType(IsType::TYPE_CALLABLE), $message); + } + /** + * Asserts that a variable is of type iterable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert iterable $actual + */ + public static function assertIsIterable($actual, string $message = '') : void + { + static::assertThat($actual, new IsType(IsType::TYPE_ITERABLE), $message); + } + /** + * Asserts that a variable is not of type array. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !array $actual + */ + public static function assertIsNotArray($actual, string $message = '') : void + { + static::assertThat($actual, new LogicalNot(new IsType(IsType::TYPE_ARRAY)), $message); + } + /** + * Asserts that a variable is not of type bool. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !bool $actual + */ + public static function assertIsNotBool($actual, string $message = '') : void + { + static::assertThat($actual, new LogicalNot(new IsType(IsType::TYPE_BOOL)), $message); + } + /** + * Asserts that a variable is not of type float. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !float $actual + */ + public static function assertIsNotFloat($actual, string $message = '') : void + { + static::assertThat($actual, new LogicalNot(new IsType(IsType::TYPE_FLOAT)), $message); + } + /** + * Asserts that a variable is not of type int. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !int $actual + */ + public static function assertIsNotInt($actual, string $message = '') : void + { + static::assertThat($actual, new LogicalNot(new IsType(IsType::TYPE_INT)), $message); + } + /** + * Asserts that a variable is not of type numeric. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !numeric $actual + */ + public static function assertIsNotNumeric($actual, string $message = '') : void + { + static::assertThat($actual, new LogicalNot(new IsType(IsType::TYPE_NUMERIC)), $message); + } + /** + * Asserts that a variable is not of type object. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !object $actual + */ + public static function assertIsNotObject($actual, string $message = '') : void + { + static::assertThat($actual, new LogicalNot(new IsType(IsType::TYPE_OBJECT)), $message); + } + /** + * Asserts that a variable is not of type resource. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !resource $actual + */ + public static function assertIsNotResource($actual, string $message = '') : void + { + static::assertThat($actual, new LogicalNot(new IsType(IsType::TYPE_RESOURCE)), $message); + } + /** + * Asserts that a variable is not of type resource. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !resource $actual + */ + public static function assertIsNotClosedResource($actual, string $message = '') : void + { + static::assertThat($actual, new LogicalNot(new IsType(IsType::TYPE_CLOSED_RESOURCE)), $message); + } + /** + * Asserts that a variable is not of type string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !string $actual + */ + public static function assertIsNotString($actual, string $message = '') : void + { + static::assertThat($actual, new LogicalNot(new IsType(IsType::TYPE_STRING)), $message); + } + /** + * Asserts that a variable is not of type scalar. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !scalar $actual + */ + public static function assertIsNotScalar($actual, string $message = '') : void + { + static::assertThat($actual, new LogicalNot(new IsType(IsType::TYPE_SCALAR)), $message); + } + /** + * Asserts that a variable is not of type callable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !callable $actual + */ + public static function assertIsNotCallable($actual, string $message = '') : void + { + static::assertThat($actual, new LogicalNot(new IsType(IsType::TYPE_CALLABLE)), $message); + } + /** + * Asserts that a variable is not of type iterable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !iterable $actual + */ + public static function assertIsNotIterable($actual, string $message = '') : void + { + static::assertThat($actual, new LogicalNot(new IsType(IsType::TYPE_ITERABLE)), $message); + } + /** + * Asserts that a string matches a given regular expression. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertMatchesRegularExpression(string $pattern, string $string, string $message = '') : void + { + static::assertThat($string, new RegularExpression($pattern), $message); + } + /** + * Asserts that a string matches a given regular expression. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @codeCoverageIgnore + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4086 + */ + public static function assertRegExp(string $pattern, string $string, string $message = '') : void + { + self::createWarning('assertRegExp() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertMatchesRegularExpression() instead.'); + static::assertThat($string, new RegularExpression($pattern), $message); + } + /** + * Asserts that a string does not match a given regular expression. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertDoesNotMatchRegularExpression(string $pattern, string $string, string $message = '') : void + { + static::assertThat($string, new LogicalNot(new RegularExpression($pattern)), $message); + } + /** + * Asserts that a string does not match a given regular expression. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @codeCoverageIgnore + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4089 + */ + public static function assertNotRegExp(string $pattern, string $string, string $message = '') : void + { + self::createWarning('assertNotRegExp() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDoesNotMatchRegularExpression() instead.'); + static::assertThat($string, new LogicalNot(new RegularExpression($pattern)), $message); + } + /** + * Assert that the size of two arrays (or `Countable` or `Traversable` objects) + * is the same. + * + * @param Countable|iterable $expected + * @param Countable|iterable $actual + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertSameSize($expected, $actual, string $message = '') : void + { + if (!$expected instanceof Countable && !is_iterable($expected)) { + throw \PHPUnit\Framework\InvalidArgumentException::create(1, 'countable or iterable'); + } + if (!$actual instanceof Countable && !is_iterable($actual)) { + throw \PHPUnit\Framework\InvalidArgumentException::create(2, 'countable or iterable'); + } + static::assertThat($actual, new SameSize($expected), $message); + } + /** + * Assert that the size of two arrays (or `Countable` or `Traversable` objects) + * is not the same. + * + * @param Countable|iterable $expected + * @param Countable|iterable $actual + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertNotSameSize($expected, $actual, string $message = '') : void + { + if (!$expected instanceof Countable && !is_iterable($expected)) { + throw \PHPUnit\Framework\InvalidArgumentException::create(1, 'countable or iterable'); + } + if (!$actual instanceof Countable && !is_iterable($actual)) { + throw \PHPUnit\Framework\InvalidArgumentException::create(2, 'countable or iterable'); + } + static::assertThat($actual, new LogicalNot(new SameSize($expected)), $message); + } + /** + * Asserts that a string matches a given format string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringMatchesFormat(string $format, string $string, string $message = '') : void + { + static::assertThat($string, new StringMatchesFormatDescription($format), $message); + } + /** + * Asserts that a string does not match a given format string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringNotMatchesFormat(string $format, string $string, string $message = '') : void + { + static::assertThat($string, new LogicalNot(new StringMatchesFormatDescription($format)), $message); + } + /** + * Asserts that a string matches a given format file. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringMatchesFormatFile(string $formatFile, string $string, string $message = '') : void + { + static::assertFileExists($formatFile, $message); + static::assertThat($string, new StringMatchesFormatDescription(file_get_contents($formatFile)), $message); + } + /** + * Asserts that a string does not match a given format string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringNotMatchesFormatFile(string $formatFile, string $string, string $message = '') : void + { + static::assertFileExists($formatFile, $message); + static::assertThat($string, new LogicalNot(new StringMatchesFormatDescription(file_get_contents($formatFile))), $message); + } + /** + * Asserts that a string starts with a given prefix. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringStartsWith(string $prefix, string $string, string $message = '') : void + { + static::assertThat($string, new StringStartsWith($prefix), $message); + } + /** + * Asserts that a string starts not with a given prefix. + * + * @param string $prefix + * @param string $string + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringStartsNotWith($prefix, $string, string $message = '') : void + { + static::assertThat($string, new LogicalNot(new StringStartsWith($prefix)), $message); + } + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringContainsString(string $needle, string $haystack, string $message = '') : void + { + $constraint = new StringContains($needle, \false); + static::assertThat($haystack, $constraint, $message); + } + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringContainsStringIgnoringCase(string $needle, string $haystack, string $message = '') : void + { + $constraint = new StringContains($needle, \true); + static::assertThat($haystack, $constraint, $message); + } + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringNotContainsString(string $needle, string $haystack, string $message = '') : void + { + $constraint = new LogicalNot(new StringContains($needle)); + static::assertThat($haystack, $constraint, $message); + } + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringNotContainsStringIgnoringCase(string $needle, string $haystack, string $message = '') : void + { + $constraint = new LogicalNot(new StringContains($needle, \true)); + static::assertThat($haystack, $constraint, $message); + } + /** + * Asserts that a string ends with a given suffix. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringEndsWith(string $suffix, string $string, string $message = '') : void + { + static::assertThat($string, new StringEndsWith($suffix), $message); + } + /** + * Asserts that a string ends not with a given suffix. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringEndsNotWith(string $suffix, string $string, string $message = '') : void + { + static::assertThat($string, new LogicalNot(new StringEndsWith($suffix)), $message); + } + /** + * Asserts that two XML files are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertXmlFileEqualsXmlFile(string $expectedFile, string $actualFile, string $message = '') : void + { + $expected = (new XmlLoader())->loadFile($expectedFile); + $actual = (new XmlLoader())->loadFile($actualFile); + static::assertEquals($expected, $actual, $message); + } + /** + * Asserts that two XML files are not equal. + * + * @throws \PHPUnit\Util\Exception + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertXmlFileNotEqualsXmlFile(string $expectedFile, string $actualFile, string $message = '') : void + { + $expected = (new XmlLoader())->loadFile($expectedFile); + $actual = (new XmlLoader())->loadFile($actualFile); + static::assertNotEquals($expected, $actual, $message); + } + /** + * Asserts that two XML documents are equal. + * + * @param DOMDocument|string $actualXml + * + * @throws \PHPUnit\Util\Xml\Exception + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertXmlStringEqualsXmlFile(string $expectedFile, $actualXml, string $message = '') : void + { + if (!is_string($actualXml)) { + self::createWarning('Passing an argument of type DOMDocument for the $actualXml parameter is deprecated. Support for this will be removed in PHPUnit 10.'); + $actual = $actualXml; + } else { + $actual = (new XmlLoader())->load($actualXml); + } + $expected = (new XmlLoader())->loadFile($expectedFile); + static::assertEquals($expected, $actual, $message); + } + /** + * Asserts that two XML documents are not equal. + * + * @param DOMDocument|string $actualXml + * + * @throws \PHPUnit\Util\Xml\Exception + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertXmlStringNotEqualsXmlFile(string $expectedFile, $actualXml, string $message = '') : void + { + if (!is_string($actualXml)) { + self::createWarning('Passing an argument of type DOMDocument for the $actualXml parameter is deprecated. Support for this will be removed in PHPUnit 10.'); + $actual = $actualXml; + } else { + $actual = (new XmlLoader())->load($actualXml); + } + $expected = (new XmlLoader())->loadFile($expectedFile); + static::assertNotEquals($expected, $actual, $message); + } + /** + * Asserts that two XML documents are equal. + * + * @param DOMDocument|string $expectedXml + * @param DOMDocument|string $actualXml + * + * @throws \PHPUnit\Util\Xml\Exception + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertXmlStringEqualsXmlString($expectedXml, $actualXml, string $message = '') : void + { + if (!is_string($expectedXml)) { + self::createWarning('Passing an argument of type DOMDocument for the $expectedXml parameter is deprecated. Support for this will be removed in PHPUnit 10.'); + $expected = $expectedXml; + } else { + $expected = (new XmlLoader())->load($expectedXml); + } + if (!is_string($actualXml)) { + self::createWarning('Passing an argument of type DOMDocument for the $actualXml parameter is deprecated. Support for this will be removed in PHPUnit 10.'); + $actual = $actualXml; + } else { + $actual = (new XmlLoader())->load($actualXml); + } + static::assertEquals($expected, $actual, $message); + } + /** + * Asserts that two XML documents are not equal. + * + * @param DOMDocument|string $expectedXml + * @param DOMDocument|string $actualXml + * + * @throws \PHPUnit\Util\Xml\Exception + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, string $message = '') : void + { + if (!is_string($expectedXml)) { + self::createWarning('Passing an argument of type DOMDocument for the $expectedXml parameter is deprecated. Support for this will be removed in PHPUnit 10.'); + $expected = $expectedXml; + } else { + $expected = (new XmlLoader())->load($expectedXml); + } + if (!is_string($actualXml)) { + self::createWarning('Passing an argument of type DOMDocument for the $actualXml parameter is deprecated. Support for this will be removed in PHPUnit 10.'); + $actual = $actualXml; + } else { + $actual = (new XmlLoader())->load($actualXml); + } + static::assertNotEquals($expected, $actual, $message); + } + /** + * Asserts that a hierarchy of DOMElements matches. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws AssertionFailedError + * @throws ExpectationFailedException + * + * @codeCoverageIgnore + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4091 + */ + public static function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, bool $checkAttributes = \false, string $message = '') : void + { + self::createWarning('assertEqualXMLStructure() is deprecated and will be removed in PHPUnit 10.'); + $expectedElement = Xml::import($expectedElement); + $actualElement = Xml::import($actualElement); + static::assertSame($expectedElement->tagName, $actualElement->tagName, $message); + if ($checkAttributes) { + static::assertSame($expectedElement->attributes->length, $actualElement->attributes->length, sprintf('%s%sNumber of attributes on node "%s" does not match', $message, !empty($message) ? "\n" : '', $expectedElement->tagName)); + for ($i = 0; $i < $expectedElement->attributes->length; $i++) { + $expectedAttribute = $expectedElement->attributes->item($i); + $actualAttribute = $actualElement->attributes->getNamedItem($expectedAttribute->name); + assert($expectedAttribute instanceof DOMAttr); + if (!$actualAttribute) { + static::fail(sprintf('%s%sCould not find attribute "%s" on node "%s"', $message, !empty($message) ? "\n" : '', $expectedAttribute->name, $expectedElement->tagName)); + } + } + } + Xml::removeCharacterDataNodes($expectedElement); + Xml::removeCharacterDataNodes($actualElement); + static::assertSame($expectedElement->childNodes->length, $actualElement->childNodes->length, sprintf('%s%sNumber of child nodes of "%s" differs', $message, !empty($message) ? "\n" : '', $expectedElement->tagName)); + for ($i = 0; $i < $expectedElement->childNodes->length; $i++) { + static::assertEqualXMLStructure($expectedElement->childNodes->item($i), $actualElement->childNodes->item($i), $checkAttributes, $message); + } + } + /** + * Evaluates a PHPUnit\Framework\Constraint matcher object. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertThat($value, Constraint $constraint, string $message = '') : void + { + self::$count += count($constraint); + $constraint->evaluate($value, $message); + } + /** + * Asserts that a string is a valid JSON string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJson(string $actualJson, string $message = '') : void + { + static::assertThat($actualJson, static::isJson(), $message); + } + /** + * Asserts that two given JSON encoded objects or arrays are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJsonStringEqualsJsonString(string $expectedJson, string $actualJson, string $message = '') : void + { + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + static::assertThat($actualJson, new JsonMatches($expectedJson), $message); + } + /** + * Asserts that two given JSON encoded objects or arrays are not equal. + * + * @param string $expectedJson + * @param string $actualJson + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, string $message = '') : void + { + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + static::assertThat($actualJson, new LogicalNot(new JsonMatches($expectedJson)), $message); + } + /** + * Asserts that the generated JSON encoded object and the content of the given file are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJsonStringEqualsJsonFile(string $expectedFile, string $actualJson, string $message = '') : void + { + static::assertFileExists($expectedFile, $message); + $expectedJson = file_get_contents($expectedFile); + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + static::assertThat($actualJson, new JsonMatches($expectedJson), $message); + } + /** + * Asserts that the generated JSON encoded object and the content of the given file are not equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJsonStringNotEqualsJsonFile(string $expectedFile, string $actualJson, string $message = '') : void + { + static::assertFileExists($expectedFile, $message); + $expectedJson = file_get_contents($expectedFile); + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + static::assertThat($actualJson, new LogicalNot(new JsonMatches($expectedJson)), $message); + } + /** + * Asserts that two JSON files are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJsonFileEqualsJsonFile(string $expectedFile, string $actualFile, string $message = '') : void + { + static::assertFileExists($expectedFile, $message); + static::assertFileExists($actualFile, $message); + $actualJson = file_get_contents($actualFile); + $expectedJson = file_get_contents($expectedFile); + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + $constraintExpected = new JsonMatches($expectedJson); + $constraintActual = new JsonMatches($actualJson); + static::assertThat($expectedJson, $constraintActual, $message); + static::assertThat($actualJson, $constraintExpected, $message); + } + /** + * Asserts that two JSON files are not equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJsonFileNotEqualsJsonFile(string $expectedFile, string $actualFile, string $message = '') : void + { + static::assertFileExists($expectedFile, $message); + static::assertFileExists($actualFile, $message); + $actualJson = file_get_contents($actualFile); + $expectedJson = file_get_contents($expectedFile); + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + $constraintExpected = new JsonMatches($expectedJson); + $constraintActual = new JsonMatches($actualJson); + static::assertThat($expectedJson, new LogicalNot($constraintActual), $message); + static::assertThat($actualJson, new LogicalNot($constraintExpected), $message); + } + /** + * @throws Exception + */ + public static function logicalAnd() : LogicalAnd + { + $constraints = func_get_args(); + $constraint = new LogicalAnd(); + $constraint->setConstraints($constraints); + return $constraint; + } + public static function logicalOr() : LogicalOr + { + $constraints = func_get_args(); + $constraint = new LogicalOr(); + $constraint->setConstraints($constraints); + return $constraint; + } + public static function logicalNot(Constraint $constraint) : LogicalNot + { + return new LogicalNot($constraint); + } + public static function logicalXor() : LogicalXor + { + $constraints = func_get_args(); + $constraint = new LogicalXor(); + $constraint->setConstraints($constraints); + return $constraint; + } + public static function anything() : IsAnything + { + return new IsAnything(); + } + public static function isTrue() : IsTrue + { + return new IsTrue(); + } + /** + * @psalm-template CallbackInput of mixed + * + * @psalm-param callable(CallbackInput $callback): bool $callback + * + * @psalm-return Callback + */ + public static function callback(callable $callback) : Callback + { + return new Callback($callback); + } + public static function isFalse() : IsFalse + { + return new IsFalse(); + } + public static function isJson() : IsJson + { + return new IsJson(); + } + public static function isNull() : IsNull + { + return new IsNull(); + } + public static function isFinite() : IsFinite + { + return new IsFinite(); + } + public static function isInfinite() : IsInfinite + { + return new IsInfinite(); + } + public static function isNan() : IsNan + { + return new IsNan(); + } + public static function containsEqual($value) : TraversableContainsEqual + { + return new TraversableContainsEqual($value); + } + public static function containsIdentical($value) : TraversableContainsIdentical + { + return new TraversableContainsIdentical($value); + } + public static function containsOnly(string $type) : TraversableContainsOnly + { + return new TraversableContainsOnly($type); + } + public static function containsOnlyInstancesOf(string $className) : TraversableContainsOnly + { + return new TraversableContainsOnly($className, \false); + } + /** + * @param int|string $key + */ + public static function arrayHasKey($key) : ArrayHasKey + { + return new ArrayHasKey($key); + } + public static function equalTo($value) : IsEqual + { + return new IsEqual($value, 0.0, \false, \false); + } + public static function equalToCanonicalizing($value) : IsEqualCanonicalizing + { + return new IsEqualCanonicalizing($value); + } + public static function equalToIgnoringCase($value) : IsEqualIgnoringCase + { + return new IsEqualIgnoringCase($value); + } + public static function equalToWithDelta($value, float $delta) : IsEqualWithDelta + { + return new IsEqualWithDelta($value, $delta); + } + public static function isEmpty() : IsEmpty + { + return new IsEmpty(); + } + public static function isWritable() : IsWritable + { + return new IsWritable(); + } + public static function isReadable() : IsReadable + { + return new IsReadable(); + } + public static function directoryExists() : DirectoryExists + { + return new DirectoryExists(); + } + public static function fileExists() : FileExists + { + return new FileExists(); + } + public static function greaterThan($value) : GreaterThan + { + return new GreaterThan($value); + } + public static function greaterThanOrEqual($value) : LogicalOr + { + return static::logicalOr(new IsEqual($value), new GreaterThan($value)); + } + public static function classHasAttribute(string $attributeName) : ClassHasAttribute + { + return new ClassHasAttribute($attributeName); + } + public static function classHasStaticAttribute(string $attributeName) : ClassHasStaticAttribute + { + return new ClassHasStaticAttribute($attributeName); + } + public static function objectHasAttribute($attributeName) : ObjectHasAttribute + { + return new ObjectHasAttribute($attributeName); + } + public static function identicalTo($value) : IsIdentical + { + return new IsIdentical($value); + } + public static function isInstanceOf(string $className) : IsInstanceOf + { + return new IsInstanceOf($className); + } + public static function isType(string $type) : IsType + { + return new IsType($type); + } + public static function lessThan($value) : LessThan + { + return new LessThan($value); + } + public static function lessThanOrEqual($value) : LogicalOr + { + return static::logicalOr(new IsEqual($value), new LessThan($value)); + } + public static function matchesRegularExpression(string $pattern) : RegularExpression + { + return new RegularExpression($pattern); + } + public static function matches(string $string) : StringMatchesFormatDescription + { + return new StringMatchesFormatDescription($string); + } + public static function stringStartsWith($prefix) : StringStartsWith + { + return new StringStartsWith($prefix); + } + public static function stringContains(string $string, bool $case = \true) : StringContains + { + return new StringContains($string, $case); + } + public static function stringEndsWith(string $suffix) : StringEndsWith + { + return new StringEndsWith($suffix); + } + public static function countOf(int $count) : Count + { + return new Count($count); + } + public static function objectEquals(object $object, string $method = 'equals') : ObjectEquals + { + return new ObjectEquals($object, $method); + } + /** + * Fails a test with the given message. + * + * @throws AssertionFailedError + * + * @psalm-return never-return + */ + public static function fail(string $message = '') : void + { + self::$count++; + throw new \PHPUnit\Framework\AssertionFailedError($message); + } + /** + * Mark the test as incomplete. + * + * @throws IncompleteTestError + * + * @psalm-return never-return + */ + public static function markTestIncomplete(string $message = '') : void + { + throw new \PHPUnit\Framework\IncompleteTestError($message); + } + /** + * Mark the test as skipped. + * + * @throws SkippedTestError + * @throws SyntheticSkippedError + * + * @psalm-return never-return + */ + public static function markTestSkipped(string $message = '') : void + { + if ($hint = self::detectLocationHint($message)) { + $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + array_unshift($trace, $hint); + throw new \PHPUnit\Framework\SyntheticSkippedError($hint['message'], 0, $hint['file'], (int) $hint['line'], $trace); + } + throw new \PHPUnit\Framework\SkippedTestError($message); + } + /** + * Return the current assertion count. + */ + public static function getCount() : int + { + return self::$count; + } + /** + * Reset the assertion counter. + */ + public static function resetCount() : void + { + self::$count = 0; + } + private static function detectLocationHint(string $message) : ?array + { + $hint = null; + $lines = preg_split('/\\r\\n|\\r|\\n/', $message); + while (strpos($lines[0], '__OFFSET') !== \false) { + $offset = explode('=', array_shift($lines)); + if ($offset[0] === '__OFFSET_FILE') { + $hint['file'] = $offset[1]; + } + if ($offset[0] === '__OFFSET_LINE') { + $hint['line'] = $offset[1]; + } + } + if ($hint) { + $hint['message'] = implode(PHP_EOL, $lines); + } + return $hint; + } + private static function isValidObjectAttributeName(string $attributeName) : bool + { + return (bool) preg_match('/[^\\x00-\\x1f\\x7f-\\x9f]+/', $attributeName); + } + private static function isValidClassAttributeName(string $attributeName) : bool + { + return (bool) preg_match('/[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/', $attributeName); + } + /** + * @codeCoverageIgnore + */ + private static function createWarning(string $warning) : void + { + foreach (debug_backtrace() as $step) { + if (isset($step['object']) && $step['object'] instanceof \PHPUnit\Framework\TestCase) { + assert($step['object'] instanceof \PHPUnit\Framework\TestCase); + $step['object']->addWarning($warning); + break; + } + } + } +} + * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ -namespace PHPUnit\SebastianBergmann\CodeCoverage\Report\Html; +namespace PHPUnit\Framework; -use const ENT_COMPAT; -use const ENT_HTML401; -use const ENT_SUBSTITUTE; -use const T_ABSTRACT; -use const T_ARRAY; -use const T_AS; -use const T_BREAK; -use const T_CALLABLE; -use const T_CASE; -use const T_CATCH; -use const T_CLASS; -use const T_CLONE; -use const T_COMMENT; -use const T_CONST; -use const T_CONTINUE; -use const T_DECLARE; -use const T_DEFAULT; -use const T_DO; -use const T_DOC_COMMENT; -use const T_ECHO; -use const T_ELSE; -use const T_ELSEIF; -use const T_EMPTY; -use const T_ENDDECLARE; -use const T_ENDFOR; -use const T_ENDFOREACH; -use const T_ENDIF; -use const T_ENDSWITCH; -use const T_ENDWHILE; -use const T_EVAL; -use const T_EXIT; -use const T_EXTENDS; -use const T_FINAL; -use const T_FINALLY; -use const T_FOR; -use const T_FOREACH; -use const T_FUNCTION; -use const T_GLOBAL; -use const T_GOTO; -use const T_HALT_COMPILER; -use const T_IF; -use const T_IMPLEMENTS; -use const T_INCLUDE; -use const T_INCLUDE_ONCE; -use const T_INLINE_HTML; -use const T_INSTANCEOF; -use const T_INSTEADOF; -use const T_INTERFACE; -use const T_ISSET; -use const T_LIST; -use const T_NAMESPACE; -use const T_NEW; -use const T_PRINT; -use const T_PRIVATE; -use const T_PROTECTED; -use const T_PUBLIC; -use const T_REQUIRE; -use const T_REQUIRE_ONCE; -use const T_RETURN; -use const T_STATIC; -use const T_SWITCH; -use const T_THROW; -use const T_TRAIT; -use const T_TRY; -use const T_UNSET; -use const T_USE; -use const T_VAR; -use const T_WHILE; -use const T_YIELD; -use const T_YIELD_FROM; -use function array_key_exists; -use function array_pop; -use function array_unique; -use function constant; -use function count; -use function defined; -use function explode; -use function file_get_contents; -use function htmlspecialchars; -use function is_string; -use function sprintf; -use function str_replace; -use function substr; -use function token_get_all; -use function trim; -use PHPUnit\Runner\BaseTestRunner; -use PHPUnit\SebastianBergmann\CodeCoverage\Node\File as FileNode; -use PHPUnit\SebastianBergmann\CodeCoverage\Percentage; -use PHPUnit\SebastianBergmann\Template\Template; -/** - * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage - */ -final class File extends Renderer -{ +use function func_get_args; +use function function_exists; +use ArrayAccess; +use Countable; +use DOMDocument; +use DOMElement; +use PHPUnit\Framework\Constraint\ArrayHasKey; +use PHPUnit\Framework\Constraint\Callback; +use PHPUnit\Framework\Constraint\ClassHasAttribute; +use PHPUnit\Framework\Constraint\ClassHasStaticAttribute; +use PHPUnit\Framework\Constraint\Constraint; +use PHPUnit\Framework\Constraint\Count; +use PHPUnit\Framework\Constraint\DirectoryExists; +use PHPUnit\Framework\Constraint\FileExists; +use PHPUnit\Framework\Constraint\GreaterThan; +use PHPUnit\Framework\Constraint\IsAnything; +use PHPUnit\Framework\Constraint\IsEmpty; +use PHPUnit\Framework\Constraint\IsEqual; +use PHPUnit\Framework\Constraint\IsEqualCanonicalizing; +use PHPUnit\Framework\Constraint\IsEqualIgnoringCase; +use PHPUnit\Framework\Constraint\IsEqualWithDelta; +use PHPUnit\Framework\Constraint\IsFalse; +use PHPUnit\Framework\Constraint\IsFinite; +use PHPUnit\Framework\Constraint\IsIdentical; +use PHPUnit\Framework\Constraint\IsInfinite; +use PHPUnit\Framework\Constraint\IsInstanceOf; +use PHPUnit\Framework\Constraint\IsJson; +use PHPUnit\Framework\Constraint\IsNan; +use PHPUnit\Framework\Constraint\IsNull; +use PHPUnit\Framework\Constraint\IsReadable; +use PHPUnit\Framework\Constraint\IsTrue; +use PHPUnit\Framework\Constraint\IsType; +use PHPUnit\Framework\Constraint\IsWritable; +use PHPUnit\Framework\Constraint\LessThan; +use PHPUnit\Framework\Constraint\LogicalAnd; +use PHPUnit\Framework\Constraint\LogicalNot; +use PHPUnit\Framework\Constraint\LogicalOr; +use PHPUnit\Framework\Constraint\LogicalXor; +use PHPUnit\Framework\Constraint\ObjectEquals; +use PHPUnit\Framework\Constraint\ObjectHasAttribute; +use PHPUnit\Framework\Constraint\RegularExpression; +use PHPUnit\Framework\Constraint\StringContains; +use PHPUnit\Framework\Constraint\StringEndsWith; +use PHPUnit\Framework\Constraint\StringMatchesFormatDescription; +use PHPUnit\Framework\Constraint\StringStartsWith; +use PHPUnit\Framework\Constraint\TraversableContainsEqual; +use PHPUnit\Framework\Constraint\TraversableContainsIdentical; +use PHPUnit\Framework\Constraint\TraversableContainsOnly; +use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount as AnyInvokedCountMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedAtIndex as InvokedAtIndexMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastCount as InvokedAtLeastCountMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastOnce as InvokedAtLeastOnceMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedAtMostCount as InvokedAtMostCountMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedCount as InvokedCountMatcher; +use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls as ConsecutiveCallsStub; +use PHPUnit\Framework\MockObject\Stub\Exception as ExceptionStub; +use PHPUnit\Framework\MockObject\Stub\ReturnArgument as ReturnArgumentStub; +use PHPUnit\Framework\MockObject\Stub\ReturnCallback as ReturnCallbackStub; +use PHPUnit\Framework\MockObject\Stub\ReturnSelf as ReturnSelfStub; +use PHPUnit\Framework\MockObject\Stub\ReturnStub; +use PHPUnit\Framework\MockObject\Stub\ReturnValueMap as ReturnValueMapStub; +use Throwable; +if (!function_exists('PHPUnit\\Framework\\assertArrayHasKey')) { + /** + * Asserts that an array has a specified key. + * + * @param int|string $key + * @param array|ArrayAccess $array + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertArrayHasKey + */ + function assertArrayHasKey($key, $array, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertArrayHasKey(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertArrayNotHasKey')) { + /** + * Asserts that an array does not have a specified key. + * + * @param int|string $key + * @param array|ArrayAccess $array + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertArrayNotHasKey + */ + function assertArrayNotHasKey($key, $array, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertArrayNotHasKey(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertContains')) { + /** + * Asserts that a haystack contains a needle. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertContains + */ + function assertContains($needle, iterable $haystack, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertContains(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertContainsEquals')) { + function assertContainsEquals($needle, iterable $haystack, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertContainsEquals(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertNotContains')) { + /** + * Asserts that a haystack does not contain a needle. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertNotContains + */ + function assertNotContains($needle, iterable $haystack, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertNotContains(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertNotContainsEquals')) { + function assertNotContainsEquals($needle, iterable $haystack, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertNotContainsEquals(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertContainsOnly')) { + /** + * Asserts that a haystack contains only values of a given type. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertContainsOnly + */ + function assertContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertContainsOnly(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertContainsOnlyInstancesOf')) { + /** + * Asserts that a haystack contains only instances of a given class name. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertContainsOnlyInstancesOf + */ + function assertContainsOnlyInstancesOf(string $className, iterable $haystack, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertContainsOnlyInstancesOf(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertNotContainsOnly')) { + /** + * Asserts that a haystack does not contain only values of a given type. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertNotContainsOnly + */ + function assertNotContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertNotContainsOnly(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertCount')) { + /** + * Asserts the number of elements of an array, Countable or Traversable. + * + * @param Countable|iterable $haystack + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertCount + */ + function assertCount(int $expectedCount, $haystack, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertCount(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertNotCount')) { + /** + * Asserts the number of elements of an array, Countable or Traversable. + * + * @param Countable|iterable $haystack + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertNotCount + */ + function assertNotCount(int $expectedCount, $haystack, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertNotCount(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertEquals')) { + /** + * Asserts that two variables are equal. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertEquals + */ + function assertEquals($expected, $actual, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertEquals(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertEqualsCanonicalizing')) { + /** + * Asserts that two variables are equal (canonicalizing). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertEqualsCanonicalizing + */ + function assertEqualsCanonicalizing($expected, $actual, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertEqualsCanonicalizing(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertEqualsIgnoringCase')) { /** - * @psalm-var array + * Asserts that two variables are equal (ignoring case). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertEqualsIgnoringCase */ - private static $keywordTokens = []; + function assertEqualsIgnoringCase($expected, $actual, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertEqualsIgnoringCase(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertEqualsWithDelta')) { /** - * @var array + * Asserts that two variables are equal (with delta). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertEqualsWithDelta */ - private static $formattedSourceCache = []; + function assertEqualsWithDelta($expected, $actual, float $delta, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertEqualsWithDelta(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertNotEquals')) { /** - * @var int + * Asserts that two variables are not equal. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertNotEquals */ - private $htmlSpecialCharsFlags = \ENT_COMPAT | \ENT_HTML401 | \ENT_SUBSTITUTE; - public function render(FileNode $node, string $file) : void + function assertNotEquals($expected, $actual, string $message = '') : void { - $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'file_branch.html' : 'file.html'); - $template = new Template($templateName, '{{', '}}'); - $this->setCommonTemplateVariables($template, $node); - $template->setVar(['items' => $this->renderItems($node), 'lines' => $this->renderSourceWithLineCoverage($node), 'legend' => '

      ExecutedNot ExecutedDead Code

      ', 'structure' => '']); - $template->renderTo($file . '.html'); - if ($this->hasBranchCoverage) { - $template->setVar(['items' => $this->renderItems($node), 'lines' => $this->renderSourceWithBranchCoverage($node), 'legend' => '

      Fully coveredPartially coveredNot covered

      ', 'structure' => $this->renderBranchStructure($node)]); - $template->renderTo($file . '_branch.html'); - $template->setVar(['items' => $this->renderItems($node), 'lines' => $this->renderSourceWithPathCoverage($node), 'legend' => '

      Fully coveredPartially coveredNot covered

      ', 'structure' => $this->renderPathStructure($node)]); - $template->renderTo($file . '_path.html'); - } + \PHPUnit\Framework\Assert::assertNotEquals(...func_get_args()); } - private function renderItems(FileNode $node) : string +} +if (!function_exists('PHPUnit\\Framework\\assertNotEqualsCanonicalizing')) { + /** + * Asserts that two variables are not equal (canonicalizing). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertNotEqualsCanonicalizing + */ + function assertNotEqualsCanonicalizing($expected, $actual, string $message = '') : void { - $templateName = $this->templatePath . ($this->hasBranchCoverage ? 'file_item_branch.html' : 'file_item.html'); - $template = new Template($templateName, '{{', '}}'); - $methodTemplateName = $this->templatePath . ($this->hasBranchCoverage ? 'method_item_branch.html' : 'method_item.html'); - $methodItemTemplate = new Template($methodTemplateName, '{{', '}}'); - $items = $this->renderItemTemplate($template, ['name' => 'Total', 'numClasses' => $node->numberOfClassesAndTraits(), 'numTestedClasses' => $node->numberOfTestedClassesAndTraits(), 'numMethods' => $node->numberOfFunctionsAndMethods(), 'numTestedMethods' => $node->numberOfTestedFunctionsAndMethods(), 'linesExecutedPercent' => $node->percentageOfExecutedLines()->asFloat(), 'linesExecutedPercentAsString' => $node->percentageOfExecutedLines()->asString(), 'numExecutedLines' => $node->numberOfExecutedLines(), 'numExecutableLines' => $node->numberOfExecutableLines(), 'branchesExecutedPercent' => $node->percentageOfExecutedBranches()->asFloat(), 'branchesExecutedPercentAsString' => $node->percentageOfExecutedBranches()->asString(), 'numExecutedBranches' => $node->numberOfExecutedBranches(), 'numExecutableBranches' => $node->numberOfExecutableBranches(), 'pathsExecutedPercent' => $node->percentageOfExecutedPaths()->asFloat(), 'pathsExecutedPercentAsString' => $node->percentageOfExecutedPaths()->asString(), 'numExecutedPaths' => $node->numberOfExecutedPaths(), 'numExecutablePaths' => $node->numberOfExecutablePaths(), 'testedMethodsPercent' => $node->percentageOfTestedFunctionsAndMethods()->asFloat(), 'testedMethodsPercentAsString' => $node->percentageOfTestedFunctionsAndMethods()->asString(), 'testedClassesPercent' => $node->percentageOfTestedClassesAndTraits()->asFloat(), 'testedClassesPercentAsString' => $node->percentageOfTestedClassesAndTraits()->asString(), 'crap' => 'CRAP']); - $items .= $this->renderFunctionItems($node->functions(), $methodItemTemplate); - $items .= $this->renderTraitOrClassItems($node->traits(), $template, $methodItemTemplate); - $items .= $this->renderTraitOrClassItems($node->classes(), $template, $methodItemTemplate); - return $items; + \PHPUnit\Framework\Assert::assertNotEqualsCanonicalizing(...func_get_args()); } - private function renderTraitOrClassItems(array $items, Template $template, Template $methodItemTemplate) : string +} +if (!function_exists('PHPUnit\\Framework\\assertNotEqualsIgnoringCase')) { + /** + * Asserts that two variables are not equal (ignoring case). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertNotEqualsIgnoringCase + */ + function assertNotEqualsIgnoringCase($expected, $actual, string $message = '') : void { - $buffer = ''; - if (empty($items)) { - return $buffer; - } - foreach ($items as $name => $item) { - $numMethods = 0; - $numTestedMethods = 0; - foreach ($item['methods'] as $method) { - if ($method['executableLines'] > 0) { - $numMethods++; - if ($method['executedLines'] === $method['executableLines']) { - $numTestedMethods++; - } - } - } - if ($item['executableLines'] > 0) { - $numClasses = 1; - $numTestedClasses = $numTestedMethods === $numMethods ? 1 : 0; - $linesExecutedPercentAsString = Percentage::fromFractionAndTotal($item['executedLines'], $item['executableLines'])->asString(); - $branchesExecutedPercentAsString = Percentage::fromFractionAndTotal($item['executedBranches'], $item['executableBranches'])->asString(); - $pathsExecutedPercentAsString = Percentage::fromFractionAndTotal($item['executedPaths'], $item['executablePaths'])->asString(); - } else { - $numClasses = 0; - $numTestedClasses = 0; - $linesExecutedPercentAsString = 'n/a'; - $branchesExecutedPercentAsString = 'n/a'; - $pathsExecutedPercentAsString = 'n/a'; - } - $testedMethodsPercentage = Percentage::fromFractionAndTotal($numTestedMethods, $numMethods); - $testedClassesPercentage = Percentage::fromFractionAndTotal($numTestedMethods === $numMethods ? 1 : 0, 1); - $buffer .= $this->renderItemTemplate($template, ['name' => $this->abbreviateClassName($name), 'numClasses' => $numClasses, 'numTestedClasses' => $numTestedClasses, 'numMethods' => $numMethods, 'numTestedMethods' => $numTestedMethods, 'linesExecutedPercent' => Percentage::fromFractionAndTotal($item['executedLines'], $item['executableLines'])->asFloat(), 'linesExecutedPercentAsString' => $linesExecutedPercentAsString, 'numExecutedLines' => $item['executedLines'], 'numExecutableLines' => $item['executableLines'], 'branchesExecutedPercent' => Percentage::fromFractionAndTotal($item['executedBranches'], $item['executableBranches'])->asFloat(), 'branchesExecutedPercentAsString' => $branchesExecutedPercentAsString, 'numExecutedBranches' => $item['executedBranches'], 'numExecutableBranches' => $item['executableBranches'], 'pathsExecutedPercent' => Percentage::fromFractionAndTotal($item['executedPaths'], $item['executablePaths'])->asFloat(), 'pathsExecutedPercentAsString' => $pathsExecutedPercentAsString, 'numExecutedPaths' => $item['executedPaths'], 'numExecutablePaths' => $item['executablePaths'], 'testedMethodsPercent' => $testedMethodsPercentage->asFloat(), 'testedMethodsPercentAsString' => $testedMethodsPercentage->asString(), 'testedClassesPercent' => $testedClassesPercentage->asFloat(), 'testedClassesPercentAsString' => $testedClassesPercentage->asString(), 'crap' => $item['crap']]); - foreach ($item['methods'] as $method) { - $buffer .= $this->renderFunctionOrMethodItem($methodItemTemplate, $method, ' '); - } - } - return $buffer; + \PHPUnit\Framework\Assert::assertNotEqualsIgnoringCase(...func_get_args()); } - private function renderFunctionItems(array $functions, Template $template) : string +} +if (!function_exists('PHPUnit\\Framework\\assertNotEqualsWithDelta')) { + /** + * Asserts that two variables are not equal (with delta). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertNotEqualsWithDelta + */ + function assertNotEqualsWithDelta($expected, $actual, float $delta, string $message = '') : void { - if (empty($functions)) { - return ''; - } - $buffer = ''; - foreach ($functions as $function) { - $buffer .= $this->renderFunctionOrMethodItem($template, $function); - } - return $buffer; + \PHPUnit\Framework\Assert::assertNotEqualsWithDelta(...func_get_args()); } - private function renderFunctionOrMethodItem(Template $template, array $item, string $indent = '') : string +} +if (!function_exists('PHPUnit\\Framework\\assertObjectEquals')) { + /** + * @throws ExpectationFailedException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertObjectEquals + */ + function assertObjectEquals(object $expected, object $actual, string $method = 'equals', string $message = '') : void { - $numMethods = 0; - $numTestedMethods = 0; - if ($item['executableLines'] > 0) { - $numMethods = 1; - if ($item['executedLines'] === $item['executableLines']) { - $numTestedMethods = 1; - } - } - $executedLinesPercentage = Percentage::fromFractionAndTotal($item['executedLines'], $item['executableLines']); - $executedBranchesPercentage = Percentage::fromFractionAndTotal($item['executedBranches'], $item['executableBranches']); - $executedPathsPercentage = Percentage::fromFractionAndTotal($item['executedPaths'], $item['executablePaths']); - $testedMethodsPercentage = Percentage::fromFractionAndTotal($numTestedMethods, 1); - return $this->renderItemTemplate($template, ['name' => sprintf('%s%s', $indent, $item['startLine'], htmlspecialchars($item['signature'], $this->htmlSpecialCharsFlags), $item['functionName'] ?? $item['methodName']), 'numMethods' => $numMethods, 'numTestedMethods' => $numTestedMethods, 'linesExecutedPercent' => $executedLinesPercentage->asFloat(), 'linesExecutedPercentAsString' => $executedLinesPercentage->asString(), 'numExecutedLines' => $item['executedLines'], 'numExecutableLines' => $item['executableLines'], 'branchesExecutedPercent' => $executedBranchesPercentage->asFloat(), 'branchesExecutedPercentAsString' => $executedBranchesPercentage->asString(), 'numExecutedBranches' => $item['executedBranches'], 'numExecutableBranches' => $item['executableBranches'], 'pathsExecutedPercent' => $executedPathsPercentage->asFloat(), 'pathsExecutedPercentAsString' => $executedPathsPercentage->asString(), 'numExecutedPaths' => $item['executedPaths'], 'numExecutablePaths' => $item['executablePaths'], 'testedMethodsPercent' => $testedMethodsPercentage->asFloat(), 'testedMethodsPercentAsString' => $testedMethodsPercentage->asString(), 'crap' => $item['crap']]); + \PHPUnit\Framework\Assert::assertObjectEquals(...func_get_args()); } - private function renderSourceWithLineCoverage(FileNode $node) : string +} +if (!function_exists('PHPUnit\\Framework\\assertEmpty')) { + /** + * Asserts that a variable is empty. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @psalm-assert empty $actual + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertEmpty + */ + function assertEmpty($actual, string $message = '') : void { - $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); - $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); - $coverageData = $node->lineCoverageData(); - $testData = $node->testData(); - $codeLines = $this->loadFile($node->pathAsString()); - $lines = ''; - $i = 1; - foreach ($codeLines as $line) { - $trClass = ''; - $popoverContent = ''; - $popoverTitle = ''; - if (array_key_exists($i, $coverageData)) { - $numTests = $coverageData[$i] ? count($coverageData[$i]) : 0; - if ($coverageData[$i] === null) { - $trClass = 'warning'; - } elseif ($numTests === 0) { - $trClass = 'danger'; - } else { - if ($numTests > 1) { - $popoverTitle = $numTests . ' tests cover line ' . $i; - } else { - $popoverTitle = '1 test covers line ' . $i; - } - $lineCss = 'covered-by-large-tests'; - $popoverContent = '
        '; - foreach ($coverageData[$i] as $test) { - if ($lineCss === 'covered-by-large-tests' && $testData[$test]['size'] === 'medium') { - $lineCss = 'covered-by-medium-tests'; - } elseif ($testData[$test]['size'] === 'small') { - $lineCss = 'covered-by-small-tests'; - } - $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); - } - $popoverContent .= '
      '; - $trClass = $lineCss . ' popin'; - } - } - $popover = ''; - if (!empty($popoverTitle)) { - $popover = sprintf(' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags)); - } - $lines .= $this->renderLine($singleLineTemplate, $i, $line, $trClass, $popover); - $i++; - } - $linesTemplate->setVar(['lines' => $lines]); - return $linesTemplate->render(); + \PHPUnit\Framework\Assert::assertEmpty(...func_get_args()); } - private function renderSourceWithBranchCoverage(FileNode $node) : string +} +if (!function_exists('PHPUnit\\Framework\\assertNotEmpty')) { + /** + * Asserts that a variable is not empty. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @psalm-assert !empty $actual + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertNotEmpty + */ + function assertNotEmpty($actual, string $message = '') : void { - $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); - $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); - $functionCoverageData = $node->functionCoverageData(); - $testData = $node->testData(); - $codeLines = $this->loadFile($node->pathAsString()); - $lineData = []; - /** @var int $line */ - foreach (\array_keys($codeLines) as $line) { - $lineData[$line + 1] = ['includedInBranches' => 0, 'includedInHitBranches' => 0, 'tests' => []]; - } - foreach ($functionCoverageData as $method) { - foreach ($method['branches'] as $branch) { - foreach (\range($branch['line_start'], $branch['line_end']) as $line) { - if (!isset($lineData[$line])) { - // blank line at end of file is sometimes included here - continue; - } - $lineData[$line]['includedInBranches']++; - if ($branch['hit']) { - $lineData[$line]['includedInHitBranches']++; - $lineData[$line]['tests'] = array_unique(\array_merge($lineData[$line]['tests'], $branch['hit'])); - } - } - } - } - $lines = ''; - $i = 1; - /** @var string $line */ - foreach ($codeLines as $line) { - $trClass = ''; - $popover = ''; - if ($lineData[$i]['includedInBranches'] > 0) { - $lineCss = 'success'; - if ($lineData[$i]['includedInHitBranches'] === 0) { - $lineCss = 'danger'; - } elseif ($lineData[$i]['includedInHitBranches'] !== $lineData[$i]['includedInBranches']) { - $lineCss = 'warning'; - } - $popoverContent = '
        '; - if (count($lineData[$i]['tests']) === 1) { - $popoverTitle = '1 test covers line ' . $i; - } else { - $popoverTitle = count($lineData[$i]['tests']) . ' tests cover line ' . $i; - } - $popoverTitle .= '. These are covering ' . $lineData[$i]['includedInHitBranches'] . ' out of the ' . $lineData[$i]['includedInBranches'] . ' code branches.'; - foreach ($lineData[$i]['tests'] as $test) { - $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); - } - $popoverContent .= '
      '; - $trClass = $lineCss . ' popin'; - $popover = sprintf(' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags)); - } - $lines .= $this->renderLine($singleLineTemplate, $i, $line, $trClass, $popover); - $i++; - } - $linesTemplate->setVar(['lines' => $lines]); - return $linesTemplate->render(); + \PHPUnit\Framework\Assert::assertNotEmpty(...func_get_args()); } - private function renderSourceWithPathCoverage(FileNode $node) : string +} +if (!function_exists('PHPUnit\\Framework\\assertGreaterThan')) { + /** + * Asserts that a value is greater than another value. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertGreaterThan + */ + function assertGreaterThan($expected, $actual, string $message = '') : void { - $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); - $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); - $functionCoverageData = $node->functionCoverageData(); - $testData = $node->testData(); - $codeLines = $this->loadFile($node->pathAsString()); - $lineData = []; - /** @var int $line */ - foreach (\array_keys($codeLines) as $line) { - $lineData[$line + 1] = ['includedInPaths' => [], 'includedInHitPaths' => [], 'tests' => []]; - } - foreach ($functionCoverageData as $method) { - foreach ($method['paths'] as $pathId => $path) { - foreach ($path['path'] as $branchTaken) { - foreach (\range($method['branches'][$branchTaken]['line_start'], $method['branches'][$branchTaken]['line_end']) as $line) { - if (!isset($lineData[$line])) { - continue; - } - $lineData[$line]['includedInPaths'][] = $pathId; - if ($path['hit']) { - $lineData[$line]['includedInHitPaths'][] = $pathId; - $lineData[$line]['tests'] = array_unique(\array_merge($lineData[$line]['tests'], $path['hit'])); - } - } - } - } - } - $lines = ''; - $i = 1; - /** @var string $line */ - foreach ($codeLines as $line) { - $trClass = ''; - $popover = ''; - $includedInPathsCount = count(array_unique($lineData[$i]['includedInPaths'])); - $includedInHitPathsCount = count(array_unique($lineData[$i]['includedInHitPaths'])); - if ($includedInPathsCount > 0) { - $lineCss = 'success'; - if ($includedInHitPathsCount === 0) { - $lineCss = 'danger'; - } elseif ($includedInHitPathsCount !== $includedInPathsCount) { - $lineCss = 'warning'; - } - $popoverContent = '
        '; - if (count($lineData[$i]['tests']) === 1) { - $popoverTitle = '1 test covers line ' . $i; - } else { - $popoverTitle = count($lineData[$i]['tests']) . ' tests cover line ' . $i; - } - $popoverTitle .= '. These are covering ' . $includedInHitPathsCount . ' out of the ' . $includedInPathsCount . ' code paths.'; - foreach ($lineData[$i]['tests'] as $test) { - $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]); - } - $popoverContent .= '
      '; - $trClass = $lineCss . ' popin'; - $popover = sprintf(' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags)); - } - $lines .= $this->renderLine($singleLineTemplate, $i, $line, $trClass, $popover); - $i++; - } - $linesTemplate->setVar(['lines' => $lines]); - return $linesTemplate->render(); + \PHPUnit\Framework\Assert::assertGreaterThan(...func_get_args()); } - private function renderBranchStructure(FileNode $node) : string +} +if (!function_exists('PHPUnit\\Framework\\assertGreaterThanOrEqual')) { + /** + * Asserts that a value is greater than or equal to another value. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertGreaterThanOrEqual + */ + function assertGreaterThanOrEqual($expected, $actual, string $message = '') : void { - $branchesTemplate = new Template($this->templatePath . 'branches.html.dist', '{{', '}}'); - $coverageData = $node->functionCoverageData(); - $testData = $node->testData(); - $codeLines = $this->loadFile($node->pathAsString()); - $branches = ''; - \ksort($coverageData); - foreach ($coverageData as $methodName => $methodData) { - if (!$methodData['branches']) { - continue; - } - $branchStructure = ''; - foreach ($methodData['branches'] as $branch) { - $branchStructure .= $this->renderBranchLines($branch, $codeLines, $testData); - } - if ($branchStructure !== '') { - // don't show empty branches - $branches .= '
      ' . $this->abbreviateMethodName($methodName) . '
      ' . "\n"; - $branches .= $branchStructure; - } - } - $branchesTemplate->setVar(['branches' => $branches]); - return $branchesTemplate->render(); + \PHPUnit\Framework\Assert::assertGreaterThanOrEqual(...func_get_args()); } - private function renderBranchLines(array $branch, array $codeLines, array $testData) : string +} +if (!function_exists('PHPUnit\\Framework\\assertLessThan')) { + /** + * Asserts that a value is smaller than another value. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertLessThan + */ + function assertLessThan($expected, $actual, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertLessThan(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertLessThanOrEqual')) { + /** + * Asserts that a value is smaller than or equal to another value. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertLessThanOrEqual + */ + function assertLessThanOrEqual($expected, $actual, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertLessThanOrEqual(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertFileEquals')) { + /** + * Asserts that the contents of one file is equal to the contents of another + * file. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertFileEquals + */ + function assertFileEquals(string $expected, string $actual, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertFileEquals(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertFileEqualsCanonicalizing')) { + /** + * Asserts that the contents of one file is equal to the contents of another + * file (canonicalizing). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertFileEqualsCanonicalizing + */ + function assertFileEqualsCanonicalizing(string $expected, string $actual, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertFileEqualsCanonicalizing(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertFileEqualsIgnoringCase')) { + /** + * Asserts that the contents of one file is equal to the contents of another + * file (ignoring case). + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertFileEqualsIgnoringCase + */ + function assertFileEqualsIgnoringCase(string $expected, string $actual, string $message = '') : void + { + \PHPUnit\Framework\Assert::assertFileEqualsIgnoringCase(...func_get_args()); + } +} +if (!function_exists('PHPUnit\\Framework\\assertFileNotEquals')) { + /** + * Asserts that the contents of one file is not equal to the contents of + * another file. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertFileNotEquals + */ + function assertFileNotEquals(string $expected, string $actual, string $message = '') : void { - $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}'); - $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}'); - $lines = ''; - $branchLines = \range($branch['line_start'], $branch['line_end']); - \sort($branchLines); - // sometimes end_line < start_line - /** @var int $line */ - foreach ($branchLines as $line) { - if (!isset($codeLines[$line])) { - // blank line at end of file is sometimes included here - continue; - } - $popoverContent = ''; - $popoverTitle = ''; - $numTests = count($branch['hit']); - if ($numTests === 0) { - $trClass = 'danger'; - } else { - $lineCss = 'covered-by-large-tests'; - $popoverContent = '