From 022a5e143822b8784f44017a9eabc833463d9e68 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 5 Aug 2026 17:56:08 +0100 Subject: [PATCH] Change python scripting 'debug' button to just attach, not run --- docs/imgs/Screenshots/PythonShellBlank.png | Bin 21544 -> 21775 bytes docs/imgs/Screenshots/pythonshell.png | Bin 26207 -> 26374 bytes docs/python_api/ide_integration.rst | 4 +- qrenderdoc/Code/Interface/QRDInterface.h | 20 +++- qrenderdoc/Code/pyrenderdoc/PythonContext.cpp | 33 +------ qrenderdoc/Code/pyrenderdoc/PythonContext.h | 2 +- .../Code/pyrenderdoc/PythonInvokers.cpp | 5 +- qrenderdoc/Windows/PythonShell.cpp | 92 ++++++++++++++---- qrenderdoc/Windows/PythonShell.h | 9 +- qrenderdoc/Windows/PythonShell.ui | 7 +- 10 files changed, 107 insertions(+), 65 deletions(-) diff --git a/docs/imgs/Screenshots/PythonShellBlank.png b/docs/imgs/Screenshots/PythonShellBlank.png index bfd99068714439f3a918ca04c330b2cf8049293f..01796c172ae80cecb63e95eb1bdd6f9d8f513ba1 100644 GIT binary patch literal 21775 zcmcG$2Urtbn>U^iFd{-wKtv><(gbPJO8^z57pc-g>0K$ICx8u?o__1Ok!$JpX{H zSmn{cMH*-6r_SmQ=FUiymu4VU6DxaXPGxBg27XQ+PM-S|U>Ro+NCPD&^+3aIWWCBg z{APcAQY@-+yW=x&Q-ZLar`S4Hyw^f(`=~6xUp%~?HiERIB0rzh{vJ%J*DB?LgzSj@ z?2jRHo@jzsI(D+p$q7s~exkcRraruS_sP|F&k9*1t`#LQg@wK%)Rh!{=vhfiLvuy& zHa4g-OhJ=#61gR-6DD}ae(b5wWYra#n!ZR5y#y5gkc6`=>Fd`!MEno=7Nn^S__(JezINiicq6#O$5d|x)wpNcxpgLXKr^J-Lkn{tR=K6sR#Mk~d319-V?;P^ zW43{DvGYAwb(!BLXm){=&)(SVZEZe*6DxkRmfKB_s6BTZUC<7Hx9amLz2euKvlWD- z?z7Lr4fnF%>=MsNo&Msg(Z}n(gXNe4DI%KK+~tOOq))$W&|H-^5L(;KoMI1$F~Tvb)tDa*f&R41^e=>JPUq6qpl5Tvp4&G`hrBFjqpkRT4%APWNcc6*RWfNm^*%|B?d#<6Mt+IYEjXQbeM6$R2j za)mE#t_<5iC8`{-T}@ee=fad!ZckI{ginf>DxumJ%jC5}kL}RsF+L>=;N|1VGoOYU zYT2$zk>N{9Ttvp2Fhjh3QO2xZ-RbuoREFdZJAUzb#W#_m(sU2n6GYo(}Wh^5khrBDs|l6UkXyGAIS9k0kL3| ztd>MWK}Bg$ef)?&YNUALqnlMz41ML1022^HCoS)X}xIwP=K z9oB2R8OT^$`G@gfn5uJ(!saBdl0A>);MBz`a4;ltPG%_Hdv!z$subT%EsqRQ=NBUZasgP1>=gG1cv3d%NdVg>dT8J~ z#H%C)%rlyLeZT5GbWhLfBq_7v8k^-_C^TBIVgVy*d0=>>F0UNwMw0Of+B{1xC&u8c zg8oV{#&WUC5AL}8u?fHb9=Ymca9SmeJhg3^lNYO{Uxe)m&LS9e#jm?w=zBh!sX*nc zFnBZ^c?{NLJ$VP1hhuC-XBULc%5c}k*YcE(=A(ULxZWc;uPUpqt&M3DVdG8bQ6}VW z^py$M?_6YVf}E@+Zt<~*Iq*We;Q%D=1;H7G!-nCNS_GQ1fpP@oEw3ns5H`Akq+_y{tJ`&}TFnV?=eSk{I#6GIqH4~HMugt5uF>S;| zjfgddJvr@`0KG;@tdQPVNL8)Nyl{5~u9k!)|=F<~7%>B#JP zl6WiA5t5#{OhxrD4wOnb1qQ7zg4@qNBpo59A{U9t6bc7xA4$%g{$|aSdd7O~?Wa0u|*I^pXS1up96J73D+QqIsUrHHYc50)3Wp zQsJHRFLhz$^mk-{ZjKK(SL@)l{J?sTj;y%`%pgW_T@YvkSUG@R*zZ^VX(R=S8QY5| zuCB)q_wv@E=Id+9bqW{6j%^?1EN040>TK42{)NL)a&4OT&*AKJw@1=6x$Jb8tLu*i zuklY^!?<_!s7&0)NsRBTp(;0r&yw5&LZrY?6e-g>+$3*n<>_qq718vX?}^2tuq{@+ zFRKa%bBsDa=MR4tbeO1vNt}efcjHRyx~J+1Bj23p`R=sXAS&hpK$Ld#? zz162C%T-?^Pwk7o5=|(C>zocDY3)e7S0ddNCQA){aIdJ|voZt*{OqHFaa$}GnDtuh zWlw%L!6kTCxYpFTZx6gCp+*SIhs4puy2WxDuo0ZC4Hr@a4!}?8N^13b=gqrHgvC4P z&j`efZT0ecd+fx-*4_fgjM1i{;^FKkl|U2{@D#q))I1n)Iy^Nh5Z86u2~r5oF58*I zmJdwt4up~Jt$uT(T0@1{eOIpH&@k?8rKYteIUR046r7OwjPdrj>~R_0&l~kIUf+W_ zR2Mq54^-KduA|f|Cx+R@uM$b|Jc$;W1uuvRZH8%PX;ELIwLtLh2c)MddF{X`SP*+% zUq1=)3gi)rZ8hJ?t3Fz(t*wm{c1rL$T5kEo@*dUT$s?^uotR9ZssM|AvV+b6^rxf5 zZnVUK;w*6gSu2HlI(DRLl!nS}I`z%PtPXgE_9egC^@fGXHR!}w?| zp>YGvr3W<}rN*$Er- z#f3f-LV8OSrE}EPPBUkio$jwJ%GiUAInTGsb`p+W$G#K|sF0e%v!T6H83_^QOJcXr zb*UVTm<>+tX+lpBTpA5zC1NWY0JoHqx`c`W)W83G()2W z9TJxIYYt}K-=34mcnF9i@c!fdOO?YC&mW(~63U4seSpr{!iH{noL0CBb8X^lzxZ$Q zPtiDeXiZjI_K$PDf~9D*N`$YV^f_wI6j!HC)E$gGt+z?jOU5ki%72W!Twgs6k?8Lg zbQ$p4^uX+wTXpUrPTTxa*$s`hYrie|;t)aZ?>a$=mBN$917S6BWrxk1vx54_)7kM5 zoQT)V(Q5A5Y`BE-=dr5ou6(S-$@E6|*JL#7UW@9aZsxwKR>kJZ&5`LhBamtzZR^t# z7W{N@Ut}~LJOAbU`4XeaYI|=JN5|n+g-Ei>>ba6p9A@uIzFFl>BaaM*Yd-@IEO#)}CumdkXyR(Wpml z?l=zTa|XdN;m694PYo(0+)$n3o6B7GmDB4J9C=Dl3)Zv|KOlGG_sG(2ZJ;L;&FB)U ztQMkuD`Wx&KURoFjw5C=#=LZNCMF8{2VxA47Z&j3;-ZKBtI9BU#dr*MV^VR%R;LLD zm&o5=3P8vN<3wE_R_@(I;D3aDJr043x~vRMieYppNg6etXy&DjTdnKlkOI7zv|a}b zig|YkBh#yWELPT*R)hNn?Nv^#AFt$7tFsG8+|cq>WmO`be#~|sKd|YL{q%4o(Gc}~ zer3F3a51dB1Ieq4UW-E8 z!R(Vw?@`b+Pib~x?OeBwEExgwL6=0k_#w;5t8TVcE;H>c>76BYs7*4NYri5Tm!DC;(32v)C=O2t2VLo3MGaj-=#NoD-U}l zs=SBqmv&n`5t4NSSkKW;f;W z#|}tqTvX+AiTm^orDHDdVy|YPq~Y8S6O{#UhE`TYE%A)MJ5nksg=k!wQP`2$c@a8} z+gXg4IPDDeE!jqUAHxU@p=9f48$&-n4X|sU&QI)?=ZfMIYrdVa2pZA?6A7UqZ&BTo zsCN0Haz5aOF5h%bXAe|zP&_y`$UE5?e=Si$c2B5$nL2#}|GIcST}3h0pt5Fq99dGu zJ~2nVM?yue8yefMhaJ-p`{kA{d~C{OO`TCQmilh#)vZJf(^+$%zY)sgSUb^U5#awB zHb2Mcpf0kL+Gr*S2)!uj0|=6b()|WU6fBJ9?>6LQ8!h)#ENNNpi70sLJ!StCB)k;- z&S5-02E)uhAEdE=sljGzt1l%rLndK3u)lHB~5aj*$G+lVN!Xv4h9B_R}uECQX`tzDs>wCvEHMI>p+ zmWRKKdlj4Pti~!RZFClxOVXBr@I2aC=7BSaQ<-TD5{*??vJkjF-H%8*(DGWSKbxTx z+!0m34zsj@3ArtWo*iv$yp>V8S(1&J|dc1s@-kgIngQSN=AJrE4KlhkGARG5s3{l#d3wM8s+{IH-bjFt(P?9%@r&ca@ z5a)!EJz3URfNJNJ#@{cO9pQ5!dqs*nj>wL|zB_10ae8$r&M9hUH%L_7VlrXHgR{Si zliy-}-eNNB63L4l>oRk(q*gk)NHo28g?kHpHAZ{S2T|(Tr=;FG$)9HVs0#W@i_K>Z z!Fd^aL+*v>lbX#d>8oF3-6V%oS)*)(n9Ms`+~>k%%&9&LJ1sa*n&q&z>)$s!Y3M>Kg+uJ+n|MBb4{ zZ9_87I0ueg#(J-r-LIID`6H5K6mmq(wj0HH)D_wDRlVH!}Ju^hVY8 znEQGfNEfLnDmtM6<$y$|moLl5`ZClP+dkj%IH_U-Jh%+jPb6_OezT_&wc>CzG};q= z5ib*blj;nPus1sJ-fXQYFcj~N*%P*zVS!ifI3((9SljMD6mLy^!JA=Szr(`wp;d}lW=3_4b9 zdInoqKUo~c(Mi1Asg+^L!(nD^EKtX_GU)?Vg%+m+uwaz)T%rYzoJcBPQZb@Q`SxOb z*WD+4woA8VBH&%zE@Wi#qI&Xca#Z7AbT@HCjS}K}W0NT}uZN6?Gg^;K7Ud73?&h7G z&dn?AUm_lIx5rj-DeG^Cz}h?y=c9gktMtElf(#fNo3hVqcJVcZPmy-~+ICs6@Ty_+lKT-r!J?9I6^E1%ZuMAHw&_l_k}r=0RCx8x7=GDf>5`L>F$mA^P$XR@PP6n~HdeT5Qam2T}C z-SGCymx*)s^e-_fT|za|7|5q+xP597wf`3M40|)%gU|klA5nuC9|Jc<|G-)yHd}1a-2opSiJx9pMQR7B@^a z2XhT7l#^9i+oBOhhhv`khAk?=yE8QtBDjRqx2W9_-^4wfD88HLNtJ`ocI7cjqPx1# z1SeCm4;Obm`1X4yN=-kuTrtmfGC(9fI2iRbIw~dd>_{wrUjN7;S{|gKvLnMCnAp(w zhLl#|9rsz+BN*azr}y^8e)+roXMxe2fYlyiR^^37BP^8d2kwcs8*>Ue4P;wvbs9Jg zO9a=P#JTLp^=^;-LO5+bB#`?2#^6x6bL8-9{85x)gK5BH7dRX2V48mGwwlk@!pYg` zFJbnmJa6w|%;M2C#kkG2g85Y=_|xsy+Lef3lfT!pXx6cdq@y2P?4dBB{rzoxqUVu> z=YH}wJo+u+kAnM2IeR4$CxD3Ud7TN&a^EkZlJIIkCNNR*{^eAw(bG&8k{mzd2 zF!0#wo4RSyN7_JE8_rAW7Ggipj5T9U{R*uK%?jUu=yZtav0+97I7-Z*J1Uiqx z&tqsf2ndV+wELo_<2*X9X;`e z2Ezy$@Lnk8=dG{3%E#T|C7bB(uQH|6_9F>4q#*7wIK#tiRL1Nis<%l z?P5s?hm|=kEfCsd3&d4F;bWg!GOe`?rn*P)JE5F}g&V)GEia``KUva8y4B)-P@h$v z>etZXP>flxv~@T0*^)<%?kW}5ych|=UNh@JXd7nk=ct+$X>vr8d5@I9yC(a)yZep2 zX@I;!QZb@7;HP?EcVAGPYpCnQ=%*^=o_1gld31nL{SF3AKi;rE)|2WX`)fbydbVO& z=8q#naXV$$#n+3`mh0Y>+st9mcXzQ`Y}y!Z-`0q5U7i`#;!IwtlkW#2 z^r;=q7eX!(zG02K;x}{kQ3SEdUF}5I4fJ(hS@K^My*@iQ<@AbGAxd9BxO~lSwGYkK zLN?KtlB+odsPkAfR>Az`)L%9cNe2$vm?E9`JR`VDq`te^CVTf?U$xZF^6_|$AxQF% zno$FDHt#6yx6Y+TSg*7jb9vwBgtY2YUkt)z<&sFfXMI-4n}VB2yI$qOvw%To zX6E3)cLn7=PxrP4iBh_-Dlb^1MX;&SxL@e1zA2+0xDoX+9XDR{b8fXD7+%^;Je)W1 z>=uP8q|T3C;;*3%pD9HON-m{;$loVc?lzdUT;4?ERecK_=5kT;D@_hhJS8QeQi>tv z53l4zq_Y5eEcw+_lBn-w@%8!+`;X}z&^RffnFzMQm+*I{=bbBV6D@LPuUc)?Nf$Hd zE@{asE+&n+ME<#4?3>ZiD7)^F#~eoT1GHJ2T`f(J2B;u_lP{dO8$U6K)~7@Y6KiN&Py7=@vp+hdD?8mSda*WzG1Qe{)H8~ z6CpAiY=%$7)1#r`-vMT2$j*Q*^j`*0pKSiQ)sh!h_I&t*f?8BtC?ZKnacT;0x9WGg z&%`TFFESY#_>BB~j`Mwmu8nHn_g!*BZ~M}%jlZ0rJw|mhTvs?3Ws(&lY3DJXmnrDt ztH73dh#*s$GKh2ve0n-=upAt|NrC_5UfZa+XnaeQ<5S2msi3(Ug<5J9YkB$>oya7M z`PGW-gH)BJHrsoBGtI3QC+=w?$6GE&?;j^WJzFq*-728u8Z+cu7^G9$I;`Hj=W>HC z)^qE#750ffHfhxvM!M`)NX?jrRQ^>mkg|A)U9iF+H#-L2zA1_zfdo}SAiT~}B3X5c`_+bRUu%~&|23LEHVvF@a za<`?grfjw0ZE~^*=;eO<=k!;kg|9W4vkh3T`+JAbF3iebyPvBzm-^_@O=j$usLmY| zf}nM9M-qzd`nZC8(l&ZV`#K@O{wGg|979|?h&SaPBt#Fj)v;o^L%j$Ve>e+9soVmyX%ShF-6L>G)8sOu; z5w_wyC>z&x+Q0LL^|odYzwBphjK2G}yL?rZGS>vFo*dPu@Yp&bN~#*F95vJBhV|Hw zS}8@dOhYspOcA2d9gy3*8g~1HS;Au#L6tL$z7ipd@IWK`Cwcs4 z_`!=!gu1YI`VSaNN}Jr!-nO)HlqZ|$A02Abh&|SaCLz?m1w_aVbN*HQgWxj#E-1@PVPEk)KFXGZ+_0YO~SxjB!sO(@zt9>zI zxUHx|c~rVhgNyYV7#1CBBAK))2HHR$c}S)U+Ny@CAbKJ^_fPt1ZU_UGCaQxuCXZdE zK5!GX+_p;1jhzoy&I`lF7$MxX%r3Z%SBDkIXI|i;f2=H^lJ|9Omx13%+YRmG6zzeo zwC;G>ufP>qbf=Uqq|ly0a2#Ob?7**-1kAeO{NP*jQsNKLcTDC%xzW)XD9f8bc}@&e z#;GcTxZ4N`A7q&4H8^oYyOITht_|i~cFtfg_gamQg19(luEbf4lcx%?Sc|&8VR6=+ zXOCTkmsV&EyGb%#4}nt3q)VgtZ1xv^ttkY?KhP;C*hC|KT=}}>Do78z-Z*ZqGBIiw zNYYw=nb`DrOl9BnIoAetfj7;WGQskSVVf#+3hX9Hhe*nLgug4JDUc*I)gZ?>bf-I5 z1QX@5KAP}o(0P5eph4ZxYN%FxSXkRHo;J!a%AwdO>Ue1aSzJRMT2VtgAEt7aPPz%H z^i5@jI-K@Cn~KRr)_C74i|J-tz9A)HOPf)-EVk}8HEGEG%^_9wPQ@+xeBrUMLk(N! z7tbRW@aSfN0^}R3)T)L=%Q9Zem5i|;8d@f(@IifKh%Iuq-!^odxu}jB7FYWv=eSDp zo9XxYRAEZ_2x0^DJI;%5dLT(W^x$#6P8h3)ce%LgXm_Syk9K#rikm@_S*hokb-`%u zh8u{qFFH1G@gl!X*J>}>)uOw}Sr+6|g;?%4zC3)Ju7f$u6@X1TcU3^}+O(hNb}Iuh z6@#TZa~b13J4_x!VOUx4RJaC80SFxUkduT$q}gv{s-chDnHiWc6Sd$N z2O?kKcRU7Ot&P78AW*ZuUb`s1U*4-MYPYET^?>8&$s$TD?|9y>#@l{d5NB{S>4Tq1 z_bHG)VV`(^_ZjAZlIoA?6qA%ivu+%Aq9&w>@LprQ2nAPt9<%kcGVFY=4!%?JuatD) zeOuW1LKIUAA-sJ;Ld^Zd*9N0Kw$T@Jw!L!{HcO4dr)f8Y<9F##`a6%QbB-k|CDyg` z0?!kLX}(yhW{b5F%aqC0fo=$x-jGr>e~k48B)DiE?L)$pk)I;l-){| zak3hb>*=+n|0MB?rONRWUVhP&7(|HEN7rq2x#7c4H>QV0NuQ?P8eSdw32D=u>O6B9 zctu?j?>;!CgCtFOF^Z1fia*x&+FWQj^ZZFWbGls0dF?ze{ehK+I>JDtaCh?4NHgT9 z*Zu^Tdo=trQ{C~fvd)*KP9elM>xaMk-a&{y-Q!ICuuCsZvj=X@phJDs1sPm%r8kl&Cgtac@et`AQonqg5GvY1G4VKg#JvLL# zVhbxkzQvew+*ORmat9 zlvamZ+u^}8)@m-W45$#>#v z)fUUg$4%x4;lQ34fTA0Z%`E(QxmBB8Bk`ZXr(&a-GO-xoXMEUuVQ3l)%)`XQ)-S3o9Xyqmf~yuT#DHa^-p4g zBc)n-VQKQjqKaSOmA6-40Jg_^k7@VD^46?0g`RdX7mc97gTc`W^^HPCS!|XN`DLf; zH}b+T@&RhMWU^959bI4E*{qJPw|xGkz}~|&k5{2KM=vyaK4QCXjxcXUf6y4dk%8-! zS1~+R3CXUWGCAI@3dpM2^*j!&x{{&f$tM*ErJ6XGmBM>*tysR zd?!Lv9}aj|jc7E_dxU-=;lmi3Yu!jx%?`_z?~f0o(g|S)>Y83gJ$?H03{-`gZbtH5 z&M_UOf+dVDn*6aspP|>YfhFQMb(DqEYw?WVax_QNpAgu$`)P3G#iTQ{xVbE1E>v)C zP@j!>cBk-DBlA=wO0+6DkLpHnh{}agSgr_aW(Ae7lg9hRi>>wDN4dw#Rl${fA1Uar zsJ?Lzf*z=k3x4_Gw^V8t%Q>3I`wcHPjJ{hL-*#tCDDa0Xa+lM#+vrP&6nNn!h({xDceuGjhYlKF*gZ0tj&J&|6* zu@R5QdWOO(O3E9V9WIaN!Eg47@u(Vae72rZyQ23h6gB49GP~NOq=TGJ5o~bY%ma#% ze^n_IXTTGzzMh->H@j>Wz=6hGuqT&W>n?J_|mNn9?)8({o8R0?Oze-1QZacXG(oslQkMCJ|A%d$wbX@BX0lIbAUD?=ocIeI8M} z4dv?BJ+FP1#UIqfIq4Z+gD??FN{MZTI{M{;41{%JhlII*fa?O*CQ+NK=B%6X$brNagpY#iI1b> z26X@4Nn4o?YL82Jk?DM?I{Gem9&VgR_>UryPupCF3(WjEXMjQy5O|NH>0-85Q#5(MTnpbWraL6&X754KX2y6*o)-dn@cYPg_5RcwYIJcNvB=RrFS7-?3t(mtn^0 z{aiT5{=3k+w>JLsbR{FKvEQwJs=Gvd7*#*=81Tfupyhk{VlrW1Ic27OPuTw{(YRl- zX3zY#=7qxhE%CDyJXx+6w(U&CRd6lUU-ny5n|8+U9Hu54X)iV?cR6#f!M|HIx~wuA zvKq4EP6cR_o`@xh8u+gfD1{=+oXM;=ZGT3-_^ECdadkJgDhYn#p_gKtV2m2iMMsIs zlrt#ZS=~B#?f+r)LK$0mi>w-VSK&t!Z)CWx=DARCiEVb= zv{`((XU}@~Avj#Zg+G z_Zj68Muf}NFKzqnCF^KRsZt(E^denJ9?=I}5gAv(9>QW>&vG4C8mVttvsYtE=hiK9 z($k|SI(#+A(IAO*i|i5Iw3Z!uZwoEOrn&<%spx#FP;Ik&T3o#0ur}y-X0m%4;j&Tw zBUUDgj(e{Vq<|vox$-N(@27hp$>Z%Dzgx|k^-iynUTkvKf9!`R<%rel6GbW=ZDNQQ z9okQ0i%SPRHc18)?&L&uem|qa?ROfA;IsK*K?aAhh1wJQ@lx<4()qN_Dsyyi@2kCe=O&TdLuWRQfj|F$S)ELoeJmlE-d5~Dk0}&<;dqlm6uH` z{+|AFFvp>drRz4h=L5Am10PY}FVxtRCfIQtW)^F?)xPpZVH!mQ%!chO26`Zr`A;j6 zXCXf2*J~f8n)z?Yv*!}L%GH!rd*WsJZurmhIAPqCoT_d!EUV0MrTl^&Bio)f!-F~V zlLcB{zwpRI!EA3BCmm{Fs_Kl9(YV2(+8})sB+&sCzZm}McoTo!mo3-E^W<|S#{LcO zk8?jgK#bvsw_j<36&*fj7t23z^gf$T@TsUnkr8g(*sii~1l4Ig7&VZs!z(0I_N-yc z!vifSPreAA4$WSheEa5RimU?`9QYZ?SAx3k!9$mj{{E$LR&>`L><(CLj%)H_4?<{} z<7=k7w@VlB4I@s4#d$Uxkz7$(={FJ2Qy4lRfxTnV*#J#}t$}%WAC`&LGsql8uMz-$ z7ho49)!ig}7B6yC?cQ762pYhz=D-|oRvxzfxNXDY)hpuc?{aYAxOa=yK9d(eKK0Pz z@&s}5gty=8+G2Dw!Y7Ot6!GZDca(S*M{!T|lgTdNyaa1R3}0Yx7rp6qlD?_lOPeTb z-hUz9f=a=mNI$<=PTPQDjb&vnh?#7aO;GiHLy4Nfiq6;eZgRWpPUaVL%v0vb5!!AI zkHzGZ*uD&szXt@a!_6^A` zzvIgO3-4y$EWXR^1@noLMzCuk1m^`ZXWyt}9KI-r=-xZnx)pG$S6%TQn(&Z_p!}(rC;u<1Ecxk7 zB@&yMQ-SC&^(ee0A4z6f3MQRa=Z*o^z`OL${Z6*6P63_Vr-c?j*m^YCOT(<6y%@Xw z^;>#wn2V;GxPoZhmGt34-mIheu)HWe59T|FA)yiZ{sG>FrO<0B!`KcQ#a3sgV6yhj zT*Z%u^P6x)u=BCSSlLLUBqa2W|W1YA@ z^(3CSuMrZriDoQ+2G|UF5}W8#Eo4zsx*i8bVT4VJ9_EnMKH|_qk5fBaBoTllvaVW< zHAk}LC)oe>&er~L`3pD1`sDe)rJL7D3%qqbYg2yTEc1DlKy9IIC3rtG_|B=}TObMW zf)6NZNzMfq`nZ<{r#SYfzUFW9S>4rL3zjYERR~B^OuoVK*;Xt`1QyCgt`UwZX?WRS zjbOk8QBuqv>CMxY7j-HAuzY4?W)Vya>&i8E6l3U-=g+nr+Af+|HOv<5*2m zJLTuBf#=Q7A<%F8A^@FTMmHS=P%?wub94izhP6W4wv4Y=84YxwZm*TP&flRv;ak?a z!^E$n`qd`I2(wa|6m8*hXmJXTzScsOrJ$WN7Lys!@V={iwI1_0SmSQr>waZh-?g^x z_A93zhp85oPrq4VtXDE795adTmU^1D85NFN?qjTjk-Olm%yg^}Tg6~G6Z<}ZOxU{; zt7j{QuB_|YyH46t?<^wvRgjOB#cvgX1x=_HfAo0pXx}sP)`-NXA{M~i*|>QNRI|9~ z95I6pd>d0=D33e4-nx!;-I?`R=lG7A0g%mrndVk})wJ?!Qb}`gN{tKF+?n_f_`igB z!I1Iu1TFgUMb6zV&=s5u{rXt>_O37ZPm+OS70m1DQC|Z< z=SJs-OZbPH(-v*4x3fkP`snJmG!OI zmTRq4p9nnG+|c*P3!vW?=vAZM(8D%zNm8;ZxNENf33cc<#MIQ6NBGscI(j(b#ZbXf z-Vtsf%P2qXY=-h}O;>G~bnt}lBl~+RKNJ%@DXvB=pILw#sCH`! z^Zm=izBkDLm32{G{rYT&`a=K0ket52JvFIwpTN6Qyd>we2HESE~$emjZbu*RbFZQ>rMmp zDq?QSlj4O_{bf2*b&gXWKHQCu^GNC`vtC2LWnDS4pY=d{n=p(|8&WSV-~kqjC6)YF z3e`%8TAaCp#4JfrtqiW~{k2{~R7MgdW)>mIe^&cSSO5Cd;rU`4{<~tU1} z((wlXvpc`>9I*WlCqVPJexCRJi4D)+bWYdr8~%Ow`D1?f{T)aCcN)g(=Os@x^n1qt zJ6-2P`V+yPQ*+M!f5Vl3Asc<3SN|ite>wU0Qv4@E{v&$eEx+;XzxCk1-H5&PM@#;* z(ft$x7z>D8h^6)e>Cpj$><-+_y-aG2i@o? zzuzJSfqoGE*5toRs(%#rU#|Rzn)?rmjczCWpULx_?*O;XO{5#>FX5t%tIR*K(EyqM>nqZKM|1yy%D?rV zT>rNuL7@K~8~y$B{}00brz;Y`LwX?69N>3wbe7t*ps^<<~B^k>m^w4hq@7ag{)ROG&r zuOL?_r7Qtp$WO>kV)BZ-13^agPdnjEFzD*7jyR=t@NIIp2M;m`+$0s;(f7dJ>+SP^ z@wvoF&UftMd(Z{!xC(~WJ6M66ctMgxMYS9RJYWKtB^|8nXeBG&Knr>0oj(mI34y46 z0=96G`u=Acoqy+&00a#ZZGf;8gdh+T0B*FB#2M~r5bq5Cr z%h`NifGKZ&Fs%XR64WJrZZ!dg0RDcT{kDgadLFei4ey(R=|nwtEbTLQ$a8q?$I5(t z!QJAW5@#nw)cRfB-QCQqoC7<_?>VhYU7`kWfPmdxlCrhmo_w{hSQm(4u0PnEmHwre zD1Q3h=wzmN&``8XS>LIhKRwasXsq06)OtL=*s#EqSX2T8IEo+WM6VIQd*a*avsbvz z3^r61J3HAPRYf-j(KaQ(Kz4KB^WD-Zsz$@oI;@WGOZqNk`a@| zbv4Y5ztl0kCER^KA-2RDj|^NDKV154jwA~`BsZ0`MfzeRkEVXqq-?qBWH@oYedb`_ z6O~t4P#4gJXL!Y$@ieLNR?1Hv_!MQ9FZ5k4{bgt6xlgl3%T*HA+%wRq;Oji*AC4EJ zZMh8}{}NPW(KiB|!K6d6+6u8L=QK!Ie^B*=RC%RhhA~5j%X5LgDk6p3xxyZEqtD@Yhl?s1Y}&_9Eb@n*$T zpA*O%4Bc5}e#6x$gBf`VHUkBB^adS|TOrZ6iY|_~MdT*k6ZilpFAL|MS%JoML6T>| zCc=)Rw=mVh=VNLRV=yPL?mH$6z81a{V$S6Qhd04B!fsgNKc*F(Ss)(0(XaOFFhQ6^30jVBb$p66~&iq+Bh89b<{Ugu0XKr9QzD zEl-4ny(=LH7SpbSS+MaGIKXPes8_QLtAt;D@NblCs{E&2`M}!VZ`b2|_Dq3`sQ-#) z*2fH^N|_epk%peRo|iyLROgvl&`7Du`*Wvc3hePWe3M2Pn1z;LDMer(C9#;K7x+1_ zdD4=mve|wP+(CP85^hAaa{l%#&y6?GM*p9Uu6lUa;2_fF%I1Z0mlm*Z5S}g(nuV*R_KBhizLZ#c(b!3aGbjH=^8^u()y(I?mp`rKm%QgbpbKe;f zIci9HF<$DMfXwk`jOOf!k~Z9pkB^^LemhpNq5Qf#uVUQ!1zGF0nyILrPKSxR*`d4U zD~aKiOaU36hdxD!saqsqf6fOILdj0B`U45xDGpQ_A9EkHI{%z&jqOyoHj`lZ4F=PQ ztrOe1Ca7CPLSu*-%_edWbLGFfe!1I&4asfC+IC?zV+^~HCAcQm~uHXtCvzC0B{pC_w+<)36BWz^sZ-Lp4MXJ%9un?w^h=d)%v`uoH?mj z>MQA@<6C?SwU%M!GPB->8%I38sgZOr$Iiqp#aWe@y#UO0=t;kZwp>5M$R%m^MB@a* z8r7IgJmx24C$^4H_uXEz2Y-ttJN-(42r35m8v~YYiy*-d_Kl7^^S?!whRuEBRcF;} zizIn*F*Y;7i?U_4H`8AZq_hZrw0{E1gGIIy9>467-fI@l@3Xp?03-RVdd79&G9U1C z8vNs7D#2?;3zm!v)?YWwHO$G>XQmo0hP3BCucOFxy#Rrm8=sf)P#3i<_a`5TJ zQ>wzCxQ&E;zFKDs)kvU5d?cB0_i120Q-iCZe*5&e-Nz45%B=*8g+ljFj~KZh0h_Pe z5lL=ZY_4Czc^X^2|vpyhIaK6$h<{MgLM@b2WeVEEXGXBzE??v%Mp+A*-t+N@Gyo1yTv1%*^K7 z7j?!srxk8D4ie1>ylpYS?gh>DpxsZTNuOwWsoqT4({6UOP>skw!k|4WVsjU`aRQ&G z5Zpw-t*lDnql`h*`qZoZ z?~2qn(3puv>_2*3TCr>`&}>hU9mXc6z{KI*ve8ey{8IAqi~fr+kmdVLv}nsg;4?vVZ!axhARY;??4G?{>1xwq&O45c={GF}1I{n-cW!dd z7iHk@+&KNY7}F04hdJfQUG0B-F#jTgU2Sua-EjY4uKchqv?$%+IEEvAcw30YO7QRj z^z)nM$x*cCjgM7iAeig|c;YLXV_D9E->uQ@xfGfWNT26vS7Ub%^Lj?Q zR{D$Ay)zAryB_aa3b{K;Wu>%y%A$^5%3IRZ3E4Fgkoya~esRujd2ji zEI5oYGoW|y&71sBb1wXf@_Hc}%_AR(0i;aq0gS9t_b7oc9gyC`Eisc^KUBu-7?Z|ALy7 zM#Ufv^VGmS+3u}Y_e|IC*6J>hqE!=#O}1svtTSYVvMy~=b>Spw_Md@?19~_9TJj4v}Gj#>=7xqx^(!#B2WjZ-Z~4;ggh8`ev_qR zZ?TaX&Pr8~EI*Rwly;%uhIaAbXBGhQB0COna^Bjwz6C2jXVyVR#h5!erm298CtqloudD> zhmVITmKaOmo1?Q^Z93*0i7n~u`B>OvfQnJdei}M$Z9S?Ue{)2P>ZSO?>QUP2hispo zDoz~&`+mPVt)fta7F;cCQD?vm_<7KMBASW#47!o_w7^;!>lHp zEJnYCDZIz-zz?E7!U^fTPYhDzW4x+YjJ24{oxER`r&`Jja;KsK19l zBQ;_**QeH`P5l9B3>he<31Xdq96~^g-2_Z#U!||G(Uhi#(=+WH>Pdrjb`r z<&f=d#+)FgjnnKzwx!wv<9~S3(sZhKMBYKfs~0*OOd>uSatm0!WITH<*9(^94TAQG z;2edRpK^Rw8WNh$z{nFvCZBq&3KksiX2*%h6f+pG(|Dj=$AbV|3i2G6Vw^B>GgW6b z(tZiNlG1YI75!KV3Tg+oceFGNAN_`&02^IgC3@N*x`knH>mjY!ZL_O9Hh(ZJ39mmO zE;GO=tfBz#4wKSi4wqapL~HG!t+&b8RmeD^l!nBnt!7pUM!>#61=7`W?j4k|f)l`% z*ho8ZvJZ?4T`Bw8nnoP%Ka?B-{l$ypA%@x!cN2OfG1+k){ zG&C)gBoMbU6m!qiL{nTsZSJM|mif(m-|zc}d(XKC?&03|ob$fV^PUHd=?+}6osV!d zC&rkslItD$RTz`P>H}}?gcdrcCwgQ=?)MnVOpkkq-*~Xv)plbi z({-&=Dv4*XJimatcsMpxJLXGuQOnM^t_V@vkR2nwNj>kzd`dPo0%pi{Ql5V88W}X66+Hw2!dY2!o7x{~ z?lwAWe5K5;08wm^RMF?R!_fj8dyEPHZQ5xsEU3A4wPyrvBIh^PmgW9Q>5;cEX*hX`>888NEF>T*1jCH5B zEYo-A7`o**xAsCwXPUoknmm|M=@HLa{Gs8Pfwj^7Qa<@~BNLGsNi zatnD>nYQCnh2DsKWv@Kl%p#YmYQga<-)Cvog?=$v7i8j< zZ{Jy_S7jUCM*=RW^bu)+Or2sF(TOL(&AO|`zh56Oxa=RubAvHsKNwBf`#Fm4a zaWKx=mShmb&F#}2LsZL$vJ5Z}0y-Lh^{pqXjFfbCX**rdJ`sVVY=xH{UVXJ0$fU4* zY0bzubEeNKZ)u3;ZE!Grhhc^Ccz@H0p!bu{Gs4pzA}P4&nasm(JwSSdGkrig@90Az zGdNT6+8n#C7@g_OnxR>whKXIg3Yh5+Nmu z);%43jFIiAa2hG8GAY%2EiQIoY}NNbDg-RLS+d$U>0a=?|03XhYeMWH+Sv=k#IDjx zx8RfF1m_pd9qcxPUsgSDEzyk)HT0Ilg#j%vsv4Yh5{t9!Qgc|LKYbu^cXq;Oskm67 zqqUoBNB5XmrQWTtTc1r0g(b%^oxdYCHJ2jG8KYs4-Nt|d*A|e$PqC_$gTBu%{x;=% z5r(Z^;f68NJ6C&rq1CKy^_e#eP#%-L$i&(rCNy}YLyEz--XX7_Giln;uqqEi1A$5p z6$wi>tC;2Z)JLhN-Y&y4KV&FO;bgF!6YD zp+V~^_7c`WK?n0)KZJFw@ZAZU1R2uTKtxRd`Fa`u2zdW0a3tKHlSu&4E zt^SWn%@@$kNUsMz4Ojg8Rla5&1OGOP6HQ2*0|7>zthW;rS=y*&eH~)jLFo<#u-n$Z z|pVk!c9{(h1_*!3fe9mAhmk)r~xZ@D5wQ_MG zr)n>{JB65v2~&6RBVm!`%e|}fWNbudg_0Ionhkf^lH!0HsEI;3;jE_@NSZ>N&=bfC zs3{)+;GE73uM^&&xas&2y01aiNgCE=UFkR zxe3>3)ZNCo^weE;1!E-nIHvNmqpVJI$NiV_p0dJ?pn>}bz(WS}0cda^+Vb(@AhRJH zQqQ1G6Z|cijpO^KUPA))Eusems1y=7X!$^5NmwQ`G4LAG$H*!a_jrYq_GtC#*vpBq zLZ7pT+XZBUQsZ2HI0VO))V4#aPE~mhx5$Fe2k<2aUMt$)=EkULnB|l{$Pp%QEA8+` zg-3H6Bx^an`u>Zx4XCP-N=b%nRHSjX0e~}otY*)-EXtw%uEa+c58gzFv7|lrhx?1( z$lEiPW)2<(gF^uanqd2xJ!TvEOo3qUxkGXQqP{p*lm=K|63m40Z??NpYbS-lFyBh7 zoBr9z#D=|`T)(JL0y8(9L4G8~D0G4_2r{mB4tY%e}L~nTcJ;h>k4}I_@ zC0u(&_rrHh>uFPx#_0RHR6it`q_3J=6pdDN+=q2vQX39i*2a zf=KVZ_ufl@K=?Lz&i~wV?sxBbzw^EyzaL~~@15DRX3ctLtu@aOpsXlIK}t^w0)Z$V zJ(N}ffrzq!U;pz&z?EJDHCNz+*z}&lJrF2AlE|NI5xo?1-D(`?yGY@L_<=ibX?I>|3^-nenio3bOgBMx6s zaA(l*!bm^|-Q zI=Vzxzl=dzK7EAS&cX*)xvpEg(t`WZ{6?P@Kp=&C_odVMyf)wU8=#LtY7xsh6>BX5 z?VklqDO+_;UK*6zPWn@^u2pU;hHM-PIIleG+?S8M_2nig<|jm2GlEmSBHD4%m$s{N z*Je+iw~Y7#oi+`fz)SK~PzNKtqqFngOd6Bm`up4VGY>;nzxXPEIt1Y?8*T9hG44iL zw3{h61lN^?DoWlpSUD?__KFpDoCl#m6JQhw4gv~ro$<_+3@Hx)IOg=PXs6zrNxs(tAVMB!@|OW#~z`G;61Bqp?an zC*d+RGit)S6t0{)XLaEMXVRb(T)AMdSt|OlLQJguP)CzUI#b`So@PsWGc|g@j#_B~ z49Z>v3zYB@HtISXZK`(s6!_4NTLXnQ*bEA_>yfm~Yk+=?HWGiTV6AF6|mbT{XfWlvD zHVmy9f1R__)R%Qp;e$UAy)~JR{7!r-=LDFx+A+#ROUi4Sf4)6|=ab{%&f@mmxc(4i zWdp&bw=x?_FZ2Y?`5s?#u>N}*e1OhnqR|?g2m4;1%qbKQK%Wdsv94Mw7^yUxU7iGQ z#%Nyc@!6%#zD5za&+vQz#>?j=GSIWOADki-_)Z~|>w9d*-Q#YFo2spdyoDjbiY~~L z7(HrbnfF&d46fx>fQK#&*YkQb^lHA_(tC6Qy1%)7^yUcRW8(4de6zRCzW#beqjjqF z9=6fg7F>O}!yUy5bE^Az?i#oacl`zkm>D0IiDF@^x_duT$PCKy?qus)RW8f1`0;>p zUKS^MYI|MWR3KAoovQ)q*foglbuBuC zI9Z*Uew-yq3N2Ay29ysiGSbtTJ?ZsqAFIrA6frfQBpb}-@j$DqWIs&L~94PAnNmikp6Xxl@K zhxcjc6=0?Iovi4Qsvlt}lldX$N`mbo9x_uyO|Ey4*<8&%y7k)|TX|XFl6Neu_Qe?f z#%-uc_T~N&BWX4pU2W;4F#dG0R)&y{m_zY!2<=W0T=|u?7u9<)T+Hg!+v6kQ-RcjW zmYW4PYAOdK;Lp2OBw@;qF=U(A0as0ZTF$-xaA#5A zGitPR-NtM}Kq zY#4Db>H+Q~M>vkA2UL@`&(@OHYU<57*z3!c@;=Y0yI~3lu54Tlkn1`> zDK{2hpOdzX@)*JK!Ut@UH+=%vv;mWaz@Lw;#4HnePr93vW0&9)Jl|yDETIqTHZe64 z;1E*V1QsNjTTPLC{Js?5cq-m$7k6b0U&t2Tw27G##bU8nSHY88ggk*nID@8M#)e*b zUwd&6Y=CG|?&v1F7iXX@xT6ADQIJ-hE1f;!Dj;w@^N~4gd?{{zO8q`A6e&UBRsp>O{ zr`Er_W50N2e)WjDzaja9&V`fexBQ=@+TYt(9z9LSph<|6T~$ZaXsG-p`ptn2FsT`TGvASNp8wJd>%6KUlG24Ai? zEzv5XGpO!(4OcGg(2|0^e+zk4#03C09E3u?3xNWk9T{+t&@PDX5)6a@fi{3Y|6Cw~ z+p_h%CF3o{%rRX$f1kqcB^dM4+u;fb=mD2F1sDXvK!J4_$>3hIv)JtiV{Y@k1YC=h zmOgmGp0o?vP1`@fO|tne^U4dnE#r|2{viFx)Ph>+;B^pN@|6Z< zdEk-`tHLO+t-Z37#lHEIX`c2IXsf)(4N`x@ueY6kK@9U>t`3=|C?<#{%^$3gDJjLp zFUA#l{e1f}{b;1jf#XT^M%p_RUy7|ZG%W$@kFqfzD6;6UjWV$Qyn8u+T!eoaD_5Pjswo_5fce0`%mM#y4ws-9c7&YfT832lPCJv7Y^+On`n zWxCyJV>5WP*H=-4BPD-GUDbFFQ3{{b)S1C zC;UuKWGL5YDx&a2qPkP;xLDb{HB;X@jc13W#6+_i&1Kgw+xczTh4C47dZL^OI__b5 zGGvACvy$3KK~)th{bR6NT#b*6GBtA>XN6lmtlL!EpD>;5uQw=pOm#MJ2v-v$_6Ce{ zv4q2#nwpit!UWH~!AIfj0qFWaQhX%>?QUQeU10-zZQ|>e+lAvAF#qB^mcI$LU~^QOE9?My0^Qu{m6*F8X*koI`0Xe&-F7D%LrevriP> z;pk+o1lw0Q{E|If-0J?q%V7L9l-UgxBJZQAv$IdjqrKB5&nL0lqpBo%Fr&)b=FYF@ z!PR8z1x@pT8rKba;6rd@o;Io5m)7e)db7#DAr(y`>VCN^_!jChD7Lc|K+*qsV84)> z0nJO0_*Bt1vmq${0z3@ zXw!&8Y4vEM$K6k9T@+>5@FV;HtyJkSu^$3ykQC!3MX(13)b^BtB_`J5(S*KShR$ni zWjF$lP6@$ovxWiUgCiVz2hR15_jY#n8sNp+6?O8}8zaLF46ka)=o(^fq)&2gN{#>Wp2FDua(N%`DD zFIX;jRCe1Kpxv5VQ%lASt*Qox+>RNJl_a~nMNH-pn{LH8-}Lrf3H-=WGWXas{D%L= z%{F&>2fa2Y8A(^2VqA6-n%}FrlbXZ2dh!=XMZ$>Z%uKMz$i81AIvSDg-ak1#iak00 zVALQDe!3FwU0tNM?xs<(xx_dyxwHy4z>4I*z^kIsE`}C$A?oWA&2w!AqeWg1tZi)v z8RR1=EAwaCD%Pr|HC@J?+C2{+vxkj7SOHVBKcSLQkF?}j>{gvj8m-X)t!;3|ZimZHUL1<}>jg`0d#f;+TjlGx=6jw6)aPG9mk$@`1yru^^bKFt&ZxsjG&eFQmVa~LtycD>h6x; zO+uNzH*9A;DX}Tn{QlWtHc+nG%~93O6Ia&PsIbT5-5~OeW8A}S=$81={JQOT8w=Fj zCm-nQkDw>(w-k)SxD3wo5ER2Q2zrewOz8{JZtlhIt&@f9HgOdPi6(IflQ>cHI8nAL z=`0%N0HUu095%4Jo{2j?aaIN^cFoYfuLsL3tJVbDEABK-a&;o>@>w3ZCbnT-=79_p z&zSuI^LX`Ce*YzE1EpJI9#NcG0dZaBziD_@EF;z)f(eU_GAGM@9JtjHNzuHS#hdN= z+l2-rxMip{!K8oGWnA25tTGM6?DXAD?#;=*Iy$rESY8@e<}e?*19~dE2v)qv+)~a; zM8dPs#@gsD@I_pF!7Ej2`AF-C{3-~MI044P7e{fgf{Cq%)e#~DZRZmHHlSD~#FcdM&9#Jb z3H(6d0|T^kgJy#3d{*NyVK2bSVE?$UecoUycwhC&<+D*uJ?bB-2tO>H)F^(oSX;57 zVYVkG@2;cFJso^^A;jNiG%C74nBUdptGn-%kh!bjR9Bsm{0iD&WZxkh`n#9R9a%3P z)`Cm$IG(y{b8Lqd+Nt#wh4aPt@5fdGgKkNJb zIz|>b^l&x1HDdgl#DE}3&SK-o3d;aCl4xK9|m!rRP*D;OI zL{L78KHMmHkmNQdfj$gL9Ybkm%$YZfu@Pvf+Y|C1086=Ka^-y6h3qlZ<3te+@*I5| z@fY@YOU;*bEnWHEG&$tfI(ZvBK`5owxZ=3<$4fcv*7O2$XfKT}Qy2E@xvq@{Bwq9r zZ;08%khJsNyT+R4&_%@n~t&c+*<=ip{*?fM!$m0 zx#}EKF`VhlT`n?6$|c2t(D>JY&vtPS!wP3+l5jiP;cs>ujKp9IQ{rAo5IDkB5>$`K zABm9+e5m4f40%t=UJ+O5IceqU^EH$GbH&tT?lX=Q9Y1&pCBhg>Id-!1{qCMq@bO+z z5NvPt`1!j2=CA4!{&4;Z-iuopL02EMg)@z%cU6ljkKMGLty|Bc zKf!Us2}@gkZCZOBcbl2T+|}Lo1tc6~j$zCMWiMX@(jg(yP+COogv+(2N}lrQ`C1M- zW_K(gse#hVap_l11=e}31m@-Fb}a5LVu_!qlao6!?^Aq=yu4kn=DKpjagFkgW@n!F zJ4PBebljF-aU03pDOokeZ(lc zx|bf8KORD0HhkQ^Vz~%^yIyORIL#g>%2j$t3;@aM_yA9V1Y3jfxn08K;25nmMJThB z-O7O7JlohXyrY}CGnIVw66fws$Zl>JbVR~-VTpuUSJI_jju}qViy!L8dbZ~>U$H4( zLFCO=9Wyf#9-cXzgzBPlAu@DxNjr2+Eq7lr=Uhgi;gjLT$jCx36Ze`hHu)ad{HA6* z-YKa>*jGI#40_ZGInJciKG`~2BfGOs5xX&W5L&r0WRV*|h*@h0o~)8k<0`$rHJ3FJ z6}CO!j$X-ckjA2ONYA{x1wPV;*YniquWwL5h}WqYVv9TKJX^xSj z(fNexUTx2lQvL*|l${;PewNH~>(TPvOJ%y&hgq&o^JDLJ?}**)o7Gf7yETm9qu>X# zUwx!j$I(+s(_h`jkLE~V$JUjera!Ag_g2L1kACxSe&A#Q9J=6+p4MmcF>Xko4G~!7 zR_-=VU({hfPfj!DF>+P;NU-i>FoQ_o?URM1P)Yns;q?t%nLo}jFq&7A#zYhg=^25% zY>kimbhlekAiA+7`tEkw3R%D2Cd?=oVRL*uzgxNSs(mHvJ?Lr53r(-RZRcv~RD!Rj zq}JD`aezA@b>yib-J~=Yd5jZj)i3fGWoYihc8H*lcIKma#y6H~hWgL-WoZ*q&TLwG zQr2wXWtM|Ds^$P2iIZB941ADlb$|K*54 zOEX{~P1f{T#s3aP#a5e{RrIwrj);tzUx=odceOoNVVtftk<}cDkDgVz?K0R@<`2kJ z!bYhRBL=HM53YTo0%Y_F15S z3J)xFCJoCGA!yE*00Hd;*p>ZcAxOYWu*?eaeCGEDtJ2uwd2I-Yya?)lQKwSFouJnn z+%y?hU4NnFWzS1^N4$uWJvTR~=AtWx)^J@+>glL$<__l06>sQi=an5`c`_466=Zgeam@L&!jE z!+h8ciPn^p(?rjj0ON@1+XHcsDz(X}ir5d`8*;T#+8Y}*Xq5M{VXwcQ(oYiDsprwo zqnGCQ{b=gaal{3UUIXUw)Ye6?_XZJJ3d*9iULm{s|HK2{%?x*J3#bk`U>)40CKPlnX8pt}J(_5)@(e-p9a8KT> zR`LDxIF2CQ0jd3g9oBn!-8EO!&)6kjqtVzeMdRF^Q>_ceLqC@CUZiu<)T2F5`?T(* z>BI3V1%8iZ!#XFhy1LFdszmGKE-#hR8hSlFw~~B#vW4!CpK7a( z<(~#dUttaWMQ8g8=lT%Y_}yomJmVT^2cwCXu~ijdA}N!gN+sKZHF`PuQ0NYn^rHu> z%Q3Zzlvm~u#6yh5(5;Rp&^8+(@#9p;QAktbk`$k1s=)=yWaxr53umWYJM6}(hEd2; z_fTlhzKhS+vD;clWgCR(!RC*fUFw*Qmf3s9wd4AowfztJNvj^u*p(D)McFez336bIEL(1qP?%y9=Du`mUY+CR(fdjS_~Ag3vzzbA%H^E5Cs zpV7-8P{x~2&|4MwEa|DNiYS_sTLdr)2_^%9Vgg0swtXg1u0NPzr(XtPgtsvjQ3}{w zc7u+CkgcD@lxyR~yaQ+h;i`=<+Z5@X=ez-JAqCuO2*)JU=R={Q%mY8hc;>6}PjKX~ z^NCO29@7UQwV9Ek?(#<_M(d8bsJ>n%?f}6%#>Yn^RvywxO-jW>Egw5k&ULA(4*HMU zs&eu3K1BtDxi^o0DfBdC|Ii$$e^}bqlcFmWl4Y48+AeKsP&{YR`EX`=d?ZtOEaj0B zjks+&|FVXpyTf9&Vv>=Ajj&L!M4&vAW8B)8YfLtKuj_W&(ii)N9kiPvTQ+;3+|8lFK(Te!TjExeTeeeo)*!b(J!oMFfkQQm=Dpe$0ca;omxWZ=j_-N%kLA zNO{+9JN4Y;?1xll5<;kEaxaKVv3Iy37f6Znt0aCwR*Z%xz9}=p=vHoB9&B(^(Fp3t%9I|CJN)_5N%+3^OmQL@vIXyh08gUN3)bE*{S`H z%Pb9MoJDk7uZ>xKvoK{V85(nZ^~yAL_4><CN78N^dUnSdNSG zbh6D@`fNISF(rL0nJ$)>NnX=t*p)S_AGG7Ar=?mJ>VOEh2_O{ zR;|B6^Rc*~MH*QX>Jx;eVH<~$Ul}WT;;(r2J67RW9SFVTnveQf4qpr_&nnEDH~37g zlK32IkO~$se7zj|lj)O^v@ETNhWQ%oycMgvX|(o$PT;9R6(l0Wqno%^LJMM+*S@S; zSH@5j3==!=A9+uUe|N&tp8vR0QYq-C`{j-|*~LkcdlC{L`faKXh3z9uWq;HXq=+fo zjn$Kc={UNdMBBMSE}OlAf;<@7febE7M};UCo~x2vWw{r7z1-~_SaOxph>q?7wT;W@ ztAgRv%sK#A6JSfOGvFG6Y!T(@k2C!Zi3kk+gR^ny}5zwP9)$zpPcT zozb{Vz*FQpx85R(x}83EyN< zdx{W^bY6Eo9TcXF^k@*#wfl-LBn$cn|>IpPdY`}M?N zSzh-FYi_2U%1})5eGRtq;3(3;TjsHb@l7*j^{FGjJuPA99lvDD}sJ9L?$gos0`}J!QC$SZLK*5_wqG7@$pyf-JPOHVV8V&8#_AkY$!Wd|I894^ z6a?V(e8qwJR23e3;&1yJ?WN>cTUq6lT%wW)izpg*W1io>8Rle}*h-Yq%(z5FfTl^~l1Q$X>U-6flNJTzY-}taEoHnCwnM;fKLeHs!{qyvnl}x94vGgD=x`S+B@vIr zkfdwt3n?imZZx$yQ8?>Ow4Ws7!U8P#R>$6Z7{;OWw(w5lv3YyLp;^_oM=|J_{S<+x zz&?h5n4RomRY;{^7&V+q`K@a(^m1ys4UrGYWPnql_s}S_vLj~ASk6RPd3Tv8@J5EZ zk^y&IEK#a((zowL4}Ep#P{?FjA)0BhJB<*TmvojN$aB3;+E1}OzkG!rZAy;UXfQ2maQFJn$v z%A$0K0>#Twk+O^xr<4n&MZ4rBf9Y*$7W@`>fiON^iE3lYO--rX^^vlyTxp~*V$a2* zreY1t_ci|xTda?NZGvn*)>Q4&lP{=mgJkle{5Y5F8SZ5x633&QOEcilKg}^k3Z(xY z^izMN=Co)L+yH6WDyQd2&VIyYtoL;|Q03aP_y>ZkEJr)VXYStE2YSiR<8`erYdZP} z0#-QLar>H0kmsW!*}LmY`_IK@TU5)0xW}TN#PZsH(jrBy`I@eC+$e|K%V+8C?O7w& z3U}DoB{J#^a&4BF^Sa(qE7HH=|2TerLrfIts9xb8cCFtp}G^p^` z3i0(xo#HY!+{WASivh63|E#Ty=XMB`SPWO-`i56{pS@?f7Sv9a!MIf(sg(cI*aHg} z9QFphABqHSkBJ&EumpW*@z}2RPB1PWxwAeRJ73LBpjofKdg=)Mo0*5hSMi`2n<(CMbyWq!}!03YOR9~e_U%XFnsuh?=h@f}KO<7_$7 z15$fH6F?b=cmSX0PvtqML?Ra3+=$S%n|dKrr6ag*+igOfqZqLi+fYWqpcQA7&US(A zKuFg`Pk%-Dl^6n}pzZ`)SXx+UYB(VP9Ge2Q2N^zvCfk%EI>M8$)Y8{nKM&`B7{-6l zIJex^U9$laR$tws)ckCJ8&xX&Z0tp5aKVLGc7(cSW2r=PZfey$bICo{dE9DxoFdnl zV}gKxL^ltoE}NdDfyr&|4FXio;p)G6JBVHV$mSETw6j}Y=X~4bE6Z+|lP7LM+NsOfO5ZX(#V5lR zIWm9V^;Xq1T1QSKFzWamy#*pMlXbAS%heBJ%FS&Uukcx6Ky)&_{PEmAHy^rcmtpYO z?F&&`LI%kq{a_EoaoPH_zgC$*v`rG-w&Sq0zR748g#?Rim+>~xJPK%@wE5PjokGud zT@50wj7P1$mY6R%(7YiMy9^F6MziYCra6zj=v~ZZE4;wKj>w)wAuGOF?zti>0X&f$ zPgBe;XaAtdFDUMFARH*v?$Nr6f9;U`nBEm5Y+fMD=UkcMLn^_d5&xyN+eY_f0Vgc! z6@bcSMsGH{yws_<;xEF$!QLN=edy5?N!PRq!p#!}gcxf^p!qtUyZQ~Y$L6`#syanX z!4Na+u=l*E5)|va%G!N0&BN`8e4In?>mCcWI|;eNX!X@?{!9GaTa*ot87)PX+J7Dr zX)-_N@%+rK5<`_#)8FfwZzQN^mzEfq?moOzj&U7(f!D4XP+b0f-{ORF`VRZ=)l=lOn;A(r*qJr}Ke&zbST{F8}XVHb<>pNnQHG{z0I$OuDT zttab1QQJ?SuF}f55j<^p<@q9?ftcalr^>gL?Apw#X_WnRWe{@b>1o&R-_lwI4>dtr z)SnO5G3PS7Ocu9bwefD*QP}5IcShWHZ{ZC#2{l>CM(tYog#~r2q)V^Qc)%=pNZFcx zJaY~lbe2+DT>!{99*5ltS9}3hqM_a=VAs&X*4B13A4@j5G5Vw`6!DSa2s(dc5P?0o|)P+>D)or7V@=f`9^D-;>p1Myu|Ny zwMVm4Zv{^C9*JxcH7};8ld?ROoePWZ~>AjOpvE}_46PI{B z1(gfG`#{%NlaQ3Eh?*3uKQm|cDpx6oOv zuV@%BspJNXxdS=Ys`z>C5h>@c6EtTopnpbZh_bryy zaJtjqcgdDTzXf_ed@m$Z8-+aCqSUE| zhRu)6XA2`Qiy-9GK2s(Rny2aJFO}Uac}gMjxy#c*$gQWV!`L*3W=JE$S;Ap9HJNf% znBwSSc2}lWD&j$N6d$vrR^iKFfzAW|FUZPkEwFUxCZY#MUb@+Cjf)zrIw#^u<-+x!LL+6EmE z-P1ZS)d3XM2dN!?$j_gFRWJWQMy4M`rds%2o zI{r`!w-!=U2`3S%ls!z&Y$FSF)rdqFi-NkZml--OW<=` zPbqPcRchav;$|hZwtPMSXlpCy&M@M>ZF&SiSkdyx{$Djp^?(AkIj2`Vp z0%S5z_hyZ=%)-&+Vrur0!-er@1#fuH60iV|d8ZO;={_IlQVfttj4IAN?D&{FCb)Qs zwzQh5d$Ith6v$dAz<&FqOV&~Aqc~?VJ|Nd{^;v;*8b*NYwv~pGPszt9cwRKU@~17j zGk>jS9(;8e;vA@dvNqZ#Unzy!f1lg35-;S!qw6^?&-OacHD>HiXZ_xh<4tut7B)Lo zcg)W7$&ehcQ(T6nc|%vmwh8e#sSW+9c0GVTS2gd0!wqd8)bog7M=P8ft!wxA38XJ8bkIzlX$aXZQ_8FT@>gSW2uU%wo&80l$lU@SFxpf>{HNQI5__^_ zY6R#mc}1r>J>_{>tvD#Lk6n>OqH09>eY+1|CJ~9^g8-QC}QNJHamg zI9cd4ni@Ca$fCYaltYkT?k&ttPbmC_p8C*yGFNtxE7y9R@vUe7_A$S(haSt?1 zUT}>ILqBAN4AMx6D@TgpfJFZUxOW$Gao)pxOC;4ivmgX0rVa4*5BAs3BV9yX z{lGx0h{Rw-P4(@G5Qw7-Tba^D;1xBHp+-o?t_Aqa5-=}!K&K)jZGQl$cXsLTdoySI zEN53vw`cx@N~gU%?d$0noW@N5a{IXe7|_J&HrZbZ%m2JmlLBz0fet@cJ+%?cALIg> zKRYCHx|8&$>C+qk<=a0<{_GxsUXuY|KieTYZRcMKXBc@V0pNK7Z#jF@sa$`a``>PZ zPB*sx^x`Zx`kz%|NzafCqu_fset+I}`uEgW{)fZ{6!~}M{Z;tiwD@n74D{yj;qpJl z&i_eeK<&RT+`kMBU>1L$um6|A-!cRL=c)YnK>(yZW3KQXf zMasX=T4LHWm4ZO$dH>e#*@LI1@xK%>|EHPz=ed8}wq*bRLAihSEdHj9Q{DU-u0Ip; z?`ZR1yUkMiw{iHN!K?pKCI20#^3qSy@&B7#|7KMF68ltBXZZKO6#gwd{i~AyU>eZJ z{|u-83F!U?TK^rL{;TZ&S7`nVtWU?`&nok8F#6OGPDkK>a7Fr0X70aA`M3FjnRxv- zg#T-4`tM*grj__?!TKLn?!R4;fVVwA2k(f1-$oOTNXV|dNzK)-I{X1;uAGap$N}z3 zOd)QzMP_Pbzw&;_SL=PA6oq7PMH(0wa7C0aWn>a@u{bXlo%ht_LDL@y=?B*` z)cn!TJ8>|VOxo`pBGC!K;wDcf8V?3FC6ZWE`JcatLN23fiu(1JR|?ACAsJghpw&en zVI`W$`kLfyl|MBmTRou5rMy5PfdvHOoRqvb;o<{4Nrq)0j%OtXb);-CUPC0_lwg@E zt2OkSE2{;8*rOn*oQ*z!KSu4z0L{Nk#K4CD4kEE!vFE(thGY-F%5Nx5L=Vc3b8~lx zFoaS7hnLjJdGDRB_?SKL>Bku;o~@z4Q~`d5x*%8nI=pMIn(Sv5%y0CIoSfW$&vmn& zmalx_Ye-0lu$D`HN|dhsql)Z`%03XtY6jSr1xRalK)lr@2>unq#I5~u=)1YW(G>0J zsTyzRsq*C<@$D9Y`Ib-J8p~^0y8sJv-~bFbiqCfzIv*n6kb3MDCRmAF*mynVORGQd zmPqhr3*DXv$cz<6ch~+#@TDIOl6(2y&dEthNfiAttVE!pW=N@Np0RsTHuU>^xr6jS z+2zG|Ek!@y>cyU>>|y{ua>WR&zF*&$56?cAD#fGJ znEO;~7uIl}YNhf(R;H@-UjF85GrLiUQ@1(|FjQu1o0x@%T4b=ajSA=e{yLQFW0$Tg zZ(pG>Jm7leC^*d*qBD%_$b!E|cSn%#q$Eq0p75nt>S-)}ZvHY58@n@`nY(6t-O=vi z{f}z5l&3GMOrD3?2CDynNKfFPVjNqIo4Fg+qOWeRK%-y`!mmE!=hMDR>A!6jd2)ki z73{4|tMe0E4FC{w+ZE&DTC?~Be?61Ivns&e_0#=(2A^SMa#%z|ZAHiR>tcsG0Ke*} z3XT7n5d`Httf(cIO{TGvxOi(cbd~Cj$}EEef@Nc0q9WtK35Hijd7j3WFBxGA{R-sz zK`^JHS)wKoV|*$Dt|EL5^x!#F`6q6@ds>#~C2Cx5z8ENiiF|>+X@I=8pD2ES@)S7j z(>qsW9gD{o+$u8<=OTDdoN9%P{vu7Gr`Xr40=GY3>W3KW(wf0w=haR_X)`+*XPqA2 z5bO4N{A5g>sMpE6!^u;JIP4KFx8wT9=B>xQjSxZHg&|e4r15&9G3mR!VlVj1J-SCY z=;(J~?#ONPQ=ivr8N9WAPRMSwY_J^-5SnMkD>#&i_coH>e0_|+ zC=}xjtxGXSD`?J@iyY)a?_U4om;oZxKrr*9C9~Rv!;pVC?H&4mTPMFexa$o@>e~Jw zSuI<;05Ca;Pp!>tT#^UqHUO3j63>AX&p-WOrZa$1CX!s_mk4jH+W>8n1YH2?CL7l) zK0rlnZk>Kft*L_XY%Te-`utgW&m1kFkJRn}qKy~1)-jygFJMo|I)WOPlMH;5JqwtS zz!Mg3m|I{m0I-0Hb_WD;!PXEx(GF~-2(w8d-D7jIm~hFW9@bCW~;`ix4Py4ZzB0EYm zD5LcS+-;kIXT+DBchsuybLGPd`h4fNwx@I);mawPTT5v|N{e*WVR?B&5vXE0TE$QfWQ@P>W67CmP1u5SuCz^L|0?O?1a4qTq~S z#<{9rx)ZtnRx@vKS*hR@ai4;3_RwzVmRg%i5YNrxipf`$tJc(}2$rZ_gg|Ut4CD3c zt5aZ*)f)JqP^FqIIfy?)z~m!T+Ogs>3fV|!vT8-_qO=#@kC$Sfc~FGaMRLC-~#dg#Hur76;@YvdVWGzPTFHZI-0 zj8miRv)EL=d1moVo9QWd*p}X9(vKe<4GN(6J3%g?Z_zS3+YKBb6h`XO<#p$#yR>(C z776V5KqIfp#C;#ZahvX=61y@Hb>C_@-QKR@r$Y`ewsqsNATd3b; zTVi^u8&uWNe_PU{yy&KGr@A`;p1lHH-N;l|cm@slGA|UX|w6 z+w#gRenk$Pzto;MXCJ-_&yQIV25{`VbVoPErSCVjk{V=Ct9_qaUzU#wWj0zv05>1_ zIrZ94T|?mK6!-pI6wHKjGS6v8+{g&tXr3n3{I-%CRkhaH=untm{ykL>pTUzlxGmaX zE^=@Wn*R3p_%KF2qgfw{f!1w<)}Piy?tClcLKs!@Uq}AMc{+L~rI~B`t3)4e+MUwe z2z$_yGM(CyLlCB4;-XkQ`)(EQMRF-1bHCZuf5@y#{fE4y4Um`E%Y!3G2REoBnxI5) z6JE_Te19rIuQ#3}i3<;-COysK9Ec*1ySW2Wf^?d&@m)zd|gSiCanFfEkk&)lsf9`Gm z^o*0xlgB#m)P4^IUC39t7E3l0`)XJcjso8%stu8>W5nj=MvkVzqe$p>t_;XfO-nW27 z?PY@Og;F6hm7+>^)tIRYn)qdqb`RuLSaosUt$Oq38#lAnebj!pPJx$%GCn{rLzU(A zjCr}Q*<1w|UxM8pk1`aDvv#;qo3zu50~Pk>yoO3M%Q+W3(jtB}32xGRDrEiTm8&W& zZC@7(9QRLDVzFSv1#OqpvnOZEaLttVlK`Wyd0Y-iAgHb~+bAT-%3TPT3!aK)n-Lm` z>amy!8J{D<=G`Xq|AkixN(ql;k5X_=iFOuAM!*xrF7_yxmc}GIpUZs=D1$rWo0XVp z24AL~jC-6bku|Wr&XfB&m6xN`?c@fS^?M5Rx6kvfD)pz2)I1k0rr$_}SLXbBWNr~g zS~k<){Kz*en92K;h{F@2WJZ7E>tijMRdryKh%uwlEo;1G^U_x2NYqCQwP^N~Z>j{n znvzo@PEc%H*XW+sGkfjwWu?LZ8nQdO3RdnJ;SXX{@3+Z%=#4wZed!IY=&zTr$<|gb zoh{0|8b>{XMNfe{YNx?Yn93X>s|U{k{}|p;14rujZ*3mG4VW{tjzNS9{J-1dnUMnj zDyJjJ)i0Je)>b`3ZJwF8-Y#y6tB#TcPaG*7$yMYL$mR_#H?J3YkQoPpDgdK@^1GD zqx)_b9rrg~z5w=hkl~{hFw@o<5Uno$AgJy~%JvRiF}nEZu7|pO|F=kuoQgxRAC(e` zkeL|B3=T_k8+(Cc?3o&T6HFbSk!d^8wfes1S;+g8R1rMo&IJC2I2r+gA+w;#X1HGVmwWmkZLS_R?CtCc^0L_aSw7Jf1P zCUuFc{#oGOa`yP|wf=7VCC1*@j@iZw;2|dw#k#DKt1Tr@gIwJlKEBM>DgOdZ3uj;6 zenBt9bV>?RW1}@)Hl-F;L}`D44jexefSI+*=DdS`9GREDVc54qJ~zzShH$v)PKSiE zckzz?hB!V7Z$)5wszBKb;D|XUjd(_F-cy1{_dq|%cL)*iuRK;eeqV$6yXYa~+WSf8 zbv3do?5@9TZF^oFY}hI=KhiU80daby3R7lR5U%7!F6m>~w=iO}OxCfMwR0Dgdeym1 zAE^vj9Lw%GD~SZUix48Jl{&IjL=$qw<_qi-LO=LxeQ*)gpL$;C`bsvUM=LZUJy}RI zgvg+Ore4@a3;`U5X@De_O>*d*B@jCzQE~hQLy*7up8w>C{!3+I62E9ecD#ScXOv;SQ#>gd? z#%;)qVie+#>j+B+$++yo7WPnEvfXtd)QFvIBs1>X!ui(N`#H~f&iUs&XZ^FD_j|r? zec!j%yViQ&-|v0j;Z`HVTv}MGIQVS5T(Ic|wD7sdKCgb}cr{Do^14vyqHZKU@qOQe%y8Y^|Z3zPGal<7` z-WrK`?Yp{s;s5F&%g>cZ(ZDT02Q=Z%Nfi{cmaKJskt^7%eblQ_PFf*c_nV)iWm~)n_FjNJ= zgJ#p3Z`Zt@?6Kv8;J<_m)QurW5UYWfIqWxXbOY&_=t-+&qh43$$4KArs4X3t?Rn!M zo@ua*;0Nt$6Q@U#A~3SN8^z~}Pr?wOwE#^|d81hGE`Pwe_Oe^|qxT(&^XI0g(@NQ= zpEqjT-9kC+-SkWRn9!f^E8^&V3%V0NR8q0H5H+o`U6Z5c)_(IdU4r<|6IRMc=!kE9DX)3e^Tz?J z`Cf@AlQNI1;|cvGTu1*iOKkfA`&Yk=VRJSv{s6R1OJ)CR2;ZjzRlZv${S4U&=I+<4 zpOvm%K)bozQE)hB$uMqfoH(pcNUmvaTFfdBL`gAu_TMKwZ!6J$P&YwG9?}CgoT8$1 zJ1L34l@NcFSLBxDEinD1947I1J>(a!(Q>^vJ*vdP%l_A&MzqvYYIo2&3fP8&p;_j7 zO5ex3Zo*khP^~0C&bA080*PRx`9F}O|Fdxmo`>;xaQq>#hQo=5{W(^&s}g8nNJ8>$ z;*T!Nt(a*;97)itVghMs+^23Myuf#p%g_14@{*=V9 zvYDd$17+Z!oQ?5ah*jSj7bG+K1va!r*aI-PMbm(c7|h|QRUxQLi0H$Hr-J{DZcZ1d zuLmj`A^N^belz*`^KF>pMD(R?4G@{=e~uOj1|C}=MSyT^iY>i6v=_gkAFzJL5#|h8 zdm*Rj)Q!0mX4F8r6R6*prsX+~go^@ZH7%+~dxI+nePgLHCi#lcZNay)z9iz4 zOK@=#j(7^udsz&@nzswhn`3#+Bj(uaiU>r9*>}2dCeXiS=!teO14{3KNUzDsX`RRi z^3f{r{9a24Ik9UdMx|8TL9NFi13B!`g^wO#aWU^Umix(J4qQ3Y3{k{h3?4G4jBz4} zR0>JBlCC;L8M;WF>IpL}U88P7rK@8$dQ>Yt9MQ$M=u|ua9bsWV|nbKWc{Pu%vhq^ATl-)Rt z-Rm2H1r32G2*L_)8A&G3R7R5gSh2`VDoyj4=T{dU(me6VQa9RWG|TZs9SL4IXIT7h zIC+sp%z2D)jhY)7Z6H3Zs}!;V@w}g>b!Xobd=D5i#)gTp>F`7DtHF%Y(|9+1h~JcTAxBK1^7+U{{i(E=F$DF zh64ZaL1)gd)X-jLwlxFUKV`5cKpzac4~+>VuGMB%&BlK_&hNfZn*Clpff-k#dHv|A zW9Wo13#>LLmaGgvIQBAYIXWMr=kDo61Mmw6@o*49N#rGBh|$QaBEWa;2td`JTI{)| zAGI2YgX;0BciNK_kL&}RkVWrB@_4*4yTv%2sKNuL69t=J3bgQ$)3ivrz+$0>caZ`f zjP37sb|)<4^xh0Nq4nI=sAz7tf>r*oeiz5!6Nhba0C~m%D6WY6uF*M*fqtqM!DJG~ z11LP}tvKjA{F` diff --git a/docs/imgs/Screenshots/pythonshell.png b/docs/imgs/Screenshots/pythonshell.png index 50bc1e1b5f1b21753d4dfc44496e9c8ccdeed11b..9575dd148482ccffd8291ff753133ff10cb20230 100644 GIT binary patch literal 26374 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 VlcU*FF)Gw%RTMQ8a&MUX{})dM0p0)r literal 26207 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 diff --git a/docs/python_api/ide_integration.rst b/docs/python_api/ide_integration.rst index f91c41a7e..33338174d 100644 --- a/docs/python_api/ide_integration.rst +++ b/docs/python_api/ide_integration.rst @@ -26,7 +26,7 @@ To use it for debugging python code and with fully-featured autocomplete, here a #. Enable the :abbr:`Features → Tasks → Allow Automatic Tasks (task.allowAutomaticTasks)` (``@id:task.allowAutomaticTasks``) setting (optional). #. When actively debugging, enable ``Breakpoints → User Uncaught Exceptions`` at the bottom of the ``Run and Debug`` sidebar. -If you just installed the debugging extensions, you will have to restart the RenderDoc UI for them to be found. After this you can use the :guilabel:`Debug` buttons in the python scripting panel or the extension manager to debug python code, with full autocomplete in VS Code. In the VS Code settings JSON this looks like so: +If you just installed the debugging extensions, you will have to restart the RenderDoc UI for them to be found. After this you can use the :guilabel:`Attach External Debugger` button in the python scripting panel to debug python code, with full autocomplete in VS Code. In the VS Code settings JSON this looks like so: .. highlight:: json .. code:: json @@ -68,7 +68,7 @@ If you have just installed these extensions, you will need to restart RenderDoc Once ``debugpy`` has been loaded, the debugger is listening on the default local port ``5678``. Within VS Code or your IDE you can configure what may be called a 'remote attach' or 'debug server attach' connecting to ``localhost`` on port ``5678``. -If RenderDoc has detected your installation of VS Code it also provides convenient ways to debug UI extensions and scripts. From the extension manager or in a python script you have written you can press the :guilabel:`Debug` button. This will automatically try to launch VS Code with the necessary environment to connect a debugger. If you enable the ``Allow Automatic Tasks`` option in VS Code's settings it will automatically connect to the debugger on startup, otherwise you will have to choose to start debugging in order to connect. +If RenderDoc has detected your installation of VS Code it also provides convenient ways to debug UI extensions and scripts. In a python script you have written you can press the :guilabel:`Attach External Debugger` button. This will automatically try to launch VS Code with the necessary environment to connect a debugger. If you enable the ``Allow Automatic Tasks`` option in VS Code's settings it will automatically connect to the debugger on startup, otherwise you will have to choose to start debugging in order to connect. .. figure:: ../imgs/python/DebuggerAttached.png diff --git a/qrenderdoc/Code/Interface/QRDInterface.h b/qrenderdoc/Code/Interface/QRDInterface.h index d0f1ede94..7aa6c1e9e 100644 --- a/qrenderdoc/Code/Interface/QRDInterface.h +++ b/qrenderdoc/Code/Interface/QRDInterface.h @@ -1560,18 +1560,28 @@ created if the file fails to load )"); virtual void RunScript() = 0; - DOCUMENT(R"(Debugs the current script in the python shell. + DOCUMENT(R"(Tries to launch a python debugger to attach to the current process, in the context +of a given extension. -This runs the script but waits for a debugger to connect first before beginning. The user -will have the option to cancel, which aborts the run of the script. +Returns immediately if a debugger is already connected, or is not supported. + +If the extension name is not a loaded extension, no debugger will be launched. + +.. note:: + The extension name is only used if a new debugger instance is launched, it will target that + particular extension's source location. An attached python debugger can debug all python code + in the instance. + +:param str extensionName: The package name of the extension to use as context for launching a + debugger program. )"); - virtual void DebugScript() = 0; + virtual void AttachDebugger(const rdcstr &extensionName) = 0; DOCUMENT(R"(Sets the filter on the output panel to only show output from the given extension. If the extension does not exist or is not loaded, no change will be made to the output filter. -:param str extensionName: The name of the extension to show output from. +:param str extensionName: The package name of the extension to show output from. )"); virtual void SetExtensionOutputFilter(const rdcstr &extensionName) = 0; diff --git a/qrenderdoc/Code/pyrenderdoc/PythonContext.cpp b/qrenderdoc/Code/pyrenderdoc/PythonContext.cpp index 9a0130925..67bd5e927 100644 --- a/qrenderdoc/Code/pyrenderdoc/PythonContext.cpp +++ b/qrenderdoc/Code/pyrenderdoc/PythonContext.cpp @@ -1511,7 +1511,7 @@ QString PythonContext::GetTempFilename(QString filename) return QString(); } -void PythonContext::executeString(const QString &filename, const QString &source, bool debugging) +void PythonContext::executeString(const QString &filename, const QString &source) { if(!initialised()) { @@ -1527,24 +1527,6 @@ void PythonContext::executeString(const QString &filename, const QString &source { tempFilename = lit(""); } - else if(!QFile::exists(filename)) - { - for(QString path : QStandardPaths::standardLocations(QStandardPaths::AppDataLocation)) - { - QDir tmpDir(path); - tmpDir.mkpath(lit("pytmp")); - tmpDir.cd(lit("pytmp")); - if(tmpDir.exists()) - { - tempFilename = tmpDir.absoluteFilePath(filename); - QFile f(tempFilename); - f.open(QFile::Truncate | QFile::WriteOnly); - f.write(source.toUtf8().data()); - f.close(); - break; - } - } - } location.file = tempFilename; location.line = 1; @@ -1557,20 +1539,13 @@ void PythonContext::executeString(const QString &filename, const QString &source bool debugAttached = false; - if(debugging) - debugAttached = PythonContext::WaitForDebugger(); - bool caughtException = false; QString typeStr; QString valueStr; int finalLine = -1; QList frames; - if(debugging && !debugAttached) - { - // don't do anything, we wanted to debug and the attaching was cancelled - don't execute - } - else if(compiled) + if(compiled) { PrepareDebugTracing(); @@ -1642,7 +1617,7 @@ void PythonContext::executeString(const QString &filename, const QString &source void PythonContext::executeString(const QString &source) { - executeString(QString(), source, false); + executeString(QString(), source); } void PythonContext::executeFile(const QString &filename) @@ -1661,7 +1636,7 @@ void PythonContext::executeFile(const QString &filename) { QByteArray py = f.readAll(); - executeString(filename, QString::fromUtf8(py), false); + executeString(filename, QString::fromUtf8(py)); } else { diff --git a/qrenderdoc/Code/pyrenderdoc/PythonContext.h b/qrenderdoc/Code/pyrenderdoc/PythonContext.h index caa4feeec..8def25dba 100644 --- a/qrenderdoc/Code/pyrenderdoc/PythonContext.h +++ b/qrenderdoc/Code/pyrenderdoc/PythonContext.h @@ -145,7 +145,7 @@ signals: public slots: void executeString(const QString &source); - void executeString(const QString &filename, const QString &source, bool debugging); + void executeString(const QString &filename, const QString &source); void executeFile(const QString &filename); void setGlobal(const char *varName, const char *typeName, void *object); diff --git a/qrenderdoc/Code/pyrenderdoc/PythonInvokers.cpp b/qrenderdoc/Code/pyrenderdoc/PythonInvokers.cpp index 3cba4f488..76c9eed28 100644 --- a/qrenderdoc/Code/pyrenderdoc/PythonInvokers.cpp +++ b/qrenderdoc/Code/pyrenderdoc/PythonInvokers.cpp @@ -1263,7 +1263,10 @@ struct IPythonShellInvoker : UIThreadInvoker } rdcstr GetScriptText() { return InvokeRetFunction(&IPythonShell::GetScriptText); } void RunScript() { return InvokeVoidFunction(&IPythonShell::RunScript); } - void DebugScript() { return InvokeVoidFunction(&IPythonShell::DebugScript); } + void AttachDebugger(const rdcstr &extensionName) + { + return InvokeVoidFunction(&IPythonShell::AttachDebugger, extensionName); + } void SetExtensionOutputFilter(const rdcstr &extensionName) { return InvokeVoidFunction(&IPythonShell::SetExtensionOutputFilter, extensionName); diff --git a/qrenderdoc/Windows/PythonShell.cpp b/qrenderdoc/Windows/PythonShell.cpp index da8105486..db5a6c5e6 100644 --- a/qrenderdoc/Windows/PythonShell.cpp +++ b/qrenderdoc/Windows/PythonShell.cpp @@ -351,7 +351,10 @@ PythonShell::PythonShell(ICaptureContext &ctx, QWidget *parent) bool hasDebugger = PythonContext::IsDebuggerConnected(); if(m_DebuggerAttached != hasDebugger) + { + updateButtonStates(); updateNonDebugWarning(); + } m_DebuggerAttached = hasDebugger; }); @@ -484,13 +487,13 @@ PythonShell::PythonShell(ICaptureContext &ctx, QWidget *parent) m_Ctx.GetMainWindow()->RegisterShortcut("CTRL+S", this, [this](QWidget *) { this->on_saveScript_clicked(); }); + updateButtonStates(); + // we defer debugging loading onto a thread so check after a delay QTimer::singleShot(1200, [this]() { if(!PythonContext::IsDebuggingEnabled()) { - ui->debugScript->setEnabled(false); - ui->debugScript->setToolTip( - tr("Debugging not supported - check documentation for setup instructions")); + updateButtonStates(); } }); } @@ -565,7 +568,8 @@ void PythonShell::editorTab_Changed(int index) ui->saveScript->setEnabled(editor && editor->filename() != QString()); - enableButtons(ui->newScript->isEnabled()); + updateButtonStates(); + updateNonDebugWarning(); } @@ -978,6 +982,13 @@ void PythonShell::updateNonDebugWarning() edit->setWarning(QString()); } } + + updateButtonStates(); +} + +void PythonShell::updateButtonStates() +{ + enableButtons(ui->newScript->isEnabled()); } void PythonShell::addRecentFile(rdcstr filename) @@ -1220,7 +1231,7 @@ void PythonShell::ShowHelp() ToolWindowManager::raiseToolWindow(ui->helpGroup); } -void PythonShell::runScript(bool debugging) +void PythonShell::RunScript() { EditorWrapper *editor = curEditor(); @@ -1244,9 +1255,6 @@ void PythonShell::runScript(bool debugging) enableButtons(false); - if(debugging) - PythonContext::PrepareDebuggerWait(); - // save any changes if(editor->isModified() && !editor->filename().isEmpty()) { @@ -1265,12 +1273,12 @@ void PythonShell::runScript(bool debugging) m_CurLineTimer->start(); - LambdaThread *thread = new LambdaThread([this, debugging, script, context, editor]() { + LambdaThread *thread = new LambdaThread([this, script, context, editor]() { PythonContext::AddDebuggableThread(); scriptContext = context; runningScriptEditor = editor->scintilla(); - context->executeString(editor->filename(), script, debugging); + context->executeString(editor->filename(), script); scriptContext = NULL; GUIInvoke::call(this, [this, context]() { @@ -1290,9 +1298,24 @@ void PythonShell::runScript(bool debugging) thread->setName(lit("Python script")); thread->selfDelete(true); thread->start(); +} - if(debugging) - PythonContext::LaunchDebugger(this, m_Ctx.Config(), QString()); +void PythonShell::AttachDebugger(const rdcstr &contextLocation) +{ + QString path = contextLocation; + for(const ExtensionMetadata &e : m_Ctx.Extensions().GetInstalledExtensions()) + { + if(e.package == contextLocation) + path = e.filePath; + } + + if(!QDir(path).exists()) + return; + + PythonContext::LaunchDebugger(this, m_Ctx.Config(), path); + + updateButtonStates(); + updateNonDebugWarning(); } void PythonShell::on_findReplace_clicked() @@ -1405,9 +1428,32 @@ void PythonShell::on_runScript_clicked() RunScript(); } -void PythonShell::on_debugScript_clicked() +void PythonShell::on_debugAttach_clicked() { - DebugScript(); + EditorWrapper *editor = curEditor(); + + if(!editor) + return; + + QString filename = editor->filename(); + + if(editor->isUIExtension()) + { + filename = QFileInfo(filename).absolutePath(); + + for(const ExtensionMetadata &e : m_Ctx.Extensions().GetInstalledExtensions()) + { + if(filename.startsWith(QDir(e.filePath).absolutePath())) + { + AttachDebugger(e.package); + return; + } + } + } + else if(!filename.isEmpty()) + { + AttachDebugger(QFileInfo(filename).absoluteDir().absolutePath()); + } } void PythonShell::on_abortRun_clicked() @@ -2268,12 +2314,23 @@ void PythonShell::enableButtons(bool enable) ui->saveScript->setEnabled(enable); ui->runScript->setEnabled(enable); ui->abortRun->setEnabled(!enable); - ui->debugScript->setEnabled(enable); + ui->debugAttach->setEnabled(enable && !m_DebuggerAttached && PythonContext::IsDebuggingEnabled()); + ui->debugAttach->setToolTip(QString()); EditorWrapper *editor = curEditor(); ui->runScript->setToolTip(QString()); + if(enable && m_DebuggerAttached) + { + ui->debugAttach->setToolTip(tr("Debugger is already attached")); + } + else if(enable && !PythonContext::IsDebuggingEnabled()) + { + ui->debugAttach->setToolTip( + tr("Debugging not supported - check documentation for setup instructions")); + } + if(editor) { if(editor->isUIExtension()) @@ -2283,9 +2340,10 @@ void PythonShell::enableButtons(bool enable) } } - if(enable && !m_Ctx.Config().Python_DebugEnabled) + if(editor == NULL || editor->filename().isEmpty()) { - ui->debugScript->setEnabled(false); + ui->debugAttach->setEnabled(false); + ui->debugAttach->setToolTip(tr("Debugger requires a script saved to disk")); } } diff --git a/qrenderdoc/Windows/PythonShell.h b/qrenderdoc/Windows/PythonShell.h index 330040a3c..e28482758 100644 --- a/qrenderdoc/Windows/PythonShell.h +++ b/qrenderdoc/Windows/PythonShell.h @@ -106,8 +106,8 @@ public: bool LoadScriptFromFilename(rdcstr filename) override; void CreateNewScriptEditor(rdcstr name, rdcstr text) override; rdcstr GetScriptText() override; - void RunScript() override { runScript(false); } - void DebugScript() override { runScript(true); } + void RunScript() override; + void AttachDebugger(const rdcstr &extensionName) override; void SetExtensionOutputFilter(const rdcstr &extensionName) override; void SetScriptOutputFilter() override; @@ -135,7 +135,7 @@ private slots: void on_saveAsScript_clicked(); void on_runScript_clicked(); - void on_debugScript_clicked(); + void on_debugAttach_clicked(); void on_abortRun_clicked(); void on_outputContext_currentIndexChanged(int idx); @@ -227,6 +227,7 @@ private: void updateEditorCloseButton(); void updateNonDebugWarning(); + void updateButtonStates(); void addRecentFile(rdcstr filename); void updateRecentFiles(bool added); @@ -240,8 +241,6 @@ private: PythonContext *newContext(); void setGlobals(PythonContext *ret); - void runScript(bool debugging); - void doAutocomplete(ScintillaEdit *editor); void doFunccomplete(ScintillaEdit *editor); diff --git a/qrenderdoc/Windows/PythonShell.ui b/qrenderdoc/Windows/PythonShell.ui index 118e9d509..edd564577 100644 --- a/qrenderdoc/Windows/PythonShell.ui +++ b/qrenderdoc/Windows/PythonShell.ui @@ -305,12 +305,9 @@ - - - Begin running the script in python - + - Debug + Attach External Debugger